LVM:Logical Volume Manager,逻辑卷管理器。
重点:可以弹性的调整文件系统的容量,而不在于性能和数据安全上面,因此如果强调性能和备份,那么直接使用raid即可,不需要用到LVM。
LVM可以整合多个物理分区,让这些分区看起来就像是一个磁盘一样;而且,未来还可以在这个LVM管理的磁盘当中新增或者删除其他的物理分区。因此它的重点在于“可以弹性地调整文件系统的容量”
LVM各组件
LVM各组件的实现流程如上图,详细的组件介绍如下。
物理卷(physical volume,PV,最底层的物理卷)
实际的分区需要调整系分区类型为8e00(使用gdisk分区工具,其实分区类型不设置成8e也没关系,不过某些LVM的检测命令可能会检测不到该分区),然后再经过pvcreate命令将它转化成LVM最底层的物理卷,之后才能使用这些pv。
卷组(volume group,VG)
LVM大磁盘就是将许多PV整合成VG,所以VG就是LVM组合起来的大磁盘。
物理扩展快(physical extent,PE)
PE是整个LVM最小的存储数据单位,即文件数据都是借由写入PE来完成的。简单的来说,这个PE有点像文件系统的block大小。因此调整PE会影响到LVM的最大容量。如果是32位的linux系统,LVM的逻辑卷LV最多65534个PE(lvm1的格式),因此默认的LVM,即使用4MB的PE数据块,最大的LV会有4MB*65534/(1024M/G)=256GB;但是在Centos 6.X之后,由于linux系统转为64位,并且PE使用了lvm2的各项格式功能,LV几乎没有啥容量限制了。
逻辑卷(logical volume,LV )
最终的卷组VG还会被切成逻辑卷LV,LV就是最后可以被格式化使用的东西了(类似分区)。逻辑卷LV的大小与LV内的物理扩展快PE数量有关,逻辑卷LV的设备文件名格式通常为【/dev/vgname/lvname】
如上图,VG内的PE会分给虚线部分的LV,如果未来这个卷组VG要扩充,加上其他的物理卷PV即可;如果逻辑卷LV要扩充的,加上卷组VG内没有使用的PE来扩充。在LV中,不再称为PE而是称为LE;PE是物理存储单元,LV是逻辑存储单元,即LV中的存储单元LE和PE的大小是一样的。
LVM可以弹性的调整文件系统的容量的实质:通过【交换PE】来进行数据转换,将原本LV内的PE转移到其他设备中来降低LV容量,或将其他设备的PE加入到此LV中以加大容量。
实践流程
根据上图流程爱进行实验如下
物理parition阶段
根据磁盘分区表类型使用gdisk/fdisk工具,对磁盘分区并且类型设置为【8e00】,
磁盘状态如下:
sdb为1G的磁盘,划分了sdb1-3分区,1-2分区是用到的分区,3先保留下来不使用;sdc为2G的磁盘,全部划分为分区sdc1,并且使用;sdd为3G的磁盘,暂不进行分区使用。
PV阶段
物理卷PV有关的命令
pvcreate:将物理分区建立成为PV
pvscan:查找目前系统里面任何具有PV的磁盘
pvdisplay:显示出目前系统上面的PV状态
pvremove:将PV属性删除,让该分区不具有PV属性
因为分区sdb1的大小为1MB,然而系统默认的PV最小值为2MB,因此不能创建,可以修改默认值(建议不修改)。目前从上面来看,我们已经创建了2个物理卷PV。
pvdisplay可以列出系统里面的所有PV磁盘,也可以pvdisplay /dev/sdb2只列出单个PV的详细信息。由于PE是在建立卷组VG时才设置的参数,因此看到新的PV详细信息里面的PE都会是0,且没有多余的PE可供分配。
VG阶段
建立卷组VG和VG相关的命令也不少,如下
vgcreate:主要建立VG的命令,VG名称自定义
"""
格式:vgcreate [-s N[UNIT]] VG名称 PV名称 其中-s选项后面接PE的大小N,单位UNIT可以为b|B是字节,s|S是512字节的扇区,k|K是KiB,m|M是MiB,g|G是GiB,t|T是TiB,P|p是PiB,e|E是EiB,默认设置的大小和系统的VG中PE大小一致,例如我的本机是4MB。
"""
vgscan:查找系统上面所有的VG
vgdisplay:显示系统上所有的VG详细状态
vgextend:在VG内增加额外的PV
vgreduce:在VG内删除PV
vgchange:设置VG是否启动(active)
vgremove:删除一个VG
建立时与物理卷PV不同的是,卷组VG的名称是自定义的。PV的名称就是分区设备的文件名,但是VG名称可以随便自己取。
LV阶段
创造出卷组VG大磁盘之后,就需要建立分区逻辑卷LV,LV相关的命令如下:
lvcreate:建立LV
"""
格式:
lvcreate [-L N[UNIT]] [-n LV名称] VG名称
lvcreate [-l N] [-n LV名称] VG名称
-L选项后接容量,单位是UNIT(同pvcreate中的UNIT),但是要注意的是最小的单位为PE,因此这个数量必须是PE的倍数,若不相符,系统会自动计算最相近的容量
-l(小写)选项后面接的是PE的【个数】
-n 后面接的就是LV的名称,默认名称以本人的为例lvol[0-128],建议自己取名字
"""
lvscan:查询系统上所有的LV
lvdisplay:显示系统上所有的LV详细信息,或者显示某一LV(全名)的详细信息
lvextend:在LV里面增加容量,即将所在VG的空闲PE加进去
lvreduce:在LV里面减少容量,即将LV空闲的PE放回VG中去
lvremove:删除一个LV
lvresize:对LV进行容量大小的调整,是lvextend和lvreduce的综合命令
lvrename:重命名LV
"""
格式:
lvresize [-L [+|-]Size[UNIT]] LV的全名
lvresize [-l [+|-]Number[PERCENT]] LV的全名
-L后面接增减符号和容量,单位是UNIT,例如k,m,g,t,p等和pvcreate里的单位一样
-l后面接增减符号和数字百分比,单位是%
例如:将ubuntu-vg上剩余的空间全部给ubuntu-lv
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
LV的名字需要使用全名,但是PV的名字不要求使用全名也有效。
文件系统阶段
该部分可参考之前的文章linux文件系统
1.格式化分区mkfs命令或者mke2fs命令
mkfs.xfs /dev/jupyvg/jupylv # 注意是逻辑卷LV的全名
2.挂载,如果需要开机挂在之类的请参考上面提到的文章
mkdir /srv/jupy # 建立挂载点
mount /dev/jupyvg/jupylv /srv/jupy
放大文件系统容量的实践
如果要放大文件系统的容量,大致需要以下三步骤。
1.VG阶段需要有剩余的容量
因为要放大文件系统,所以需要放大LV,但是若没有多的VG容量,那么更上层的LV与文件系统就无法放大。一般来说,如果VG容量不满足,最简单的方法就是再加硬盘,然后pvcreate、vgextend来增大VG的容量。
2.LV阶段产生更多的可用容量
如果VG的剩余容量足够,就可以利用lvresize命令来将剩余容量加入到所需要的LV设备内。
3.文件系统阶段的放大
linux实际使用的其实不是LV,而是LV格式化后挂载的文件系统,即最终的一切要以文件系统为依存。目前在Linux系统下可以放大的文件系统有xfs和ext系列,但是缩小仅有ext系列。xfs文件系统放大通过xfs_growfs命令。
ext4文件系统扩容
1.如果需要更改文件系统为ext4格式,需要先卸载挂载点,然后更改,再挂载回去。注意:如果运行命令 mkfs -t xxx或者mkfs.xxx
来格式化一个已经存在的文件系统(例如 yyy),磁盘上的所有数据都会丢失。mkfs
是用来创建新文件系统的工具,它会覆盖现有的数据结构,从而导致原有数据不可恢复。
2.如果VG阶段的剩余容量足够即Free的PE数量够
例如,我们需要扩容1GB,vgdisplay查看所在的卷组VG的剩余容量为1.42GB左右,那么我们直接扩容LV(使用lvextend或者lvresize都可以),扩容之后
lsblk显示增加后的总空间,但是df -h显示的还是原来的空间,还需要运行以下命令
resize2fs -p -F /dev/mapper/ubuntu--vg-ubuntu--lv
最后面的设备名字是df -h的filesystem的名字
xfs文件系统扩容
例如将下面的根分区扩容30G,变为50GB
由于卷组没有可用容量,想要将home分区减少30G,加到根分区上面。但是xfs系统只能扩容不能缩容,因此home分区需要执行删除(请备份好数据)。整体流程是释放出容量,给根分区扩容,然后重建home分区,再将备份数据还原回去。
最后一步挂载,一般格式为mount 磁盘 挂载点,而这个mount 挂载点,会直接读取fstab文件中的内容,报错是因为fstab中的home挂载点还是之前的xfs格式如下图,而现在这个lv卷的格式是ext4格式,因此冲突报错了,解决只需要修改fstab文件中的格式为ext4。
收缩文件系统容量的实践
ext4文件系统缩容
如果要将根分/进行缩容,操作和一般的分区缩容会不一样。因为缩容首先要umount 分区。在开机情况下,无法umount 根分区。如果重启进Grub到resume/rescue模式下,是否可以不挂载根分区?经测试还是不行。只有使用os光盘进resume,选择光盘挂载根分区。(缩小根分区可参考ubuntu 20.04 LVM根分区缩容修复与扩容_ubuntu lvm-优快云博客)
对于一般分区的缩容,步骤如下:
umount /data #卸载挂载点
e2fsck -f /dev/storage/vo #检查文件系统的完整性
resize2fs /dev/storage/vo 120M #通知系统内核将逻辑卷vo减少到120MB
lvreduce -L 120M /dev/storage/vo #将LV逻辑卷的容量修改为120MB
mount /data #重新挂载文件系统并查看状态
df -Th
缩容和扩容都不会改变分区里面的文件,是动态调整。但和ext4扩容操作不同。扩容操作时先扩容后检查文件系统完整性;而缩容操作为了保证数据的安全,需要先检查文件系统完整性再缩容。
xfs文件系统缩容
xfs文件系统创建后,其大小不能缩小。但是,仍然可以使用xfs_growfs命令放大。
标准分区扩容
一般的扩容,前提,仅最后一个分区可以使用本磁盘剩余的空间
#目的是扩大vda3即最后一个分区的大小(可以是根分区)
parted /dev/vda
(parted)unit MB print free #找到vda磁盘End位置的数据,如果出现其他选项则选择fix
(parted)resizepart 3 85899MB #将vda3的End更改为新的位置
(parted)quit #退出
partprobe /dev/vda #加载磁盘的分区表并更新分区信息
#如果是ext4分区
resize2fs /dev/vda3
#如果是xfs分区
xfs_growfs /dev/vda3
补充,其他的扩容方式
交换分区扩容
-
关闭交换文件: 首先,禁用当前的交换文件。
swapoff /swap.img
-
删除旧的交换文件: 删除当前的交换文件。
rm /swap.img
-
创建新的交换文件: 使用
dd
命令创建一个新的16G的交换文件。dd if=/dev/zero of=/swap.img bs=1024 count=16777216 #swap.img文件位于/中,必须先保证/有空余的16GB,这样才不会报错“error writing '/swap.img': no space left on device” #bs的单位是byte,即B,隐藏了。
-
设置交换文件权限: 设置交换文件的正确权限。
chmod 600 /swap.img
-
格式化交换文件: 使用
mkswap
命令格式化交换文件。mkswap /swap.img
-
启用新的交换文件: 启用新的交换文件。
swapon /swap.img
-
更新
/etc/fstab
文件: 确保在系统重启后新的交换文件能自动挂载。编辑/etc/fstab
文件,确保包含以下内容:/swap.img none swap sw 0 0
你可以使用以下命令来编辑文件:
vim /etc/fstab
-
验证交换文件: 确认新的交换文件已经生效。
swapon --show
这些步骤完成后,你的系统应该已经成功将交换文件从3.8G扩容到16G。