Linux常用命令--磁盘管理之RAID5

摘要

  • 磁盘的挂载、分区、格式化、扩容等命令

  • 本文基于AWS EC2 EBS CentOS8(x86_64)

写在前面

  • raid后不支持重新挂载到EC2

  • raid后同样支持分区和扩容,就把raid后的磁盘当作普通磁盘操作即可

创建raid5

1.登录aws挂载好3块磁盘,raid5要求至少3块盘,这里每个10g

2.创建raid5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 查看磁盘名称,新挂载的磁盘为 nvme1n1,nvme2n1,nvme3n1
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
nvme1n1 259:3 0 10G 0 disk
nvme2n1 259:4 0 10G 0 disk
nvme3n1 259:5 0 10G 0 disk

# 创建 /dev/md0 的raid5逻辑卷
$ mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

# 查看分区情况,可以看到 /dev/md0 是20G
$ fdisk -l
Disk /dev/nvme0n1:8 GiB,8589934592 字节,16777216 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
磁盘标识符:465F350B-EC19-47A2-9A1D-44ECF9FF38AC

设备 起点 末尾 扇区 大小 类型
/dev/nvme0n1p1 4096 16777182 16773087 8G Linux 文件系统
/dev/nvme0n1p128 2048 4095 2048 1M BIOS 启动

分区表记录没有按磁盘顺序。


Disk /dev/nvme1n1:10 GiB,10737418240 字节,20971520 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节


Disk /dev/nvme2n1:10 GiB,10737418240 字节,20971520 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节


Disk /dev/nvme3n1:10 GiB,10737418240 字节,20971520 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节


Disk /dev/md0:20 GiB,21458059264 字节,41910272 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):524288 字节 / 1048576 字节

3.格式化

3.1 ext4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
1310720 inodes, 5238784 blocks
261939 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2153775104
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

3.2 xfs

1
2
3
4
5
6
7
8
9
10
11
12
13
$ mkfs.xfs /dev/md0
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md0 isize=512 agcount=16, agsize=327296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5236736, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

4.挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ mkdir /data
$ mount /dev/md0 /data

$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 456M 0 456M 0% /dev
tmpfs tmpfs 464M 0 464M 0% /dev/shm
tmpfs tmpfs 464M 436K 464M 1% /run
tmpfs tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 8.0G 1.7G 6.4G 21% /
tmpfs tmpfs 93M 0 93M 0% /run/user/1000
/dev/md0 ext4 20G 24K 19G 1% /data

# 开机自动挂载
# ext4
$ echo '/dev/md0 /data ext4 defaults 0 0' >> /etc/fstab
# xfs
$ echo '/dev/md0 /data xfs defaults 0 0' >> /etc/fstab
$ mount -a

$ lsblk # 此时可以看到 TYPE 为 raid5
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
nvme1n1 259:3 0 10G 0 disk
└─md0 9:0 0 20G 0 raid5 /data
nvme2n1 259:4 0 10G 0 disk
└─md0 9:0 0 20G 0 raid5 /data
nvme3n1 259:5 0 10G 0 disk
└─md0 9:0 0 20G 0 raid5 /data

5.检查Raid5状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 检查 RAID5 数组的状态,重点关注 Array Size 和 Used Dev Size,前者表示raid5中总的磁盘大小,后者表示实际使用的磁盘大小
$ mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Oct 31 09:25:02 2023
Raid Level : raid5
Array Size : 20955136 (19.98 GiB 21.46 GB)
Used Dev Size : 10477568 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Tue Oct 31 09:45:35 2023
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : resync

Name : 0
UUID : 765ad648:3d03a9e0:5a86106f:2e24b14d
Events : 19

Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/sdf
1 259 4 1 active sync /dev/sdg
3 259 5 2 active sync /dev/sdh

添加新的磁盘到现有raid5

1.登录aws挂载好1块磁盘,这里还是10g

2.查看磁盘名称

