鸟哥的Linux私房菜读书笔记--逻辑滚动条管理员(Logical Volume Manager)

版权声明:本文属博主原创,转载请联系QQ528055624 https://blog.csdn.net/qq_41825534/article/details/83063813

想象一种情况,你在当初规划主机的时候将/home只给50G,等使用久之后,发现filesystem不够大。除了加装新的磁盘外。简单方法:LVM重点在与可以弹性的调整filesystem的容量,并非在于效能与数据保全上面,需要文件的读写效能或者是数据的可靠性,请参考RAID的相关信息。LVM可以整合多个实体partition在一起,让这些分区看起来像有一个完整的磁盘一样,并且,未来可以增加或移除partition到LVM管理的磁盘中。

1、什么是LVM : PV  PE  VG  LV的意义

LVM(logical  volume  manager),逻辑滚动条管理员。为什么LVM可以对filesystem进行扩大和缩小:

(1)volume group (VG滚动条群组)

所谓的LVM大磁盘就是将许多的PV整合成VG。32位的linux操作系统最大仅能支持到65534个PE,若预设PE为4MB,最大容量仅能达到256GB。在64位的操作系统上基本没有限制

(2)physical  extent  (PE实体范围区块)

LVM预设使用4MB的区块,而LVM的LV在32位的系统上最多仅含65534个PE(lvm1格式)因此预设的LVM的LV会有4M*65534/1024M=256G。PE是整个LVM最小的存储区块,文件资料都是藉由PE写入的,类似于文件利用里面的block。

(3)logical volume  (LV逻辑滚动条)

最终的VG会被切成LV,LV 就是最后可以被格式化使用的类似分区槽。由于PE是整个LVM的最小存储单元,LV的大小与LV内的PE总数有关。LV的装置文件名通常指定为/dev/vgname/lvname。

如上所示,VG内的PE会分给虚线部分的LV,若果VG需要扩充的话,需要加上其他的PE,扩充使用的PE是VG内没有使用过的。

<1>实作流程

透过PE  LV  VG规划后,利用mkfs指令将LV格式化成为可以利用的文件系统

数据写入机制:

(1)线性模式 (linear):假如我将 /dev/vda1, /dev/vdb1 这两个 partition 加入到 VG 当中,并且整个 VG 只有一个 LV 时,那么所谓的线性模式就是:当 /dev/vda1 的容量用完之后,/dev/vdb1 的硬盘才会被使用到,这也是我们所建议的模式。
(2)交错模式 (triped):将一笔数据拆成两部分,分别写入 /dev/vda1 与/dev/vdb1 ,感觉上有点像 RAID 0 啦!如此一来,一份数据用两颗硬盘来写入,理论上,读写的效能会比较好。

LVM 最主要的用处是在实现一个可以弹性调整容量的文件系统上, 而不是在建立一个效能为主的磁盘上,所以,我们应该利用的是 LVM 可以弹性管理整个 partition 大小的用途上,而不是着眼在效能上的。因此,LVM 默认的读写模式是线性模式啦!如果使用 triped 模式,要注意,当任何一个 partition 『归天』时,所有的数据都会『损毁』的! 所以啦,不是很适合使用这种模式啦!如果要强调效能与备份,那么就直接使用 RAID 即可, 不需要用到 LVM 

2、LVM实作流程

LVM必须要核心支持且需安装lvm2软件,对于centos预设已将lvm的支持与软件安装妥当了

<1>disk阶段(实际的磁盘)

命令:$ gdisk -l /dev/vda    #查看实体分区情况

<2>PV阶段

PV的相关指令

pvcreate:将实体partition建立为PV

pvscan:搜索目前系统里面任何具有PV的磁盘

pvdisplay:显示出目前系统上PV的状态

pvremove:将PV属性移除,让该partition不具有PV属性

<3>VG阶段

建立VG及VG相关的指令

