一、何为LVM
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。
LVM的大小可以在不卸载的时候随意扩展和收缩而不损坏里面存放的数据。
二、LVM的组成
①、Physical Volume, PV, 物理卷轴
物理卷在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区,我们实际的 partition 需要调整系统识别码 (system ID) 成为 8e (LVM 的识别码),然后再经过 pvcreate 的命令将他转成 LVM 最底层的实体卷轴 (PV) ,之后才能够将这些 PV 加以利用!
②、Volume Group, VG, 卷组
卷组建立在物理卷上,一卷组中至少要包括一物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西!所以 VG 就是 LVM 组合起来的大磁盘!每个 VG 最多仅能包含 65534 个 PE。 如果使用 LVM 默认的参数,则一个 VG 最大可达 256GB 的容量
③、Physical Extend, PE, 物理扩展单元
物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。LVM 默认使用 4MB 的 PE 区块,而 LVM 的 VG 最多仅能含有 65534 个 PE ,因此默认的 LVM VG 会有 4M*65534/(1024M/G)=256G。 这个 PE 很有趣喔!他是整个 LVM 最小的储存区块,也就是说,其实我们的文件数据都是藉由写入 PE 来处理的。 简单的说,这个 PE 就有点像文件系统里面的 block 大小啦。 所以调整 PE 会影响到 VG 的最大容量!
④、Logical Volume, LV, 逻辑卷
逻辑卷建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化挂载使用的!PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 内的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的装置档名通常指定为『 /dev/vgname/lvname 』或『 /dev/mapper/vgname-lvname 』,此两个档名都是符号链接,真正的设备名为『 /dev/dm-#(1,2,3...) 』。
⑤、logical Extent,LE,逻辑扩展单元
逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
注意:虽然PE是PV的单元。但PV刚刚创建时并没有创建PE,只有加入到VG后才会生产指定大小的PE,所有PE的大小是由VG决定的。LV的大小是由PE决定的,分配多少个PE则LV就为所有PE的总大小。当PE分配到LV时称为LE。
三、LVM的创建及管理
①、PV的创建和管理
[root@wlw ~]# pv [tab][tab] pvchange pvcreate pvmove pvresize pvscan pvck pvdisplay pvremove pv #使用pv加两个tab可以看到PV的相关命令
pvcreate /dev/DEVICE : 将 partition 创建成为 PV
[root@wlw ~]# pvcreate /dev/sda{6,7,8} Physical volume "/dev/sda6" successfully created Physical volume "/dev/sda7" successfully created Physical volume "/dev/sda8" successfully created
pvscan :搜寻目前系统中的所有PV
[root@wlw ~]# pvscan PV /dev/sda6 lvm2 [5.01 GiB] PV /dev/sda7 lvm2 [8.01 GiB] PV /dev/sda8 lvm2 [10.00 GiB] Total: 3 [23.02 GiB] / in use: 0 [0 ] / in no VG: 3 [23.02 GiB]
pvs : 显示PV的简要信息
[root@wlw ~]# pvs /dev/sda6 PV VG Fmt Attr PSize PFree /dev/sda6 lvm2 --- 5.01g 5.01g [root@wlw ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda6 lvm2 --- 5.01g 5.01g /dev/sda7 lvm2 --- 8.01g 8.01g /dev/sda8 lvm2 --- 10.00g 10.00g #不指定设备则列出所有的设备信息
pvdisplay : 显示PV的详细信息
[root@wlw ~]# pvdisplay /dev/sda6 "/dev/sda6" is a new physical volume of "5.01 GiB" --- NEW Physical volume --- PV Name /dev/sda6 VG Name PV Size 5.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID t522PZ-Rvvy-2kvQ-BiYh-lzdq-RmPJ-fRp74C #不指定设备则列出所有的设备信息
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性
[root@wlw ~]# pvremove /dev/sda6 Labels on physical volume "/dev/sda6" successfully wiped
pvmove :将VG中的PV移除,在缩减VG的时候使用。
②、VG的创建和管理
[root@wlw ~]# vg [tab][tab] vgcfgbackup vgcreate vgimport vgremove vgcfgrestore vgdb vgimportclone vgrename vgchange vgdisplay vgmerge vgs vgck vgexport vgmknodes vgscan vgconvert vgextend vgreduce vgsplit #使用vg加两个tab可以看到VG的相关命令
vgcreate [-s#[mMgGtT]] VolumeGroupName PhysicalDevicePath : 创建vg
[root@wlw ~]# vgcreate -s 8M myvg /dev/sda6 Physical volume "/dev/sda6" successfully created Volume group "myvg" successfully created #-s指定PE的大小,单位指定格式为:kKmMgGtTpPeE
vgscan :搜寻目前系统中的所有VG
vgs : 显示VG的简要信息
vgdisplay : 显示VG的详细信息
vgextend :向 VG 中添加额外的 PV
[root@wlw ~]# vgextend myvg /dev/sda7 Volume group "myvg" successfully extended
vgreduce :在 VG 内移除 PV
[root@wlw ~]# vgreduce myvg /dev/sda6 Removed "/dev/sda6" from volume group "myvg" #在移除PV时,切记要先执行pvmove /dev/sda6,让PV中的PE移动到其他PV中去,以免数据丢失
vgremove :删除 VG
③、LV的创建和管理
[root@wlw ~]# lv [tab][tab] lvchange lvextend lvmdiskscan lvmsar lvresize lvconvert lvm lvmdump lvreduce lvs lvcreate lvmchange lvmetad lvremove lvscan lvdisplay lvmconf lvmsadc lvrename #使用lv加两个tab可以看到LV的相关命令
lvcreate {-L|-l} #[mMgGtT] -n NAME VolumeGroup : 创建LV
[root@wlw ~]# lvcreate -L 4G -n mylv myvg Logical volume "mylv" created. #-L:指定LV大小,-n:指定LV的名字,-l:指定给LV分配多少个PE,默认PE大小为4M,这个时候就可以吧LV格式化并挂载使用了
lvscan :搜寻目前系统中的所有LV
lvs : 显示LV的简要信息
lvdisplay : 显示LV的详细信息
lvremove :删除 LV
添加LV容量
lvextend {-L|-l} [+]#[mMgGtT]:扩展逻辑卷,向 LV 里面添加容量
[root@wlw ~]# lvextend -L +2G /dev/myvg/mylv Size of logical volume myvg/mylv changed from 4.00 GiB (512 extents) to 6.00 GiB (768 extents). Logical volume mylv successfully resized #这里给mylv添加了2G的大小,如果是指定-L 5G的话,则代表把mylv修改为5G。
注意:这里我们修改完LV之后,发现磁盘容量并没有变化,这是因为逻辑卷大小确实扩张了,但是文件系统的大小还是之前的大小并没有变化,此时我们需要重新调整文件系统的大小与逻辑卷大小相同。而无需重新挂载。下面我们针对ext系统文件系统进行演示,如果是其他文件系统需要使用其对应的工具。
[root@wlw ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 9.8G 4.6G 4.7G 50% / tmpfs 499M 0 499M 0% /dev/shm /dev/sda1 976M 36M 890M 4% /boot /dev/sr0 3.7G 3.7G 0 100% /mnt /dev/mapper/myvg-mylv 3.9G 12M 3.7G 1% /mylvm [root@wlw ~]# resize2fs /dev/myvg/mylv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/myvg/mylv is mounted on /mylvm; on-line resizing required old desc_blocks = 2, new_desc_blocks = 3 Performing an on-line resize of /dev/myvg/mylv to 3145728 (2k) blocks. The filesystem on /dev/myvg/mylv is now 3145728 blocks long. #resize2fs后面如果没有指定大小则默认调整为整个设备的大小 [root@wlw ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 9.8G 4.6G 4.7G 50% / tmpfs 499M 0 499M 0% /dev/shm /dev/sda1 976M 36M 890M 4% /boot /dev/sr0 3.7G 3.7G 0 100% /mnt /dev/mapper/myvg-mylv 5.9G 12M 5.6G 1% /mylvm #这里我们可以看到,添加的2G已经添加到设备上了,无需重新挂载
缩减LV容量(缩减有风险,需要谨慎操作)
1、umount /dev/VG_NAME/LV_NAME:卸载设备
[root@wlw ~]# umount /dev/myvg/mylv
2、e2fsck -f /dev/VG_NAME/LV_NAME:强制检测文件系统
[root@wlw ~]# e2fsck -f /dev/myvg/mylv e2fsck 1.41.12 (17-May-2010) 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 MYLV: 13/393216 files (0.0% non-contiguous), 87981/3145728 blocks
3、resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]:缩减文件系统大小
[root@wlw ~]# resize2fs /dev/myvg/mylv 3G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/myvg/mylv to 1572864 (2k) blocks. The filesystem on /dev/myvg/mylv is now 1572864 blocks long. #缩减后文件系统的大小必须能容纳当前所有文件的大小,不然文件会损坏
4、lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
[root@wlw ~]# lvreduce -L 3G /dev/myvg/mylv WARNING: Reducing active logical volume to 3.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce mylv? [y/n]: y Size of logical volume myvg/mylv changed from 6.00 GiB (768 extents) to 3.00 GiB (384 extents). Logical volume mylv successfully resized
④、快照:snapshot
快照卷的原理:
对原卷(逻辑卷)做快照就是某一刻立即创建对方的元数据的监视器,随时监视对方的元数据,而快照卷刚创建后是没有任何数据的,当我们把快照卷挂载后是可以看到原卷的所有文件的,因为快照卷是原卷的另一个访问路径而已,因为快照卷监视了所有的原卷的元数据,当原卷数据没有发生改变时,两个卷的数据是一样的,由于快照卷的监视器一直在监视原卷的所有文件,当监控原卷的某个文件要发生改变时,会先把原卷中即将修改的文件复制一份到快照卷中,当我们需要恢复快照的时候,没有变化的数据是在原卷中存放的,变化的数据才在目标卷中恢复,所以只有修改过的文件才会复制到快照卷中,所以快照卷体积是很小的。快照卷和原卷必须在同一卷组中。
lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name:快照卷的创建
[root@wlw ~]# lvcreate -s -L 512M -p r -n mylv-snapshot /dev/myvg/mylv Logical volume "mylv-snapshot" created. [root@wlw ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv myvg owi-aos--- 3.00g mylv-snapshot myvg swi-a-s--- 512.00m mylv 0.00 #-s指定此卷为快照卷,-p以只读的格式创建,-n指定快照卷名字。
lvremove original_lv_name:快照卷的删除
[root@wlw /]# lvremove /dev/myvg/mylv-snapshot Do you really want to remove active logical volume mylv-snapshot? [y/n]: y Logical volume "mylv-snapshot" successfully removed
⑤、当确定逻辑卷中数据已经备份,打算删除LVM拆除磁盘时
1、umount /dev/VG_NAME/LV_NAME:卸载设备
[root@wlw /]# umount /dev/myvg/mylv
2、lvremove lv_name:删除 LV
[root@wlw /]# lvremove /dev/myvg/mylv Do you really want to remove active logical volume mylv? [y/n]: y Logical volume "mylv" successfully removed
3、vgremove vg_name:删除 VG
[root@wlw /]# vgremove myvg Volume group "myvg" successfully removed
4、pvremove pv_name:删除 PE
[root@wlw /]# pvremove /dev/sda{6,7,8} Labels on physical volume "/dev/sda6" successfully wiped Labels on physical volume "/dev/sda7" successfully wiped Labels on physical volume "/dev/sda8" successfully wiped
5、拆除磁盘或用于其他用途