1
2
3
4
5
6
7
8
9
10
11
12
$ lsblk  # 这里新挂载的磁盘为 nvme4n1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
nvme1n1 259:3 0 10G 0 disk
└─md0 9:0 0 20G 0 raid5 /data
nvme2n1 259:4 0 10G 0 disk
└─md0 9:0 0 20G 0 raid5 /data
nvme3n1 259:5 0 10G 0 disk
└─md0 9:0 0 20G 0 raid5 /data
nvme4n1 259:6 0 10G 0 disk

3.格式化

1
2
3
4
5
# xfs
$ mkfs.xfs /dev/nvme4n1

# ext4
$ mkfs.ext4 /dev/nvme4n1

4.加入raid5

1
2
$ mdadm --add /dev/md0 /dev/nvme4n1
mdadm: added /dev/nvme4n1

5.查看raid信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 查看raid信息,此时可以看到新加入的磁盘被当作了备用盘:Spare Devices : 1
$ mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Oct 31 09:25:02 2023
Raid Level : raid5
Array Size : 20955136 (19.98 GiB 21.46 GB)
Used Dev Size : 10477568 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Tue Oct 31 09:45:35 2023
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : resync

Name : 0
UUID : 765ad648:3d03a9e0:5a86106f:2e24b14d
Events : 19

Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/sdf
1 259 4 1 active sync /dev/sdg
3 259 5 2 active sync /dev/sdh

4 259 6 - spare /dev/sdi

6.将备用盘加入raid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 这里扩容到4快盘
$ mdadm --grow /dev/md0 --raid-devices=4

# 再次查看raid信息
$ mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Oct 31 09:25:02 2023
Raid Level : raid5
Array Size : 20955136 (19.98 GiB 21.46 GB)
Used Dev Size : 10477568 (9.99 GiB 10.73 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Tue Oct 31 10:04:18 2023
State : clean, reshaping
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : resync

Reshape Status : 5% complete
Delta Devices : 1, (3->4)

Name : 0
UUID : 765ad648:3d03a9e0:5a86106f:2e24b14d
Events : 39

Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/sdf
1 259 4 1 active sync /dev/sdg
3 259 5 2 active sync /dev/sdh
4 259 6 3 active sync /dev/sdi

7.监视同步过程:扩容后raid机制会将数据分配到新加入的磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 nvme4n1[4] nvme3n1[3] nvme2n1[1] nvme1n1[0]
20955136 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
[========>............] reshape = 42.7% (4484448/10477568) finish=3.9min speed=25563K/sec

unused devices: <none>

# 可以使用watch命令进行监控,这里设置为每隔1秒执行一次命令
$ watch -n 1 cat /proc/mdstat

# 完成后的效果
$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 nvme4n1[4] nvme3n1[3] nvme2n1[1] nvme1n1[0]
31432704 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

unused devices: <none>

8.扩展文件系统

8.1 ext4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ resize2fs /dev/md0
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/md0 is mounted on /data; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/md0 is now 7858176 blocks long.

$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 456M 0 456M 0% /dev
tmpfs tmpfs 464M 0 464M 0% /dev/shm
tmpfs tmpfs 464M 500K 464M 1% /run
tmpfs tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 8.0G 1.7G 6.4G 21% /
tmpfs tmpfs 93M 0 93M 0% /run/user/1000
/dev/md0 ext4 30G 24K 28G 1% /data
tmpfs tmpfs 93M 0 93M 0% /run/user/0

8.2 xfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ xfs_growfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=17, agsize=327296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5238784, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 5238784 to 7858176

$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 456M 0 456M 0% /dev
tmpfs tmpfs 464M 0 464M 0% /dev/shm
tmpfs tmpfs 464M 500K 464M 1% /run
tmpfs tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 8.0G 1.7G 6.4G 21% /
tmpfs tmpfs 93M 0 93M 0% /run/user/1000
/dev/md0 xfs 30G 248M 30G 1% /data
tmpfs tmpfs 93M 0 93M 0% /run/user/0

raid5后进行分区

  • raid5后创建的逻辑卷同样支持分区,注意:如果已经mount,则分区前要先umount

1.创建分区,这里以MBR举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ fdisk /dev/md0

欢迎使用 fdisk (util-linux 2.30.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):n
分区号 (1-128, 默认 1):
第一个扇区 (34-83820510, 默认 4096):
上个扇区,+sectors 或 +size{K,M,G,T,P} (4096-83820510, 默认 83820510): +10G

创建了一个新分区 1,类型为“Linux filesystem”,大小为 10 GiB。

命令(输入 m 获取帮助):n
分区号 (2-128, 默认 2):
第一个扇区 (20975616-83820510, 默认 20975616):
上个扇区,+sectors 或 +size{K,M,G,T,P} (20975616-83820510, 默认 83820510):

创建了一个新分区 2,类型为“Linux filesystem”,大小为 30 GiB。

命令(输入 m 获取帮助):p
Disk /dev/md0:40 GiB,42916118528 字节,83820544 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):524288 字节 / 2097152 字节
磁盘标签类型:gpt
磁盘标识符:73A41633-30A2-47D5-B812-6C419C795D7C

