首页 > 编程笔记 > Linux笔记 阅读:112

Linux LV逻辑卷的管理(建立、查看、调整大小和删除)

在 VG(Volume Group,卷组)创建完成后,需要在 VG 的基础上划分 LV(Logical Volume,逻辑卷)。

LV 也是可以动态扩容的,如果要增加 LV 空间(扩容),那么 LV 中的数据是不会丢失的,并且在扩容过程中 LV 不需要卸载;而如果要缩减 LV,就需要对 LV 中的现有数据进行备份,并且在 LV 空间缩减后,再次将备份数据恢复到缩减后的 LV 中。

因此,通常不建议缩减 LV。日常在使用 LVM 的过程中,对 LV 空间的划分会比预期保存的数据略大,如果随着时间推移数据量逐渐增加,那么在分区空间不足时,对 LV 进行扩容即可。

建立LV

我们现在已经拥有了近 40GB 的 myvg 卷组,接下来需要在卷组中创建 LV,命令如下:
[root@localhost ~]# lvcreate<选项><-n LV名>VG名
选项:
创建一个大小为 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设备文件名
选项:
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 中原有的数据会被清空。

相关文章