linux逻辑卷管理器LVM


逻辑卷管理器LVM(Logical Volume Manager)

回到顶部
LVM的全名是Logical Volume Manager,作为Linux操作系统的逻辑卷管理器,LVM提供了比传统的磁盘和分区视图更高级别的磁盘存储视图。
LVM可以帮助系统管理员弹性的调整文件系统的容量大小,这使得系统管理员可以更灵活地将存储分配给应用程序和用户。 逻辑卷可以随意调整大小和移动,尽管这可能需要对文件系统工具进行一些升级。 逻辑卷管理器还允许管理用户定义组中的存储卷,允许系统管理员处理明显命名的卷组(如“development”和“sales”),而不是物理磁盘名称,例如“sda”和“sdb”。
LVM将多个物理partition或者磁盘整合到一起,让多个partitions或者磁盘看起来像是一个独立的磁盘(VG), 然后将这个磁盘再分区为可以调整大小的分区(LV),这个分区可以被格式化为一个可被挂载的文件系统!并且可以往这个文件系统中新增或者移除物理partition。
注意,LVM并不像RAID那样关注数据读写效率和数据安全。
LVM的需要经历以下几个基本操作阶段:
LVM操作流程:
1.实体分区或者硬盘;
2.PV阶段, 涉及到的命令有pvcreate、;
3.VG阶段,涉及到的命令有vgcreate;
4.LV阶段,涉及到的命令有lvcreat;
5.LV格式化并挂载, 涉及到的命令有mkfd、mount
上述流程涉及到的术语解释如下:
LVM概念术语
LVM概念术语
术语名称 术语说明
物理卷PV
Physical Volume
物理卷PV是由物理硬盘设备或者软件RAID设备或者物理分区设备通过pvcreate命令转化而来。 物理partition或Disk需要先通过gdisk命令将系统标识符system ID修改为LVM标识符8e,然后 通过pvcreate命令转换为物理卷PV。物理卷PV是否是由物理扩展PE组成?还是到VG阶段才会出现PE?
卷组VG
Volume Group
我们上面提到LVM将多个物理partition或者磁盘整合到一起,让多个partitions或者磁盘看起来像是一个独立的磁盘(VG)。 这句话更准确的说法应该是通过vgcreate命令将多个物理卷PV组合成一个卷组VG。卷组VG是LVM中使用的最高级别的抽象。 它将多个物理卷PV组合成为一个管理单元。卷组VG的基本组成是PE。所以VG的容量也是和PE以及系统的位数有关, 在32位Linux系统上,基本上VG最大仅能支持到65534个PE而已,默认一个PE的大小为4MB, 那么一个VG最大容量则仅能达到约256GB, 不过这个问题在64位的Linux系统上面已经不存在了!VG几乎没有容量限制!
物理扩展PE
Physical Extent
PE为LVM的最小存储单位,是卷组VG的基本组成单位。我们往LVM中读写数据是以PE为基本单位来处理的。 简单的说,这个PE就有点像文件系统里面的block。 一个PE的默认大小为4MB,在32位linux系统上,一个VG最大仅能支持到65534个PE,所以调整PE大小就会影响到LVM的最大容量。 不过最新版本的LVM已经没有这方面的限制了。
逻辑卷LV
Logical Volume
逻辑卷LV通过lvcreat命令从卷组VG中切分出来,可以被格式化为可被挂载的文件系统! 我们通过各种LVM命令一顿骚操作之后,最终就是要得到逻辑卷LV。 逻辑卷LV的设备文件名通常是类似/dev/vgname/lvname的样式。 PE是整个LVM的最小储存单位,那么LV的大小就与LV中的PE总数有关。
VG、LV与PE的关系如下图所示: linux磁盘 图PE 与 VG 的相关性图示
我们提到LVM可以改变逻辑卷LV的容量大小,其实就是通过增加或者减少PE来完成的, 将原本LV内的PE移转到其他设备中以降低LV容量,或将其他设备的PE加到此LV中以加大容量! 如上图所示,VG内的PE会分给虚线部分的LV,如果未来这个VG要扩充的话,加上其他的PV即可。 而最重要的LV如果要扩充的话,也是透过加入VG内没有使用到的PE来扩充的!
LVM的操作流程图如下所示: linux磁盘 通过PV, VG, LV几个步骤之后,再利用mkfs就可以将LV格式化成为可以利用的文件系统了! 而且这个文件系统的容量在未来还能够进行扩充或减少, 而且里面的数据还不会被影响!
那么我们往LV写入数据的时候,数据是如何存入硬盘的呢?LVM有两种数据映射机制:
线性模式(linear):将分配一定范围的PE到LV的一个区域,例如LE 1 - 99映射到PV1,LE 100 - 347映射到PV2。 例如将/dev/vda1, /dev/vdb1这两个partition加入到VG中,并且整个VG只有一个LV时, 当/dev/vda1的容量用完之后,/dev/vdb1的空间才会被使用到,这就是所谓的线性模式,也是我们建议使用的模式。
交错模式(triped):将跨多个物理卷交织逻辑盘区的块,这个方式一定程度上提高了性能。 例如上面的例子,就是我将一份数据拆成两部分,分别写入/dev/vda1与/dev/vdb1的意思,有点类似RAID 0! 一份数据用两颗硬盘来写入,理论上,读写的效率会比较好。
基本上,LVM最主要的用处是实现一个可以弹性调整容量的文件系统, LVM默认的读写模式是线性模式啦! 如果使用triped模式,当任何一个partition损坏时,所有的数据都会丢失! 所以不推荐LVM使用这种模式!如果更注重读写的效率和数据安全,最好直接使用RAID, 而不是LVM!

LVM操作流程

回到顶部
LVM使用之前需要确保系统中已经安装了lvm并且已经开启了linux内核的支持,不过目前最新的centos默认已经支持LVM了。
目前系统中有5个可用的分区,我们先修改一下各个分区的system ID!将RAID的fd改为LVM的8e。 现在,我们实作 LVM 有点像底下的模样:
使用 4 个 partition ,每个 partition 的容量均为 1GB 左右,且 system ID 需要为 8e;
全部的 partition 整合成为一个 VG,VG 名称设定为 vbirdvg;且 PE 的大小为 16MB;
建立一个名为 vbirdlv 的 LV,容量大约 2G 好了!
最终这个 LV 格式化为 xfs 的文件系统,且挂载在 /srv/lvm 中

