一、LVM介绍
LVM,Logical Volume Manager,即逻辑卷管理,是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供的一个抽象的存储卷,在存储卷上建立文件系统,以便实现对文件系统的大小灵活调整。
试想有这样一个场景:home目录独立分区,刚开始只有一个用户使用,后来增加了10个用户,home目录空间不够用了。
有没有什么方法可以根据实际需要分配和控制分区大小,即随着数据的增长,当现有分区空间不够用时,可以调大分区空间;
当分区在初始分配时分配过大,过一段时间后,还可以随意缩减分区大小。这只是LVM的功能之一,LVM还可以实现快照功能,对数据进行增量备份,即对修改前的原数据进行备份,这样可以减少快照占用空间的大小。
二、PV,VG及LV,PE相关概念
PV(PhysicalVolume),物理卷
VG(Volume Group),卷组
LV(Logical Volume),逻辑卷
PE(Physical Extend),物理扩展块
LVM的实现是通过将几个分区(或磁盘)调整System ID 成8e,然后通过pvcreate命令转换成LVM最底层的物理卷PV,
再将多个PV整合成一块看起来是独立的大磁盘,即卷组(VG);再将卷组分成一个或多个可使用的分区(LV),将LV格式化创建文件系统,挂载后就能正常使用了。PE是LVM最小的存储块,类似于文件系统里的block,VG,LV的大小与PE有关,分区缩减或增加容量可以通过调整PE来实现。
三、创建PV,VG以及LV
该实验对LVM的创建删除扩展缩减快照等功能进行操作,以下实验在虚拟环境VMWare上进
行,系统为Centos 6.6 64位,在虚拟机上对新添加的硬盘/dev/sdb进行操作。实验步骤如下:
1、创建LVM标识符分区
利用fdisk对/dev/sdb进行分区,并指定System ID为8e(Linux LVM),具体的分区操作见上篇博文。
[root@localhost ~]# fdisk /dev/sdb # 新建磁盘分区,见如下。[root@localhost ~]# partx -a /dev/sdb # 通知内核重新识别新建分区[root@localhost ~]# fdisk -l /dev/sdb # 查看/dev/sdb磁盘的分区信息 Disk /dev/sdb: 42.9 GB, 42949672960 bytes255 heads, 63 sectors/track, 5221 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x9d1b8246 Device Boot Start End Blocks Id System/dev/sdb1 1 1306 10490413+ 8e Linux LVM/dev/sdb2 1307 2612 10490445 8e Linux LVM/dev/sdb3 2613 4571 15735667+ 8e Linux LVM
2、创建PV
pv管理命令:
pvs:简要pv信息显示
pvdisplay:显示pv的详细信息
pvscan:查询当前系统含有PV的磁盘
pvremove:移除一个物理卷
命令格式:pvmove PhysicalDevicePath [PhysicalDevicePath...]
pvmove:移动物理卷数据
命令格式:pvmove [-n LogicalVolume][SourcePhysicalVol-ume[:PE[-PE]...] [DestinationPhysicalVolume[:PE[-PE]...]...]]
pvcreate: 创建pv
命令格式:pvcreate PhysicalDevicePath [PhysicalDevicePath...]
[root@localhost ~]# pvcreate /dev/sdb{1,2} # 将/dev/sdb1和/dev/sdb2整合创建成一个PV Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# pvdisplay # 显示PV的详细信息 "/dev/sdb1" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID AznT7f-2ybU-MF4P-xkoM-F4tX-eonQ-fMjA74 "/dev/sdb2" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID yVmQtU-UNue-i8o6-nQwc-PYFR-vvvL-UOD4w9
创建PV非常简单,只需要pvcreate命令和创建PV的分区对象就可以了。从上面PV的信息中可以看出,PV在创建后VG 、PE等相关信息为空,要想利用到PV的空间,那么下一步就要创建VG 和指定PE大小。
3、创建VG
vg管理命令:
vgs:简要VG信息显示
vgdisplay:详细的VG信息显示
vgcreate:创建VG
命令格式:vgcreate[-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
选项:-s:指定VG大小,单位为kKmMgGtTpPeE(字节,兆,千兆...)
vgextend:扩展VG
命令格式:vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce:缩减VG
命令格式:vgreduceVolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
减少或移除pv,为了避免数据损坏,需要先做pvmove
vgremove:移除一个卷组
如下:将PV /dev/sdb1和/dev/sdb2创建成名为testvg的VG,PE大小指定为16M
[root@localhost ~]# vgcreate -s 16M testvg /dev/sdb{1,2} Volume group "testvg" successfully created[root@localhost ~]# vgdisplay --- Volume group --- VG Name testvg 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 20.00 GiB PE Size 16.00 MiB Total PE 1280 Alloc PE / Size 0 / 0 Free PE / Size 1280 / 20.00 GiB VG UUID hBmQdf-Z2hW-1UOM-xJ5n-yvrp-yX0d-8DrIof
4、创建LV
LV管理命令:
lvs:简要显示LV信息
lvscan:查询当前系统具有LV的分区
lvceate:创建LV
命令格式:lvcreate -L #[mMgGtT] -n NAME LogicalVolume{Name|Path}
选项:-L:指定LV大小
-n:指定LV名称
lvreduce:缩减LV
命令格式:lvreduce -L [-]#[mMgGtT] LogicalVolume{Name|Path}
选项:-L:指定LV大小,-表示缩减多少,不加-表示缩减至多少
lvextend:扩展LV
lvremove:移除一个LV
如下:创建大小为5G,名称为testlv的PV
[root@localhost ~]# lvcreate -L 5G -n testlv /dev/testvg
[root@localhost ~]# lvdisplay /dev/testvg/testlv --- Logical volume --- LV Path /dev/testvg/testlv LV Name testlv VG Name testvg LV UUID icxsNx-y53V-81KM-Iqp3-1PFZ-U0d6-1E22dL LV Write Access read/write LV Creation host, time localhost.localdomain, 2015-08-15 02:50:24 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 320 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
创建文件系统并挂载使用
[root@localhost ~]# mke2fs -t ext4 /dev/testvg/testlv # testlv的文件系统创建为ext4[root@localhost ~]# mkdir /users[root@localhost ~]# mount /dev/testvg/testlv /users #将testlv挂载至/users目录[root@localhost ~]# ls /userslost+found # 新增lost+found目录表示挂载成功
四、扩展PE、VG、LV
1、扩展PV步骤如下:
只需用fdisk /dev/sdb命令将指定分区的System ID指定为 8e (Linux LVM),再用pvcreate 命令将该
分区转换为PV,即可使用。[root@localhost ~]# pvcreate /dev/sdb3
2、扩展VG步骤如下:
用pvscan或pvdisplay 命令查看PV剩余空间是否满足扩展需求,若不满足则需扩展PV
[root@localhost ~]# pvscan PV /dev/sdb1 VG testvg lvm2 [10.00 GiB / 7.00 GiB free] PV /dev/sdb2 VG testvg lvm2 [10.00 GiB / 10.00 GiB free] PV /dev/sdb3 lvm2 [15.01 GiB] Total: 3 [35.01 GiB] / in use: 2 [20.00 GiB] / in no VG: 1 [15.01 GiB]
用vgextend 命令增加VG
[root@localhost ~]# vgextend testvg /dev/sdb3 Volume group "testvg" successfully extended
3、扩展LV步骤如下:
先用vgdisplay查看VG中PE剩余大小,确保有足够的剩余空间供扩展
[root@localhost ~]# vgdisplay /dev/testvg # 查看testvg PE剩余大小,对应项为Free PE/Size
用lvextend命令扩展物理边界
[root@localhost ~]# lvextend -L 7G /dev/testvg/testlv Size of logical volume testvg/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents). Logical volume testlv successfully resized
用resize2fs 扩展逻辑边界
[root@localhost ~]# resize2fs /dev/testvg/testlv
查看是否扩展成功
[root@localhost ~]# lvdisplay /dev/testvg/testlv | grep "LV Size" LV Size 7.00 GiB # 物理边界扩展成功[root@localhost ~]# df -hP | awk '/testlv/{print $2}' 7.00G # 逻辑边界扩展成功
五、缩减逻辑卷(LV)
缩减逻辑卷不支持在线缩减,需要umount LV,在缩减前要确保有足够的空余空间供缩
减,要保障正常的数据不受影响,步骤如下:
1、先用vsdisplay查看剩余的空间,确保有足够的空间供缩减
[root@localhost ~]# lvdisplay /dev/testvg/testlv
2、卸载LV
[root@localhost ~]# umount /dev/testvg/testlv
3、缩减前需要强制检查文件系统,没有报告错误可继续下面步骤
[root@localhost ~]# e2fsck -f /dev/testvg/testlve2fsck 1.41.12 (17-May-2010)Pass 1: Checking inodes, blocks, and sizesPass 2: Checking directory structurePass 3: Checking directory connectivityPass 4: Checking reference countsPass 5: Checking group summary information/dev/testvg/testlv: 40/327680 files (0.0% non-contiguous), 55927/1310720 blocks
4、用 resize2fs 命令缩减到3G
[root@localhost ~]# resize2fs /dev/testvg/testlv 3Gresize2fs 1.41.12 (17-May-2010)Resizing the filesystem on /dev/testvg/testlv to 786432 (4k) blocks.The filesystem on /dev/testvg/testlv is now 786432 blocks long.
5、重新挂载并查看大小调整是否成功
[root@localhost ~]# mount /dev/testvg/testlv /users[root@localhost ~]# df -hP | awk '/testlv/{print $2}' 2.9G[root@localhost ~]# lvdisplay /dev/testvg/testlv | grep "LV Size" LV Size 3.00 GiB
6、查看调整前后文件是否有减少或者损坏情况,若没有,则缩减正常
六、快照功能
快照的功能是在创建快照区,如果有数据需要改动,则在改动之前备份一份原始数据到快
照卷中,没有被改动的区域则由快照区和文件系统共享。由于快照区和被快照的LV共享PE块,
因此快照区和被快照区需要在同一个VG中。
命令:lvcreate
作用:可以用来创建LVM快照
格式:lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
选项:-p:指定权限,r或rw
-s:snapshot,指定创建快照
-n:设定快照卷名称
1、创建快照
[root@localhost ~]# lvcreate -L 3G -p r -s -n testsnsh /dev/testvg/testlv Logical volume "testsnsh" created.
2、查看快照相关信息
[root@localhost ~]# lvdisplay /dev/testvg/testsnsh --- Logical volume --- LV Path /dev/testvg/testsnsh LV Name testsnsh VG Name testvg LV UUID 4f18IK-oJWi-tpnv-1wNT-7X1i-RwID-vXhxlq LV Write Access read only LV Creation host, time localhost.localdomain, 2015-08-15 03:45:14 +0800 LV snapshot status active destination for testlv # 为testlv所建快照 LV Status available # open 0 LV Size 3.00 GiB Current LE 192 COW-table size 3.00 GiB COW-table LE 192 Allocated to snapshot 0.00% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:3
[root@localhost ~]# lvdisplay /dev/testvg/testlv --- Logical volume --- LV Path /dev/testvg/testlv LV Name testlv VG Name testvg LV UUID icxsNx-y53V-81KM-Iqp3-1PFZ-U0d6-1E22dL LV Write Access read/write LV Creation host, time localhost.localdomain, 2015-08-15 02:50:24 +0800 LV snapshot status source of testsnsh [active] # 快照状态正常 LV Status available
3、验证
[root@localhost users]# rm -rf pam.d/ # 将挂载目录下的pam.d目录及目录的所有文件删除[root@localhost users]# lslost+found[root@localhost ]# mount /dev/testvg/testsnsh /mntmount: block device /dev/mapper/testvg-testsnsh is write-protected, mounting read-only[root@localhost ]# cd /mnt[root@localhost mnt]# ls pam.d/ # 所删除的文件被备份到快照卷中chfn crond login passwd remote runuser smtp ssh-keycat sudo-ichsh cvs newrole password-auth ricci runuser-l smtp.postfix su su-lconfig-util fingerprint-auth other polkit-1 run_init smartcard-auth sshd sudo system-auth
4、归档和恢复快照
把快照区的内容归档压缩备份
[root@localhost users]# tar -Jcf /tmp/testlv.tar.xz *
卸载快照区并移除
[root@localhost ~]# umount /dev/testvg/testsnsh [root@localhost ~]# lvremove /dev/testvg/testsnshDo you really want to remove active logical volume testsnsh? [y/n]: y Logical volume "testsnsh" successfully removed
恢复
[root@localhost ~]# umount /dev/testvg/testlv[root@localhost ~]# mkfs -t ext4 /dev/testvg/testlv[root@localhost ~]# mount /dev/testvg/testlv /users[root@localhost ~]# tar -Jxf /tmp/testlv.tar.xz -C /users[root@localhost ~]# ll /userstotal 20drwxr-xr-x. 2 root root 4096 Aug 15 03:48 archlinuxdrwx------. 2 root root 16384 Aug 15 03:12 lost+found
总结:
在LVM管理的时候需要特别注意的是,PV,VG或LV在扩展时要先扩展物理边界,再扩展逻辑边界;在缩减时要保证FREE空间满足,而且不能损坏正常数据,要先缩减逻辑边界再缩减物理边界。在移除PV的时候要查看要移除的PV上是否有数据,即确保Allocated PE为0,不为0,则需要用盘pvmove命令将数据移动到其他PV的Free 空间上去。