LVM使用指南

看来说了这么多期cluster这期给大家换个胃口,我的文章中还没出现基础使用linux的相关文章我打算将其补上。由于LVM文件系统是在企业中经常使用,甚至mariadb等备份也可以使用lvm文件系统的快照功能进行备份,所以这一期给补上!

什么是LVM文件系统?

LVM是Logical Volume Manager(逻辑卷管理)的简写, 它是Linux环境下实现将多个磁盘抽象成一个磁盘,让Linux操作者能够简单的对其进行分区、扩容、缩小、管理。对于企业来说可是大大的福利(毕竟扩容磁盘是经常要干的事!),不过对于现在来说LVM2(第二版)才是我们常用的LVM版本。

LVM文件系统的层次

表面上看上去LVM非常高大上,不过对于LVM的底层来说还是比较复杂的。LVM通过OS内核的dm(device mapper)设备映射组件,将一个或多个地层块设备组织成一个逻辑设备的模块,模块文件在/dev/dm。LVM一共分为三个层次:

PV(Physical volume)物理卷:最底层的模块,主要是物理磁盘分区或者是物理磁盘。

VG(Volume group )卷组:主要是将多个物理卷整理成一个集合形成一个卷组。

LV(Logical volume )逻辑卷:通过卷组进行分区,和在硬盘上分区感觉类似。

接下来上个手绘图给你们看看:

这样三层的关系够清楚了吧?PV肯定是最底层的然后以此向上,其实VG才是关键!

说了这么多的LVM的理论,现在来看看怎么来创建LVM、扩容、缩减以及快照功能的使用!

创建LVM2:

首先我来给虚拟机创建一块50GB的硬盘,首先在新的硬盘上划分分区:

[root@localhost ~] fdisk -l /dev/sdb #创建磁盘之后查看一下硬盘
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@localhost ~] fdisk /dev/sdb #首先为sdb分区并且添加文件系统
Command (m for help): n #创建一个新分区
Partition type:
 p primary (0 primary, 0 extended, 4 free)
 e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-104857599, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-104857599, default 104857599): +10G
#第一个分区我分配10G
Partition 1 of type Linux and of size 10 GiB is set
Command (m for help): t #修改文件系统号
Selected partition 1
Hex code (type L to list all codes): 8e #lvm是8e的号码
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): n #随后我再创建一个分区
Partition type:
 p primary (1 primary, 0 extended, 3 free)
 e extended
Select (default p):
Using default response p
Partition number (2-4, default 2):
First sector (20973568-104857599, default 20973568):
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-104857599, default 104857599): +20G
#第二个分区我改为20G
Partition 2 of type Linux and of size 20 GiB is set
Command (m for help): t #修改第二个文件系统号
Partition number (1,2, default 2): 8e
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p #添加完我来看看添加的咋样
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x2af1f135

 Device Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 8e Linux LVM
/dev/sdb2 20973568 62916607 20971520 8e Linux LVM

Command (m for help): w #保存修改
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

物理分区就到此结束,总结一下:主要我创建了两个主分区,使用“n”创建分区随后根据提示选择主分区号大小等信息,随后更改分区类型(改为LVM:8e)我现在添加了两个分区供给pv让其转换为物理卷:

[root@localhost ~]# pvcreate
-bash: pvcreate: command not found
#竟然没有这个命令?如果你和我一样喜欢折腾最小化安装默认没有lvm2的工具包
#所以需要使用yum进行安装!
[root@localhost ~] yum install lvm2 #安装即可
[root@localhost ~] pvcreate /dev/sdb1
 Physical volume "/dev/sdb1" successfully created.
[root@localhost ~] pvcreate /dev/sdb2
 Physical volume "/dev/sdb2" successfully created.
#由于在sdb上有两个物理分区所以要创建两个物理卷
[root@localhost ~] pvs #查看物理卷,两个都添加OK了。
 PV VG Fmt Attr PSize PFree
 /dev/sdb1 lvm2 --- 10.00g 10.00g
 /dev/sdb2 lvm2 --- 20.00g 20.00g

最底层的物理卷的容量已经准备好了,一共30G接下来开始创建VG(卷组):

[root@localhost ~] vgcreate testvg /dev/sdb1 /dev/sdb2
 Volume group "testvg" successfully created
#我给VG组起了一个名字为testvg将物理分区sdb1和sdb2放入。
[root@localhost ~]# vgs #简单查看一下vg的容量,是不是30G?
 VG #PV #LV #SN Attr VSize VFree
 testvg 2 0 0 wz--n- 29.99g 29.99g
[root@localhost ~]# vgdisplay #甚至可以查看详细信息,不过pv也有这个命令
 --- 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 29.99 GiB
 PE Size 4.00 MiB
 Total PE 7678
 Alloc PE / Size 0 / 0
 Free PE / Size 7678 / 29.99 GiB
 VG UUID Re4gP0-XMc9-MEIO-HEhj-A3uZ-Q75x-BudA2I

现在底层的东西已经创建完毕了,就剩下“分区”了就是lv逻辑卷的分割,这里我创建两个分区一个15G一个14G(因为一共只有29.99G所以不能对半分…):

[root@localhost ~] lvcreate -L 15G -n lvs_test1 testvg
#创建一个叫lvs_test1的逻辑卷并且所属VG组为testvg
 Logical volume "lvs_test1" created.
[root@localhost ~] lvcreate -L 15G -n lvs_test2 testvg
 Volume group "testvg" has insufficient free space (3838 extents): 3840 required.
#vg空间不够悲剧...
[root@localhost ~] lvcreate -L 14G -n lvs_test2 testvg
 Logical volume "lvs_test2" created.

创建完毕逻辑卷之后肯定是无法直接使用(原谅作者话痨,说废话…),必须首先给这个分区选择一个文件系统然后挂载才能进行使用。

[root@localhost /] mke2fs -t ext4 -b 4096 /dev/testvg/lvs_test1
#首先创建好的逻辑卷在/dev/你的VG卷组名/你的lv分区名。
#然后使用文件系统命令给予一个文件系统然后格式化才能挂载。
[root@localhost /] mke2fs -t ext4 -b 4096 /dev/testvg/lvs_test2
[root@localhost /] mkdir test1 #创建一个文件夹
[root@localhost /] mount /dev/testvg/lvs_test1 /test1/ #挂载
[root@localhost /] cd test1/
[root@localhost test1]# ll
total 16
drwx------ 2 root root 16384 Mar 29 14:19 lost+found
#另一个test2的lv卷同理

好了关于创建一个LVM2文件系统已经讲完了,不过这里有个问题,有时候公司会新买硬盘给服务器安装然后想要给某一个分区进行扩容(一般都是服务器 | 存储新增硬盘时候扩容)这时候该怎么办呢?

给LVM2扩容:

首先扩容主要是给lv逻辑卷扩容,但是首先要看看VG卷组的空间是否足够?pv的空间是否足够?才能进行扩容。所以我来依据刚刚创建LVM2的示例对lvs_test2逻辑卷进行扩容10G。

首先我们查看vg卷组是否有多余的10G:

[root@localhost /]# vgs
 VG #PV #LV #SN Attr VSize VFree
 testvg 2 2 0 wz--n- 29.99g 1016.00m
#看到VFree只有1G左右了显然不够,所以我再看看PV还剩下的空间
[root@localhost /]# pvs
 PV VG Fmt Attr PSize PFree
 /dev/sdb1 testvg lvm2 a-- 10.00g 0
 /dev/sdb2 testvg lvm2 a-- 20.00g 1016.00m
#显然结果就是这样还是不够就剩1G左右

接下来我肯定对原有的磁盘进行再物理分区->创建pv->创建VG->扩容LV,这里我就直接帖命令一笔带过不手把手教了:

[root@localhost ~] fdisk /dev/sdb
Command (m for help): n
Partition type:
 p primary (2 primary, 0 extended, 2 free)
 e extended
Select (default p): p
Partition number (3,4, default 3):
First sector (62916608-104857599, default 62916608):
Using default value 62916608
Last sector, +sectors or +size{K,M,G} (62916608-104857599, default 104857599): +10G
Partition 3 of type Linux and of size 10 GiB is set

Command (m for help): t
Partition number (1-3, default 3):
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): p

Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x2af1f135

 Device Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 8e Linux LVM
