一、LVM简介
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。
二、常用术语
物理存储介质:指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
物理卷(PV):指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(VG) :类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
逻辑卷(LV) :类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
物理块(PE) :每一个物理卷PV被划分为称为PE的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。
逻辑块(LE): 逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
LVM抽象模型:
三、搭建LVM
本例linux系统为CentOS 6.6;
1、安装lvm
[root@hpf-linux ~]# yum install -y lvm2
2、创建物理存储介质
为避免浪费篇幅就将创建物理存储介质的步骤省略,创建步骤就按磁盘分区的步骤差不多,不过需要更改创建类型为8e(Linux LVM);
[root@hpf-linux~]# fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (1308-2610, default 1308): Using default value 1308 Last cylinder, +cylinders or +size{K,M,G} (1308-2610, default 2610): +2G Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): 8e Changed system type of partition 3 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xb7c76144 Device Boot Start End Blocks Id System /dev/sdb1 1 784 6297448+ 8e Linux LVM /dev/sdb2 785 1307 4200997+ 8e Linux LVM /dev/sdb3 1308 1569 2104515 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table.
3、创建物理卷
[root@hpf-linux~]# pvcreate /dev/sdb{1,2,3,} //创建物理卷 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created Physical volume "/dev/sdb3" successfully created Device /dev/sdb not found (or ignored by filtering). [root@hpf-linux~]# pvs //简单显示物理卷信息 PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- 6.01g 6.01g /dev/sdb2 lvm2 --- 4.01g 4.01g /dev/sdb3 lvm2 --- 2.01g 2.01g [root@hpf-linux ~]# pvdisplay //显示系统是物理卷的详细信息 "/dev/sdb1" is a new physical volume of "6.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 6.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID Crxaq7-He6i-bmN3-9CFO-azWN-s1Uz-7kXLP0 "/dev/sdb2" is a new physical volume of "4.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 4.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID uNxVQf-9plR-gwEV-Het2-WB2o-NYko-LKfcX2 "/dev/sdb3" is a new physical volume of "2.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb3 VG Name PV Size 2.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID x4j5VX-2VF2-aFgs-6mwo-eMmN-m9OM-La3GxG
4、创建逻辑卷组
在创建前用vgs命令查看当前系统上是否创建的有vg,若有则不能在同一系统创建同名的vg;
[root@hpf-linux~]# vgs No volume groups found [root@hpf-linux~]# vgcreate vg1 /dev/sdb{1,2,3} //创建 Volume group "vg1" successfully created [root@hpf-linux~]# vgs VG #PV #LV #SN Attr VSize VFree vg1 3 0 0 wz--n- 12.01g 12.01g [root@hpf-linux ~]# vgdisplay //查看创建逻辑卷组的信息 --- Volume group --- VG Name vg1 System ID Format lvm2 Metadata Areas 3 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 3 Act PV 3 VG Size 12.01 GiB PE Size 4.00 MiB Total PE 3075 Alloc PE / Size 0 / 0 Free PE / Size 3075 / 12.01 GiB VG UUID GxPcdn-C9Dl-YOmz-EjHo-pvu0-dVWK-wgpmkc
通过上例可以看出物理块(PE)大小为默认的4M,若想更改只能删除逻辑卷组从新创建,同时创建时要用到 -s 选项指定块大小,同时切记你的物理卷上一段不要有数据,不然会删除你的数据的,创建后可以发现你的物理卷(PV)上的物理块(PE)会从4M变为8M。
[root@hpf-linux~]# vgremove vg1 //移除逻辑卷组,切记物理卷组上有数据一定不要这么玩,不然你会死的很惨! Volume group "vg1" successfully removed [root@hpf-linux~]# vgs No volume groups found [root@hpf-linux~]# vgcreate -s 8M vg1 /dev/sdb{1,2,3} //指定PE大小为8M Volume group "vg1" successfully created [root@hpf-linux~]# vgdisplay --- Volume group --- VG Name vg1 System ID Format lvm2 Metadata Areas 3 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 3 Act PV 3 VG Size 12.00 GiB PE Size 8.00 MiB Total PE 1536 Alloc PE / Size 0 / 0 Free PE / Size 1536 / 12.00 GiB VG UUID nD4VhC-o2EW-zk4Q-5Nsh-f2WC-0Czs-C79Qk8 [root@hpf-linux ~]# pvdisplay /dev/sdb1 --- Physical volume --- PV Name /dev/sdb1 VG Name vg1 PV Size 6.01 GiB / not usable 5.85 MiB Allocatable yes PE Size 8.00 MiB Total PE 768 Free PE 768 Allocated PE 0 PV UUID Crxaq7-He6i-bmN3-9CFO-azWN-s1Uz-7kXLP0
5、在逻辑卷组中继续添加新的物理卷
大概步骤:
1.准备要添加的物理卷
2 扩展卷组:
添加物理卷至卷组中
vgextend vg_name /path/to/device
首先,用fdisk分区工具添加一个3G的磁盘/dev/sdc1。
[root@hpf-linux~]# pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created [root@hpf-linux~]# vgextend vg1 /dev/sdc1 Volume group "vg1" successfully extended [root@hpf-linux~]# vgdisplay --- Volume group --- VG Name vg1 System ID Format lvm2 Metadata Areas 4 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 4 Act PV 4 VG Size 15.01 GiB PE Size 8.00 MiB Total PE 1921 Alloc PE / Size 0 / 0 Free PE / Size 1921 / 15.01 GiB VG UUID nD4VhC-o2EW-zk4Q-5Nsh-f2WC-0Czs-C79Qk8
6、在逻辑卷组中移除物理卷
大概步骤:
1.确定要移除的物理卷的总空间大小,要小于VG当前的可用空间大小
2.将要移除的物理卷上的所有pe移动至其他PV
pvmove /path/to/pv_device
3.缩减vg
#vgreduce vg_name /path/to/pv/device
首先,你要保证你要移除的物理卷大小远远大于逻辑卷组中空闲的磁盘空间,同时在移除前要将数据给别的磁盘,在做此步时一定要小心不然删除了数据,剩下的你自己想把!
[root@hpf-linux~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 vg1 lvm2 a-- 6.00g 6.00g /dev/sdb2 vg1 lvm2 a-- 4.00g 4.00g /dev/sdb3 vg1 lvm2 a-- 2.00g 2.00g /dev/sdc1 vg1 lvm2 a-- 3.01g 3.01g [root@hpf-linux~]# pvmove /dev/sdb3 //移除物理卷上的数据,此步是关键!由于没有数据所以很快 No data to move for vg1 [root@hpf-linux~]# vgreduce vg1 /dev/sdb3 Removed "/dev/sdb3" from volume group "vg1" [root@hpf-linux ~]# vgdisplay vg1 --- Volume group --- VG Name vg1 System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 3 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 13.01 GiB PE Size 8.00 MiB Total PE 1665 Alloc PE / Size 0 / 0 Free PE / Size 1665 / 13.01 GiB VG UUID nD4VhC-o2EW-zk4Q-5Nsh-f2WC-0Czs-C79Qk8 [root@hpf-linux ~]# pvremove /dev/sdb3 Labels on physical volume "/dev/sdb3" successfully wiped [root@hpf-linux ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 vg1 lvm2 a-- 6.00g 6.00g /dev/sdb2 vg1 lvm2 a-- 4.00g 4.00g /dev/sdc1 vg1 lvm2 a-- 3.01g 3.01g
7、创建逻辑卷(LV)
创建逻辑卷命令lvcreate常用选项:
-n:指定名称
-L: 指定大小
-l:%vg|pvs|FREE,打算分配%
[root@hpf-linux~]# lvs //提前查看下逻辑卷,避免创建时同名 [root@hpf-linux~]# lvcreate -L 4G -n testlv vg1 Logical volume "testlv" created [root@hpf-linux~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testlv vg1 -wi-a----- 4.00g [root@hpf-linux~]# lvdisplay /dev/vg1/testlv //查看逻辑卷的详细信息 --- Logical volume --- LV Path /dev/vg1/testlv LV Name testlv VG Name vg1 LV UUID E6bd3O-cH27-OE7D-dBCo-03qj-Vr4J-MDNRQH LV Write Access read/write LV Creation host, time hpf-linux, 2015-07-06 08:00:27 +0800 LV Status available # open 0 LV Size 4.00 GiB Current LE 512 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 [root@hpf-linux ~]# mke2fs -t ext4 -L DATA /dev/vg1/testlv //格式化逻辑卷testlv [root@hpf-linux ~]# mount /dev/vg1/testlv /tmp/data/ [root@hpf-linux ~]# ls /tmp/data/ lost+found [root@hpf-linux ~]# cp /etc/[a-e]* /tmp/data/ [root@hpf-linux ~]# ls /tmp/data/ adjtime asound.conf crontab DIR_COLORS environment aliases bashrc crypttab DIR_COLORS.256color ethers aliases.db centos-release csh.cshrc DIR_COLORS.lightbgcolor exports anacrontab cron.deny csh.login dracut.conf lost+found
8、扩展逻辑卷
逻辑卷扩展的步骤:
a、先确保扩展的大小;并确保所属的卷组有足够的剩余空间
b、扩展物理边界
lvextend -L [+]size /path/to/lv_device
c、扩展逻辑边界
resize2fs /path/to/lv_devive
扩展前要查看你的逻辑卷组是否有多余的空间来给你添加逻辑卷,同时最好将挂载的逻辑卷给卸载后检测下文件是否有故障,若没有则要按5的步骤来在逻辑卷组中添加物理卷。
[root@hpf-linux~]# vgs VG #PV #LV #SN Attr VSize VFree vg1 3 1 0 wz--n- 13.01g 9.01g [root@hpf-linux~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testlv vg1 -wi-ao---- 4.00g [root@hpf-linux~]# lvextend -L 6G /dev/vg1/testlv //添加大小有两种格式6G为增加到6G,+4G为在原有存储空间基础上增加4G。 Size of logical volume vg1/testlv changed from 4.00 GiB (512 extents) to 6.00 GiB (768 extents). Logical volume testlv successfully resized [root@hpf-linux~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testlv vg1 -wi-ao---- 6.00g [root@hpf-linux~]# df -h //可以看到只是将逻辑卷给增加了,但文件系统并没有识别 Filesystem Size Used Avail Use% Mounted on /dev/sda5 13G 2.6G 9.5G 22% / tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 190M 24M 157M 13% /boot /dev/sda2 4.7G 9.9M 4.5G 1% /home /dev/mapper/vg1-testlv 3.9G 8.1M 3.7G 1% /tmp/data [root@hpf-linux~]# resize2fs /dev/vg1/testlv //识别文件系统默认什么都不加为更新到最新的大小 resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/vg1/testlv is mounted on /tmp/data; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/vg1/testlv to 1572864 (4k) blocks. The filesystem on /dev/vg1/testlv is now 1572864 blocks long. [root@hpf-linux ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 13G 2.6G 9.5G 22% / tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 190M 24M 157M 13% /boot /dev/sda2 4.7G 9.9M 4.5G 1% /home /dev/mapper/vg1-testlv 5.8G 8.1M 5.5G 1% /tmp/data
9、缩减逻辑卷
此步骤请慎用,若自己操作把数据丢失,那。。。。。
缩减逻辑卷的步骤:
a、卸载卷,并执行强制检查
e2fsck -f /path/to/lv_devive
b、缩减逻辑边界
resize2fs /path/to/lv_device SIZE
c、缩减物理边界:
lvreduce -L [-]size /path/to/lv_device
d、挂载卷
[root@hpf-linux~]# umount /dev/vg1/testlv [root@hpf-linux~]# ls /tmp/data/ [root@hpf-linux~]# e2fsck -f /dev/vg1/testlv e2fsck 1.41.12 (17-May-2010) 第一步: 检查inode,块,和大小 第二步: 检查目录结构 第3步: 检查目录连接性 Pass 4: Checking reference counts 第5步: 检查簇概要信息 DATA: 30/393216 files (0.0% non-contiguous), 59522/1572864 blocks [root@hpf-linux~]# resize2fs /dev/vg1/testlv 3G //先缩减文件系统 resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/vg1/testlv to 786432 (4k) blocks. The filesystem on /dev/vg1/testlv is now 786432 blocks long. [root@hpf-linux~]# lvreduce -L 3G /dev/vg1/testlv //在缩减逻辑卷 WARNING: Reducing active logical volume to 3.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce testlv? [y/n]: y Size of logical volume vg1/testlv changed from 6.00 GiB (768 extents) to 3.00 GiB (384 extents). Logical volume testlv successfully resized [root@hpf-linux~]# mount /dev/vg1/testlv /tmp/data/ [root@hpf-linux~]# ls /tmp/data/ adjtime asound.conf crontab DIR_COLORS environment aliases bashrc crypttab DIR_COLORS.256color ethers aliases.db centos-release csh.cshrc DIR_COLORS.lightbgcolor exports anacrontab cron.deny csh.login dracut.conf lost+found [root@hpf-linux ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testlv vg1 -wi-ao---- 3.00g [root@hpf-linux ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 13G 2.6G 9.5G 22% / tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 190M 24M 157M 13% /boot /dev/sda2 4.7G 9.9M 4.5G 1% /home /dev/mapper/vg1-testlv 2.9G 6.1M 2.7G 1% /tmp/data [root@hpf-linux ~]# lvdisplay --- Logical volume --- LV Path /dev/vg1/testlv LV Name testlv VG Name vg1 LV UUID E6bd3O-cH27-OE7D-dBCo-03qj-Vr4J-MDNRQH LV Write Access read/write LV Creation host, time hpf-linux, 2015-07-06 08:00:27 +0800 LV Status available # open 1 LV Size 3.00 GiB Current LE 384 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 [root@hpf-linux ~]# vgs VG #PV #LV #SN Attr VSize VFree vg1 3 1 0 wz--n- 13.01g 10.01g
10、创建逻辑卷快照
快照也是逻辑卷的一种,提供过去某一时间的元卷的通道
lvcreate -s -L Size -n name 卷组名 -p r,rw /path/to/lv_devsive
-p:访问权限
[root@hpf-linux ~]# lvcreate -s -L 50M -n testlv_snap -p r /dev/vg1/testlv Rounding up size to full physical extent 56.00 MiB Logical volume "testlv_snap" created [root@hpf-linux ~]# mkdir /tmp/data_snap [root@hpf-linux ~]# mount /dev/vg1/testlv_snap /tmp/data_snap/ mount: block device /dev/mapper/vg1-testlv_snap is write-protected, mounting read-only [root@hpf-linux ~]# cd /tmp/data [root@hpf-linux data]# vim + crontab [root@hpf-linux data]# cat crontab ............. # * * * * * user-name command to be executed bols longls [root@hpf-linux ~]# cd /tmp/data_snap [root@hpf-linux data_snap]# cat crontab ........... # * * * * * user-name command to be executed [root@hpf-linux data_snap]# tar -Jcf /tmp/data.tar.xz /tmp/data_snap/* [root@hpf-linux tmp]# ls /tmp/data.tar.xz /tmp/data.tar.xz [root@hpf-linux data_snap]# cd .. [root@hpf-linux tmp]# umount /tmp/data_snap/ [root@hpf-linux tmp]# lvremove /dev/vg1/testlv_snap Do you really want to remove active logical volume testlv_snap? [y/n]: y Logical volume "testlv_snap" successfully removed