vgcreate:建立VG

    [root@study ~]# vgcreate [-s N[mgt]] VG 名称 PV 名称
        选项与参数:
            -s :后面接 PE 的大小 (size) ,单位可以是 m, g, t (大小写均可)
            # 1. 将 /dev/vda5-7 建立成为一个 VG,且指定 PE 为 16MB 喔!
    [root@study ~]# vgcreate -s 16M vbirdvg /dev/vda{5,6,7}
             Volume group "vbirdvg" successfully created

vgscan:搜寻系统上是否有VG

vgdisplay:显示系统上面的VG状态

vgextend:VG内额外增加PV

vgreduce:VG内移除PV

vgchange:设定VG是否启动

vgremove:删除VG

<4>LV阶段

创建出VG大磁盘后,建立LV分区

lvcreate:创建LV

lvscan:查看系统上面的LV

lvdisplay:显示系统上面的LV状态

lvextend:在LV内增加容量

lvreduce:减少LV内的容量

lvremove:删除一个LV

lvresize:对LV进行容量大小的调整

[root@study ~]# lvcreate [-L N[mgt]] [-n LV 名称] VG 名称
[root@study ~]# lvcreate [-l N] [-n LV 名称] VG 名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,
 因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
-l :后面可以接 PE 的『个数』,而不是数量。若要这么做,得要自行计算 PE 数。
-n :后面接的就是 LV 的名称啦!
更多的说明应该可以自行查阅吧! man lvcreate
# 1. 将 vbirdvg 分 2GB 给 vbirdlv 喔!
[root@study ~]# lvcreate -L 2G -n vbirdlv vbirdvg
 Logical volume "vbirdlv" created
# 由于本案例中每个 PE 为 16M ,如果要用 PE 的数量来处理的话,那使用下面的指令也 OK 喔!
# lvcreate -l 128 -n vbirdlv vbirdvg

<5>文件系统阶段

建置LV:格式化、挂载与观察LV 
[root@study ~]# mkfs.xfs /dev/vbirdvg/vbirdlv <==注意 LV 全名!
[root@study ~]# mkdir /srv/lvm
[root@study ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@study ~]# df -Th /srv/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.0G 33M 2.0G 2% /srv/lvm
[root@study ~]# cp -a /etc /var/log /srv/lvm
[root@study ~]# df -Th /srv/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.0G 152M 1.9G 8% /srv/lvm <==确定是可用的啊!

3、放大LV容量

放大文件系统的流程:

(1) VG 阶段需要有剩余的容量:因为需要放大文件系统,所以需要放大 LV,但是若没有多的 VG 容量, 那么更上层的 LV 与文件系统就无法放大的。因此,你得要用尽各种方法来产生多的 VG 容量才行。一般来说,如果 VG 容量不足,最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可!
(2) LV 阶段产生更多的可用容量:如果 VG 的剩余容量足够了, 此时就可以利用 lvresize 这个指令来将剩余
容量加入到所需要增加的 LV 装置内!过程相当简单!
(3) 文件系统阶段的放大:我们的 Linux 实际使用的其实不是 LV 啊!而是 LV 这个装置内的文件系统! 所以一切最终还是要以文件系统为依归!目前在 Linux 环境下,鸟哥测试过可以放大的文件系统有 XFS 以及 EXT 家族! 至于缩小仅有 EXT 家族,目前 XFS 文件系统并不支持文件系统的容量缩小喔!要注意!要注意!XFS 放大文件系统透过简单的 xfs_growfs 指令即可!
严格说,放大文件系统并不是没有进行格式化,格式化的位置在于该装置后来新增的部分,装置前面已经存在的文件系统没有发生变化。

对于XFS文件系统只能放大不能缩小文件系统容量。如果想要放大缩小,请使用ETX4文件系统

5、LVM的LV磁盘快照

快照就是将当时的系统信息记录下来,未来若有人格的资料改动,原始资料会被搬移到快照区,没有被更动的区域由快照区与文件系统共享

左图为最初建置LV磁盘快照区的情况,LVM会预留一个区域(左图的左侧三个PE块)作为数据存放处,快照区与系统区共享所有的PE数据。系统运作后,假设A区域的数据被更动,则更动前的系统会将该区域的数据移动到快照区,所以右图中的快照区占用了一块PE称为A,而其他B到  I  的区块仍然与文件系统共享。

