这个月从 LVM 的「建卷组 → 建逻辑卷 → 格式化 → 挂载 → 扩容」整条链走通开始,把存储域剩下的两道题往收尾推。新内容在最上面,每条末尾的「能力索引」指向 RHCSA 学习地图。

2026-10-28 星期三

按存储实操手册从头又走了一遍,这次 A、B、C 三段全过 —— 昨天卡在 B6 的 B7/B8/B9 补上了,实验 C 的扩根也重做了一次。步骤没变,变的是这次没翻聊天记录,只对着文档走,每步自己先说出「成功长什么样」再动手。

今天做了什么

① 实验 B 收尾:两步扩容,再重启验一遍

lvextend -L 300MiB /dev/test/vo → 这时 df 不动(正常,只改了 LVM 层)→ xfs_growfs /vo → df 才变 295M。然后 B9:关机重启,findmnt /vo 有输出,fstab 那一行才算真对。

② 实验 C 重做:给根分区扩容

sdc2 从 4097MiB 起(避开 sdc1 占的前 4096MiB)→ pvcreate → vgextend rlm → lvextend -l +100%free /dev/rlm/root → xfs_growfs /。这条链 10-22 已经走过一次。

第二次做才看清顺序为什么不能颠倒:先扩 LV,再扩文件系统。 反过来先 xfs_growfs,它会照常成功、但 blocks 数一个不变 —— 因为设备本身还没变大,等于白跑一趟,还容易让人以为「这步做过了」。

卡住的地方

只报了「完成了」,输出一条没留,所以今天只能算「操作走完」,不算「验收过」。

要证明三本账对得上,一条命令就够:

1
lsblk -f ; vgs ; df -hT

照目前的操作为推,应该是:sdb1 1GiB xfs 挂 /mnt/data;test VG 里 vo 300MiB 挂 /vo、VFree 剩约 3.7g;rlm VFree 归零、/ 约 11G。这些是推的不是看到的 —— 待验证。

关键命令或配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# B7 → B9:先扩 LV,再扩 FS,最后重启验收
lvextend -L 300MiB /dev/test/vo
df -hT /vo # ★ 此时仍是 195M,属正常
xfs_growfs /vo # 只在挂载状态下做,参数给挂载点
df -hT /vo # 295M 才算过了这一层
reboot

# C:VG 先扩容,LV 才吃得到空间
vgs # ★ 先看 VFree 有多少,不够就先 vgextend
pvcreate /dev/sdc2
vgextend rlm /dev/sdc2
lvextend -l +100%free /dev/rlm/root
xfs_growfs /

下一步:把 swap 这块收掉

存储域就差它了。三条与普通挂载不一样的地方,明天逐个验证:

  1. mkswap 不是 mkfs —— swap 没有「文件系统类型」这个东西
  2. fstab 第二字段写 none,不是目录 —— 所以它压根没有「挂载点」
  3. 启用用 swapon -a,不是 mount -a;验收看 free -h / swapon --show,不看 df

之后按能力依赖往下排:软件包与仓库 → systemd 服务 → 计划任务 → 网络(nmcli,我的最大缺口,放这么后是为了能「起服务 → 看日志 → 放行端口」形成闭环)→ firewalld → SELinux → SSH → 文本处理。待定:明天是先 swap,还是直接进软件包。

能力索引 —— 今天涉及的知识点在地图上的位置:

2026-10-27 星期二

今天没往前学,是把存储实操手册从头完整重做一遍 —— 实验 A(裸分区)A1→A9 全过,实验 B(LVM)做到 B6(写 fstab)就停了。重做比第一次闷,但这次每步都逼自己说清「成功长什么样」,比第一次照着敲留下东西多。

今天做了什么

① 实验 A:裸分区这条路,走到重启验证

sdb1 1 GiB → mkfs.xfs → blkid 取 UUID → fstab 里写 UUID= → 挂 /mnt/data → 重启再验一遍。

特意留了重启这一步:fstab 那一行只在开机那一刻才真被执行。 手工 mount 成功一百次,也证明不了开机时挂得上。重启后 findmnt /mnt/data 有输出,A 才算真过。

② 实验 B:LVM 这条路,做到 B6

sdc1 4096 MiB → pvcreate → vgcreate test → lvcreate -n vo -L 200MiB → mkfs.xfs → fstab 写 /dev/mapper/test-vo → 挂 /vo。

fstab 第一字段这次写的是 /dev/mapper/test-vo。它和 /dev/test/vo 指向同一台设备(真正的节点是 /dev/dm-N),差别只在少走一层 udev 的卷组目录。手册里两种写法都给了,并注明写 UUID 更保险 —— mapper 路径稳在「不随 sdX 命名漂」,但盘重建、VG 重建之后它可能指向别的东西。

