Linux 基础学习训练教材 - CentOS 7.x

第 14 堂课:高端文件系统管理

文件系统是个迷人又磨人的东西~管理的好,你的系统会很稳定,管理不好,扩充容量又会产生大问题~加油吧!

最近更新时间: 2017/04/05

基础的文件系统管理中,通常一个 partition 只能作为一个 filesystem。但实际上,我们可以通过 RAID 的技术以及 LVM 的技术将不同的 partition/disk 集成成为一个大的文件系统,而这些文件系统又能具有硬件容错的功能在,对于关注保存设备物理安全性的管理员来说,这些技术相当的重要!

14.1:软件磁盘数组 (Software RAID)

数组 (RAID) 的目的主要在『加大容量』、『磁盘容错』、『加快性能』等方面,而根据你着重的面向就得要使用不同的磁盘数组等级了。

14.1.1:什么是 RAID

磁盘数组全名是『 Redundant Arrays of Independent Disks, RAID 』,英翻中的意思为:独立容错式磁盘数组,旧称为容错式廉价磁盘数组, 反正就称为磁盘数组即可!RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘集成成为一个较大的磁盘设备; 而这个较大的磁盘功能可不止是保存而已,他还具有数据保护的功能。 整个 RAID 由于选择的等级 (level) 不同,而使得集成后的磁盘具有不同的功能,基本常见的 level 有这几种:

  • RAID-0 (等量模式, stripe, 性能最佳):两颗以上的磁盘组成 RAID-0 时,当有 100MB 的数据要写入,则会将该数据以固定的 chunk 拆解后, 分散写入到两颗磁盘,因此每颗磁盘只要负责 50MB 的容量读写而已。如果有 8 颗组成时,则每颗仅须写入 12.5MB ,速度会更快。此种磁盘数组性能最佳, 容量为所有磁盘的总和,但是不具容错功能。
  • RAID-1 (映射模式, mirror, 完整备份):大多为 2 的倍数所组成的磁盘数组等级。若有两颗磁盘组成 RAID-1 时,当有 100MB 的数据要写入, 每颗均会写入 100MB,两颗写入的数据一模一样 (磁盘映射 mirror 功能),因此被称为最完整备份的磁盘数组等级。但因为每颗磁盘均须写入完整的数据, 因此写入性能不会有明显的提升,但读取的性能会有进步。同时容错能力最佳,但总体容量会少一半。
  • RAID 1+0:此种模式至少需要 4 颗磁盘组成,先两两组成 RAID1,因此会有两组 RAID1,再将两组 RAID1 组成最后一组 RAID0,整体数据有点像底下的图标:
    图 14.1.1、RAID-1+0 的磁盘写入示意图
    图 14.1.1、RAID-1+0 的磁盘写入示意图
    因此性能会有提升,同时具备容错,虽然容量会少一半。
  • RAID 5, RAID 6 (性能与数据备份的均衡考量):RAID 5 至少需要 3 颗磁盘组成,在每一层的 chunk 当中,选择一个进行备份, 将备份的数据平均分散在每颗磁盘上,因此任何一颗磁盘损毁时,都能够重建出原本的磁盘数据,原理图标有点像底下这样:
    图 14.1.2、RAID-5 的磁盘写入示意图
    图 14.1.2、RAID-5 的磁盘写入示意图
    因为有一颗容量会用在备份上,因此总体容量少一颗,而为了计算备份的同位检查码 (partity),因此性能较难评估,原则上,性能比起单颗磁盘还是会稍微提升。 不过还是具备有容错功能,在越多颗磁盘组成时,比 RAID-1 要节省很多的容量。不过为了担心单颗备份还是不太足够,因此有 RAID 6 可以使用两个 partity 来备份, 因此会占用两颗容量就是了。
例题:尝试完成底下的表格
项目RAID0RAID1RAID10RAID5RAID6
最少磁盘数2
最大容错磁盘数(1)n-1
数据安全性(1)完全没有
理论写入性能(2)n1n/2<n-1<n-2
理论读出性能(2)nnn<n-1<n-2
可用容量(3)n1
一般应用强调性能但数据不重要的环境数据与备份服务器、云系统常用数据与备份数据与备份

而达成磁盘数组功能的,主要有硬件 RAID 与软件 RAID。

  • 硬件磁盘数组:中高端硬件 RAID 为独立的 RAID 芯片,内含 CPU 运算功能,可以运算类似 RAID 5/6 的 parity 数据,据以写入磁盘当中。越高端的 RAID 还具有更多的缓存 (cache memory), 可以加速读/写的性能。由于是硬件磁盘数组组成的『大容量磁盘』,因此 Linux 会将他视为一颗独立的物理磁盘,文件名通常就是 /dev/sd[abcd..]。
  • 软件磁盘数组:由操作系统提供仿真,通过 CPU 与 mdadm 软件仿真出中高端磁盘数组卡的功能,以达到磁盘数组所需要的性能、容错、容量增大的功能。 因为是操作系统仿真的,因此文件名会是 /dev/md[0123..]。这种作法很常见于 NAS 文件服务器环境中。