建立快照区:由于快照区与原本的LV共享很多的PE区块,因此快照区与被快照的LV必须要在同一个VG里面

<1>传统快照区的建立

#先观察 VG 还剩下多少剩余容量
[root@study ~]# vgdisplay vbirdvg
....(其他省略)....
 Total PE 252
 Alloc PE / Size 226 / 3.53 GiB
 Free PE / Size 26 / 416.00 MiB
# 就只有剩下 26 个 PE 了!全部分配给 vbirdsnap1 啰!
#  利用 lvcreate 建立 vbirdlv 的快照区,快照被取名为 vbirdsnap1,且给予 26 个 PE
[root@study ~]# lvcreate -s -l 26 -n vbirdsnap1 /dev/vbirdvg/vbirdlv
 Logical volume "vbirdsnap1" created
# 上述的指令中最重要的是那个 -s 的选项!代表是 snapshot 快照功能之意!
# -n 后面接快照区的装置名称, /dev/.... 则是要被快照的 LV 完整檔名。
# -l 后面则是接使用多少个 PE 来作为这个快照区使用。                                                                                                             [root@study ~]# lvdisplay /dev/vbirdvg/vbirdsnap1

<2>利用快照区复原系统

注意复原的数据量不能够高于快照区所能负载的实际容量

#利用快照区将原本的 filesystem 备份,我们使用 xfsdump 来处理!
[root@study ~]# xfsdump -l 0 -L lvm1 -M lvm1 -f /home/lvm.dump /srv/snapshot1
# 此时你就会有一个备份资料,亦即是 /home/lvm.dump 了!
为什么要备份呢?为什么不可以直接格式化 /dev/vbirdvg/vbirdlv 然后将 /dev/vbirdvg/vbirdsnap1 直接复制给 vbirdlv 呢? 要知道 vbirdsnap1 其实是 vbirdlv 的快照,因此如果你格式化整个 vbirdlv 时,原本的文件系统所有数据都会被搬移到 vbirdsnap1。 那如果 vbirdsnap1 的容量不够大 (通常也真的不够大),那么部分数据将无法复制到 vbirdsnap1 内,数据当然无法全部还原啊! 所以才要在上面表格中制作出一个备份文件的!了解乎?而快照还有另外一个功能,就是你可以比对 /srv/lvm 与 /srv/snapshot1 的内容,就能够发现到最近你到底改了啥咚咚! 这样也是很不赖啊!您说是吧! ^_^!接下来让我们准备还原 vbirdlv 的内容吧!
#  将 vbirdsnap1 卸除并移除 (因为里面的内容已经备份起来了)
[root@study ~]# umount /srv/snapshot1
[root@study ~]# lvremove /dev/vbirdvg/vbirdsnap1
Do you really want to remove active logical volume "vbirdsnap1"? [y/n]: y
 Logical volume "vbirdsnap1" successfully removed
[root@study ~]# umount /srv/lvm
[root@study ~]# mkfs.xfs -f /dev/vbirdvg/vbirdlv
[root@study ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@study ~]# xfsrestore -f /home/lvm.dump -L lvm1 /srv/lvm
[root@study ~]# ll /srv/lvm
drwxr-xr-x. 131 root root 8192 Jul 28 00:12 etc
drwxr-xr-x. 16 root root 4096 Jul 28 00:01 log
# 是否与最初的内容相同啊!这就是透过快照来还原的一个简单的方法啰!

6、LVM相关指令汇整与LVM的关闭

移除LVM: (1)先卸除系统上面的 LVM 文件系统 (包括快照与所有 LV);
(2) 使用 lvremove 移除 LV ;
(3) 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志;
(4) 使用 vgremove 移除 VG:
(5) 使用 pvremove 移除 PV;
(6) 最后,使用 fdisk 修改 ID 回来啊!

猜你喜欢

转载自blog.csdn.net/qq_41825534/article/details/83063813