设备 起点 末尾 扇区 大小 类型
/dev/md0p1 4096 20975615 20971520 10G Linux 文件系统
/dev/md0p2 20975616 83820510 62844895 30G Linux 文件系统

命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。

2.格式化,这里以xfs举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ mkfs.xfs /dev/md0p1
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md0p1 isize=512 agcount=16, agsize=152576 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=2441150, imaxpct=25
= sunit=128 swidth=384 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

$ mkfs.xfs /dev/md0p2
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md0p2 isize=512 agcount=16, agsize=338560 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5416320, imaxpct=25
= sunit=128 swidth=384 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2648, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

3.mount到指定路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ mkdir /data1
$ mkdir /data2
$ mount /dev/md0p1 /data1
$ mount /dev/md0p2 /data2
$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 456M 0 456M 0% /dev
tmpfs tmpfs 464M 0 464M 0% /dev/shm
tmpfs tmpfs 464M 508K 464M 1% /run
tmpfs tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 8.0G 1.7G 6.4G 21% /
tmpfs tmpfs 93M 0 93M 0% /run/user/1000
tmpfs tmpfs 93M 0 93M 0% /run/user/0
/dev/md0p1 xfs 9.4G 100M 9.3G 2% /data1
/dev/md0p2 xfs 21G 181M 21G 1% /data2

# 开机自动挂载
$ echo '/dev/md0p1 /data1 xfs defaults 0 0' >> /etc/fstab
$ echo '/dev/md0p2 /data2 xfs defaults 0 0' >> /etc/fstab
$ mount -a

4.扩容,添加新的磁盘,新的磁盘只能扩容最后一个分区,这里就是指的第二个分区

  • raid5中添加新的磁盘参考上面的内容,这里不再赘述,这里添加一个10g的新磁盘

  • 扩容最后一个分区

1
2
$ growpart /dev/md0 2
CHANGED: partition=2 start=19531776 old: size=43330560 end=62862336 new: size=64288735 end=83820511
  • 同步文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ xfs_growfs -d /data2
meta-data=/dev/md0p2 isize=512 agcount=16, agsize=338560 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5416320, imaxpct=25
= sunit=128 swidth=384 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2648, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 5416320 to 8036091

$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 456M 0 456M 0% /dev
tmpfs tmpfs 464M 0 464M 0% /dev/shm
tmpfs tmpfs 464M 460K 464M 1% /run
tmpfs tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 8.0G 1.7G 6.4G 21% /
tmpfs tmpfs 93M 0 93M 0% /run/user/1000
/dev/md0p1 xfs 9.4G 100M 9.3G 2% /data1
/dev/md0p2 xfs 31G 253M 31G 1% /data2