Linux磁盘管理

分区的类型

MBR硬盘分区列表为64字节

  • 主分区:一个SCSI类型的磁盘最多划分4个主分区。主分区可以直接存放数据。

  • 扩展分区:在linux系统中,一个块磁盘最多拥有1个扩展分区,并且扩展分区的大小不能随意调整。扩展分区不能直接存放数据,它的作用是为了充分利用16字节的盘符位的。在这16字节中,每一个字节是一个小的盘符位。这个一字节大小的盘符位是给逻辑分区使用的。

  • 逻辑分区:使用扩展分区的16字节位,来划分自己的盘符位。逻辑分区最多划分16个,逻辑分区可以直接存放数据。

GPT硬盘分区最大支持128个分区

  • 一个分区表项的前16字节是分区类型GUID。接下来的16字节是该分区唯一的GUID。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。

文件系统

ext4:分区最大64T

xfs:分区最大P级别,大容量存储时使用

ocfs2:共享文件系统

vfat:exFAT

1
2
3
4
5
6
7
8
fdisk		MBR磁盘管理
-l 查看分区
n 新建分区
p 查看分区
t 更改system id(给管理员看,修改分区类型前先修改ID)
w 保存分区并退出
gdisk GPT磁盘管理
partx -a 强制将分区更改写入磁盘

SWAP虚拟内存

企业中一般要求SWAP大小等于物理内存

1
2
mkswap	创建虚拟内存文件系统
swapon 启用SWAP

fstab自动挂载文件

位置在/etc/fstab

格式:

1
2
/dev/md5	/storage	ext4				defaults		0 0
#挂载源 挂载点 文件系统格式 选项 dump还原点 开机磁盘检测
  1. 挂载源:块文件/UUID
  2. 挂载点:路径/swap
  3. 文件系统格式/swap
  4. 选项,一般defaults,从左到右读配置,右边覆盖左边
  5. dump还原点,1/0,启用/关闭
  6. 开机磁盘检测,0/1/2,关闭/启用/等1检查完后再检查,只有根目录为1

使用ISCSI远程存储时,挂载源务必写UUID,选项为defaults,_netdev(网络磁盘)

1
2
3
blkid	#查看分区UUID和文件系统类型
mount -a #检查写入fstab的挂载参数是否正确并挂载
swapon -a #检查写入fstab的swap参数是否正确并挂载