0. Disk 阶段 (实际的磁盘)

回到顶部
就不仔细的介绍实体分区了,请您自行参考第七章的 gdisk 来达成底下的范例:
[root@initroot ~]# gdisk -l /dev/vda
Number
Start (sector)
End (sector)
Size Code
2.0 MiB EF02
1024.0 MiB 0700
1 2048 6143 2 6144 2103295 3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300
Name
Linux filesystem5 67123200 69220351 1024.0 MiB 8E00 Linux LVM
6 69220352 71317503 1024.0 MiB 8E00 Linux LVM
7 71317504 73414655 1024.0 MiB 8E00 Linux LVM
8 73414656 75511807 1024.0 MiB 8E00 Linux LVM
9 75511808 77608959 1024.0 MiB 8E00 Linux LVM
其实system ID不改变也没关系!只是为了让我们管理员清楚知道该partition的内容, 所以这里建议还是修订成正确的磁盘内容较佳!
上面的/dev/vda{5,6,7,8} 这 4 个分区就是我们的实体分区!也就是底下会实际用到的信息! 至于/dev/vda9则先保留下来不使用。 注意看,那个8e的出现会导致system变成Linux LVM!其实没有设定成为8e也没关系, 不过某些LVM的侦测指令可能会侦测不到该partition!接下来,就一个一个的处理各流程吧!

1. PV 阶段

回到顶部
要建立 PV 其实很简单,只要直接使用 pvcreate 即可!我们来谈一谈与 PV 有关的指令吧!
pvcreate :将实体 partition 建立成为 PV ;
pvscan :搜寻目前系统里面任何具有 PV 的磁盘;
pvdisplay :显示出目前系统上面的 PV 状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
那就直接来瞧一瞧吧! # 1. 检查有无 PV 在系统上,然后将 /dev/vda{5-8} 建立成为 PV 格式
[root@initroot ~]# pvscan
PV /dev/vda3
VG centos
lvm2 [30.00 GiB / 14.00 GiB free]
Total: 1 [30.00 GiB] / in use: 1 [30.00 GiB] / in no VG: 0 [0
]
# 其实安装的时候,我们就有使用 LVM 了喔!所以会有 /dev/vda3 存在的!
[root@initroot ~]# pvcreate /dev/vda{5,6,7,8}
Physical volume "/dev/vda5" successfully created
Physical volume "/dev/vda6" successfully created
Physical volume "/dev/vda7" successfully created
Physical volume "/dev/vda8" successfully created
# 这个指令可以一口气建立这四个 partition 成为 PV 啦!注意大括号的用途
[root@initroot ~]# pvscan
PV /dev/vda3
VG centos
lvm2 [30.00 GiB / 14.00 GiB free]
PV /dev/vda8 lvm2 [1.00 GiB]
PV /dev/vda5 lvm2 [1.00 GiB]
PV /dev/vda7 lvm2 [1.00 GiB]
PV /dev/vda6 lvm2 [1.00 GiB]
Total: 5 [34.00 GiB] / in use: 1 [30.00 GiB] / in no VG: 4 [4.00 GiB]
这就分别显示每个 PV 的信息与系统所有 PV 的信息。尤其最后一行,显示的是: 整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量
2. 更详细的列示出系统上面每个 PV 的个别信息:
[root@initroot ~]# pvdisplay /dev/vda5
"/dev/vda5" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name
/dev/vda5
VG Name
#实际的 partition 设备名称
#因为尚未分配出去,所以空白!
PV Size 1.00 GiB
#就是容量说明
Allocatable NO
#是否已被分配,结果是 NO
PE Size 0
#在此 PV 内的 PE 大小
Total PE 0
#共分区出几个 PE
Free PE 0
#没被 LV 用掉的 PE
Allocated PE 0
#尚可分配出去的 PE 数量
PV UUID Cb717z-lShq-6WXf-ewEj-qg0W-MieW-oAZTR6
由于 PE 是在建立 VG 时才给予的参数,因此在这里看到的 PV 里头的 PE 都会是 0 而且也没有多余的 PE 可供分配 (allocatable)。 讲是很难,作是很简单!这样就将 PV 建立了起来啰!简单到不行吧! ^_^!继续来玩 VG 去!

2. VG 阶段

回到顶部
建立 VG 及 VG 相关的指令也不少,我们来看看:
vgcreate :就是主要建立 VG 的指令啦!他的参数比较多,等一下介绍。
vgscan :搜寻系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内增加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :设定 VG 是否启动 (active);
vgremove :删除一个 VG 啊!
与 PV 不同的是, VG 的名称是自定义的!我们知道 PV 的名称其实就是 partition 的设备文件名, 但是这个 VG 名称则可以随便你自己取啊!在底下的例子当中,我将 VG 名称取名为 vbirdvg 。建 立这个 VG 的流程是这样的:
[root@initroot ~]# vgcreate [-s N[mgt]] VG 名称 PV 名称
选项与参数: -s :后面接 PE 的大小 (size) ,单位可以是 m, g, t (大小写均可)
# 1. 将 /dev/vda5-7 建立成为一个 VG,且指定 PE 为 16MB 喔!
[root@initroot ~]# vgcreate -s 16M vbirdvg /dev/vda{5,6,7}
Volume group "vbirdvg" successfully created[root@initroot ~]# vgscan
Reading all physical volumes.
This may take a while...
Found volume group "vbirdvg" using metadata type lvm2 # 我们手动制作的
Found volume group "centos" using metadata type lvm2 # 之前系统安装时作的
[root@initroot ~]# pvscan
PV /dev/vda5 VG vbirdvg lvm2 [1008.00 MiB / 1008.00 MiB free]
PV /dev/vda6 VG vbirdvg lvm2 [1008.00 MiB / 1008.00 MiB free]
PV /dev/vda7 VG vbirdvg lvm2 [1008.00 MiB / 1008.00 MiB free]
PV /dev/vda3 VG centos lvm2 [30.00 GiB / 14.00 GiB free]
PV /dev/vda8
lvm2 [1.00 GiB]
Total: 5 [33.95 GiB] / in use: 4 [32.95 GiB] / in no VG: 1 [1.00 GiB]

