学习日志 · 2026 年 9 月
这个月从零把 Rocky Linux 9 实验机搭起来,走完环境底座 → 用户与组 → 权限与 ACL,并开进存储与挂载。
每天一条,新内容在最上面。每条末尾的「能力索引」指向 RHCSA 学习地图 上对应的知识点。
2026-09-22 星期二
存储域进入 LVM。今天真正动了系统的只有两小步(只读「看见」三层、建一个 PV 再撤掉),其余时间花在搞懂「这三层到底在记什么账」上 —— 中间有一次直接把我说停了,节奏当场拆细。
今天做了什么
① 开工前核对环境:实验机已连续运行约 5 天,三块盘的布局和 09-18 一致,sdc 仍是整块空盘,今天就用它。
② 从题库 PDF 里抽出存储三题原文,确认这一域只有三道:调整逻辑卷大小、加一个 swap 分区、建卷组与逻辑卷(最后这道考的是 PE 语义)。
③ 只读「看见」三层 —— 这一步一位都没改系统:
1 | pvs # /dev/sda2 rlm lvm2 a-- <7.00g 0 |
读出两件事:rlm 卷组已经把 1791 个 PE 全分光了(VFree 0),所以想让 / 变大只有两条路 —— 往卷组里加盘,或者从别处挪空间。另外 lvs 的 Attr 是 -wi-ao----,那个 o = open,说明 root 和 swap 此刻正被占用。
④ 只建一个 PV,然后自己撤掉:pvcreate /dev/sdc → pvs 看到 VG 列为空、Attr 是 --- → 再跑 pvremove /dev/sdc 恢复干净。这是今天唯一改动系统的操作,可逆正是选它的原因。
⑤ 按「分区优先」重做:给 sdc 建 4 GiB 分区 sdc1(标 lvm)→ pvcreate /dev/sdc1 → pvs 仍是「未入卷组」状态。故意留 ~4.5 GiB 不分区,以后演示「卷组空间用完 → vgextend 加盘」用。
⑥ 做了「从磁盘到 LVM」层级关系图,挂到博客 /maps/lvm.html:磁盘 → 分区 → PV → VG → LV → 文件系统 → 挂载点,七层嵌套,每层标出诞生命令、怎么查、怎么撤,另附三条真实链路对照(有 LVM 的 /、无 LVM 的 /mnt/data、正在做的 /vo)。
⑦ 查清了一件一直没搞懂的事:博客为什么发布失败。 09-18 那次把 hexo clean 和 hexo deploy 放在同一次运行里会 FATAL,站点完全没更新。根因不是网络也不是 git,是批量删除保护:clean 要删掉 public/ 全部文件、deploy 又要清空 .deploy_git,两边删除数累计超过阈值就被拦下。所以换了发布方式 —— 生成后把 public/ 同步到一个镜像目录(只覆盖和新增,几乎不删除),再自己 git push --force。今晚实测通过。
卡住的地方
一、一次给的东西太多,我直接卡住了。
「五层栈 + 扩容两步 + PE 语义 + 三道思考题 + 让你写完整方案」一起上来,我的反馈是「这一块不懂了,从简到难慢一点来」。拆细之后确实管用 —— 今天只做两件事:先看见三层,再建一个 PV,不碰 VG 和 LV。
后来想明白了:我真正卡住的是 PE(「格子」)这个抽象,不是命令。命令看一眼就会敲,但「为什么非要把空间切成等大的格子来记账」这件事没说通,后面所有关于容量的问题就全是乱的。
二、我把 pvs 里的 < 读错了 —— 方向对了一半,对象错了。
看到 pvs 输出 <7.00g,我的判断是「小于 7 GB,被分区表吃掉了一点」。有东西被吃掉这半句是对的,但对象错了:
1 | /dev/sda2 真实 7167 MiB = 6.9990 GiB → 显示 <7.00g |
< 只是显示取整的标记(LVM 只留两位小数,真实值略小就加 <)。而分区表占的空间在分区之外(gpt 表那 17.4 kB 在分区起点之前),所以分区自身的 Size 可以精确等于你输入的 MiB 值。真正被吃掉的是 PV 的标签与元数据区,它计入 PV、不计入 VG —— pvdisplay 的 not usable 一栏能直接看到,实测约 3 MiB。
三、报错看错对象:cannot use 说的是参数,不是设备。
我敲 pvs /dev/sdc1 pvdisplay,报 Cannot use pvdisplay: device not found。第一反应是「设备有问题」,其实是 pvs 只接设备名,我把 pvdisplay 当成第二个设备名传进去了 —— 报错抱怨的是参数解析,不是设备坏了。顺带也确认 pv /dev/sdc 会报 command not found:pv 根本不是 LVM 命令,它是不相干的另一个工具。
今天真正记住的
- PV / VG / LV 三层做的全是「记账」,实物扇区一点没动。
pvcreate= 登记设备;vgcreate= 把空间切成等大 PE 格子记下来;lvcreate= 从账上划走 n 格。这句话通了之后,PE 就不抽象了。 - 账本是自洽的:
VG Size = PE Size × Total PE。 实测 4 MiB × 1791 = 7164 MiB ≈<7.00 GiB,和vgs里的 VSize 对得上。LV 的大小必须是 PE 的整数倍 —— 这才是「50 个扩展单元 × 16 MiB」那题的考点(16 × 50 = 800 MiB,出题人偏不写 800)。 - PV 和 VG 是两层,不是一回事。
pvs的VG列为空 = 这个 PV 还没被任何卷组认领;Attr的a= allocatable,没入伙时显示---。一个 PV 可以独立存在,一个 VG 可以吃掉多个 PV —— 这正是vgextend加盘扩容能成立的原因。 - ★ 扩容永远是两个动作。
lvextend只改 LVM 层的账,文件系统层不知道 —— 扩完会停在「LV 300 MiB / 文件系统仍是 200 MiB」的错位状态,df一点不变,中间那 100 MiB 白白闲置。必须再补一条xfs_growfs(xfs)或resize2fs(ext4)。这也解释了参考解里lvextend之后为什么插一条blkid:先确认文件系统类型,才知道该用哪个 grow 命令。 - 先分区再
pvcreate,比整盘直接做更好。 三个理由:分区能标lvm类型给人看、同一块盘能只切一部分给 LVM(swap 分区就是这么和 LVM 共存的)、想反悔时直接pvremove就能回头(整盘做了 PV 想再分区得先pvremove+wipefs)。例外是专用数据盘,整盘做也完全正常。但要记住分区不是 LVM 的一层,只是设备层的准备动作 —— LVM 只要求「给我一个块设备」。 - xfs 只能扩不能缩(要缩只能重建);ext4 能缩但必须先卸载。
关键命令或配置
1 | # 只读:先「看见」三层 |
下一步
vgcreate test /dev/sdc1→vgs/vgdisplay test看 Total PE(预测题:VSize 会不会带<)lvcreate -n vo -L 200MiB test(4 MiB × 50 格)→mkfs.xfs→ 挂/vo+ 写 fstab → 四步验收- 再练题 20 原题:把
vo从 200 MiB 扩到 300 MiB,把lvextend+xfs_growfs两条命令走完 - 才轮到给根分区扩容:把
sdb剩余空间加成新分区 →vgextend rlm→lvextend -l +100%FREE /dev/rlm/root→xfs_growfs /。这一步动到/,动手前必须先打快照
能力索引 —— 今天涉及的知识点在地图上的位置:
2026-09-18 星期五
今天分两段:白天在实验机上把存储域第一题从头走到尾(12 步全绿,含 fstab 与验收),晚上重做了博客本身的结构。改博客的起因是我想「从当天的记录直接跳到知识图」,旧结构做不到;做完之后,博客从「一篇无限增长的日志 + 一个站外 HTML」变成了索引页 + 按月日志 + 知识图。
今天做了什么
① 存储第一题:/dev/sdb 全链路打通
先交方案、被逐条挑毛病、改完才动手。最后 12 步全绿,每一步的原始输出都核对过:
| 步骤 | 结果 |
|---|---|
parted /dev/sdb print free |
unrecognised disk label(空盘,符合预期) |
mklabel gpt |
Partition Table: gpt,Free Space 从 17.4 kB 起 |
mkpart primary xfs 1MiB 1025MiB |
分区 1:1049kB → 1075MB,Size 1074MB |
partprobe + lsblk |
sdb1 出现,1G |
lsblk -f |
FSTYPE / MOUNTPOINTS 两列全空 —— 动手前最后一道核对通过 |
mkfs.xfs /dev/sdb1 |
成功,agcount=4, agsize=65536 blks |
blkid |
有 TYPE="xfs",另有 PARTLABEL="primary" |
| 写 fstab | 用 UUID= 写法,且先 cp /etc/fstab /etc/fstab.bak |
findmnt --verify |
Success, no errors or warnings detected |
umount + mount -a |
无输出 |
findmnt /mnt/data |
SOURCE=/dev/sdb1,FSTYPE=xfs |
df -h /mnt/data |
960M / 39M used / 922M avail / 5% |
② 两轮问答里挖出来的机制
- 2 TiB 是 msdos 的上限,不是 gpt 的。 MBR 用 4 字节存 LBA → 2³² × 512B = 2 TiB;gpt 用 8 字节。我一开始把这个数字记到了 gpt 头上,方向记反了。
- 写进 fstab 就是「自动挂载」,没有别的魔法。 开机时 systemd 读 fstab、为每条生成
.mount单元;桌面插 U 盘会自动出现在/run/media,那是 udisks2 干的,服务器环境里没有这层兜底。 parted显示用十进制、输入用二进制。 输入 1MiB → 1025MiB,print 出来是 1049kB → 1075MB,差 1074MB。数字没错,是尺子换了一把(1024 MiB = 1073.74 MB)。primary在 gpt 盘上没有类型含义,只会被存成分区名 —— 证据就在自己的输出里:msdos 盘 print 的列名是Type,gpt 盘是Name,blkid 输出里出现PARTLABEL="primary"。- fstab 第 5、6 字段:5 = dump 标志(工具早淘汰了,恒写 0);6 = fsck 顺序,只有 0/1/2 三个合法值,1 是根分区专属。
③ 晚上重做博客结构:先实测现状,才发现全是问题
| 查到的东西 | 实际情况 |
|---|---|
| 日志正文 | 一篇装下全部 4 天,已经 28 KB |
| 日志右侧目录 | ### 今天做了什么 出现 4 次,Hexo 自动加了 -1 -2 -3 后缀 |
| 地图页 | 一个 78 KB 的单文件,在 Hexo 体系之外,分类 / 标签 / 归档全都用不上 |
/categories/、/tags/ |
都是 404 —— 但页面里处处在生成指向它们的链接 |
| 导航菜单 | menu: 是空的,全站一项都没有 |
④ 定下方向:日志按月拆,并且两端要能互相跳
三种内容回答三种问题,本来就不该塞在一起:
| 内容 | 回答什么 | 怎么组织 |
|---|---|---|
| 日志 | 我哪一天做了什么 | 按月 |
| 地图 | 这个机制怎么判断 | 按能力域 |
于是:日志改成每月一篇(/study-log/2026-09/),/study-log/ 变成索引页,并且每条日志末尾加「能力索引」,直接指向地图上对应的知识点。
⑤ 给地图加了可分享的深链
地图里原来的节点锚点是 node-storage-3 这种按序号生成的 —— 中间插一个节点,后面全部错位。改成由标题派生的稳定标识(形如 #acl-的判定顺序最容易搞错的一处),标题不改链接就不漂;每一节右上角加了「复制链接」,取到的地址可以直接粘进日志。
卡住的地方
一、动手前和动手后,我用的是同一批命令 —— 层序错了。
被问「mkfs 之前用什么命令确认目标设备」,我答 wipefs / blkid。工具没错,但这两个验的是「这块盘上现在有什么签名」,那是流程最后一环的事后验证,不是动手前的确认。动手前该看的是 lsblk -f 和 parted print free —— 一个是内核实时状态,一个是分区表里究竟记了什么。
这是我的「验收命令只验某一层」的第八次,而且这次是层序错:把事后验证当成了事前确认。
二、我以为写错设备名会「静默挂错盘」,实际是开不了机。
我原来的判断是「盘名对调了就挂错盘,而且不会报错,会一直以为挂载成功」。真实后果严重得多:/dev/sdb1 这个名字指向另一块盘,若那上面没有 sdb1 分区 → 设备根本不存在 → 挂载失败;fstab 条目挂载失败且没加 nofail 时,systemd 的 local-fs.target 跟着失败 → 整机掉进 emergency mode,SSH 都连不上,得进控制台把那行注释掉才能开机。
所以后果不是「少挂一个目录」,是「开不了机」。nofail 和 x-systemd.device-timeout= 就是为这个存在的(生产上写非关键挂载常用,考试要求持久化的题不加)。
三、findmnt --verify 和 mount -a 是两个层,而且验之前必须先 umount。
findmnt --verify 是静态检查:语法、字段合法性、挂载点是否存在、选项是否被支持 —— 但不做实际挂载,所以 UUID 写错它照样报 Success。umount && mount -a 才是动态走一遍开机流程。语法合法 ≠ 挂得上,挂得上 ≠ 语法没问题,两个都要做。
还有个前提我一开始没想到:必须先 umount。因为 mount -a 判断「要不要挂」看的是挂载点是否已经出现在挂载树里,手工挂载的残留会让它直接跳过 —— 一条 fstab 都没读到,等于什么都没验。
四、重复标题会让锚点悄悄漂移。
### 今天做了什么 在一篇里出现 4 次,Hexo 把它们编成 今天做了什么、今天做了什么-1、今天做了什么-2、今天做了什么-3。这本身不算错,但意味着:只要往中间插一天,后面所有编号全部平移。任何指向「某天做了什么」的链接,第二天就可能指到别处。
这不是美观问题,是链接不可引用。改法是把日志按天分节(## 2026-09-18 星期五 这种标题天然唯一),一天之内只用加粗小标题,不再产生重复标题。
五、我以为是「目录更紧凑」的开关,其实是另一回事。
我原本打算打开 toc.style_simple,理由是「长文章目录更紧凑」。去主题源码里看了一眼才发现:它实际的效果是侧边栏只保留目录,把作者卡、公告卡、最新文章卡全部不渲染,跟「紧凑」没关系。
结论是这个开关不开。顺带又一次印证了老毛病 —— 我以为的那个对象,和系统里实际的那个对象,不是同一个。
六、拿「运行时才生成的值」去查「静态文件」,等于什么都没验。
我加完节点标识之后,先去线上 HTML 里搜 data-nid 的取值,没搜到就以为没部署上去。实际上 data-nid 是页面加载后由 JS 渲染出来的 —— 静态 HTML 里根本没有这个字符串,只有生成它的那段代码。
这又是「验收命令只验某一层」的一个新变种,而且这次是反的:前几次是验得太浅(配置读通就当事情做成),这次是查错了对象(去静态文件里找运行时的值)。正确的做法是把线上那份 HTML 抓下来、真的跑一遍 JS 再看 DOM。
七、重复的标题会让标识撞车。
三个还没展开的章节里,各有一个占位节点标题都叫「本节将要覆盖的能力」—— 派生出同一个节点标识。链接指过去只会落到第一章,而且是静默落错。改成撞车时按所属章节加后缀(本节将要覆盖的能力-sys)才唯一。
这个坑是我自己写的自测用例抓出来的,肉眼完全看不出来 —— 47 个节点里有 2 个撞车,看上去一切正常。
八、/categories/ 和 /tags/ 默认不存在。
Hexo 不会自动生成这两个索引页,但主题照样在每个文章页渲染指向它们的链接 —— 于是全站静默死链,而且构建时不报任何错。要手动建页并注明类型:
1 | hexo new page categories # 再在生成的 front matter 里加 type: categories |
关键命令或配置
存储第一题的完整链路 —— 注意第 3 步是最容易漏的一步:
1 | parted /dev/sdb unit mib print free # 0 动手前核对:这块盘现在什么状态 |
日志按月分篇,靠的是 front matter 里的 permalink:
1 |
|
地图的深链解析按三层兜底,所以链接写得不精确也不至于空手落地:
1 | ① 先按元素 id 找 #chap-perm / #quiz-storage-0 |
下一步
- 存储接着走:
/dev/sdc空盘 →pvcreate→ 并入卷组rlm→ 扩 LV →xfs_growfs,目标是给根分区扩容。因为/本身就在 LV 上,要动它只能走 LVM 这条路 - 试一下新链路:在日志里点「能力索引」,看是不是真能跳到地图对应那一节
- 待验证:
reboot后df -h /mnt/data还在不在(这是考场唯一承认的验收,今天只走到第 9 步)
能力索引 —— 今天涉及的知识点在地图上的位置:
2026-09-17 星期四
今天把「权限与 ACL」整域收尾,然后开进「存储与挂载」。中间顺手把 RHCSA 学习地图做出来挂到博客上了 —— 以后进度不只写在日志里,也画在图上。
今天做了什么
① 权限域两题全部结项
07 题(ACL)我把欠着的三身份验收补做了,通过;08 题(协作目录)从方案到动手到验收全部走完。C 域到此关闭。
② 把 09-16 那条记录删了 —— 记忆文件和博客里都删了
昨天确实一整天没动手,那条日志留着只会让进度看着好看。判断是:日志反映真实进度,不为连续而凑字数。 但反过来的规矩也得守住 —— 有真实结论的那天,不能因为「没动手」就一起删掉。
③ 进入「存储与挂载」:先补环境和回滚锚点,再看盘
- 装
dosfstools—— 机器上原来没有mkfs.vfat,而题库里有一题要 vfat,不装根本做不了 - 在 VMware 里打快照
storage-baseline:存储操作会改分区表,动手前必须有回滚点 - 看盘功课:
lsblk -f/parted print/wipefs/df -hT四条互相印证,确认那两块新盘都是空的
④ 做了 RHCSA 学习地图挂到博客上
按能力域组织:7 个域 + 1 个附录。每个域下面是知识点、命令对照表(命令 + 中文释义)、可折叠答案的练习题。左侧能力树带状态圆点,已完成 / 进行中 / 未开始一眼可见,还带搜索。日志顶部「配套资料」里有入口。
卡住的地方
一、验收命令第四次骗人,这次是我自己把命令写错了。
我用 ls -ld /home/managers 去验「非成员进不去」,跑出来退出码 0,看着像她能进。实测才搞明白:
ls -ld 只对路径做一次 stat(),而 stat 只需要路径上每一级父目录的 x,对目标对象自己的权限一位都不要。
| 命令 | 实际在问什么 | 非成员退出码 |
|---|---|---|
ls -ld /home/managers |
只 stat 这个对象 | 0 ← 骗人的 |
ls /home/managers |
读目录内容,要目录的 r |
2 |
cd /home/managers |
进目录,要目录的 x |
1 |
touch /home/managers/zz |
建条目,要目录的 wx |
1 |
口诀:想验什么动作,就敲那个动作本身;stat 类命令(ls -ld / ls -l / test -r)都不能代替。
二、blkid 有输出 ≠ 有文件系统。
我原来的判据是「有输出就是格式化过了」,错:
1 | blkid /dev/loop1p1 ← 这个分区根本没 mkfs |
输出里的字段分两类:TYPE= / UUID= 是文件系统的属性;PARTUUID= / PARTLABEL= 只是分区表的属性。判据要改成看 TYPE= 字段,不是看有没有输出。
三、SGID 只管一半:它管属组,不管权限位。
协作目录那题,SGID 一开,natasha 建的文件属组确实是 sysmgrs 了,但文件自己是 -rw-r--r--,组位只有 r —— 组里其他人照样改不了,协作没实现。
新建文件的权限位由 umask 决定(022 → 644),SGID 碰不到它。要「组员能互相改文件」,必须再补一层默认 ACL。
四、默认 ACL 会接管 umask。
| 目录 | 令 umask 077 后新建的文件 |
|---|---|
| 有默认 ACL | -rw-rw----+ ← umask 完全没生效 |
| 无默认 ACL | -rw-------. ← umask 正常生效 |
五、-R 在权限题里是高危动作。
对已经有文件的目录再跑一次 chmod -R 2770:
1 | -rw-r--r--. 1 natasha sysmgrs --chmod -R 2770--> -rwxrws---. 1 natasha sysmgrs |
文件被加上执行位、加上毫无意义的 setgid,连 other 的 r 都被砍了。这次目录恰好是空的所以没伤到东西,但 -R 以后要当危险参数对待。
六、我记错的一个点:ACL 组类不是「命中即止」,是并集。
我原来记的模型是「属主 → 具名用户 → 属组 → 其他,命中即止」。实测被推翻:
1 | 文件属主 root、属组 sysmgrs、mode 640 → group::r-- |
正确的判定是:
- 属主 / 具名用户:严格命中即止(写成
---就是禁止,这条没变) - 组类:属组条目 ∪ 所有命中的具名组条目,再 ∩ mask;任一条够就放行
- 都不命中 →
other::
七、两块待动的新盘,靠输出分不出来。
两块盘尺寸一样(都是 8G)、都是空盘、都没签名、都没挂载点 —— 三盏灯全绿,一模一样。唯一能区分的是设备名本身。 所以防错不能只靠「看输出」,得事前明确只动哪一块,敲之前复读一遍设备名。
关键命令或配置
协作目录的完整配方(SGID 管属组,默认 ACL 管权限位,两层都要):
1 | mkdir -p /home/managers |
-d 和 -R 我一开始混成一个,其实是两回事:
-d(default)= 给这个目录登记一份模板,管以后新建的条目-R(recursive)= 立刻把这次修改套到已经存在的条目上
继承根本不需要 -R。 而且模板只登记在你点名的那个目录上:已经存在的子目录不会自动获得,之后新建的子目录会自带模板并继续往下传。
还有一条门槛:改 ACL 要求 euid == 文件属主,或有 CAP_FOWNER。 对目录有 w 完全帮不上忙(我用组身份试过,Operation not permitted)。
存储的地基是五层,只有最后一层跨重启:
1 | 块设备 → 分区或卷 → 文件系统 → 挂载点 → /etc/fstab |
验收也分三层,越往下越算数:
1 | mount /dev/sdb1 /mnt/data # ① 只证明「现在能用」,重启归零 |
必须先过第 ② 层再重启 —— fstab 写错会直接掉进 emergency mode,整台机器起不来。
动盘前核对该不该动它,三条互相印证,不能只看一条:
1 | lsblk -f # FSTYPE / UUID 列是空的 |
parted print 的三种状态值得记住:
| 状态 | parted print |
wipefs |
|---|---|---|
| 完全空盘 | Error: unrecognised disk label |
无输出 |
| 有分区表、无分区 | Partition Table: gpt,分区列表空 |
loop1 0x200 gpt ← 分区表本身也是签名 |
| 有分区表 + 分区 | 列出分区行 | — |
unrecognised disk label 说的是连分区表都没有,不是「分区表里没有分区」。
关于怎么学,今天确认了两件事
- 机制类内容我必须要图。 今天两次说「听不懂」和「给我个流程图」,换成图解之后一次就过了 —— 以后碰上机制,直接要图,别硬啃文字。
- 没学过的命令不能靠「你想想」跳过。 被问「mkfs 有没有回头路」时我完全答不上来,因为我根本不知道
mkfs在干什么。先给一个最小可运行的演示再问判断题才有效:用dd+losetup造两块「假盘」,对其中一块mkfs -f重打一次,里面原来的文件就永久消失了,而且命令返回成功、一声不响。整个过程一点不碰真盘,安全和效果都和真盘一样。
下一步
- 写存储闭环方案,先不执行:在
/dev/sdb上切一个约 1 GiB 分区 → xfs → 挂到/mnt/data→ 重启自动挂载。要写清楚:命令序列、每一步属于五层的哪一层、每一步怎么验收、/etc/fstab那一行逐字。 - 回答一个问题:
parted建分区表,选gpt还是msdos,为什么? - 然后进存储三题:调整逻辑卷大小(
lvextend+xfs_growfs)、添加交换分区、创建逻辑卷(vgcreate -s定 PE 大小 /lvcreate -l是 PE 个数,再配 vfat)。 - 一个要练的读数习惯:
ls -ld/ls -l末尾是+还是.。+= 有扩展 ACL(含默认 ACL),.只有 SELinux 上下文。今天我其实自己把getfacl打出来了,但没注意到「少了default:那几行」。
能力索引 —— 今天涉及的知识点在地图上的位置:
2026-09-15 星期二
今天主线是「用户与组 + 权限」这一大块,中间插了两件事:评估一套红帽官方培训资料、给实验机补磁盘。但最值得记的不是做了几道题 —— 而是今天我三次以为自己做完了,三次都被证明没验到位。
今天做了什么
① 评估桌面那套红帽官方培训资料
一套 24 GB 的实验环境(一台 RHEL 9.1 的「真机」,内部再用 KVM 跑子虚拟机)+ 两套题库(EX200 16 页、EX294 39 页)。
最重要的发现是:题库和实验环境是配套绑定的,拆不开。 题目依赖那台真机自己提供的软件源、DNS、NTP、NFS、容器镜像仓库,还依赖子机预置的两块 10 GB 磁盘。所以「只要题库」做不了题,「只要环境」又不知道练什么。
决策:暂不解压。 宿主机总共 15.7 GB 内存,日常可用只剩 1.9 GB,而那个真机要 4 GB 起。改成在自己那台实验机上做题,题库里依赖真机的部分自己搭出来 —— 搭的过程本身就是练习。
② 给实验机加了两块 8 GB 磁盘,打完快照 baseline-2disks
之前只有一块盘、卷组里没有空闲空间,LVM 扩容、分区、文件系统这些题全做不了,现在解锁了。(尺寸和题库原环境不一样,但不影响任何一道题。)
这里学到一个要点:快照是「按下快门那一刻的全量状态」,不是「你想要的状态」。 该清掉的临时目录没清,就被一起封存进去,回滚多少次都带着。
③ 回答了前一轮留下的两个问题
- 排序题(9 个领域怎么排):我的排法是「软件与网络 → 安全 → 基础工具 → 用户与组 → 文件系统与服务 → Shell 脚本 → 运行中系统 → 本地存储 → 容器」,依据是「从服务器初始化的基本操作,到常用操作,再到深入流程」。
- 默写题(不看资料写一个 repo 文件):写出来了,五个字段齐全,还用上了
$releasever变量 —— 比我预想的好。
④ 用户与组这题 —— 自己做完了,最终 6/6
自己走了完整流程:先给六个相关文件拍 before 快照 → 建组、建三个用户 → 配口令 → diff 看系统到底改了哪几行 → 用 id 验结果。
⑤ 权限与 ACL 这题 —— 也做完了,最后配置完全正确
先写命令方案、再动手。做完后 getfacl 里:natasha 可读写、harry 无权限、其他用户可读,三条要求都满足。
卡住的地方
一、三个「验收命令会骗人」的实例,全是今天撞出来的。
| 我拿来验收的命令 | 它实际验的层次 | 骗在哪 |
|---|---|---|
dnf repolist |
只验「配置能不能读通」 | 仓库地址写成根本不存在的目录,它照样全绿 |
passwd -S <用户> |
只验「口令字段非空」 | 字段里塞的是明文,它也报 PS(Password Set) |
vim 打开文件 |
其实什么都没验 | 不可写时它只是标个 [readonly],不敲 :wq 一声不响 |
归纳成一句:每条验收命令只验某一层。要验「事情做成了」,就必须真的去做那件事。
二、useradd -p 收的是「已加密的口令」,我传了明文。
结果那个用户的口令字段就是一串明文,等于密码没设 —— 用任何口令都登不进去。而 passwd -S 还报 PS,看着完全正常,只在括号里悄悄写了句「使用了备用认证方案」。正确做法是 passwd <用户> --stdin,或者先加密再传。
三、chmod 2666 里的那个 2 用错了对象。
我本意是「让权限被继承」,那是从协作目录那题借来的思路。但 SGID 只在「目录」上做继承,而且继承的是属组,不是权限位;放在普通文件上毫无作用,只在 ls -l 里多亮一个 S。文件层面要「继承」得用默认 ACL,那是另一种机制,而且也只对目录里新建的东西生效。
四、最有价值的一个坑:不是「顺序不对」,是「两个不同的文件被我当成同一个」。
我做了一个对照实验:先 setfacl 再 chmod 644,发现 natasha 还是能读写,据此断定「必须先 chmod」的说法是错的。实际上当时我手上有两个文件 —— 一个(真正做完的题)mask 是 rw-、能写;另一个(对照实验)mask 被压成了 r--、写不了。我把一个能写的和一个写不了的,当成「同一件事的两次验证」了。
而证明我错了的证据,就印在我自己贴出来的输出里:那两行 user:natasha:rw- #effective:r-- 和 mask::r-- —— 我没读它们,改去看 vim 能不能打开。
关键命令或配置
仓库配置的验证要走三层,只有第三层算数:
1 | dnf repolist # ① 语法层:不联网,抓不到地址错 |
注意那个 2>&1 —— 报错走的是 stderr,不加它,下载失败时我会看到一个空输出,还不知道为什么。
用户与组:
1 | groupadd sysmgrs |
权限 + ACL(先 chmod 定基线,再 setfacl):
1 | cp /etc/hosts /var/tmp/hosts |
验收要用目标身份真的写一次,而且同时看退出码和文件内容:
1 | runuser -u natasha -- sh -c 'echo X >> /var/tmp/hosts'; echo $? |
今天真正记住的判断
「未验证」比「不会」更危险。 今天三次出错,没有一次是命令敲错,全是验收只做了一半。以后每条验收命令都先问一句:它验的是「配置读通了」,还是「事情做成了」?
ACL 的判定是「命中即止」,不是层层叠加。 属主 → 具名用户 → 属组/具名组 → 其他用户,命中第一个就结束。所以「其他用户给了读、但某个具名用户要求不能读」并不矛盾 —— 他在第二步就被截停了,根本走不到最后。
mask 是具名条目的天花板。 具名用户的真实权限 = 自己的条目 ∩ mask。
chmod的数字写法一定会重写 mask,符号写法只动你点名的位。 有 ACL 的文件上敲chmod 644,是把中间那一位数字写进mask,可能悄悄砍掉具名用户的权限;chmod o=r只改其他用户,mask 原地不动。我原先说「chmod 必须在 setfacl 之前」太绝对了 —— 真正的判据是 chmod 之后 mask 够不够用。有扩展 ACL 的文件,
ls -l中间那三位显示的是 mask,不是属组权限。 看着像 664,实际可能完全不是,只看ls -l会误判。root 不能当验收工具。 把文件权限设成 000,root 读它照样返回成功(它有 CAP_DAC_OVERRIDE,权限位对它不生效)。必须换一个没有特权的身份去验。
只测相关人员,发现不了「其他用户」配错。 今天有一组数据:把「其他用户」的读权限关掉之后,natasha 和 harry 的结果一点没变,只有换上去的第三个人变了 —— 因为他们两个都在第二步被具名条目截停了。这类错误只能靠第三个人暴露。
「我在 A 上成功了」不能用来否定「B 上失败了」,先确认 A 和 B 的状态是否相同。 这就是我今天明明做对了、却坚持自己有理的根因。
验证只能验证「你已经写出来的东西」,发现不了「你根本不知道要写什么」。 默写 repo 那题,我自己说「比较模糊」的地方,恰好就是漏掉的地方;而我当时想到的验收方式是「用下载判断」,它能检查我写出来的内容,检查不了我没写的字段。
这 9 个领域不是一条线,是三层。 我的排序错在两处,根因是混用了两套标准(前半段按「什么时候用」、后半段按「依赖多深」):
- 环境底座(网络与主机名、软件源、防火墙/SELinux)—— 必须先做,做完就不动
- 贯穿工具(基础工具与文本处理、运行中系统、Shell 脚本)—— 没有「学完」这一天,要练到条件反射
- 专题模块(用户与组+权限、存储与挂载、容器)—— 可以逐个攻,按分量排队
只有第 1、3 层适合排序。另外我把「运行中系统」排太后了(它从第 6 题起就全程渗透),把「本地存储」排在了文件系统之后(它其实是挂载和 fstab 的地基)。
学法要改:不按题号走,按能力走。 题库是抽样,能力是全集,把题做完 ≠ 会做,碰到变体照样废。所以现在改成:题面原文贴出来当例子,然后按能力域(系统底座 / 存储挂载 / 用户组权限 / 安全 / 运行中排障 / 文件文本归档 / 容器)一项一项练,每项都要能独立复现、并且自己能验收。
下一步
- 先补权限那题的正式验收 —— 三身份的那张结果表,我自己跑一遍(结论我大概知道,但验收动作要自己做)。
- 进协作目录(SGID),正好接上我「想用 2666 实现继承」的错误起点 —— 要在 SGID 和默认 ACL 之间自己选一个,并说出理由。
- 两道顺延的问题:① 协作目录是 SGID、默认 ACL,还是两个都要?② 如果要求「其他用户可读写、但谁都不能执行」,
chmod写什么、放在setfacl前还是后?
另外还欠两个概念没补:口令的 9 个字段分别由谁控制(用 chage -l 看比直接读文件直观),以及每个用户被自动分配的那批从属 ID 是干什么用的(和后面的容器题有关)。
能力索引 —— 今天涉及的知识点在地图上的位置:
2026-09-14 星期一
今天干了两件事:第一次真正动手排障一个网络问题(前后排了四轮才挖到根因),以及把实验机的初始化全部收尾。
今天做了什么
① 网络专项第一次实操:VMware NAT 改网段之后不通外网
起因是我把实验机的地址从 1 网段改成了 30 网段,结果上不了网。
先搞清了一个本质:NAT 模式下虚拟机连的不是物理网络,而是 VMware 虚拟出来的一台「隐形路由器」(VMnet8)。它有固定的三个约定:
| 地址 | 归属 |
|---|---|
.1 |
宿主机上的 VMnet8 虚拟网卡 |
.2 |
NAT 网关,整个虚拟网络唯一的出口 |
.128–.254 |
VMware 自带的 DHCP 地址池 |
所以改网段相当于把这台路由器搬到了另一个小区 —— 宿主机侧和虚拟机侧必须同时跟上,少一侧就断网。
排查是在宿主机侧直接读权威配置完成的:VMware 的虚拟网络配置是纯文本,就在 C:\ProgramData\VMware\ 下(vmnetnat.conf / vmnetdhcp.conf),比在图形界面里翻要直接。另外宿主机上 arp -a 能一眼看出虚拟机的真实 IP,比进虚拟机敲命令还快。
② 环境初始化收尾
换 yum 源、补齐缺的工具、把 SELinux 和 firewalld 恢复开启、打完 baseline 快照 —— 环境准备这一阶段到此结束。
卡住的地方
一整天都栽在同一种推理上:把「某条 ping 失败」直接等同于「网络坏了」。 一小时内出现了三次:
- ping 不通网关 → 以为网关或网络有故障
- ping 不通
223.5.5.5→ 以为还是 ping 的问题 - ping 不通
114.114.114.114→ 以为 DNS 不通
三次全是误判。要练的判断力是:先问「这条命令到底在测什么」,再问「它失败意味着什么」。
比如 ping 114.114.114.114 —— 它本身就是 IP,这条路根本不查 DNS,失败只说明对方(或出口防火墙)不回应 ICMP;而 ping www.baidu.com 能通,就已经证明 DNS 完全正常了。真正的 DNS 故障长这样,报错出现在解析阶段,根本不会打印出 IP:
1 | ping: www.baidu.com: Name or service not known |
另一件事:我说「初始化完成」的时候,其实只做了一半。 换源我是照着阿里云文档抄的,glob 写成了 rocky-*.repo,静默漏掉了最要紧的 rocky.repo(baseos / appstream / crb 三个仓库全在里面),结果最常用的三个源一个都没换成。教训是:动手之后要自己跑一条客观证据命令,再宣布完成。
关键命令或配置
排障按这个顺序查(每一步的结论都不一样):
1 | ip -br a # IP 和掩码对不对 |
真凶是默认网关填成了 .1,应该是 .2:
1 | sudo nmcli con mod <连接名> ipv4.gateway 192.168.30.2 |
换 yum 源(Rocky 9 的真实文件名是小写的 rocky.repo,不是 Rocky-*.repo):
1 | cp -a /etc/yum.repos.d /root/yum.repos.d.bak |
验收不能只看「命令没报错」,要看 dnf 实际解析出来的地址:
1 | dnf repolist -v 2>/dev/null | grep -E "^Repo-id|^Repo-baseurl" |
换源前实际在走 USTC,113 KB/s;换完之后 BaseOS 19 MB/s / AppStream 22 MB/s,带宽差了一个数量级还多。
几条今天真正记住的判断
- 网关是谁是「被指定」的,不是靠习惯推出来的。 我下意识觉得网关就是本网段第一个可用地址(
.1),但 VMware 把.1给了宿主机网卡、.2给了 NAT 设备。真实网络里网关是谁,只能查设计文档或问规划者。 - ping 同网段的地址根本不经过网关。 两台同
/24的机器互 ping 靠的是直接 ARP,路由表和默认网关完全不参与 —— 所以「ping 不通网关」这个说法本身就不准确,它真正的含义是二层 ARP 不通。 - 双向都不通 = 链路层问题;只有一个方向不通 = 防火墙。 今天宿主机能 ping 通虚拟机、虚拟机 ping 不通宿主机,顺着这条推,问题就在宿主机 Windows 防火墙(VMnet8 被 Windows 归为「公用网络」,默认不响应入站 ping)。这是个假问题,不影响上网,和真问题叠在一起,一开始被混为一谈了。
- 官方文档也可能是为旧大版本写的。 阿里云镜像页给的命令用的是
Rocky-*.repo,那是 Rocky 8 的命名,在 Rocky 9 上要么完全不生效、要么只静默改一半。照抄任何 glob 之前,先ls核对本机真实文件名。 setenforce 0临时判断故障是正常手段,永久 disabled 不是。 一旦 disabled 并重启过,想恢复就得touch /.autorelabel做全盘 relabel。幸好我是在重启之前改回来的,一条setenforce 1就完事,零副作用 —— 这个「还没重启」的窗口很值钱。- 判断「某事有没有做过」,不能只看我以为的那个位置。 比如备份,我以为会在某个目录、没看到就以为没做,实际人家用的是另一个位置。要先搜索,多路径找一遍,再下结论。
下一步
明天开始 RHCSA 第一阶段。先自己回答两个问题(不许查资料直接抄):
- EX200 的 9 个考纲领域,按什么标准排序?分值、依赖关系,还是日常使用频率?
- 已经有工作经验的几块(dnf、服务管理、网络),要不要重学?如果要,重学该学什么?
另外今天还找了一套 RHCSA / RHCE 的实验环境资料,准备后面照着多练实机。
能力索引 —— 今天涉及的知识点在地图上的位置:
2026-09-11 星期五
今天做了什么
把 RHCE 和 CKA 两个证的备考方向定下来了,顺手把能查到的官方大纲核对了一遍,发现三个和网上老攻略不一样的地方。
三个关键发现
- RHCE 有前置证书。 可以直接报名 EX294,但红帽规定必须同时持有有效的 RHCSA(EX200)才会授予 RHCE 称号。所以真实路径是 RHCSA → RHCE,跳不过去。
- RHCE 新版已经改名并加考。 RHEL 10 版本的官方名称改成了「Red Hat Certified Advanced System Administrator in Ansible」,新增
ansible-navigator、VS Code 工作流、Git 基本操作三项考点。网上大量老资料不覆盖这部分,不能照老攻略学。 - RHCE 有个隐藏评分点:配置必须在重启后仍然生效。 服务、挂载、防火墙、用户,只要
reboot后失效就是零分。这是最高频的失分原因。
CKA 的分数分布(决定复习时间怎么分配)
| 考点域 | 权重 |
|---|---|
| Troubleshooting 故障排查 | 30% |
| Cluster Architecture 集群架构与安装 | 25% |
| Services & Networking 服务与网络 | 20% |
| Workloads & Scheduling 工作负载与调度 | 15% |
| Storage 存储 | 10% |
Troubleshooting 独占 30%,是最重的部分,也是唯一能靠练习真正拉开差距的地方。
两个考试的共同点(决定了学法)
- 都是 100% 纯实操,全程在真实环境里敲命令,一道选择题都没有。
- 考试环境不提供互联网:RHCE 只能查考场内的产品文档,CKA 只能查 kubernetes.io/docs。
- 推论:凡是「需要搜一下才知道怎么写」的内容,就等于不会。 必须练到能默写。
关键命令
1 | # 一次性把剩余空间全扩给逻辑卷并同步扩文件系统,-r 是关键,很多人会漏 |
下一步
搭 3 台 Rocky Linux 10 虚拟机(control / node1 / node2),先把 RHCSA 的存储、SELinux、firewalld 三块练到不用查资料——这三块也是后面 EX294 要用 Ansible 重新实现一遍的内容。
能力索引 —— 这一天主要是定方向、核对考纲,地图上对应的大块还没展开。能挂的先挂两个: