# LVM -- 基本命令总结
LVM : logical volume management 通过LVM,可以方便的对磁盘空间进行管理。我们首先将一个磁盘或多个磁盘的多个分区设置为LVM类型。接下来,这些LVM类型的分区可以分别创建为physical volume(pv)。多个pv可以组成一个或多个volume group(vg)。在vg中,我们可以建立多个logical volume(lv),而这些lv就是后续根目录、交换空间等结构的挂载点。
此处需要注意的是,在lvm模式下,RedHat (opens new window)推荐/boot目录单独挂载到非lvm的分区中,理由是boot loader无法读取lvm中的内容。不过并不是强制的,可以根据实际需要选择,因为对于GRUB2,已经可以读取lvm了,不过在安装完boot loader,生成"/boot/grub/grub.cfg"文件前,需要修改相关的配置文件"/etc/default/grub" (opens new window),让lvm模块预先加载。
在多系统环境中,如果有Windows类型的系统,那么更好的方式应该是/boot目录单独挂载到非lvm分区上。因为Windows平台无法读取lvm中的内容,/boot目录在lvm中会导致Windows的引导出现错误。
以下内容都是在机械硬盘上进行的实验,SSD慎重参考,未分区的SSD,要先进行数据对齐操作 (opens new window)。
显示所有适合用于pv的设备: lvmdiskscan
# PV
# 显示pv
pvdisplay
# 创建pv
pvcreate /dev/sda1 (针对分区)
pvcreate /dev/sda (针对磁盘)
# 移除pv
pvremove -v /dev/sda1 (针对分区)
pvremove -v /dev/sda (针对磁盘)
# 转移pv
将一个pv上的数据转移到同vg中的另一个pv上
pvmove -v /dev/xxxx
PS: 此时原有的pv可以在vg中移除,不影响数据
# VG
# 显示vg
vgdisplay
PS: 如果有vg丢失,可以使用vgscan,扫描存在的vg
# 创建vg
vgcreate <vg-name> <pv-device/partition>
# 扩展vg
vgextend <vg-name> <pv-device/partition>
# 缩减vg
vgreduce <vg-name> <pv-device/partition>
PS: 如果相关pv中存在数据,且有保存数据的需求,需要配合pvmove使用
# LV
# 显示lv
lvdisplay
PS: 如果有lv丢失,可以使用lvscan,扫描存在的lv
# 创建lv
lvcreate -L <size,例如:10G> <vg-name> -n <lv-name> (指定大小)
lvcreate -l 100%FREE <vg-name> -n <lv-name> (剩余空间百分比)
# 扩展lv
lvextend -L 500M /dev/vg-name/lv-name (将lv扩展到500M)
lvextend -L +350M /dev/vg-name/lv-name (将lv在原有的基础上增加350M)
PS: 以上思路也适合剩余空间百分比的方式
# 缩减lv
lvreduce -L 150M /dev/vg-name/lv-name
PS: 其它缩减方式,可以结合扩展lv部分,发散思维
缩减lv的时候,首先要缩减文件系统:
umount /mnt/data
e2fsck -f /dev/vg-name/lv-name
resize2fs /dev/vg-name/lv-name 150M
# 移除lv
lvremove /dev/vg-name/lv-name
PS: 在lv已经挂载的情况下,首先要通过umount卸载,然后通过lvchange改变lv的状态。
umount /dev/vg-name/lv-name
lvchange -a n /dev/vg-name/lv-name
PS: 以上大部分内容参考自Gentoo WiKi - LVM (opens new window), 部分内容参考自Arch WiKi - LVM (opens new window)。 关于lv的缩减,还有一步到位的命令,过程和原理,与上面提到的方式差不多,具体可以参考Red Hat Docs (opens new window)