前言
LVM 逻辑卷管理,是对磁盘分区进行管理的一种机制,建立在硬盘和分区之上,文件系统之下的一个逻辑层,可以提高磁盘分区管理的灵活性,基于lvm可以实现分区的扩容
许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。
LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。centos7默认安装的分区格式就是LVM逻辑卷的格式。
下面就lvm的原理和使用做详细的记录介绍
正文
平时,如果是机房中的线下服务器,都推荐使用lvm进行磁盘管理,可以更加灵活,当然一般大的公司可能会有更好的存储设备,进行统一储存,但这也不影响,推荐是能用lvm就用lvm。另外如果是像阿里云这种云平台,ECS服务器的磁盘默认都是直接挂载的,并没有使用lvm,因为这些磁盘都是可以在阿里云上直接在线扩容或者新增磁盘,以此解决磁盘的灵活问题。
在使用操作lvm之前,我们首先要理解lvm的原理。
1. lvm原理
lvm是一个基于磁盘和分区之上,文件系统之下的中间逻辑层,lvm的层级结构如下图:
如图,首先是最下层的物理分区: 物理分区就是通过 fdisk -l 命令查看到的就是物理磁盘和物理分区,是实际的物理设备,lvm则是基于此之上,在物理磁盘上可以划分分区,为物理分区,物理分区必须设置为lvm分区格式,才可以将这些物理分区,提取出来创建成物理卷。
物理卷: 也就是图中第二层,是通过物理分区创建而来,与物理分区一一对应。创建为物理卷后,则可以将物理卷合并为一个大的卷组。通过命令pvdisplay 查看物理卷
卷组: 也就是图中第三层,卷组是不同的物理卷合并而成,可以将所有物理卷的大小整合成一个大的卷组,相当于一个大的整合的逻辑磁盘,然后在卷组中就可以根据需求划分逻辑卷。通过命令vgdisplay 查看卷组。
逻辑卷: 也就是图中最顶层,逻辑卷是从卷组中划分出来的,相当于逻辑分区,此逻辑卷就可以直接格式化挂载到目录,就可以直接使用了。通过命令lvdisplay 查看逻辑卷。
你可能会问,为什么要这么做,有几点:
因为一般的物理磁盘你进行的物理分区,一旦确定,就不能修改大小,不灵活。
因为一般的物理磁盘大小有限,而物理分区只能是小于等于物理磁盘的大小,而通过lvm则可以将多个磁盘组合成一个大的卷组,相当于一个大的磁盘,就可以增大单个文件系统的容量大小。
管理方便,底层的磁盘管理由lvm帮你做了,你只需要将物理分区创建出物理卷加入到卷组,所有的管理都直接对卷组操作即可,简单方便。
通过lvm管理磁盘,非常的方便,当然也有不好的地方,那就是物理磁盘通过lvm联系在了一起,如果需要退出物理磁盘则不能直接暴力的拔出磁盘,而需要在lvm中退出后,才能拔出磁盘,不然会导致lvm故障,这方便可能会比直接挂载更加复杂一点,但为了灵活方便,这点代价还是能接受的。
2. 通过lvm新增创建分区
上面说了lvm的结构原理,下面就记录介绍如何使用lvm创建物理卷,卷组,逻辑卷等来使用。下面假设你新增了一块磁盘,详细说明如果将此磁盘进行纳入到lvm管理下。
创建物理分区
首先,需要将磁盘进行物理分区:
# 查看物理磁盘和分区情况
$ fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xdb5c4c82
Device Boot Start End Blocks Id System
# 可以看到有一块/dev/sdb的磁盘,大小21.5G,还没有服务分区
# 操作此磁盘,创建物理分区
$ fdisk /dev/sdb
Command (m for help): n # n创建物理分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p # p指定创建主分区, e为扩展分区
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048 # 默认起始位
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039 # 默认结束位为最后一位
Partition 1 of type Linux and of size 20 GiB is set
Command (m for help): w # 保存操作结果
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
PS: 这里说明一下,sector为磁盘扇区,通过指定扇区区间来确定分区区域和大小。
创建物理卷
# 指定物理分区,创建为物理卷
$ pvcreate /dev/sdb1
# 查看物理卷
$ pvdisplay
# 简单查看
$ pvs
创建卷组
# 若没有卷组,则指定物理卷,创建卷组,卷组名为:centos
# 格式为:vgcreate 卷组名称 物理卷名称
$ vgcreate centos /dev/sdb1
# 若已有卷组,可将物理卷,加入到卷组,卷组名为:centos
$ 格式为: vgextend 卷组名称 物理卷名称
$ vgextend centos /dev/sdb1
# 查看卷组
$ vgdisplay
# 简单查看卷组
$ vgs
创建逻辑卷
# 指定卷组,创建逻辑卷,名称为:test-lv
$ 命令格式为: lvcreate -L 逻辑卷大小 -n 逻辑卷名称 卷组名称
$ lvcreate -L 5G -n test-lv centos
# 查看逻辑卷,注意:逻辑卷的LV Path会被用于格式化和挂载
$ lvdisplay
--- Logical volume ---
LV Path /dev/centos/test-lv
LV Name test-lv
VG Name centos
LV UUID sbGZQI-xVKe-QFJF-MV3Y-WpoW-Hucl-pqwQEg
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-08-07 23:05:44 -0700
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
# 简单查看逻辑卷
$ lvs
格式化并挂载
# 格式化逻辑卷,格式化为centos7默认的xfs格式,通过逻辑卷的LV Path指定逻辑卷
# centos7 的文件系统格式默认为xfs,centos6为ext4。
$ mkfs.xfs /dev/centos/test-lv
# 挂载到本地目录前,需要本地目录先存在,所以我们先创建目录,如/data
$ mkdir /data
# 挂载,使用逻辑卷的LV Path
$ mount /dev/centos/test-lv /data
# 挂载完成后,通过df -h 就能看到相应的文件系统
# 然后将挂载信息写入到/etc/fstab中,使其开机挂载
$ echo "/dev/centos/test-lv /data xfs defaults 0 0" >> /etc/fstab
ok,到此就完成了将通过磁盘创建物理卷,创建卷组,加入卷组,创建逻辑卷并格式化挂载使用。
3. 调整逻辑分区大小
上面我们讲了如何通过lvm创建逻辑分区并使用,学会了使用lvm的开始,然后当我们使用了一段时间后,逻辑分区已经差不多占满时,就需要进行逻辑分区的扩容,或者一些不用的逻辑分区进行缩容。
特别注意的是:
resize2fs命令 针对的是ext2、ext3、ext4文件系统
xfs_growfs命令 针对的是xfs文件系统
# 首先通过df -hT 查看文件系统类型
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 18G 4.7G 14G 27% /
devtmpfs devtmpfs 475M 0 475M 0% /dev
tmpfs tmpfs 489M 144K 489M 1% /dev/shm
tmpfs tmpfs 489M 14M 476M 3% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 xfs 297M 144M 154M 49% /boot
tmpfs tmpfs 98M 20K 98M 1% /run/user/0
/dev/mapper/centos-test--lv xfs 5.0G 33M 5.0G 1% /data
# 先看看卷组,还有多少剩余空间,调整大小时,原本逻辑分区是从哪个卷组中划分的,那么调整大小默认也会使用此卷组中的空间。
$ vgdisplay
# 或者
$ vgs
PS:通过df -hT查出的文件系统路径跟逻辑分区路径不同,扩容时使用此文件系统路径,或者逻辑分区路径,都可以,一样的。
不同文件系统类型所对应的创建、检查、调整命令不同,下面就针对xfs和ext2/3/4文件系统的lvm分区空间的扩容和缩容的操作做详细记录:
1)ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持)
# 调整逻辑分区大小
# 增大至20G
$ lvextend -L 20G /dev/mapper/centos-test--lv
# 增加5G
$ lvextend -L +5G /dev/mapper/centos-test--lv
# 减小至10G
$ lvreduce -L 10G /dev/mapper/centos-test--lv
# 减小3G
$ lvreduce -L -3G /dev/mapper/centos-test--lv
# 执行调整
$ resize2fs /dev/mapper/centos-test--lv
2)xfs文件系统的调整命令是xfs_growfs(只支持增大)
# 调整逻辑分区大小
# 增大至20G
$ lvextend -L 20G /dev/mapper/centos-test--lv
# 增加5G
$ lvextend -L +5G /dev/mapper/centos-test--lv
# 执行调整
$ xfs_growfs /dev/mapper/centos-test--lv
这里我上面格式化的文件系统类型为xfs,所以我增大逻辑分区5G,执行上面命令,完整调整后,再次通过df -hT命令查看就会发现已经扩容到了10G。
此种方法进行的扩缩容,是不会影响到原有数据的,非常的方便好用。
PS:不管什么文件系统类型,在进行缩容前,都需要先卸载挂载,然后再缩容,再重新挂载。
特别注意:xfs格式不是不支持缩容,而是xfs格式缩容后需要重新格式化才能继续挂载使用,且缩容前需要先卸载挂载,然后在缩容,然后格式化,然后再挂载。这会导致原本的数据丢失,如果是在要缩容,可以提前将数据转移备份好,缩容后再将数据迁移回来。
具体的操作,这里就不演示了,大致用到的命令如下:
# 卸载挂载
$ umount /dev/mapper/centos-test--lv
# 缩容
$ lvreduce -L -5G /dev/mapper/centos-test--lv
# 重新格式化,添加-f参数,强制重写。
$ mkfs.xfs /dev/mapper/centos-test--lv -f
# 重新挂载
# mount /dev/mapper/centos-test--lv /data
4. 安全退出磁盘
在日常使用中,磁盘老旧,故障,需要更换等问题也经常有,那么使用lvm做磁盘管理后,如何将磁盘安全退出,取出正在使用中的磁盘呢。
首先,磁盘中的数据,如何需要转移到新的磁盘中,那么首先,先插入新的磁盘,然后创建物理卷,将物理卷加入到相同的卷组,然后移动逻辑分区和数据到新的磁盘,然后将就旧的磁盘的物理卷移除出卷组,删除物理卷,就可以移除此磁盘了。
# 查看系统磁盘挂载情况
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 300M 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17.7G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
└─centos-test--lv 253:0 0 7G 0 lvm
sdc 8:32 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
# 如上可以看到在sdb磁盘中有一个sdb1的分区,下面有一个lvm的逻辑分区。
# 若要安全的退出磁盘,就需要将此磁盘中的所有数据迁移到新的磁盘中,当然如果你不要数据了,那可以不迁移,直接删除逻辑分区,从卷组中删除物理卷即可。
# sdc磁盘为刚添加的新磁盘,我们要做的就是将sdb的数据导入到sdc中,然后退出sdb磁盘
# 首先,创建sdc磁盘的物理分区和物理卷
# 操作过程不赘述了,查看最开头第一步新增创建分区的内容。
# 创建完成后,查看物理卷
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 centos lvm2 a-- 20.00g 13.00g
/dev/sdc1 lvm2 --- 20.00g 20.00g
# 可以看到新的物理卷还没有加入卷组,空间为全剩余
# 将新磁盘的物理卷加入到相同的卷组
$ vgextend centos /dev/sdc1
# 再查看物理卷,如下
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 centos lvm2 a-- 20.00g 13.00g
/dev/sdc1 centos lvm2 a-- 20.00g 20.00g
# 下面将/dev/sdb1中的数据移动到卷组中的/dev/sdc1上
$ pvmove /dev/sdb1 /dev/sdc1
# 等待一段时间即可,如果数据量过大,可以用下面命令,放到后台执行。
$ pvmove /dev/sdb1 /dev/sdc1 2>error.log >normal.log &
# 完成后,查看物理卷信息,会发现sdb1上的数据都迁移到了sdc1上。
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 centos lvm2 a-- 20.00g 20.00g
/dev/sdc1 centos lvm2 a-- 20.00g 13.00g
# 然后将/dev/sdb1的物理卷从卷组中删除
$ vgreduce centos /dev/sdb1
# 删除后,再看pvs,会发现此物理卷已经没有所属卷组了
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 20.00g 20.00g
/dev/sdc1 centos lvm2 a-- 20.00g 13.00g
# 然后删除物理卷
$ pvremove /dev/sdb1
ok,重复上面的步骤,将磁盘中所有涉及到lvm的物理分区都迁移数据并移除,然后磁盘的物理分区已经不再跟lvm有任何关联了,就可以直接安全的退出磁盘了。