文件系统是个迷人又磨人的东西~管理的好,你的系统会很稳定,管理不好,扩充容量又会产生大问题~加油吧!
基础的文件系统管理中,通常一个 partition 只能作为一个 filesystem。但实际上,我们可以通过 RAID 的技术以及 LVM 的技术将不同的 partition/disk 集成成为一个大的文件系统,而这些文件系统又能具有硬件容错的功能在,对于关注保存设备物理安全性的管理员来说,这些技术相当的重要!
数组 (RAID) 的目的主要在『加大磁盘容量』、『具有磁盘容错』、『增加读写性能』等方面,而根据你着重的面向就得要使用不同的磁盘数组等级了。
磁盘数组全名是『 Redundant Arrays of Independent Disks, RAID 』,英翻中的意思为:独立容错式磁盘数组,旧称为容错式廉价磁盘数组, 反正就称为磁盘数组即可!RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘集成成为一个较大的磁盘设备; 而这个较大的磁盘功能可不止是保存而已,他还具有数据保护的功能。 整个 RAID 由于选择的等级 (level) 不同,而使得集成后的磁盘具有不同的功能,基本常见的 level 有这几种:
项目 | RAID0 | RAID1 | RAID10 | RAID5 | RAID6 |
最少磁盘数 | 2 | ||||
最大容错磁盘数(1) | 无 | n-1 | |||
数据安全性(1) | 完全没有 | ||||
理论写入性能(2) | n | 1 | n/2 | <n-1 | <n-2 |
理论读出性能(2) | n | n | n | <n-1 | <n-2 |
可用容量(3) | n | 1 | |||
一般应用 | 强调性能但数据不重要的环境 | 数据与备份 | 服务器、云系统常用 | 数据与备份 | 数据与备份 |
而达成磁盘数组功能的,主要有硬件 RAID 与软件 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) 设备
磁盘数组建置妥当后,应该观察一下运作的状况比较妥当。主要的观察方式为:
[root@localhost ~]# mdadm --detail /dev/md[0-9] [root@localhost ~]# cat /proc/mdstat
需要注意到是否有磁盘在损毁的状况才行。
假设 (1)磁盘数组有某颗磁盘损毁了,或 (2)磁盘使用寿命也差不多,预计要整批换掉时,使用抽换的方式一颗一颗替换,如此则不用重新创建磁盘数组。
在此情况下,管理员应该要将磁盘数组设置为损毁,然后将之抽离后,换插新的硬盘才可以。基本的指令需求如下:
[root@localhost ~]# mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备] --add :会将后面的设备加入到这个 md 中! --remove :会将后面的设备由这个 md 中移除 --fail :会将后面的设备设置成为出错的状态
虽然 RAID 可以将文件系统容量增加,也有性能增加与容错的机制,但是就是没有办法在既有的文件系统架构下,直接将容量放大的机制。 此时,可以弹性放大与缩小的 LVM 辅助,就很有帮助了。不过 LVM 主要是在弹性的管理文件系统,不在于性能与容错上。 因此,若需要容错与性能,可以将 LVM 放置到 RAID 设备上即可。
LVM 的全名是 Logical Volume Manager,中文可以翻译作逻辑滚动条管理员。之所以称为『滚动条』可能是因为可以将 filesystem 像滚动条一样伸长或缩短之故!LVM 的作法是将几个实体的 partitions (或 disk) 通过软件组合成为一块看起来是独立的大磁盘 (VG) , 然后将这块大磁盘再经过分割成为可使用分区 (LV), 最终就能够挂载使用了。
上述谈到的数据,可使用下图来解释彼此的关系:
如前一小节所述,管理员若想要处理 LVM 的功能,应该从 partition --> PV --> VG --> LV --> filesystem 的角度来处理。 请读者以底下的设置来实做出一组 LVM 来使用:
先使用 gdisk 或 fdisk 分割出本案例所需要的 4 个分割,假设分割完成的磁盘文件名为 /dev/vda{9,10,11,12} 四个。 接下来即可使用 LVM 提供的指令来处理后续工作。一般来说, LVM 的三个阶段 (PV/VG/LV) 均可分为『创建』、『扫描』与『详细查阅』等步骤, 其相关指令可以汇整如下表:
任务 | PV 阶段 | VG 阶段 | LV 阶段 | filesystem (XFS / EXT4) | |
搜索(scan) | pvscan | vgscan | lvscan | lsblk, blkid | |
创建(create) | pvcreate | vgcreate | lvcreate | mkfs.xfs | mkfs.ext4 |
列出(display) | pvdisplay | vgdisplay | lvdisplay | df, mount | |
增加(extend) | vgextend | lvextend (lvresize) | xfs_growfs | resize2fs | |
减少(reduce) | vgreduce | lvreduce (lvresize) | 不支持 | resize2fs | |
删除(remove) | pvremove | vgremove | lvremove | umount, 重新格式化 | |
改变容量(resize) | lvresize | xfs_growfs | resize2fs | ||
改变属性(attribute) | pvchange | vgchange | lvchange | /etc/fstab, remount |
所有的 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 比较需要注意的有三个项目:
根据上述的数据,使用 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 R8lCNk-H71V-g0XW-OtZe-pCFk-3H0d-OHZQ5p
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 ySi50J-pLoN-fjAq-tJmI-hNts-cwkT-fGxuBe LV Write Access read/write LV Creation host, time station200.centos, 2020-06-08 16:57:44 +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 256 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 这种格式的设备文件名即可。
LVM 最重要的任务就是进行设备的容量放大与缩小,不过,前提是在该设备下的文件系统能够支持放大与缩小才行。 目前在 CentOS 8 上面主要的两款文件系统中, ext4 可以放大与缩小,但是 xfs 文件系统则仅能放大而已。因此使用上需要特别注意。
从上面的案例中,读者可以知道 myvg 这个 VG 的总容量 1.1G 当中,有 500M 给 /dev/myvg/mylv 而 300M 给 /dev/myvg/mylvm2, 因此剩下大约 300MB 左右,读者可以使用『 vgdisplay myvg 』来查找剩余的容量。若需要将文件系统放大,则需要进行:
上述两个步骤的顺序不可错乱。将 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 R8lCNk-H71V-g0XW-OtZe-pCFk-3H0d-OHZQ5p [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 的容量。因此,我们可以使用:
这两种方式都可以!主要都是通过 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 myvg/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 -T /srv/lvm2 文件系统 类型 1K-区段 已用 可用 已用% 挂载点 /dev/mapper/myvg-mylvm2 ext4 293267 2062 271545 1% /srv/lvm2 [root@localhost ~]# resize2fs /dev/myvg/mylvm2 resize2fs 1.44.6 (5-Mar-2019) 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 (1k) blocks long. [root@localhost ~]# df -T /srv/lvm2 文件系统 类型 1K-区段 已用 可用 已用% 挂载点 /dev/mapper/myvg-mylvm2 ext4 626473 2300 590753 1% /srv/lvm2
假设读者因为某些特殊需求,所以需要将 /dev/myvg/mylv 文件系统放大一倍,亦即再加 500MB 时,该如何处理?此时 myvg 已经没有剩余容量了。 此时可以通过额外给予磁盘的方式来增加。此案例也是最常见到的情况,亦即在原有的文件系统当中已无容量可用,所以管理员需要额外加入新购置的磁盘的手段。 假设管理员已经通过 gdisk /dev/vda 添加一个 /dev/vda13 的 500MB 分区,此时可以这样做:
[root@localhost ~]# gdisk /dev/vda ...... Command (? for help): n Partition number (13-128, default 13): First sector (34-62914526, default = 51681280) or {+-}size{KMGTP}: Last sector (51681280-62914526, default = 62914526) or {+-}size{KMGTP}: +500M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): 8e00 Changed type of partition to 'Linux LVM' Command (? for help): w Do you want to proceed? (Y/N): y [root@localhost ~]# partprobe [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 R8lCNk-H71V-g0XW-OtZe-pCFk-3H0d-OHZQ5p
此时系统即可多出将近 500MB 的容量给 myvg。
RAID 主要的目的在性能与容错 (容量只是附加的),而 LVM 重点在弹性管理文件系统 (最好不要考量 LVM 内置的容错机制)。 若需要两者的优点,则可以在 RAID 上面建置 LVM。但以目前管理员的测试机而言,建议先关闭原有的测试流程,然后再重新创建为宜。
在本练习册中,我们并没有给予 RAID 的设置档,因此删除掉分区后,系统应该会自动舍弃 software RAID (/dev/md0)。 不过,如果没有将每个分区的档头数据删除,那未来重新开机时, mdadm 还是会尝试抓取 /dev/md0,这将造成些许困扰。 因此,建议删除掉 software RAID 的手段如下:
LVM 的管理是很严格的,因此管理员不可在 LVM 活动中的情况下删除掉任何一个属于 LVM 的 partition/disk 才对。 例如目前 /dev/vda{9,10,11,12,13} 属于 myvg 这个 VG,因此如果 myvg 没有停止,那么管理员不应该也尽量避免更动到上述的分区。 若需要停止与回收这个 VG 的分区,应该要这样处理。
我们现在的练习机上面,还没有分割的容量应该有 8G 才对。现在,请以 1.5G (1500M) 为单位,切割出 5 个分区, 分割完毕之后,就假设有 5 颗磁盘的意思。将这五颗磁盘汇整成为一个软件磁盘数组,名称就为 /dev/md0,使用 raid 5,且没有 spare disk。 然后将整个 /dev/md0 制作成为一个 PV,然后创建名为 raidvg 的 VG 以及 raidlv 的 LV。 最终这个 LV 应该会有 6G 左右的容量才对喔 ( 1.5G * (5-1) = 6G )
完成基础分割以创建假想的 5 颗实际不同的磁盘后,再来组成磁盘数组才会有意义!然后开始处理软件磁盘数组与 LVM 吧!
[root@localhost ~]# mdadm --create /dev/md0 --level=5 --raid-devices=5 --chunk=256K /dev/vda{4..8} mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. [root@localhost ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 vda8[5] vda7[3] vda6[2] vda5[1] vda4[0] 6135808 blocks super 1.2 level 5, 256k chunk, algorithm 2 [5/4] [UUUU_] [=================>...] recovery = 88.2% (1354368/1533952) finish=0.0min speed=52091K/sec [root@localhost ~]# mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Jun 8 21:25:41 2020 Raid Level : raid5 Array Size : 6135808 (5.85 GiB 6.28 GB) Used Dev Size : 1533952 (1498.00 MiB 1570.77 MB) Raid Devices : 5 Total Devices : 5 Persistence : Superblock is persistent Update Time : Mon Jun 8 21:26:11 2020 State : clean Active Devices : 5 Working Devices : 5 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 256K Consistency Policy : resync Name : station200.centos:0 (local to host station200.centos) UUID : 7de522d6:77da5653:2dfe5d51:e0f345b8 Events : 18 Number Major Minor RaidDevice State 0 252 4 0 active sync /dev/vda4 1 252 5 1 active sync /dev/vda5 2 252 6 2 active sync /dev/vda6 3 252 7 3 active sync /dev/vda7 5 252 8 4 active sync /dev/vda8
[root@localhost ~]# pvcreate /dev/md0 Physical volume "/dev/md0" successfully created. [root@localhost ~]# vgcreate raidvg /dev/md0 Volume group "raidvg" successfully created [root@localhost ~]# vgdisplay raidvg --- Volume group --- VG Name raidvg System ID Format lvm2 Metadata Areas 1 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 1 Act PV 1 VG Size <5.85 GiB PE Size 4.00 MiB Total PE 1497 Alloc PE / Size 0 / 0 Free PE / Size 1497 / <5.85 GiB VG UUID 8Q3LIH-ids8-23FL-TyLq-8EYZ-FXoB-9xV3wd
[root@localhost ~]# lvcreate -l 1497 -n raidlv raidvg [root@localhost ~]# lvscan ACTIVE '/dev/centos/root' [12.00 GiB] inherit ACTIVE '/dev/centos/home' [3.00 GiB] inherit ACTIVE '/dev/centos/swap' [2.00 GiB] inherit ACTIVE '/dev/raidvg/raidlv' [<5.85 GiB] inherit [root@localhost ~]# lvdisplay /dev/raidvg/raidlv --- Logical volume --- LV Path /dev/raidvg/raidlv LV Name raidlv VG Name raidvg LV UUID VvS80P-Gfuj-jJQo-5Kgg-oxUI-tVGL-RFStap LV Write Access read/write LV Creation host, time station200.centos, 2020-06-08 21:30:41 +0800 LV Status available # open 0 LV Size <5.85 GiB Current LE 1497 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 4096 Block device 253:3
这样就完成了在 RAID 上面创建 LVM 的功能了!这个 LVM 暂时不要使用他,我们在下个小节来玩一些比较有趣的项目!
近年来包括自动化布署、虚拟机的盛行等,传统的文件系统容量再大,也无法持续提供大量的本地端容量,即使已经使用了 LVM。 因此,就有很多计划在处理磁盘与文件系统对应的机制,其中两个很有趣的计划,一个是 Stratis ,另一个则是 VDO 机制, 这两个东西都可以仔细瞧瞧,挺有趣的!
目前的本地端保存设备与文件系统的应用中,包括了 device mapper (dm), LVM, RAID, Multipath, XFS 等等机制, 这些机制各有各的好处。不过,还是经常需要进行文件系统分割、格式化等行为。为了方便用户的应用,于是有了 stratis 这个机制的产生。
Stratis 通过滚动条管理文件系统的概念 (volume managing filesystem, VMF) ,简单的将整个设备、文件系统分为几个小阶层,有点类似底下的图标:
简单的来说,可以简化为底下的样式:
简单的来说,stratis 大致应用了目前的 LVM 与 XFS 机制,stratis 提供了一个名为保存池 (pool) 的概念,其实就有点类似 LVM 里面的 VG 的概念, 然后,你可以简单的将任何的区块设备 (传统磁盘、SSD、插卡式磁盘、iSCSI、LVM等) 加入这个保存池,然后在直接挂载到目录树底下, 就可以直接应用了。此外,由于挂载时的文件系统是在用户层,因此,可以随便你设置容量为多少,即使该容量目前并不存在这么大。
要达成 stratis 的功能,你的系统得要安装 stratisd 服务才行。同时,如果想要管理 stratisd 的话,就得要安装 stratis-cli 软件才行! 先来安装软件后,启动该项目吧:
[root@localhost ~]# yum install stratisd stratis-cli [root@localhost ~]# systemctl start stratisd [root@localhost ~]# systemctl enable stratisd
简单的依据『安装』、『启动』、『开机启动』的口诀来处理即可!不过因为 stratis 并不是网络服务,而是本机的保存系统, 因此不需要防火墙啰!很快速的就处理好 stratisd 服务。
服务启动之后,接下来就可以直接创建保存池 (pool) 与设备 (blockdev) 之间的关系!我们在之前的练习里面, 创建过 /dev/raidvg/raidlv 与 /dev/vda9 这两个剩余的设备,现在,先将 raidlv 加入到名为 vbirdpool 的保存池去, 看看情况会如何。记得,我们先使用 stratis [tab][tab] 看看有什么选项可以利用喔!
[root@localhost ~]# stratis [tab][tab]
blockdev daemon filesystem --help pool --version
很明显的看到了 blockdev, filesystem, pool 这三个关键字!所以,想要创建保存池的话,当然就使用 pool 这个指令即可!
[root@localhost ~]# stratis pool create vbirdpool /dev/raidvg/raidlv [root@localhost ~]# stratis pool list Name Total Physical Size Total Physical Used vbirdpool 5.85 GiB 52 MiB # 所以有个 vbirdpool 的保存池,里面实际有 5.8G,用掉了 52M 容量了。 [root@localhost ~]# stratis blockdev list Pool Name Device Node Physical Size State Tier vbirdpool /dev/raidvg/raidlv 5.85 GiB InUse Data # 所有 vbirdpool 实际上用到 /dev/raidvg/raidlv 这个设备,且用于数据保存 (Data)
stratis 比较特别的地方是,我们可以持续加进 blockdev 设备,不过无法移出 blockdev!希望未来可以提供移除 blockdev 的功能。 那加入的 block 设备有什么限制呢?让我们将不到 1G 的 /dev/vda9 丢进去 vbirdpool 看看就知道了:
[root@localhost ~]# stratis pool add-data vbirdpool /dev/vda9
Execution failure caused by:
ERROR: /dev/vda9 too small, minimum 1073741824 bytes
因为我们的练习机文件容量较小,所以 /dev/vda9 不够大于 1G 以上,导致增加失败!由错误消息就能知道, stratis 的限制就是需要大于 1G 以上的区块设备, 才能够加入到我们的保存池喔!那怎么练习加入额外的设备呢?没关系,我们还有个 centos 的 VG 可以使用! 现在让我们创建 /dev/centos/lvm 这个 1.5G 的设备,然后再加入 vbirdpool 一下!
[root@localhost ~]# lvcreate -L 1.5G -n lvm centos [root@localhost ~]# lvscan ACTIVE '/dev/centos/root' [12.00 GiB] inherit ACTIVE '/dev/centos/home' [3.00 GiB] inherit ACTIVE '/dev/centos/swap' [2.00 GiB] inherit ACTIVE '/dev/centos/lvm' [1.50 GiB] inherit ACTIVE '/dev/raidvg/raidlv' [<5.85 GiB] inherit [root@localhost ~]# stratis pool add-data vbirdpool /dev/centos/lvm [root@localhost ~]# stratis pool list Name Total Physical Size Total Physical Used vbirdpool 7.35 GiB 56 MiB [root@localhost ~]# stratis blockdev list Pool Name Device Node Physical Size State Tier vbirdpool /dev/centos/lvm 1.50 GiB InUse Data vbirdpool /dev/raidvg/raidlv 5.85 GiB InUse Data
你会发现到 Tier 这个地方,这里很有趣喔!基本上 Tier 大致上有两种情境,一个是用于传统数据存放,就是『 Data 』的效果, 如果你有比较快速、较小的 SSD / NVMe 等设备,可以将他设置为缓存 (cache) 喔!如此一来,你甚至可能会有好几个 T 的缓存! 而且不用任何奇怪的设置,直接加入成为缓存即可!相当有趣吧!底下为练习机不存在的指令,看看就好:
# 假设 /dev/vdc 为 SSD,可加入成为缓存的功能为: [root@localhost ~]# stratis pool add-cache vbirdpool /dev/vdc # 因为系统不存在 /dev/vdc 啦!这里单纯给大家瞧瞧!
所有以 stratisd 创建的文件系统,其设备文件名缺省都会以底下的方式存在:
如上,我们先设置一个 fs1 的文件系统来使用看看:
[root@localhost ~]# stratis filesystem create vbirdpool fs1 [root@localhost ~]# stratis filesystem list Pool Name Name Used Created Device UUID vbirdpool fs1 545 MiB Jun 09 2020 12:00 /stratis/vbirdpool/fs1 7430f67c671e4c5c9e98a77ccbbc8574
这时设备名称就创建起来了!你可以很明显的看到该设备!只是,建议不要使用设备来进行挂载,如果需要挂载, 就用 UUID 吧!查找 UUID 的方法可以这样做:
[root@localhost ~]# blkid /stratis/vbirdpool/* /stratis/vbirdpool/fs1: UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" TYPE="xfs" [root@localhost ~]# mkdir /srv/pool1 [root@localhost ~]# mount UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1 [root@localhost ~]# df -Th /srv/pool1 文件系统 .... 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/stratis-1-6e6ad....bbc8574 xfs 1.0T 7.2G 1017G 1% /srv/pool1
这样就可以挂载使用了!不过要注意的是,使用 df 去显示时,文件容量会显示为 1TB,那个是错误的显示容量! 略过不要理会!要查阅时,请使用『 stratis filesystem list 』去查看才是对的!
虽然 stratis 的文件系统可以直接将挂载项目写入到 /etc/fstab 里面,不过要注意的是,这些文件系统毕竟是经由 stratisd 管理的, 但是本机文件系统的挂载其实是在启动 stratisd 之前,因此如果没有加上特别的注意,该挂载在开机过程当中是会失败的! 特别留意这个问题!
UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1 xfs defaults,x-systemd.requires=stratisd.service 0 0
[root@localhost ~]# umount /srv/pool1 [root@localhost ~]# mount -a [root@localhost ~]# reboot
要移除 stratis 的话,就跟移除一般文件系统类似,从 /etc/fstab 的编辑以及卸载后,再以 stratis 删除掉文件系统与保存池即可。
[root@localhost ~]# vim /etc/fstab #UUID="7430f67c-671e-4c5c-9e98-a77ccbbc8574" /srv/pool1 xfs defaults,x-systemd.requires=stratisd.service 0 0 [root@localhost ~]# umount /srv/pool1 [root@localhost ~]# stratis filesystem destroy vbirdpool fs1 [root@localhost ~]# stratis pool destroy vbirdpool [root@localhost ~]# systemctl stop stratisd.service [root@localhost ~]# systemctl disable stratisd.service
身为现代人,你应该、绝对听过所谓的虚拟化,我们现在上课使用的系统就是虚拟机啊!使用到虚拟机的原因,当然是由于硬件资源大幅提升的缘故, 因此一部主机可以做成虚拟机的本机 (host),然后再将资源如 CPU、内存、磁盘、网络等分享给虚拟机 (VM) 使用, 最后在 VM 上面安装好操作系统 (guest) 之后,就可以提供给客户进行操作了。
许多硬件资源都可以通过共享。如 4 核 8 绪的主机,可以提供给 8 台 2 内核的虚拟机(VM),虚拟机的总 CPU 个数(16)超出实体 CPU(4), 也是没问题的!所有的虚拟机可以轮流共用实体CPU内核。同理,内存也一样,甚至如果具有相同内容的VM群,其共有的记忆资源还能仅保留共有的一份。
不过虚拟机的磁盘怎么来?一般来说,虚拟机的磁盘大多使用大型文件来提供,当然也能使用 LVM!不过,当 VM 的量很大的时候, 使用大型文件并通过快照拷贝的效果,会比较好一些,不用通过持续的 device mapper (dm) 去管理,耗用的资源较少。 只是,你得要自己手动进行快照、自己进行压缩与各项系统处置,管理方面比较不方便。
虚拟数据优化系统 (Virtual Data Optimizer, VOD) 就是为了处理虚拟机的磁盘设备而设计的!VDO可以让你的数据直接在VDO的挂载点里面, 直接通过VDO系统的管理,自己进行数据同步、数据压缩。此外,你的1TB实体磁盘,也能通过VDO的功能,假装成为5TB的容量, 因为VDO会进行压缩等行为,也就让你的系统可以进行更多文件的保存!
VDO 的使用需要通过 vdo 服务以及 kmod-kvdo 模块的支持,因此得要安装这两个软件才行,同时得要启动 vdo 服务喔!
[root@localhost ~]# yum install vdo kmod-kvdo [root@localhost ~]# systemctl restart vdo [root@localhost ~]# systemctl enable vdo
接下来 vdo 的使用跟 LVM 真的很有点类似~通过 vdo 指令来创建起 vdo 的滚动条设备,这些设备都会以 /dev/mapper/XXX 的设备名称存在, 现在,我们将刚刚发布的 /dev/raidvg/raidlv 这个设备丢给 VDO 使用 (记得一下,VDO 使用的区块设备,其容量至少要大于 5G 才好!), 并且创建名为 myvdo 的设备,同时该磁盘容量假设为原本两倍的 10G 容量,可以这样做:
[root@localhost ~]# vdo create --name=myvdo --vdoLogicalSize=10G \ > --device=/dev/raidvg/raidlv --deduplication enabled --compression enabled [root@localhost ~]# vdo status --name myvdo VDO status: Date: '2020-06-09 14:07:06+08:00' Node: station200.centos Kernel module: Loaded: true Name: kvdo Version information: kvdo version: 6.2.1.138 Configuration: File: /etc/vdoconf.yml Last modified: '2020-06-09 14:05:38' VDOs: myvdo: Acknowledgement threads: 1 Activate: enabled Bio rotation interval: 64 Bio submission threads: 4 Block map cache size: 128M Block map period: 16380 Block size: 4096 CPU-work threads: 2 Compression: enabled Configured write policy: auto Deduplication: enabled Device mapper status: 0 20971520 vdo /dev/dm-4 normal - online online 1008994 1532928 ...... [root@localhost ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/myvdo 5.8G 3.8G 2.0G 65% N/A
因为 VDO 会进行许多的动作,因此一开始就会花费 3.8G 的容量,剩余的容量可能只剩下 2G 而已!因此,要使用 VDO 时, 设备的容量还是大一些比较妥当。我们这里只进行测试啦!接下来,请将这个设备挂载使用吧。
[root@localhost ~]# mkfs.xfs /dev/mapper/myvdo [root@localhost ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/myvdo 5.8G 3.8G 2.0G 65% 99%
[root@localhost ~]# vim /etc/fstab /dev/mapper/myvdo /srv/vdo xfs defaults,x-systemd.requires=vdo.service 0 0 [root@localhost ~]# mkdir /srv/vdo [root@localhost ~]# mount -a [root@localhost ~]# mount | grep vdo /dev/mapper/myvdo on /srv/vdo type xfs (rw,....x-systemd.requires=vdo.service) [root@localhost ~]# reboot
建置完毕之后,建议立刻 reboot 测试一下 /etc/fstab 里面的设置是否为正常喔!
VDO 在进行文件的处理时,主要会有三个阶段 ( 3 phases ),流程如下:
大家要先有个概念,VDO 的重点在于使用于虚拟机中,虚拟机通常使用大型文件作为虚拟机里面的磁盘系统,所以,丢进 VDO 管理的文件系统内的数据, 不应该是一般的文件,而是作为虚拟磁盘的文件才对!不要搞错使用的方向了。所以,我们得要先来制作虚拟磁盘机的文件才行!如下所示, 我们先来创建一个大型的文件 (虽然不是专门用来进行磁盘系统的)。
[root@localhost ~]# df -Th / 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 12G 6.2G 5.9G 51% / [root@localhost ~]# tar -cf /vmdisk.img /etc /home /root [root@localhost ~]# ll -h /vmdisk.img -rw-r--r--. 1 root root 346M 6月 9 15:14 /vmdisk.img
这样就有一个没有压缩的,大约 346M 的大型文件!开始进行拷贝的举动,将这个文件拷贝到 /srv/vdo 目录去:
[root@localhost ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/myvdo 5.8G 3.8G 2.0G 65% 98% [root@localhost ~]# cp /vmdisk.img /srv/vdo [root@localhost ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/myvdo 5.8G 4.1G 1.7G 70% 71% [root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk2.img [root@localhost ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/myvdo 5.8G 4.1G 1.7G 70% 71% [root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk3.img [root@localhost ~]# cp /vmdisk.img /srv/vdo/vmdisk4.img [root@localhost ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/myvdo 5.8G 4.1G 1.7G 70% 78% [root@localhost ~]# df -Th /srv/vdo 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/myvdo xfs 10G 1.5G 8.6G 15% /srv/vdo
你可以发现,虽然单一文件有 3xx MB 的容量,但是整体 VDO 还是只有消耗 (4.1G-3.8G = 0.3G) 左右的容量, 使用传统文件系统的 df 来看,却已经使用掉 1.5G 了!这就可以节省非常多的容量喔!
Filesystem Quota 可以使用于『公平的』使用文件系统。虽然现今磁盘容量越来越大,但是在某些特别的情境中,为了管制用户乱用文件系统, 还是有必要管理一下 quota 用量的。
基本上,要能使用 Quota ,你需要有底下的支持:
而一般 Quota 针对的管理对象是:
那可以限制的文件系统数据是:
至于限制的数值与数据,又可以分为底下几个:
所谓的『文件系统锁死』的意思,指的是用户将无法添加/删除文件系统的任何数据,所以就得要借由系统管理员来处理了!
由于 Quota 需要文件系统的支持,因此管理员请务必在 fstab 文件中增加底下的设置值:
在 xfs 文件系统中,由于 quota 是『文件系统内部纪录管理』的,不像 EXT 家族是通过外部管理文件处理, 因此设置好参数后,一定要卸载再挂载 (umount --> mount),不可以使用 remount 来处理。
一般来说,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 /srv/vdo /dev/mapper/myvdo /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: #1921 (4 blocks, 4 extents) Group quota state on /home (/dev/mapper/centos-home) Accounting: ON Enforcement: ON Inode: #1975 (4 blocks, 3 extents) Project quota state on /home (/dev/mapper/centos-home) Accounting: OFF Enforcement: OFF Inode: N/A Blocks grace time: [7 days] Inodes grace time: [7 days] Realtime Blocks grace time: [7 days]
上表显示的状况为:
若需要详细的列出在该载点底下的所有帐号的 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 311776 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 311776 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 8K 0 0 00 [------] 5 0 0 00 [------] student 304.5M 0 0 00 [------] 1.1k 0 0 00 [------]
单纯输入 report 时,系统会列出 user/group 的 block 使用状态,亦即是帐号/群组的容量使用情况,但缺省不会输出 inode 的使用状态。 若额外需要 inode 的状态,就可以在 report 后面加上 -i 之类的选项来处理。
主要针对用户与群组的 Quota 设置方式如下:
[root@localhost ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name" mount_point [root@localhost ~]# 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 -ubh" /home User quota on /home (/dev/mapper/centos-home) Blocks User ID Used Soft Hard Warn/Grace ---------- --------------------------------- root 8K 0 0 00 [------] sysuser1 20K 0 0 00 [------] student 304.5M 1.8G 2G 00 [------]
若需要取消 student 设置值,直接将数值设置为 0 即可!
[root@localhost ~]# xfs_quota -x -c "limit -u bsoft=0 bhard=0 student" /home
作业硬盘一般操作说明:
作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!
请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。 并请注意,题目是有相依性的,因此请依序进行底下的题目为宜
作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用浏览器查找: http://192.168.251.254 检查相对应的课程文件。 相关流程请参考: vbird_book_check_unit