Linux中LVM2原理及制作LVM2
一、LVM原理
【MD】:Multi Device 多设备
Mdadm是一个用户空间工具,是RAID的管理工具,与真正的RAID工作没有太大关系。真正的RAID集成在linux内核中
【DM】Device Mapper设备映射也是linux中一种常用的管理机制
DM 与MD近似,也能够提供一种逻辑设备
DM比MD的功能要强大。因为DM不仅仅能提供MD的RAID的功能,它还是逻辑卷(LVM2)基础,同时,在逻辑卷的基础上我们也能实现RAID0,RAID1。这样的功能。所有DM与MD中有某些功能是重叠的,但并不完全重叠。所以,我们通常使用MD做RAID用DM做LVM2
上图为DM的内核架构。即DM是怎么来工作的。
DM像MD一样也是有一个核心模块,和许多子模块组成的。例如MD,MD的核心有RAID0,RAID1,RAID5,RAID1+0等,由多个子模块完成不同的级别。DM也是有多个子模块完成不同的组织方式。
例如:
linear:有点类似Jbod。能够将多个磁盘的存储空间拼接在一块,当做一个磁盘来使用。
mirror:类似于镜像。
Snapshot:快照,向虚拟机一样,能够保留数据在做快照那一刻时的状态。快照,也可以说是访问同一条数据的另外一条路径。(主要用途是数据备份)
Multipath:多路径。多路径需要借助于DM模块来配置,能够实现数据存储设备的寻路能够通过多跟不同线来完成。
RAID:只是为了避免硬件损坏而导致业务终止或数据损失的。并不能保证人为错误的操作,导致数据损失。说以通常即使有RAID后数据依然要做备份。
DM除了快照外,还支持动态缩减磁盘大小。
比如:我们有多快物理磁盘,DM能够将这多个磁盘组织成一个大的逻辑设备,如果以后发现内存不够可以再添加一块硬盘扩大设备,如果后来发现空间太大,也可以撤掉一块硬盘缩小空间。如下图:
注意:这个逻辑设备只是相当于一个扩展分区,我们在这个扩展分区上可以创建新的分区,因此,我们要想在这个逻辑设备上使用存放数据,就必须在这个逻辑设备上创建逻辑分区,这个逻辑分区就是真正可以扩大缩小的一个分区。如下图
【PV】:Physical Volume物理卷
【VG】:Volume Group卷组
【LV】:Logical Volume逻辑卷
VG(卷组)的边界大小取决于PV(物理卷)组合的大小。
虽然PV组合成了多个VG但是,要真正使用就要划分LV(逻辑卷),在VG上可以划分多个LV,但这多个LV的大小加起来的和不能超过VG,如果发现VG不够用了,可以增加PV(物理卷),如果LV中空间不足可以扩大LV。
对卷创建快照,实际上就是对逻辑卷创建快照,而快照卷必须和逻辑卷处于同一个卷组中。也就意味这,如果你要打算对某个LV逻辑卷创建快照,就必须在同一个卷组中预留出空间给其中的某个逻辑卷创建快照卷。
为什么能够实现VG的扩展以及LV的扩展,其实吧PV放入VG时就要把PV这个物理卷的所有空间划分成一个物理块,及一个个存储单元。 这个块不是文件系统块,而是PE(PhysicalExtend物理盘区),只要物理卷加入VG后,新加卷中划分的PE一定是和VG原因的PE大小相同。说以在创建VG时要制定VG所使用多大的PE。
【PE】(Physical Extend) 物理盘区,简称盘区
所以VG卷组中就是由一大堆的PE组成。那么LV逻辑卷的创建就是由VG分给LV多少个PE。那么LV的大小取决于VG分给了LV多少个PE。而在LV上这些PE就叫做LE(LoglcalExtend逻辑盘区)。所以LV上的扩展就相当于添加几个PE,就能达到扩展PE的目的。
如果将逻辑卷建立在RAID的基础上使用RAID1+0那么,即使硬件有损坏,也不会对LVM的性能有影响,这样既可以保证数据的安全,也能扩大盘区。
二、创建LVM
【操作系统:】红帽6.3
【相关命令:】
pvcreate:将物理卷创建为pv
vgcreate:将pv组合成vg
lvcreate:在vg上创建lv
那么首先我们要创建VG
这里例子中用创建一个10G的vg为例。
首先要创建一个10G的vi我们可以用10个1G的构成也可以使用一个2G,一个3G,一个5G的pv够成。
为了模拟,这里使用磁盘分区来模拟硬盘去创建vg
首先准备2,3,5G的分区个一个。来模拟三块硬盘
创建分区可以使用fdisk来创建,本文档不做创建分区演示,详情请见日志《linux中RAID的创建方法》
如图:这里已经创建好了sdb10为2G,sdb11为3G,sdb12为5G为了后面的其他演示,这里还另外创建了一个7G的sdb13。
注意:创建完成后要修改分区类型为Linux LVM,其Linux LVM在本系统中的类型编号为8e。
然后
# partprobe /dev/sdb
重读sdb分区表,如果失败可以使用partx -a /dev/sdb来重读
输入:cat /proc/partitions来验证是否可以使用该分区。
#cat /proc/partitions
然后将这些分区,也就是物理卷创建为pv
第一步:创建PV
#pvcreate/dev/sdb{10,11,12,13}
将sdb10,sdb11,sdb12,sdb13创建为pv
使用pvs能查看当前系统上有哪些pv
#pvs
这里就可以看见我们刚刚已经创建好了的pv,其中sda2是系统自己之前创建的。
上面的这些设备有些误差,这些误差只要在20%之内都是正常的。
使用pvdisplay可以查看pv的详细信息,要想看其中某个pv的信息信息可以加上设备名称
#pvdisplay /dev/sdb10
第二步、创建vg
创建vg使用vgcreate命令
#vgcreate myvg /dev/sdb{10,11,12}
将sdb10,sdb11,sdb13创建成一个vg名称为myvg
可以使用vgs来查看系统上的vg设备
#vgs
其中vg_gdy是系统自己之前创建的。;myvg是我们刚才创建的vg
使用vgdisplay可以查看vg的详细信息
#vgdisplay /dev/myvg
这里可以看到myvg的大小为10.02G,刚好和之前我们创建的2g,3g,5g的pv的空间大小和。
这里可以看到myvg的pe大小为4mb,已经一共包含了多少个pe即【total PE】,目前空闲的pe【Free PE 】
在创建vg时使用-s可以指定盘区PE的大小。
删除vg可以使用vgremove
#vgremove myvg
可以删除刚才创建的myvg
这里使用vgs就已经找不到刚才创建的myvg了
现在来创一个pe大小为8MB的vg
#vgcreate myvg -s 8M /dev/sdb{10,11,12}
使用vgdisplay 查看myvg的详细信息
#vgdisplay myvg
这里已经可以看到PE的大小为8M
缩减vg,注意,缩减vg的过程就相当于拿掉了一个pv(物理卷)。如果刚好拿掉的那个vg上有数据,那么就会损坏这套系统。那么一般在缩减vg时都要先使用pvmove将这个pv里面的数据移动到其他设备上。例如现在要移除sdb11这个pv那么就要先使用pvmove,然后在使用,vgreduce移除sdb11这个设备
将sdb11上的数据移动到其他设备上
#pvmove /dev/sdb11
由于这里并没有在pv上创建逻辑分区,当前mypv上没有数据所以这里移除时提示没有数据。那么接下来就从myvg中可以移除这个pv
移除sdb11
# vgreduce myvg/dev/sdb11
使用vgs再次查看vg的大小
#vgs
现在可看到vg的大小已经有10G缩减一个3G的sdb11后只有7G了
使用pvs查看
#pvs
此时的sdb11已经不属于任何一个vg了
当一个pv不属于任何一个vg时 就可以使用pvremove来删除该pv
删除sdb11
#pvremove /dev/sdb11
再次输入pvs就已经找不到之前的sdb11了
扩展myvg
#vgextend myvg/dev/sdb13
将之前已经创好了的sdb13添加到myvg中
然后使用vgs查看,可以看到之前缩小到7G的myvg添加一个7G的sdb13的pv后大小变为14G
注意:一旦将一个pv加入到已经存在的vg中后,该pv上的物理盘区PE大小会自动确定,保持和vg中物理盘区大小一致。
查看sdb13的物理盘区大小
#pvdisplay /dev/sdb13
可以看到该pv上的物理盘区大小和之前vg上的物理盘区大小一样都是8M
第三步、在vg上创建lv
创建一个50M左右的lv(逻辑卷)
#lvcreate -L 50M-n testlv myvg
即:在myvg上创建一个50M大小的lv名称为testlv
使用lvs可以查看系统上的lv
#lvs
这里可以看到我们创建的testlv实际大小为56M,这是因为PE大小的原因,系统必须按照整个PE去给lv分配大小,所以这里testlv的大小必须是PE的整数倍。
使用lvdisplay可以查看lv的详细信息
#lvdisplay /dev/myvg/testlv
使用mke2fs为testlv创建文件系统
#mke2fs -j/dev/myvg/testlv
#挂载textlv到/ftpftp/gandian/gz2目录下面
#mount /dev/myvg/testlv /ftpftp/gandian/gz2
现在,testlv已经挂载,可以使用了。
使用mount查看挂载信息
#mount
这里我们可以看到挂载的testlv是/dev/mapper/myvg-testlv,其实/dev/mapper/才是真正的设备文件,在/dev/myvg/testlv只是个链接文件。
#ls -la /dev/myvg/testlv
移除lv前lv不能处于挂载状态,
卸载testlv
#umount /dev/myvg/testlv
移除testlv
#lvremove /dev/myvg/testlv
这里会提示你该设备上也许有文件,是否确定移除,输入y即可
#lvs
刚才的textlv就已经找不到了。
这里lv的创建以及基本操作就完成了。
第四、扩展lv
首先,创建分区的过程实际就是创建物理边界的过程。给分区创建文件系统,就相当于在这个分区上创建逻辑边界。实际上逻辑边界是紧临物理边界的。那么如果要扩展一个lv首先要扩展其物理边界,然后在扩展其逻辑边界也就是文件系统边界。反之缩减一个lv就要先缩减逻辑边界(即文件系统边界),然后再缩减物理边界。
一般,扩展风险小,缩减风险大。扩展和缩减的步逐不能搞反。否则会损坏文件系统。
先创建一个2G的逻辑卷lv名称为testlv
# lvcreate -L 2G -n testlv myvg
格式化testlv
# mke2fs -j /dev/myvg/testlv
挂载testlv
# mount /dev/myvg/testlv /ftpftp/gandian/gz2
查看挂载信息
#mount
拷贝一个文件到该目录下面
# cp /etc/inittab /ftpftp/gandian/gz2
查看磁盘信息
#df -lh
可以看到该testlv大小为2G,那么现在我们将它扩展到5G
第一步:先扩大lv逻辑边界
# lvextend -L 5G/dev/myvg/testlv
注意:这里扩展之前一定要确保vg中有足够的空间可用。
分别使用df -lh 和lvs查看比较
可以发现,此时testlv的大小已经扩展到5G的,但挂载上的信息依然显示2G,这里是因为文件系统还没有扩展的原因。也就是逻辑边界还没有扩展。
第二步:扩展逻辑边界(即;扩展文件系统边界)
# resize2fs -p /dev/myvg/testlv
这里就是将文件系统扩展到最大可用范围。
现在使用df -lh 和lvs查看比较
这里已经都显示5G了,即扩展完成。
所以,扩展逻辑卷,并不影响其中原有文件的使用,并且风险非常小,并且这个文件系统就算处于挂载状态,不用卸载任然可以扩展。
第五、缩减lv
上面已经再扩展lv中解释过,缩减lv的次序和扩展lv的次序相反。先要缩减逻辑边界,可以使用resize2fs。
注意:缩减逻辑卷的风险非常大。
第一、 一定不要在线缩减,得先卸载;
第二、 确保缩减后的空间大小依然能存储原有的所有数据;
第三、 在缩减之前应该先强行检查文件系统,确保文件系统处于一致性状态。
文件系统缩减完成后可以使用lvreduce去缩减lv(即:逻辑边界)大小。
这里示例为将刚才的5Gtestlv缩减到3G
第一步:卸载testlv
#umount /dev/myvg/testlv
X卸载完成后可以使用mount来检查。
第二步:强行检查testlv的文件系统
# e2fsck -f /dev/myvg/testlv
检查后没问,就可用继续下一步:
第三步:缩减文件系统边界到3G
# resize2fs /dev/myvg/testlv 3G
第四步:缩减testlv的物理边界到3G
# lvreduce -L 3G /dev/myvg/testlv
这里提示的是,可能会损坏文件,如果损坏文件,责任自负,这里输入y即可
没问题后可以挂在该设备
第五步:挂载testlv
# mount /dev/myvg/testlv /ftpftp/gandian/gz2
挂载后可以使用ls查看文件,发现之前拷贝的文件依然存在,没有损坏。
使用df –lh 和lvs可以查看testlv的信息
显示testlv的磁盘大小为3G,即:lv的缩减成功。
第六、创建lv快照卷
本次示例将以之前testlv为例,为testlv创建快照卷。
注意:由于快照卷一般是不许修改,那么创建快照卷的同时一般制定为只读的方式创造。
创建快照卷依然使用lvcreate 不过要使用参数-s来指定创建的为快照卷,-p可以指定权限。
注意:快照卷必须和源卷在同一个卷组中。快照卷的主要作用是备份,那么在创建快照卷后,备份完成后。一般快照卷就没有意义了。可以删除。
快照卷的生命周期为整个数据时长:在这段时长内,数据的增长量不能超出快照卷大小:如果超出了快照卷的大小,那么文件的变化数据就超出了快照卷的大小。那些变化的数据就不能存在快照卷中。这种情况只要发生,那么快照卷就会放弃所有操作,并且自我损坏。这样,你之前的备份就会挂掉。为了安全快照卷的大小可以和原卷的大小一样大。这样数据量再大,也不可能超出原卷大小,不过一般不建议这么做。
给textlv创建一个50M的快照卷
# lvcreate -L 50M -ntestlv-snap -s -p r /dev/myvg/testlv
使用lvs可以查看快照卷
#lvs
挂载快照卷到/ftpftp/gandian/kz/
# mount /dev/myvg/testlv-snap /ftpftp/gandian/kz/
挂载完成后可以发现快照卷中文件和之前的testlv目录下的文件一样。
例如现在在testlv中创建一个文件可以发现testlv-snap快照卷中的文件不会更改。
备份快照卷
# tar -jcf /ftpftp/gandian/gz2.tar.bz2 /ftpftp/gandian/kz/
查看备份文件的信息
# tar -jtfgz2.tar.bz2
卸载快照卷
# umount /dev/myvg/testlv-snap
删除快照卷
# lvremove /dev/myvg/testlv-snap
删除快照卷后可以使用lvs验证
到这里快照卷的创建及备份就演示完毕了。
---附加----------------------------------------------------
Lvm详解
【pv】Physical Volume 物理卷
【vg】Volume Group VG卷组
【lv】logical Volume逻辑卷
创建pv及查看pv相关命令
pv :注意pv是由磁盘分区构成,分区格式为(8e(linux))
【pvcreate】创建pv
例如:
pvcreate/dev/sda1 /dev/sda2 //级可以将sda1和sda2设备创建称为pv设备
【pvremove】删除pv
【pvscan】扫描pv(扫描系统上有多少个pv物理磁盘)
【pvdisplay】查看系统上pv的详细信息
【pvs】查看当前系统上的pv设备(简单查看)
【pvmove】移动pv
vg:注意:vg是由pv构成构成后对系统看来相当于一个磁盘
【vgcreate】创建vg将pv创建为vg
例如:
vgcreatemyvg /dev/sdb1 /dev/sdb2 //将已经用pv创建好了的磁盘sdb1和sdb2创建成vg名称为myvg
参数:
【-s #】指定盘区大小(PESize)默认盘区大小为4MB
例如:
gcreate-s 8M myvg /dev/sdb{5,6} //创建名称为myvg 使用pv已经创建好了的设备sdb5,sdb6构成,盘区PE大小为8M
【vgremove】移除vg
例如: #vgremovemyvg //将myvg删除
【vgmove】移动,把物理盘区移动到其他设备上 #pvmove/dev/sdb5 //将物理盘区sdb5上的数据移走(方便之后卸载该物理盘区)
【vgdisplay】查看vg设备的详细信息
【vgs】查看vg设备的基本信息
【vgscan】扫描系统上有多少个vg设备
【vgreduce】缩减vg #vgreduce myvg /dev/sdb5 //将myvg设备上的sda5移除(即myvg的空间会缩小)
#pvremove/dev/sdb5(接着可以将pv磁盘设备sdb5移除)
【vgxtend】扩展vg #vgextendmyvg /dev/sdb7 //将myvg设备扩展个pv的磁盘sdb7
#pvcreate/dev/sdb7(在上面之前要先创建)
lv :注意:lv是属于vg的,需要在vg中创建
【lvcreate】创建lv需要在vg上创建
参数:
【-n】:指定名称
【-L】:指定空间大小
例如:lvcreate -L 50M -n testlv myvg //在myvg中创建一个lv,名称为testlv,大小为50M
mke2fs -j /dev/myvg/testlv //即格式化testlv.格式化的文件系统为ext3
mount /dev/myvg/testlv /mnt //将testlv挂载到mnt目录下面
【-p】:指定权限
【-s】:指定为快照卷
【创建快照卷】
1、生命周期为整个数据时长:在这段时长内,数据的增长量不能超出快照卷大小:
2、快照卷应该是只读的:
3、快照卷和原卷在同一卷组内
语法【lvcreate-L # -n SLV_NAME -p r /PATH/TO/LV】
#lvcreate -L 50M -n lv1-snap -s -p r/dev/myvg/lv1 //为lv1设备创建一个大小为50M,名称为:lv1-snap,权限为只读的快照卷
#mount /dev/myvg/lv1-snap /ftpftp/gandian //将快照卷挂载在gandian文件夹下
#tar -jcf /beifeng.tar.bz2 /ftpftp/gandian //将快照卷内容全部备份为beifeng.tar.bz2文件
#umount /dev/myvg/lv1-snap //卸载快照卷
#lvremove /dev/myvg/lv1-snap //移除快照卷(即将快照卷删除)
相关命令
lv :注意:lv是属于vg的,需要在vg中创建
【lvremove】移除 #lvremove/dev/myvg/testlv //将testlv移除
#lvremovelvremove /dev/mapper/myvg-testlv //也可以移除testlv(注意:/dev/myvg/testlv只是个连接文件,真正的文件在/dev/mapper/myvg-testlv)
【lvs】
【lvdisplay】
【lvcan】
【lvextend】扩展
例如:#lvextend -L 7G /dev/myvg/testlv//将testlv物理边界扩展到7G
#resize2fs -p /dev/myvg/testlv //将testlv的文件系统边界扩展为最大(即物理边界有多少就用多少)
【lvreduce】缩小
注意: 1、不能在线缩减,得先卸载;
2、确保缩减后的空间大小依然能存储原有的所有数据:
3、在缩减之前应该先强行检查文件,以确保文件系统处于以至性状态
例如:
#df -lh //查看文件系统大小,以及已经使用大小
#umount/dev/myvg/testlv //卸载testlv设备
#e2fsck -k/dev/myvg/testlv //强行检查testlv设备的文件系统
#resize2fs/dev/myvg/testlv 1G //缩减文件系统大小到1G
#lvreduce -L 1G/dev/myvg/testlv //缩减testlv物理边界到1G
#mount/dev/myvg/testlv /users //挂载
【lvresize】既可以扩展又可以缩小
一、扩展逻辑卷:
【lvextend 】扩展磁盘的逻辑卷
-L [+]# /PATH/TO/LV
【resize2fs】扩展文件系统逻辑编辑
resize2fs /PATH/TO/LV 5G
例如:#lvextend -L 7G /dev/myvg/testlv //将testlv物理边界扩展为7G
#resize2fs -p /dev/myvg/testlv //将testlv的文件系统边界扩展为最大(即物理边界有多少就用多少)
二、缩减逻辑卷:
注意:1、不能在线缩减,得先卸载;
2、确保缩减后的空间大小依然能存储原有的所有数据:
3、在缩减之前应该先强行检查文件,以确保文件系统处于以至性状态