码上问学问代码之理,学编程之道
教材同步›项目 5›案例答案册
配套《项目5 Linux磁盘管理》课件(45 页)· 叶廷东《Linux 操作系统管理(第 2 版)》航空工业出版社

项目5 案例答案册

把课件里的 4 个任务案例 和 3 道习题抽出来,逐条给出可执行的完整答案:每一步为什么要做(作用)、每一条命令每个参数是什么含义(含义)、以及看到什么算成功(验收)。设备名沿用课件假设(/dev/nvme0n2~/dev/nvme0n6),环境为 RHEL 9.3 + xfs。本页含答案,建议先自己做一遍再看。

案例 1 · 加盘分区挂载 案例 2 · 磁盘配额 案例 3 · 软 RAID5 案例 4 · LVM 与扩容 课后习题 3 道 命令速查
📌
怎么用这页:① 先看「步骤总览表」——它只回答这一步在干什么,不看命令也能建立流程感;② 再看「命令实录」——带注释,可直接照敲;③ 卡在某个参数上时,翻「命令详解」;④ 做完对照「成功标志」自查。所有写盘类命令(fdisk 的 w、mkfs、mdadm --create、pvcreate、lvremove)都会清空数据,先在虚拟机快照后练。
#案例(课件任务)对应课件页核心命令链最终交付
1新增一块 NVMe 硬盘,分区→格式化→挂载→开机自动挂载第 5–15 页 任务1lsblk → fdisk → mkfs.xfs → mount → fstab重启后 /media/nvme1 自动可用
2在 1G 的 xfs 分区上给用户 gdqg_wangluo 做磁盘配额第 16–26 页 任务2uquota → xfs_quota limit/timer → dd 验证写 200M 被拦、文件数到 1500 被拦
3用 4 块 20G 盘做软 RAID5,并完成故障热替换第 27–40 页 任务3fdisk(fd) → mdadm -C → mkfs → mount → fail/add60G 可用空间;坏一块仍可读写
4建 PV/VG/LV 并在线把 3G 逻辑卷扩到 6G第 41–44 页 任务4pvcreate → vgcreate → lvcreate → lvextend → xfs_growfsdf 显示 6G 且数据不丢
案例 1

给服务器加一块 NVMe 盘并真正用起来

课件任务1 · 第 5–15 页 · 分区 → 格式化 → 挂载 → fstab
场景课件原文

「前期建立操作系统时划分的磁盘空间太小,存储空间不能满足后续发展,这时需要为 Linux 主机增加一块硬盘,并对硬盘进行分区、格式化和挂载,从而增大机器的磁盘容量。」思考题是:怎样给 Linux 系统增加一块 NVMe 硬盘?

环境假设新增盘 /dev/nvme0n2(20G,未分区);挂载点 /media/nvme1(课件第 15 页给的例子);文件系统 xfs(RHEL 9 默认)。
答案①步骤总览:11 步,每步只听一句话
步命令这一环节的作用(为什么必须做)看到什么算成功
1lsblk认盘。先确认新盘的设备名和容量——把系统盘当成新盘格式化,是整个项目最贵的错误。出现 20G 的 nvme0n2,TYPE=disk、MOUNTPOINT 为空
2fdisk /dev/nvme0n2写分区表。把整块盘划成若干段,并在地图上登记「这段归谁」。此时数据一个字节都没动。按 w 后提示分区表已修改
3partprobe /dev/nvme0n2让内核重读分区表。否则可能出现「分区建了但 /dev/nvme0n2p1 不存在」的假象。无输出即成功;再 lsblk 能看到 p1
4mkfs.xfs /dev/nvme0n2p1建文件系统。分区只是空地,格式化才写进超级块、位图、inode 表,此后才「能存文件」。输出 meta-data=... isize=512 agcount=4
5mkdir -p /media/nvme1准备挂载点。挂载点必须是已存在的目录,否则 mount 直接报错。目录存在且为空(非空目录会被「遮住」)
6mount /dev/nvme0n2p1 /media/nvme1接入目录树。只有挂载后,才能用路径访问这块盘。findmnt 能看到该挂载
7df -hT验证容量与类型。确认真的挂上了、类型是 xfs、空间是 20G 量级。多出一行 /dev/nvme0n2p1 xfs ... /media/nvme1
8blkid /dev/nvme0n2p1取 UUID。写 fstab 用它,设备名会因插拔顺序变化,UUID 不会。输出 UUID="..." TYPE="xfs"
9vim /etc/fstab登记开机自动挂载。不写 fstab,重启后挂载就没了(mount 只改内存里的映射)。新行六列齐全,用 UUID 而不是设备名
10mount -a验证 fstab 语法。它只挂未挂载的项,等于「按 fstab 演一遍开机」。无任何报错(报错就必须改,否则重启进救援模式)
11umount /media/nvme1卸载演示。要拔盘、要改分区前必须先卸载,否则数据可能损坏。df 里该行消失
答案②命令实录(逐行注释,可直接照做)
bash · 案例 1 完整答案
# ① 认盘:确认新盘是 nvme0n2、20G、没有分区
lsblk

# ② 分区:n 新建 → p 主分区 → 1 分区号 → 回车(默认起始扇区)→ +20G → p 复查 → w 写盘
fdisk /dev/nvme0n2