iostat查询主机侧IO时延

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# yum install -y sysstat
[root@localhost ~]# iostat
Linux 5.14.0-570.el9.x86_64 (localhost.localdomain) 2025年05月08日 _x86_64_ (4 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.64 0.00 0.35 0.01 0.02 98.98

Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 0.82 1.66 17.18 0.00 242166 2513423 0
dm-1 0.00 0.02 0.00 0.00 2220 0 0
md0 0.00 0.01 0.00 0.00 2092 0 0
sr0 0.00 0.01 0.00 0.00 2096 0 0
vda 0.57 2.09 17.20 0.00 305461 2515471 0
vdb 1.29 716.38 136.84 0.00 104794412 20017235 0
vdc 1.29 136.85 716.36 0.00 20019464 104791056 0

mdadm管理软RAID

安装mdadm:yum install mdadm -y

创建 RAID

假设创建的RAID级别为RAID1

1
2
3
4
# 确认硬盘 假设使用/dev/vdb和/dev/vdc
lsblk
# 创建 RAID1
mdadm -Cv /dev/md0 -l 1 -n 2 /dev/vdb /dev/vdc
  • -C--create 的缩写。
  • -v--verbose 的缩写。
  • -l--level 的缩写。
  • -n--raid-devices 的缩写。

输出

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# mdadm -Cv /dev/md0 -l 1 -n 2 /dev/vdb /dev/vdc
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
mdadm: size set to 104791040K
Continue creating array [y/N]? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

保存 RAID 配置(重要)

保存 RAID 配置到 mdadm.conf

1
mdadm -D --scan >> /etc/mdadm.conf
  • -D--detail 的缩写。

验证 RAID

查看RAID状态

cat /proc/mdstat
mdadm --detail /dev/md0

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
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 vdc[1] vdb[0]
104791040 blocks super 1.2 [2/2] [UU]
[====>................] resync = 22.9% (24054656/104791040) finish=12.0min speed=111634K/sec

unused devices: <none>
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu May 8 10:29:14 2025
Raid Level : raid1
Array Size : 104791040 (99.94 GiB 107.31 GB)
Used Dev Size : 104791040 (99.94 GiB 107.31 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Thu May 8 10:32:10 2025
State : clean, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Consistency Policy : resync

Resync Status : 23% complete

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 5c05a39e:d68ba70f:606242fd:9e88d128
Events : 3

Number Major Minor RaidDevice State
0 252 16 0 active sync /dev/vdb
1 252 32 1 active sync /dev/vdc

更换故障硬盘

标记磁盘为故障:mdadm -f /dev/md0 /dev/vdb

移除故障磁盘:mdadm -r /dev/md0 /dev/vdb

添加新磁盘:mdadm -a /dev/md0 /dev/vdd

LVM逻辑卷管理器

物理卷PV:裸磁盘、分区

卷组VG:PV空间的集合,资源池

逻辑卷LV:从VG中划分的指定空间,直接存储数据

物理扩展单元PE:VG中的最小存储单元(默认1个PE大小为4M)

逻辑扩展单元LE:LV中的最小存储单元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pvcreate	 	创建PV
pvdisplay 查看PV
pvs 查看PV
vgs 查看VG
vgcreate 创建VG
-s 修改PE大小
lvcreate 创建LV
-l 指定PE数量
-n 指定名称
-L 指定LV大小
lvdisplay 查看LV
lvs 查看LV
lvresize -L 修改LV大小
resize2fs 修改ext4文件系统识别的大小
xfs_growfs 修改XFS文件系统的识别大小(只支持增大,不支持缩小)
e2fsck -f 强制进行文件系统检测(LV缩小前必做)

缩小LV的5步:取消挂载,文件系统检测,缩小文件系统,缩小LV,挂载

ZFS文件系统管理

zpool命令用来进行ZFS文件系统管理。

常用zpool命令

1
2
3
4
5
6
# 查看所有存储池
zpool list
# 查看名为rpool的zfs存储池的详细信息
zpool list -v rpool
# 查看名为rpool的zfs存储池状态
zpool status rpool

系统分区扩容

现状

PVE系统分区使用了ZFS镜像卷作为根分区,根分区大小为200G,现在需要将根分区扩容至500G。

扩容思路

  1. 确保硬盘中有足够的空间用于扩容
  2. 假设ZFS镜像卷由硬盘a分区3和硬盘b分区3组成,从ZFS镜像卷中移除硬盘b分区3
  3. 删除硬盘b分区3,重新创建500G大小的硬盘b分区3
  4. 将硬盘b分区3重新加入ZFS镜像卷,等待同步完成
  5. 对ZFS镜像卷中的硬盘a分区3重复2-4步
  6. 文件系统扩容

操作

查看所有存储池,确定ZFS存储池名称为rpool,然后查看rpool的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@pve:~# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
rpool 198G 37.8G 160G - - 1% 19% 1.00x ONLINE -
root@pve:~# zpool status rpool
pool: rpool
state: ONLINE
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme-eui.0025385791b2bd40-part3 ONLINE 0 0 0
nvme-eui.0000000000000000a428b701f2910082-part3 ONLINE 0 0 0

errors: No known data errors

可以确定镜像卷mirror-0由nvme-eui.0025385791b2bd40-part3nvme-eui.0000000000000000a428b701f2910082-part3两个分区组成,首先移除nvme-eui.0000000000000000a428b701f2910082-part3

1
2
3
4
5
6
7
8
9
10
11
root@pve:~# zpool detach rpool nvme-eui.0000000000000000a428b701f2910082-part3
root@pve:~# zpool status rpool
pool: rpool
state: ONLINE
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
nvme-eui.0025385791b2bd40-part3 ONLINE 0 0 0

errors: No known data errors

nvme-eui.0000000000000000a428b701f2910082-part3为分区ID,需要通过这个ID查到对应的硬盘文件。

1
2
root@pve:~# ls -l /dev/disk/by-id/ | grep nvme-eui.0000000000000000a428b701f2910082-part3
lrwxrwxrwx 1 root root 15 Dec 24 21:47 nvme-eui.0000000000000000a428b701f2910082-part3 -> ../../nvme0n1p3

可以确定该分区为nvme0n1硬盘的第3个分区,使用fdisk删除该分区,并重建一个500G的分区。

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
root@pve:~# fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 查看分区列表,避免操作错误,需要操作的分区为/dev/nvme0n1p3
Command (m for help): p
Disk /dev/nvme0n1: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: ZHITAI TiPlus5000 1TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3B382909-55C1-4536-8987-4B17033FF653

Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 419430400 417331201 199G Solaris /usr & Apple ZFS

# 删除分区3
Command (m for help): d
Partition number (1-3, default 3):

Partition 3 has been deleted.

Command (m for help): p
Disk /dev/nvme0n1: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: ZHITAI TiPlus5000 1TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3B382909-55C1-4536-8987-4B17033FF653

Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System

# 新建一个500G的分区
Command (m for help): n
Partition number (3-128, default 3):
First sector (2099200-2000409230, default 2099200):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-2000409230, default 2000408575): +500G

Created a new partition 3 of type 'Linux filesystem' and of size 500 GiB.

Command (m for help): p
Disk /dev/nvme0n1: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: ZHITAI TiPlus5000 1TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3B382909-55C1-4536-8987-4B17033FF653

Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 1050675199 1048576000 500G Linux filesystem

# 修改分区类型为 Solaris /usr & Apple ZFS,编号157
Command (m for help): t
Partition number (1-3, default 3):
Partition type or alias (type L to list all): 157

Changed type of partition 'Linux filesystem' to 'Solaris /usr & Apple ZFS'.

Command (m for help): p
Disk /dev/nvme0n1: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: ZHITAI TiPlus5000 1TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3B382909-55C1-4536-8987-4B17033FF653

Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 1050675199 1048576000 500G Solaris /usr & Apple ZFS

# 保存修改
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

将新建的nvme0n1p3添加到rpool,需要使用zpool attach命令(注意不是zpool add

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
# 确认分区ID
root@pve:~# ls -l /dev/disk/by-id/ | grep nvme0n1p3
lrwxrwxrwx 1 root root 15 Dec 24 21:55 nvme-eui.0000000000000000a428b701f2910082-part3 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root 15 Dec 24 21:55 nvme-ZHITAI_TiPlus5000_1TB_ZTA21T0KA2324400GC_1-part3 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root 15 Dec 24 21:55 nvme-ZHITAI_TiPlus5000_1TB_ZTA21T0KA2324400GC-part3 -> ../../nvme0n1p3

# 添加至rpool
root@pve:~# zpool attach rpool nvme-eui.0025385791b2bd40-part3 nvme-eui.0000000000000000a428b701f2910082-part3

# 检查添加的情况
root@pve:~# zpool status rpool
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Tue Dec 24 21:59:17 2024
37.8G / 37.8G scanned, 6.61G / 37.8G issued at 1.65G/s
6.66G resilvered, 17.52% done, 00:00:18 to go
remove: Removal of vdev 1 copied 1.41M in 0h0m, completed on Tue Dec 24 21:58:01 2024
936 memory used for removed device mappings
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme-eui.0025385791b2bd40-part3 ONLINE 0 0 0
nvme-eui.0000000000000000a428b701f2910082-part3 ONLINE 0 0 0 (resilvering)

errors: No known data errors

新添加的nvme-eui.0000000000000000a428b701f2910082-part3状态为resilvering,表示正在同步,等同步完成后使用同样的步骤操作nvme-eui.0025385791b2bd40-part3

两个分区完成扩容后可以使用zpool list命令看到EXPANDSZ显示了可以扩容的空间

1
2
3
root@pve:~# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
rpool 198G 37.8G 160G - 301G 1% 19% 1.00x ONLINE -

使用zpool online -e命令对rpool进行扩容

1
2
3
4
5
6
7
8
9
10
11
# rpool后接任意一个成员分区即可
root@pve:~# zpool online -e rpool nvme-eui.0000000000000000a428b701f2910082-part3

# 通过zpool list -v rpool命令查看rpool扩容成功
root@pve:~# zpool list -v rpool
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
rpool 499G 37.8G 461G - - 0% 7% 1.00x ONLINE -
mirror-0 499G 37.8G 461G - - 0% 7.56% - ONLINE
nvme-eui.0000000000000000a428b701f2910082-part3 500G - - - - - - - ONLINE
nvme-eui.0025385791b2bd40-part3 500G - - - - - - - ONLINE
indirect-1 - - - - - - - - ONLINE

在PVE前端确认扩容成功

image-20241224225705829

Linux磁盘管理
https://www.intx.work/posts/3eacf027.html
发布于
2016年7月8日
更新于
2025年6月3日
许可协议