License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
转载请注明:http://suzf.net/post/590
目录:
一: 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.快照非常适合于实时备份系统中,快照卷的创建速度非常之快。可以避免长时间的备份导致的数据不一致问题,并且时间占用空间的大小也很小
LVM优点:
- 文件系统可以跨多个磁盘,因此大小不会受物理磁盘的限制。
- 可以在系统运行状态下动态地扩展文件系统大小。
- 可以增加新磁盘到 LVM 的存储池中。
- 可以以镜像的方式冗余重要数据到多个物理磁盘上。
- 可以很方便地导出整个卷组,并导入到另外一台机器上。
LVM缺点
- 在从卷组中移除一个磁盘时必须使用 reducevg,否则会出问题。
- 当卷组中的一个磁盘损坏时,整个卷组都会受影响。
- 仅支持有限个文件系统类型的减小操作(ext3不支持减少文件系统大小的操作)。
- 因为加入了额外的操作,存储性能会受影响(使用 Stripe 的情况另当别论)
来源: 专注linux