# 嘿嘿!发现没!有三个 PV 被用去,剩下 1 个 /dev/vda8 的 PV 没被用掉!
[root@initroot ~]# vgdisplay vbirdvg
--- Volume group ---
VG Name
vbirdvg
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size 2.95 GiB #整体的 VG 容量有这么大
PE Size 16.00 MiB #内部每个 PE 的大小
Total PE 189 #总共的 PE 数量共有这么多!
Alloc PE / Size 0 / 0 Free 189 / 2.95 GiB
PE / Size
VG UUID
#尚可配置给 LV 的 PE 数量/总容量有这么多! Rx7zdR-y2cY-HuIZ-Yd2s-odU8-AkTW-okk4Ea # 最后那三行指的就是 PE 能够使用的情况!由于尚未切出 LV,因此所有的 PE 均可自由使用。 这样就建立一个 VG 了!假设我们要增加这个 VG 的容量,因为我们还有 /dev/vda8 嘛!此时你可 以这样做:
# 2. 将剩余的 PV (/dev/vda8) 丢给 vbirdvg 吧!
[root@initroot ~]# vgextend vbirdvg /dev/vda8Volume group "vbirdvg" successfully extended
[root@initroot ~]# vgdisplay vbirdvg
....(前面省略)....
VG Size 3.94 GiB
PE Size 16.00 MiB
Total PE 252
Alloc PE / Size 0 / 0
Free 252 / 3.94 GiB
PE / Size
# 基本上,不难吧!这样就可以抽换整个 VG 的大小啊! 我们多了一个设备喔!接下来为这个 vbirdvg 进行分区吧!透过 LV 功能来处理!

3. LV 阶段

回到顶部
创造出 VG 这个大磁盘之后,再来就是要建立分区区啦!这个分区区就是所谓的 LV 啰!假设我要 将刚刚那个 vbirdvg 磁盘,分区成为 vbirdlv ,整个 VG 的容量都被分配到 vbirdlv 里面去!先来 看看能使用的指令后,就直接工作了先!
lvcreate :建立 LV 啦!
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态啊!
lvextend :在 LV 里面增加容量!
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV !
lvresize :对 LV 进行容量大小的调整!
[root@initroot ~]# lvcreate [-L N[mgt]] [-n LV 名称] VG 名称
[root@initroot ~]# lvcreate [-l N] [-n LV 名称] VG 名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE, 因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。 -l :后面可以接 PE 的『个数』,而不是数量。若要这么做,得要自行计算 PE 数。 -n :后面接的就是 LV 的名称啦!
更多的说明应该可以自行查阅吧! man lvcreate
# 1. 将 vbirdvg 分 2GB 给 vbirdlv 喔!
[root@initroot ~]# lvcreate -L 2G -n vbirdlv vbirdvg
Logical volume "vbirdlv" created
# 由于本案例中每个 PE 为 16M ,如果要用 PE 的数量来处理的话,那使用下面的指令也 OK 喔!
# lvcreate -l 128 -n vbirdlv vbirdvg
[root@initroot ~]# lvscan
ACTIVE
'/dev/vbirdvg/vbirdlv' [2.00 GiB] inherit
#新增加的一个 LV 啰!ACTIVE '/dev/centos/root' [10.00 GiB] inherit
ACTIVE '/dev/centos/home' [5.00 GiB] inherit
ACTIVE '/dev/centos/swap' [1.00 GiB] inherit
[root@initroot ~]# lvdisplay /dev/vbirdvg/vbirdlv
--- Logical volume ---
# 这个是 LV 的全名喔!
LV Path /dev/vbirdvg/vbirdlv
LV Name vbirdlv
VG Name vbirdvg
LV UUID QJJrTC-66sm-878Y-o2DC-nN37-2nFR-0BwMmn
LV Write Access read/write
LV Creation host, time study.centos.vbird, 2015-07-28 02:22:49 +0800
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 128
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
# 容量就是这么大! 如此一来,整个 LV partition 也准备好啦!接下来,就是针对这个 LV 来处理啦!要特别注意的是, VG 的名称为 vbirdvg , 但是 LV 的名称必须使用全名!亦即是 /dev/vbirdvg/vbirdlv 才对喔! 后 续的处理都是这样的!这点初次接触 LVM 的朋友很容易搞错!

4. 文件系统阶段