/dev/sdb2 20973568 62916607 20971520 8e Linux LVM
/dev/sdb3 62916608 83888127 10485760 8e Linux LVM

Command (m for help): w
The partition table has been altered!
#好了物理分区我新增了10G空间随后创建PV
[root@localhost ~] pvcreate /dev/sdb3 #没有sdb3重启系统就有
 Physical volume "/dev/sdb3" successfully created.
[root@localhost ~] pvs
 PV VG Fmt Attr PSize PFree
 /dev/sdb1 testvg lvm2 a-- 10.00g 0
 /dev/sdb2 testvg lvm2 a-- 20.00g 1016.00m
 /dev/sdb3 lvm2 --- 10.00g 10.00g
#空间来了,接下来开始扩容VG卷组
[root@localhost ~] vgextend testvg /dev/sdb3
 Volume group "testvg" successfully extended
[root@localhost ~] vgs
 VG #PV #LV #SN Attr VSize VFree
 testvg 3 2 0 wz--n- 39.99g 10.99g
#VG卷组也有10G的空间了,接下来最后一步我们给lv逻辑卷(lvm_test2)扩容10G
[root@localhost ~] lvextend -L +10g /dev/testvg/lvs_test2 #添加X容量给lv(找到lv卷位置就行)
 Size of logical volume testvg/lvs_test2 changed from 14.00 GiB (3584 extents) to 24.00 GiB (6144 extents).
 Logical volume testvg/lvs_test2 successfully resized.
[root@localhost ~] resize2fs /dev/testvg/lvs_test2 #重新刷新
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/testvg/lvs_test2 is mounted on /test2; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/testvg/lvs_test2 is now 6291456 blocks long.
[root@localhost ~] vgs #查看vg是不是10G容量少了
 VG #PV #LV #SN Attr VSize VFree
 testvg 3 2 0 wz--n- 39.99g 1012.00m
[root@localhost ~]# lvs #查看lv逻辑卷lvs_test2现在变为24G了。
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 lvs_test1 testvg -wi-ao---- 15.00g
 lvs_test2 testvg -wi-ao---- 24.00g

给lv逻辑卷扩容也说好了,接下来当然有了扩容必须有缩减,不过这个操作就是作死行为我这里只是给大家示范一下千万别再生产环境中使用。为什么?原因很简单,减少容量就定义了减少了最底层的磁盘扇区,由于存储内容并不是手动定义分配哪些扇区给文件使用(系统定义),所以一旦渐少逻辑卷容量如果有些内容在逻辑卷减少容量的磁盘扇区内容咋办?很可能造成数据损坏或丢失!所以切记不要使用,如果没有存储数据是自己分配错了可以操作!

缩减lvm的存储空间:

千万记住:如果是你在新机器划分错了,或者领导感觉这样划分不妥重新修改。总之就是该机器没上线的情况下可以缩减空间。如果该机器上线了并且已经存储了数据请千万别使用缩减命令否则可能会酝酿一起事故!轻则回家待业,重责家毁人亡(感觉我说的好严重…)。命令有风险,输入需谨慎!

现在展示一下怎么对lvs_test2缩减10G的空间:

[root@localhost ~] umount /dev/testvg/lvs_test2
#首先卸载下之前挂载在/test2的lv逻辑卷,因为缩减空间得从lv进行缩减!
[root@localhost ~] e2fsck -f /dev/testvg/lvs_test2 #检查缩减的lv卷
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/testvg/lvs_test2: 11/1572864 files (0.0% non-contiguous), 142759/6291456 blocks
[root@localhost ~] resize2fs /dev/testvg/lvs_test2 14g #重新定义lvs_test2的大小
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/testvg/lvs_test2 to 3670016 (4k) blocks.
The filesystem on /dev/testvg/lvs_test2 is now 3670016 blocks long.
[root@localhost ~] lvreduce -L -10G /dev/testvg/lvs_test2 #缩减lvs_test2空间10G
 WARNING: Reducing active logical volume to 14.00 GiB.
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce testvg/lvs_test2? [y/n]: y
 Size of logical volume testvg/lvs_test2 changed from 24.00 GiB (6144 extents) to 14.00 GiB (3584 extents).
 Logical volume testvg/lvs_test2 successfully resized.
