Linux-逻辑卷LVM
lvm逻辑卷管理器
为什么要使用逻辑卷?
逻辑卷管理器是linux系统用于对硬盘分区进行管理的一种机制,为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上讲是可行的。但是却可能造成数据的丢失。lvm技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理设备和底层架构和布局,就可以实现对硬盘分区的动态调整。
lvm的技术架构图:
举例理解:
比如小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉( 物理卷[ pv, physical volume ] )揉成一个大面团( 卷组[ vg,volume group ] ),然后再把这个大面团分割成一个个小馒头( 逻辑卷[ lv, logical volume ] ),而且每个小馒头的重量必须是每勺面粉( 基本单元[ pe, physical extent ] )的倍数。
理论:
物理卷处于lvm中的最底层,可以将其理解为物理硬盘、硬盘分区或者raid磁盘阵列,这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是lvm的核心理念。
- 物理卷(pv:physical volume):物理卷是底层真正提供容量,存放数据的设备,它可以是整个硬盘、硬盘上的分区等。
- 卷组(vg:volume group):卷组建立在物理卷之上,它由一个或多个物理卷组成。即把物理卷整合起来提供容量分配。一个lvm系统中可以只有一个卷组,也可以包含多个卷组。
- 逻辑卷(lv:logical volume):逻辑卷建立在卷组之上,它是从卷组中“切出”的一块空间。它是最终用户使用的逻辑设备。逻辑卷创建之后,其大小可以伸缩。
- 基本单元(pe:physical extents):具有唯一编号的pe是能被lvm寻址的最小单元。pe的大小可以指定,默认为4mb。pe的大小一旦确定将不能改变,同一个卷组中的所有的物理卷的pe的大小是一直的
部署逻辑卷
常用的lvm部署命令
功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
添加两块新硬盘设备
在虚拟机中添加两块新硬盘设备的目的,是为了更好地演示lvm理念中用户无需关心底层物理硬盘设备的特性。我们先对这两块新硬盘进行创建物理卷的操作,可以将该操作简单理解成让硬盘设备支持lvm技术,或者理解成是把硬盘设备加入到lvm技术可用的硬件资源池中,然后对这两块硬盘进行卷组合并,卷组的名称可以由用户来自定义。接下来,根据需求把合并后的卷组切割出一个约为150mb的逻辑卷设备,最后把这个逻辑卷设备格式化成ext4文件系统后挂载使用。
[root@centos7-1 ~]# lsblk name maj:min rm size ro type mountpoint sr0 11:0 1 1024m 0 rom vda 252:0 0 10g 0 disk ├─vda1 252:1 0 500m 0 part /boot └─vda2 252:2 0 9.5g 0 part ├─cl-root 253:0 0 9g 0 lvm / └─cl-swap 253:1 0 500m 0 lvm [swap] vdb 252:16 0 10g 0 disk vdc 252:32 0 10g 0 disk
第1步:创建物理卷,让新添加的两块硬盘设备支持lvm技术。
[root@centos7-1 ~]# pvcreate /dev/vdb /dev/vdc physical volume "/dev/vdb" successfully created. physical volume "/dev/vdc" successfully created. [root@centos7-1 ~]# pvs //简单查看 pv vg fmt attr psize pfree /dev/vda2 cl lvm2 a-- 9.51g 0 /dev/vdb lvm2 --- 10.00g 10.00g /dev/vdc lvm2 --- 10.00g 10.00 [root@centos7-1 ~]# pvdisplay /dev/vdb //查看物理卷详细信息 "/dev/vdb" is a new physical volume of "10.00 gib" --- new physical volume --- pv name /dev/vdb vg name pv size 10.00 gib allocatable no pe size 0 total pe 0 free pe 0 allocated pe 0 pv uuid butpic-j6hq-luvk-wind-hoyk-hqkx-snga2w
第2步:创建卷组并将物理卷加入到卷组
[root@centos7-1 ~]# vgcreate vg_storage /dev/vdb /dev/vdc //vg_storage 自定义卷组名称 volume group "vg_storage" successfully created [root@centos7-1 ~]# vgdisplay --- volume group --- vg name vg_storage system id format lvm2 metadata areas 2 metadata sequence no 1 vg access read/write vg status resizable max lv 0 cur lv 0 open lv 0 max pv 0 cur pv 2 act pv 2 vg size 19.99 gib pe size 4.00 mib total pe 5118 alloc pe / size 0 / 0 free pe / size 5118 / 19.99 gib vg uuid prdbrs-ybbd-dwud-gpbm-xxku-5nha-a0bmem ...........省略部分输出信息..........
第3步:创建一个约为150mb的逻辑卷设备
这里需要注意切割单位的问题,在对逻辑卷进行切割时有两种计量单位。第一种是以容量为单位,所使用的参数为-l,列如使用 —l 150m 则生成一个大小为150mb的逻辑卷。另外一种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为4mb,例如,使用-l 37可以生成一个大小为37×4mb=148mb的逻辑卷。
root@centos7-1 ~]# lvcreate -n lv_vo -l 150m vg_storage // -n 指定逻辑卷设备名称 rounding up size to full physical extent 152.00 mib logical volume "lv_vo" created. [root@centos7-1 ~]# lvdisplay --- logical volume --- lv path /dev/vg_storage/lv_vo lv name lv_vo vg name vg_storage lv uuid dio5ff-pkyd-97hw-rms3-dq10-9thg-zgh5o9 lv write access read/write lv creation host, time centos7-1, 2018-11-12 11:00:28 +0800 lv status available # open 0 lv size 152.00 mib current le 38 segments 1 allocation inherit read ahead sectors auto - currently set to 8192 block device 253:2 ...........省略部分输出信息..........
第4步:将生成好的逻辑卷进行格式化,然后挂载使用
linux系统会把lvm中的逻辑卷设备存放在/dev设备目录中(实际上是做了一个符号链接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组名称/逻辑卷名称)。
[root@centos7-1 ~]# ls /dev/vg_storage/lv_vo /dev/vg_storage/lv_vo [root@centos7-1 ~]# mkfs.ext4 /dev/vg_storage/lv_vo mke2fs 1.42.9 (28-dec-2013) 文件系统标签= os type: linux 块大小=1024 (log=0) 分块大小=1024 (log=0) stride=0 blocks, stripe width=0 blocks 38912 inodes, 155648 blocks 7782 blocks (5.00%) reserved for the super user 第一个数据块=1 maximum filesystem blocks=33816576 19 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 allocating group tables: 完成 正在写入inode表: 完成 creating journal (4096 blocks): 完成 writing superblocks and filesystem accounting information: 完成 [root@centos7-1 ~]# mkdir /linuxlvm [root@centos7-1 ~]# mount /dev/vg_storage/lv_vo /linuxlvm/
第5步:查看挂载状态,并写入到配置文件、使其永久生效
[root@centos7-1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 9.1g 3.7g 5.4g 41% / devtmpfs 481m 0 481m 0% /dev tmpfs 497m 84k 497m 1% /dev/shm tmpfs 497m 7.1m 490m 2% /run tmpfs 497m 0 497m 0% /sys/fs/cgroup /dev/vda1 497m 166m 332m 34% /boot tmpfs 100m 16k 100m 1% /run/user/42 tmpfs 100m 0 100m 0% /run/user/0 /dev/mapper/vg_storage-lv_vo 144m 1.6m 132m 2% /linuxlvm [root@centos7-1 ~]# echo "/dev/vg_storage/lv_vo /linuxlvm ext4 defaults 0 0" >>/etc/fstab
扩容逻辑卷
在前面的实验中,卷组是由两块硬盘设备共同组成的。用户在使用存储设备时感知不到设备底层的架构和布局,更不用关心底层是由多少块硬盘组成的,只要卷组中有足够的资源,就可以一直为逻辑卷扩容。扩展前请一定要记得卸载设备和挂载点的关联。
[root@centos7-1 ~]# umount /linuxlvm
第1步:把上一个实验中的逻辑卷vo扩展至300mb。
[root@centos7-1 ~]# lvextend -l 300m /dev/vg_storage/lv_vo size of logical volume vg_storage/lv_vo changed from 152.00 mib (38 extents) to 300.00 mib (75 extents). logical volume vg_storage/lv_vo successfully resized.
第2步:检查硬盘完整性,并重置硬盘容量。
[root@centos7-1 ~]# e2fsck -f /dev/vg_storage/lv_vo pass 1: checking inodes, blocks, and sizes pass 2: checking directory structure pass 3: checking directory connectivity pass 4: checking reference counts pass 5: checking group summary information /dev/vg_storage/lv_vo: 11/38912 files (0.0% non-contiguous), 10567/155648 blocks [root@centos7-1 ~]# resize2fs /dev/vg_storage/lv_vo resize2fs 1.42.9 (28-dec-2013) resizing the filesystem on /dev/vg_storage/lv_vo to 307200 (1k) blocks. the filesystem on /dev/vg_storage/lv_vo is now 307200 blocks long.
第3步:重新挂载硬盘设备并查看挂载状态。
[root@centos7-1 ~]# mount -a [root@centos7-1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 9.1g 3.7g 5.4g 41% / devtmpfs 481m 0 481m 0% /dev tmpfs 497m 84k 497m 1% /dev/shm tmpfs 497m 7.1m 490m 2% /run tmpfs 497m 0 497m 0% /sys/fs/cgroup /dev/vda1 497m 166m 332m 34% /boot tmpfs 100m 16k 100m 1% /run/user/42 tmpfs 100m 0 100m 0% /run/user/0 /dev/mapper/vg_storage-lv_vo 287m 2.1m 266m 1% /linuxlvm
缩小逻辑卷
相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外linux系统规定,在对lvm逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执行缩容操作前记得先把文件系统卸载掉。
[root@centos7-1 ~]# umount /linuxlvm/
第1步:检查文件系统的完整性
[root@centos7-1 ~]# e2fsck -f /dev/vg_storage/lv_vo e2fsck 1.42.9 (28-dec-2013) pass 1: checking inodes, blocks, and sizes pass 2: checking directory structure pass 3: checking directory connectivity pass 4: checking reference counts pass 5: checking group summary information /dev/vg_storage/lv_vo: 11/77824 files (0.0% non-contiguous), 15987/307200 blocks
第2步:把逻辑卷lv_vo的容量减小到120mb
[root@centos7-1 ~]# resize2fs /dev/vg_storage/lv_vo 120m resize2fs 1.42.9 (28-dec-2013) resizing the filesystem on /dev/vg_storage/lv_vo to 122880 (1k) blocks. the filesystem on /dev/vg_storage/lv_vo is now 122880 blocks lon [root@centos7-1 ~]# lvreduce -l 120m /dev/vg_storage/lv_vo warning: reducing active logical volume to 120.00 mib. this may destroy your data (filesystem etc.) do you really want to reduce vg_storage/lv_vo? [y/n]: y size of logical volume vg_storage/lv_vo changed from 300.00 mib (75 extents) to 120.00 mib (30 extents). logical volume vg_storage/lv_vo successfully resized.
第3步:重新挂载文件系统并查看系统状态
[root@centos7-1 ~]# mount -a [root@centos7-1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 9.1g 3.7g 5.4g 41% / devtmpfs 481m 0 481m 0% /dev tmpfs 497m 84k 497m 1% /dev/shm tmpfs 497m 7.1m 490m 2% /run tmpfs 497m 0 497m 0% /sys/fs/cgroup /dev/vda1 497m 166m 332m 34% /boot tmpfs 100m 16k 100m 1% /run/user/42 tmpfs 100m 0 100m 0% /run/user/0 /dev/mapper/vg_storage-lv_vo 113m 1.6m 103m 2% /linuxlvm
逻辑卷快照
lvm还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。
首先查看卷组的信息
[root@centos7-1 ~]# vgdisplay --- volume group --- vg name vg_storage system id format lvm2 metadata areas 2 metadata sequence no 4 vg access read/write vg status resizable max lv 0 cur lv 1 open lv 1 max pv 0 cur pv 2 act pv 2 vg size 19.99 gib pe size 4.00 mib total pe 5118 alloc pe / size 30 / 120.00 mib free pe / size 5088 / 19.88 gib vg uuid prdbrs-ybbd-dwud-gpbm-xxku-5nha-a0bmem ...........省略部分输出信息..........
通过卷组的输出信息可以清晰看到,卷组中已经使用了120mb的容量,空闲容量还有19.88gb。接下来用重定向往逻辑卷设备所挂载的目录中写入一个文件。
[root@centos7-1 ~]# echo "to day is good day" > /linuxlvm/today.txt [root@centos7-1 ~]# ll /linuxlvm/ 总用量 13 drwx------ 2 root root 12288 11月 12 11:04 lost+found -rw-r--r-- 1 root root 19 11月 12 11:57 today.txt
第1步:使用-s参数生成一个快照卷,使用-l参数指定切割的大小。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。
[root@centos7-1 ~]# lvcreate -l 120m -s -n snap /dev/vg_storage/lv_vo using default stripesize 64.00 kib. rounding up size to full physical extent 52.00 mib logical volume "snap" created. [root@centos7-1 ~]# lvs
lv vg attr lsize pool origin data% meta% move log cpy%sync convert
root cl -wi-ao---- 9.02g
swap cl -wi-ao---- 500.00m
snap vg_storage swi-a-s--- 120.00m lv_vo 0.01
lv_vo vg_storage owi-aos--- 120.00m
第2步:在逻辑卷所挂载的目录中创建一个100mb的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了。
[root@centos7-1 ~]# dd if=/dev/zero of=/linuxlvm/files count=1 bs=100m 记录了1+0 的读入 记录了1+0 的写出 104857600字节(105 mb)已复制,0.680154 秒,154 mb/秒 [root@centos7-1 ~]# lvs lv vg attr lsize pool origin data% meta% move log cpy%sync convert root cl -wi-ao---- 9.02g swap cl -wi-ao---- 500.00m snap vg_storage swi-a-s--- 120.00m lv_vo 83.69 lv_vo vg_storage owi-aos--- 120.00m
第3步:为了校验snap快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@centos7-1 ~]# umount /linuxlvm [root@centos7-1 ~]# lvconvert --merge /dev/vg_storage/snap merging of volume vg_storage/snap started. lv_vo: merged: 18.84% lv_vo: merged: 100.00%
第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的100mb的垃圾文件也被清除了。
[root@centos7-1 ~]# mount -a [root@centos7-1 ~]# ls /linuxlvm/ lost+found today.txt
删除逻辑卷
当生产环境中想要重新部署lvm或者不再需要使用lvm时,则需要执行lvm的删除操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。
第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
[root@centos7-1 ~]# umount /linuxlvm/ [root@centos7-1 ~]# vim /etc/fstab # # /etc/fstab # created by anaconda on mon oct 29 12:25:27 2018 # # accessible filesystems, by reference, are maintained under '/dev/disk' # see man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/cl-root / xfs defaults 0 0 uuid=07d3a8ca-89fa-4011-837d-47ac9f7660c4 /boot xfs defaults 0 0 /dev/mapper/cl-swap swap swap defaults 0 0 /dev/vg_storage/lv_vo /linuxlvm ext4 defaults 0 0
第2步:删除逻辑卷设备,需要输入y来确认操作。
[root@centos7-1 ~]# lvremove /dev/vg_storage/lv_vo do you really want to remove active logical volume vg_storage/lv_vo? [y/n]: y logical volume "lv_vo" successfully removed
第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
[root@centos7-1 ~]# vgremove vg_storage volume group "vg_storage" successfully removed
第4步:删除物理卷设备。
[root@centos7-1 ~]# pvremove /dev/vdb /dev/vdc labels on physical volume "/dev/vdb" successfully wiped. labels on physical volume "/dev/vdc" successfully wiped.
在上述操作执行完毕之后,再执行lvdisplay、vgdisplay、pvdisplay命令来查看lvm的信息时就不会再看到信息了(前提是上述步骤的操作是正确的)。
下一篇: 移动应用开发期末总结