# ③ 让内核重读分区表(lsblk 看不到 p1 时才需要)
partprobe /dev/nvme0n2

# ④ 格式化:在分区上建立 xfs 文件系统
mkfs.xfs /dev/nvme0n2p1

# ⑤ 建挂载点:必须是已存在的空目录
mkdir -p /media/nvme1

# ⑥ 挂载:把文件系统接到目录树上
mount /dev/nvme0n2p1 /media/nvme1

# ⑦ 验证:能看到 xfs 和约 20G 就成功
df -hT | grep nvme1

# ⑧ 取 UUID(写 fstab 用,比 /dev/nvme0n2p1 稳)
blkid /dev/nvme0n2p1

# ⑨ 登记开机自动挂载:在 fstab 末尾追加一行(六列)
vim /etc/fstab
# UUID=7c8d9e0f-1234-5678-9abc-def012345678  /media/nvme1  xfs  defaults  0  0

# ⑩ 只验证 fstab 写得对不对(不改动已挂载项)
mount -a

# ⑪ 确认挂载点已生效,再演示卸载
findmnt /media/nvme1
umount /media/nvme1
成功标志:df -hT 里出现 /dev/nvme0n2p1 xfs 20G /media/nvme1;mount -a 无报错;重启后该目录仍可用。
答案③命令详解:每个参数到底是什么意思
lsblk★ 动手前必跑

作用:读内核的设备树,以树形列出所有块设备及「盘 → 分区 → LVM/RAID」的从属关系。不需要挂载,也不需要文件系统,所以它是「认盘」的第一条命令。

参数
  • lsblk 默认:NAME/SIZE/TYPE/MOUNTPOINT
  • -f 加 FSTYPE/UUID/LABEL(看有没有格式化)
  • -d 只看整盘,忽略分区
  • -p 显示完整路径 /dev/nvme0n2p1
  • -o NAME,SIZE,TYPE,MOUNTPOINT 自定义列
输出怎么读
  • TYPE:disk 整盘 / part 分区 / lvm 逻辑卷 / raid5 阵列
  • FSTYPE 为空 = 还没格式化
  • MOUNTPOINT 为空 = 还没挂载
  • 缩进一级 = 它属于上一层
fdisk★ 必会

作用:读写磁盘的分区表(MBR/GPT)。它只改「地图」——第 0 扇区的分区表项,不搬运、不清除任何数据。所以删错分区后数据往往还能救回来。

命令行参数
  • fdisk -l 列出所有盘的分区表
  • fdisk -l /dev/nvme0n2 只看某块盘
  • fdisk /dev/nvme0n2 进入交互模式
  • -u 与 -l 搭配,按扇区显示
交互菜单(课件第 9 页)
  • n 新建分区 → p 主分区 → 分区号 → 起始扇区 → +20G 结束
  • d 删除分区;t 改分区类型(fd=RAID、8e=LVM、82=swap)
  • p 打印分区表;l 列出所有类型编号
  • w 写盘生效;q 退出不保存
  • m 帮助;a 引导标记;v 校验
mkfs.xfs★ 必会

作用:在分区上建立文件系统——写超级块、空闲块位图、inode 表、根目录。课件给的语法是 mkfs [-V] [-t fstype] [fs-options] filesys [blocks],其中 -t 不指定时默认 ext2,所以实战一律写成 mkfs.xfs / mkfs.ext4 更保险。

常用参数
  • -f 强制格式化(分区上已有文件系统时必须加)
  • -L data 设卷标,方便 LABEL=data 挂载
  • -b size=4096 块大小,默认 4K
  • -t xfs 指定类型(等价于直接用 mkfs.xfs)
  • -c 格式化前检查坏道(课件参数)
输出怎么读
  • meta-data=/dev/nvme0n2p1 目标设备
  • isize=512 每个 inode 占 512 字节
  • agcount=4 分配组数量(xfs 把空间分成的「区块组」)
  • bsize=4096 块大小;fdblocks 空闲块数
mount / umount★ 必会

作用:mount 把某个文件系统「接」到目录树的某个目录上(挂载点);umount 反向摘除。注意:mount 不写盘,只改内核内存里的挂载表,所以重启就失效——这正是必须写 fstab 的原因。课件特别提示:系统预留了 /mnt 和 /media 两个专用挂载点。

语法与参数
  • mount [-t type] [-o options] device dir
  • -t xfs 指定类型,一般可省略(自动识别)
  • -o ro 只读挂载;-o rw 读写
  • -o noexec 禁止执行该分区上的程序(安全加固)
  • -o remount 重新挂载改选项,如 mount -o remount,rw /
  • -a 按 /etc/fstab 挂载所有未挂载项
卸载与排查
  • umount /media/nvme1 用目录卸载,也可用设备名
  • 报 target is busy:lsof +D /media/nvme1 找占用进程
  • findmnt /media/nvme1 查这个目录挂的是谁
  • 挂载点非空会被「遮住」,umount 后原文件才重现
/etc/fstab★ 六列必须背下来

作用:开机时系统按这个文件逐行挂载。写错不会立刻报错,而是下次开机进不去系统,所以改完必须 mount -a 验一遍。课件给的格式是 <file system> <dir> <type> <options> <dump> <pass>。

