LVM逻辑卷管理(Logical Volume Manager)
随着数据的逐渐增加,当初设计的磁盘大小已经满足不了现在的需求了,当磁盘面临着满盘时,运维人员如何解决问题?是换一个更大的磁盘,把原先的数据copy到现在更大的磁盘里面,继续撑一段时间,还是寻找其它方法?LVM的出现很好的解决了这一问题。LVM是linux环境下对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
LVM有两个特性
1、便捷的调整文件系统大小
2、支持快照snapshot
创建LVM的示意图
PV可以是硬盘的分区,PV组成了VG,在VG上面割取PE就组成了LV
物理卷physical volume (PV)
物理卷是硬盘分区,也可以是整个硬盘或已创建的Software RAID 卷。
卷组volume group (VG)
卷组是LVM 中最高抽象层,是由一个或多个物理卷所组成的存储器池。
物理块physical extent (PE)
物理卷按大小相等的“块”为单位存储,块的大小与卷组中逻辑卷块的大小相同。
逻辑块logical extent (LE)
逻辑卷按“块”为单位存储,在一卷组中的所有逻辑卷的块大小是相同的。
逻辑卷logical volume (LV)
逻辑卷相当于非LVM 系统中的分区,它在卷组上建立,是一个标准的块设备,可以在其上建立文件系统
从一块硬盘到能使用LV文件系统的步骤:
硬盘----分区----PV----VG----LV----格式化(LV为ext文件系统)----挂载
一、LVM的第一个特性,便捷的调整文件系统大小
1、PV的相关操作
先对硬盘进行分区
pvcreate 创建PV
[root@Redhat6 ~]# pvcreate /dev/sda5 /dev/sda6 Physical volume "/dev/sda5" successfully created Physical volume "/dev/sda6" successfully created
pvromve 移除PV
[root@Redhat6 ~]# pvremove /dev/sda5 Labels on physical volume "/dev/sda5" successfully wiped
pvdisplay 显示PV的详细信息,用pvs也可以显示pv的信息
[root@Redhat6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg0 lvm2 a-- 59.99g 7.99g /dev/sda5 lvm2 a-- 10.00g 10.00g /dev/sda6 lvm2 a-- 10.00g 10.00g
pvmove 移动pv,将此PV的数据转移至其它PV
[root@Redhat6 ~]# pvmove /dev/sda5 /dev/sda6 #把sda5的数据转移到sda6上面 /dev/sda5: Moved: 100.0%
2、VG的相关操作
vgcreate 创建vg,-s PE:指定PE大小,默认为4M
[root@Redhat6 ~]# vgcreate myvg /dev/sda5 /dev/sda6 Volume group "myvg" successfully created
vgdisplay 显示VG的详细信息,用vgs也可以显示VG的信息
[root@Redhat6 ~]# vgdisplay --- Volume group --- VG Name myvg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size 25.01 GiB PE Size 4.00 MiB Total PE 6402 Alloc PE / Size 0 / 0 Free PE / Size 6402 / 25.01 GiB VG UUID cLkCtE-LB7X-SYCE-GcKF-I30f-pBYH-MTCLZC
vgremove 移除vg,只需跟vg的名称即可
[root@Redhat6 ~]# vgremove myvg Volume group "myvg" successfully removed
vgextend vg的扩展,先必须添加其它的PV
首先准备好一个PV--->然后使用vgextend命令即可完成扩展
[root@Redhat6 ~]# pvcreate /dev/sda5 /dev/sda6 #创建PV Physical volume "/dev/sda5" successfully created Physical volume "/dev/sda6" successfully created [root@Redhat6 ~]# vgcreate myvg /dev/sda5 /dev/sda6 #创建VG Volume group "myvg" successfully created [root@Redhat6 ~]# pvcreate /dev/sda3 #把另外一个分区创建为PV Physical volume "/dev/sda3" successfully created [root@Redhat6 ~]# vgextend myvg /dev/sda3 #在myvg组里面扩展VG Volume group "myvg" successfully extended
vgreduce vg的缩减,
确定要移除的PV--->将此PV的数据转移至其它PV---->从卷组中将此PV移除
[root@Redhat6 ~]# pvs #查看PV,确定要移除哪个PV PV VG Fmt Attr PSize PFree /dev/sda2 vg0 lvm2 a-- 59.99g 7.99g /dev/sda3 myvg lvm2 a-- 5.01g 5.01g /dev/sda5 myvg lvm2 a-- 10.00g 3.00g /dev/sda6 myvg lvm2 a-- 10.00g 10.00g [root@Redhat6 ~]# pvmove /dev/sda3 /dev/sda5 #把sda3的数据转移到sda5上面 /dev/sda3: Moved: 100.0% [root@Redhat6 ~]# vgreduce myvg /dev/sda3 #从VG中把PV移除 Removed "/dev/sda3" from volume group "myvg" [root@Redhat6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg0 lvm2 a-- 59.99g 7.99g /dev/sda3 lvm2 a-- 5.01g 5.01g /dev/sda5 myvg lvm2 a-- 10.00g 3.00g /dev/sda6 myvg lvm2 a-- 10.00g 10.00g [root@Redhat6 ~]#
3、LV的相关操作
lvcreate 创建LV,相关参数:-l 指定PE个数,-L指定LV的大小,
-s创建一个快照卷,-n LV的名称
[root@Redhat6 ~]# lvcreate -L 5G -n lv1 myvg Logical volume "lv1" created
lvdisplay 显示LV的详细信息,用lvs也可以显示LV的信息
[root@Redhat6 ~]# lvdisplay --- Logical volume --- LV Path /dev/myvg/lv1 LV Name lv1 VG Name myvg LV UUID 7Ewvyg-pEFI-o4XL-kFDa-Jtvl-hmak-5fg3qT LV Write Access read/write LV Creation host, time Redhat6, 2013-07-23 05:42:33 +0800 LV Status available # open 0 LV Size 5.00 GiB #创建一个5G的lv Current LE 1280 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:4
lvremove 移除lv,需要移除lv的设备文件:
/dev/myvg/lv1或者/dev/mapper/myvg-lv1
[root@Redhat6 ~]# lvremove /dev/myvg/lv1 Do you really want to remove active logical volume lv1? [y/n]: y Logical volume "lv1" successfully removed
lvextend 扩展LV
先确定要扩展多大-->确定当前VG有足够的空闲空间-->扩展(1、物理边界---2、逻辑边界)
当VG不够时,先增加PV,在扩展VG,最后在VG上面扩展LV。
[root@Redhat6 ~]# mke2fs -t ext4 /dev/myvg/lv1 #先把lv格式化 [root@Redhat6 ~]# lvextend -L +4G /dev/myvg/lv1 #实现物理扩容 Extending logical volume lv1 to 9.00 GiB #之前只有5G,现在扩了4G Logical volume lv1 successfully resized [root@Redhat6 ~]# resize2fs /dev/myvg/lv1 #实现逻辑扩容 resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/myvg/lv1 to 2359296 (4k) blocks. The filesystem on /dev/myvg/lv1 is now 2359296 blocks long.
lvreduce 缩小LV
先卸载--->然后减小逻辑边界---->最后减小物理边界--->在检测文件系统 ====谨慎用===
[root@Redhat6 ~]# umount /dev/mapper/myvg-lv1 [root@Redhat6 ~]# e2fsck -f /dev/myvg/lv1 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 /dev/myvg/lv1: 13/589824 files (0.0% non-contiguous), 73829/2359296 blocks [root@Redhat6 ~]# resize2fs /dev/myvg/lv1 7G #把lv减少到7G,减少了2G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/myvg/lv1 to 524288 (4k) blocks. The filesystem on /dev/myvg/lv1 is now 524288 blocks long. [root@Redhat6 ~]# lvs #查看lv的大小发现并没有实际的减少 LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv1 myvg -wi-a---- 9.00g root vg0 -wi-ao--- 20.00g swap vg0 -wi-ao--- 2.00g usr vg0 -wi-ao--- 10.00g var vg0 -wi-ao--- 20.00g [root@Redhat6 ~]# lvreduce -L -2G /dev/myvg/lv1 #减少lv的物理边界,指定减少2G WARNING: Reducing active logical volume to 7.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv1? [y/n]: y Reducing logical volume lv1 to 7.00 GiB Logical volume lv1 successfully resized [root@Redhat6 ~]# lvs #查看lv的大小发现已经实际的减少了 LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv1 myvg -wi-a---- 7.00g root vg0 -wi-ao--- 20.00g swap vg0 -wi-ao--- 2.00g usr vg0 -wi-ao--- 10.00g var vg0 -wi-ao--- 20.00g [root@Redhat6 ~]# e2fsck -f /dev/myvg/lv1 #减少之后检查文件系统 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 /dev/myvg/lv1: 13/131072 files (0.0% non-contiguous), 43698/524288 blocks
二、LVM的第二个特性,在备份数据的时候创键快照卷
当需要备份LV里面的数据时,且LV的数据也在进行写操作时,这个时候创建快照就很有必要了,快照是一个访问LV里面数据的一个通道,他不会保存LV里面所有的数据,当LV某些PE里面数据变化时,快照保存之前PE的数据,未变化的PE将不会被保存。
步骤:
分区--->创建PV--->创建VG--->创建LV--->格式化LV为ext4--->挂载--->写入数据--->需要备份(创建快照)--->创建快照卷--->再次继续写入数据---->挂载快照卷--->备份之前的数据到快照卷里面--->卸载快照--->删除快照卷
root@station128 ~]# fdisk /dev/sda #先建立两个逻辑分区,大小为10G Command (m for help): n First cylinder (9165-15665, default 9165): Using default value 9165 Last cylinder, +cylinders or +size{K,M,G} (9165-15665, default 15665): +10G Command (m for help): t Partition number (1-5): 5 Hex code (type L to list codes): 8e #并改为LVM文件系统 Changed system type of partition 5 to 8e (Linux LVM) Command (m for help): n First cylinder (10471-15665, default 10471): Using default value 10471 Last cylinder, +cylinders or +size{K,M,G} (10471-15665, default 15665): +10G Command (m for help): t Partition number (1-6): 6 Hex code (type L to list codes): 8e Changed system type of partition 6 to 8e (Linux LVM) Command (m for help): w [root@Redhat6 ~]# pvcreate /dev/sda5 /dev/sda6 #创建PV Physical volume "/dev/sda5" successfully created Physical volume "/dev/sda6" successfully created [root@Redhat6 ~]# vgcreate -s 8M myvg /dev/sda5 /dev/sda6 #创建VG,并指定PE为8M Volume group "myvg" successfully created [root@Redhat6 ~]# lvcreate -L 4G -n lv1 myvg #创建LV为4G Logical volume "lv1" created [root@Redhat6 ~]# mkfs -t ext4 /dev/myvg/lv1 #格式化LV为ext4 [root@Redhat6 ~]# blkid #显示设备的UUID及文件系统类型,及卷标 /dev/mapper/vg0-var: UUID="c9776f08-bbaf-4a36-a009-3e16a09ad924" TYPE="ext4" /dev/sda1: UUID="dc3cc214-a9f6-4730-a186-d08765ccfa4f" TYPE="ext4" /dev/sda2: UUID="zPpbgE-0Ip7-A4m2-GG4K-sBrC-eUeU-V8VdCI" TYPE="LVM2_member" /dev/sda5: UUID="e5eLw1-JTrG-H9Q7-18qA-SrPV-axMc-QLPW5M" TYPE="LVM2_member" /dev/sda6: UUID="7OOZcJ-XzLf-zJJq-JbdF-e386-xCTl-Ym2UE3" TYPE="LVM2_member" /dev/mapper/vg0-root: UUID="bae7835a-af3b-4935-a04b-5932b2fc123b" TYPE="ext4" /dev/mapper/vg0-swap: UUID="3e0cb4a7-d393-4f75-af12-1fe6e8c96273" TYPE="swap" /dev/mapper/vg0-usr: UUID="46d516b8-03ea-4c0d-bb03-0e9d6893bd1a" TYPE="ext4" /dev/mapper/myvg-lv1: UUID="2d44718c-993d-42e6-896b-05e06af45aee" TYPE="ext4" [root@Redhat6 ~]# mkdir /mnt/lv1 #创建LV的挂载点 [root@Redhat6 ~]# mount /dev/myvg/lv1 /mnt/lv1/ #挂载LV [root@Redhat6 ~]# cd /mnt/lv1/ #进入到LV的挂载点 [root@Redhat6 lv1]# ls lost+found [root@Redhat6 lv1]# cp /etc/rc.sysinit /etc/inittab ./ #copy一个文件到LV的挂载目录里面 [root@Redhat6 lv1]# ls inittab lost+found rc.sysinit [root@Redhat6 lv1]# lvcreate -L 50M -s -p r -n MY_SNAP /dev/myvg/lv1 #创建快照卷为50M,且只能读,名称为MY_SNAP Rounding up size to full physical extent 56.00 MiB Logical volume "MY_SNAP" created [root@Redhat6 lv1]# mkdir /mnt/snap #创建快照卷的挂载点 [root@Redhat6 lv1]# mount /dev/myvg/MY_SNAP /mnt/snap/ #挂载快照卷 mount: block device /dev/mapper/myvg-MY_SNAP is write-protected, mounting read-only [root@Redhat6 lv1]# mkdir /backup #创建备份目录 [root@Redhat6 lv1]# tar -jcf /backup/lv1.tar.bz2 /mnt/snap/* #把快照卷里面的数据归档 tar: Removing leading `/' from member names [root@Redhat6 lv1]# cp /etc/fstab /mnt/lv1/ #copy文件到LV文件,使LV文件与之前快照的文件有所改变 [root@Redhat6 lv1]# umount /dev/myvg/MY_SNAP #备份完成后,卸载快照卷的挂载点 [root@Redhat6 lv1]# lvremove /dev/myvg/MY_SNAP #移除快照卷 Do you really want to remove active logical volume MY_SNAP? [y/n]: y Logical volume "MY_SNAP" successfully removed [root@Redhat6 lv1]# cd /mnt/lv1/ [root@Redhat6 lv1]# ls #可以查看到LV文件里面有3个文件 fstab inittab lost+found rc.sysinit [root@Redhat6 lv1]# cd /backup/ [root@Redhat6 backup]# tar xf lv1.tar.bz2 #解压之前备份的文件 [root@Redhat6 backup]# ls lv1.tar.bz2 mnt [root@Redhat6 backup]# cd mnt/lv1/ [root@Redhat6 lv1]# ls #查看到快照只备份了之前的文件 inittab lost+found rc.sysinit [root@Redhat6 lv1]#