Linux 磁盘管理
磁盘查询
主要是 df
这个命令,经常用来查询系统中磁盘剩余空间。比如发现根目录 /
满了,说明系统危险了。
查询磁盘容量
使用 df
查看磁盘使用量,df
读取的是在 Superblock 内的信息。
例如查看系统内所有的文件系统:
[root@101c7 /]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.1G 15G 13% /
/dev/sda1 1014M 187M 828M 19% /boot
tmpfs 378M 0 378M 0% /run/user/0
/dev/sdb1 991M 1.3M 939M 1% /ext333
当查询目标是目录或文件时,df
会自动分析该目录所在分区,实际看到的是分区容量信息。
将所有特殊文件格式和名称(例如内存挂载点 /proc
)都列出来,可以使用 -aT
参数:
[root@101c7 ext333]$ df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
sysfs sysfs 0 0 0 - /sys
proc proc 0 0 0 - /proc
/dev/mapper/centos-root xfs 17811456 2724256 15087200 16% /
/dev/sda1 xfs 1038336 190536 847800 19% /boot
/dev/mapper/VG400-LV400 ext3 190145 63472 117934 35% /ext333
查询各分区中可用 inode 数量:
[root@101c7 /]$ df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 8.5M 46K 8.5M 1% /
/dev/sda1 512K 335 512K 1% /boot
tmpfs 472K 1 472K 1% /run/user/0
/dev/sdb1 64K 13 64K 1% /ext333
列出分区信息
可以使用命令 lsblk
来查询所有储存设备。
例如查看当前系统下所有磁盘与分区情况:
[root@101c7 ext333]$ lsblk -i
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
|-sda1 8:1 0 1G 0 part /boot
`-sda2 8:2 0 19G 0 part
|-centos-root 253:0 0 17G 0 lvm /
`-centos-swap 253:1 0 2G 0 lvm [SWAP]
其中 MAJ:MIN 代表主要 : 次要设备代码,RM 标记是否为可移动(removable)设备,RO 为是否以只读挂载。
也可以只单独查询某个磁盘,用 -p
参数显示分区全名:
[root@101c7 ext333]$ lsblk -ip /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 20G 0 disk
|-/dev/sda1 8:1 0 1G 0 part /boot
`-/dev/sda2 8:2 0 19G 0 part
|-/dev/mapper/centos-root 253:0 0 17G 0 lvm /
`-/dev/mapper/centos-swap 253:1 0 2G 0 lvm [SWAP]
UUID(Universally Unique Identifier)是全域单一识别码,也可以用 UUID 来挂载设备。使用 blkid
命令来查询:
[root@101c7 ext333]$ blkid
/dev/mapper/centos-root: UUID="bb5b6906-0dff-46c4-832e-1701522802e6" TYPE="xfs"
/dev/sda2: UUID="0lYfzD-6Mqj-AtC4-Jgf1-LGpk-ODIk-xbJIa7" TYPE="LVM2_member"
磁盘分区
如果是 MBR 分区表,使用 fdisk
分区;GPT 分区使用 gdisk
分区。两种工具在使用方法上没有区别。这里使用 fdisk
演示。
查看分区
例如,查看系统内的所有分区:
[root@101c7 ext333]$ fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a3a75
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Disk /dev/mapper/centos-root: 18.2 GB, 18249416704 bytes, 35643392 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
由上述信息可见,sda 分了两个区,其中 sda 可做启动引导。
对新增的磁盘 sdb 进行操作:
[root@101c7 ext333]$ fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
进入 fdisk
后输入 m
可以查看帮助。常用命令有:d
删除分区,n
新增分区,p
显示分区表,w
写入分区信息并退出。
先看看分区状态:
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x2de15e6d
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2097151 1047552 83 Linux
由上表中可以看到:磁盘大小 1073 MB,扇区数 2097152,每个扇区大小 512 Bytes,分区开始扇区号 2048,截止扇区号 2097151,block 数(1KB 为单位)1047552。
删除分区
假设要删除 sdb1 分区,在等待命令页面输入 d
会提示要删除的分区编号(sdb 后面带的数字):
Command (m for help): d
Selected partition 1
Partition 1 is deleted
再次查看分区已经被删除了,保存退出:
Command (m for help): w
The partition table has been altered!
新增分区
输入 n
以后会进入新建分区交互界面:
- 选择新增的分区类型是主分区
p
; - 设置为 4 号;
- 起始扇区号采用默认 2048;
- 结束扇区号可以输入扇区号,也可以输入大小,这里输入
+100M
大小:
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Using default response p
Partition number (1-4, default 1): 4
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +100M
Partition 4 of type Linux and of size 100 MiB is set
再新增一个 200M 大小的扩展分区:
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e
Partition number (1-3, default 1): 1
First sector (206848-2097151, default 206848):
Using default value 206848
Last sector, +sectors or +size{K,M,G} (206848-2097151, default 2097151): +200M
Partition 1 of type Extended and of size 200 MiB is set
完成后输入 p
查看状态:
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x951d99c8
Device Boot Start End Blocks Id System
/dev/sdb1 206848 616447 204800 5 Extended
/dev/sdb4 2048 206847 102400 83 Linux
Partition table entries are not in disk order
可以看到有个主分区名字为 sdb4,扩展分区名为 sdb1,是我们手动设定的样子。
在扩展分区上建立个 80M 大小的逻辑分区,选择类型时输入 l
,系统会自动分配分区号:
Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (208896-616447, default 208896):
Using default value 208896
Last sector, +sectors or +size{K,M,G} (208896-616447, default 616447): +80M
Partition 5 of type Linux and of size 80 MiB is set
完成后输入 w
保存更改并退出:
Command (m for help): w
提示说要重启让改动生效,可以使用 partprobe
命令让内核重新扫描分区表:
[root@101c7 ext333]$ partprobe -s
/dev/sda: msdos partitions 1 2
/dev/sdb: msdos partitions 1 2 3 4
/dev/sdc: msdos partitions 1
/dev/sr0: msdos partitions 2
下面展示使用 gdisk
制作一个 500MB 大小 GPT 分区的过程:
[root@101c7 ext333]$ gdisk /dev/sdd
GPT fdisk (gdisk) version 0.8.10
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-2097118, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: +500MB
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdd.
The operation has completed successfully.
[root@101c7 ext333]$ partprobe -s
/dev/sda: msdos partitions 1 2
/dev/sdb: msdos partitions 1 2 3 4
/dev/sdc: msdos partitions 1
/dev/sdd: gpt partitions 1
/dev/sr0: msdos partitions 2
格式化分区
建立分区后要格式化分区才可使用,格式化通过 mkfs
类命令操作。
将 sdb4 格式化成 ext3 文件系统:
[root@101c7 ~]$ mkfs -t ext3 /dev/sdb4
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
如果要指定 label,block 大小,inode 数量等参数,需要使用 mke2fs
命令。
例如将 sdb4 设定卷标 boss,block 大小 2048,每 8192 bytes 分配一个 inode 后格式化成 ext3 文件系统:
[root@101c7 ~]$ mke2fs -j -L "boss" -b 2048 -i 8192 /dev/sdb4
设置文件系统不区分大小写:
[root@101c7 ~]$ mkfs.xfs -L datavolume -f -n version=ci /dev/md0
用 mkfs.xfs
格式化 xfs 文件系统,要设定具体分区数值可用 -d
参数。指定储存区群组数量为 16 并强制格式化 sdd1:
[root@101c7 ext333]$ mkfs.xfs -f -d agcount=16 /dev/sdd1
meta-data=/dev/sdd1 isize=512 agcount=16, agsize=8000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
新建 swap 分区
swap 内存交换空间用来在系统内存不足时,替代内存使用的硬盘空间。虽然内存不足的情况已经很少发生,但有些旧程序会要求使用 swap 分区,或者作为出现内存溢出等异常状态时缓冲一下,还是有必要建一个的。
下面将在 sdb 上使用空闲容量新建一个 256MB 大小的 swap 分区(代码 82):
Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): p
Partition number (2,3, default 2):
First sector (616448-2097151, default 616448):
Using default value 616448
Last sector, +sectors or +size{K,M,G} (616448-2097151, default 2097151): +256M
Partition 2 of type Linux and of size 256 MiB is set
Command (m for help): t
Partition number (1,2,4,5, default 5): 2
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'
Command (m for help): w
The partition table has been altered!
[root@101c7 tinycore_iso]$ partprobe
也可以使用 dd
命令来创建一个空文件,当作 swap 分区使用。
使用 mkswap
格式化:
[root@101c7 tinycore_iso]$ mkswap /dev/sdb2
Setting up swapspace version 1, size = 262140 KiB
no label, UUID=2cfd898c-2b54-467b-94a4-96c29567cb7d
接着用 swapon
命令加载 swap:
[root@101c7 tinycore_iso]$ free
total used free shared buff/cache available
Mem: 3861280 248320 3108468 11880 504492 3329556
Swap: 2097148 0 2097148
[root@101c7 tinycore_iso]$ swapon /dev/sdb2
[root@101c7 tinycore_iso]$ free
total used free shared buff/cache available
Mem: 3861280 248636 3108120 11880 504524 3329304
Swap: 2359288 0 2359288
可以查看到已经在使用的 swap 设备有哪些:
[root@101c7 tinycore_iso]$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdb2 partition 262140 0 -3
如果要开机启动记得修改 /etc/fstab
文件来开机挂载。
使用 swapoff
来关掉 swap file:
[root@101c7 ~]$ swapoff /dev/sdb2; swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
大容量磁盘分区
由于 fdisk 无法支持 2TB 以上的分区,可以使用 parted
程序来分区,它同时支持 MBR 和 GPT 两种分区表格式。
查看当前的分区表资料:
[root@101c7 2]$ parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
4 1049kB 106MB 105MB primary ext3
1 106MB 316MB 210MB extended
5 107MB 191MB 83.9MB logical
2 316MB 584MB 268MB primary linux-swap(v1)
新建一个 ext3 格式 110M 大小的逻辑分区:
[root@101c7 2]$ parted /dev/sdb mkpart logical ext3 191MB 301MB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
Information: You may need to update /etc/fstab.
[root@101c7 2]$ parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
4 1049kB 106MB 105MB primary ext3
1 106MB 316MB 210MB extended
5 107MB 191MB 83.9MB logical
6 191MB 301MB 110MB logical
2 316MB 584MB 268MB primary linux-swap(v1)
删除刚刚新建的 sdb6 分区:
[root@101c7 2]$ parted /dev/sdb rm 6
Information: You may need to update /etc/fstab.
磁盘工具
主要包括一些读写性能测试,文件系统修复等工具。
Ext 磁盘扫描
Ext 文件系统可使用 fsck
来对磁盘进行扫描,检查文件系统错误。通常情况下只有出现问题才使用这个命令。
例如进入到单用户模式下,被检查的分区务必不可挂载到系统上,否则可能造成部分文件系统损坏。
可用参数:
选项 | 说明 |
---|---|
-C | 检验过程中显示进度 |
-f | 强制检查,将所有状态为 clean 的扇区也纳入检查范围 |
-D | 针对文件系统下的目录进行优化配置 |
-p | 自动修复文件系统存在的问题 |
-b | 接 superblock 位置,用来恢复主 superblock。一般备份在 1K=8193 / 2K=16384 / 4k=32768 位置 |
-c | 对文件系统进行坏块检查,并添加到坏块列表中。 |
检查 sdb4 分区:
[root@101c7 ~]$ fsck -C -f /dev/sdb4
fsck from util-linux 2.23.2
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
boss: 11/12800 files (0.0% non-contiguous), 5076/51200 blocks
使用备份恢复 sdb4 损坏的 superblock:
[root@101c7 ext333]$ fsck.ext3 -b 32768 /dev/sdb4
Xfs 磁盘扫描
xfs 文件系统扫描使用 xfs_repair
工具。可用选项:
选项 | 说明 |
---|---|
-f | 后面接文件文件而不是磁盘 |
-n | 单纯检查并不修改文件系统的任何数据 |
-d | 通常用在救援模式下面对根目录进行检查与修复的动作 |
修复时同样要求先卸载目标分区,例如检查 /dev/sdd1
:
[root@101c7 ext333]$ xfs_repair /dev/sdd1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - for each AG...
Phase 4 - check for duplicate blocks...
Phase 5 - rebuild AG headers and trees...
Phase 6 - check inode connectivity...
Phase 7 - verify and correct link counts...
done
坏道扫描
badblocks
命令用来检测硬盘扇区有没有坏道。其实等于 mke2fs -c
在进行格式化时处理磁盘表面的读取测试。
例如检查 sdb4 分区:
[root@101c7 ~]$ badblocks -sv /dev/sdb4
Checking blocks 0 to 102399
Checking for bad blocks (read-only test): done
Pass completed, 0 bad blocks found. (0/0/0 errors)
修改设备代码
有时需要手动处理设备文件,可以使用 mknod
命令来修改设备代码。
可修改的设备种类有 b(外部储存,移动硬盘),c(外部输入,鼠标),p(FIFO 文件)。
常见磁盘设备代码如下:
磁盘文件名 | Major | Minor |
---|---|---|
/dev/sda | 8 | 0-15 |
/dev/sdb | 8 | 16-31 |
/dev/loop0 | 7 | 0 |
/dev/loop1 | 7 | 1 |
例如创建 sdb5 的设备代码 Maj:Min 为 8,21:
[root@101c7 ~]$ mknod /dev/sdb5 b 8 21; ll /dev/sdb5
brw-rw----. 1 root disk 8, 21 Sep 10 04:08 /dev/sdb5
修改分区卷标
可以使用 e2label
来修改 ext 文件系统卷标(Label),卷标类似与 Win 中的 本地磁盘
。
例如修改 sdb4 的卷标为 P1
:
[root@101c7 ~]$ e2label /dev/sdb4 "P1"
[root@101c7 ~]$ dumpe2fs -h /dev/sdb4 | grep name
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: P1
也可使用 tune2fs
命令来修改:
[root@101c7 ext333]$ tune2fs -L P2 /dev/sdb4
修改 UUID
XFS 文件系统使用 UUID 作为标识符,可以使用 xfs_admin
命令修改 UUID 和 Label。
例如修改 sdd1 的 Label name 为 xfs1:
[root@101c7 ext333]$ xfs_admin -L xfs1 /dev/sdd1
writing all SBs
new label = "xfs1"
修改 UUID 需要先生成 UUID 号码,可以使用 uuidgen
命令生成,然后再设置到 sdd1 上:
[root@101c7 ext333]$ xfs_admin -U $(uuidgen) /dev/sdd1
Clearing log and setting UUID
writing all SBs
new UUID = c96b6650-756a-4496-bf26-6e7286c55891
磁盘阵列
使用 mdadm 软件模拟磁盘整列 RAID。如果需要监控 mdadm 建立的软磁盘阵列,可以使用 mdmonitor 服务。
组建软磁盘阵列
使用 mdadm
命令来设置软磁盘阵列,语法如下:
mdadm --detail /dev/md0
mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N --level=[015] --chuck=NK --spare-devices=N /dev/sdx /dev/hdx...
主要参数:
参数 | 说明 |
---|---|
–create | 新建 RAID 的参数 |
–auto=yes | 决定新建后面接的软磁盘阵列设备,如 /dev/md0 |
–chunk=Nk | 决定这个设备的 chunk 大小,一般是 64K 或 512K |
–raid-devices=N | 使用 N 个磁盘组件阵列 |
–spare-devices=N | 使用 N 个磁盘作为备用设备 |
–level=[015] | 设置磁盘阵列的等级 |
–detail | 查询磁盘阵列设备的信息 |
例如用组建 RAID 5 环境,每个分区为 10MB 大小(sdb6-9),有一块热备盘(sdb10),一块闲置盘(sdb11):
[root@101c7 ~]$ mdadm --create --auto=yes /dev/md0 --level=5 --chunk=512K --raid-devices=4 --spare-devices=1 /dev/sdb{6,7,8,9,10}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
如果设置错误,可以使用 mdadm --zero-superblock DEVICE
命令来清空每个组成磁盘的超级块区。
查看组建好的软 RAID 5 设备 /dev/md0
:
[root@101c7 ~]$ mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Sep 13 15:24:49 2021
Raid Level : raid5
Array Size : 24576 (24.00 MiB 25.17 MB)
Used Dev Size : 8192 (8.00 MiB 8.39 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Mon Sep 13 15:24:50 2021
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : 101c7:0 (local to host 101c7)
UUID : f64354f8:cf945331:eee97c66:84776736
Events : 18
Number Major Minor RaidDevice State
0 8 22 0 active sync /dev/sdb6
1 8 23 1 active sync /dev/sdb7
2 8 24 2 active sync /dev/sdb8
5 8 25 3 active sync /dev/sdb9
4 8 26 - spare /dev/sdb10
也可以通过 /proc/mdstat
文件查看磁盘阵列情况:
[root@101c7 ~]$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb9[5] sdb10[4](S) sdb8[2] sdb7[1] sdb6[0]
24576 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>
格式化并挂载 RAID 到 /mnt/raid
:
[root@101c7 ~]$ mkfs -t ext3 /dev/md0
[root@101c7 ~]$ mkdir /mnt/raid ; mount /dev/md0 /mnt/raid ; df | grep 'md0'
/dev/md0 22773 209 21336 1% /mnt/raid
如果格式化成 xfs 格式,可以手动设置 su 和 sw 值:
[root@101c7 ~]$ mkfs.xfs -f -d su=512k, sw=3 -r extsize=1536k /dev/md0
恢复磁盘阵列数据
mdadm
命令救援模式语法为:
mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
模拟磁盘出错可以使用 --fail
参数,模拟 sdb6 出错:
[root@101c7 mnt]$ mdadm --manage /dev/md0 --fail /dev/sdb6
mdadm: set /dev/sdb6 faulty in /dev/md0
再次查看 RAID 状态:
[root@101c7 mnt]$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb9[5] sdb10[4] sdb8[2] sdb7[1] sdb6[0](F)
24576 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>
磁盘阵列已经自动恢复好了。将闲置磁盘 sdb11 替换掉损坏的 sdb6:
[root@101c7 mnt]$ mdadm --manage /dev/md0 --add /dev/sdb11 --remove /dev/sdb6
mdadm: added /dev/sdb11
mdadm: hot removed /dev/sdb6 from /dev/md0
自动挂载 RAID
设置 /etc/mdadm.conf
文件来将 RAID 设备自动挂载:
[root@101c7 mnt]$ mdadm --detail /dev/md0 | grep -i uuid
UUID : f64354f8:cf945331:eee97c66:84776736
[root@101c7 mnt]$ vi /etc/mdadm.conf
ARRAY /dev/md0 UUID=f64354f8:cf945331:eee97c66:84776736
[root@101c7 mnt]$ vi /etc/fstab
/dev/md0 /mnt/raid ext3 defaults 1 2
[root@101c7 mnt]$ umount /dev/md0; mount -a
[root@101c7 mnt]$ df /mnt/raid
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/md0 22773 212 21333 1% /mnt/raid
关闭软 RAID
先删除配置文件 /etc/fstab
中 /dev/md0
的挂载行:
[root@101c7 mnt]$ vi /etc/fstab
# /dev/md0 /mnt/raid ext3 defaults 1 2
卸载 /dev/md0
并关闭:
[root@101c7 mnt]$ umount /dev/md0
[root@101c7 mnt]$ mdadm --stop /dev/md0
mdadm: stopped /dev/md0
如果要重新启用使用 mdadm --assemble --scan /dev/md0
命令。
最后删除 /etc/mdadm.conf
中与 md0 有关的内容:
[root@101c7 mnt]$ vi /etc/mdadm.conf
# ARRAY /dev/md0 UUID=f64354f8:cf945331:eee97c66:84776736
LVM
如果安装系统分区使用默认配置,系统会自动建立 LVM 格式。
建立 PV
首先用 fdisk
建立分区,假设四个分区为 sdb1-4
,然后用 fdisk
依次更改 system ID
为 8e
:
[root@101c7 ~]$ fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0006fb94
Device Boot Start End Blocks Id System
/dev/sdb1 2048 206847 102400 8e Linux LVM
/dev/sdb2 206848 411647 102400 8e Linux LVM
/dev/sdb3 411648 616447 102400 8e Linux LVM
/dev/sdb4 616448 821247 102400 8e Linux LVM
Command (m for help): t
Partition number (1-4, default 4): 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux LVM' to 'Linux LVM'
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
配置好后更新系统:
[root@101c7 ~]$ partprobe
PV 有关的命令有下面这些:
命令 | 作用 |
---|---|
pvcreate | 将物理分区新建成 PV |
pvscan | 查询目前系统里的 PV |
pvdisplay | 显示出目前系统上面的 PV 状态 |
pvremove | 将 PV 属性删除 |
先使用 pvcreate
命令将 sdb1-4
转换成 PV:
[root@101c7 ~]$ pvcreate /dev/sdb{1,2,3,4}
WARNING: ext3 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n]: y
Wiping ext3 signature on /dev/sdb1.
WARNING: dos signature detected on /dev/sdb2 at offset 510. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdb2.
WARNING: swap signature detected on /dev/sdb4 at offset 4086. Wipe it? [y/n]: y
Wiping swap signature on /dev/sdb4.
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdb3" successfully created.
Physical volume "/dev/sdb4" successfully created.
然后使用 pvscan
查询已存在的 PV:
[root@101c7 ~]$ pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdb2 lvm2 [100.00 MiB]
PV /dev/sdb1 lvm2 [100.00 MiB]
PV /dev/sdb3 lvm2 [100.00 MiB]
PV /dev/sdb4 lvm2 [100.00 MiB]
Total: 5 [<19.39 GiB] / in use: 1 [<19.00 GiB] / in no VG: 4 [400.00 MiB]
最后 pvdisplay
查看每个 PV 的详细信息,确认准确无误:
[root@101c7 ~]$ pvdisplay
"/dev/sdb2" is a new physical volume of "100.00 MiB"
--- NEW Physical volume ---
PV Name /dev/sdb2
VG Name
PV Size 100.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0pMJ0Q-1h7w-1fMb-OTKS-Xqa5-sjQj-XSUdSi
建立 VG
与 VG 相关的命令有下面这些:
命令 | 作用 |
---|---|
vgcreate | 新建 VG 的命令 |
vgscan | 查找系统上的 VG |
vgdisplay | 显示系统上的 VG 状态 |
vgextend | 在 VG 内增加额外 PV |
vgreduce | 在 VG 内删除 PV |
vgchange | 设置 VG 是否启动 (active) |
vgremove | 删除一个 VG |
新建 VG 使用 vgcreate
命令的语法如下:
vgcreate [-s PE大小[MGT]] VG名称 PV名称
将 /dev/sdb1-3
新建成一个 VG 名为 VG400,并指定 PE 为 4MB:
[root@101c7 ~]$ vgcreate -s 4M VG400 /dev/sdb{1,2,3}
Volume group "VG400" successfully created
查看 VG 和 PV 的信息:
[root@101c7 ~]$ vgscan
Reading volume groups from cache.
Found volume group "centos" using metadata type lvm2
Found volume group "VG400" using metadata type lvm2
[root@101c7 ~]$ pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdb1 VG VG400 lvm2 [96.00 MiB / 96.00 MiB free]
PV /dev/sdb2 VG VG400 lvm2 [96.00 MiB / 96.00 MiB free]
PV /dev/sdb3 VG VG400 lvm2 [96.00 MiB / 96.00 MiB free]
PV /dev/sdb4 lvm2 [100.00 MiB]
Total: 5 [<19.38 GiB] / in use: 4 [<19.28 GiB] / in no VG: 1 [100.00 MiB]
[root@101c7 ~]$ vgdisplay
--- Volume group ---
VG Name VG400
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 288.00 MiB
PE Size 4.00 MiB
Total PE 72
Alloc PE / Size 0 / 0
Free PE / Size 72 / 288.00 MiB
VG UUID mWWhO0-wuDl-z62s-BPZZ-L1Ck-0Pbs-DNTCIf
可以看到 3 个 PV 已经加入到 VG400 当中了,VG 容量 288MB,PE 大小 4MB,总共有 72 个 PV。
要给 VG 扩容,将剩下的 sdb4
加入到 VG400
中可以使用 vgextend
命令:
[root@101c7 ~]$ vgextend VG400 /dev/sdb4
Volume group "VG400" successfully extended
建立 LV
和 LV 有关的命令如下:
命令 | 作用 |
---|---|
lvcreate | 新建 LV |
lvscan | 查询系统上的 LV |
lvdisplay | 显示系统上的 LV 状态 |
lvextend | 在 LV 里面增加容量 |
lvreduce | 在 LV 里面减少容量 |
lvremove | 删除一个 LV |
lvresize | 对 LV 进行容量大小调整 |
建立 LV 使用命令 lvcreate
基本语法如下:
lvcreate [-L 容量[MGT]] [-n LV名称] VG名称
lvcreate [-l PE个数] [-n LV名称] VG名称
将整个 VG400
分配给 LV400
(不带 -l
参数默认会分配全部容量):
[root@101c7 ~]$ lvcreate -l 96 -n LV400 VG400
Logical volume "LV400" created.
[root@101c7 ~]$ lvdisplay
--- Logical volume ---
LV Path /dev/VG400/LV400
LV Name LV400
VG Name VG400
LV UUID 21Hgtc-LzS0-2XvL-XiXD-3DPd-94Cu-zQfcvU
LV Write Access read/write
LV Creation host, time 101c7, 2021-09-13 17:26:08 -0400
LV Status available
# open 0
LV Size 384.00 MiB
Current LE 96
Segments 4
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
将 LV400
格式化成 ext3
并挂载到 /ext333
:
[root@101c7 ~]$ mkfs.ext3 /dev/VG400/LV400
[root@101c7 ~]$ mount /dev/VG400/LV400 /ext333/
[root@101c7 ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 1918780 0 1918780 0% /dev
tmpfs 1930640 0 1930640 0% /dev/shm
tmpfs 1930640 11924 1918716 1% /run
tmpfs 1930640 0 1930640 0% /sys/fs/cgroup
/dev/mapper/centos-root 17811456 2598096 15213360 15% /
/dev/sda1 1038336 190536 847800 19% /boot
tmpfs 386128 0 386128 0% /run/user/0
/dev/mapper/VG400-LV400 372615 2095 350860 1% /ext333
LVM 扩容
扩容分为以下步骤:
- 用
fdisk
设置新分区 system ID 为 8e; - 利用
pvcreate
构建 PV; - 利用
vgextend
将 PV 加入 VG; - 利用
lvresize
将新加入 VG 内的 PE 加入到 LV 中; - 利用
resize2fs
将文件系统容量增加。
先扫描新增加的 SCSI 接口硬盘:
[root@101c7 ~]$ echo "- - -" > /sys/class/scsi_host/host0/scan
对新扫描到的硬盘 /dev/sdc
进行分区,并设置 8e 标志:
[root@101c7 ~]$ fdisk /dev/sdc
Command (m for help): n
Command (m for help): t
Hex code (type L to list all codes): 8e
Command (m for help): w
[root@101c7 ~]$ partprobe
通过 sdc1
建立 PV:
[root@101c7 ~]$ pvcreate /dev/sdc1
将 sdc1
加入到 VG400
中:
[root@101c7 ~]$ vgextend VG400 /dev/sdc1
使用 lvresize
命令对 LV400
进行扩容。如果要使用所有空闲容量可以使用 +100%FREE
参数:
[root@101c7 ~]$ lvresize -l +255 /dev/VG400/LV400
Size of logical volume VG400/LV400 changed from 384.00 MiB (96 extents) to 1.37 GiB (351 extents).
Logical volume VG400/LV400 successfully resized.
最后使用 resize2fs
扩容:
[root@101c7 ~]$ resize2fs /dev/VG400/LV400
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/VG400/LV400 is mounted on /ext333; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 6
The filesystem on /dev/VG400/LV400 is now 1437696 blocks long.
xfs
文件系统使用的是 xfs_growfs
命令:
[root@101c7 ~]$ xfs_growfs /dev/VG400/LV400
LVM 缩容
XFS 文件系统不支持缩容。如果要进行缩容,需要将 /dev/sdc1
抽出来,首先需要 umount
挂载点:
[root@101c7 ~]$ umount /ext333/
然后对 LV400
运行磁盘检查:
[root@101c7 ~]$ e2fsck -f /dev/VG400/LV400
用 resize2fs
命令对 LV400
的容量进行缩减 sdc1
的大小:
[root@101c7 ~]$ resize2fs /dev/VG400/LV400 200M
重新挂载 LV400
到 /ext333
:
[root@101c7 ~]$ mount /dev/VG400/LV400 /ext333/
去除 sdc1
上的 PE 数 255
:
[root@101c7 ~]$ lvresize -l -255 /dev/VG400/LV400
转移 sdc1
上 PE 的数据到 sdb2
。pvmove
同样可以用来在想要更换物理磁盘时使用:
[root@101c7 ~]$ pvmove /dev/sdc1 /dev/sdb2
将 sdc1
移出 VG400
:
[root@101c7 ~]$ vgreduce VG400 /dev/sdc1
最后删除 sdc1
上的 pv
标记:
[root@101c7 ~]$ pvremove /dev/sdc1
LVM Thin Volume
LVM Thin Volume 先创建一个磁盘容量储存池(Thin Pool),再由这个储存池去产生一个指定要固定容量大小的 LV 设备,它可以设定任意大小,但在需要用到时才从储存池划取所需容量。只要实际用量不超过储存池总容量就行。
先从 VG400
的剩余容量中取出 100 MB 来创建储存池 vpool
:
[root@101c7 ~]$ lvcreate -L 100M -T /dev/VG400/vpool
Thin pool volume with chunk size 64.00 KiB can address at most 15.81 TiB of data.
Logical volume "vpool" created.
[root@101c7 ~]$ lvdisplay /dev/VG400/vpool
--- Logical volume ---
LV Name vpool
VG Name VG400
LV UUID Zl8N7t-SiIF-edLi-COKJ-PrVx-Ma7H-vA1e2U
LV Write Access read/write
LV Creation host, time 101c7, 2021-09-17 16:43:00 -0400
LV Pool metadata vpool_tmeta
LV Pool data vpool_tdata
LV Status available
# open 0
LV Size 100.00 MiB
Allocated pool data 0.00%
Allocated metadata 10.84%
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:8
[root@101c7 ~]$ lvs VG400
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LV400 VG400 owi-aos--- 384.00m
VG400m VG400 swi-I-s--- 96.00m LV400 100.00
vpool VG400 twi-a-tz-- 100.00m 0.00 10.84
创建 vthin1
设备,大小定为 1 GB:
[root@101c7 ~]$ lvcreate -V 1G -T /dev/VG400/vpool -n vthin1
WARNING: Sum of all thin volume sizes (34.00 GiB) exceeds the size of thin pool VG400/vpool and the size of whole volume group (1.37 GiB).
WARNING: You have not turned on protection against thin pools running out of space.
WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
Logical volume "vthin1" created.
[root@101c7 ~]$ lvs VG400
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LV400 VG400 owi-aos--- 384.00m
VG400m VG400 swi-I-s--- 96.00m LV400 100.00
vpool VG400 twi-aotzD- 100.00m 100.00 12.11
vthin1 VG400 Vwi-a-tz-- 34.00g vpool 0.29
格式化成 xfs 文件系统并挂载到 /root/thin1
:
[root@101c7 ~]$ mkfs.xfs /dev/VG400/vthin1
[root@101c7 ~]$ mount /dev/VG400/vthin1 /root/thin1/
[root@101c7 ~]$ df -hT
/dev/mapper/VG400-LV400 ext3 186M 62M 116M 35% /ext333
/dev/sdd1 xfs 497M 56M 441M 12% /xfs333
/dev/mapper/VG400-vthin1 xfs 1014M 33M 982M 4% /root/thin1
[root@101c7 ~]$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LV400 VG400 owi-aos--- 384.00m
VG400m VG400 swi-I-s--- 96.00m LV400 100.00
vpool VG400 twi-aotz-- 100.00m 10.69 10.94
vthin1 VG400 Vwi-aotz-- 1.00g vpool 1.04
使用储存池一定要注意容量问题,否则超容量使用会造成数据损毁,并且没有系统提示。
LVM 快照
LVM 可以使用系统快照(snapshot)功能来备份需要的原始数据。快照区与被快照区为不同 LV 中,但要在同一个 VG 上面。
这里使用 sdc1
作为快照区使用。使用 lvcreate -s
来新建系统快照区 VG400m
,并给予一个 PV 占用的 PE 数量 24:
[root@101c7 ~]$ lvcreate -l 24 -s -n VG400m /dev/VG400/LV400
Logical volume "VG400m" created.
使用 lvdisplay
查看一下新建的快照区 snap_lv400
信息:
[root@101c7 ~]$ lvdisplay
--- Logical volume ---
LV Path /dev/VG400/VG400m
LV Name VG400m
VG Name VG400
LV UUID cNZB7T-8D2u-IlRt-05sP-e8We-R4ox-WDNqW1
LV Write Access read/write
LV Creation host, time 101c7, 2021-09-13 18:22:45 -0400
LV snapshot status active destination for LV400
LV Status available
# open 0
LV Size 384.00 MiB
Current LE 96
COW-table size 96.00 MiB
COW-table LE 24
Allocated to snapshot 0.01%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:5
其中 COW-table size 是快照区的实际容量。可以将快照区挂载后查看内容,取出里面数据。
如果是 xfs 文件系统挂载时得使用 nouuid
参数。
要想建立快照区,必须注意快照区剩余容量要能装得下原始数据,如果快照区容纳不了,快照功能会失效。
也可以将快照挂载后卸载原先 LV,使用快照区作为测试环境在上面测试,测试完毕后直接将快照区删除。
要删除快照,先 umount
再使用 lvremove
命令即可。