回到顶部
这个部分我就不再多加解释了!直接来进行吧!
# 1. 格式化、挂载与观察我们的 LV 吧!
[root@initroot ~]# mkfs.xfs /dev/vbirdvg/vbirdlv #注意 LV 全名!
[root@initroot ~]# mkdir /srv/lvm
[root@initroot ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@initroot ~]# df -Th /srv/lvm
Filesystem
Type
/dev/mapper/vbirdvg-vbirdlv xfs
Size
2.0G
Used Avail Use% Mounted on
33M
2.0G
2% /srv/lvm
[root@initroot ~]# cp -a /etc /var/log /srv/lvm
[root@initroot ~]# df -Th /srv/lvm
Filesystem
Type
/dev/mapper/vbirdvg-vbirdlv xfs
Size Used Avail Use% Mounted on
2.0G 152M
1.9G
8% /srv/lvm
#确定是可用的啊! 透过这样的功能,我们现在已经建置好一个 LV 了!你可以自由的应用 /srv/lvm 内的所有资源!14.3.3 放大 LV 容量 我们不是说 LVM 最大的特色就是弹性调整磁盘容量吗?好!那我们就来处理一下,如果要放大 LV 的容量时, 该如何进行完整的步骤呢?其实一点都不难喔!如果你回去看图 14.3.2 的话,那么你会 知道放大文件系统时, 需要底下这些流程的:
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 指令即可!
其中最后一个步骤最重要!我们在第七章当中知道, 整个文件系统在最初格式化的时候就建立了 inode/block/superblock 等信息,要改变这些信息是很难的! 不过因为文件系统格式化的时候建置的 是多个 block group ,因此我们可以透过在文件系统当中增加 block group 的方式来增减文件系统的 量!而增减 block group 就是利用 xfs_growfs 啰!所以最后一步是针对文件系统来处理的, 前面几 步则是针对 LVM 的实际容量大小!
Tips 因此,严格说起来,放大文件系统并不是没有进行『格式化』喔!放大文件系统时,格式化的位置在于该设备 后来新增的部份,设备的前面已经存在的文件系统则没有变化。 而新增的格式化过的数据,再反馈回原本的 supberblock 这样而已!
让我们来实作个范例,假设我们想要针对 /srv/lvm 再增加 500M 的容量,该如何处置?
# 1. 由前面的过程我们知道 /srv/lvm 是 /dev/vbirdvg/vbirdlv 这个设备,所以检查 vbirdvg 吧!
[root@initroot ~]# vgdisplay vbirdvg
--- Volume group ---
VG Name
vbirdvg
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0Cur PV 4
Act PV 4
VG Size 3.94 GiB
PE Size 16.00 MiB
Total PE 252
Alloc PE / Size 128 / 2.00 GiB
Free 124 / 1.94 GiB
PE / Size
VG UUID
# 看起来剩余容量确实超过 500M 的!
Rx7zdR-y2cY-HuIZ-Yd2s-odU8-AkTW-okk4Ea
# 既然 VG 的容量够大了!所以直接来放大 LV 吧!!
# 2. 放大 LV 吧!利用 lvresize 的功能来增加!
[root@initroot ~]# lvresize -L +500M /dev/vbirdvg/vbirdlv
Rounding size to boundary between physical extents: 512.00 MiB
Size of logical volume vbirdvg/vbirdlv changed from 2.00 GiB (128 extents) to 2.50 GiB
(160 extents).
Logical volume vbirdlv successfully resized
# 这样就增加了 LV 了喔!lvresize 的语法很简单,基本上同样透过 -l 或 -L 来增加!
# 若要增加则使用 + ,若要减少则使用 - !详细的选项请参考 man lvresize 啰!
[root@initroot ~]# lvscan
ACTIVE '/dev/vbirdvg/vbirdlv' [2.50 GiB] inherit
ACTIVE '/dev/centos/root' [10.00 GiB] inherit
ACTIVE '/dev/centos/home' [5.00 GiB] inherit
ACTIVE '/dev/centos/swap' [1.00 GiB] inherit
# 可以发现 /dev/vbirdvg/vbirdlv 容量由 2G 增加到 2.5G 啰!
[root@initroot ~]# df -Th /srv/lvm
Filesystem
Type
/dev/mapper/vbirdvg-vbirdlv xfs
Size Used Avail Use% Mounted on
2.0G 111M
1.9G
6% /srv/lvm
看到了吧?最终的结果中 LV 真的有放大到 2.5GB 喔!但是文件系统却没有相对增加!而且,我们 的 LVM 可以在线直接处理,并不需要特别给他 umount 哩!真是人性化! 但是还是得要处理一下 文件系统的容量啦!开始观察一下文件系统,然后使用 xfs_growfs 来处理一下吧!
# 3.1 先看一下原本的文件系统内的 superblock 记录情况吧!
[root@initroot ~]# xfs_info /srv/lvm
meta-data=/dev/mapper/vbirdvg-vbirdlv isize=256
agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
= bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2
data=
realtime =none
sectsz=512 sunit=0 blks, lazy-count=1
extsz=4096 blocks=0, rtextents=0
[root@initroot ~]# xfs_growfs /srv/lvm
# 这一步骤才是最重要的!
[root@initroot ~]# xfs_info /srv/lvm
meta-data=/dev/mapper/vbirdvg-vbirdlv isize=256
agcount=5, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
= bsize=4096 blocks=655360, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
extsz=4096 blocks=0, rtextents=0
data
realtime =none
[root@initroot ~]# df -Th /srv/lvm
Filesystem
Type
/dev/mapper/vbirdvg-vbirdlv xfs
Size Used Avail Use% Mounted on
2.5G 111M
2.4G
5% /srv/lvm
[root@initroot ~]# ls -l /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
# 刚刚复制进去的数据可还是存在的喔!并没有消失不见!
在上表中,注意看两次 xfs_info 的结果,你会发现到
1)整个 block group (agcount) 的数量增加一个! 那个 block group 就是纪录新的设备容量之文件系统所在! 而你也会 2)发现整体的 block 数量增加 了!这样整个文件系统就给他放大了!同时,使用 df 去查阅时,就真的看到增加的量了吧! 文件 系统的放大可以在 On-line 的环境下实作耶!超棒的!
最后,请注意!目前的 XFS 文件系统中,并没有缩小文件系统容量的设计!也就是说,文件系统只 能放大不能缩小喔!如果你想要保有放大、缩小的本事, 那还请回去使用 EXT 家族最新的 EXT4 文 件系统啰!XFS 目前是办不到的!

使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率