#接下看看看vg空间和lv空间情况:
[root@localhost ~]# vgs
 VG #PV #LV #SN Attr VSize VFree
 testvg 3 2 0 wz--n- 39.99g 10.99g
[root@localhost ~]# lvs
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 lvs_test1 testvg -wi-ao---- 15.00g
 lvs_test2 testvg -wi-a----- 14.00g

缩减完lv逻辑卷的空间接下来缩减vg卷组的大小…我又想说命令有风险,输入需谨慎!

[root@localhost ~] vgreduce testvg /dev/sdb3
 Removed "/dev/sdb3" from volume group "testvg"
#注意:缩减vg卷组的大小只能一个pv一个pv的大小减少否则pv就无法删除了!!!
#然后再查看vg的大小:
[root@localhost ~] vgs
 VG #PV #LV #SN Attr VSize VFree
 testvg 2 2 0 wz--n- 29.99g 1016.00m

vg卷组的容量少了10G,接下来我一不做二不休直接缩减pv的大小!对了pv只能删除,因为pv是底层的物理逻辑模块!

[root@localhost ~] pvremove /dev/sdb3 #删除sdb3
 Labels on physical volume "/dev/sdb3" successfully wiped.
[root@localhost ~] pvs #查看pv
 PV VG Fmt Attr PSize PFree
 /dev/sdb1 testvg lvm2 a-- 10.00g 0
 /dev/sdb2 testvg lvm2 a-- 20.00g 1016.00m

好了世界清静了,10G容量终于删除完毕!

关于LVM的快照:

现在说一个最后的话题,也是最关键的就是关于lvm的快照!所谓快照就是拍摄一个系统在指定时间的状态,如果出现问题就能还原回快照拍摄时间的状态!lvm就有该功能的文件系统,所以有很多企业都喜欢使用lvm就是这个原因!现在来看看如果创建和恢复快照:

我就拿刚刚创建的lvs_test2的逻辑卷为例子,创建文件然后进行拍摄快照,随后我把文件内容删除然后再使用快照恢复将消失的文件恢复回来。(我的例子可别往了查看是否挂载在test2文件中?)

首先我在lvs_test2中创建文件并生成快照:

[root@localhost ~] vi /test2/test
hello world
#添加好信息以后开始创建快照:
[root@localhost ~] lvcreate -L 128M -s /dev/testvg/lvs_test2 -n data-back
#添加快照-s后面跟上添加快照的磁盘 -n后面跟上快照名 -L表示快照的大小(自定义可别指小)
 Using default stripesize 64.00 KiB.
 Logical volume "data-back" created.
[root@localhost ~] cd /dev/testvg/
[root@localhost testvg] ll
lrwxrwxrwx 1 root root 7 Mar 29 15:40 data-back -> ../dm-4 #快照文件找到
lrwxrwxrwx 1 root root 7 Mar 29 14:39 lvs_test1 -> ../dm-0
lrwxrwxrwx 1 root root 7 Mar 29 15:40 lvs_test2 -> ../dm-1
[root@localhost testvg] lvs
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 data-back testvg swi-a-s--- 128.00m lvs_test2 0.00 #快照出现
 lvs_test1 testvg -wi-ao---- 15.00g
 lvs_test2 testvg owi-aos--- 14.00g
[root@localhost testvg] lvdisplay #查看详细信息找到快照那一栏
 --- Logical volume ---
 LV Path /dev/testvg/data-back #这里
 LV Name data-back
 VG Name testvg
 LV UUID 2mAxEb-zeVF-Yal2-Cczw-PtcO-Rh9E-N1wOge
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-03-29 15:40:08 +0800
 LV snapshot status active destination for lvs_test2
 LV Status available
 # open 0
 LV Size 14.00 GiB
 Current LE 3584
 COW-table size 128.00 MiB
 COW-table LE 32
 Allocated to snapshot 0.00%
 Snapshot chunk size 4.00 KiB
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:4

好了其实创建好的快照可以直接挂载使用:

[root@localhost dev] mount /dev/testvg/data-back /hello/ #挂载
[root@localhost test2] ls /hello #文件出现
lost+found test

接下来就是复原快照了,恢复快照的方法很多。第一种也是最简单的知道缺失的文件,只需将快照挂载在某个文件中直接找到缺失的文件复制上去即可!第二种方法就是使用tar命令打包,此方法也不错而且很常用,下面来演示一下:

[root@localhost /] mount /dev/testvg/data-back /hello/
#首先挂载在一个文件中
[root@localhost ~] tar -czf /root/hello.tar.gz /hello/
#其实可以直接压缩到自己搭建的NAS存储上面去不需要打包到本次磁盘,这样节约空间
[root@localhost ~]# ll
total 8
-rw-r--r-- 1 root root 187 Mar 29 16:29 hello.tar.gz
#下面就是检验了:
[root@localhost ~] tar -xf hello.tar.gz
[root@localhost ~] cd hello
[root@localhost hello] ll
total 4
drwx------ 2 root root 6 Mar 29 14:19 lost+found
-rw-r--r-- 1 root root 12 Mar 29 15:50 test
[root@localhost hello] cat test
hello world

下面介绍第三种方法,当然也是常用方法就是使用dd命令进行块复制!注意:使用dd命令复制容量可能较大但是数据肯定是完全的。下面演示一下:

[root@localhost hello] dd if=/dev/testvg/data-back of=/dev/testvg/lvs_test2
#直接将快照文件dd复制到lv逻辑卷中
[root@localhost hello] mount /dev/testvg/lvs_test2 /test2/ #挂载查看
[root@localhost hello] cd /test2
[root@localhost test2] cat test #数据回来了
hello world
[root@localhost test2] lvremove -f /dev/testvg/data-back
 Logical volume "data-back" successfully removed
#复制完毕后又需要可以将快照删除

注意:这种复制也有时候可能导致危险,不过最保险的方式就是首先将快照dd到其他地方,随后再dd到lv卷中!比如:

#由于之前快照删除了我又创建了一个快照叫做test2-back
#随后我再将test文件删除!这两步我就不做演示了!
[root@localhost /] dd if=/dev/testvg/test2-back of=/tmp/test2.img
29360128+0 records in
29360128+0 records out
15032385536 bytes (15 GB) copied, 86.0007 s, 175 MB/s
#竟然拷贝了15GB的空间...直接将分区的每个块有的没得数据全部拷贝...
[root@localhost /]# dd if=/tmp/test2.img of=/dev/testvg/lvs_test2
29360128+0 records in
29360128+0 records out
15032385536 bytes (15 GB) copied, 418.97 s, 35.9 MB/s
#足足等了8分钟...还好没有手贱直接划出100GB的空间分区...
[root@localhost /] rm -rf /tmp/test2.img
#删除镜像
[root@localhost /] lvremove -f /dev/testvg/test2-back
#删除快照
[root@localhost /]# !181
mount /dev/testvg/lvs_test2 /test2/
[root@localhost /]# cat /test2/test
hello world #数据回来了,虽然大费周章但是数据100%完整的!

接下来说第四种方法,使用合并功能将快照和原始内容比对,将不同的内容合并。不过这个命令对系统有所要求:需要内核 >= 2.6.33 和 lvm2包版本 >= 2.0.59,我想centos6以上都是支持的!下面举个例子来恢复快照:

[root@localhost ~] lvconvert --merge /dev/testvg/test2-back #直接写好需要合并的快照位置
 Merging of volume testvg/test2-back started.
 lvs_test2: Merged: 99.96%
 lvs_test2: Merged: 100.00%
#合并完成后快照会自动消失
[root@localhost ~] cd /dev/testvg/
[root@localhost testvg]# ll
lrwxrwxrwx 1 root root 7 Mar 29 14:39 lvs_test1 -> ../dm-0
lrwxrwxrwx 1 root root 7 Mar 29 18:13 lvs_test2 -> ../dm-1
#看test2-back没有了
[root@localhost ~]# cat /test2/test
hello world #文件又回来了!
结语:

lvm2是一个强大的文件系统,可以对逻辑卷扩容、缩小(慎用)、管理,并且快照功能提供了备份功能。如果有一个脚本的话可以自动为操作系统和数据做一个备份,然后使用dd命令将其复制到自带的nas上面去。如果出现系统奔溃或者数据丢失也能还原。不过关于还原操作系统?我下一期再说!

Comments

Leave a Reply

Your email address will not be published. Name and email are required