逻辑卷管理器(LVM)

允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小
允许在多个物理设备间重新组织文件系统
一般它的操作步骤为:

  1. 将磁盘或者分区指定为物理卷,分区的话注意修改标签(fsidk或gdisk)
  2. 用一个或者多个物理卷来创建一个卷组
    • 物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
    • 在物理卷上创建的逻辑卷是由物理区域(PE)组成,PE是分配逻辑卷的基本单位,在创建卷组时可以指定,类似于普通硬盘分区时的块大小
    • 可以在逻辑卷上创建文件系统
  3. 用卷组的free的PE空间创建逻辑卷,此逻辑卷便可作为普通硬盘使用。
  4. 对新创建的逻辑卷(相当于新分区)创建文件系统,挂载(mount和写入/etc/fstab)使用

LVM介绍

LVM: Logical Volume Manager, Version 2
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块
设备名:/dev/dm-#
软链接:
/dev/mapper/VG_NAME-LV_NAME :mapper名加组名-逻辑卷名
/dev/mapper/vol0-root
/dev/VG_NAME/LV_NAME : 组名加逻辑卷名
/dev/vol0/root

LVM可以弹性的更改LVM的容量

通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量

附加描述和注意点:

  1. 逻辑卷的提出就是为了解决在工作中硬盘分区完毕又无法扩展的空间不足问题(如果硬件上采用raid更加突出了能够随时扩展空间的重要性)
  2. 逻辑卷可以在线(挂载状态)进行扩展操作,转移硬盘数据并更换硬盘等等,因此用逻辑卷技术十分方便和效率。抽象的逻辑卷技术其配合硬件raid的容错性,可以保证数据硬盘空间的各种操作都行云流水。
  3. 组成卷组的时候各个物理卷既可以是分区也可以是一整块硬盘,其大小可以不相同。同时其分区方式(整块新硬盘的话就没有分区方式了)MBR或者GPT也可以不同,(注意其文件系统格式(只有分区才有)也可以不同,因为当把它作为物理卷的时候,它的文件系统格式直接就会被改成lvm格式。最后逻辑卷的时候会新创建文件系统)
  4. 注意将分区创建为物理卷之前最好先修改其标签(fdisk或gdisk中的t选项),虽然不修改也能使用,不过功能和说明标签不相符,最好还是标准化提前修改标签。但如果直接一块硬盘没有分区也没有创建文件格式的时候直接拿来创建物理卷则不需要修改标签了(因为没有创建分区所以无法添加标签)
  5. 注意创建物理卷的时候会抹掉所有数据,更改文件系统格式,因此要提前备份号里面的数据,卸载掉挂载点,然后再进行操作。
  6. 创建线性逻辑卷的时候若指定名称,会出现 /dev/组名/逻辑卷名/dev/mapper/组名-逻辑卷名 两个名称 ,但他们都只是软链接,指向/dev/dm-0 (编号从0开始的逻辑卷文件)
  7. 等创建完逻辑卷之后(相当于创建了新分区),然后别忘了创建文件系统,和之前物理卷的文件系统lvm注意区别,此时一个逻辑卷就像相当于一个新分区。
  8. 注意扩展逻辑卷的lvextend 后面也是小写l +PE数量 和大写L +空间大小。 需要关注的就是如果不加上+这个符号,则意思是把这个卷扩展到指定的PE数量或者空间大小,而不是增加空间(如果指定的大小比原先还要小,则变成了缩减). 扩展逻辑卷的时候确保卷组剩余的空间够用,如果不够用,需要增加物理卷到卷组中增加空间。
    • 扩展物理卷到卷组命令为vgextend 卷组名 物理卷1 物理卷2...
  9. 扩展逻辑卷之后,如果用lvdisplay命令可以看到已经扩展成功,但是df命令仍然显示的是之前的数据,是因为df显示的是文件系统的大小,虽然逻辑卷已经扩展,但扩展上去的部分并没有同步之前lvm已经创建的文件系统,是空的文件系统。因此需要同步一下文件系统。
    • xfs_growfs /mnt/vgtest/vgtest1或者/dev/vgtest/lvtest1 : xfs扩展文件系统命令,即为xfs_growfs 挂载点或者设备名
    • resize2fs 挂载点或者设备名 :ext4扩展文件系统命令
  10. 当然扩展的时候 可以加上-r 选项 直接扩展空间的同时同步文件系统,支持xfs和ext4格式,就不需要再两次操作了
    lvextend -r -L +1G /dev/vgtest/lvtest1
  11. 扩展逻辑卷的时候可以在线(挂载状态)扩展,同时数据也不会受到影响,从这里也可以看出lvm的强大和好处。
  12. xfs文件系统的逻辑卷不支持缩减,但是ext系列的支持缩减(一般很少用),但会有数据丢失的风险(数据比要缩减后的大小要多时,但即使不多于,也有可能丢失数据),因此一定要提前备份。
    • 注意扩展的时候可以在线扩展,而缩减的时候必须要先离线卸载掉
    • 扩展的时候两步的话先扩展空间再同步文件系统,缩减的时候刚好相反先缩减文件系统然后再减少空间
  13. lvresize 即可以缩减也可以扩展。