回到顶部
想象一个情况,你有个目录未来会使用到大约 5T 的容量,但是目前你的磁盘仅有 3T,问题是,接 下来的两个月你的系统都还不会超过 3T 的容量, 不过你想要让用户知道,就是他最多有 5T 可以 使用就是了!而且在一个月内你确实可以将系统提升到 5T 以上的容量啊! 你又不想要在提升容量 后才放大到 5T!那可以怎么办?呵呵!这时可以考虑『实际用多少才分配多少容量给 LV 的 LVM Thin Volume 』功能!
另外,再想象一个环境,如果你需要有 3 个 10GB 的磁盘来进行某些测试,问题是你的环境仅有 5GB 的剩余容量,再传统的 LVM 环境下, LV 的容量是一开始就分配好的,因此你当然没有办法 在这样的环境中产生出 3 个 10GB 的设备啊!而且更呕的是,那个 10GB 的设备其实每个实际使用率都没有超过 10%, 也就是总用量目前仅会到 3GB 而已!但...我实际就有 5GB 的容量啊!为 何不给我做出 3 个只用 1GB 的 10GB 设备呢?有啊!就还是 LVM thin Volume 啊! 什么是 LVM thin Volume 呢?这东西其实挺好玩的,他的概念是:先建立一个可以实支实付、用多 少容量才分配实际写入多少容量的磁盘容量储存池 (thin pool), 然后再由这个 thin pool 去产生一个 『指定要固定容量大小的 LV 设备』,这个 LV 就有趣了!虽然你会看到『宣告上,他的容量可能 有 10GB ,但实际上, 该设备用到多少容量时,才会从 thin pool 去实际取得所需要的容量』!就 如同上面的环境说的,可能我们的 thin pool 仅有 1GB 的容量, 但是可以分配给一个 10GB 的 LV 设备!而该设备实际使用到 500M 时,整个 thin pool 才分配 500M 给该 LV 的意思!当然啦! 在 所有由 thin pool 所分配出来的 LV 设备中,总实际使用量绝不能超过 thin pool 的最大实际容量啊! 如这个案例说的, thin pool 仅有 1GB, 那所有的由这个 thin pool 建置出来的 LV 设备内的实际 用量,就绝不能超过 1GB 啊!
我们来实作个环境好了!刚刚的 vbirdvg 应该还有剩余容量,那么请这样作看看: 1. 由 vbirdvg 的剩余容量取出 1GB 来做出一个名为 vbirdtpool 的 thin pool LV 设备,这就是所谓的磁盘容 量储存池 (thin pool)
2. 由 vbirdvg 内的 vbirdtpool 产生一个名为 vbirdthin1 的 10GB LV 设备
3. 将此设备实际格式化为 xfs 文件系统,并且挂载于 /srv/thin 目录内! 话不多说,我们来实验看看!
# 1. 先以 lvcreate 来建立 vbirdtpool 这个 thin pool 设备:
[root@initroot ~]# lvcreate -L 1G -T vbirdvg/vbirdtpool
# 最重要的建置指令
[root@initroot ~]# lvdisplay /dev/vbirdvg/vbirdtpool
--- Logical volume ---
LV Name vbirdtpool
VG Name vbirdvg
LV UUID p3sLAg-Z8jT-tBuT-wmEL-1wKZ-jrGP-0xmLtk
LV Write Access read/write
LV Creation host, time study.centos.vbird, 2015-07-28 18:27:32 +0800
LV Pool metadata vbirdtpool_tmeta
LV Pool data vbirdtpool_tdata
LV Status available # open 0 LV Size 1.00 GiB # 总共可分配出去的容量
Allocated pool data 0.00% # 已分配的容量百分比
Allocated metadata 0.24% # 已分配的中介数据百分比
Current LE 64 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:6
# 非常有趣吧!竟然在 LV 设备中还可以有再分配 (Allocated) 的项目耶!果然是储存池!
[root@initroot ~]# lvs vbirdvg
# 语法为 lvs VGname
LV VG
Attr
LSize Pool Origin Data%
vbirdlv vbirdvg -wi-ao---- 2.50g
vbirdtpool vbirdvg twi-a-tz-- 1.00g
0.00
Meta%
Move Log Cpy%Sync Convert
0.24
# 这个 lvs 指令的输出更加简单明了!直接看比较清晰!
# 2. 开始建立 vbirdthin1 这个有 10GB 的设备,注意!必须使用 --thin 与 vbirdtpool 连结喔!
[root@initroot ~]# lvcreate -V 10G -T vbirdvg/vbirdtpool -n vbirdthin1
[root@initroot ~]# lvs vbirdvg
LV VG
Attr
LSize
vbirdlv vbirdvg -wi-ao----
Pool
Origin Data%
Meta%
Move Log Cpy%Sync Convert
2.50g
vbirdthin1 vbirdvg Vwi-a-tz-- 10.00g vbirdtpool 0.00
vbirdtpool vbirdvg twi-aotz-- 0.00
1.00g
0.27
# 很有趣吧!明明连 vbirdvg 这个 VG 都没有足够大到 10GB 的容量,透过 thin pool # 竟然就产生了 10GB 的 vbirdthin1 这个设备了!好有趣!
# 3. 开始建立文件系统
[root@initroot ~]# mkfs.xfs /dev/vbirdvg/vbirdthin1
[root@initroot ~]# mkdir /srv/thin
[root@initroot ~]# mount /dev/vbirdvg/vbirdthin1 /srv/thin
[root@initroot ~]# df -Th /srv/thin
Filesystem
Type
Size
/dev/mapper/vbirdvg-vbirdthin1 xfs
Used Avail Use% Mounted on
10G
33M
10G
1% /srv/thin
# 真的有 10GB 耶!!
# 4. 测试一下容量的使用!建立 500MB 的文件,但不可超过 1GB 的测试为宜!
[root@initroot ~]# dd if=/dev/zero of=/srv/thin/test.img bs=1M count=500
[root@initroot ~]# lvs vbirdvg
LV VG
Attr
vbirdlv vbirdvg -wi-ao----
LSize
Pool
Origin Data%
Meta%
Move Log Cpy%Sync Convert
2.50g
vbirdthin1 vbirdvg Vwi-aotz-- 10.00g vbirdtpool 4.99
vbirdtpool vbirdvg twi-aotz-- 49.93
1.00g
1.81
# 很要命!这时已经分配出 49% 以上的容量了!而 vbirdthin1 却只看到用掉 5% 而已! # 所以认为,这个 thin pool 非常好用!但是在管理上,得要特别特别的留意!
这就是用多少算多少的 thin pool 实作方式!基本上,用来骗人挺吓人的!小小的一个磁盘可以仿真 出好多容量!但实际上,真的可用容量就是实际的磁盘储存池内的容量! 如果突破该容量,这个 thin pool 可是会爆炸而让资料损毁的!要注意!要注意!

LVM 的 LV 磁盘快照

