Linux磁盘管理

推荐链接:

菜鸟 Linux 磁盘管理

Linux磁盘管理—-分区格式化挂载fdisk、mkfs、mount

相关命令:

菜鸟 df 命令df (Unix) - 维基百科

菜鸟 du 命令du (Unix) - 维基百科

菜鸟 fdisk 命令

菜鸟 parted 命令GNU Parted - 维基百科

菜鸟 mkfs 命令

菜鸟 mount 命令mount (Unix) - 维基百科 —> 临时挂载

菜鸟 umount命令

菜鸟 fsck 命令fsck - 维基百科

菜鸟 lsblk 命令

菜鸟 partprobe 命令

菜鸟 resize2fs 命令

检测虚拟化环境中的执行情况

https://man7.org/linux/man-pages/man1/systemd-detect-virt.1.html

systemd-detect-virt 是一个轻量级的命令行工具,主要用于检测当前操作系统是否运行在虚拟化环境中,并能进一步区分具体的虚拟机(VM)或容器(Container)技术。

1
2
# none 表示是物理机
systemd-detect-virt || hostnamectl | grep Virtualization

磁盘健康

smartctl(硬件级健康检查⭐)

smartctlsmartmontools 软件包的一部分。它通过读取硬盘底层的 S.M.A.R.T.(自监测、分析和报告技术)数据来评估磁盘健康状况。这是最安全、最快捷的方法,因为它不会干扰正常读写。

硬盘内部的固件(Firmware)在日常使用中,会自动、实时地记录各种健康指标(如累计通电时间、温度、重新分配的扇区数等)。smartctl -a 的作用只是把硬盘已经记录好的这些历史数据、实时参数和错误日志直接读取并展示出来。smartctl -t 的作用是手动触发一次自检,生成最新的健康自检报告。

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# 显示硬盘SMART的全部信息。也可以只查看某一部分,如 smartctl -H /dev/sdb、smartctl -l selftest /dev/sdb
root@ubuntu20-04:~# smartctl -a /dev/sdb
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-31-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model: TOSHIBA MG08ADA400N
Serial Number: Z2J0A5FQFYPG
LU WWN Device Id: 5 000039 c38d1bf5a
Firmware Version: 4304
User Capacity: 4,000,787,030,016 bytes [4.00 TB]
Sector Size: 512 bytes logical/physical
Rotation Rate: 7200 rpm
Form Factor: 3.5 inches
Device is: Not in smartctl database 7.3/5528
ATA Version is: ACS-3 T13/2161-D revision 5
SATA Version is: SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Thu Jun 11 16:02:34 2026 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED # PASSED表示硬盘健康状态良好,如果为Failure那就要立刻更换硬盘。

General SMART Values:
Offline data collection status: (0x84) Offline data collection activity
was suspended by an interrupting command from host.
Auto Offline Data Collection: Enabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 120) seconds.
Offline data collection
capabilities: (0x5b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 424) minutes.
SCT capabilities: (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000b 100 100 050 Pre-fail Always - 0
2 Throughput_Performance 0x0005 100 100 050 Pre-fail Offline - 0
3 Spin_Up_Time 0x0027 100 100 001 Pre-fail Always - 8497
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 58
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0 # 重新分配扇区数
7 Seek_Error_Rate 0x000b 100 100 050 Pre-fail Always - 0
8 Seek_Time_Performance 0x0005 100 100 050 Pre-fail Offline - 0
9 Power_On_Hours 0x0032 051 051 000 Old_age Always - 19617
10 Spin_Retry_Count 0x0033 100 100 030 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 58
191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 15682
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 55
193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 245
194 Temperature_Celsius 0x0022 100 100 000 Old_age Always - 19 (Min/Max 13/49)
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 100 100 000 Old_age Always - 0 # 当前等待中扇区数
198 Offline_Uncorrectable 0x0030 100 100 000 Old_age Offline - 0 # 无法修正的扇区总数
199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0
220 Disk_Shift 0x0002 100 100 000 Old_age Always - 67764225
222 Loaded_Hours 0x0032 082 082 000 Old_age Always - 7595
223 Load_Retry_Count 0x0032 100 100 000 Old_age Always - 0
224 Load_Friction 0x0022 100 100 000 Old_age Always - 0
226 Load-in_Time 0x0026 100 100 000 Old_age Always - 512
240 Head_Flying_Hours 0x0001 100 100 001 Pre-fail Offline - 0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 20 -

SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

The above only provides legacy SMART information - try 'smartctl -x' for more


# 手动触发磁盘自检,主动扫描盘片、测试磁头、检查电路,强制产生一次最新的健康自检报告。后台运行。
# 短测试(约 2 分钟,检查基础电气性能)
smartctl -t short /dev/sdb
# 长测试(可能需要几小时,扫描整个磁盘表面)
#smartctl -t long /dev/sdb
# 查看测试结果
smartctl -l selftest /dev/sdb

badblocks(扇区级直接扫描)

https://man7.org/linux/man-pages/man8/badblocks.8.html

badblocks 是 Linux 下最经典的坏道检测工具,它会逐个扇区地读取(或写入)数据来验证扇区是否可用。

警告:使用读写模式或破坏性写入模式时,目标分区必须处于未挂载(unmounted)状态,否则会导致文件系统严重损坏!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用非破坏性只读模式测试。
# -s:显示扫描进度条。
# -v:显示详细输出(包括找到的坏道数量)。
# 补充:适用于已挂载的磁盘。
badblocks -s -v /dev/sdb
ionice -c 3 badblocks -s -v /dev/sdb # 在系统空闲时进行坏道检测(不抢占任何其他磁盘 I/O 资源)

# -n:使用非破坏性读写模式测试。
# 补充:需卸载磁盘。先读取原始数据并备份,写入测试数据校验,最后把原始数据写回。保留原有数据。速度比 -w 慢,且如果测试中途断电,可能会损坏数据。
badblocks -n -s -v /dev/sdb

# -w:使用破坏性写入模式测试。badblocks 会通过在设备的每个扇区写入特定模式(0xaa、0x55、0xff、0x00),然后读取每个扇区并比较其内容,从而扫描坏扇区。
# 补充:需卸载磁盘。测试最彻底,能强力激活硬盘的自动重映射(Remap)机制,修复逻辑坏块。抹除磁盘所有数据,仅适用于全新磁盘或准备废弃前的彻底测试。
badblocks -w -s -v /dev/sda

fsck(在文件系统层面扫描并标记)

https://man7.org/linux/man-pages/man8/fsck.8.html

https://man7.org/linux/man-pages/man8/e2fsck.8.html

一定要在卸载的分区上执行。

如果你不仅想“发现”坏道,还想让 Linux 操作系统“记住”这些坏道并在未来自动避开它们,你需要结合文件系统工具。fsck (或具体到 ext4 的 e2fsck) 可以在检查文件系统的同时调用 badblocks,并将坏道记录在文件系统的“坏块 inode”中。

fsck(File System Consistency Check)是一个前端工具。它本身并不真正检查文件系统,而是根据文件系统类型调用对应的检查程序。例如 fsck /dev/sda1,实际上会先识别文件系统类型 blkid /dev/sda1,如果是 ext4 则使用 e2fsck,如果是 XFS 则使用 xfs_repair,如果是 FAT 则使用 fsck.vfat。调用关系:

1
2
3
4
5
6
fsck
├── e2fsck (ext2/ext3/ext4)
├── fsck.xfs (xfs)
├── fsck.vfat (fat32)
├── ntfsfix (ntfs)
└── ...

查看支持的检查程序:ls /sbin/fsck.*,有些是 shell 脚步而非可执行的二进制文件。

fsck -n /dev/sda1 对于 ext4 场景通常能工作,但从严格意义上说,-n 不是 fsck 前端自身定义的标准选项,而是一个文件系统检查器(如 e2fsck)的选项。因为 fsck 不认识 -n,就把它透传给 e2fsck,执行过程实际上类似 e2fsck -n /dev/sda1

使用流程:

1
2
3
4
5
6
7
8
# 查看文件系统
lsblk -f
# 只检查
e2fsck -fn /dev/sda1
# 强制检查
e2fsck -f /dev/sda1
# 自动修复
e2fsck -fy /dev/sda1

查看文件/目录大小

https://man7.org/linux/man-pages/man1/du.1.html

https://man7.org/linux/man-pages/man1/ls.1.html

duls 查看文件大小的核心区别在于:ls 显示的是文件的“逻辑大小”(文件本身的内容大小),而 du 显示的是文件的“物理占用空间”(在磁盘上实际占据的块大小)。通常情况下,du 统计的数值会大于或等于 ls 的数值。

1
2
3
4
5
6
7
8
9
du -sh *                # 查看当前目录下每个文件和目录的大小。
du -sh /data # 查看指定目录大小。
du -sh /etc/profile # 查看指定文件大小。

ls # 显示 当前目录下的文件/目录。默认不会显示以 . 开头的隐藏文件。
ls * # 显示 当前目录下的文件 + 子目录下的文件。
ls -lh # 显示 当前目录下的文件/目录 的详细信息。-l 以长格式显示;-h 将文件大小从字节转换为人类易读的格式(如 KB、MB、GB)。
ls -lh /data # 显示 指定目录下的文件/目录 的详细信息。
ls -lh * # 显示 当前目录下的文件 + 子目录下的文件 的详细信息。

查看分区/磁盘信息

fdisk(底层硬件分区)

https://man7.org/linux/man-pages/man8/fdisk.8.html

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
root@ubuntu20-04:/# fdisk -l               # 列出指定设备的分区表
Disk /dev/nvme0n1: 3.49 TiB, 3840755982336 bytes, 7501476528 sectors
Disk model: INSPUR-NS8500G2U384
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/nvme2n1: 3.49 TiB, 3840755982336 bytes, 7501476528 sectors
Disk model: INSPUR-NS8500G2U384
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/nvme1n1: 3.49 TiB, 3840755982336 bytes, 7501476528 sectors
Disk model: INSPUR-NS8500G2U384
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/sda: 447.13 GiB, 480103981056 bytes, 937703088 sectors
Disk model: S32TTR-00T5W-ST
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: 446C3720-6E4A-4117-ACEF-8247D7BAF754

Device Start End Sectors Size Type
/dev/sda1 2048 2000895 1998848 976M EFI System
/dev/sda2 2000896 195311615 193310720 92.2G Microsoft basic data
/dev/sda3 195311616 937701375 742389760 354G Linux filesystem


Disk /dev/sdb: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdc: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdd: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sde: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdf: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdg: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdi: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdh: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdj: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdk: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdl: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/md0: 32.75 TiB, 36005862703104 bytes, 70323950592 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 4718592 bytes


Disk /dev/mapper/vg_raid-data_vol: 32 TiB, 35184372088832 bytes, 68719476736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 4718592 bytes

lsblk(中层块设备关系)

https://man7.org/linux/man-pages/man8/lsblk.8.html

磁盘扇区 sector - 维基百科

默认输出列:

列名 说明
NAME 块设备名称,树状结构中显示了从属关系(如 sda 是硬盘,sda1 是它的主分区)
MAJ:MIN 主设备号和次设备号,Linux 内核用来识别设备的内部编号
RM 是否为可移动设备(Removable)。1 表示是(如 U盘/光盘),0 表示否(如固定硬盘)
SIZE 设备的容量大小
RO 是否为只读设备。1 表示是,0 表示否
TYPE 设备类型,如 disk(整块磁盘)、part(分区)、loop(回环设备)、rom(光驱)
MOUNTPOINTS 设备当前被挂载到的文件系统目录

lsblk -a

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
lsblk -a # List Block Devices。-a:显示所有块设备(含空设备及循环块设备)。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 447.1G 0 disk
├─sda1 8:1 0 976M 0 part /boot/efi
├─sda2 8:2 0 92.2G 0 part /
└─sda3 8:3 0 354G 0 part /data
sdb 8:16 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdc 8:32 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdd 8:48 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sde 8:64 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdf 8:80 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdg 8:96 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdh 8:112 0 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdi 8:128 1 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdj 8:144 1 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdk 8:160 1 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
sdl 8:176 1 3.6T 0 disk
└─md0 9:0 0 32.7T 0 raid5
└─vg_raid-data_vol 252:0 0 32T 0 lvm /vg
nvme0n1 259:0 0 3.5T 0 disk
nvme1n1 259:1 0 3.5T 0 disk /ssd1
nvme2n1 259:2 0 3.5T 0 disk

lsblk -f

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
lsblk -f # 输出文件系统相关信息。包括 文件系统类型(FSTYPE)、UUID、文件系统可用空间(FSAVAIL)、文件系统使用率(FSUSE%)、挂载点。
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat FAT32 uefi-boot 0142-BD04 964.2M 1% /boot/efi
├─sda2 ext4 1.0 5c06c882-d3d3-481d-9d19-286736426d5b 83.9G 6% /
└─sda3 ext4 1.0 2a7004cb-b619-467f-8b42-ca52f022d809 339G 1% /data
sdb linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdc linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdd linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sde linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdf linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdg linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdh linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdi linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdj linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdk linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
sdl linux_raid_member 1.2 0 93b87809-ff5d-940d-2ab5-41c7506ab805
└─md0 LVM2_member LVM2 001 iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW
└─vg_raid-data_vol xfs 59701db4-e3e7-4b84-bef3-a80efc85d58d 7.6T 76% /vg
nvme0n1 LVM2_member LVM2 001 TcCCfB-evyD-4QMc-aOQr-PARe-9Kxr-49maJ5
nvme1n1 ext4 1.0 e66dda24-6c55-470c-aca1-2f6fb2a743e4 2.4T 25% /ssd1
nvme2n1 LVM2_member LVM2 001 isWK5b-cjKx-NkqL-9qED-Wn9L-vMnJ-nKntGv

lsblk -o

1
lsblk -o NAME,SIZE,TYPE,FSTYPE,UUID,FSAVAIL,FSUSE%,MOUNTPOINTS # 仅输出指定的列

lsblk -d

1
lsblk -d # 仅显示磁盘本身,不显示下属的分区

df(上层文件系统,限已挂载)

https://man7.org/linux/man-pages/man1/df.1.html

1
2
3
4
5
6
7
8
9
10
11
12
13
root@ubuntu20-04:/# df -hT                 # 查看系统中所有已挂载文件系统的磁盘使用情况。
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 vfat 975M 9.9M 965M 2% /boot/efi
/dev/sda2 ext4 90G 5.3G 84G 6% /
/dev/sda3 ext4 343G 3.8G 340G 2% /data
/dev/nvme1n1 ext4 3.5T 891G 2.4T 27% /ssd1
/dev/mapper/vg_raid-data_vol xfs 32T 25T 7.7T 77% /vg
root@ubuntu20-04:/# df -hT /data/ # 查看指定目录所属文件系统的磁盘使用情况。
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 343G 3.8G 340G 2% /data
root@ubuntu20-04:~# df -hT /dev/sda3 # 查看指定分区(文件系统)的磁盘使用情况。
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 343G 3.8G 340G 2% /data

测试磁盘性能

监控

1
2
3
4
5
6
7
8
9
10
11
12
# 监控系统的磁盘I/O活动情况和CPU使用情况。当有程序读取数据时,观察 SSD 的读取速度是否飙升,如果飙升说明缓存命中了。
# -d 只显示磁盘使用情况
# -m 以MB为单位显示数据,
# -x 显示扩展统计信息
# 每隔 2 秒刷新一次
iostat -dxm 2 # 磁盘维度

# 实时监控系统中各个进程的磁盘I/O活动。
# -o 只显示正在进行I/O操作的进程。
# -P 仅显示进程。通常,iotop 会显示进程和所有线程。
# -a 显示累积 I/O 量而非带宽。在此模式下,iotop 会显示自进程或 iotop 启动以来进程所执行的 I/O 总量。
iotop -oPa # 进程维度

dd 命令

https://www.runoob.com/linux/linux-comm-dd.html

https://man7.org/linux/man-pages/man1/dd.1.html

oflag=direct对数据使用直接I/O,即绕过操作系统的内核页缓存(Page Cache)。工作原理:在没有这个参数时,Linux 默认会把数据先写到内存的缓存区中,等系统有空时再慢慢刷入磁盘(即 Write-back 机制)。当加上 oflag=direct 时,程序在打开文件时会带上 O_DIRECT 标记,强迫数据绕过操作系统内存,直接从 dd 的应用层缓冲区发送给磁盘控制器。

conv=fdatasync在命令结束前,先将输出文件的数据(硬件级缓存)写入磁盘。工作原理:它是在 dd 传输完所有数据、准备退出前的最后一刻,调用一次系统的 fdatasync() 函数。它会告诉磁盘控制器:“不论你手里还攒了多少数据,现在立刻、马上全部拍进物理闪存颗粒(SSD)或磁盘盘片(HDD)里,写完了再报告命令结束。”

大文件顺序读写,常用于看影视剪辑、大文件拷贝性能:

1
2
3
4
# 测试大文件顺序写入速度。解析:从空设备读取数据,在当前目录生成 2GB 的 test_file.img 文件,直接写入磁盘。
dd if=/dev/zero of=./test_file.img bs=1G count=2 status=progress oflag=direct conv=fdatasync
# 测试大文件顺序读取速度。解析:直接读取刚刚生成的 2GB 文件并丢弃,评估读取速度。
dd if=./test_file.img of=/dev/null bs=1G count=2 status=progress iflag=direct

4K 小文件顺序读写,模拟系统运行、数据库读写:

1
2
3
4
# 测试 4K 小文件顺序写入速度。解析:生成 100MB 包含 25600 个 4K 块的文件
dd if=/dev/zero of=./test_file.img bs=4k count=25600 status=progress oflag=direct conv=fdatasync
# 测试 4K 小文件顺序读取速度。解析:直接读取刚刚生成的 100MB 文件并丢弃,评估读取速度。
dd if=./test_file.img of=/dev/null bs=4k count=25600 status=progress iflag=direct

4K 小文件随机读:

1
2
3
4
5
6
# 一次性生成所有随机块编号
block_list=($(shuf -i 0-25599 -n 25600))
# 循环测试 4K 小文件随机读取速度
time for skip_block in "${block_list[@]}"; do
dd if=./test_file.img of=/dev/null bs=4k count=1 skip=$skip_block iflag=direct status=none
done

fio 工具

FIO(Flexible I/O Tester)是 Linux 下最强大、最权威的磁盘性能压测工具。无论是传统的机械硬盘(HDD)、固态硬盘(SSD),还是高性能的 NVMe 和企业级存储阵列,FIO 都能通过极其灵活的参数配置,模拟出各种真实业务场景下的 I/O 负载。

核心参数解析:

name:测试任务的名称。

filename:测试数据的存放路径(目标文件/磁盘)。常见用法有三种:

  • 测试特定文件(最常用)-filename=/data/testfilefio 会在这个目录下生成一个名为 testfile 的文件进行测试,测完可以手动删掉。
  • 测试整块裸硬盘(高阶用法,会破坏数据!)-filename=/dev/sdb。这会直接压测整块物理硬盘,注意:这会彻底擦除该硬盘上的所有现有数据!
  • 测试整个目录:如果你不指定 -filename,而是使用另一个参数 -directory=/datafio 会自定在 /data 目录下生成随机命名的测试文件。

ioengine:负载驱动引擎。Linux 下压测异步并发性能,最常用的是 libaio,如果是较新的内核(5.1+),强烈推荐使用性能更高的 io_uring

direct:设为 1direct=1)表示绕过 Linux 系统的 Page Cache(内存缓存),直接读写磁盘,这样测出来的才是硬盘的真实物理性能

rw (或 readwrite):读写模式。

  • read (顺序读) / write (顺序写)
  • randread (随机读) / randwrite (随机写)
  • randrw (混合随机读写,配合 rwmixread=70 表示 70% 读 30% 写)

bs (Block Size):单次 I/O 的块大小。

  • IOPS(随机性能)通常用 4k8k
  • 带宽(顺序性能)通常用 1M4M

size:每个 job(线程/进程)读写的数据总量(例如 2G)。

numjobs:并发线程/进程数。

iodepth:队列深度。即同时下发多少个 I/O 请求给硬盘。测试 NVMe SSD 的极限性能时,通常设为 3264128

runtime:限制测试的最长运行时间(例如 60 秒)。配合 time_based 参数使用,表示即使 size 跑完了,只要时间没到就继续循环跑。

time_based:按时间来决定测试什么时候结束,而不是看文件有没有读写完。是控制测试持续时间的核心开关。必须-runtime 搭配使用才有意义。

group_reporting:汇总报告。如果开了多个任务(numjobs > 1),该参数会将它们的结果聚合成一个总报告输出。

1
2
3
4
5
6
7
8
9
10
11
# 测试 4K 随机写
fio -name=randwrite -filename=./test_file.img -ioengine=libaio -direct=1 -rw=randwrite -bs=4k -size=2G -numjobs=4 -iodepth=32 -runtime=30 -time_based -group_reporting
# 测试 4K 随机读
fio -name=randread -filename=./test_file.img -ioengine=libaio -direct=1 -rw=randread -bs=4k -size=2G -numjobs=4 -iodepth=32 -runtime=30 -time_based -group_reporting
# 测试 1M 顺序读
fio -name=seqread -filename=./test_file.img -ioengine=libaio -direct=1 -rw=read -bs=1m -size=2G -numjobs=4 -iodepth=32 -runtime=30 -time_based -group_reporting

# 测试 4k 混合负载 (70% 读,30% 写)
fio -name=mixed-load -filename=./test_file.img -ioengine=libaio -direct=1 -rw=randrw -rwmixread=70 -bs=4k -size=2G -numjobs=4 -iodepth=32 -runtime=30 -time_based -group_reporting
# 测试 1m 混合负载 (70% 读,30% 写)
fio -name=mixed-load -filename=./test_file.img -ioengine=libaio -direct=1 -rw=randrw -rwmixread=70 -bs=1m -size=2G -numjobs=4 -iodepth=32 -runtime=30 -time_based -group_reporting

先总结

新增磁盘操作流程:

  • 物理硬盘 -> 磁盘分区 -> LVM管理(PV-VG-LV) -> 格式化文件系统 -> 挂载使用
  • 物理硬盘 -> LVM管理 (PV-VG-LV) -> 格式化文件系统 -> 挂载使用 每个盘都不分区,直接给LVM
  • 物理硬盘 -> RAID阵列 -> LVM管理(PV-VG-LV) -> 格式化文件系统 -> 挂载使用 多块盘先组成 RAID 阵列 /dev/md0,再给LVM

磁盘分区管理

查看磁盘分区

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
root@ubuntu20-04:~# fdisk -l /dev/sda # 查看指定磁盘分区
root@ubuntu20-04:~# fdisk -l # 列出系统检测到的所有磁盘及其分区表。常用场景:查看磁盘大小、分区类型、扇区信息,通常用于分区或格式化前。
Disk /dev/nvme0n1: 3.49 TiB, 3840755982336 bytes, 7501476528 sectors
Disk model: INSPUR-NS8500G2U384
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/nvme1n1: 3.49 TiB, 3840755982336 bytes, 7501476528 sectors
Disk model: INSPUR-NS8500G2U384
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/nvme2n1: 3.49 TiB, 3840755982336 bytes, 7501476528 sectors
Disk model: INSPUR-NS8500G2U384
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/sda: 447.13 GiB, 480103981056 bytes, 937703088 sectors
Disk model: S32TTR-00T5W-ST
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: 446C3720-6E4A-4117-ACEF-8247D7BAF754

