Linux 使用 lvm 管理设备挂载分区
LVM(Logical Volume Manager),即逻辑卷管理,是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。
一般来说,物理磁盘或分区之间是分隔的,数据无法跨盘或分区,而各磁盘或分区的大小固定,重新调整比较麻烦。LVM可以将这些底层的物理磁盘或分区整合起来,抽象成容量资源池,以划分成逻辑卷的方式供上层使用,其最主要的功能即是可以在无需关机无需重新格式化(准确地说,原来的部分无需格式化,只格式化新增的部分)的情况下弹性调整逻辑卷的大小。
一、LVM优点
文件系统可以跨多个磁盘,因此大小不会受物理磁盘的限制。
可以在系统运行状态下动态地扩展文件系统大小。
可以增加新磁盘到 LVM 的存储池中。
可以以镜像的方式冗余重要数据到多个物理磁盘上。
可以很方便地导出整个卷组,并导入到另外一台机器上。
二、LVM 的限制
在从卷组中移除一个磁盘时必须使用 reducevg,否则会出问题。
当卷组中的一个磁盘损坏时,整个卷组都会受影响。
不能减小文件系统大小(受文件系统类型限制)。
因为加入了额外的操作,存储性能会受影响(使用 Stripe 的情况另当别论)。
三、LVM的基本组成
1. 物理卷 (PV,Physical Volume)
一个可供存储LVM的块设备. 如硬盘分区(MBR或GPT分区)、SAN 的硬盘、RAID 或 LUN,一个回环文件, 一个被内核映射的设备 (例如 dm-crypt),它包含一个特殊的LVM头,它是 LVM 构建的实际硬件或存储系统。
2. 卷组 (VG,Volume Group)
卷组是对一个或多个物理卷的集合,并在设备文件系统中显示为 /dev/VG_NAME。
3. 逻辑卷 (LV,Logical Volume)
逻辑卷是可供系统使用的最终元设备,它们在卷组中创建和管理,由物理块组成,实际上就是一个虚拟分区,并显示为 /dev/VG_NAME/LV_NAME,通常在其上可以创建文件系统。
4. 物理块 (PE,Physical Extends)
一个卷组中最小的连续区域(默认为4 MiB),多个物理块将被分配给一个逻辑卷。你可以把它看成物理卷的一部分,这部分可以被分配给一个逻辑卷。
四、创建LVM的过程
如果使用的是磁盘分区,则需先把磁盘分区格式化为lvm格式的分区,如果直接使用磁盘,则不需要格式化这一步
然后把磁盘分区或者磁盘,创建成PV(通过pvcreate、pvdisplay、pvscan、pvs等命令)
再把PV创建成VG(通过vgcreate、vgdisplay、vgscan、vgs等命令)
再把VG创建成LV(通过lvcreate、lvdisplay、lvscan、lvs等命令)