pvcreate /dev/sdb2 /dev/sdb3 /dev/sdd
pvdisplay
vgcreate vgtest /dev/sdb{2,3} /dev/sdd
vgdisplay
lvcreate -n lvtest1 -L 3G vgtest  #创建线性逻辑卷
lvcreate -n lvtest2 -L 2G vgtest
lvdisplay
# ll /dev/vgtest/lvtest1 或者ll /dev/mapper/vgtest-lvtest1 查看软链接指向的文件
mkfs.xfs /dev/vgtest/lvtest1
mkfs.ext4 /dev/vgtest/lvtest2
blkid
mkdir /mnt/vgtest/lvtest{1,2}
写挂载文件到fstab上
mount -a         #挂载逻辑卷
lvextend -L +1G /dev/vgtest/lvtest1  #扩展逻辑卷1 ,xfs格式的
xfs_growfs /dev/vgtest/lvtest1    #同步文件系统xfs格式
lvextend -L +500M /dev/vgtest/lvtest2  #扩展逻辑卷2 ,ext4格式的
resize2fs /dev/vgtest/lvtest2    #同步文件系统ext4格式
也可以一步到位:
lvextend -r -L +1G /dev/vgtest/lvtest1 

缩减ext4格式LVM:
umount /dev/vgtest/lvtest2  :先卸载
fsck -f /dev/vgtest/lvtest2  :再检查
resize2fs /dev/vgtest/lvtest2 2G  :缩减到2G
lvreduce -L 2G /dev/vgtest/lvtest2  :注意大小要和上面写的一样
mount /dev/vgtest/lvtest2 /mnt/vgtest/lvtest2 或者mount -a

创建快照:
lvcreate -s -L 1G -n lvtest1_snapshot -p r /dev/vgtest/lvtest1(-pr可加可不加,建议加上,这是以只读方式创建,挂载mount命令的时候也可再加上。不过经过测试,这里加上-pr 则mount中即便加上-o nouuid的方式也挂载不上去了)
lvconvert --merge /dev/vgtest/lvtest1_snapshot(还原合并之前都要卸载掉先)