例题:
根据上述的内容,简易说明磁盘数组对于服务器的重要性在哪里?

14.1.2:Software RAID 的使用

Software RAID 主要通过 mdadm 这个软件的协助,因此需要先确认 mdadm 是否安装妥当。而 mdadm 的指令也相当简单,范例如下:

  • 创建磁盘数组
[root@localhost ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx 

--create          :为创建 RAID 的选项;
--auto=yes        :决定创建后面接的软件磁盘数组设备,亦即 /dev/md0, /dev/md1...
--level=[015]     :设置这组磁盘数组的等级。支持很多,不过建议只要用 0, 1, 5 即可
--chunk=Nk        :决定这个设备的 chunk 大小,也可以当成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N  :使用几个磁盘 (partition) 作为磁盘数组的设备
--spare-devices=N :使用几个磁盘作为备用 (spare) 设备
例题:现在利用上述的动作,以底下的设置来规范磁盘数组:
  • 利用 4 个 partition 组成 RAID 5;
  • 每个 partition 约为 300MB 大小,需确定每个 partition 一样大较佳;
  • 利用 1 个 partition 设置为 spare disk
  • 这个 spare disk 的大小与其他 RAID 所需 partition 一样大!
  • chunk 设置为 256K 这么大即可!
  • 将此 RAID 5 设备挂载到 /srv/raid 目录下
请特别注意,因为使用了磁盘数组,因此在进行 mkfs 时,务必参考磁盘数组优化的参数。以 mkfs.xfs 为例, 请参考 su 以及 sw 的参数意义。此案例中, su 应为 256k,而 sw 应该是 (4-1) =3 。
  • 观察磁盘数组

磁盘数组建置妥当后,应该观察一下运作的状况比较妥当。主要的观察方式为:

[root@localhost ~]# mdadm --detail
[root@localhost ~]# cat /proc/mdstat

需要注意到是否有磁盘在损毁的状况才行。

  • 磁盘数组的救援功能

假设 (1)磁盘数组有某颗磁盘损毁了,或 (2)磁盘使用寿命也差不多,预计要整批换掉时,使用抽换的方式一颗一颗替换,如此则不用重新创建磁盘数组。

在此情况下,管理员应该要将磁盘数组设置为损毁,然后将之抽离后,换插新的硬盘才可以。基本的指令需求如下:

[root@localhost ~]# mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备] 

--add    :会将后面的设备加入到这个 md 中!
--remove :会将后面的设备由这个 md 中移除
--fail   :会将后面的设备设置成为出错的状态
例题:
  1. 先观察刚刚创建的磁盘数组是否正常运作,同时观察文件系统是否正常 (/srv/raid 是否可读写)
  2. 将某颗运作中的磁盘 (例如 /dev/vda7) 设置为错误 (--fail),再观察磁盘数组与文件系统
  3. 将错误的磁盘抽离 (--remove) 之后,假设修理完毕,再加入该磁盘数组 (--add),然后再次观察磁盘数组与文件系统

14.2:逻辑滚动条管理员 (Logical Volume Manager)

虽然 RAID 可以将文件系统容量增加,也有性能增加与容错的机制,但是就是没有办法在既有的文件系统架构下,直接将容量放大的机制。 此时,可以弹性放大与缩小的 LVM 辅助,就很有帮助了。不过 LVM 主要是在弹性的管理文件系统,不在于性能与容错上。 因此,若需要容错与性能,可以将 LVM 放置到 RAID 设备上即可。

14.2.1:LVM 基础: PV, PE, VG, LV 的意义

LVM 的全名是 Logical Volume Manager,中文可以翻译作逻辑滚动条管理员。之所以称为『滚动条』可能是因为可以将 filesystem 像滚动条一样伸长或缩短之故!LVM 的作法是将几个实体的 partitions (或 disk) 通过软件组合成为一块看起来是独立的大磁盘 (VG) , 然后将这块大磁盘再经过分割成为可使用分区 (LV), 最终就能够挂载使用了。

  • Physical Volume, PV, 实体滚动条:作为 LVM 最基础的物理滚动条,可以是 partition 也可以是整颗 disk。
  • Volume Group, VG, 滚动条群组:将许多的 PV 集成成为一个滚动条群组 (VG),这就是所谓的最大的主要大磁盘。 读者应该知道磁盘的最小保存单位为 sector,目前主流 sector 为 512bytes 或 4K。而 LVM 也有最小保存单位, 那就是 Physical Extent (PE),所有的数据都是通过 PE 在 VG 当中进行交换的。
  • Physical Extent, PE, 实体范围区块:PE 是整个 LVM 最小的保存区块,系统的文件数据都是借由写入 PE 来处理的。 简单的说,这个 PE 就有点像文件系统里面的 block 。PE 缺省需要是 2 的次方量,且最小为 4M 才行。
  • Logical Volume, LV, 逻辑滚动条:最终将 VG 再切割出类似 partition 的 LV 即是可使用的设备了。 LV 是借由『分配数个 PE 所组成的设备』,因此 LV 的容量与 PE 的容量大小有关。

上述谈到的数据,可使用下图来解释彼此的关系:

图14.2.1、LVM 各组件的实现流程图标
图14.2.1、LVM 各组件的实现流程图标
例题:
使用 gdisk 或 fdisk 指令查找一下,若需要将 partition 指定为 LVM 时,其 system ID (文件系统识别码) 应该指定为什么?

14.2.2:LVM 实做流程

如前一小节所述,管理员若想要处理 LVM 的功能,应该从 partition --> PV --> VG --> LV --> filesystem 的角度来处理。 请读者以底下的设置来实做出一组 LVM 来使用:

  • 使用 4 个 partition ,每个 partition 的容量均为 300MB 左右,且 system ID 需要为 8e;
  • 全部的 partition 集成成为一个 VG,VG 名称设置为 myvg ;且 PE 的大小为 16MB;
  • 创建一个名为 mylv 的 LV,容量大约设置为 500MB 左右
  • 最终这个 LV 格式化为 xfs 的文件系统,且挂载在 /srv/lvm 中

先使用 gdisk 或 fdisk 分割出本案例所需要的 4 个分割,假设分割完成的磁盘文件名为 /dev/vda{9,10,11,12} 四个。 接下来即可使用 LVM 提供的指令来处理后续工作。一般来说, LVM 的三个阶段 (PV/VG/LV) 均可分为『创建』、『扫描』与『详细查阅』等步骤, 其相关指令可以汇整如下表:

任务PV 阶段VG 阶段LV 阶段filesystem
(XFS / EXT4)
搜索(scan)pvscanvgscanlvscanlsblk, blkid
创建(create)pvcreatevgcreatelvcreatemkfs.xfsmkfs.ext4
列出(display)pvdisplayvgdisplaylvdisplaydf, mount
增加(extend) vgextendlvextend (lvresize)xfs_growfsresize2fs
减少(reduce) vgreducelvreduce (lvresize)不支持resize2fs
删除(remove)pvremovevgremovelvremoveumount, 重新格式化
改变容量(resize)  lvresizexfs_growfsresize2fs
改变属性(attribute)pvchangevgchangelvchange/etc/fstab, remount
  • PV 阶段

所有的 partition 或 disk 均需要做成 LVM 最底层的实体滚动条,直接使用 pvcreate /device/name 即可。实做完成后,记得使用 pvscan 查阅是否成功。

[root@localhost ~]# pvcreate /dev/vda{9,10,11,12}
[root@localhost ~]# pvscan
  PV /dev/vda3    VG centos   lvm2 [20.00 GiB / 5.00 GiB free]
  PV /dev/vda12               lvm2 [300.00 MiB]
  PV /dev/vda11               lvm2 [300.00 MiB]
  PV /dev/vda10               lvm2 [300.00 MiB]
  PV /dev/vda9                lvm2 [300.00 MiB]
  Total: 5 [21.17 GiB] / in use: 1 [20.00 GiB] / in no VG: 4 [1.17 GiB]
  • VG 阶段

VG 比较需要注意的有三个项目:

  • VG 内的 PE 数值需要是 2 的倍数,如果没有设置,缺省会是 4MB
  • VG 需要给名字
  • 需要指定哪几个 PV 加入这个 VG 中。

根据上述的数据,使用 vgcreate --help 可以找到相对应的选项与参数,于是使用如下的指令来完成 VG 的任务:

[root@localhost ~]# vgcreate -s 16M myvg /dev/vda{9,10,11,12}
[root@localhost ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        4
  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                4
  Act PV                4
  VG Size               1.12 GiB
  PE Size               16.00 MiB
  Total PE              72
  Alloc PE / Size       0 / 0
  Free  PE / Size       72 / 1.12 GiB
  VG UUID               SYirFy-Tnin-zd58-CDMK-HWWm-0hVS-dMKFkB
  • LV 阶段

LV 为实际被使用在文件系统内的设备,建置时需要考量的项目大概有:

  • 使用哪一个 VG 来进行 LV 的建置
  • 使用多大的容量或多少个 PE 来建置
  • 亦需要有 LV 的名字

同样使用 lvcreate --help 查阅,之后可以得到如下的选项与参数之设置:

[root@localhost ~]# lvcreate -n mylv -L 500M myvg
  Rounding up size to full physical extent 512.00 MiB
  Logical volume "mylv" created.

[root@localhost ~]# lvdisplay /dev/myvg/mylv
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                swQ33g-yEMi-frFh-iFyF-tRFS-jqbZ-VSLAw8
  LV Write Access        read/write
  LV Creation host, time www.centos, 2016-06-02 11:57:54 +0800
  LV Status              available
  # open                 0
  LV Size                512.00 MiB
  Current LE             32
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

由于实际创建的 LV 大小是由 PE 的数量来决定,因为本案例中使用 16MB 的 PE,因此不会刚好等于 500MB,故 LV 自动选择接近 500MB 的数值来创建, 因此上表中会得到使用 512MB 的容量。

另外,最终实际可用的 LV 设备名称为 /dev/myvg/mylv ,而因为 LVM 又是由 device mapper 的服务所管理的, 因此最终的名称也会指向到 /dev/mapper/myvg-mylv 当中。无论如何,读者仅需要记忆 /dev/myvg/mylv 这种格式的设备文件名即可。

例题:
  1. 请将上述的 /dev/myvg/mylv 实际格式化为 xfs 文件系统,且此 fileysytem 可以开机后自动挂载于 /srv/lvm 目录下。
  2. 再创建一个名为 /dev/myvg/mylvm2 的 LV 设备,容量约为 300MB 左右,格式化为 ext4 文件系统,开机后自动挂载于 /srv/lvm2 目录下。

14.2.3:弹性化处理 LVM 文件系统

LVM 最重要的任务就是进行设备的容量放大与缩小,不过,前提是在该设备下的文件系统能够支持放大与缩小才行。 目前在 CentOS 7 上面主要的两款文件系统中, ext4 可以放大与缩小,但是 xfs 文件系统则仅能放大而已。因此使用上需要特别注意。

  • 将 myvg 所有剩余容量分配给 /dev/myvg/mylvm2

从上面的案例中,读者可以知道 myvg 这个 VG 的总容量 1.1G 当中,有 500M 给 /dev/myvg/mylv 而 300M 给 /dev/myvg/mylvm2, 因此剩下大约 300MB 左右,读者可以使用『 vgdisplay myvg 』来查找剩余的容量。若需要将文件系统放大,则需要进行:

  • 先将 mylvm2 放大
  • 再将上面的文件系统放大

上述两个步骤的顺序不可错乱。将 mylvm2 放大的方式为:

[root@localhost ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               1.12 GiB
  PE Size               16.00 MiB
  Total PE              72
  Alloc PE / Size       51 / 816.00 MiB
  Free  PE / Size       21 / 336.00 MiB
  VG UUID               SYirFy-Tnin-zd58-CDMK-HWWm-0hVS-dMKFkB

[root@localhost ~]# lvscan 
  ACTIVE            '/dev/myvg/mylv' [512.00 MiB] inherit
  ACTIVE            '/dev/myvg/mylvm2' [304.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [10.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [3.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit

如上所示,读者可以发现剩余 21 个 PE,而目前 mylvm2 拥有 304MB 的容量。因此,我们可以使用:

  • 不考虑原本的,额外加上 21 个 PE 在 mylvm2 上面,或;
  • 原有的 304MB + 336MB 最终给予 640MB 的容量。

这两种方式都可以!主要都是通过 lvresize 这个指令来达成。要额外增加时,使用『 lvresize -l +21 ... 』的方式, 若要给予固定的容量,则使用『 lvresize -L 640M ... 』的方式,底下为额外增加容量的范例。

[root@localhost ~]# lvresize -l +21 /dev/myvg/mylvm2
  Size of logical volume myvg/mylvm2 changed from 304.00 MiB (19 extents) 
       to 640.00 MiB (40 extents).
  Logical volume mylvm2 successfully resized.

[root@localhost ~]# lvscan
  ACTIVE            '/dev/myvg/mylv' [512.00 MiB] inherit
  ACTIVE            '/dev/myvg/mylvm2' [640.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [10.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [3.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit

完成了 LV 容量的增加,再来将文件系统放大。EXT 家族的文件系统通过 resize2fs 这个指令来完成文件系统的放大与缩小。

[root@localhost ~]# df /srv/lvm2
文件系统               1K-区段  已用   可用 已用% 挂载点
/dev/mapper/myvg-mylvm2  293267  2062 271545    1% /srv/lvm2

[root@localhost ~]# resize2fs /dev/myvg/mylvm2
esize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylvm2 is mounted on /srv/lvm2; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 5
The filesystem on /dev/myvg/mylvm2 is now 655360 blocks long.

[root@localhost ~]# df /srv/lvm2
文件系统               1K-区段  已用   可用 已用% 挂载点
/dev/mapper/myvg-mylvm2  626473  2300 590753    1% /srv/lvm2
  • VG 的容量不足,可增加额外磁盘的方式

假设读者因为某些特殊需求,所以需要将 /dev/myvg/mylv 文件系统放大一倍,亦即再加 500MB 时,该如何处理?此时 myvg 已经没有剩余容量了。 此时可以通过额外给予磁盘的方式来增加。此案例也是最常见到的情况,亦即在原有的文件系统当中已无容量可用,所以管理员需要额外加入新购置的磁盘的手段。 假设管理员已经通过 gdisk /dev/vda 添加一个 /dev/vda13 的 500MB 分区,此时可以这样做:

[root@localhost ~]# lsblk
NAME               MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
vda                252:0    0    40G  0 disk
├─vda9           252:9    0   300M  0 part
│ └─myvg-mylv   253:2    0   512M  0 lvm   /srv/lvm
├─vda10          252:10   0   300M  0 part
│ ├─myvg-mylv   253:2    0   512M  0 lvm   /srv/lvm
│ └─myvg-mylvm2 253:4    0   640M  0 lvm   /srv/lvm2
├─vda11          252:11   0   300M  0 part
│ └─myvg-mylvm2 253:4    0   640M  0 lvm   /srv/lvm2
├─vda12          252:12   0   300M  0 part
│ └─myvg-mylvm2 253:4    0   640M  0 lvm   /srv/lvm2
└─vda13          252:13   0   500M  0 part <==刚刚管理员添加的部份

[root@localhost ~]# pvcreate /dev/vda13
  Physical volume "/dev/vda13" successfully created

[root@localhost ~]# vgextend myvg /dev/vda13
  Volume group "myvg" successfully extended

[root@localhost ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                5
  Act PV                5
  VG Size               1.61 GiB
  PE Size               16.00 MiB
  Total PE              103
  Alloc PE / Size       72 / 1.12 GiB
  Free  PE / Size       31 / 496.00 MiB
  VG UUID               SYirFy-Tnin-zd58-CDMK-HWWm-0hVS-dMKFkB

此时系统即可多出将近 500MB 的容量给 myvg。

例题:
  1. 请将所有剩余的容量分配给 /dev/myvg/mylv
  2. 通过 xfs_growfs 来放大 /dev/myvg/mylv 这个文件系统 (请自行 man xfs_growfs)
  3. 你目前的系统中,根目录所在 filesystem 能否放大加入额外的 2GB 容量?若可以,请实做,若不行,请说明原因。

14.3:Software RAID 与 LVM 综合管理

RAID 主要的目的在性能与容错 (容量只是附加的),而 LVM 重点在弹性管理文件系统 (最好不要考量 LVM 内置的容错机制)。 若需要两者的优点,则可以在 RAID 上面建置 LVM。但以目前管理员的测试机而言,建议先关闭原有的测试流程,然后再重新创建为宜。

14.3.1:关闭与取消 software RAID 与 LVM 的方式

在本练习册中,我们并没有给予 RAID 的设置档,因此删除掉分区后,系统应该会自动舍弃 software RAID (/dev/md0)。 不过,如果没有将每个分区的档头数据删除,那未来重新开机时, mdadm 还是会尝试抓取 /dev/md0,这将造成些许困扰。 因此,建议删除掉 software RAID 的手段如下:

  1. 先将 /etc/fstab 当中,关于 /dev/md0 的纪录删除或注解;
  2. 将 /dev/md0 完整的卸载
  3. 使用 mdadm --stop /dev/md0 将 md0 停止使用
  4. 使用 dd if=/dev/zero of=/dev/vda4 bs=1M count=10 强制删除掉每个 partition 前面的 software RAID 标记
  5. 重复前一个步骤,将其他的 /dev/vda{5,6,7,8} 通通删除标记

LVM 的管理是很严格的,因此管理员不可在 LVM 活动中的情况下删除掉任何一个属于 LVM 的 partition/disk 才对。 例如目前 /dev/vda{9,10,11,12,13} 属于 myvg 这个 VG,因此如果 myvg 没有停止,那么管理员不应该也尽量避免更动到上述的分区。 若需要停止与回收这个 VG 的分区,应该要这样处理。

  1. 先将 /etc/fstab 当中与 myvg 有关的项目删除或注解
  2. 将 myvg 有关的文件系统卸载 (本案例中为 /srv/lvm 与 /srv/lvm2)
  3. 使用 vgchange -a n myvg 将此 VG 禁用
  4. 使用 lvscan 确认一下 myvg 所属的所有 LV 是否已经禁用 (inactive)
  5. 使用 vgremove myvg 移除掉 myvg 这个 VG 的所有内容
  6. 使用 pvremove /dev/vda{9,10,11,12,13} 移除这些 PV
  7. 最终使用 pvscan 侦测是否顺利移除
例题:
  1. 请通过上述的方案,将 /dev/md0 以及 myvg 含所属的 PV 删除掉
  2. 将所属的 /dev/vda{4...13} 使用 gdisk 删除掉,等待下个章节使用

14.3.2:在 Software RAID 上面建置 LVM

假设管理员所管理的服务器系统拥有 5 颗磁盘组成的 RAID 5 ,且拥有一颗 spare disk (容量个别为 300MB),建置完成之后, 在这个 RAID 上面建置好 VG (名称为 raidvg),同时将所有容量通通给予一个 LV (名称为 raidlv),并将他格式化为 xfs 且挂载到 /srv/raidlvm 目录中。 假设管理员已经建置好 /dev/vda{4,5,6,7,8,9} 的设备了。

  1. 先通过『 mdadm --create /dev/md0 --level=5 --chunk=256K --raid-devices=5 --spare-devices=1 /dev/vda{4,5,6,7,8,9} 』创建起 /dev/md0
  2. 建置完毕后,务必使用 mdadm --detail /dev/md0 确认数组活动为正常。
  3. 建议将 RAID 设置写入 /etc/mdadm.conf 当中
  4. 使用 pvcreate /dev/md0 创建 PV
  5. 使用 vgcreate -s 16M raidvg /dev/md0 创建 VG
  6. 使用 lvcreate -l 74 -n raidlv raidvg 创建 LV
  7. 最后使用 mkfs.xfs 以及修改 /etc/fstab 来处理文件系统即可。
例题:
  1. 以上述的流程完成本节的测试。

14.4:简易磁盘配额 (Quota)

Filesystem Quota 可以使用于『公平的』使用文件系统。虽然现今磁盘容量越来越大,但是在某些特别的情境中,为了管制用户乱用文件系统, 还是有必要管理一下 quota 用量的。

14.4.1:Quota 的管理与限制

基本上,要能使用 Quota ,你需要有底下的支持:

  • Linux 内核支持:除非你自己编译内核,又不小心取消,否则目前缺省内核都有支持 Quota 的
  • 激活文件系统支持:虽然 EXT 家族与 XFS 文件系统均支持 Quota ,但是你还是得要在挂载时激活支持才行。

而一般 Quota 针对的管理对象是:

  • 可针对用户 (但不包含 root)
  • 可针对群组
  • EXT家族仅可针对整个文件系统,XFS可以针对某个目录进行 Quota 管理

那可以限制的文件系统数据是:

  • 可限制文件容量,其实就是针对 Filesystem 的 block 做限制
  • 可限制文件数量,其实就是针对 Filesystem 的 inode 做限制 (一个文件会占用 1 个 inode 之故)

至于限制的数值与数据,又可以分为底下几个:

  • Soft 限制值:仅为软性限制,可以突破该限制值,但超过 soft 数值后,就会产生『宽限时间 (grace time)』
  • Hard 限制值:就是严格限制,一定无法超过此数值
  • Grace time:宽限时间,通常为 7 天或 14 天,只有在用量超过 soft 数值后才会产生,若用户无任何动作,则 grace time 倒数完毕后, soft 数值会成为 hard 数值,因此文件系统就会被锁死。

所谓的『文件系统锁死』的意思,指的是用户将无法添加/删除文件系统的任何数据,所以就得要借由系统管理员来处理了!

由于 Quota 需要文件系统的支持,因此管理员请务必在 fstab 文件中增加底下的设置值:

  • uquota/usrquota/quota:启动用户帐号 quota 管理
  • gquota/grpquota:启动群组 quota 管理
  • pquota/prjquota:激活单一目录管理,但不可与 gquota 共用(本章不实做)

在 xfs 文件系统中,由于 quota 是『文件系统内部纪录管理』的,不像 EXT 家族是通过外部管理文件处理, 因此设置好参数后,一定要卸载再挂载 (umount --> mount),不可以使用 remount 来处理。

例题:
  1. 在测试的系统中, /home 为 xfs 文件系统,请在设置档中加入 usrquota, grpquota 的挂载参数;
  2. 能否直接卸载 /home 再挂载?为什么?如何进行卸载再挂载的动作?
  3. 如何观察已经挂载的文件系统参数?

14.4.2:xfs 文件系统的 quota 实做

一般来说,Quota 的实做大多就是观察、设置、报告等项目,底下依序说明:

  • XFS 文件系统的 Quota 状态检查

xfs 文件系统的 quota 实做都是通过 xfs_quota 这个指令,这个指令在观察方面的语法如下:

[root@www ~]# xfs_quota -x -c "指令" [挂载点]
选项与参数:
-x  :专家模式,后续才能够加入 -c 的指令参数喔!
-c  :后面加的就是指令,这个小节我们先来谈谈数据回报的指令
指令:
      print :单纯的列出目前主机内的文件系统参数等数据
      df    :与原本的 df 一样的功能,可以加上 -b (block) -i (inode) -h (加上单位) 等
      report:列出目前的 quota 项目,有 -ugr (user/group/project) 及 -bi 等数据
      state :说明目前支持 quota 的文件系统的信息,有没有起动相关项目等

例如列出目前支持 quota 的文件系统观察可以使用:

[root@localhost ~]# xfs_quota -x -c "print"
Filesystem          Pathname
/                   /dev/mapper/centos-root
/boot               /dev/vda2
/srv/raidlvm        /dev/mapper/raidvg-raidlv
/home               /dev/mapper/centos-home (uquota, gquota)

如上表,系统就列出了有支持 quota 的载点,之后即可观察 quota 的启动状态:

[root@localhost ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #168 (3 blocks, 3 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #50175 (3 blocks, 3 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #50175 (3 blocks, 3 extents)
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
  • XFS 文件系统的 Quota 帐号/群组使用与设置值报告

若需要详细的列出在该载点底下的所有帐号的 quota 数据,可以使用 report 这个指令项目:

[root@localhost ~]# xfs_quota -x -c "report" /home
User quota on /home (/dev/mapper/centos-home)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
student          4064          0          0     00 [--------]

Group quota on /home (/dev/mapper/centos-home)
                               Blocks
Group ID         Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
student          4064          0          0     00 [--------]

[root@localhost ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root            0      0      0  00 [------]      3      0      0  00 [------]
student      4.0M      0      0  00 [------]    133      0      0  00 [------]

单纯输入 report 时,系统会列出 user/group 的 block 使用状态,亦即是帐号/群组的容量使用情况,但缺省不会输出 inode 的使用状态。 若额外需要 inode 的状态,就可以在 report 后面加上 -i 之类的选项来处理。

  • XFS 文件系统的 Quota 帐号/群组实际设置方式

主要针对用户与群组的 Quota 设置方式如下:

[root@study ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
[root@study ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
选项与参数:
limit :实际限制的项目,可以针对 user/group 来限制,限制的项目有
        bsoft/bhard : block 的 soft/hard 限制值,可以加单位
        isoft/ihard : inode 的 soft/hard 限制值
        name        : 就是用户/群组的名称啊!
timer :用来设置 grace time 的项目喔,也是可以针对 user/group 以及 block/inode 设置

假设管理员要针对 student 这个帐号设置:可以使用的 /home 容量实际限制为 2G 但超过 1.8G 就予以警告, 简易的设置方式如下:

[root@localhost ~]# xfs_quota -x -c "limit -u bsoft=1800M bhard=2G student" /home
[root@localhost ~]# xfs_quota -x -c "report -ub" /home
User quota on /home (/dev/mapper/centos-home)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
student          4064    1843200    2097152     00 [--------]

若需要取消 student 设置值,直接将数值设置为 0 即可!

[root@localhost ~]# xfs_quota -x -c "limit -u bsoft=0 bhard=0 student" /home
例题:
  1. 创建一个名为 "quotaman" 的用户,该用户的密码设置为 "myPassWord"
  2. 观察 quotaman 刚刚创建好帐号后的 quota 数值
  3. 让 quotaman 的实际容量限制为 200M 而宽限容量限制为 150M 左右,设置完毕请观察是否正确
  4. 前往 tty2 终端机,并实际以 quotaman 的身份登录,同时运行『 dd if=/dev/zero of=test.img bs=1M count=160 』这个指令, 检查 quotaman 家目录是否有大型文件?且该指令运行是否会出错?
  5. 回归 root 的身份,再次观察 quotaman 的 quota 报告,是否有出现 grace time 的数据?为什么?
  6. 再次来到 quotaman 的 tty2 终端机,再次使用『 dd if=/dev/zero of=test.img bs=1M count=260 』这个指令, 检查 quotaman 家目录是否有大型文件?且该指令运行是否会出错?
  7. 若使用 vim /etc/hosts 等指令后,离开 vim 会出现什么错误消息?为什么?
  8. quotaman 需要如何处理数据后,才能够正常的继续操作系统?

14.5:课后练习操作

前置动作:请使用 unit14 的硬盘进入作业环境,并请先以 root 身分运行 vbird_book_setup_ip 指令设置好你的学号与 IP 之后,再开始底下的作业练习。

请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。 并请注意,题目是有相依性的,因此请依序进行底下的题目为宜

  1. 请回答下列问题,并将答案写在 /root/ans14.txt 文件内:
    1. RAID0, RAID1, RAID6, RAID10 中 (1)哪一个等级性能最佳 (2)哪些等级才会有容错
    2. 承上,若以 8 颗磁盘为例,且都没有 spare disk 的环境下,上述等级各有几颗磁盘容量可用?
    3. 承上,以具有容错的磁盘数组而言,当有一颗磁盘损坏而需更换重建时, 哪些磁盘数组的重建性能最佳 (数据可直接拷贝,无须通过重新计算而言)
    4. 软件磁盘数组的 (1)操作指令为何? (2)磁盘数组文件名为何 (3)设置档文件名为何
    5. LVM 的管理中,主要的组成有 PV, VG, LV 等,请问在 LVM 中,数据保存、搬移的最小单位是甚么 (写下英文缩写与全名)
    6. 进行分割 (partition) 时,Linux LVM 与 Linux software RAID 的 system ID 各为何?
    7. 进行磁盘配额 (filesystem quota) 时,挂载参数要加上哪两个文件系统参数 (以 XFS 文件系统为例) 才能够支持 quota
    8. 承上,磁盘配额限制【磁盘使用容量】与【可用文件数量】时,分别是限制甚么项目?
  2. 弹性化管理文件系统:
    1. 将 /home 的容量增加成为 5GB
    2. 在目前的系统中,找到一个名为 hehe 的 LV ,将此 LV 的容量设置改成 2GB,且在这个 LV 上面的文件系统须同步处理容量。
    3. 在目前的系统中,找到一个名为 haha 的 LV ,将此 LV 的容量设置改成 500M,且在这个 LV 上面的文件系统须同步处理容量。
  3. 综合管理文件系统
    1. 请创建 5 个 1GB 的分区,且 system ID 请设置为 RAID 的样式
    2. 将上列磁盘分区用来创建 /dev/md0 为名的磁盘数组,等级为 RAID6,无须 spare disk,chunk size 请指定为 1M, 为避免 /dev/md0 被修改,请将文件名对应写入设置档内
    3. 以 /dev/md0 为磁盘来源,并依据底下的说明,重新创建一个 LVM 的文件系统
      • VG 名称请取为 myvg 容量请自订,但是 PE 需要具有 8MB 的大小 (参考底下的说明来指定喔)
      • LV 名称请取为 mylv,容量须有 200 个 PE 才行。
      • 这个文件系统请格式化为 ext4 文件系统,且挂载到 /data/userhome/ 目录中,每次开机都会自动挂载。
  4. 创建一个名为 /root/myaccount.sh 的大量创建帐号的脚本,这个脚本运行后,可以完成底下的事件 (请注意,要建置这个脚本前,最好已经处理完 Quota 文件系统的处置!否则会出问题。另外,处理前,最好先注销图形界面,在 tty2 使用 root 直接登录, 否则 /home 可能无法卸载。):
    1. 会创建一个名为 mygroup 的群组
    2. 会依据缺省环境创建 30 个帐号,帐号名称为 myuser01 ~ myuser30 共 30 个帐号,且这些帐号会支持 mygroup 为次要群组
    3. 每个人的密码会使用【 openssl rand -base64 6 】随机取得一个 8 个字符的密码, 并且这个密码会被记录到 /root/account.password 文件中,每一行一个,且每一行的格式有点像【myuser01:AABBCCDD】
    4. 每个帐号缺省都会有 200MB/250MB 的 soft/hard 磁盘配额限制。
  5. 承上,在 /data/userhome 底下,创建一个名为 mygroupdir 的目录:
    1. 这个目录可以让 mygroup 群组的用户完整使用,但其他群组或其他人都无法使用这个目录。
    2. mygroup 群组内的所有用户在这个目录下,仅具有 500MB/700MB 的 soft/hard 磁盘配额限制。
    3. 若无法实际设置成功,请修改 /etc/selinux/config 设置 SELINUX=permissive 后,重新开机再测试一次
    4. 注意:目前 CentOS 7 缺省使用 xfs 文件系统,但仍有相当多的 distribution 使用传统的 ext 家族文件系统, 因此,这一题要让各位自己学习 ext 文件系统的处理方式。相关参考数据请前往:http://vbird.org.cn/linux_basic/0420quota/0420quota-centos5.php 查阅 (其实作法大同小异,就是指令不同)

作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX;aa:bb:cc:dd:ee:ff;unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用: http://192.168.251.250 检查相对应的课程文件。

修改历史:
  • 2016/11/17:上次整理这篇是 2016/05/30 左右,还缺 Quota 的实做而已!所以补上来!
  • 2017/04/04:加入习题啰!可以来玩玩看
  • 2017/04/05:因应 EXT4 家族的 Quota,将题目做个小幅度的修订~否则大家不会知道 EXT4 的相关处理动作!
2016/11/17以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计