六列逐列含义
  • ① 设备:推荐 UUID=...;写 /dev/nvme0n2p1 换盘后可能指错
  • ② 挂载点:已存在的目录
  • ③ 类型:xfs / ext4 / swap
  • ④ 选项:defaults,可加 uquota noexec nofail
  • ⑤ dump:0 = 不做备份(现在基本都写 0)
  • ⑥ pass:fsck 顺序,根分区 1,其它 2,不检查 0
写错了怎么办
  • 症状:开机卡在 emergency mode
  • 先 mount -o remount,rw / 让根可写
  • 再 vim /etc/fstab 注释掉错行,reboot
  • 远程机器加 nofail:盘不在也能开机
df / blkid☆ 验证与取值

作用:df 看已挂载文件系统的容量与使用率(课件参数:-a/-m/-k/-h/-T/-i);blkid 取分区的 UUID 与类型,是写 fstab 的数据来源。

df 常用参数
  • -h 人类可读(G/M)
  • -T 多显示文件系统类型
  • -i 看 inode 用量(文件数够不够)
  • -a 连 /proc、/sysfs 一起显示
blkid 取值
  • blkid /dev/nvme0n2p1 看 UUID/LABEL/TYPE
  • blkid -s UUID -o value /dev/nvme0n2p1 只输出 UUID,方便复制
答案④课件思考题 2 的完整回答
答题要点
「怎样给 Linux 系统增加一块 NVMe 硬盘?」答:① 用 lsblk 确认设备名(NVMe 盘命名为 /dev/nvme0n1,分区是 nvme0n1p1,注意比 SATA 盘多一个 p);② fdisk 分区;③ mkfs.xfs 格式化;④ 建挂载点并 mount;⑤ 用 UUID 写 /etc/fstab,mount -a 验证。另外,课件第 5 页思考题 1「安装时被规划为哪几个分区」的答案:UEFI 机器通常是 /boot/efi(512M)、/boot(1G)、/(xfs 根)、swap;用 lsblk -f + df -hT 就能验证自己机器上的实际划分。
案例 2

给用户做磁盘配额:软限 100M / 硬限 150M

课件任务2 · 第 16–26 页 · uquota + xfs_quota
场景课件原文要求

「添加一块磁盘 /dev/nvme0n3,在空闲空间创建 1G 新分区,格式化为 xfs,系统引导时自动挂载到 /gdqg/xfs/;添加用户 gdqg_wangluo,软限制 100MB、硬限制 150MB。」

两份额度

block 限制容量、inode 限制文件个数。课件测试里两条都做了:容量 100/150M,文件数软 1000、硬 1500。

两种强度

soft 越过后只警告并进宽限期;hard 越过直接拒绝写入。课件写「允许额外 50% 的硬限制」,指的就是 150M = 100M × 1.5。

宽限期

块 15 天、inode 30 天:宽限期内可以继续写到硬限;到期还没降回软限以下,软限就「变成硬限」。

答案①步骤总览:先让配额「生效」,再「设值」,最后「验证」
步命令这一环节的作用看到什么算成功
1fdisk /dev/nvme0n3划出 1G 分区(n→p→1→+1G→w)出现 nvme0n3p1
2mkfs.xfs /dev/nvme0n3p1建 xfs 文件系统(xfs 天生支持配额,不用额外建配额文件)输出 meta-data=...
3mkdir -p /gdqg/xfs建挂载点目录存在
4fstab 加 uquota,gquota关键一步:配额是「挂载选项」,不挂 uquota,后面所有 xfs_quota 设置都不会生效mount \| grep gdqg 能看到 usrquota,grpquota
5mount -a让 fstab 生效(或 mount -o remount /gdqg/xfs)df 里出现 /gdqg/xfs
6chmod 777 /gdqg/xfs让测试用户能写——否则测到的是「权限不足」而不是「配额超限」普通用户能创建文件
7rpm -qa \| grep + dnf install确认 xfsprogs / quota 已装,缺则安装两台包都在
8useradd gdqg_wangluo + passwd建被限额的测试用户并设密码id gdqg_wangluo 能查到
9xfs_quota -x -c 'limit ...'设配额值:容量软 100m / 硬 150m,文件数软 1000 / 硬 1500无报错;report 里能看到该用户
10xfs_quota -x -c 'timer ...'设宽限期:块 15 天、inode 30 天report -h 的 Grace 列出现时间
11xfs_quota -x -c 'report -h'看当前用量与限额,确认设置正确Used/Soft/Hard 三列符合预期
12su - gdqg_wangluo + dd验证容量:写 100M 成功、写 200M 报 Disk quota exceeded第二个 dd 中途失败
13touch file{1..1500}验证文件数:到硬限 1500 时报错约第 1500 个文件失败
答案②命令实录
bash · 案例 2 完整答案
# ① 1G 分区:n → p → 1 → 回车 → +1G → w
fdisk /dev/nvme0n3
mkfs.xfs /dev/nvme0n3p1

# ② 挂载点 + fstab(关键是 uquota,gquota 两个挂载选项)
mkdir -p /gdqg/xfs
blkid /dev/nvme0n3p1
vim /etc/fstab
# UUID=xxxx  /gdqg/xfs  xfs  defaults,uquota,gquota  0  0
mount -a
mount | grep gdqg          # 必须看到 usrquota,grpquota,否则后面全白做

# ③ 目录放权(只影响权限,不影响配额)
chmod 777 /gdqg/xfs

# ④ 依赖检查与安装
rpm -qa | grep -E 'xfsprogs|^quota'
dnf install -y xfsprogs quota

# ⑤ 建测试用户
useradd gdqg_wangluo
passwd gdqg_wangluo

# ⑥ 设配额:b=block(容量)  i=inode(文件数)  soft/hard
xfs_quota -x -c 'limit -u bsoft=100m bhard=150m isoft=1000 ihard=1500 gdqg_wangluo' /gdqg/xfs

# ⑦ 设宽限期:块 15 天、inode 30 天
xfs_quota -x -c 'timer -u -b 15d -i 30d gdqg_wangluo' /gdqg/xfs

# ⑧ 查看报表(-h 人类可读)
xfs_quota -x -c 'report -h' /gdqg/xfs

# ⑨ 验证容量:100M 能写,200M 被拦
su - gdqg_wangluo
cd /gdqg/xfs
dd if=/dev/zero of=test100 bs=1M count=100     # 成功
dd if=/dev/zero of=test200 bs=1M count=200     # 失败:Disk quota exceeded

# ⑩ 验证文件数:连续建空文件
for i in $(seq 1 1500); do touch file$i; done  # 到 1500 附近报错
rm -f /gdqg/xfs/test100 /gdqg/xfs/file*         # 清空后配额随之释放
成功标志:第二个 dd 输出 Disk quota exceeded;创建文件到约 1500 个时报错;xfs_quota report 里 Used 停在 150M 以内。
💡
为什么课件说「限制 1000 个」却到 1499 号才报错?因为 isoft=1000 只是警告线,ihard=1500 才是拦截线;宽限期内系统允许你越过软限继续写到硬限。目录里原本还有一个 file.data,所以第 1500 个文件(file1499)时 inode 计数到 1500,立刻失败。这道题的考点正是「软限 ≠ 硬限」。
答案③命令详解
xfs_quota★ 本案例主角

作用:xfs 专用的配额管理工具,用来设限、设宽限期、出报表。课件原话:「xfs 文件系统是 RHEL 默认文件系统,无需创建配额文件,xfs 自带支持。」

全局参数
  • -x 专家模式,不加它只能用 quota/df 这类查询,改不了限额
  • -c '命令' 执行一条子命令后退出,可重复多个 -c
  • 末尾要跟挂载点(/gdqg/xfs),不是设备名
常用子命令
  • limit -u bsoft= bhard= isoft= ihard= 用户 设用户配额
  • limit -g ... 设用户组配额
  • timer -u -b 15d -i 30d 用户 设宽限期
  • report -h -u 按用户出报表;-g 按组
  • quota -u 用户 只看某人
  • state 看配额功能是否已开启
bsoft / bhard

b = block = 容量额度,单位可写 k/m/g。课件算术:软 100M,硬 150M,即「允许额外 50% 的硬限制」。

isoft / ihard

i = inode = 文件个数额度。注意 inode 与容量是两套独立的账:文件很小也会先把 inode 用光。

timer

-b 15d 块宽限 15 天,-i 30d 文件数宽限 30 天。宽限期结束仍未降到软限以下,软限变硬限。

dd☆ 配额测试的「量杯」

作用:按块复制数据。课件原话:「dd 用于读取、转换并输出数据;/dev/zero 用来创建一个指定长度的空文件。」这里用它精确地写出「100M / 200M」来撞配额。

四个必会参数
  • if= 输入源,/dev/zero = 无限个 0 字节
  • of= 输出目标文件
  • bs=1M 每次读写 1MB
  • count=100 写 100 次 → 合计 100MB
  • status=progress 显示进度(大文件加)
为什么能测出配额
  • 写到额度上限时 write failed: Disk quota exceeded
  • 失败后 ls -lh 只剩 150M 左右
  • 删掉文件,df 与 report 立即回落