转移将要损坏的硬盘或者分区的PE块用于更换:
首先查看卷组中剩余PE空间是否足够,不够的话创建新物理卷并加入
pvcreate /dev/sde
vgextend /dev/vgtest /dev/sde
pvmove /dev/sdd
vgreduce /dev/vgtest /dev/sdd
pvremove /dev/sdd
  1. 逻辑卷的迁移类似硬盘分区的迁移,硬盘分区迁移只能拆掉包含这个分区的硬盘,而逻辑卷的迁移也是将组成这个逻辑卷的所有PE块的数据迁移到其他机器上,则需要迁移这整个卷组。
  2. 问题:将原先以普通分区方式分区的硬盘根目录下某个大文件夹(比如home目录)迁移到新装的逻辑卷上,这样就可以用逻辑卷扩展此文件夹,避免此文件夹继续增大占满根目录。如何操作?
    • 首先要新加装硬盘或者分区,创建逻辑卷(物理卷-标签-卷组-逻辑卷),(注意增加分区标签的时候要看清分区格式选择用fdisk还是gdisk,然后用t修改标签,如果把一整块硬盘作为物理卷就没有标签这一说了)
    • 然后就是将逻辑卷挂载到临时挂载文件夹下,将home目录的所有数据拷贝到此逻辑卷中(注意拷贝命令用 cp -av /home/. 临时挂载点 的方式来拷贝,能够拷贝所有隐藏非隐藏文件),拷贝之后检查一下是否完全拷贝成功(用ls ll du 等命令)
    • 拷贝完毕后删除home下的数据(或者稳妥起见,先不删除试用,不删除的话跳过这一步)
    • 最后将此逻辑卷挂载到根目录下源文件夹所在地址即为/home处即可,注意将自动挂载写入fstab文件中。(上一步不删除的话home内的文件没有入口被隐藏了,等到逻辑卷经测试能够稳定使用了之后再删除掉原先根目录里面的文件,这样最稳妥)
  3. 注意根分区是不可能迁移的,操作系统装在根上不能迁移,不如直接重装。

pv管理工具

显示pv信息

pvs:简要pv信息显示
pvdisplay :现实详细物理卷信息

创建pv

pvcreate /dev/DEVICE ... :可以多个同时创建

删除pv

pvremove /dev/DEVICE ... :可以多个同时移除

vg管理工具

显示卷组

vgs
vgdisplay

创建卷组

vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]

  • 即为vgcreate 卷组名 物理卷1 物理卷2... 可以加上其它选项比如-s 指定PE大小等等

管理卷组

vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]

删除卷组

先做pvmove,再做vgremove

lv管理工具

显示逻辑卷

lvs
Lvdisplay

创建线性逻辑卷

lvcreate -L #[mMgGtT] -n NAME VolumeGroup :大写L后面直接写大小,小写l后面跟的是PE的数量

  • lvcreate -L 大小 -n 逻辑卷名称 卷组名
    lvcreate -l 60%VG -n mylv testvg
    lvcreate -l 100%FREE -n yourlv testvg
  • 注意lvextend 也可以用百分号的方式来扩展逻辑卷
    lvrename 改名字
    使用lvrename命令更改逻辑卷名
    lvrename /dev/VolGroup00/LogVol00 /dev/VolGroup00/lv_root
    lvrename /dev/VolGroup00/LogVol01 /dev/VolGroup00/lv_swap

删除逻辑卷

lvremove /dev/VG_NAME/LV_NAME

  • 注意不需要加卷组名

重设文件系统大小