Device Start End Sectors Size Type
/dev/sda1 2048 2000895 1998848 976M EFI System
/dev/sda2 2000896 195311615 193310720 92.2G Microsoft basic data
/dev/sda3 195311616 937701375 742389760 354G Linux filesystem


Disk /dev/sdb: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdc: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdd: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sde: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdf: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdg: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdi: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdh: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdj: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdk: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/sdl: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: TOSHIBA MG08ADA4
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/md0: 32.75 TiB, 36005862703104 bytes, 70323950592 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 4718592 bytes


Disk /dev/mapper/vg_raid-data_vol: 32 TiB, 35184372088832 bytes, 68719476736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 4718592 bytes

创建磁盘分区

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
root@ubuntu20-04:~# fdisk /dev/sda # 对磁盘进行分区操作(会进入交互界面,按提示一步步操作)。

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

GPT PMBR size mismatch (41943039 != 419430399) will be corrected by write.

Command (m for help): m # 输出Help信息

Help:

GPT
M enter protective/hybrid MBR

Generic
d delete a partition # 删除分区
F list free unpartitioned space
l list known partition types
n add a new partition # 新建分区
p print the partition table # 打印分区表
t change a partition type # 修改分区类型
v verify the partition table
i print information about a partition

Misc
m print this menu # 输出Help信息
x extra functionality (experts only)

Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file

Save & Exit
w write table to disk and exit # 保存并退出
q quit without saving changes # 退出不保存

Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table


Command (m for help): n # 新建分区
Partition number (4-128, default 4): 4 # 分区号,即后来的sda4
First sector (41940992-419430366, default 41940992): # 开始扇区,分区起始位置。enter默认为下一个扇区
Last sector, +/-sectors or +/-size{K,M,G,T,P} (41940992-419430366, default 419430366): +100G # 结束扇区,分区结束位置。enter默认为最后一个扇区

Created a new partition 4 of type 'Linux filesystem' and of size 100 GiB.

Command (m for help): p # 打印分区表
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: VMware Virtual S
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: 9732D11F-D526-4419-8BCA-35D48F77AACE

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux swap
/dev/sda3 4198400 41940991 37742592 18G Linux filesystem
/dev/sda4 41940992 251656191 209715200 100G Linux filesystem

Command (m for help): t # 修改分区类型
Partition number (1-4, default 4): 4 # 要改变的分区号
Partition type (type L to list all types): L # 输出所有类型
1 EFI System C12A7328-F81F-11D2-BA4B-00A0C93EC93B
2 MBR partition scheme 024DEE41-33E7-11D3-9D69-0008C781F39F
3 Intel Fast Flash D3BFE2DE-3DAF-11DF-BA40-E3A556D89593
4 BIOS boot 21686148-6449-6E6F-744E-656564454649
5 Sony boot partition F4019732-066E-4E12-8273-346C5641494F
6 Lenovo boot partition BFBFAFE7-A34F-448A-9A5B-6213EB736C22
7 PowerPC PReP boot 9E1A2D38-C612-4316-AA26-8B49521E5A8B
8 ONIE boot 7412F7D5-A156-4B13-81DC-867174929325
9 ONIE config D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149
10 Microsoft reserved E3C9E316-0B5C-4DB8-817D-F92DF00215AE
11 Microsoft basic data EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
12 Microsoft LDM metadata 5808C8AA-7E8F-42E0-85D2-E1E90434CFB3
13 Microsoft LDM data AF9B60A0-1431-4F62-BC68-3311714A69AD
14 Windows recovery environment DE94BBA4-06D1-4D40-A16A-BFD50179D6AC
15 IBM General Parallel Fs 37AFFC90-EF7D-4E96-91C3-2D7AE055B174
16 Microsoft Storage Spaces E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D
17 HP-UX data 75894C1E-3AEB-11D3-B7C1-7B03A0000000
18 HP-UX service E2A1E728-32E3-11D6-A682-7B03A0000000
19 Linux swap 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
20 Linux filesystem 0FC63DAF-8483-4772-8E79-3D69D8477DE4
21 Linux server data 3B8F8425-20E0-4F3B-907F-1A25A76F98E8
22 Linux root (x86) 44479540-F297-41B2-9AF7-D131D5F0458A
23 Linux root (ARM) 69DAD710-2CE4-4E3C-B16C-21A1D49ABED3
24 Linux root (x86-64) 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
25 Linux root (ARM-64) B921B045-1DF0-41C3-AF44-4C6F280D3FAE
26 Linux root (IA-64) 993D8D3D-F80E-4225-855A-9DAF8ED7EA97
27 Linux reserved 8DA63339-0007-60C0-C436-083AC8230908
28 Linux home 933AC7E1-2EB4-4F13-B844-0E14E2AEF915
29 Linux RAID A19D880F-05FC-4D3B-A006-743F0F84911E
30 Linux extended boot BC13C2FF-59E6-4262-A352-B275FD6F7172
31 Linux LVM E6D6D379-F507-44C2-A23C-238F2A3DF928
32 FreeBSD data 516E7CB4-6ECF-11D6-8FF8-00022D09712B
33 FreeBSD boot 83BD6B9D-7F41-11DC-BE0B-001560B84F0F
34 FreeBSD swap 516E7CB5-6ECF-11D6-8FF8-00022D09712B
35 FreeBSD UFS 516E7CB6-6ECF-11D6-8FF8-00022D09712B
36 FreeBSD ZFS 516E7CBA-6ECF-11D6-8FF8-00022D09712B
37 FreeBSD Vinum 516E7CB8-6ECF-11D6-8FF8-00022D09712B

Partition type (type L to list all types): 20 # 20对应"Linux filesystem"类型

Changed type of partition 'Linux filesystem' to 'Linux filesystem'.

Command (m for help): w # 保存并退出
The partition table has been altered. # 分区表已更改
Syncing disks. # 正在同步磁盘

root@ubuntu20-04:~# fdisk -l /dev/sda # 查看磁盘分区
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: VMware Virtual S
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: 9732D11F-D526-4419-8BCA-35D48F77AACE

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux swap
/dev/sda3 4198400 41940991 37742592 18G Linux filesystem
/dev/sda4 41940992 251656191 209715200 100G Linux filesystem

重复上面的操作,使用剩余的磁盘创建分区 /dev/sda5

磁盘分区后,可以直接格式化为 ext4 格式,然后挂载使用。

删除分区

见 创建磁盘分区。

更改分区类型

见 创建磁盘分区。

RAID(磁盘不用分区)

介绍

RAID - 维基百科

独立磁盘冗余阵列RAID, Redundant Array of Independent Disks),简称磁盘阵列。它是一种存储虚拟化技术,通过将多个独立的硬盘驱动器组合成一个或多个逻辑单元(/dev/md0/dev/md1,、/dev/md2),以实现数据冗余、性能提升或两者的结合。

在 Linux 系统中,/dev/md0 通常代表一个由 [mdadm] 工具创建的软 RAID(Software RAID)设备的第一个设备文件。

  • md:代表 Multiple Devices(多设备),即 Linux 下的软 RAID 技术。
  • 0:代表这是第 0 个(第一个)创建的 RAID 阵列。如果创建更多,会依次命名为 /dev/md1, /dev/md2 等。
  • md0 是将多个独立的硬盘分区(Partition)或物理硬盘(Physical Disk)组合成一个逻辑上的虚拟硬盘来使用。

常见 RAID 级别

RAID 级别 最少磁盘 容错能力 空间利用率 特点与应用场景
RAID 0 2 100% 性能最强,数据条带化存储。一块盘坏则数据全丢。适用于临时缓存。
RAID 1 2 允许坏 1 块 50% 安全性高,互为镜像。写性能略低,读性能好。适用于系统盘、重要数据。
RAID 5 3 允许坏 1 块 imgimgimgimgimg 性价比均衡,带奇偶校验。写速度受校验计算影响较慢。适用于文件服务器。
RAID 6 4 允许坏 2 块 imgimgimgimgimg 双重奇偶校验,安全性高于 RAID 5。适用于大规模数据存储。
RAID 10 4 允许每组坏 1 块 50% RAID 1+0 的组合,兼顾速度与冗余。性能好但成本高。适用于数据库。

mdadm 工具

在 Linux 中,通常使用 mdadm 工具来管理软件 RAID。以下是核心操作流程:

创建 RAID 5 示例

假设使用 /dev/sdb, /dev/sdc, /dev/sdd, /dev/sde, /dev/sdf, /dev/sdg, /dev/sdh, /dev/sdi, /dev/sdj, /dev/sdk, /dev/sdl 11块磁盘:

1
2
3
4
# --level=5:指定 RAID 级别(此处以 RAID 6 为例)。
# --raid-devices=10 /dev/sd[b-k]:指定 10 块硬盘作为活动盘(b, c, d, e, f, g, h, i, j, k)。
# --spare-devices=1 /dev/sdl:明确指定 1 块硬盘作为热备盘(l),当活动盘损坏时自动顶替。
mdadm --create /dev/md0 --level=5 --raid-devices=10 /dev/sd[b-k] --spare-devices=1 /dev/sdl

查看状态

使用 cat /proc/mdstatmdadm --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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
root@ubuntu20-04:~# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10]
md0 : active raid5 sdg[5] sdl[10](S) sdd[2] sdh[6] sde[3] sdi[7] sdk[11] sdb[0] sdc[1] sdj[8] sdf[4]
35161975296 blocks super 1.2 level 5, 512k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
bitmap: 11/30 pages [44KB], 65536KB chunk

unused devices: <none>

root@ubuntu20-04:~# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Dec 19 20:21:39 2025
Raid Level : raid5
Array Size : 35161975296 (32.75 TiB 36.01 TB)
Used Dev Size : 3906886144 (3.64 TiB 4.00 TB)
Raid Devices : 10
Total Devices : 11
Persistence : Superblock is persistent

Intent Bitmap : Internal

Update Time : Mon May 25 15:43:48 2026
State : clean
Active Devices : 10
Working Devices : 11
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : bitmap

Name : 0
UUID : 93b87809:ff5d940d:2ab541c7:506ab805
Events : 37212

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
4 8 80 4 active sync /dev/sdf
5 8 96 5 active sync /dev/sdg
6 8 112 6 active sync /dev/sdh
7 8 128 7 active sync /dev/sdi
8 8 144 8 active sync /dev/sdj
11 8 160 9 active sync /dev/sdk

10 8 176 - spare /dev/sdl

格式化与挂载

阵列创建后被视为一个逻辑盘,需格式化后使用:

1
2
3
root@ubuntu20-04:~# mkfs.xfs /dev/md0
root@ubuntu20-04:~# mount /dev/md0 /vg
root@ubuntu20-04:~# lsblk -f

移除坏盘

1
2
3
4
# 先标记失效
mdadm /dev/md0 --fail /dev/sdb
# 再移除
mdadm /dev/md0 --remove /dev/sdb

运维建议

  • 硬件 vs 软件:服务器端推荐使用带缓存的硬件 RAID 卡以减轻 CPU 负担并提升写性能。
  • 监控:软 RAID 务必配置邮件报警,及时发现坏盘并更换,避免多盘连续损坏导致数据无法恢复。

查看已有 RAID 的创建方式?