回到顶部
现在你知道 LVM 的好处咯,未来如果你有想要增加某个 LVM 的容量时,就可以透过这个放大的 功能来处理。 那么 LVM 除了这些功能之外,还有什么能力呢?其实他还有一个重要的能力,那就 是 LV 磁盘的快照 (snapshot)。 什么是 LV 磁盘快照啊?快照就是将当时的系统信息记录下来,就 好像照相记录一般! 未来若有任何资料更动了,则原始资料会被搬移到快照区,没有被更动的区域 则由快照区与文件系统共享。 用讲的好像很难懂,我们用图解说明一下好了:
图 14.3.3、LVM 快照区域的备份示意图
左图为最初建置 LV 磁盘快照区的状况, LVM 会预留一个区域 (左图的左侧三个 PE 区块) 作为数 据存放处。 此时快照区内并没有任何数据,而快照区与系统区共享所有的 PE 数据, 因此你会看 到快照区的内容与文件系统是一模一样的。 等到系统运作一阵子后,假设 A 区域的数据被更动了 (上面右图所示),则更动前系统会将该区域的数据移动到快照区, 所以在右图的快照区被占用了一 块 PE 成为 A,而其他 B 到 I 的区块则还是与文件系统共享!
照这样的情况来看, LVM 的磁盘快照是非常棒的『备份工具』,因为他只有备份有被更动到的数据, 文件系统内没有被变更的数据依旧保持在原本的区块内,但是 LVM 快照功能会知道那些数据放置 在哪里, 因此『快照』当时的文件系统就得以『备份』下来,且快照所占用的容量又非常小!所以 您说,这不是很棒的工具又是什么?
那么快照区要如何建立与使用呢?首先,由于快照区与原本的 LV 共享很多 PE 区块,因此快照区 与被快照的 LV 必须要在同一个 VG 上头。
另外,或许你跟一样,会想到说:『咦! 我们能不能使用 thin pool 的功能来制作快照』呢?老 实说,是可以的!不过使用上面的限制非常的多!包括最好要在同一个 thin pool 内的原始 LV 磁盘, 如果为非 thin pool 内的原始 LV 磁盘快照,则该磁盘快照『不可以写入』,亦即 LV 磁盘要设定 成只读才行!同时, 使用 thin pool 做出来的快照,通常都是不可启动 (inactive) 的预设情况,启动 又有点麻烦~所以,至少目前 (CentOS 7.x) 的环境下, 还不是很建议你使用 thin pool 快照喔! 底下我们针对传统 LV 磁盘进行快照的建置,大致流程为:
预计被拿来备份的原始 LV 为 /dev/vbirdvg/vbirdlv 这个东西~
使用传统方式快照建置,原始碟为 /dev/vbirdvg/vbirdlv,快照名称为 vbirdsnap1,容量为 vbirdvg 的所有剩 余容量
传统快照区的建立# 1. 先观察 VG 还剩下多少剩余容量
[root@initroot ~]# vgdisplay vbirdvg
....(其他省略)....
Total PE 252
Alloc PE / Size 226 / 3.53 GiB
Free 26 / 416.00 MiB
PE / Size
# 就只有剩下 26 个 PE 了!全部分配给 vbirdsnap1 啰!
# 2. 利用 lvcreate 建立 vbirdlv 的快照区,快照被取名为 vbirdsnap1,且给予 26 个 PE
[root@initroot ~]# lvcreate -s -l 26 -n vbirdsnap1 /dev/vbirdvg/vbirdlv
Logical volume "vbirdsnap1" created
# 上述的指令中最重要的是那个 -s 的选项!代表是 snapshot 快照功能之意! # -n 后面接快照区的设备名称, /dev/.... 则是要被快照的 LV 完整檔名。 # -l 后面则是接使用多少个 PE 来作为这个快照区使用。
[root@initroot ~]# lvdisplay /dev/vbirdvg/vbirdsnap1
--- Logical volume ---
LV Path /dev/vbirdvg/vbirdsnap1
LV Name vbirdsnap1
VG Name vbirdvg
LV UUID I3m3Oc-RIvC-unag-DiiA-iQgI-I3z9-0OaOzR
LV Write Access read/write
LV Creation host, time study.centos.vbird, 2015-07-28 19:21:44 +0800
LV snapshot status active destination for vbirdlv
LV Status available
# open 0
LV Size 2.50 GiB
Current LE 160
COW-table size 416.00 MiB
COW-table LE 26
Allocated to snapshot 0.00%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:11
# 原始碟,就是 vbirdlv 的原始容量
# 这个快照能够纪录的最大容量!
# 目前已经被用掉的容量!
您看看!这个 /dev/vbirdvg/vbirdsnap1 快照区就被建立起来了!而且他的 VG 量竟然与原本的 /dev/vbirdvg/vbirdlv 相同!也就是说,如果你真的挂载这个设备时,看到的数据会跟原本的 vbirdlv 相 同喔!我们就来测试看看:
[root@initroot ~]# mkdir /srv/snapshot1[root@initroot ~]# mount -o nouuid /dev/vbirdvg/vbirdsnap1 /srv/snapshot1
[root@initroot ~]# df -Th /srv/lvm /srv/snapshot1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 111M 2.4G 5% /srv/lvm
/dev/mapper/vbirdvg-vbirdsnap1 xfs 2.5G 111M 2.4G 5% /srv/snapshot1
# 有没有看到!这两个咚咚竟然是一模一样喔!我们根本没有动过 # /dev/vbirdvg/vbirdsnap1 对吧!不过这里面会主动记录原 vbirdlv 的内容! 因为 XFS 不允许相同的 UUID 文件系统的挂载,因此我们得要加上那个 nouuid 的参数,让文件 系统忽略相同的 UUID 所造成的问题! 没办法啊!因为快照出来的文件系统当然是会一模一样的!

利用快照区复原系统

回到顶部
首先,我们来玩一下,如何利用快照区复原系统吧!不过你要注意的是,你要复原的数据量不能够高 于快照区所能负载的实际容量。由于原始数据会被搬移到快照区, 如果你的快照区不够大,若原始 资料被更动的实际数据量比快照区大,那么快照区当然容纳不了,这时候快照功能会失效喔!
我们的 /srv/lvm 已经有 /srv/lvm/etc, /srv/lvm/log 等目录了,接下来我们将这个文件系统的内容作个 变更, 然后再以快照区数据还原看看:
# 1. 先将原本的 /dev/vbirdvg/vbirdlv 内容作些变更,增增减减一些目录吧!
[root@initroot ~]# df -Th /srv/lvm /srv/snapshot1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 111M 2.4G 5% /srv/lvm
/dev/mapper/vbirdvg-vbirdsnap1 xfs 2.5G 111M 2.4G 5% /srv/snapshot1
[root@initroot ~]# cp -a /usr/share/doc /srv/lvm
[root@initroot ~]# rm -rf /srv/lvm/log
[root@initroot ~]# rm -rf /srv/lvm/etc/sysconfig
[root@initroot ~]# df -Th /srv/lvm /srv/snapshot1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 146M 2.4G 6% /srv/lvm
/dev/mapper/vbirdvg-vbirdsnap1 xfs 2.5G 111M 2.4G 5% /srv/snapshot1
[root@initroot ~]# ll /srv/lvm /srv/snapshot1
/srv/lvm:
total 60
drwxr-xr-x. 887 root root 28672 Jul 20 23:03 doc
drwxr-xr-x. 131 root root
8192 Jul 28 00:12 etc
/srv/snapshot1:
total 16
drwxr-xr-x. 131 root root 8192 Jul 28 00:12 etc
drwxr-xr-x.
16 root root 4096 Jul 28 00:01 log
# 两个目录的内容看起来已经不太一样了喔!检测一下快照 LV 吧![root@initroot ~]# lvdisplay /dev/vbirdvg/vbirdsnap1
--- Logical volume ---
LV Path
/dev/vbirdvg/vbirdsnap1
....(中间省略)....
Allocated to snapshot
21.47%
# 仅列出最重要的部份!就是全部的容量已经被用掉了 21.4% 啰!
# 2. 利用快照区将原本的 filesystem 备份,我们使用 xfsdump 来处理!
[root@initroot ~]# 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 的内容 吧!
# 3. 将 vbirdsnap1 卸除并移除 (因为里面的内容已经备份起来了)
[root@initroot ~]# umount /srv/snapshot1
[root@initroot ~]# lvremove /dev/vbirdvg/vbirdsnap1
Do you really want to remove active logical volume "vbirdsnap1"? [y/n]: y
Logical volume "vbirdsnap1" successfully removed
[root@initroot ~]# umount /srv/lvm
[root@initroot ~]# mkfs.xfs -f /dev/vbirdvg/vbirdlv
[root@initroot ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@initroot ~]# xfsrestore -f /home/lvm.dump -L lvm1 /srv/lvm
[root@initroot ~]# 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
# 是否与最初的内容相同啊!这就是透过快照来还原的一个简单的方法啰!
利用快照区进行各项练习与测试的任务,再以原系统还原快照 换个角度来想想,我们将原本的 vbirdlv 当作备份数据,然后将 vbirdsnap1 当作实际在运作中的数 据, 任何测试的动作都在 vbirdsnap1 这个快照区当中测试,那么当测试完毕要将测试的数据删除时, 只要将快照区删去即可! 而要复制一个 vbirdlv 的系统,再作另外一个快照区即可!这样是否非常 方便啊? 这对于教学环境中每年都要帮学生制作一个练习环境主机的测试,非常有帮助呢!Tips 以前老是觉得使用 LVM 的快照来进行备份不太合理,因为还要制作一个备份档!后来仔细研究并参考徐 秉义老师的教材(注 4)后,才发现 LVM 的快照实在是一个棒到不行的工具!尤其是在虚拟机当中建置多份给同学 使用的测试环境, 你只要有一个基础的环境保持住,其他的环境使用快照来提供即可。实时同学将系统搞烂了, 你只要将快照区删除, 再重建一个快照区!这样环境就恢复了!天吶!实在是太棒了! ^_^

关闭LVM

回到顶部
会玩 LVM 还不行!你必须要会移除系统内的 LVM 喔!因为你的实体 partition 已经被使用到 LVM 去, 如果你还没有将 LVM 关闭就直接将那些 partition 删除或转为其他用途的话,系统是会发生 很大的问题的! 所以啰,你必须要知道如何将 LVM 的设备关闭并移除才行!会不会很难呢?其实 不会啦! 依据以下的流程来处理即可:
1. 先卸除系统上面的 LVM 文件系统 (包括快照与所有 LV); 2. 使用 lvremove 移除 LV ; 3. 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志; 4. 使用 vgremove 移除 VG: 5. 使用 pvremove 移除 PV; 6. 最后,使用 fdisk 修改 ID 回来啊!
好吧!那就实际的将我们之前建立的所有 LVM 数据给删除吧![root@initroot ~]# umount /srv/lvm /srv/thin /srv/snapshot1
[root@initroot ~]# lvs vbirdvg
LV VG
Attr
vbirdlv vbirdvg -wi-a-----
LSize
Pool
Origin Data%
Meta%
Move Log Cpy%Sync
2.50g
vbirdthin1 vbirdvg Vwi-a-tz-- 10.00g vbirdtpool 4.99
vbirdtpool vbirdvg twi-aotz-- 49.93
1.00g
1.81
# 要注意!先删除 vbirdthin1 --> vbirdtpool --> vbirdlv 比较好!
[root@initroot ~]# lvremove /dev/vbirdvg/vbirdthin1 /dev/vbirdvg/vbirdtpool
[root@initroot ~]# lvremove /dev/vbirdvg/vbirdlv
[root@initroot ~]# vgchange -a n vbirdvg
0 logical volume(s) in volume group "vbirdvg" now active
[root@initroot ~]# vgremove vbirdvg
Volume group "vbirdvg" successfully removed
[root@initroot ~]# pvremove /dev/vda{5,6,7,8}
最后再用 gdisk 将磁盘的 ID 给他改回来 83 就好啦!整个过程就这样的啦! ^_^

LVM指令汇整

