TT Lab
开始
学习 学习路径 课程

存储与挂载

审计 fstab 并修好

在 TT Lab 中继续学习

目标

按照规则审计一份损坏的 fstab,修复它,并亲自编写验证脚本。

为什么重要

fstab 是系统中最危险的文件之一。写错了,启动到一半就会停住,如果是没有控制台的云实例,就无从下手。尤其是第六个字段 pass(fsck 顺序) 经常写错——不是根分区却写 1,或者给网络文件系统写了不是 0 的值,启动就会卡住。而且,如果没有 nofail,一块数据盘坏了,整台服务器都起不来。在实际工作中,重启之前一定要先验证——靠重启来确认,不是确认,而是赌博。

本实验的规则

步骤

  1. 创建目录 /root/fstab,并把 /opt/fixtures/st-fstab/fstab.broken 复制为 /root/fstab/work.tab。
  2. 把去掉注释和空行之后的每个条目转换成 장치,마운트지점,타입,옵션,dump,pass 这样的 CSV(列依次为设备、挂载点、类型、选项、dump、pass),保存到 /root/fstab/fields.csv。字段不足的行,只写已有的部分。
  3. 把违反上述四条规则的行号按升序、每行一个,写入 /root/fstab/audit.txt。行号从文件最上面开始、包含注释,从 1 起算。
  4. 创建修复了所有违规的 /root/fstab/fixed.tab。原文件中正常的条目保持不变,字段不足的行补上 0 2,重复的挂载点中靠后的一个改为 /var2,错误的 pass 值按规则 B 修正。
  5. 把 fixed.tab 中以设备路径(/dev/...)写的条目,改成 UUID=1a2b3c4d-0004-4000-8000-000000000004 的写法。
  6. 给 fixed.tab 中所有不是根的本地条目的选项加上 nofail,并给 /tmp 条目的选项同时加上 noexec、nosuid、nodev。
  7. 让 fixed.tab 中 NFS 条目的选项同时包含 _netdev、soft、timeo=600、retrans=2。
  8. 编写 /root/fstab/validate.sh。它要以第一个参数接收 fstab 文件路径,检查规则 A 到 D,没有违规时以退出码 0 结束,只要有一处违规就以非 0 值结束。评分器会分别对 fixed.tab(必须通过)和 fstab.broken(必须失败)运行它。

参考

创建工作副本

创建目录 /root/fstab,并把 /opt/fixtures/st-fstab/fstab.broken 复制为 /root/fstab/work.tab。

请不要动原始夹具,在副本上操作。行数必须与原文件相同。

把字段拆分成 CSV

把去掉注释和空行之后的每个条目转换成 장치,마운트지점,타입,옵션,dump,pass 这样的 CSV(列依次为设备、挂载点、类型、选项、dump、pass),保存到 /root/fstab/fields.csv。字段不足的行,只写已有的部分。

排除注释和空行。用 awk 把六个字段用逗号连接起来即可。

找出违反规则的行

把违反上述四条规则的行号按升序、每行一个,写入 /root/fstab/audit.txt。行号从文件最上面开始、包含注释,从 1 起算。

请把四条规则逐一应用。行号从文件最上面开始、包含注释来计算。

提交修改版

创建修复了所有违规的 /root/fstab/fixed.tab。原文件中正常的条目保持不变,字段不足的行补上 0 2,重复的挂载点中靠后的一个改为 /var2,错误的 pass 值按规则 B 修正。

补全字段不足的行,把重复的挂载点中的一个改到别的路径,把错误的 pass 值按规则修正。

把设备名改成 UUID 写法

把 fixed.tab 中以设备路径(/dev/...)写的条目,改成 UUID=1a2b3c4d-0004-4000-8000-000000000004 的写法。

有一个条目是用设备路径写的。改成 UUID= 的写法,值可以随意决定。

添加安全选项

给 fixed.tab 中所有不是根的本地条目的选项加上 nofail,并给 /tmp 条目的选项同时加上 noexec、nosuid、nodev。

不是根的本地条目需要“失败也继续启动”的选项,/tmp 则需要三个安全选项。

编写 NFS 条目

让 fixed.tab 中 NFS 条目的选项同时包含 _netdev、soft、timeo=600、retrans=2。

网络文件系统需要等待网络就绪的选项,而 pass 必须是不检查的值。

编写验证脚本

编写 /root/fstab/validate.sh。它要以第一个参数接收 fstab 文件路径,检查规则 A 到 D,没有违规时以退出码 0 结束,只要有一处违规就以非 0 值结束。评分器会分别对 fixed.tab(必须通过)和 fstab.broken(必须失败)运行它。

评分器会分别对正常文件和不合格文件运行它。正常时必须以 0 结束,有问题时必须以非 0 值结束。