卡住的地方

一、B6 是今天唯一改 fstab 的一步,改错了下次开机就进 emergency mode。

mount /vo 成功只说明「这块设备现在能挂上」,不说明 fstab 那行写对了。更坑的是:拿 mount -a 验也不一定准 —— 挂载点已经在挂载树里时,mount -a 会认为它挂着、直接跳过这一条,一条 fstab 都不读。

所以真验的顺序是三步,先卸再挂:

1
2
3
umount /vo
mount -a # 无输出 = 成功
findmnt /vo # 有输出 = 真的按 fstab 挂上了

二、验收只验最后一层,这次踩在博客构建链上。

顺手修了部署脚本一个 bug:它调 hexo generate 时没传工作目录,从项目目录以外的地方跑,生成环节就空转 —— 什么都没生成,但最后一步推送照样成功,脚本还打印 Deploy done: <旧提交>、退出码 0。

也就是说:那句成功是最后一步的成功,不是整条链路的成功。 判据改成三个一起看 —— 提交 sha 有没有变、public/ 里目标文件 mtime 有没有刷新、产物里有没有这轮新加的内容。三个都过才算跑过。

顺带记一条可复用的:子进程(spawn / system())默认继承调用者的工作目录,而生成类工具大多按当前目录找配置 —— 目录不对时它们常常不报错,只是什么都不做。脚本调外部命令,工作目录和退出码一样要显式管。

这条跟存储域那几条是同一族:dnf repolist、passwd -S、blkid、mount -a —— 全都是「验的那一层比结论浅一层」。

三、证据没贴(待验证)。

今天只报了一句「做到 b6 了」,findmnt /vo 和 df -h /vo 的输出没留。所以 B6 现在只能算「操作做完了」,不算「验收过了」—— 下次先补这两条。

关键命令或配置

1
2
3
4
5
6
7
# A 路线:裸分区 → UUID 写 fstab → 重启验证
mkfs.xfs /dev/sdb1
blkid /dev/sdb1 # 取 UUID
# fstab: UUID=<uuid> /mnt/data xfs defaults 0 0
mkdir -p /mnt/data
umount /mnt/data 2>/dev/null
mount -a && findmnt /mnt/data # ★ 先卸再挂,否则等于没验
1
2
3
4
5
6
7
8
9
10
11
# B 路线:LVM → 格式化 → 挂载(停在 B6)
lsblk /dev/sdc # 确认 sdc1 4096M 在
pvcreate /dev/sdc1
vgcreate test /dev/sdc1
lvcreate -n vo -L 200MiB test
pvs ; vgs ; lvs # 三本账对一遍再往下走
mkfs.xfs /dev/test/vo
# fstab: /dev/mapper/test-vo /vo xfs defaults 0 0
mkdir -p /vo
umount /vo 2>/dev/null
mount -a && findmnt /vo && df -hT /vo

下一步

  1. B7:lvextend -L 300MiB /dev/test/vo → 这时 df 还会是 195M(正常,只改了 LVM 层)→ xfs_growfs /vo → 应该变 295M
  2. B9 重启验收:重开机后 findmnt /vo、df -h /vo 各看一眼 —— 重启过才算 fstab 真对
  3. 补 B6 的证据:findmnt /vo + df -h /vo 的输出(待验证)
  4. 再进实验 C:动手前先打快照,sdc2 从 4097MiB 起 —— 别和 sdc1 占的前 4096MiB 叠上

能力索引 —— 今天涉及的知识点在地图上的位置:

2026-10-22 星期四

今天把根分区扩了 —— 第一次动 /,不卸载、不重启,df 从 6.2G 变成 11G。反倒是建分区那一步被 parted 绊住:报错里的数字看着像我起点敲错了,其实只是单位换了一把尺子。

今天做了什么

① 根分区扩容:从「盘上还剩 4 GiB」到 df 真的变成 11G

sdc 剩下的空间做成 sdc2(标 lvm)→ pvcreate → vgextend rlm → lvextend -l +100%free /dev/rlm/root → xfs_growfs /。

四层各看一眼,账是通的:vgs 的 VSize 到 10.99g、VFree <4.00g;lvs 的 root 从 <6.20g 变成 10.19g(2609 extents);df -h / 从 6.2G 变成 11G,used 2.2G / avail 8.1G / 21%。动手前打过快照。

② 四个数字对不上,但每一个都对

  • sdc2 给了 4094MiB,VG 只多出 <4.00g —— PE 是 4 MiB,装不下的余数直接丢掉
  • lvs 说 10.19g,df 说 11G —— df 向上取整到整 G,而且它永远比 lvs 小(XFS 日志 16384 blocks = 64 MiB,再加元数据)
  • parted 报 sdc2 起点差 1 个扇区未对齐 —— 警告不是错误,选 Ignore 继续

这三条要能当场讲出来,不然验收的时候会怀疑自己是不是做错了。

③ 扩容不用改 fstab

/dev/mapper/rlm-root 是稳定名(写在 LVM 元数据里,不随内核 sd 命名漂),文件系统也没重建、UUID 没变。扩容改的是尺寸,不是身份 —— 身份没变就不用动 fstab。

④ 把这几天的存储操作整理成一份手册

存储实操手册:三条路线(裸分区 / LVM / 扩根)对照表 → 每一步的完整命令 → 四层命令对照 → 13 条报错速查 → 26 个可勾选步骤(进度存在浏览器本地)。做这份东西的原因是前面几轮的操作是散的,我要能对着它从头完整走一遍,而不是靠回忆拼。

卡住的地方

一、parted ... 100% 在 GPT 盘上必然报错。

1
2
Error: You requested a partition from 4296MB to 8590MB (sectors 8390656..16777215).
The closest location we can manage is 4296MB to 8590MB (sectors 8390657..16777182).

第一眼以为起点错了 —— 4296MB 对不上我要的 4097MiB。其实是十进制 / 二进制:4097 MiB = 4296 MB,8590MB = 8192 MiB,起点终点都没错。真正撞上的是结尾:16777215 是磁盘最后一个扇区,但 GPT 在盘尾留了 33 个扇区(≈17 KiB)放备份分区表 + 备份 GPT 头,分区不能占,可用上界只有 16777182。

所以「到磁盘末尾」在分区的世界里从来不是「到最后一个字节」—— 头尾都得给分区表让位(盘首 34 扇区、盘尾 33 扇区;msdos 只在盘首占 1 个扇区,盘尾没有保留)。稳定写法是结尾直接给具体值。

二、-s 不等于「交互模式但不提问」。

同一条命令,交互模式下 parted 会问 Fix/Ignore/Cancel?,选 Fix 自动收敛到 16777182,分区照样建成;-s 直接报错退出。脚本模式省掉的不只是提问,还有自动修复。 要写进脚本,就得自己先把边界算出来。

三、lvextend 之后 df 不动,这次没被吓到。

昨天是亲眼看到「LV 300m / df 195M」并存的,今天一见 lvs 变了而 df 没变,就知道是少跑了 xfs_growfs,不用怀疑命令没生效。

关键命令或配置

1
2
3
4
5
6
7
8
9
10
11
12
# 根分区扩容全流程(不卸载、不重启)
parted /dev/sdc mkpart primary 4097MiB 8191MiB # ★ 结尾给具体值,别写 100%
parted /dev/sdc set 2 lvm on
pvcreate /dev/sdc2
vgextend rlm /dev/sdc2
vgs # 看 VFree 是否真的变大
lvextend -l +100%free /dev/rlm/root # +100%free = 把剩下全给它
xfs_growfs / # ★ 参数是挂载点

# 验收:四层各看一眼
pvs ; vgs ; lvs
df -h /
1
2
# 看分区表还剩多少可用扇区(写脚本前先算边界)
parted /dev/sdc unit s print free

下一步

  1. 题 21(swap):sdb 还剩 ~7.6 GiB(sdb1 只占 1 GiB)→ 512 MiB swap → 写 fstab → swapon -a 验收 free -h,不动原有 swap
  2. rlm 的 VFree 已经归零,后面再要空间只能从 test VG(还有 3.70g)里挪,或者加盘
  3. 补上一直没做的那个动作:扩容前 dd 造文件 + sha256sum 记下来,扩完 sha256sum -c 对一遍 —— 昨天、今天都是「扩成了但没验内容不丢」

能力索引 —— 今天涉及的知识点在地图上的位置:

2026-10-21 星期三

隔了将近一个月重新开机,今天只走了两件事:先把打不开的实验机救回来,再把 LVM 从 vgcreate 一路做到「扩到 300 MiB 且 df 真的变大」。题 20 原题算真做成了,但「内容不丢」这一条我自己心里没底 —— 扩之前没留校验文件。

今天做了什么

① 实验机打不开:是锁残留,不是盘坏了

目录里躺着 12 个 .lck,分两批:11 个时间戳全停在 09-17 19:06:45,1 个 .vmx.lck 是今天 09:43。同目录还有两个 .dmp 崩溃转储,.vmx 里 cleanShutdown = "FALSE" —— 指向 09-17 那次非正常关机,锁没被回收。

关键是要分清「锁文件存在」和「有人占用」。两步:① 读 .lck 文件本身,里面写着持有者是哪个 exe;② 去进程列表里对那个 exe 还在不在。09-17 那批写的是虚拟机进程,今天那个写的是图形界面,而当前进程里两个都没有 → 全是孤儿。