fsadm [options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
xfs_growfs /mountpoint

扩展和缩减逻辑卷

扩展逻辑卷:

lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME

  • 注意扩展逻辑卷的时候只需要写上逻辑卷的名称(软链接或者说dm-#),不需要写卷组名了,但要保证卷组有足够空间,扩展时也可用 lvextend -l 百分数free 的方式.

缩减逻辑卷:

umount /dev/VG_NAME/LV_NAME :先卸载
e2fsck -f /dev/VG_NAME/LV_NAME :再检查
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT] :缩减文件系统到多大
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME :缩减空间到多大,要和上面的文件系统对应
mount :再次挂载

跨主机迁移卷组

源计算机上

  1. 在旧系统中,umount此卷组上的所有逻辑卷
  2. 禁用卷组
    vgchange –a n vg0
    lvdisplay
  3. 导出卷组
    vgexport vg0
    pvscan
    vgdisplay
    拆下旧硬盘

在目标计算机上

  1. 在新系统中安装旧硬盘,并导入卷组:vgimport vg0
  2. vgchange –ay vg0 启用
  3. mount所有卷组上的逻辑卷

创建逻辑卷示例

  1. 创建物理卷
    pvcreate /dev/sda3
  2. 为卷组分配物理卷
    vgcreate vg0 /dev/sda3
  3. 从卷组创建逻辑卷
    lvcreate -L 256M -n data vg0
    mkfs.xfs /dev/vg0/data
  4. 挂载
    mount /dev/vg0/data /mnt/data

逻辑卷管理器快照

  • 快照是特殊的逻辑卷,它是在生成快照时对于指定的存在的逻辑卷的准确拷贝
  • 对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择,
  • 快照只有在它们和原来的逻辑卷不同时才会消耗空间
    1. 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
    2. 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
    3. 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
    4. 建立快照的卷大小小于等于原始逻辑卷(大于它没有意义),也可以使用lvextend扩展快照的卷

使用LVM快照

为现有逻辑卷创建快照(新建逻辑卷并作为快照盘,指向需要备份的逻辑卷)

lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data
-s 代表快照的标签 -p r是以只读方式创建这个快照盘(这里-p r不加也可以,可以挂载的时候用mount中命令只读挂载)

挂载快照(快照可以不挂载,就算要挂载也最好用只读挂载方式)

mkdir -p /mnt/snap
mount -o ro /dev/vg0/data-snapshot /mnt/snap

恢复快照(需要先卸载掉快照区域和对应的逻辑卷区域)

umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot

删除快照(先卸载再删除)

umount /mnt/databackup
lvremove /dev/vg0/databackup

注意点:

  1. 快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,之后对其进行多次改动甚至删除也不会再影响快照内的内容了,它只会保留第一次修改前的最初的原数据内容。而没有改动的数据则由快照区和文件系统共享
  2. 由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量
  3. 快照创建时就会保留创建时的对应逻辑卷的状态,如果想要保留多个状态,则需要再次开辟快照区域并指定好逻辑卷目标
  4. 创建快照前确保卷组内还有空间,没有的话需要增加物理卷增加卷组空间
  5. 快照的大小决定了它最多能保留和恢复原逻辑卷改动的内容,因此不能设置的太小,它的优点就是能够备份逻辑卷快照时的状态(比cp速度快),缺点就是会影响读写逻辑卷的速度(因为读写时将同时将原文件cp送到快照里面),以及占用卷组的空间。因此快照长期不用或者用完了之后一定要删除,不仅占用空间还影响原逻辑卷读写速率。(先卸载再删除,如果想要删除有快照盘的逻辑卷,需要先删除快照盘才可)
  6. 按照原理来说如果不更改原逻辑卷内内容,快照内没有数据,但是挂载快照之后经过测试发现仍然能够看到里面存有数据。这个是人为系统设置的功能,为了给人一种快照盘确实已经备份成功的感觉,不然如果查看快照盘内内容空空如也,会给人一种没有备份成功的错觉。
  7. 快照盘和对应逻辑卷UUID相同,因此用mount挂载的时候会报错,(只在s系列中需要,如果是 ext系列中不需要加-o nouuid)必须加上选项 mount -o nouuid /dev/vgtest/lvtest1_snapshot /mnt/lvtest1_snapshot,如果创建快照盘的时候没有加上-pr 则此时最好也加上-o ro选项。
  8. 注意了新建快照逻辑卷时必须指定标签-s 以及它想要备份的逻辑卷盘(普通盘指定的是卷组,快招盘制定的是想要备份的逻辑卷),创建命令结束之后其实就已经完工了。注意快照盘不需要创建文件系统格式,它会根据对应要备份的逻辑卷自动创建文件格式
  9. 恢复快照盘的时候必须要卸载mount,原有的逻辑卷以及快照盘都要卸载才能还原。但是注意还原之后,这个快照盘就会被自动删除并释放空间。
  10. 问题:如果一个硬盘或者分区(注意不是逻辑卷)将要损坏,要怎么办?
    • 先用pvdisplay查看此硬盘(或者包含分区的硬盘,下同,就不再注明了)PE块使用情况,然后把此硬盘的PE块(包括PE组成的块里的内容)全部转移到此卷组的剩余物理卷的PE上去,当然前提是这个卷组剩余的free空PE块要比这个硬盘所占的PE空间块多。如果不够用的话,增添硬盘,新创建物理卷并添加进卷组中即可。
    • 转移完此硬盘PE块(包括里面的数据)之后,便可卸载掉这个物理卷,然后就可以把这个硬盘拆掉更换新的硬盘了。
    • 注意转移完PE之后要先把物理卷从卷组中移除然后才能删除这个物理卷,最后再拆除硬盘或者包含分区的硬盘。