答案④课件思考题回答
答题要点
「根分区磁盘耗尽如何避免?」① 把 /var、/home 单独分区或单独 LV,写满不拖死根;② 开配额限制用户/组;③ 配 logrotate 轮转日志;④ 用 du -sh /* 定期定位大户、df -i 查 inode;⑤ 接监控告警。「共享服务器怎么设限额?」挂载加 uquota,gquota,按用户设 block/inode 软硬限 + 宽限期;多人共享同一项目的用组配额更省事;目录配 SGID(chmod 2775)保证新建文件同属一个组。
案例 3

4 块 20G 盘做软 RAID5,并演练坏盘热替换

课件任务3 · 第 27–40 页 · mdadm 七步法
场景课件七步法

课件把案例拆成七步:① 为 4 块盘各建 20G 分区(类型 fd)→ ② mdadm 创建 RAID5 → ③ 格式化为 xfs → ④ 查看 RAID5 详情 → ⑤ 挂载 /media/gdqg/data 并写 500MB 验证 → ⑥ 保存配置到 /etc/mdadm.conf → ⑦ 硬盘故障与热替换。

RAID5 的特点

数据 + 分布式校验,允许坏 1 块;4 块 20G 的可用容量 = (4−1)×20G ≈ 60G,代价是一块盘的容量做校验。

为什么用 fd

分区类型标 fd(Linux raid autodetect)不是硬性要求,但能让系统和后续运维一眼看出「这块分区是给 RAID 的」,也便于自动装配。

为什么必须存配置

不写 /etc/mdadm.conf,重启后阵列名可能变成 /dev/md127,挂载点就全对不上了。

答案①步骤总览
步命令这一环节的作用看到什么算成功
1fdisk /dev/nvme0n2 … 共 4 块每块盘划 20G 分区,t 改类型为 fd;若盘上有旧分区先 d 删掉4 个 ...p1,lsblk 各 20G
2mdadm --create /dev/md0 --level=5 --raid-devices=4 ...把 4 个分区组成一个 RAID5 设备,从此 /dev/md0 就是一个「块设备」提示 array /dev/md0 started
3cat /proc/mdstat看阵列是否在同步(initial resync),这期间别急着压测[UUUU] 或 resync=xx%
4mkfs.xfs /dev/md0在阵列上建文件系统(RAID 只是块设备,不建文件系统还是用不了)输出 meta-data=/dev/md0
5mkdir -p /media/gdqg/data + mount挂载到目录树,才能按路径访问df -h 显示约 60G
6dd if=/dev/zero of=... bs=1M count=500验证可写,同时让数据真实落盘(后续拔盘测试更有说服力)生成 500M 文件,ls -lh 可见
7mdadm --detail /dev/md0看级别、成员盘、状态、校验算法等完整信息State : clean;Raid Devices : 4
8mdadm --detail --scan --verbose >> /etc/mdadm.conf保存阵列配置,保证重启后仍叫 /dev/md0文件里出现 ARRAY /dev/md0 ...
9mdadm --manage /dev/md0 --fail ...模拟坏盘:把某块成员标记为故障/proc/mdstat 变成 [U_UU]
10--remove 再 --add先摘掉故障盘,再把新盘加进去重建出现 recovery = xx%
11mdadm --stop /dev/md0收尾:停止阵列(停之前必须先 umount)/proc/mdstat 中消失
答案②命令实录
bash · 案例 3 完整答案
# ① 4 块盘各建 20G 分区,类型 fd(以 nvme0n2 为例,其余同理)
fdisk /dev/nvme0n2
#   d(若有旧分区先删)→ n → p → 1 → 回车 → +20G → t → fd → p 复查 → w
fdisk /dev/nvme0n3
fdisk /dev/nvme0n4
fdisk /dev/nvme0n5
lsblk                     # 确认 4 个 20G 的 p1

# ② 创建 RAID5:4 个成员,设备名 /dev/md0
mdadm --create /dev/md0 --level=5 --raid-devices=4 \
      /dev/nvme0n2p1 /dev/nvme0n3p1 /dev/nvme0n4p1 /dev/nvme0n5p1

# ③ 看同步进度(首次创建要 initial resync)
cat /proc/mdstat

# ④ 在阵列上建 xfs
mkfs.xfs /dev/md0

# ⑤ 挂载并写入 500MB 验证
mkdir -p /media/gdqg/data
mount /dev/md0 /media/gdqg/data
dd if=/dev/zero of=/media/gdqg/data/testfile bs=1M count=500
ls -lh /media/gdqg/data/testfile
df -h /media/gdqg/data          # 约 60G 可用 =(4-1)×20G

# ⑥ 查看详情
mdadm --detail /dev/md0

# ⑦ 保存配置(否则重启可能变 md127)
echo 'DEVICE partitions' > /etc/mdadm.conf
mdadm --detail --scan --verbose >> /etc/mdadm.conf
cat /etc/mdadm.conf

# ⑧ 故障演练:标记 → 摘除 → 换新盘
mdadm --manage /dev/md0 --fail   /dev/nvme0n3p1
cat /proc/mdstat                                  # [U_UU]:少了一块
mdadm --manage /dev/md0 --remove /dev/nvme0n3p1
mdadm --manage /dev/md0 --add    /dev/nvme0n6p1
cat /proc/mdstat                                  # [UUUU] + recovery=xx.x%

# ⑨ 收尾(停止前先卸载)
umount /media/gdqg/data
mdadm --stop /dev/md0
成功标志:df 显示约 60G;--fail 之后阵列仍是 [U_UU] 且能正常读写(这就是 RAID5 的价值);--add 后 recovery 百分比逐步上升,最终回到 [UUUU]。
⚠
顺序不能反:--fail → --remove → --add。先 fail 是告诉阵列「这块盘的数已经不可信」,阵列才会用校验重建;不 fail 直接拔盘,行为取决于内核版本,可能直接降级甚至丢数据。
答案③命令详解
mdadm★ 软 RAID 的唯一入口

作用:multiple devices admin,Linux 标准的软 RAID 管理工具,负责创建、查看、管理、监控阵列(课件第 34 页原文)。软 RAID 的校验计算由 CPU 完成,所以性能不如硬 RAID 卡,但便宜、可移植。

创建与查看
  • --create /dev/md0(-C)建阵列
  • --level=5(-l)级别:0/1/5/6/10
  • --raid-devices=4(-n)成员盘数量
  • --spare-devices=1(-x)热备盘数量
  • --chunk=64 条带大小(KB)
  • --detail /dev/md0(-D)看详情
  • --detail --scan --verbose 生成配置行
运维动作
  • --manage /dev/md0 --fail 设备 标记故障(-f)
  • --remove 设备(-r)摘除
  • --add 设备(-a)加入并自动重建
  • --stop /dev/md0(-S)停止阵列
  • --assemble --scan(-A -s)开机按配置装配
  • --monitor --mail 告警监控
/proc/mdstat★ 阵列的心电图

作用:内核实时导出的阵列状态。每个方括号代表一块成员盘:U = 正常(Up),_ = 缺失/故障。它是判断「坏了几块、还在不在重建」的第一现场。

状态怎么读
  • [UUUU] 4 块全正常
  • [U_UU] 第 2 块故障,阵列降级但仍可读写
  • [UU__] RAID5 已坏 2 块 → 阵列失效,数据不可访问
  • [U] 单盘 RAID1 降级
其它字段
  • recovery = 12.5% 正在重建,进度
  • finish=120min speed=8000K/sec 预计耗时与速度
  • 重建期间性能下降,别做压测
  • mdadm --detail 看更细的成员与校验信息
答案④课件思考题回答
答题要点
「一块硬盘坏了还能继续工作,怎么做?」做冗余阵列:RAID1(镜像,2 盘,容量减半)、RAID5(≥3 盘,容 1 块故障,本例就是)、RAID6(容 2 块)、RAID10(先镜像再条带,性能与安全兼顾)。「数据中心怎么配软 RAID?」① 至少 4 盘做 RAID5/6,或 4 盘起步做 RAID10;② 预留 1 块热备盘(-x 1)自动顶上;③ 写 /etc/mdadm.conf 并确保开机 --assemble --scan;④ 用 mdadm --monitor --mail 或监控系统盯 /proc/mdstat;⑤ RAID 不是备份,误删、勒索病毒照样穿透。
案例 4

LVM:建 3G 逻辑卷,再在线扩到 6G

课件任务4 · 第 41–44 页 · PV → VG → LV → growfs
场景课件原文

课件第 41 页的引子很实在:「/var 分了 50GB,后来不够用,怎么办?加盘、重新分区格式化、迁移数据,很麻烦,而且分大了浪费、分小了又缩不回去。这时就该用 LVM 弹性调整容量。」

PV 物理卷

最底层。一个完整硬盘或一个分区,用 pvcreate 打上 LVM 标记后,才能被卷组使用。

VG 卷组

把多个 PV 汇成一个容量池。池子里的空间可以随时再切,这就是「弹性」的来源。

LV 逻辑卷

从池子里切出来的「虚拟分区」,用法和普通分区一样:格式化、挂载。区别是它可以在线变大。

答案①步骤总览:建 → 用 → 扩 → 删
步命令这一环节的作用看到什么算成功
1fdisk /dev/nvme0n6划 5G 分区,t 改为 8e(Linux LVM)nvme0n6p1,5G,类型 8e
2pvcreate /dev/nvme0n6p1把分区变成 PV:写入 LVM 标签与元数据区,此后 LVM 才认它Physical volume ... successfully created
3vgcreate gdqgvg /dev/nvme0n6p1建卷组,把这个 PV 变成池子Volume group "gdqgvg" successfully created
4vgdisplay gdqgvg看池子总容量与空闲容量(默认 PE 4M)VG Size ≈ 5G,Free PE 充足
5lvcreate -L 3G -n gdqglv gdqgvg切出逻辑卷 3GLogical volume "gdqglv" created
6mkfs.xfs /dev/gdqgvg/gdqglv给 LV 建文件系统(LV 本身只是块设备)输出 meta-data=...
7mkdir -p /media/gdqg/lv + mount挂载使用df -h 显示 3G
8fdisk 再建 p2 2G,8e给扩容准备「新砖头」出现 nvme0n6p2
9pvcreate /dev/nvme0n6p2新分区也要先变成 PVsuccessfully created
10vgextend gdqgvg /dev/nvme0n6p2把新 PV 加进池子,池子从 5G 变 7Gvgdisplay 里 VG Size 变大
11lvextend -L 6G /dev/gdqgvg/gdqglv把 LV 从 3G 扩到 6G(占用池子的空闲空间)Logical volume ... successfully resized
12xfs_growfs /media/gdqg/lv让文件系统跟上——不执行这步,df 还是 3G(最经典的坑)输出 data blocks changed from ... to ...
13df -h /media/gdqg/lv终验:容量真的变成 6G,原数据还在Size ≈ 6G,已挂载
14umount → lvremove → vgremove → pvremove删除:必须从上到下,否则报「正在使用」逐条 successfully removed
答案②命令实录
bash · 案例 4 完整答案
# ① 5G 分区,类型改成 8e(Linux LVM)
fdisk /dev/nvme0n6
#   n → p → 1 → 回车 → +5G → t → 8e → w

# ② 分区 → PV
pvcreate /dev/nvme0n6p1

# ③ 建卷组(池子)
vgcreate gdqgvg /dev/nvme0n6p1
vgdisplay gdqgvg              # 看 VG Size / Free PE

# ④ 从池子切 3G 逻辑卷
lvcreate -L 3G -n gdqglv gdqgvg
lvs                           # 确认 LV 大小与所属 VG

# ⑤ 格式化并挂载
mkfs.xfs /dev/gdqgvg/gdqglv
mkdir -p /media/gdqg/lv
mount /dev/gdqgvg/gdqglv /media/gdqg/lv
df -h /media/gdqg/lv          # 约 3G

# ⑥ 扩容第一步:加一块新 PV(2G 分区,类型 8e)
fdisk /dev/nvme0n6            # n → p → 2 → 回车 → +2G → t → 2 → 8e → w
pvcreate /dev/nvme0n6p2

# ⑦ 扩容第二步:把新 PV 加进池子
vgextend gdqgvg /dev/nvme0n6p2
vgdisplay gdqgvg              # VG Size 从 5G 变成 7G

# ⑧ 扩容第三步:扩逻辑卷到 6G
lvextend -L 6G /dev/gdqgvg/gdqglv
#   也可以写增量:lvextend -L +3G /dev/gdqgvg/gdqglv
#   或用光剩余空间:lvextend -l +100%FREE /dev/gdqgvg/gdqglv

# ⑨ 扩容第四步:同步文件系统(xfs 只能在挂载状态下扩)
xfs_growfs /media/gdqg/lv
df -h /media/gdqg/lv          # 这时才真的变成 6G

# ⑩ 删除:从上到下
umount /media/gdqg/lv
lvremove /dev/gdqgvg/gdqglv
vgremove gdqgvg
pvremove /dev/nvme0n6p1 /dev/nvme0n6p2
成功标志:lvextend 之后 lsblk 已经是 6G,但 df 还是 3G;执行 xfs_growfs 之后 df 才变成 6G——这个「先后差」正是本节课最该记住的点。
⚠
三种「扩了没生效」的原因:① 扩了 VG 没扩 LV;② 扩了 LV 没扩文件系统(本例);③ 扩了文件系统但看的是旧目录(df 要指向该挂载点)。顺序永远是:加盘 → PV → VG → LV → 文件系统。
答案③命令详解
pvcreate / vgcreate / lvcreate★ 建库三件套

作用:pvcreate 把分区「登记」为物理卷(在分区起始处写 LVM 标签和元数据区);vgcreate 把若干 PV 合成卷组(池子);lvcreate 从池子里切出逻辑卷。

参数
  • pvcreate -ff /dev/nvme0n6p2 强制覆盖已有 PV 标记
  • vgcreate -s 4M gdqgvg /dev/... 指定 PE 大小(默认 4M,PE 是分配的最小单位)
  • lvcreate -L 3G 绝对大小
  • lvcreate -l 50%VG 百分比大小
  • -n gdqglv 逻辑卷名
查看家族
  • pvs / pvdisplay 物理卷
  • vgs / vgdisplay 卷组(看 Free PE)
  • lvs / lvdisplay 逻辑卷
  • lsblk 也能看到 lvm 层级
lvextend + xfs_growfs★ 扩容黄金搭档

作用:lvextend 只改逻辑卷的边界(块设备变大);xfs_growfs 才是让文件系统知道「地盘变大了」,重建空闲空间索引。两者缺一,df 都不会变。

lvextend
  • -L 6G 扩到 6G(绝对目标值)
  • -L +3G 再加 3G(增量)
  • -l +100%FREE 用光池子剩余
  • -r 连文件系统一起扩(RHEL 8+ 支持,最省事)
文件系统同步(按类型选)
  • xfs:xfs_growfs /media/gdqg/lv(参数是挂载点)
  • ext4:resize2fs /dev/gdqgvg/gdqglv(参数是设备)
  • xfs 不能缩;ext4 可 resize2fs 设备 3G 缩
  • 扩容前建议 xfs_info 确认 agcount 等参数
答案④课件思考题回答
答题要点
「文件系统可以跨多个磁盘吗?」普通分区不行;LVM 可以——一个 VG 可以包含多块盘的 PV,从池子里切出的 LV 就可能横跨多块盘(读写会自动分摊,接近 RAID0 的效果,但没有冗余)。「原有分区怎么扩容?」若已是 LVM:加盘 → pvcreate → vgextend → lvextend → xfs_growfs(池子有余量时可跳过前两步)。若不是 LVM:只能加新盘挂到子目录(如 /var/log)搬数据,或用 growpart 扩分区后 resize2fs/xfs_growfs,但都做不到在线缩容。
习题

课件第 45 页「项目习题与思考」参考答案

3 道 · 简答与操作步骤
第 1 题简述 RAID 技术的优点,RAID0 和 RAID5 相比,哪个更安全?

参考答案:

  • 四大优点:① 大容量——多盘合成一个大存储空间;② 高性能——数据条带化并行读写,吞吐成倍提升;③ 可靠性——镜像或校验提供冗余,坏盘可重建;④ 可管理性——统一成一个逻辑设备,便于运维与扩容。
  • RAID0 与 RAID5 比:RAID5 更安全。RAID0 只有条带、没有冗余,任意一块盘坏,全部数据丢失,可用容量 100%;RAID5 用一块盘的容量存分布式校验,允许坏 1 块,坏盘后进入降级模式仍可读写,换盘后能重建,可用容量 (n−1)/n。
  • 补充加分点:RAID0 追求极致性能、适合临时数据;RAID5 适合读多写少的文件服务器;写密集场景 RAID5 有「写惩罚」,可考虑 RAID10;RAID ≠ 备份。
第 2 题简述 LVM 的三大核心组件,LVM 的删除顺序是怎样的?

参考答案:

组件全称是什么关键命令
PVPhysical Volume 物理卷最底层,一整块盘或一个分区,打过 LVM 标记后才能被池子使用pvcreate / pvs / pvremove
VGVolume Group 卷组由 1 个或多个 PV 组成的容量池,是「弹性」的来源vgcreate / vgextend / vgremove
LVLogical Volume 逻辑卷从池子里切出的「虚拟分区」,可格式化、可挂载、可在线扩容lvcreate / lvextend / lvremove

删除顺序:从上到下(与创建相反)

  • umount /挂载点 —— 先卸载,否则「设备忙」
  • lvremove /dev/卷组名/逻辑卷名 —— 删逻辑卷
  • vgremove 卷组名 —— 删卷组
  • pvremove /dev/分区名 —— 删物理卷标记
  • 顺序不能颠倒:LV 依赖 VG、VG 依赖 PV,下层还有上层在用时会被拒绝删除。
第 3 题/dev/vg_gdqg/lv_gdqg 从 20G 扩到 30G(XFS,挂 /mnt/gdqg,卷组有余量)

参考答案(四条命令,缺一不可):

bash · 第 3 题标准答案
# ① 先确认池子里确实有空闲空间(有 Free PE 才能直接扩)
vgdisplay vg_gdqg | grep -E 'VG Size|Free  PE'

# ② 扩逻辑卷:20G → 30G
lvextend -L 30G /dev/vg_gdqg/lv_gdqg
#   或写增量:lvextend -L +10G /dev/vg_gdqg/lv_gdqg

# ③ 同步 XFS 文件系统(XFS 只能在挂载状态下扩,参数给挂载点)
xfs_growfs /mnt/gdqg

# ④ 验证:Size 变成 30G,原数据仍在
df -hT /mnt/gdqg
lsblk | grep lv_gdqg
判分点:① 是否提到 vg 有余量所以不用 vgextend;② lvextend 是否写对设备路径 /dev/vg_gdqg/lv_gdqg;③ 是否记得 xfs_growfs(只写 lvextend 只能得一半分);④ 是否用 df 验证。
💡
如果这道题的文件系统是 ext4 而不是 XFS:第三步要换成 resize2fs /dev/vg_gdqg/lv_gdqg(参数是设备不是挂载点)。如果卷组没有余量:得先加盘 → pvcreate → vgextend vg_gdqg /dev/新分区,再回到第 ② 步。
附录

本页 20 条命令速查:一句话作用 + 必知参数

命令一句话作用必知参数案例
lsblk看块设备层级(盘/分区/LVM/RAID)-f 带文件系统;-d 只看整盘1
fdisk读写分区表(只改地图,不动数据)-l 列出;交互 n/d/t/w/q1 2 3 4
partprobe让内核重读分区表后跟设备名1
mkfs.xfs建 xfs 文件系统(写超级块/位图/inode 表)-f 强制;-L 卷标;-b size=1 2 3 4
xfs_repair检查修复 xfs(替代 fsck)-n 只查不改;-f 强制;必须先卸载通用
mount把文件系统接到目录树-t 类型;-o ro/defaults;-a 按 fstab1 2 3 4
umount摘除挂载给目录或设备;busy 用 lsof +D1 3 4
df看已挂载文件系统容量-h 可读;-T 类型;-i inode1 2 3 4
du看目录里谁在占空间-sh 汇总;/* 下钻排错
blkid取分区的 UUID/LABEL/TYPE-s UUID -o value1 2
/etc/fstab开机自动挂载配置(六列)设备/挂载点/类型/选项/dump/pass1 2
xfs_quotaxfs 配额:设限/宽限期/报表-x 专家模式;-c 子命令;limit/timer/report2
dd按块复制,测试写入与配额if= of= bs= count=2 3
mdadm软 RAID 创建/查看/热替换-C -l -n;--fail/--remove/--add;-D -s3
/proc/mdstat阵列实时状态(U/_ 与重建进度)[UUUU] 正常;[U_UU] 降级3
pvcreate分区 → 物理卷-ff 强制覆盖4
vgcreate / vgextend建卷组 / 把新 PV 加进池子-s PE 大小4
lvcreate / lvextend切逻辑卷 / 扩逻辑卷-L 绝对值 -l 百分比 -n 名称 -r 连文件系统4
xfs_growfs让 xfs 认出「地盘变大」(给挂载点)只有扩,没有缩;ext4 对应 resize2fs4
mkfs.ext4 / resize2fsext4 建文件系统 / 扩缩容量(给设备)resize2fs 设备 [大小]对比