1
2
3
4
5
6
7
8
9
# 检查 LVM 逻辑卷属性 Attr 的第 1 位(卷类型):r = LVM RAID 卷。
lvs -a

# 检查传统 RAID 阵列,通常指 mdadm 创建的阵列。如果输出中显示有 md0 或 md127 等设备,并且状态为 active raid5,说明系统中存在 mdadm 管理的阵列。
cat /proc/mdstat
mdadm --detail /dev/md0

# 检查硬件 RAID。如果上述命令没查到明显的阵列信息,但 lsblk 显示系统只有一块巨大的磁盘,那可能是硬件 RAID。
lspci | grep -i raid # 查看是否存在物理 RAID 控制器

LVM RAID传统 RAID 阵列 对比:

  • 性能:两者在数据读写性能上几乎没有区别,因为底层都是利用 Linux 内核的 MD 驱动。
  • 恢复(Rebuild):LVM RAID 的恢复过程通常与 LVM 的命令集成,查看状态也是通过 lvs 命令,而传统 RAID 需要通过 mdstatmdadm 查看。

总结:

  • 如果追求管理简单、灵活度高, LVM RAID 是更好的选择。
  • 如果需要将该 RAID 阵列用于非 LVM 场景(比如直接格式化挂载,或者给其他非 LVM 的工具使用),则传统 RAID (mdadm) 更合适。

LVM管理

推荐

使用 CLI 命令进行 LVM 管理 - RedHat官网 推荐

逻辑卷管理 LVM - 维基百科

逻辑卷管理器 LVM - 维基百科

逻辑磁盘管理工具 - 维基百科

介绍

LVM 是一种 抽象化存储 技术,是 Linux 内核提供的逻辑卷管理功能。它为电脑中的大量存储设备(Mass storage devices)提供更有弹性的硬盘分割方式。它在硬盘分区程序和操作系统之间创建一个逻辑层,以方便操作系统管理硬盘分割系统。

LVM 是卷的一种管理方式,并不是分区工具(也可不采用这种 LVM 管理方式)。

LVM 管理导图:

image-20200513134336969

image-20200513134430622

LVM扩容思维流程:

创建一个物理分区

将这个物理分区转换为物理卷

把这个物理卷添加到要扩展的卷组中

然后用extend命令扩展此卷组中的逻辑卷

LVM基本术语:

  • 物理存储介质(The physical media)是指系统的存储设备 硬盘,如:/dev/hda/dev/sda 等等,是存储系统最低层的存储单元。

  • PV:物理卷,PV处于LVM系统最低层,它可以是整个硬盘,或者与磁盘分区具有相同功能的设备(如RAID),但和基本的物理存储介质相比较,多了与LVM相关管理参数

  • VG:卷组,创建在PV之上,由一个或多个PV组成,可以在VG上创建一个或多个“LVM分区”(逻辑卷),功能类似非LVM系统的物理硬盘(物理存储介质)

  • LV:逻辑卷,从VG中分割出的一块空间,创建之后其大小可以伸缩,在LV上可以创建文件系统(如/var,/home)

  • PE:物理区域,每一个PV被划分为基本单元(也被称为PE),具有唯一编号的PE是可以被LVM寻址的最小存储单元,默认为4MB

查看是否使用LVM管理

1
2
3
pvdisplay #查看物理卷
vgdisplay #查看卷组
lvdisplay #查看逻辑卷

如果没有采用 LVM 管理,是查看不到物理卷、卷组、逻辑卷的。

物理卷 (Physical Volume, PV)

把 RAID 磁盘(/dev/md0)变成 LVM 的物理卷 (PV),以便LVM使用。

将物理磁盘分区初始化为物理卷,以便LVM使用。

pvcreate 命令pvdisplay 命令pvremove 命令 、 使用tab命令提示发现更多命令

初始化物理卷

1
2
lvmdiskscan                                     # 扫描可用作物理卷的块设备
pvcreate /dev/md0 /dev/nvme0n1 /dev/nvme2n1 # 将 块设备 (如 分区、RAID) 初始化为 LVM 物理卷。执行这个命令后,这三个设备就会被加入到 LVM 的管理体系中,为后续合并成一个大资源池(Volume Group)做准备。

显示物理卷

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
root@ubuntu20-04:~# pvs -a          # 以可配置的形式提供物理卷信息。
PV VG Fmt Attr PSize PFree
/dev/md0 vg_raid lvm2 a-- <32.75t <749.07g
/dev/nvme0n1 vg_raid lvm2 a-- 3.49t 496.98g
/dev/nvme1n1 --- 0 0
/dev/nvme2n1 vg_raid lvm2 a-- 3.49t 496.98g
/dev/sda1 --- 0 0
/dev/sda2 --- 0 0
/dev/sda3 --- 0 0

root@ubuntu20-04:~# pvscan # 扫描系统中所有支持的物理卷 LVM 块设备。
PV /dev/md0 VG vg_raid lvm2 [<32.75 TiB / <749.07 GiB free]
PV /dev/nvme0n1 VG vg_raid lvm2 [3.49 TiB / 496.98 GiB free]
PV /dev/nvme2n1 VG vg_raid lvm2 [3.49 TiB / 496.98 GiB free]
Total: 3 [39.73 TiB] / in use: 3 [39.73 TiB] / in no VG: 0 [0 ]

root@ubuntu20-04:~# pvdisplay # 为每个物理卷提供详细的多行输出。它以固定格式显示物理属性(大小、扩展、卷组等等)。
--- Physical volume ---
PV Name /dev/md0
VG Name vg_raid
PV Size <32.75 TiB / not usable 6.50 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 8584465
Free PE 191761
Allocated PE 8392704
PV UUID iQaOKJ-8Gth-pf6j-v3hD-KlTX-kklu-JnF5KW

--- Physical volume ---
PV Name /dev/nvme0n1
VG Name vg_raid
PV Size 3.49 TiB / not usable <2.34 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 915707
Free PE 127227
Allocated PE 788480
PV UUID TcCCfB-evyD-4QMc-aOQr-PARe-9Kxr-49maJ5

--- Physical volume ---
PV Name /dev/nvme2n1
VG Name vg_raid
PV Size 3.49 TiB / not usable <2.34 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 915707
Free PE 127227
Allocated PE 788480
PV UUID isWK5b-cjKx-NkqL-9qED-Wn9L-vMnJ-nKntGv

更改物理卷参数

1
2
3
4
# 防止在一个或多个物理卷的空闲空间上分配物理扩展
pvchange -x n /dev/md0
# 允许在一个或多个物理卷的空闲空间上分配物理扩展
pvchange -x y /dev/md0

重新调整物理卷大小

pvresize 命令是 Linux 系统中用于调整 LVM(逻辑卷管理)中物理卷(Physical Volume, PV)容量大小的工具。当底层磁盘或分区扩容后,使用 pvresize 可使 LVM 识别并使用新空间,而无需重启系统。

1
2
3
4
5
6
7
# -v:显示详细的调整过程。
pvresize -v /dev/md0
pvresize -v /dev/nvme0n1
pvresize -v /dev/nvme2n1

# 强制指定 PV 在 LVM 内部的可用大小,这通常用于人为限制 LVM 使用的分区空间,或者在准备缩小(Shrink)底层物理分区/虚拟机磁盘前做的前置瘦身操作。
pvresize --setphysicalvolumesize 40G /dev/sdz9

删除物理卷

如果您要删除的物理卷是卷组的一部分,则必须先将其从卷组中删除

1
2
# 删除未加入卷组的物理卷
pvremove /dev/sdz9

卷组 (Volume Group, VG)

创建卷组

1
2
3
# 从一个或多个物理卷创建卷组
vgcreate vg_raid /dev/md0 /dev/nvme0n1 /dev/nvme2n1
Volume group "vg_raid" successfully created

显示卷组

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
root@ubuntu20-04:~# vgs                # 以可配置的形式提供卷组信息,每个卷组显示一行。
VG #PV #LV #SN Attr VSize VFree
vg_raid 3 2 0 wz--n- 39.73t 1.70t

# 扫描系统中所有支持的磁盘设备查找 LVM 物理卷和卷组。这会在 /etc/lvm/cache/.cache 文件中构建 LVM 缓存文件,该文件维护了当前 LVM 设备的列表。
# LVM 在系统启动时自动启动 vgscan 命令,并在 LVM 操作过程中自动运行 vgscan 命令,比如当您执行 vgcreate 命令时,或者 LVM 检测到不一致时。
root@ubuntu20-04:~# vgscan # 扫描卷组的所有磁盘并重建 LVM 缓存文件,也会显示卷组。
Found volume group "vg_raid" using metadata type lvm2

root@ubuntu20-04:~# vgdisplay
root@ubuntu20-04:~# vgdisplay vg_raid # 以固定格式显示指定卷组属性(如大小、扩展、物理卷数目等等)。
--- Volume group ---
VG Name vg_raid
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 46
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size 39.73 TiB
PE Size 4.00 MiB
Total PE 10415879
Alloc PE / Size 9969664 / 38.03 TiB
Free PE / Size 446215 / 1.70 TiB
VG UUID mMCHWa-hHrD-JDZ1-cTmB-LkR7-Tq3J-Ga1VsG

向卷组中添加物理卷(扩展卷组)

假设卷组 vg_raid 满了需要扩大。手上的硬盘(sda)已经没有其他空闲分区,我们添加另外一个硬盘(sdb),把sdb的分区添加到卷组以扩展。

1
2
vgextend vg_raid /dev/sdz9   # 将一个或多个可用物理卷添加到已存在的卷组上
vgdisplay # 显示卷组,会看到卷组大小增大了。

从卷组中删除物理卷(缩减卷组)

在从卷组中删除物理卷前,您可以使用 pvdisplay 命令确定物理卷没有被任何逻辑卷使用。

如果物理卷仍在使用,则必须使用 pvmove 命令将数据迁移到另一个物理卷中。然后使用 vgreduce 命令删除物理卷。

1
2
# 从卷组中删除物理卷。
vgreduce vg_raid /dev/sdz9

更改卷组参数

1
2
3
4
5
6
# 停用卷组
vgchange -a n vg_raid
# 激活卷组
vgchange -a y vg_raid
# 将卷组 vg00 的最大逻辑卷数改为 128。
vgchange -l 128 vg_raid

删除卷组

1
2
# 删除不包含逻辑卷的卷组
vgremove vg_raid

分隔卷组

https://man7.org/linux/man-pages/man8/vgsplit.8.html

vgsplit 命令:将物理卷移动到新的或现有的卷组中

合并卷组

1
2
# 将名为 vg_data2 的卷组(Volume Group, VG)合并到名为 vg_data 的卷组中。
vgmerge -v vg_data2 vg_data

重命名卷组

1
2
3
# 以下命令等价,将现有卷组 vg001 重命名为 vg_data
vgrename /dev/vg001 /dev/vg_data
vgrename vg001 /dev/vg_data

逻辑卷 (Logical Volume, LV)

lvcreate 命令lvdisplay 命令lvremove 命令

lvresize 命令lvextend 命令lvreduce 命令

各种逻辑卷对比

逻辑卷类型 性能提升 容错能力(安全度) 磁盘空间利用率 核心定位
线性卷 无(单盘损坏影响全局) 100% 纯粹为了扩容
条带卷 极高 (并行读写) 100% 追求极致速度
镜像卷 读性能稍好,写较慢 良好(允许坏盘) 50% 或更低 传统冗余(已过时)
RAID 卷 视级别而定(如 RAID5/10 兼顾速度) 极佳(视级别容许坏1~2块盘) 50% ~ 80% 不等 现代标准化数据安全
缓存卷 显著提升(热数据加速) 取决于底层卷和缓存配置 介于两者之间 兼顾高容量与高速度

创建线性卷(可用)

线性卷是 LVM 的默认逻辑卷类型。它将一个或多个物理卷(PV)的空间按顺序首尾相连,组合成一个连续的虚拟大磁盘。

  • 数据写入机制:数据会先写满第一个物理卷,写满后再继续写入第二个物理卷(类似于堆叠)。
  • 核心优势
    • 极其灵活,支持在线无缝扩容。
    • 可以将大小不一、性能不同的物理磁盘组合在一起。
  • 缺点与风险:没有性能提升。若其中一块非冗余的物理磁盘损坏,可能会导致整个逻辑卷的数据损坏。
  • 适用场景:企业日常的文件服务器、普通数据存储、对读写性能和冗余没有特殊要求的常规场景。
1
2
3
4
# 在卷组中创建一个 10GB 的线性逻辑卷(默认单位为 MB)。使用默认名称 lvol#,其中 # 是逻辑卷的内部号,例如 /dev/vg_raid/lvol0,/dev/vg_raid/lvol1。
lvcreate -L 10240 vg_raid
# 在卷组中创建一个指定名称的 500G 线性逻辑卷。创建的块设备为 /dev/vg_raid/data_vol。
lvcreate -L 500G -n data_vol vg_raid

创建条带卷

条带卷相当于 RAID 0 模式。它将数据分成固定大小的块(条带),并行交错地写入到多个物理卷中。

  • 数据写入机制:向逻辑卷写入数据时,一部分写到 PV1,另一部分同时写到 PV2,实现多路并行读写。
  • 核心优势I/O 读写性能极高。读写速度随着参与条带化的磁盘数量呈倍数增长。
  • 缺点与风险零容错能力。任何一块物理磁盘损坏,整个条带卷的数据都将彻底丢失。
  • 适用场景:临时高并发计算、视频渲染缓存、不包含核心资产的数据库缓存等对性能要求极高但数据可再生的场景。

创镜像卷

这是 LVM 较早期的传统数据冗余方案(非 RAID1)。它在不同的物理卷上保存完全一致的数据副本,并依赖一个额外的日志(Log)来记录同步状态。

  • 数据写入机制:数据同时写入原卷和镜像卷,保持实时同步。
  • 核心优势:具备容错能力。即使一块盘挂掉,数据依然完整可用。
  • 缺点与风险架构较老,效率较低。需要额外占用空间来存储磁盘日志(Disk Log)以记录同步信息。由于其管理工具复杂且性能一般,在现代 Linux 系统中已逐渐被 LVM RAID 卷取代。
  • 适用场景:旧版本 Linux 系统的遗留环境维护。

创建 RAID 卷(可用)

这是现代 LVM 的推荐冗余方案。LVM 直接整合了 Linux 内核的 MD(Multiple Devices)内核驱动程序,使用户可以直接在 LVM 中创建 RAID 0, 1, 4, 5, 6, 10 等标准的阵列卷。

  • 数据写入机制:取决于具体的 RAID 级别。例如,LVM RAID1 是双向镜像(摒弃了传统镜像卷的落后日志机制),LVM RAID5 则是条带化加奇偶校验
  • 核心优势
    • 高可靠性与高性能结合:既有条带卷的并行速度,又有高水平的数据容错。
    • 完美集成:支持快照功能,且可以使用统一的 LVM 工具链(如 lvconvert)在线转换卷类型。
  • 缺点与风险:磁盘利用率低(如 RAID1 空间减半;RAID5 损耗一块盘的容量)。
  • 适用场景:生产环境中的核心数据库、核心业务系统、企业关键资产存储。

要创建 RAID 逻辑卷,请将 raid 类型指定为 lvcreate 命令的 --type 参数。

片段类型 描述
raid0/raid0_meta (Red Hat Enterprise Linux 7.3 及更高版本) 条带。RAID0 以条带大小的单位在多个数据子卷间分布逻辑卷数据。这可以提高性能。如果任何数据子卷失败,逻辑卷数据将会丢失。
raid1 当您指定 -m 但没有指定条带时,这是 lvcreate 命令的 --type 参数的默认值。
RAID 1 和镜像卷(Mirrored Volume)的核心概念相同,都是通过将数据实时同步写入两块(或多块)硬盘来提供最高级别的数据冗余。RAID 1 通常指硬件实现,镜像卷指操作系统软件实现;它们只需至少两块磁盘,数据安全性高,读取速度快,但容量利用率仅为 50% 。
raid4 RAID4 专用奇偶校验磁盘
raid5 raid5_ls相同
raid5_la RAID5 左非对称。轮转奇偶校验 0 并分配数据
raid5_ra RAID5 右非对称。轮转奇偶校验 N 并分配数据
raid5_ls RAID5 左对称。使用数据重启来轮换奇偶校验 0
raid5_rs RAID5 右对称。使用数据重启轮转奇偶校验 N
raid6 raid6_zr相同
raid6_zr RAID6 零重启数据重启时的旋转奇偶校验零(从左到右)
raid6_nr RAID6 N 重启数据重启时的旋转奇偶校验 N(从左到右)
raid6_nc RAID6 N 继续数据持续时的轮转奇偶校验 N(从左到右)
raid10 条带镜像。如果您指定了 -m 并指定大于 1 的条带数,则这是 lvcreate 命令的 --type 参数的默认值。镜像集合的条带

对于大多数用户,指定五个可用主类型之一 (raid1、raid4、raid 5raid6raid10) 应该足够了。

在 Linux LVM(逻辑卷管理器)中创建 RAID 逻辑卷时,LVM 会为每个数据子卷或奇偶校验子卷配对创建一个元数据子卷,所有的子卷合在一起才是一个完整的逻辑卷。

例1:创建一个双向 RAID1 阵列会创建 2 个数据子卷(lv_rimage_0lv_rimage_1)和 2 个元数据子卷(lv_rmeta_0lv_rmeta_1)。

1
2
3
4
# 在卷组中创建一个名为 lv_raid1 的阵列,RAID1 类型,1 个镜像副本,大小为 10GB。
# --type raid1 指定逻辑卷类型为 RAID1(镜像模式,数据同时写入主盘和镜像盘)。
# -m 1 (--mirrors 1) 创建 1 个镜像副本。加上原始数据本身,整个阵列一共有 2 份完全相同的数据,卷组中必须至少包含 2 块独立的物理卷 (PV)。
lvcreate --type raid1 -m 1 -L 10G -n lv_raid1 vg_data

例2:创建一个三条带 RAID5 阵列会创建 4 个数据子卷(lv_rimage_0,lv_rimage_1,lv_rimage_2, 和 lv_rimage_3)和 4 个元数据子卷(lv_rmeta_0,lv_rmeta_1,lv_rmeta_2, 和 lv_rmeta_3)。

1
2
3
4
# 在卷组中创建一个名为 lv_raid5 的阵列,RAID5 类型,3个数据条带(外加 1 个隐式校验盘,共 4 块硬盘),大小为 16TB,名称为 /dev/vg_data/lv_raid5。
# --type raid5 指定逻辑卷类型为 RAID5(支持 1 块磁盘损坏的数据冗余)。
# -i 3 指定条带数(Stripes)为 3。这意味着数据会同时写入 3 块 独立的物理卷。
lvcreate --type raid5 -i 3 -L 16T -n lv_raid5 vg_data

LVM 缓存卷

介绍

缓存卷是一种混合存储优化方案。它将一个快速设备(如 NVMe SSD)和一个慢速设备(如机械硬盘 HDD)组合,用快速设备作为慢速设备的缓存层。

  • 数据写入机制:频繁访问的“热数据”会被自动转移或保留在 SSD 缓存卷中,而“冷数据”则留在 HDD 机械硬盘上。
  • 核心优势
    • 性价比极高:用少量的 SSD 成本,让 TB 级甚至 PB 级的机械硬盘阵列获得接近 SSD 的响应速度。
    • 支持 Writethrough(直写,安全度高)和 Writeback(回写,速度极快)两种缓存模式。
  • 缺点与风险:配置相对复杂。在 Writeback 模式下,若 SSD 突然损坏且无冗余,可能会导致未同步的数据丢失。
  • 适用场景:大型文件服务器、高容量且有热点数据访问的虚拟机存储池、预算有限但需要提升系统响应速度的服务器。

缓存逻辑卷类型

LVM 缓存使用以下 LVM 逻辑卷类型。所有相关的逻辑卷都必须位于同一个卷组中

  • 源逻辑卷(原始卷):容量大、速度慢的逻辑卷。
  • 缓存池逻辑卷(缓存池卷):容量小、速度快的逻辑卷,由两个设备组成:缓存数据逻辑卷 和 缓存元数据逻辑卷。
    • 缓存数据逻辑卷(缓存数据卷):包含 缓存池逻辑卷 数据块 的 逻辑卷。
    • 缓存元数据逻辑卷(缓存元数据卷):包含 缓存池逻辑卷 元数据 的 逻辑卷,其中存储了指定数据块存储位置(例如,在源逻辑卷上还是在缓存数据逻辑卷上)的计费信息。
  • 缓存逻辑卷(缓存卷):包含源逻辑卷和缓存池逻辑卷的逻辑卷。这是最终形成的可用设备,它封装了各种缓存卷组件。

创建物理卷与卷组

创建一个卷组,其中包含一个速度较慢的物理卷和一个速度较快的物理卷。在此示例中,/dev/md0 是速度较慢的设备,/dev/nvme0n1、/dev/nvme2n1 是速度较快的设备,这两个设备都包含在卷组 vg_raid 中

1
2
pvcreate /dev/md0 /dev/nvme0n1 /dev/nvme2n1              # 初始化物理卷
vgcreate vg_raid /dev/md0 /dev/nvme0n1 /dev/nvme2n1 # 创建卷组

创建原始卷和缓存池卷(一键)

1
2
3
4
5
6
7
8
# 一键创建条带化缓存,显式指定条带数。不显式指定条带数时,如果传入多个 --cachedevice,LVM 的默认行为是采用最大并发分配,即条带数(-i)等同于你传入的独立物理盘(PV)数量。由于是 2 块 NVMe,它会自动以 -i 2 的跨盘条带化(RAID 0 逻辑)形式来规划底层的隐藏缓存卷。
# --name data_vol:指定新创建的逻辑卷名称为 data_vol。
# -i 2:代表数据跨 2 块盘条带化。
# -I 64k:条带颗粒度(可根据业务调整,默认 64k)。
# vg_raid:指定在名为 vg_raid 的现有卷组中创建该逻辑卷。
# /dev/md0:(限定物理卷) 强制 LVM 仅从分配给该卷组的 RAID 设备 /dev/md0 上提取空间。如果该卷组还包含其他硬盘(如 /dev/sdb),它们的空间不会被使用。
lvcreate --type cache -l 100%FREE --name data_vol --cachedevice /dev/nvme0n1 --cachedevice /dev/nvme2n1 -i 2 -I 64k \
--cachemode writethrough vg_raid /dev/md0

创建原始卷和缓存池卷(分步)

创建慢速的原始卷
1
2
3
# 在卷组 vg_raid 中,利用物理卷 /dev/md0 的空间,创建一个名为 data_vol 的慢速原始卷。
lvcreate -L 100G --name data_vol vg_raid /dev/md0
lvcreate -l 100%FREE --name data_vol vg_raid /dev/md0
创建高速缓存池卷

缓存池卷 = 缓存数据卷 + 缓存元数据卷

1
2
3
4
5
6
7
8
9
# 线性缓存池卷,LVM 默认会将这两个 NVMe 盘的空间拼接。
lvcreate --type cache-pool -L 10G --name cache_data vg_raid /dev/nvme0n1 /dev/nvme2n1 # 创建 10GB 的缓存池
lvcreate --type cache-pool -l 100%FREE --name cache_data vg_raid /dev/nvme0n1 /dev/nvme2n1 # 使用剩余全部空间创建

# 条带化缓存池卷,翻倍读写吞吐量。推荐!推荐!推荐!
# 在创建 RAID 5 时,默认的 Chunk Size(块大小)通常就是 512k 或 256k。缓存层(NVMe)的条带大小与存储层(RAID 5/6)的 Chunk Size 对齐或接近一致,可以极大地触发底层 RAID 的“满条带写入(Full-Stripe Writes)”,避免 RAID 5/6 致命的“读-改-写”性能惩罚,从而让数据在刷回机械硬盘时速度极快。
lvcreate --type cache-pool -l 100%FREE -i 2 -I 256k --name cache_data vg_raid /dev/nvme0n1 /dev/nvme2n1

# 显示逻辑卷,关注列 segtype

对于更复杂的配置,您可能需要分别创建 缓存数据卷缓存元数据卷,然后将这些卷合并为一个缓存卷推荐使用上述简单操作

1
2
3
4
5
6
7
8
# 创建 条带化的缓存数据卷(cdata)
lvcreate -L 100G -i 2 -I 256k --name cache_data_cdata vg_raid /dev/nvme0n1 /dev/nvme2n1

# 创建 普通的缓存元数据卷(cmeta)。根据 1/1000 原则,100G 缓存约需 100M 元数据。
lvcreate -L 100M --name cache_data_cmeta vg_raid /dev/nvme0n1 /dev/nvme2n1

# 将缓存数据 LV 和缓存元数据 LV 合并为 cache-pool LV,缓存模式默认为 writethrough。
lvconvert --type cache-pool --poolmetadata vg_raid/cache_data_cmeta vg_raid/cache_data_cdata
绑定前的逻辑卷属性
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
root@ubuntu20-04:/# watch -n 2 dmsetup status       # 查看 Device Mapper 设备当前运行状态。
vg_raid-data_vol: 0 68719476736 linear
root@ubuntu20-04:/# lvdisplay -m
--- Logical volume ---
LV Path /dev/vg_raid/data_vol
LV Name data_vol
VG Name vg_raid
LV UUID ecnMcD-gMEK-O3xp-zQRw-B4tA-O88R-GCJN0o
LV Write Access read/write
LV Creation host, time ubuntu20-04.zhaolq.com, 2025-12-19 20:32:39 +0800
LV Status available
# open 1
LV Size 32.00 TiB
Current LE 8388608
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 18432
Block device 252:0

--- Segments ---
Logical extents 0 to 8388607:
Type linear
Physical volume /dev/md0
Physical extents 0 to 8388607


--- Logical volume ---
LV Path /dev/vg_raid/cache_data
LV Name cache_data
VG Name vg_raid
LV UUID sXc8Y0-K060-ba1H-1yo4-ZEzl-dWyX-4xt4fU
LV Write Access read/write
LV Creation host, time ubuntu20-04.zhaolq.com, 2025-12-23 12:32:45 +0800
LV Pool metadata cache_data_cmeta
LV Pool data cache_data_cdata
LV Status NOT available
LV Size 6.00 TiB
Current LE 1572864
Segments 1
Allocation inherit
Read ahead sectors auto

--- Segments ---
Logical extents 0 to 1572863:
Type cache-pool
Chunk size 8.00 MiB
Metadata format 2
Mode writethrough
Policy smq
将缓存池卷绑定到原始卷
1
2
3
4
5
6
7
# 将 缓存池卷 cache_data 绑定到 原始卷 data_vol,从而启用缓存。
lvconvert --type cache --cachepool vg_raid/cache_data --cachemode writeback vg_raid/data_vol

# 分别将 缓存数据卷 cache_data_cdata 和 缓存元数据卷 cache_data_cmeta 绑定到 原始卷 data_vol,从而启用缓存。
#lvconvert --type cache --cachepool vg_raid/cache_data_cdata --poolmetadata vg_raid/cache_data_cmeta --cachemode writethrough vg_raid/data_vol

# 显示逻辑卷,关注列 Pool、Origin、Data%、Meta%、Cpy%Sync、CacheMode
绑定后的逻辑卷属性
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
root@ubuntu20-04:/# watch -n 2 dmsetup status       # 查看 Device Mapper 设备当前运行状态。
vg_raid-cache_data_cpool_cdata: 0 12884901888 striped 2 259:0 259:2 1 AA
vg_raid-cache_data_cpool_cmeta: 0 33554432 striped 2 259:0 259:2 1 AA
vg_raid-data_vol: 0 68719476736 cache 8 1839/4161600 16384 0/786432 0 0 0 0 0 0 0 3 metadata2 writeback no_discard_passdown 2 migration_threshold 131072 smq 0 rw -
vg_raid-data_vol_corig: 0 68719476736 linear
root@ubuntu20-04:/# lvdisplay -m
--- Logical volume ---
LV Path /dev/vg_raid/data_vol
LV Name data_vol
VG Name vg_raid
LV UUID ecnMcD-gMEK-O3xp-zQRw-B4tA-O88R-GCJN0o
LV Write Access read/write
LV Creation host, time ubuntu20-04.zhaolq.com, 2025-12-19 20:32:39 +0800
LV Cache pool name cache_data_cpool
LV Cache origin name data_vol_corig
LV Status available
# open 1
LV Size 32.00 TiB
Cache used blocks 0.03%
Cache metadata blocks 0.04%
Cache dirty blocks 0.00%
Cache read hits/misses 155 / 24
Cache wrt hits/misses 1383 / 507
Cache demotions 0
Cache promotions 205
Current LE 8388608
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 32768
Block device 252:0

--- Segments ---
Logical extents 0 to 8388607:
Type cache
Chunk size 8.00 MiB
Metadata format 2
Mode writeback
Policy smq
将缓存卷解绑
1
2
3
4
5
# 只解绑,保留缓存池(推荐)
lvconvert --splitcache vg_raid/data_vol

# 解绑,并彻底销毁/删除缓存池
#lvconvert --uncache vg_raid/data_vol

更改缓存模式

缓存模式 写入逻辑 性能表现 数据安全性 适用场景
writethrough (直写) 数据同时写入 SSD 缓存和底层 HDD 慢盘。 写入速度受慢盘限制,读取速度快。 极高。即使 SSD 损坏或意外掉电,数据也不会丢失。 默认模式。数据安全性要求高的场景。
writeback (回写) 数据先写入 SSD 缓存并立刻返回成功,随后异步刷入 HDD。 极高。读写性能都能达到 SSD 级别。 有风险。如果 SSD 损坏且数据未刷入 HDD,会导致数据丢失。 适合有企业级带电池硬件 RAID 保护的 SSD,或对丢失非关键数据不敏感的业务。
passthrough (穿透) 读写直接穿透到低速 HDD,不经过缓存。 低。 高。 临时维护、或者缓存盘满了需要紧急避让时使用。

从 writeback 切换到 writethrough 时,LVM 会自动将当前缓存盘中尚未同步的脏数据全部刷入慢速盘,新的写入数据或排队或实时变轨:

  • 新数据在切换完成前到达:被视为旧模式,先写入缓存,随后被一起刷入慢速盘。
  • 新数据在切换完成后到达:直接启用新模式,同时写入缓存和慢速盘。
  • 新数据在切换的临界点到达:内核会通过锁机制(Locking)让新 I/O 短暂排队(微秒级,表现为极轻微的延迟),等模式切换的原子指令完成后,再按照新模式写入。
1
2
3
lvchange --cachemode writethrough vg_raid/cache_data       # 切换为 writethrough(直写模式 - 追求数据安全,默认)
lvchange --cachemode writeback vg_raid/cache_data # 切换为 writeback(回写模式 - 追求极致性能)
lvchange --cachemode passthrough vg_raid/cache_data # 切换为 passthrough(穿透模式 - 临时绕过缓存)

调优缓存参数

1
2
3
4
5
6
7
8
# blockdev 工具允许用户通过命令行调用块设备 ioctl 操作。
blockdev --report
blockdev --getbsz /dev/md0

# 调整数据迁移的阈值。LVM 需要决定哪些数据该从慢盘搬到 SSD。这个值(单位通常是 block/块)决定了一次迁移的数据量大小。调整这个值通常是为了平衡 SSD 的负载和命中率。
lvchange --cachesettings "migration_threshold=16384"
# 仅在 writeback 模式下生效。告诉系统,当 SSD 里的“脏数据”(还没写回慢盘的数据)达到缓存总容量的 20% 时,就开始在后台悄悄把数据写回慢盘,防止 SSD 塞满。
lvchange --cachesettings "writeback_percent=20"

显示逻辑卷

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
root@ubuntu20-04:/# lvs -a                # 以可配置的形式提供逻辑卷信息,每行显示一个逻辑卷。-a 显示所有,包括隐藏卷。
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
[cache_data_cpool] vg_raid Cwi---C--- 6.00t 0.03 0.04 0.00
[cache_data_cpool_cdata] vg_raid Cwi-ao---- 6.00t
[cache_data_cpool_cmeta] vg_raid ewi-ao---- 16.00g
data_vol vg_raid Cwi-aoC--- 32.00t [cache_data_cpool] [data_vol_corig] 0.03 0.04 0.00
[data_vol_corig] vg_raid owi-aoC--- 32.00t
[lvol0_pmspare] vg_raid ewi------- 16.00g

root@ubuntu20-04:/# lvs -a -o lv_name,vg_name,attr,size,data_percent,metadata_percent,segtype,stripe_size,cache_mode,cache_policy,cache_settings,cache_dirty_blocks,devices
root@ubuntu20-04:/# lvs -a -o +segtype,stripe_size,cache_mode,cache_policy,cache_settings,cache_dirty_blocks,devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Type Stripe CacheMode CachePolicy CacheSettings CacheDirtyBlocks Devices
[cache_data_cpool] vg_raid Cwi---C--- 6.00t 0.03 0.04 0.00 cache-pool 0 writeback smq 0 cache_data_cpool_cdata(0)
[cache_data_cpool_cdata] vg_raid Cwi-ao---- 6.00t striped 256.00k /dev/nvme0n1(0),/dev/nvme2n1(0)
[cache_data_cpool_cmeta] vg_raid ewi-ao---- 16.00g striped 64.00k /dev/nvme0n1(786432),/dev/nvme2n1(786432)
data_vol vg_raid Cwi-aoC--- 32.00t [cache_data_cpool] [data_vol_corig] 0.03 0.04 0.00 cache 0 writeback smq 0 data_vol_corig(0)
[data_vol_corig] vg_raid owi-aoC--- 32.00t linear 0 /dev/md0(0)
[lvol0_pmspare] vg_raid ewi------- 16.00g linear 0 /dev/md0(8388608)

root@ubuntu20-04:/# lvscan -a # 扫描系统中所有逻辑卷并列出它们。
ACTIVE '/dev/vg_raid/data_vol' [32.00 TiB] inherit
inactive '/dev/vg_raid/cache_data_cpool' [6.00 TiB] inherit
ACTIVE '/dev/vg_raid/cache_data_cpool_cdata' [6.00 TiB] inherit
ACTIVE '/dev/vg_raid/cache_data_cpool_cmeta' [16.00 GiB] inherit
inactive '/dev/vg_raid/lvol0_pmspare' [16.00 GiB] inherit
ACTIVE '/dev/vg_raid/data_vol_corig' [32.00 TiB] inherit

# available 表示可用。
# NOT available 表示不可用,缓存已关闭。
root@ubuntu20-04:/# lvdisplay -a -m # 以固定格式展示属性(如大小、布局和映射)。-m 会显示底层的物理磁盘映射关系。
--- Logical volume ---
LV Path /dev/vg_raid/data_vol
LV Name data_vol
VG Name vg_raid
LV UUID ecnMcD-gMEK-O3xp-zQRw-B4tA-O88R-GCJN0o
LV Write Access read/write
LV Creation host, time ubuntu20-04.zhaolq.com, 2025-12-19 20:32:39 +0800
LV Cache pool name cache_data_cpool
LV Cache origin name data_vol_corig
LV Status available
# open 1
LV Size 32.00 TiB
Cache used blocks 0.03%
Cache metadata blocks 0.04%
Cache dirty blocks 0.00%
Cache read hits/misses 155 / 24
Cache wrt hits/misses 1383 / 507
Cache demotions 0
Cache promotions 205
Current LE 8388608
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 32768
Block device 252:0

--- Segments ---
Logical extents 0 to 8388607:
Type cache
Chunk size 8.00 MiB
Metadata format 2
Mode writeback
Policy smq

lvs 命令 Attr 字段含义

lvs 命令 输出中 lv_attr(逻辑卷属性) 列会显示一个 10个字符长度的字符串(例如 Cwi-aoC---Cwi---C---),每个字符位置代表的具体含义:

第 1 位:Volume type(逻辑卷类型)

代表该逻辑卷的基本类型。字母大小写有区分。

字母 英文含义 中文解释
C Cache 缓存卷
m mirrored 传统镜像卷
M Mirrored without initial sync 无初始同步的镜像卷
o origin 原始卷(被快照的源卷)
O Origin with merging snapshot 正在合并快照的原始卷
g integrity 完整性卷
r raid RAID 卷
R Raid without initial sync 无初始同步的 RAID 卷
s snapshot 快照卷
S merging Snapshot 正在合并的快照卷
p pvmove 正在进行数据迁移 (pvmove) 的卷
v virtual 虚拟卷
i / I image / out-of-sync image 镜像或 RAID 的子映像 / 未同步的子映像
l log device 镜像的日志设备
c under conversion 正在转换中的卷
V thin Volume 精简配置卷(Thin Volume)
t / T thin pool / thin pool data 精简池 / 精简池数据卷
d / D vdo pool / vdo pool data VDO池 / VDO池数据卷
e metadata / metadata spare RAID或池的元数据卷 / 备用元数据卷
第 2 位:Permissions(读写权限)

表示逻辑卷的访问权限。

  • w: Writeable(可读写)
  • r: Read-only(只读)
  • R: Read-only activation…(非只读卷,但被强制以“只读模式”激活)
第 3 位:Allocation policy(空间分配策略)

决定该卷在物理卷上分配空间的规则。注意:如果字母是大写,表示该卷当前被锁定(例如正在执行 pvmove),不允许更改分配策略。

  • a: anywhere(任意分配)
  • c: contiguous(连续分配)
  • i: inherited(继承父级策略)
  • l: cling(依附分配)
  • n: normal(正常/默认分配)
第 4 位:Fixed minor(固定次设备号)
  • m: fixed minor(该逻辑卷在内核中分配了固定的次设备号)
第 5 位:State(激活与运行状态)

表示逻辑卷当前的挂载和运行状态。

  • a: active(已激活,正常可用)
  • s: suspended(已挂起)
  • h: historical(历史记录,已删除但保留了记录)
  • I / S / m / M: 均代表快照出现问题(如无效快照、合并失败等)
  • d / i: 设备映射表存在异常
  • c / C: thin-pool 需要进行一致性检查
  • X: unknown(未知状态)
第 6 位:Device open(设备打开/占用状态)
  • o: open(设备当前处于打开状态,比如已被挂载格式化,或被某个进程占用)
  • X: unknown(未知)
第 7 位:Target type(内核目标类型)

对逻辑卷底层使用的 Linux 内核驱动类型进行分类。

  • C (Cache), m (mirror), r (raid), s (snapshot), t (thin), v (virtual), u (unknown)。
  • 补充说明:这里主要区分了新老驱动。例如:同样是镜像,用老驱动的显示为 m,用新 MD 驱动的显示为 r;同样是快照,老式快照显示为 s,精简配置(Thin)的快照显示为 t
第 8 位:Zeroing(块清零)
  • z: 新分配的数据块在使用前,会被自动用零(zeroes)覆盖,以保证安全。
第 9 位:Volume Health(卷健康状态)

这一位非常关键,它根据逻辑卷的不同类型,显示不同的健康隐患:

  • 所有类型通用
    • p (partial): 部分物理卷(PV)丢失,数据可能损坏。
    • X: 状态未知。
  • RAID 卷专用
    • r: 发生过写入错误,需要刷新或修复底层磁盘。
    • m: 阵列中存在数据不一致(mismatches),通常通过 scrubbing 检测出来。
    • w: 标记为“尽量少写(writemostly)”的驱动器。
    • s / R: 正在进行 RAID 重塑(改变条带大小或算法)/ 重塑后等待移除。
  • Thin Pool(精简池)专用
    • F (Failed): 严重失败,禁止一切 I/O。
    • D (Data space): 存储空间已耗尽(Out of Data space)。
    • M (Metadata read only): 遇到错误导致元数据变为只读,无法再分配新空间,但现有数据可读。
  • Thin Volume(精简卷)专用
    • F (Failed): 所在的精简池已崩溃,导致此卷也无法进行 I/O。
  • Writecache(写缓存)专用
    • E (Error): 缓存组件报错。
第 10 位:Skip activation(跳过激活)
  • k: 带有此标记的卷,在系统启动或执行 vgchange -a y 批量激活逻辑卷时,会被系统跳过不予激活。

lvs 命令 其他 字段含义

基础身份与容量字段
  • LV:逻辑卷(Logical Volume)的名称。
  • VG:该逻辑卷所属的卷组(Volume Group)名称。
  • LSize:逻辑卷的额定容量。
存储架构与关联字段
  • Pool:存储池名称。如果当前逻辑卷是一个“精简卷(Thin Volume)”或“缓存卷(Cache Volume)”,该字段会显示它所属的母池名称(即 Thin Pool 或 Cache Pool 的名字)。普通卷(Linear)此处显示为空。
  • Origin:基准卷/源卷。指代该卷的原始母卷。专门用于快照(Snapshot)或精简配置。如果是快照,它指向被快照的原始数据卷;如果是正在合并的快照,它代表合并的目标。
  • Type:逻辑卷段类型。底层的存储映射类型(Segment Type)。常见取值有 linear(线性配置)、striped(条带化)、mirror(传统镜像)、raid1/4/5/6/10(RAID阵列)、thin(精简卷)、thin-pool(精简池)、cache(缓存卷)等。
  • Stripe:条带块的大小。它会影响 IO 性能。
  • Devices:底层物理设备。列出该逻辑卷实际占用了哪些物理卷(PV,如 /dev/sda1)以及具体的物理扇区区间(PE 范围)。
空间监控与数据同步字段
  • Data% (Data Percent):针对 Thin Pool(精简池)或 Cache Pool,显示数据空间使用率。Cache 满载会迫使系统频繁刷盘,导致 I/O 穿透、性能暴跌;Thin Pool 如果达到 100%,会导致所有写入操作直接报错(ENOSPC),甚至引发文件系统损坏。
  • Metadata% (Metadata Percent):精简池或缓存卷内部用来记录“虚拟块与物理块映射关系”的元数据空间使用率。元数据一旦 100%,即使 Data% 还有空闲,系统也无法再建立新的映射。整个 Thin Pool 会瞬间死锁/挂起,其上的所有虚拟机或容器将全部卡死。
  • Cpy%Sync:复制/同步进度。在创建或修复 RAID、镜像(Mirror)卷,或者执行数据迁移时,显示数据同步的百分比进度100.00 表示同步完成,阵列处于健康(Clean)状态。如果长期卡在某个数字不动,说明底层可能有坏盘导致同步受阻。
动态转换与迁移字段
  • Move:数据迁移状态。当执行 pvmove 命令在线迁移物理盘数据时,该字段会显示正在迁移的源物理卷或迁移状态
  • Log:镜像日志卷。在传统的 mirror(镜像)模式下,用来记录哪些数据块已同步、哪些未同步的日志卷名称
  • Convert:转换状态。当使用 lvconvert 命令对逻辑卷进行类型转换时(例如将一个普通卷转换成 RAID 卷,或正在将快照合并回原卷),这里会显示转换过程中的临时状态或进度
缓存专用控制字段

当使用 LVM-Cache(用 SSD 为机械硬盘做加速)时,以下字段将被激活:

  • CacheMode:缓存模式。writethrough、writeback、passthrough。
  • CachePolicy:缓存算法策略。决定哪些“热点数据”应该留在 SSD 里的内核算法。常见有 smq(Stochastic Multi-queue,默认的高效算法)和 mq(Multi-queue)。
  • CacheSettings:缓存高级参数。显示或调整缓存策略的具体微调参数,例如 migration_threshold(数据迁移阈值,控制热点数据移入移出的速度)。
  • CacheDirtyBlocks:缓存脏数据块数量。在 writeback(回写)模式下,已写入 SSD 缓存但尚未同步到慢速机械盘的数据块数量。如果正在逐渐减少,说明系统正在疯狂地将断电残留的数据刷回慢盘。当该数值降为 0 时,说明断电前积压的数据已全部安全落盘。

更改逻辑卷组的参数

1
2
3
4
5
6
7
# 激活逻辑卷
lvchange -ay /dev/[卷组名]/[逻辑卷名]
# 停用逻辑卷
lvchange -an /dev/[卷组名]/[逻辑卷名]
lvchange -an vg_raid/cache_data # 在 writeback(回写) 模式下,直接停用或断开缓存池卷,会导致缓存中尚未刷入机械硬盘的“脏数据”(Dirty Data)丢失,进而造成文件系统损坏。
# 将卷组 vg_data 中逻辑卷 data_vol 的权限更改为只读。
lvchange -pr vg_data/data_vol

删除逻辑卷

要删除一个已停用的逻辑卷,请使用 lvremove 命令。如果该逻辑卷当前处于挂载状态,请在删除前先将其卸载。此外,在集群环境中,必须先停用逻辑卷,然后才能将其删除。

1
2
3
4
5
6
root@ubuntu20-04:/# umount /dev/[卷组名]/[逻辑卷名]

# 在删除逻辑卷之前,您可以使用 lvchange -an 命令将其显式停用,这样就不会出现询问是否要删除活动逻辑卷的提示。
root@ubuntu20-04:/# lvremove /dev/vg_data/data_vol
Do you really want to remove and DISCARD active logical volume vg_data/data_vol? [y/n]: y
Logical volume "data_vol" successfully removed

重命名逻辑卷

1
2
3
# 以下命令等价,将卷组 vg02 中的逻辑卷 lvold 重命名为 lvnew。
lvrename /dev/vg02/lvold /dev/vg02/lvnew
lvrename vg02 lvold lvnew

扩展逻辑卷

lvextend 只能放大,不能缩小。

lvreduce 只能缩小,不能放大。

lvresize 可以通过 +- 符号自由放大缩小,如果符号输入错误,则造成灾难!!!

日常运维金标准:扩容永远用 lvextend -r,缩容永远用 lvreduce -r

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
root@ubuntu20-04:/# umount /data                             # 卸除挂载的文件系统
root@ubuntu20-04:/# lvextend -r -l +100%FREE /dev/vg_data/data_vol # 将卷组所有剩余的空闲空间都扩展到逻辑卷
root@ubuntu20-04:/# lvextend -r -L +50G /dev/vg_data/data_vol # 将逻辑卷空间大小增加50G
root@ubuntu20-04:/# lvresize -r -L +50G /dev/vg_data/data_vol # 将逻辑卷空间大小增加50G
root@ubuntu20-04:/# lvresize -r -L 50G /dev/vg_data/data_vol # 将逻辑卷空间大小调整为50G
Size of logical volume vg_data/data_vol changed from 50.00 GiB (12800 extents) to 150.00 GiB (38400 extents).
Logical volume vg_data/data_vol successfully resized.
root@ubuntu20-04:/# lvdisplay
--- Logical volume ---
LV Path /dev/vg_data/data_vol
LV Name data_vol
VG Name vg_data
LV UUID hRQV0h-3gq5-x1GA-miaw-xk9s-IpRd-XX1Nxe
LV Write Access read/write
LV Creation host, time ubuntu20-04, 2020-05-12 08:45:51 +0000
LV Status available
# open 0
LV Size 150.00 GiB
Current LE 38400
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

root@ubuntu20-04:/# fsck -a /dev/vg_data/data_vol # 检查磁盘错误
root@ubuntu20-04:~# df -hT
root@ubuntu20-04:~# resize2fs /dev/vg_data/data_vol # 刷新分区
root@ubuntu20-04:~# df -hT

现在,这个逻辑卷可以再次挂载,同样这个方法也可用于其他分区。

缩减逻辑卷

注意减少逻辑卷的大小值若小于储存的数据大小,存储在后面的数据会丢失。

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
root@ubuntu20-04:/# umount /data                             # 卸除挂载的文件系统
root@ubuntu20-04:/# lvreduce -r -L -50G /dev/vg_data/data_vol # 将逻辑卷空间大小减少50G
root@ubuntu20-04:/# lvresize -r -L -50G /dev/vg_data/data_vol # 将逻辑卷空间大小减少50G
root@ubuntu20-04:/# lvresize -r -L 50G /dev/vg_data/data_vol # 将逻辑卷空间大小调整为50G
WARNING: Reducing active logical volume to 50.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_data/data_vol? [y/n]: y
Size of logical volume vg_data/data_vol changed from 150.00 GiB (38400 extents) to 50.00 GiB (12800 extents).
Logical volume vg_data/data_vol successfully resized.
root@ubuntu20-04:/# lvdisplay
--- Logical volume ---
LV Path /dev/vg_data/data_vol
LV Name data_vol
VG Name vg_data
LV UUID hRQV0h-3gq5-x1GA-miaw-xk9s-IpRd-XX1Nxe
LV Write Access read/write
LV Creation host, time ubuntu20-04, 2020-05-12 08:45:51 +0000
LV Status available
# open 0
LV Size 50.00 GiB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

root@ubuntu20-04:/# fsck -a /dev/vg_data/data_vol # 检查磁盘错误
root@ubuntu20-04:~# df -hT
root@ubuntu20-04:~# resize2fs /dev/vg_data/data_vol # 刷新分区
root@ubuntu20-04:~# df -hT

格式化块设备(磁盘/分区/RAID/逻辑卷)

1
2
mkfs -t ext4 /dev/sda4                   # 格式化分区,等价于 mkfs.ext4 /dev/sda4
mkfs.xfs -t ext4 /dev/vg_name/lv_name # 格式化逻辑卷

挂载(磁盘/分区/RAID/逻辑卷)

卸载

umount /dataumount /dev/vg_data/data_vol 的核心区别在于:一个是通过“挂载点(目录)”来卸载,另一个是通过“设备路径”来卸载,但如果 /dev/vg_data/data_vol 刚好挂载在 /data 上,这两条命令的效果是完全一样的。

命令 卸载依据 适用场景 优点
umount /data 挂载点(目录路径) 日常运维、只记得文件目录时 简单直观,符合人类阅读习惯
umount /dev/vg_data/data_vol 设备路径(LVM逻辑卷) 磁盘扩容/缩容、底层硬件维护时 精准定位设备,避免因多重挂载导致误操作

临时挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@ubuntu20-04:/# mkdir -p /data
root@ubuntu20-04:/# mount -t ext4 /dev/sda4 /data # 将分区 /dev/sda4 临时挂载到目录 /data,文件系统类型指定为 ext4。
root@ubuntu20-04:/# df -hT /data/
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda4 ext4 99G 53M 97G 1% /
root@ubuntu20-04:/# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 938M 0 938M 0% /dev
tmpfs tmpfs 196M 1.3M 195M 1% /run
/dev/sda3 ext4 18G 4.6G 13G 28% /
tmpfs tmpfs 980M 0 980M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 980M 0 980M 0% /sys/fs/cgroup
/dev/loop1 squashfs 28M 28M 0 100% /snap/snapd/7264
/dev/loop0 squashfs 55M 55M 0 100% /snap/core18/1705
/dev/loop2 squashfs 69M 69M 0 100% /snap/lxd/14804
tmpfs tmpfs 196M 0 196M 0% /run/user/0
/dev/loop3 squashfs 55M 55M 0 100% /snap/core18/1754
/dev/loop4 squashfs 70M 70M 0 100% /snap/lxd/14954
/dev/sda4 ext4 99G 53M 97G 1% /data

永久挂载

推荐: linux fstab 文件详解linux 误挂载磁盘,原数据被覆盖如何找回

永久挂载:/etc/fstab 是 Linux 系统里 控制开机自动挂载磁盘/分区/网络存储 的配置文件,定义每个文件系统的挂载点、文件系统类型、挂载选项,避免每次开机都要手动 mount

在进行一下操作前,先创建 /dev/sda4 分区,大小为 10G,格式化为 ext4。

1、准备目录,并查看所在分区和挂载点

1
2
3
4
5
6
root@ubuntu20-04:/# mkdir /data
root@ubuntu20-04:/# df -hT /data/
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 18G 4.6G 13G 28% /
# 可以看出,/data 目录本身没有独立挂载到其他分区,而是 / 目录下的一个普通文件夹。
# /dev/sda3 分区挂载到了根目录 /。其中,/ 叫做挂载点,/dev/sda3 叫做挂载设备。

2、查看所有分区和设备的UUID值和挂载点

1
2
3
4
5
6
7
8
9
10
11
12
13
root@ubuntu20-04:/# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
loop0 squashfs 0 100% /snap/core18/1705
loop1 squashfs 0 100% /snap/snapd/7264
loop2 squashfs 0 100% /snap/lxd/14804
loop3 squashfs 0 100% /snap/core18/1754
loop4 squashfs 0 100% /snap/lxd/14954
sda
├─sda1
├─sda2 swap 0f5010bc-bc78-4f32-a8b8-aeeed49db343 [SWAP]
├─sda3 ext4 a78143b8-b84a-440e-b330-346eae21aac4 12.2G 26% /
└─sda4 ext4 047a3fdd-f0b6-4a33-835b-3dc8d5e48cf8
sr0

3、编辑 /etc/fstab 文件

文件中每个列的详细描述请查看 fstab (简体中文) - ArchWiki

1
2
3
4
5
6
7
root@ubuntu20-04:/# vim /etc/fstab
# UUID 方式挂载磁盘
/dev/disk/by-uuid/047a3fdd-f0b6-4a33-835b-3dc8d5e48cf8 /data auto defaults,nofail,comment=cloudconfig 0 2
# 设备路径方式挂载磁盘
/dev/sda4 /data auto defaults,nofail,comment=cloudconfig 0 2

root@ubuntu20-04:/# mount -a # 装载fstab文件中所有文件系统,否则需要重启系统。

4、再次查看所在分区和挂载点,发现已经改变。

1
2
3
root@ubuntu20-04:/# df -hT /data/
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda4 ext4 9.8G 37M 9.3G 1% /data

根分区扩容

LVM 管理

1、查看挂载到根分区(/)的逻辑卷: df -hT /lsblk

2、查看逻辑卷所在卷组: lvdisplay

3、查看卷组剩余空间: vgdisplay 。若无剩余空间,扩容磁盘—>创建物理分区—>创建物理卷—>将物理卷扩展到卷组。

4、将卷组中的空闲空间扩展到根分区逻辑卷: lvextend

5、刷新根分区: resize2fs

非 LVM 管理

1、查看当前根分区大小

1
2
3
root@ubuntu20-04:~# df -hT /
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 18G 4.6G 13G 28% /

2、扩展磁盘容量,并查看扩容后磁盘大小

1
2
3
4
5
6
7
root@ubuntu20-04:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 18G 0 part /
sr0 11:0 1 1024M 0 rom

3、扩展分区

记住根分区起始位置和结束位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@ubuntu20-04:~# fdisk /dev/sda

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

GPT PMBR size mismatch (41943039 != 419430399) will be corrected by write.

Command (m for help): p

Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: VMware Virtual S
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: 9732D11F-D526-4419-8BCA-35D48F77AACE

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux swap
/dev/sda3 4198400 41940991 37742592 18G Linux filesystem

删除根分区,切记不要保存

1
2
3
4
Command (m for help): d
Partition number (1-3, default 3): 3

Partition 3 has been deleted.

创建分区,新分区和删除分区的开始扇区相同

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
Command (m for help): n
Partition number (3-128, default 3): 3
First sector (4198400-419430366, default 4198400):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4198400-419430366, default 419430366):

Created a new partition 3 of type 'Linux filesystem' and of size 198 GiB.
Partition #3 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: y

The signature will be removed by a write command.

Command (m for help): p
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: VMware Virtual S
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: 9732D11F-D526-4419-8BCA-35D48F77AACE

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux swap
/dev/sda3 4198400 419430366 415231967 198G Linux filesystem

Filesystem/RAID signature on partition 3 will be wiped.

保存退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Command (m for help): w
The partition table has been altered.
Syncing disks.

root@ubuntu20-04:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 938M 0 938M 0% /dev
tmpfs tmpfs 196M 1.3M 195M 1% /run
/dev/sda3 ext4 18G 4.6G 13G 28% / ############## 并未改变
tmpfs tmpfs 980M 0 980M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 980M 0 980M 0% /sys/fs/cgroup
/dev/loop1 squashfs 28M 28M 0 100% /snap/snapd/7264
/dev/loop2 squashfs 69M 69M 0 100% /snap/lxd/14804
/dev/loop0 squashfs 55M 55M 0 100% /snap/core18/1705
/dev/loop4 squashfs 55M 55M 0 100% /snap/core18/1754
/dev/loop3 squashfs 70M 70M 0 100% /snap/lxd/14954
tmpfs tmpfs 196M 0 196M 0% /run/user/0

重读分区表、刷新根分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@ubuntu20-04:~# partprobe /dev/sda # 重读分区表。当删除文件后,仍然占用空间,partprobe可以在不重启的情况下重读分区。
root@ubuntu20-04:~# resize2fs /dev/sda3 # 刷新分区
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda3 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 25
The filesystem on /dev/sda3 is now 51903995 (4k) blocks long.

root@ubuntu20-04:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 938M 0 938M 0% /dev
tmpfs tmpfs 196M 1.3M 195M 1% /run
/dev/sda3 ext4 195G 4.6G 183G 3% /
tmpfs tmpfs 980M 0 980M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 980M 0 980M 0% /sys/fs/cgroup
/dev/loop1 squashfs 28M 28M 0 100% /snap/snapd/7264
/dev/loop2 squashfs 69M 69M 0 100% /snap/lxd/14804
/dev/loop0 squashfs 55M 55M 0 100% /snap/core18/1705
/dev/loop4 squashfs 55M 55M 0 100% /snap/core18/1754
/dev/loop3 squashfs 70M 70M 0 100% /snap/lxd/14954
tmpfs tmpfs 196M 0 196M 0% /run/user/0