第十四章 磁盘配额(Quota)与进阶文件系统管理

发布时间 2023-07-31 11:08:03作者: Evan-whc

第十四章 磁盘配额(Quota)与进阶文件系统管理

14.1 磁盘配额(Quota)的应用与实作

  • Quota的一般用途
    Quota比较常使用的几个情况是:
    • 针对WWW server,例如:每个人的网页空间的容量限制
    • 针对mail server,例如:每个人的邮件空间限制
    • 针对file server,例如,每个人最大的可用网络硬盘空间(教学环境中最常见!
      上头讲的是针对网络服务的设计,如果是针对Linux系统主机上面的设定那么使用的方向有底下这一些:
    • 限制某一群组所能使用的最大磁盘配额(使用群组限制)
    • 限制某一用户的最大磁盘配额(使用用户限制)
    • 限制某一目录(directory,project)的最大磁盘配额
  • Quata 的使用限制
    • 在EXT文件系统家族仅能针对整个filesystem
    • 核心必须支持quota
    • 只对一般身份使用者有效
    • 若启用SELinux,非所有目录均可定quota
      不同的文件系统在quota的处理情况上不太相同,因此这里要特别强调,进行quota前,先确认你的文件系统吧。
  • Quata 的规范设定项目:
    • 分别针对用户、群组或个别目录(user,group&project):
    • 容量限制或文件数量限制(block或inode)
      • 限制inode用量:可以管理使用者可以建立的【文件数量】
      • 限制block用量:管理用户磁盘容量的限制,较常见为这种方式
    • 柔性劝导与硬性规定(soft/hard)
      • hard: 表示使用者的用量绝对不能超过这个限制值
      • soft: 若超过soft且低于hard的限值,每次用户登入系统时,系统会主动发出磁盘即将爆满的警告讯息,且会给予一个宽限时间(grace tiem)。
    • 会倒数计时的宽限时间(grace time)

14.2 软件磁盘阵列(Software RAID)

  • RAID-0(等量模式,stripe):效能最佳
  • RAID-1(映像模式,mirror):完整备份
  • RAID1+0,RAID0+1
  • RAID 5:效能与数据备份的均衡考虑
  • Spare Disk: 预备磁盘的功能:

14.2.3 软件磁盘阵列的设定

  软件磁盘阵列的设定很简单呢?因为你只要使用一个指令即可!那就是mdadm这个指令。

mdadm --detail /dev/md0
mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK --raid-devices=N --spare-devices=N /dev/sdx dev/hdx...
选项与参数:
--create: 为建立RAID的选项
--auto=yes: 决定建立后面接的软件磁盘陣列装置,亦即/dev/md0,/dev/md1
--chunk=NK: 决定这个装置的chunk大小,也可以当成stripe大小,一般是64K或512K
--raid-devices=N: 使用几个磁盘(partition作为磁盘陣列的装置
--spare-devices=N: 使用几个磁盘作为备用(spare)装置
--level=[015]: 设定这组磁盘陣列的等级。支持很多,不过建议只要用0,1,5即可。
--detail: 后面所接的那个磁盘陣列装置的详细信息

  上面的语法中,最后面会接许多的装置文件名,这些装置文件名可以是整颗磁盘,例如/dev/sdb,也可以是分区槽,例如/dev/sdb1之类。不过,这些装置文件名的总数必须要等于--raid-devices与--spare-devices的个数总和才行!
范例:
mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K --raid-devices=4 --spare-devices=1 /dev/vda{5,6,7,8,9}

  • 格式化与挂载使用RAID
    mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0

12.2.4 仿真RAID错误的救援模式

  俗话说“天有不测风云,人有旦夕祸福”,谁也不知道你的磁盘阵列内的装置啥时候会出差错,因此,了解一下软件磁盘阵列的救援还是必须的!底下我们就来玩一玩救援的机制吧!首先来了解一下mdadm这方面的语法:

mdadm --manage /dev/md[0-9] [--add 装置] [--remove 装置] [--fail 装置]
选项与参数:
-add: 会将后面的装置加入这个md中
--remvoe: 会将后面的装置由这个md中移除
--fail: 会将后面的装置设定成为出错的状态

14.2.5 开机自动启动RAID并自动挂载

mdadm --detail /dev/md0 | grep -i uuid    #查看UUID
#开始设定mdadm.conf
vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6

# 开始设定开机自动挂载并测试
blkid /dev/md0
/dev/md0: UUID="494cb3e1-5659-4efc-873d-d0758baec523" TYPE="xfs"

vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0

14.2.6 关闭软件RAID(重要)

  如果是测试用的软件RAID,要关闭RAID,如果忘记关闭,未来你在重新分区/dev/vdaX时可能会出现一些莫名的错误状况啦!所以才需要关闭software RAID的步骤!那如何关闭呢?也是简单到爆炸!(请注意,确认你的/dev/md0确实不要用且要关闭了才进行底下的玩意儿)

1. 先卸除且删除配置文件内与这个/dev/md0有关的设定:
umount /srv/raid
vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758bace523 /srv/raid xfs defaults 0 0  # 删除或是注释掉这一行

2. 先覆盖掉RAID的metadata以及XFS的superblock,才关闭/dev/md0的方法
dd if=/dev/zer0 of=/dev/md0 bs=1M count=50
mdadm --stop /dev/md0

dd if=/dev/zero of=/dev/vda5 bs=1M count=10
dd if=/dev/zero of=/dev/vda6 bs=1M count=10
dd if=/dev/zero of=/dev/vda7 bs=1M count=10
dd if=/dev/zero of=/dev/vda8 bs=1M count=10
dd if=/dev/zero of=/dev/vda9 bs=1M count=10

vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# 删除或是注释掉这一行

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

  LVM的重点在于【可以弹性的调整filesystem的容量!】而并非在于效能与数据安全上面。LVM可以整合多个实体partition在一起,让这些partition看起来就像是一个磁盘一样!而且,还可以在未来新增或移除其他的实体partition到这个LVM管理的磁盘当中。

14.3.1 什么是LVM:PV,PE,VG,LV的意义

  • Physical Volume,PV,实体滚动条
    我们实际的partition(或disk)需要调整系统标识符(systemID)成为8e(LVM的标识符),然后再经过pvcreate的指令将他转成LVM最底层的实体滚动条(PV),之后才能够将这些PV加以利用!调整systemID的方式就是透过gdisk啦!
  • Volume Group,VG,滚动条群组
    所谓的LVM大磁盘就是将许多PV整合成这个VG的东西就是啦!所以VG就是LVM组合起来的大磁盘!
  • Physical Extent,PE,实体范围区块
    LV预设使用4MB的PE区块,他是整个LVM最小的储存区块,也就是说,其实我们的文件资料都是籍由写入PE来处理的。简单的说,这个PE就有点像文件系统里面的block大小啦。
  • Physical Volume,逻辑滚动条
    这个LV就是最后可以被格式化使用的类似分区槽的咚咚了!LV的大小就与在此LV内的PE总数有关。为了方便用户利用LVM来管理其系统,因此LV的装置文件名通常指定为【/dev/vgname/lvname】的格式。

14.3.2 LVM实作流程

  1. DISK阶段(实际的磁盘)
    gdisk -l /dev/vda #其实system ID不改也没关系!只是为了让管理员清楚知道该partition的内容,操作过程略过

  2. PV阶段
    要建立PV其实很简单,只要直接使用pvcreate即可!

  • pvcreate: 将实体partition建立成为PV

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

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

  • pvremote:将PV属性移除,让该partition不具有PV属性
    pvcreate /dev/vda{5,6,7,8}

  • 更详细的列示也系统上面的每个PV的个别信息
    pvdisplay /dev/vda5

  1. VG阶段
  • vgcreate: 建立VG的指令。

  • vgscan: 搜寻系统上面的VG

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

  • vgextend: 在VG内增加额外的PV

  • vgreduce: 在VG内移除PV

  • vgchange: 设定VG是否启动(active)

  • vgremove:删除一个VG

    vgcreate [-s N[mgt]] VG名称 PV名称
    选项与参数:
    -s: 后面接PE的大小(size),单位可以是m,g,t(大小写均可)
    vgvreate -s 16M vbird /dev/vda{5,6,7}
    
  1. LV阶段
    创造出VG这个大磁盘之后,再来就是要建立分区啦!这个分区就是所谓的LV啰!
  • lvcreate: 建立LV啦

  • lvscan: 查询LV

  • lvdisplay: 显示LV

  • lvextend: 在LV里面增加容量

  • lvreduce: 在LV里面减少容量

  • lvremove: 删除一个LV

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

    lvcreate [-L N[mgt]] [-n LV名称] VG名称
    lvcreate [-l] [-n LV名称] VG名称
    选项与参数:
    -L:后面接容量,容量的单位可以是M.G.T等,要注意的是,最小单位PE.因此这个数量必须是PE的倍数,若不相符,系统会自动计算最相近的容量。
    -l: 后面接PE的【个数】
    -n: 后面接的是LV的名称
    范例:
    lvcreate -L 2G -n vbirdlv vbirdvg
    

14.3.3 放大LV容量

  放大文件系统时,需要底下这些流程的:

  1. VG阶段需要有剩余的容量
  2. LV阶段产生更多的可用容量
  3. 文件系统阶段的放大

  其中最后一个步骤最重要!我们在第7章当中知道,整个文件系统在最初格式化的时候就建立了inode/block/superblock等信息,要改变这些信息是很难的!不过因为文件系统格式化的时候建置的是多个block group,因此我们可以透过在文件系统当中增加block group的方式来增减文件系统的量!而增减block group就是利用xfs_growfs啰!所以最后一步是针对文件系统处理的,前面几步则是针对LVM的实际容量大小!
  Tips因此,严格来说,放大文件系统并不是没有进行【格式化】喔!放大文件系统时,格式化的位置在于该装置后来新增的部份,装置的前面已经存在的文件系统则没有变化。而新增的格式化过的数据,再反馈回原本的superblock这样而已。
范例:

lvresize -L +500M /dev/vbirdvg/vbirdlv
xfs_info /srv/lvm
xfs_growfs /srv/lvm
xfs_info /srv/lvm
df -Th /srv/lvm

14.3.5 LVM的LV磁盘快照

  快照就是将当时的系统信息记录下来,就好像照相记录一般!未来若有任何资料更动了,则原始资料会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。

  • 传统快照区的建立
    lvcreate -s -l 26 -n vbirdsnap1 /dev/vbirdvb/vbirdlv

# 上述的指令中最重要的是那个 -s的选项,代表是snapshot快照功能之意!

# -n后面接快照区的装置名称,/dev/...则是要被快照的LV完整档名

# -l 后面则是使用多少个PE来作为这个快照区使用。

  • 利用快照区复原系统

    1. 利用快照区将原本的filesystem备份,我们使用xfsdump来处理
      xfsdump -l 0 -L lvm1 -M lvm1 -f /home/lvm.dump /srv/snapshot1

    2. 将vbirdsnap1卸除并移除(因为里面的内容已经备份起来了)

    umount /srv/snapshot1
    lvremove /dev/vbirdvg/vbirdsnap1
    umount /srv/lvm mkfs -f /dev/vbirdvg/vbirdlv
    mount /dev/vbirdvg/vbirdlv /srv/lvm
    xfsrestore -f /home/lvm.dump -L lvm1 /srv/lvm
    ll /srv/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回来啊!