处理方式是移走而不是删掉:12 个 .lck 整体移到同目录的备份目录,随时能移回。有快照链的机器,移锁零风险、删盘不可逆 —— 这条记牢。

开机后 lsblk -f / findmnt / pvs / vgs / lvs 和 09-22 收工时一模一样,崩溃没伤到数据层。

② LVM 第二层:建卷组、建逻辑卷

vgcreate test /dev/sdc1 → lvcreate -n vo -L 200MiB test。

这里被卡了一下:我只贴了「命令成功」这一句,vgs / lvs 的输出一个没留。被要求补一次三本账对账 —— pvs 的 PFree、vgs 的 VFree、lvs 的 LSize 要能对上,才算真的建对了。命令返回 created 只说明动作发出去了,不说明账记对了。

③ 格式化 + 挂载 + fstab,四步验收全过

mkfs.xfs 打出三行警告(Filesystem should be larger than 300MB / Log size should be at least 64MB / deprecated)—— 是警告不是失败,200 MiB 的 xfs 照样建成,退出码 0。

验收四步:mount -a 静默无输出、findmnt /vo 的 SOURCE 是 /dev/mapper/test-vo、df -hT 报 195M。

④ 题 20 原题:200 MiB → 300 MiB

lvextend 只改了 LVM 层的账,lvs 已经是 300.00m、Attr 带上 o(open = 正在被使用),但这一瞬间 df 还是 195M —— 两层错位,这次是亲眼看到的,不是背下来的。补一条 xfs_growfs /vo,输出 data blocks changed from 51200 to 76800,df 才变 295M。

from 200.00 MiB (50 extents) to 300.00 MiB (75 extents) 里 50 → 75 正是 PE = 4 MiB 的整数倍换算。

⑤ 顺手把 /dev 认了一遍

/dev 下不是「一堆设备」,是五类东西:真实存储(sda / sda2)、设备映射(dm-0 与 mapper/ 下那堆)、终端(tty*)、伪设备(null / zero / random)、分类索引目录(disk/by-uuid、disk/by-path)。lsblk -o NAME,MAJ:MIN 看主次设备号,ls -l /dev/mapper 看符号链接指向谁 —— /dev/test/vo 和 /dev/mapper/test-vo 其实是同一台设备的两条路径。

卡住的地方

一、只做动作,不留证据。 这次是第三次。vgcreate / lvcreate 都成功,但 vgs / vgdisplay / lvs / lvdisplay 一个都没贴。补完三本账对账才闭环。以后判断一个存储动作做没做成,标准不是「命令没报错」,而是三本账能不能对上。

二、df 为什么比 LV 小一截。 一直以为 200 MiB 就该看到 200M,实际 195M。差分是 xfs 自己的内部日志(1368 blocks × 4 KiB ≈ 5.3 MiB)加上各分配组的元数据 —— 不是「空间丢了」,是文件系统自己要用的。扩到 300 之后同样少 5 MiB,差值基本恒定(200 − 5.3 ≈ 195,300 − 5.3 ≈ 295)。

三、扩容前没留校验文件。 题面要求「保证内容不丢」,我直接扩了。xfs 在线扩容本身是安全的,但没验过就等于没验过。以后的标准动作:扩之前 dd 造一个文件 + sha256sum 记下来,扩完 sha256sum -c 对一遍。

关键命令或配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 卷组与逻辑卷
vgcreate test /dev/sdc1
lvcreate -n vo -L 200MiB test
pvs ; vgs ; lvs # ★ 三本账:PFree / VFree / LSize

# 文件系统与挂载
mkfs.xfs /dev/test/vo
blkid /dev/test/vo # 取 UUID
mkdir -p /vo && mount /dev/mapper/test-vo /vo
mount -a && findmnt /vo && df -hT /vo

# 扩容两步,顺序不能反
lvextend -L 300MiB /dev/test/vo
xfs_growfs /vo # ★ 参数是挂载点,不是设备

下一步

  1. 给根分区扩容(还没做):sdc 剩下的 ~4 GiB → sdc2(标 lvm)→ pvcreate → vgextend rlm → lvextend -l +100%FREE /dev/rlm/root → xfs_growfs /
  2. 动手前先在 VMware 界面打快照 —— 第一次动根分区,虽然只增不减
  3. 记牢两组区别:-L 4G 是「设成 4G」(绝对值),-l +100%FREE 才是「把卷组剩下的全给它」;xfs_growfs 给挂载点,resize2fs 给设备
  4. 补一个习惯:扩容前先放校验文件,扩完再对

能力索引 —— 今天涉及的知识点在地图上的位置: