LVM原理和实践
目录:
一:LVM原理详解
二:LVM创建
三:LVM的增大和放缩
四:LVM快照
五:相关扩展阅读
一:LVM原理详解
1.LVM是什么?
LVM是linux系统上的一个逻辑卷管理器有两个版本lvm1和lvm2现在默认是lvmm2,lvm2兼容lvm1但是对于lvm1的快照是不兼容的,所以如果你使用lvm1创建了快照,请在升级为lvm2的时候将快照卷卸载
Lvm2使用的是设备映射器(device mapper)2.6版本的内核有其驱动,2.4的内核是没有的需要打补丁
2.什么是逻辑卷管理器?
逻辑卷管理器提供了一个比传统的磁盘和分区视图更高层次的磁盘存储视图,它使管理员可以更加灵活的给应用程序和
用户分配存储空间,可以在逻辑卷管理器下对磁盘容量进行任意调整和移动,同时逻辑卷管理器也可以允许用户自定义组的方式来管理磁盘容量.
允许管理员使用容易识别的逻辑卷组名称例如"development"或"sales"而不是像物理磁盘那样使用sda或sdb
3.LVM的组成
1.从LVM的视角看LVM的组成
+-- Volume Group --------------------------------+
| |
| +----------------------------------------+ |
| PV | PE | PE | PE | PE | PE | PE | PE | PE | |
| +----------------------------------------+ |
| . . . . |
| . . . . |
| +----------------------------------------+ |
| LV | LE | LE | LE | LE | LE | LE | LE | LE | |
| +----------------------------------------+ |
| . . . . |
| . . . . |
| +----------------------------------------+ |
| PV | PE | PE | PE | PE | PE | PE | PE | PE | |
| +----------------------------------------+ |
| |
+------------------------------------------------+
2.从磁盘和分区的角度看LVM
hda1 hdc1 (PV:s on partitions or whole disks)
\ /
\ /
diskvg (VG)
/ | \
/ | \
usrlv rootlv varlv (LV:s)
| | |
ext2 reiserfs xfs (filesystems)
VG:卷组是LVM中的最高的抽象层次,它将LV和PV结合起来到一个管理单元
PV:PV尽管只是一个device 但是看起来像是一个hard disk
LV:相当于没有LVM系统的磁盘分区是一个可见的块设备可以包含一个文件系统
PE:每一个PV都被分成了许多数据块,这些数据块就被称作PE,这些PE都是相同的大小对于VG来说就是LE
LE:VG被切割成一个个数据块这些数据块就是LE,这些LE对于整个VG中的LV来说都是相同的
一个具体的例子将会帮助我们很好理解这些概念:
假设我们有一个逻辑卷叫做VG1这个逻辑卷有一个4MB大小的PE.在这个逻辑卷中我们引入2个磁盘分区/dev/sda1 和/dev/sda2
这些分区将会变成PV1和PV2,PV1和PV2这两个PV会被切割成4MB大小的数据块(PE).这两个PV有自己的大小PV1由99个数据块组成
PV2由248个数据块组成,我们现在可以创建自己的逻辑卷了,逻辑卷的大小可以在1到347(249+99)个数据块之间.当我们创建
逻辑卷的时候就会形成一个在LE和PE之间的映射关系.example:第一个LE可以映射到PV1的第51个PE,当写入4MB数据到LE的时候
事实上就写入到PV1的第51个PE上
4.LE到PE的映射模式
1.Linear mapping
这种模式将会指定对一个范围的PE区域进行映射,例如LE的1-99映射到PV1(PV1一共只有99个PE),LE的100-347映射到PV2(PV2一共只有249个PE)
这种模式的优点在于数据写入的时候是一个一个PV的写入,当一个PV写满了再写入到第二个PV
2.Striped mapping
这种模式会将写入的数据分成一个个数据块交错写入到各个PV中 例如:
1st chunk of LE[1] -> PV1[1],
2nd chunk of LE[1] -> PV2[1],
3rd chunk of LE[1] -> PV3[1],
4th chunk of LE[1] -> PV1[2]
在某些情况下确定好映射模式可以有效提高逻辑卷的性能
5.LVM快照
如果在备份过程期间数据没有发生变化,那么就能够获得一致的备份。如果不在备份期间停止系统,就很难保证数据没有变化。
Linux LVM 实现了一种称为快照(Snapshot)的特性,它的作用就像是 “拍摄” 逻辑卷在某一时刻的照片。通过使用快照,
可以获得同一 LV 的两个拷贝 ——一个可以用于备份,另一个继续用于日常操作。
快照有两大优点:
快照的创建非常快,不需要停止生产环境。
建立两个拷贝,但是它们的大小并不一样。快照使用的空间仅仅是存储两个 LV 之间的差异所需的空间。
快照由一个例外列表(exception list)来实现,每当 LV 之间出现差异时就会更新这个列表(正式的说法是 CoW,Copy-on-Write)。
二:LVM创建
1.PV的创建
相关命令:
1. pvcreate :将实体 partition 建立成为 PV ; 2. pvscan :搜寻目前系统里面仸何具有 PV 的磁盘; 3. pvdisplay :显示出目前系统上面的 PV 状态; 4. pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
先准备四个分区(将分区的类型改成8e):
Device Boot Start End Blocks Id System /dev/sdb1 1 13 104391 8e Linux LVM /dev/sdb2 14 26 104422+ 8e Linux LVM /dev/sdb3 27 39 104422+ 8e Linux LVM /dev/sdb5 40 52 104422+ 8e Linux LVM
#创建PV的过程其实质就是写入了一些LVM相关的元数据写入到了指定的磁盘或分区
[root@wwww ~]# pvcreate /dev/sdb{1,2,3,5} Writing physical volume data to disk "/dev/sdb1" Physical volume "/dev/sdb1" successfully created Writing physical volume data to disk "/dev/sdb2" Physical volume "/dev/sdb2" successfully created Writing physical volume data to disk "/dev/sdb3" Physical volume "/dev/sdb3" successfully created Writing physical volume data to disk "/dev/sdb5" Physical volume "/dev/sdb4" successfully created
#查看系统上所有PV的信息
[root@wwww ~]# pvscan PV /dev/sdb1 lvm2 [101.94 MB] PV /dev/sdb2 lvm2 [101.98 MB] PV /dev/sdb3 lvm2 [101.98 MB] PV /dev/sdb5 lvm2 [101.98 MB] Total: 4 [407.87 MB] / in use: 0 [0 ] / in no VG: 4 [407.87 MB]
#更详细的列出每一个PV的具体信息(这里我只截取部分贴上
[root@wwww ~]# pvdisplay "/dev/sdb1" is a new physical volume of "101.94 MB" --- NEW Physical volume --- PV Name /dev/sdb1 #PV的名称 VG Name #PV还为分配到VG中所以没有VG Name PV Size 101.94 MB #PV的大小 Allocatable NO #PV的分配状态 这里是没有分配的 PE Size (KByte) 0 #PE的大小, 只有等PV被分配到VG的时候才会被分成一个个PE Total PE 0 #PE的个数 Free PE 0 #空闲的PE个数 Allocated PE 0 #已分配的PE个数 PV UUID 3Ryu05-Rmrr-foX0-NJw6-550b-OysU-WZAn3L #每一个PV都有其UUID唯一标示这个PV
2.VG的创建
相关命令:
1.vgcreate :就是主要建立 VG 的名令啦 2.vgscan :搜寻系统上面是否有 VG 存在 3.vgdisplay :显示目前系统上面的 VG 状态 4.vgextend :在 VG 内增加额外的 PV 5.vgreduce :在 VG 内移除 PV 6.vgchange :设定VG是否启动 7.vgremove :去除一个 VG
#VG的创建
vgcreate [-s N[mgt]] VG名称 PV名称
-s 指定PE的大小单位可以是m,g,t
[root@wwww ~]# vgcreate -s 4m vgtest /dev/sdb{1,2,3,5} Volume group "vgtest" successfully created
#查看系统上VG的信息
[root@wwww ~]# vgscan Reading all physical volumes. This may take a while... Found volume group "vgtest" using metadata type lvm2
#再查看下PV的状态信息
#四个PV都已经被vgtest使用
[root@wwww ~]# pvscan PV /dev/sdb1 VG vgtest lvm2 [100.00 MB / 100.00 MB free] PV /dev/sdb2 VG vgtest lvm2 [100.00 MB / 100.00 MB free] PV /dev/sdb3 VG vgtest lvm2 [100.00 MB / 100.00 MB free] PV /dev/sdb5 VG vgtest lvm2 [100.00 MB / 100.00 MB free] Total: 4 [400.00 MB] / in use: 4 [400.00 MB] / in no VG: 0 [0 ]
#PV被分出去了就有信息了
[root@wwww ~]# pvdisplay --- Physical volume --- PV Name /dev/sdb1 VG Name vgtest PV Size 101.94 MB / not usable 1.94 MB Allocatable yes PE Size (KByte) 4096 Total PE 25 Free PE 25 Allocated PE 0 PV UUID 3Ryu05-Rmrr-foX0-NJw6-550b-OysU-WZAn3L
#显示VG详细信息
[root@wwww ~]# vgdisplay --- Volume group --- VG Name vgtest #VG名称 System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 1 VG Access read/write VG Status resizable #VG状态 处于可调整大小的状态 MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 4 Act PV 4 VG Size 400.00 MB #VG的大小 PE Size 4.00 MB #PE的大小 Total PE 100 Alloc PE / Size 0 / 0 Free PE / Size 100 / 400.00 MB VG UUID hweBrU-o8LD-ggfo-dmJV-1Jyl-7L3j-p0BOMa
3.LV的创建
相关命令:
1.lvcreate :建立 LV 啦 2.lvscan :查询系统上面的 LV 3.lvdisplay :显示系统上面的 LV 状态啊 4.lvextend :在 LV 里面增加容量 5.lvreduce :在 LV 里面减少容量 6.lvremove :去除一个 LV 7.lvresize :对 LV 迚行容量大小的调整
lvcreate [-L N[mgt]] [-n LV 名称] VG 名称 -L 后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE, 因此这个数量必项要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。 -l 后面接PE的数量,而不是大小 如果使用这种方式指定LV大小 需要自己计算所需的PE数量 -n 后面接的就是 LV 的名称 -s 快照卷 -p 属性
#LV的创建
[root@wwww ~]# lvcreate -L 200m -n lvtest vgtest Logical volume "lvtest" created
#也可以使用
lvcreate -l 50 -n lvtest vgtest #一个PE4m 50个PE就是200m了
#lv创建后就会在/dev目录下创建了一个设备映射文件
[root@wwww ~]# ll /dev/vgtest/lvtest lrwxrwxrwx 1 root root 25 Jan 20 13:50 /dev/vgtest/lvtest -> /dev/mapper/vgtest-lvtest
#查看lv详细信息
[root@wwww ~]# lvdisplay --- Logical volume --- LV Name /dev/vgtest/lvtest VG Name vgtest LV UUID LBWeO1-i6Ky-MqC1-OgHa-Iw5J-54o3-aHzNoR LV Write Access read/write LV Status available # open 0 LV Size 200.00 MB Current LE 50 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
到此创建完成接着就可以使用了
4.格式化并挂载使用
#格式化lvtest
[root@wwww ~]# mke2fs -j /dev/vgtest/lvtest mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 51200 inodes, 204800 blocks 10240 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67371008 25 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 33 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
#挂载lvtest
[root@wwww ~]# mkdir /lvdata [root@wwww ~]# mount /dev/vgtest/lvtest /lvdata/ [root@wwww ~]# cd /lvdata/ [root@wwww lvdata]# ls lost+found
到此结束
三:LVM的增大和放缩
1.LVM的增大(lv的增大)
vgtest是400M的大小,已经分配出去200M的一个lvtest,现在需要将lvtest增大到400M
先解释下文件系统边界和物理边界的概念:
[root@wwww ~]# umount /dev/vgtest/lvtest [root@wwww ~]# lvextend -L 400m /dev/vgtest/lvtest Extending logical volume lvtest to 400.00 MB Logical volume lvtest successfully resized [root@wwww ~]# e2fsck -f /dev/vgtest/lvtest e2fsck 1.39 (29-May-2006) 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/vgtest/lvtest: 11/51200 files (9.1% non-contiguous), 12127/204800 blocks [root@wwww ~]# resize2fs -p /dev/vgtest/lvtest resize2fs 1.39 (29-May-2006) Resizing the filesystem on /dev/vgtest/lvtest to 409600 (1k) blocks. Begin pass 1 (max = 25) Extending the inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX The filesystem on /dev/vgtest/lvtest is now 409600 blocks long.
2.LVM的增大(vg的增大)
新增一块磁盘/dev/sda6 将其添加至vgtest中,并扩充lvtest
[root@wwww ~]# pvcreate /dev/sdb6 Writing physical volume data to disk "/dev/sdb6" Physical volume "/dev/sdb6" successfully created [root@wwww ~]# vgextend vgtest /dev/sdb6 Volume group "vgtest" successfully extended [root@wwww ~]# umount /dev/vgtest/lvtest [root@wwww ~]# lvextend -L 500m /dev/vgtest/lvtest Extending logical volume lvtest to 500.00 MB Logical volume lvtest successfully resized [root@wwww ~]# e2fsck -f /dev/vgtest/lvtest e2fsck 1.39 (29-May-2006) 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/vgtest/lvtest: 11/102400 files (9.1% non-contiguous), 19351/409600 blocks [root@wwww ~]# resize2fs -p /dev/vgtest/lvtest resize2fs 1.39 (29-May-2006) Resizing the filesystem on /dev/vgtest/lvtest to 512000 (1k) blocks. Begin pass 1 (max = 13) Extending the inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX The filesystem on /dev/vgtest/lvtest is now 512000 blocks long. [root@wwww ~]# mount /dev/vgtest/lvtest /lvdata/ [root@wwww ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 19840924 3943108 14873676 21% / /dev/sda5 29854824 4686208 23627584 17% /data /dev/sda1 101086 12218 83649 13% /boot tmpfs 292496 0 292496 0% /dev/shm /dev/mapper/vgtest-lvtest 495718 6423 463695 2% /lvdata
总结:
对于LVM的增大: 1.若vg空间足够扩充,则直接扩充lv即可 2.若vg空间不够,需要创建pv加入到vg中扩充vg,然后再扩充lv 3.扩充lv第一步需要卸载lv设备 4.使用lvextend扩充lv 5.使用e2fsck检查修复lv文件系统 6.使用resize2fs扩充lv的文件系统边界至屋里边界大小
3.LVM的缩小(在vg的范围内对lv的容量缩小)
[root@wwww ~]# umount /dev/vgtest/lvtest [root@wwww ~]# e2fsck -f /dev/vgtest/lvtest e2fsck 1.39 (29-May-2006) 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/vgtest/lvtest: 11/129024 files (9.1% non-contiguous), 22705/512000 blocks [root@wwww ~]# resize2fs /dev/vgtest/lvtest 400M resize2fs 1.39 (29-May-2006) Resizing the filesystem on /dev/vgtest/lvtest to 409600 (1k) blocks. The filesystem on /dev/vgtest/lvtest is now 409600 blocks long. [root@wwww ~]# lvreduce -L 400M /dev/vgtest/lvtest WARNING: Reducing active logical volume to 400.00 MB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lvtest? [y/n]: y Reducing logical volume lvtest to 400.00 MB Logical volume lvtest successfully resized [root@wwww ~]# mount /dev/vgtest/lvtest /lvdata/ [root@wwww ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 19840924 3943120 14873664 21% / /dev/sda5 29854824 4686208 23627584 17% /data /dev/sda1 101086 12218 83649 13% /boot tmpfs 292496 0 292496 0% /dev/shm /dev/mapper/vgtest-lvtest 396672 6423 369769 2% /lvdata
4.LVM缩减(对带有数据的卷组缩减)
这里将/dev/sdb1这个100M的pv从vg卷组中去掉 [root@wwww ~]# vgreduce vgtest /dev/sdb1 Physical volume "/dev/sdb1" still in use [root@wwww ~]# pvmove /dev/sdb1 /dev/sdb1: Moved: 0.0% /dev/sdb1: Moved: 100.0% [root@wwww ~]# [root@wwww ~]# vgreduce vgtest /dev/sdb1 Removed "/dev/sdb1" from volume group "vgtest" [root@wwww ~]# vgdisplay --- Volume group --- VG Name vgtest System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 10 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 4 Act PV 4 VG Size 400.00 MB PE Size 4.00 MB Total PE 100 Alloc PE / Size 100 / 400.00 MB Free PE / Size 0 / 0 VG UUID 4E19bc-ZzcC-wdV3-eeaH-5zNg-rZXW-2Gmg43
总结:
1.LVM的缩减的几种方式:第一就是直接对lv的大小进行缩减,第二对vg卷组的大小进行缩减 2.直接对lv的大小缩减: 1.卸载文件系统 2.强制检查文件系统 3.缩减文件系统边界 4.缩减lv大小 注:一定要先缩减文件系统边界再去缩减lv,否则将会出现文件系统错乱 3.对vg卷组的缩减 1.对vg卷组的缩减只能缩减整个指定pv 2.对vg缩减的时候若指定减去的pv含有数据需要使用pvmove将数据移至其它pv(剩余容量要能够存放这个pv的数据) 3.使用vgreduce 去除指定pv
四:LVM快照
在实现快照前,我们先要对快照有个简单的认识,然后通过一张原理图进一步理解快照的运作流程,从而对快照有一个更深入的理解。
LVM除了可以自由的增大或者减小容量外,它还有一个更强大的功能也就是实时快照功能,就像照相一样瞬时就可以记录当前的磁盘信息。下面我们通过图示来了解LVM的快照功能
注:1.分配给快照卷的大小将可以满足你日后更改文件内容的大小
2.分配快照卷的时候要确保你的卷组要有足够的空间,不要把整个卷组都分配给了LV(数据区域)
这里我的VG总大小是500M,实际分配给LV(数据区域)分配了300M 给快照区域分配150M
[root@wwww lvdata]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 19G 3.8G 15G 21% / /dev/sda5 29G 4.5G 23G 17% /data /dev/sda1 99M 12M 82M 13% /boot tmpfs 286M 0 286M 0% /dev/shm /dev/mapper/vgtest-lvtest 291M 23M 254M 9% /lvdata [root@wwww lvdata]# lvcreate -s -n lvsnapt -L 150M /dev/vgtest/lvtest Rounding up size to full physical extent 152.00 MB Logical volume "lvsnapt" created #挂载快照卷 [root@wwww lvdata]# mkdir /lvsnap [root@wwww lvdata]# mount /dev/vgtest/lvsnapt /lvsnap/ #快照区域和实际的数据区域大小事一样的,我们可以通过快照区域来访问数据区域的数据两者是共享存放数据的PE的 [root@wwww lvdata]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 19840924 3943184 14873600 21% / /dev/sda5 29854824 4686208 23627584 17% /data /dev/sda1 101086 12218 83649 13% /boot tmpfs 292496 0 292496 0% /dev/shm /dev/mapper/vgtest-lvtest 297485 22821 259304 9% /lvdata /dev/mapper/vgtest-lvsnapt 297485 22821 259304 9% /lvsnap
注:
1.可以通过快照区域去修改数据,但是修改后的数据不会影响实际的数据区域中的数据。所以建议一般对于快照区域应该设置为只读属性不允许修改 2.实际的数据区域修改后通过快照区域去访问的还是原来的数据(数据修改后将会将原来数据存放至快照区域,此时快照区域会变大) 3.快照的优点在于使用了COW机制也就是写时复制,在数据没有改动之前,快照区域和实际数据区域供共享PE,只有等实际数据发生了改变才将原来的数据保存至快照区域 4.快照非常适合于实时备份系统中,快照卷的创建速度非常之快。可以避免长时间的备份导致的数据不一致问题,并且时间占用空间的大小也很小