Linux LV逻辑卷的管理(建立、查看、调整大小和删除)
在 VG(Volume Group,卷组)创建完成后,需要在 VG 的基础上划分 LV(Logical Volume,逻辑卷)。
LV 也是可以动态扩容的,如果要增加 LV 空间(扩容),那么 LV 中的数据是不会丢失的,并且在扩容过程中 LV 不需要卸载;而如果要缩减 LV,就需要对 LV 中的现有数据进行备份,并且在 LV 空间缩减后,再次将备份数据恢复到缩减后的 LV 中。
因此,通常不建议缩减 LV。日常在使用 LVM 的过程中,对 LV 空间的划分会比预期保存的数据略大,如果随着时间推移数据量逐渐增加,那么在分区空间不足时,对 LV 进行扩容即可。
创建一个大小为 3GB、名为 mylv 的 LV,命令如下:
在 LV 创建成功后,系统中会出现一个名为 /dev/myvg/mylv 的设备文件,此文件的路径在设备文件目录下,由 VG 名和 LV 名组合而成。我们对 LV 的格式化、挂载、查看 LV 详细信息等操作都是对 /dev/myvg/mylv 文件执行的。
对 LV 进行格式化,命令如下:
实际上,大家可以查看 /dev/mapper/myvg-mylv 和 /dev/myvg/mylv 这两个文件,会发现两个文件都是符号链接(软链接)文件,它们都指向一个名为 dmN 的块设备文件(N为一个整数)。在实际操作过程中,大家可能会看到 /dev/dm - 0、/dev/dm - 1,或者 /dev/dm - 2,但无论看到哪一个,都会发现“/dev/VG名/LV名”和“/dev/mapper/VG名 - LV名”指向了相同的文件。
第二个命令 lvdisplay 可以查看 LV 的详细信息,命令如下:
我们可以使用 lvresize 命令调整 LV 的大小,lvresize 命令格式如下:
mylv 逻辑卷的大小为3GB,而 myvg 卷组的总大小为 40GB,还有 37GB 的空闲空间,因此将 mylv 逻辑卷的大小增加到 10GB,命令如下:
此命令也可写为 lvresize - L 10G /dev/myvg/mylv,差别在于是否有“+”。有“+”表示在原有基础上增加了空间大小,没有“+”表示将分区调整到指定的空间大小。
LV 的空间大小已经改变了,继续查看可用空间的变化,命令如下:
使用 df 命令查询后会发现,在查看 LV 详细信息时可用空间为 10GB,但是挂载信息中可用空间仍然是 3GB。
之所以出现 LV 空间和可用空间的差异,原因在于文件系统,/dev/myvg/mylv 原本空间为 3GB,在初次格式化时文件系统识别的空间大小也为 3GB,但是随后我们对 LV 空间进行了扩容,使其从 3GB 增加到了 10GB,总共增加了 7GB 的空间,而后续增加的 7GB 并没有被文件系统识别。
因此,在对 LV 进行扩容后,还需要让文件系统重新识别扩容后分区的空间。使用 xfs_growfs 命令可以让文件系统识别扩容后的 LV 空间。
注意,重新识别并不意味着整个 LV 重新格式化,重新识别的过程也不需要进行卸载:
接下来我们对 LV 空间进行缩减,如果想缩减 LV 空间,那么需要先将其卸载,还要经过重新格式化等操作。
因此,通常我们会说 LVM 可以动态扩容,但是缩减空间并不是动态完成的。接下来,我们将 10GB 的 LV 空间缩减至 5GB,命令如下:
删除 mylv 逻辑卷,记得在删除时要先卸载,命令如下:
需要注意的是,在删除 LV 后,LV 中原有的数据会被清空。
LV 也是可以动态扩容的,如果要增加 LV 空间(扩容),那么 LV 中的数据是不会丢失的,并且在扩容过程中 LV 不需要卸载;而如果要缩减 LV,就需要对 LV 中的现有数据进行备份,并且在 LV 空间缩减后,再次将备份数据恢复到缩减后的 LV 中。
因此,通常不建议缩减 LV。日常在使用 LVM 的过程中,对 LV 空间的划分会比预期保存的数据略大,如果随着时间推移数据量逐渐增加,那么在分区空间不足时,对 LV 进行扩容即可。
建立LV
我们现在已经拥有了近 40GB 的 myvg 卷组,接下来需要在卷组中创建 LV,命令如下:[root@localhost ~]# lvcreate<选项><-n LV名>VG名选项:
- -L 容量: 指定 LV 大小,单位为 MB、GB、TB 等;
- -l 个数: 按照 PE 个数指定 LV 大小,这个参数需要换算容量;
- -n LV 名: 指定 LV 名。
创建一个大小为 3GB、名为 mylv 的 LV,命令如下:
[root@localhost ~]# lvcreate myvg -n mylv -L 3G Logical volume "mylv" created. #在myvg卷组中创建名为mylv的LV,空间大小为3GB
在 LV 创建成功后,系统中会出现一个名为 /dev/myvg/mylv 的设备文件,此文件的路径在设备文件目录下,由 VG 名和 LV 名组合而成。我们对 LV 的格式化、挂载、查看 LV 详细信息等操作都是对 /dev/myvg/mylv 文件执行的。
对 LV 进行格式化,命令如下:
[root@localhost ~]# mkfs.xfs /dev/myvg/mylv #对LV进行格式化 [root@localhost ~]# mkdir /disk1/ #创建挂载点 [root@localhost ~]# mount /dev/myvg/mylv /disk1/ #挂载 [root@localhost ~]# mount | grep /disk1 /dev/mapper/myvg-mylv on /disk1 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) #查看挂载信息在对 LV 进行格式化挂载后会发现,设备文件名会自动变为“/dev/mapper/VG名-LV名”,无论使用 mount 命令还是使用 df 命令查询设备文件,其名称均为 /dev/mapper/myvg-mylv。
实际上,大家可以查看 /dev/mapper/myvg-mylv 和 /dev/myvg/mylv 这两个文件,会发现两个文件都是符号链接(软链接)文件,它们都指向一个名为 dmN 的块设备文件(N为一个整数)。在实际操作过程中,大家可能会看到 /dev/dm - 0、/dev/dm - 1,或者 /dev/dm - 2,但无论看到哪一个,都会发现“/dev/VG名/LV名”和“/dev/mapper/VG名 - LV名”指向了相同的文件。
查看LV
查看 LV 的命令同样有两个,第一个命令 lvscan 只能查看系统中是否存在 LV,命令如下:[root@localhost ~]# lvscan ACTIVE '/dev/myvg/mylv' [3.00 GiB] inherit #能够看到激活的LV,大小为3GiB
第二个命令 lvdisplay 可以查看 LV 的详细信息,命令如下:
[root@localhost ~]# lvdisplay [LV 绝对路径] #直接执行 lvdisplay 输出当前系统中所有LV的详细信息,如果指定了LV绝对路径,就输出指定LV的详细信息 [root@localhost ~]# lvdisplay /dev/myvg/mylv #查看mylv逻辑卷详细信息 --- Logical volume --- LV Path /dev/myvg/mylv ←LV所在绝对路径 LV Name mylv ←LV名 VG Name myvg ←LV所在卷组名 LV UUID 2cAKx0 - nZTG - il6M - lxp8 - i58y - pjxL - nYA0Iw ←LV的UUID LV Write Access read/write ←LV访问状态 LV Creation host, time localhost.localdomain, 2023 - 08 - 23 16:33:42 + 0800 ←LV创建时间 LV Status available ←LV状态 # open 0 LV Size 3.00 GiB ←LV大小 Current LE 768 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2
调整LV大小
在对 LV 进行扩容之前,先创建一些测试文件,以便在扩容结束之后验证文件是否可以正常读写,具体如下:[root@localhost ~]# cp /etc/fstab /disk1/ [root@localhost ~]# cp /etc/passwd /disk1/ [root@localhost ~]# ls -l /disk1/ total 8 -rw - r--r--. 1 root root 579 8月 23 17:21 fstab -rw - r--r--. 1 root root 945 8月 23 17:21 passwd #创建测试文件
我们可以使用 lvresize 命令调整 LV 的大小,lvresize 命令格式如下:
[root@localhost ~]# lvresize [选项] LV设备文件名选项:
- -L 容量: 调整空间大小,单位为 KB、GB、TB 等。使用“+”代表增加空间,使用“-”代表减少空间。如果不写“+”或“-”直接写空间大小,就代表设定 LV 为指定的空间大小;
- -l 个数: 按照 PE 个数调整 LV 大小,需要自行计算添加空间;
- -r: 在扩容 LV 空间后,文件系统识别的扩容后的 LV 空间。
mylv 逻辑卷的大小为3GB,而 myvg 卷组的总大小为 40GB,还有 37GB 的空闲空间,因此将 mylv 逻辑卷的大小增加到 10GB,命令如下:
[root@localhost ~]# lvresize -L +7G /dev/myvg/mylv Size of logical volume myvg/mylv changed from 3.00 GiB (768 extents) to 10.00 GiB (2560 extents). Logical volume myvg/mylv successfully resized. #/dev/myvg/mylv 增加了7GB空间,由原有的3GB变为现在的10GB
此命令也可写为 lvresize - L 10G /dev/myvg/mylv,差别在于是否有“+”。有“+”表示在原有基础上增加了空间大小,没有“+”表示将分区调整到指定的空间大小。
[root@localhost ~]# lvdisplay /dev/myvg/mylv #查看LV详细信息 --- Logical volume --- LV Path /dev/myvg/mylv LV Name mylv VG Name myvg LV UUID 2cAKx0 - nZTG - il6M - lxp8 - i58y - pjxL - nYA0Iw LV Write Access read/write LV Creation host, time localhost.localdomain, 2023 - 08 - 23 16:33:42 + 0800 LV Status available # open 1 LV Size 10.00 GiB ←空间大小已经调整 Current LE 2560 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2
LV 的空间大小已经改变了,继续查看可用空间的变化,命令如下:
[root@localhost ~]# df -h /disk1/ #查看分区空间 Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvg - mylv 3.0G 54M 3.0G 2% /disk1
使用 df 命令查询后会发现,在查看 LV 详细信息时可用空间为 10GB,但是挂载信息中可用空间仍然是 3GB。
之所以出现 LV 空间和可用空间的差异,原因在于文件系统,/dev/myvg/mylv 原本空间为 3GB,在初次格式化时文件系统识别的空间大小也为 3GB,但是随后我们对 LV 空间进行了扩容,使其从 3GB 增加到了 10GB,总共增加了 7GB 的空间,而后续增加的 7GB 并没有被文件系统识别。
因此,在对 LV 进行扩容后,还需要让文件系统重新识别扩容后分区的空间。使用 xfs_growfs 命令可以让文件系统识别扩容后的 LV 空间。
注意,重新识别并不意味着整个 LV 重新格式化,重新识别的过程也不需要进行卸载:
[root@localhost ~]# xfs_growfs /disk1/ #重新识别/disk1目录对应分区的空间 [root@localhost ~]# df -h /disk1/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvg - mylv 10G 105M 9.9G 2% /disk1 #扩容成功,/dev/mapper/myvg - mylv总空间为10GB [root@localhost ~]# ls -l /disk1/ total 8 -rw - r--r--. 1 root root 579 Aug 23 17:21 fstab -rw - r--r--. 1 root root 945 Aug 23 17:21 passwd #扩容后逻辑卷中原有文件不受影响在执行 lvresize 时加入 -r 选项,表示扩容并让文件系统识别扩容后空间,不需要执行单独的 xfs_growfs 命令。
接下来我们对 LV 空间进行缩减,如果想缩减 LV 空间,那么需要先将其卸载,还要经过重新格式化等操作。
因此,通常我们会说 LVM 可以动态扩容,但是缩减空间并不是动态完成的。接下来,我们将 10GB 的 LV 空间缩减至 5GB,命令如下:
[root@localhost ~]# umount /dev/myvg/mylv #先卸载LV [root@localhost ~]# lvreduce -L -5G /dev/myvg/mylv #将/dev/myvg/mylv空间减少5GB WARNING: Reducing active logical volume to 5.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce myvg/mylv? [y/n]: y #在缩减过程中会进行确认,因为缩减后需要重新将其格式化,会导致原有数据丢失 Size of logical volume myvg/mylv changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents). Logical volume myvg/mylv successfully resized. [root@localhost ~]# mkfs.xfs -f /dev/myvg/mylv #因为/dev/myvg/mylv曾经写入过文件系统,所以再次格式化时需要添加 - f,表示强制格式化 [root@localhost ~]# mount /dev/myvg/mylv /disk1/ #挂载 [root@localhost ~]# df -h /disk1/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvg - mylv 5.0G 68M 5.0G 2% /disk1 #查看LV缩减后空间 [root@localhost ~]# ls -l /disk1/ total 0 #因为进行了强制格式化,所以原有文件已经不存在了以上我们实现了对 LV 进行缩减的过程,在此过程中,必须要注意的就是在缩减之前一定要备份数据,否则,缩减和强制格式化都会导致数据丢失。
删除LV
在删除 LV 后,LV 中原有的数据就会丢失,因此要确定是否已对重要数据进行了备份,命令如下:[root@localhost ~]# lvremove 逻辑卷的设备文件名
删除 mylv 逻辑卷,记得在删除时要先卸载,命令如下:
[root@localhost ~]# umount /dev/myvg/mylv [root@localhost ~]# lvremove /dev/myvg/mylv Do you really want to remove active logical volume myvg/mylv? [y/n]: y Logical volume "mylv" successfully removed. #选择y表示删除
需要注意的是,在删除 LV 后,LV 中原有的数据会被清空。