回到顶部
好了,我们将上述用过的一些指令给他汇整一下,提供给您参考参考: 任务 PV 阶段 VG 阶段 filesystem (XFS / EXT4) LV 阶段 搜寻(scan) pvscan vgscan lvscan lsblk, blkid 建立(create) pvcreate vgcreate lvcreate mkfs.xfs 列出(display) pvdisplay vgdisplay lvdisplay df, mount 增加(extend) vgextend lvextend (lvresize) xfs_growfs resize2fs 减少(reduce) vgreduce lvreduce (lvresize) 不支援 resize2fs vgremove lvremove umount, 重新格式化 lvresize xfs_growfs lvchange /etc/fstab, remount 删除(remove) pvremove 改变容量(resize) 改变属性(attribute) pvchange vgchange mkfs.ext4 resize2fs 至于文件系统阶段 (filesystem 的格式化处理) 部分,还需要以 xfs_growfs 来修订文件系统实际的大 小才行啊! ^_^ 。至于虽然 LVM 可以弹性的管理你的磁盘容量,但是要注意,如果你想要使用 LVM 管理您的硬盘时,那么在安装的时候就得要做好 LVM 的规划了, 否则未来还是需要先以传统的磁 盘增加方式来增加后,移动数据后,才能够进行 LVM 的使用啊!
14.4 本章总结
Quota 可公平的分配系统上面的磁盘容量给用户;分配的资源可以是磁盘容量(block)或可建立文件数量 (inode);
Quota 的限制可以有 soft/hard/grace time 等重要项目;
Quota 是针对整个 filesystem 进行限制,XFS 文件系统可以限制目录!
Quota 的使用必须要核心与文件系统均支持。文件系统的参数必须含有 usrquota, grpquota, prjquota
Quota 的 xfs_quota 实作的指令有 report, print, limit, timer... 等指令;
磁盘阵列 (RAID) 有硬件与软件之分,Linux 操作系统可支持软件磁盘阵列,透过 mdadm 套件来达成;
磁盘阵列建置的考虑依据为『容量』
、 『效能』
、 『资料可靠性』等;
磁盘阵列所建置的等级常见有的 raid0, raid1, raid1+0, raid5 及 raid6
硬件磁盘阵列的设备文件名与 SCSI 相同,至于 software RAID 则为 /dev/md[0-9]
软件磁盘阵列的状态可藉由 /proc/mdstat 文件来了解;
LVM 强调的是『弹性的变化文件系统的容量』
; 与 LVM 有关的组件有: PV/VG/PE/LV 等组件,可以被格式化者为 LV
新的 LVM 拥有 LVM thin volume 的功能,能够动态调整磁盘的使用率!
LVM 拥有快照功能,快照可以记录 LV 的数据内容,并与原有的 LV 共享未更动的数据,备份与还原就 变的很简单;
XFS 透过 xfs_growfs 指令,可以弹性的调整文件系统的大小
14.5 本章习题
( 要看答案请将鼠标移动到『答: 』底下的空白处,按下左键圈选空白处即可察看 )
情境模拟题一:由于 LVM 可以弹性调整 filesystem 的大小,但是缺点是可能没有加速与硬件备份(与快照 不同)的功能。 而磁盘阵列则具有效能与备份的功能,但是无法提供类似 LVM 的优点。在此情境中,我 们想利用『在 RAID 上面建置 LVM』的功能,以达到两者兼顾的能力。
o 目标:测试在 RAID 磁盘上面架构 LVM 系统;
o 需求:需要具有磁盘管理的能力,包括 RAID 与 LVM;
o 前提:会用到本章建立出来的 /dev/vda5, /dev/vda6, /dev/vda7 三个分区槽!
那要如何处理呢?如下的流程一个步骤一个步骤的实施看看吧:
1. 重新处理系统,我们在这个练习当中,需要 /dev/vda5, /dev/vda6, /dev/vda7 建置成一个 RAID5 的 /dev/md0 磁盘!详细的作法这里就不谈了! 你得要使用 gdisk 来处理成为如下的模样:
[root@initroot ~]# gdisk -l /dev/vda
Number 2. Start (sector) End (sector) Size Code 2.0 MiB EF02 1024.0 MiB 0700 Name 1 2048 6143 2 6144 2103295 3 2103296 65026047 30.0 GiB 8E00 4 65026048 67123199 1024.0 MiB 8300 Linux filesystem 5 67123200 69220351 1024.0 MiB FD00 Linux RAID 6 69220352 71317503 1024.0 MiB FD00 Linux RAID 7 71317504 73414655 1024.0 MiB FD00 Linux RAID
开始使用 mdadm 来建立一个简单的 RAID5 数组!简易的流程如下:
[root@initroot ~]# mdadm --create /dev/md0 --auto=yes
--level=5
\
> --raid-devices=3 /dev/vda{5,6,7}
[root@initroot ~]# mdadm --detail /dev/md0 | grep -i uuid
UUID : efc7add0:d12ee9ca:e5cb0baa:fbdae4e6
[root@initroot ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=efc7add0:d12ee9ca:e5cb0baa:fbdae4e6
若无出现任何错误讯息,此时你已经具有 /dev/md0 这个磁盘阵列设备了!接下来让我们处理 LVM 吧! 3. 开始处理 LVM ,现在我们假设所有的参数都使用默认值,包括 PE ,然后 VG 名为 raidvg ,LV 名为 raidlv ,底下为基本的流程:
[root@initroot ~]# pvcreate /dev/md0 #建立 PV
[root@initroot ~]# vgcreate raidvg /dev/md0 #建立 VG
[root@initroot ~]# lvcreate -L 1.5G -n raidlv raidvg #建立 LM
[root@initroot ~]# lvscanACTIVE
'/dev/raidvg/raidlv' [1.50 GiB] inherit
这样就搞定了 LVM 了!而且这个 LVM 是架构在 /dev/md0 上面的喔!然后就是文件系统的建立与挂载了! 4. 尝试建立成为 XFS 文件系统,且挂载到 /srv/raidlvm 目录下:
[root@initroot ~]# mkfs.xfs /dev/raidvg/raidlv
[root@initroot ~]# blkid /dev/raidvg/raidlv
/dev/raidvg/raidlv: UUID="4f6a587d-3257-4049-afca-7da1d405117d" TYPE="xfs"
[root@initroot ~]# vim /etc/fstab
UUID="4f6a587d-3257-4049-afca-7da1d405117d" /srv/raidlvm xfs
defaults 0 0
[root@initroot ~]# mkdir /srv/raidlvm
[root@initroot ~]# mount -a
[root@initroot ~]# df -Th /srv/raidlvm
Filesystem
Type
/dev/mapper/raidvg-raidlv xfs
5.
Size
Used Avail Use% Mounted on
1.5G
33M
1.5G
3% /srv/raidlvm
上述就是 LVM 架构在 RAID 上面的技巧,之后的动作都能够使用本章的其他管理方式来管理, 包括 RAID 热拔插机制、LVM 放大缩小机制等等。
简答题部分: 在前一章的第一个大量新增账号范例中, 如果我想要让每个用户均具有 soft/hard 各为 40MB/50MB 的容 量时,应该如何修改这个 script ?
你得先要依据本章的作法,先将 /home 制作好 quota 的环境然后, 你可以在 do...done 内的最后一行,新增一行内容为: xfs_quota -x -c "limit -u bsoft=40M bhard=50M ${username}" /home 这样就可以在制作用户时,指定更新密码且给予 quota 的限制!
如果我想要让 RAID 具有保护数据的功能,防止因为硬件损毁而导致数据的遗失,那我应该要选择的 RAID 等级可能有哪些? (请以本章谈到的等级来思考即可)
具有备份数据的有: RAID-1, RAID-5, RAID-6
在预设的 LVM 设定中,请问 LVM 能否具有『备份』的功能? 是有的,就是那个快照 (snopshot) 的功能,此功能即可进行数据的备份!
如果你的计算机主机有提供 RAID 0 的功能,你将你的三颗硬盘全部在 BIOS 阶段使用 RAID 芯片整合 成为一颗大磁盘, 则此磁盘在 Linux 系统当中的文件名为何?
由于硬件磁盘阵列是在 BIOS 阶段完成的,因此 Linux 系统会捉到一个完整的大的 RAID 磁盘,此磁盘的文件名就会是 『 /dev/sda 』
! 但如果是 Intel 的芯片组,则还是可能会成为 /dev/md127 等相关的档名!14.6 参考数据与延伸阅读 注 1:相关的 XFS 文件系统的 quota 说明,可以参考底下的文件:

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读