五、创建逻辑卷进行挂在分区
1. 初始化物理卷 (PV)
首先,将 /dev/sdb 初始化为物理卷:
[root@wulan6-a6 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 1.8T 0 part
├─centos-root 253:0 0 1.8T 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 9.1T 0 disk [root@wulan6-a6 ~]# sudo pvcreate /dev/sdb2. 创建卷组 (VG)
创建一个卷组,比如命名为 vg_data:
[root@wulan6-a6 ~]# sudo vgcreate vg_data /dev/sdb3. 创建逻辑卷 (LV)
根据你的需求,创建两个逻辑卷:
一个 2T 的逻辑卷挂载到
/data剩余空间挂载到
/var/lib/docker
# 创建 2T 的逻辑卷 (lv_data)
[root@wulan6-a6 ~]# sudo lvcreate -L 2T -n lv_data vg_data
# 使用剩余空间创建另一个逻辑卷 (lv_docker)
[root@wulan6-a6 ~]# sudo lvcreate -l 100%FREE -n lv_docker vg_data4. 格式化逻辑卷
格式化这两个逻辑卷(假设使用 ext4 文件系统):
[root@wulan6-a6 ~]# mkfs.ext4 /dev/vg_data/lv_data
[root@wulan6-a6 ~]# mkfs.ext4 /dev/vg_data/lv_docker5. 创建挂载点并挂载
创建挂载目录并挂载逻辑卷:
# 创建挂载目录
[root@wulan6-a6 ~]# sudo mkdir -p /data
[root@wulan6-a6 ~]# sudo mkdir -p /var/lib/docker
# 挂载逻辑卷
[root@wulan6-a6 ~]# sudo mount /dev/vg_data/lv_data /data
[root@wulan6-a6 ~]# sudo mount /dev/vg_data/lv_docker /var/lib/docker6. 配置开机自动挂载
编辑 /etc/fstab 文件,添加以下内容:
[root@wulan6-a6 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Aug 6 23:55:43 2025
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=58e7dfdc-85f2-4014-bf51-98a1701da006 /boot xfs defaults 0 0
UUID=AFED-F997 /boot/efi vfat umask=0077,shortname=winnt 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/vg_data/lv_data /data ext4 defaults 0 2
/dev/vg_data/lv_docker /var/lib/docker ext4 defaults 0 2然后运行 sudo mount -a 检查配置是否正确。
Tips:
每一行的最后两个数字(如 0 2)分别代表 dump 和 fsck 的配置选项,具体含义如下:
第 5 列:dump 备份标志(0 或 1)
0:表示该文件系统 不需要 被dump备份工具备份(大多数情况下默认是0)。1:表示该文件系统 需要 被dump备份(通常只用于重要的系统分区,如/或/home)。
(dump是一个传统的 Unix 备份工具,现在较少使用,一般保持0即可。)
第 6 列:fsck 检查顺序(0, 1, 2...)
0:表示该文件系统 不需要 在启动时用fsck检查(例如虚拟文件系统、swap 或网络挂载)。1:表示该文件系统 需要优先检查(通常只用于根分区/)。
(fsck会按数字顺序检查,1最先,2其次,依此类推。)2或更大:表示该文件系统 可以稍后检查(适用于普通数据分区,如/home、/data等)。
/dev/vg_data/lv_data /data ext4 defaults 0 2
/dev/vg_data/lv_docker /var/lib/docker ext4 defaults 0 20:这两个逻辑卷不需要用dump备份。2:系统会在启动时对它们执行fsck检查,但优先级低于根分区(/通常是1)。
7. 验证
检查挂载情况:
[root@wulan6-a6 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 126G 0 126G 0% /dev
tmpfs 126G 0 126G 0% /dev/shm
tmpfs 126G 12M 126G 1% /run
tmpfs 126G 0 126G 0% /sys/fs/cgroup
/dev/mapper/centos-root 1.8T 1.6G 1.8T 1% /
/dev/sda2 1014M 143M 872M 15% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
tmpfs 26G 0 26G 0% /run/user/0
tmpfs 26G 0 26G 0% /run/user/1000
/dev/mapper/vg_data-lv_data 2.0T 81M 1.9T 1% /data
/dev/mapper/vg_data-lv_docker 7.1T 89M 6.7T 1% /var/lib/docker
[root@wulan6-a6 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 1.8T 0 part
├─centos-root 253:0 0 1.8T 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 9.1T 0 disk
├─vg_data-lv_data 253:2 0 2T 0 lvm /data
└─vg_data-lv_docker 253:3 0 7.1T 0 lvm /var/lib/docker你应该能看到 /data 和 /var/lib/docker 分别挂载了 2T 和剩余空间。
六、扩容 vg 卷组
在日常工作中可能会遇到逻辑卷空间不足,所以需要扩容 vg 卷组来达到逻辑卷的扩容,以下示例就以 ubuntu 系统的跟分区逻辑卷扩容为例
1. 查看当前系统分区
发现总共 200G 大小,目前快要用完了,所以要对根分区进行扩容,并且根分区是由 vg-ubuntu 卷组挂载的
tianxiang@k8s-master1:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 392M 3.7M 388M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 195G 143G 43G 78% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 252M 1.6G 14% /boot
tmpfs 392M 4.0K 392M 1% /run/user/1001
tianxiang@k8s-master1:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 91.4M 1 loop /snap/lxd/36558
loop1 7:1 0 63.8M 1 loop /snap/core20/2669
loop3 7:3 0 91.4M 1 loop /snap/lxd/35819
loop4 7:4 0 50.8M 1 loop /snap/snapd/25202
loop5 7:5 0 50.9M 1 loop /snap/snapd/25577
loop6 7:6 0 63.8M 1 loop /snap/core20/2682
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 198G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 198G 0 lvm /
sr0 11:0 1 1024M 0 rom 2. 查看物理卷、卷组、逻辑卷
root@k8s-master1:~# pvdisplay
--- Physical volume ---
PV Name /dev/sda3
VG Name ubuntu-vg
PV Size <198.00 GiB / not usable 0
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 50687
Free PE 0
Allocated PE 50687
PV UUID 69yXI3-7wof-FZF3-sXHO-RnQm-OwAr-26xEdm
root@k8s-master1:~# vgdisplay
--- Volume group ---
VG Name ubuntu-vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size <198.00 GiB
PE Size 4.00 MiB
Total PE 50687
Alloc PE / Size 50687 / <198.00 GiB
Free PE / Size 0 / 0
VG UUID WFoIjG-LEaA-W8t7-NjNg-XjeJ-83Oh-AK3E7b
root@k8s-master1:~# lvdisplay
--- Logical volume ---
LV Path /dev/ubuntu-vg/ubuntu-lv
LV Name ubuntu-lv
VG Name ubuntu-vg
LV UUID NYKikD-4hpH-eXVN-AFi1-bwsN-SZYZ-YZCboA
LV Write Access read/write
LV Creation host, time ubuntu-server, 2025-06-16 12:52:48 +0800
LV Status available
# open 1
LV Size <198.00 GiB
Current LE 50687
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:03. 添加新磁盘
这里以虚拟机为例,添加完新磁盘后需要重新刷新 SCSI 总线来添加设备
# 对每个主机适配器进行重新扫描
root@k8s-master1:~# for host in /sys/class/scsi_host/host*/scan; do
echo "- - -" > $host
done
# 查看是否刷新出来
root@k8s-master1:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 91.4M 1 loop /snap/lxd/36558
loop1 7:1 0 63.8M 1 loop /snap/core20/2669
loop3 7:3 0 91.4M 1 loop /snap/lxd/35819
loop4 7:4 0 50.8M 1 loop /snap/snapd/25202
loop5 7:5 0 50.9M 1 loop /snap/snapd/25577
loop6 7:6 0 63.8M 1 loop /snap/core20/2682
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 198G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 198G 0 lvm /
sdb 8:16 0 500G 0 disk
sr0 11:0 1 1024M 0 rom4. 创建物理卷
root@k8s-master1:~# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
# 查看 sdb 已经添加进来
root@k8s-master1:~# pvdisplay
--- Physical volume ---
PV Name /dev/sda3
VG Name ubuntu-vg
PV Size <198.00 GiB / not usable 0
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 50687
Free PE 0
Allocated PE 50687
PV UUID 69yXI3-7wof-FZF3-sXHO-RnQm-OwAr-26xEdm
--- Physical volume ---
PV Name /dev/sdb
VG Name ubuntu-vg
PV Size 500.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 127999
Free PE 127999
Allocated PE 0
PV UUID QePN9O-3O9z-wAZm-gxgZ-0AGN-RqcW-Zu16s75. 扩容到卷组
root@k8s-master1:~# vgextend ubuntu-vg /dev/sdb
Volume group "ubuntu-vg" successfully extended
# 查看 VG 空间大小已经变为 697.99 GiB
root@k8s-master1:~# vgdisplay
--- Volume group ---
VG Name ubuntu-vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 697.99 GiB
PE Size 4.00 MiB
Total PE 178686
Alloc PE / Size 50687 / <198.00 GiB
Free PE / Size 127999 / <500.00 GiB
VG UUID WFoIjG-LEaA-W8t7-NjNg-XjeJ-83Oh-AK3E7b6. 扩展到逻辑卷
root@k8s-master1:~# lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from <198.00 GiB (50687 extents) to 697.99 GiB (178686 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
# 查看逻辑卷大小变为 697.99 GiB
root@k8s-master1:~# lvdisplay
--- Logical volume ---
LV Path /dev/ubuntu-vg/ubuntu-lv
LV Name ubuntu-lv
VG Name ubuntu-vg
LV UUID NYKikD-4hpH-eXVN-AFi1-bwsN-SZYZ-YZCboA
LV Write Access read/write
LV Creation host, time ubuntu-server, 2025-06-16 12:52:48 +0800
LV Status available
# open 1
LV Size 697.99 GiB
Current LE 178686
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:07. 调整文件系统
# 查看系统的文件类型是否是 ext4
root@k8s-master1:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-WFoIjGLEaAW8t7NjNgXjeJ83OhAK3E7bNYKikD4hpHeXVNAFi1bwsNSZYZYZCboA / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/f6ff739d-eced-47d4-937c-795e2522d164 /boot ext4 defaults 0 1
#//swap.img none swap sw 0 0
# 执行 resize2fs 命令整合
root@k8s-master1:~# resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 25, new_desc_blocks = 88
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 182974464 (4k) blocks long.# 或者如果是 xfs 则用如下命令:
# xfs_growfs /
8. 查看确认最终效果
root@k8s-master1:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 91.4M 1 loop /snap/lxd/36558
loop1 7:1 0 63.8M 1 loop /snap/core20/2669
loop3 7:3 0 91.4M 1 loop /snap/lxd/35819
loop4 7:4 0 50.8M 1 loop /snap/snapd/25202
loop5 7:5 0 50.9M 1 loop /snap/snapd/25577
loop6 7:6 0 63.8M 1 loop /snap/core20/2682
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 198G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 698G 0 lvm /
sdb 8:16 0 500G 0 disk
└─ubuntu--vg-ubuntu--lv 253:0 0 698G 0 lvm /
sr0 11:0 1 1024M 0 rom
root@k8s-master1:~# df -h | head -n 6
Filesystem Size Used Avail Use% Mounted on
tmpfs 392M 3.7M 388M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 687G 143G 515G 22% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 252M 1.6G 14% /boot