Linux 存储管理实战:磁盘分区、文件系统、挂载与 LVM
Linux 存储管理练习笔记
实验平台:VMware Fusion
操作系统:Rocky Linux 9.5(aarch64)
实验目录:/opt/storage_lab
实验日期:2026 年 7 月 24—25 日
说明:本文按本次实际操作顺序整理,保留了重要的错误现象、排查过程和修正方法。截图中的 UUID 只属于本次虚拟机,重新格式化后会改变。
[TOC]
一、实验环境与安全边界
1. 实验目标
本次环境用于练习:
- 识别磁盘、分区、LVM、文件系统和挂载点
- 使用
fdisk、parted创建 GPT 分区 - 创建 XFS 文件系统并设置标签
- 临时挂载、卸载、只读重挂载
- 理解挂载覆盖和
target is busy - 区分
df与du - 创建、启用和关闭 swap
- 理解软链接、硬链接及跨文件系统限制
- 在不修改真实
/etc/fstab的情况下练习 UUID 挂载配置 - 启用并设置 XFS 用户磁盘配额
2. 三块虚拟磁盘
| 设备 | 容量 | 用途 | 安全要求 |
|---|---|---|---|
/dev/nvme0n1 | 20G | Rocky Linux 系统盘 | 禁止分区、格式化或写入 swap 签名 |
/dev/nvme0n2 | 5G | XFS、挂载、swap、链接等实验 | 只操作明确创建的实验分区 |
/dev/nvme0n3 | 3G | parted 和 XFS quota 实验 | 只操作明确创建的实验分区 |
判断 /dev/nvme0n1 是系统盘的依据,不是它叫“第一块盘”,而是它的下级设备承载了:
/boot/efi/boot- 根文件系统
/ - 系统原有的
[SWAP]
其中 /dev/nvme0n1p3 是 LVM 成员,内部包含:
rl-root → /
rl-swap → [SWAP]
/dev/nvme0n1 在整个实验中始终只查看、不修改。3. 实验目录
/opt/storage_lab/
├── cover_test/
│ └── host_file.txt
├── links/
│ └── original.txt
├── mount_data/
├── notes/
└── quota_data/各目录用途:
| 目录 | 用途 |
|---|---|
mount_data | 普通挂载以及 df、du 实验 |
cover_test | 演示挂载到非空目录后的覆盖现象 |
links | 软链接和硬链接实验 |
notes | 保存安全的 fstab.practice |
quota_data | XFS 用户配额实验 |
实验中曾恢复过快照,恢复后这些目录被手动重新创建。早期截图中出现过 mount_date 的拼写,重建后统一使用 mount_data。
4. 存储管理的基本层次
整块磁盘
↓ 创建分区表、划分空间
分区
↓ mkfs 或 mkswap
文件系统 / swap 签名
↓ mount 或 swapon
目录树中的挂载点 / 活动交换空间必须区分:
- 检测到磁盘,不代表已经有分区。
- 有分区,不代表已经有文件系统。
- 有文件系统,不代表已经挂载。
- 写入 swap 签名,不代表 swap 已经启用。
- 日常文件存储通常会经过“分区 → 文件系统 → 挂载”,但某些程序也能直接使用原始块设备,所以“必须分区”并不是绝对规则。
二、练习 1:识别磁盘、文件系统和挂载关系
目标
使用多个只读查询命令识别系统盘与两块实验盘,并理解各命令观察的是哪个层次。
1. 使用 lsblk 查看块设备树
lsblk命令名称可以理解为 list block devices。
常见字段:
| 字段 | 含义 |
|---|---|
NAME | 设备名称 |
MAJ:MIN | 内核使用的主、次设备号 |
RM | 是否为可移除设备 |
SIZE | 容量 |
RO | 底层块设备是否被标记为只读 |
TYPE | 设备类型 |
MOUNTPOINTS | 当前挂载位置 |
本次结果中的 TYPE:
disk:完整块设备;本实验中是 VMware 虚拟磁盘,不应笼统理解成实体物理硬盘。part:普通分区。lvm:LVM 逻辑卷。rom:光盘设备。

结论:
nvme0n1下有启动、根文件系统和 swap,所以是系统盘。nvme0n2和nvme0n3当时没有子分区、文件系统和挂载点,是两块空实验盘。
2. 使用 lsblk -f 查看文件系统信息
lsblk -f-f 表示显示 filesystem 信息,不是普通文件的属主、权限或大小。
主要字段:
| 字段 | 含义 |
|---|---|
FSTYPE | 文件系统或签名类型,例如 xfs、vfat、swap |
FSVER | 文件系统版本 |
LABEL | 文件系统标签 |
UUID | 文件系统唯一标识 |
FSAVAIL | 可用空间 |
FSUSE% | 使用率 |
MOUNTPOINTS | 挂载点 |

3. 自定义 lsblk 字段
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL-o 表示只输出指定列。加入 MODEL 后可以看到设备来自 VMware:
VMware Virtual NVMe Disk
4. 使用 blkid 查看设备签名
blkidblkid 适合精确查看:
UUIDLABELTYPEPARTUUIDPARTLABEL

UUID 与 PARTUUID 不同:
UUID:文件系统或 swap 签名的标识。PARTUUID:分区表中分区本身的标识。
5. 使用 df -Th 查看已挂载文件系统
df -Th参数:
-T:显示文件系统类型。-h:用易读单位显示容量。

df 只显示当前已经挂载的文件系统。因此,虽然 lsblk 能看到空的 nvme0n2、nvme0n3,它们当时不会出现在 df 中。
本题结论
| 命令 | 最适合观察 |
|---|---|
lsblk | 磁盘、分区、LVM 的树形关系和挂载点 |
lsblk -f | 文件系统类型、标签、UUID |
blkid | 指定设备的文件系统签名和各种 ID |
df -Th | 已挂载文件系统的容量和使用率 |
三、练习 2:使用 fdisk 创建 GPT 分区
目标
在 /dev/nvme0n2 上创建 GPT 分区表,并划分:
/dev/nvme0n2p1:2G/dev/nvme0n2p2:1G- 剩余约 2G 暂不分配
1. 第一次操作:误建 DOS/MBR 分区表
执行:
fdisk /dev/nvme0n2空盘进入 fdisk 后直接输入 n,工具自动创建了 DOS disklabel:
Created a new DOS disklabel
Disklabel type: dos
第一、第二个分区虽然成功出现,但分区表类型是 dos:

这不是本题目标。恢复快照后重新添加实验盘,并按 GPT 方式重做。
2. 正确操作:先建立 GPT 分区表
fdisk /dev/nvme0n2交互过程:
g 创建新的 GPT 分区表
n 创建第一个分区
1 分区号;也可以直接回车接受默认值
回车 接受默认起始扇区
+2G 分区大小
n 创建第二个分区
2 分区号
回车 接受默认起始扇区
+1G 分区大小
p 在写入前预览分区表
w 写入磁盘并退出
参数和交互指令:
| 输入 | 作用 |
|---|---|
g | 创建 GPT 分区表 |
n | 创建新分区 |
p | 打印当前内存中的分区方案 |
w | 把修改写入磁盘并退出 |
q | 不保存退出 |
fdisk 的修改通常先保存在内存中,只有 w 才正式写入。输入 p 只是预览。
3. 通知内核并验证
partprobe /dev/nvme0n2
fdisk -l /dev/nvme0n2
lsblk -o NAME,SIZE,TYPE,PTTYPE,FSTYPEpartprobe 的作用是通知内核重新读取磁盘上的分区表。


验证结果:
/dev/nvme0n2 5G PTTYPE=gpt
├─nvme0n2p1 2G
└─nvme0n2p2 1G两个分区的 FSTYPE 仍为空,这是正常现象:分区只划定了磁盘区域,还没有建立文件系统或 swap 签名。
GPT 与 MBR 的区别
| 项目 | MBR/DOS | GPT |
|---|---|---|
| 传统容量上限 | 约 2TiB | 远大于常见单盘容量 |
| 分区结构 | 主分区、扩展分区、逻辑分区 | 没有 MBR 的主/扩展分区限制 |
| 分区标识 | 类型编号等 | 使用 GUID 类型和分区 GUID |
| UEFI 系统 | 可以配合,但不是标准组合 | 常与 UEFI 配合 |
安全提醒
以下命令中的设备名必须反复确认:
fdisk /dev/nvme0n2如果误写成 /dev/nvme0n1 并保存,可能破坏系统盘分区表。
四、练习 3:创建 XFS 文件系统并设置标签
目标
在 /dev/nvme0n2p1 上建立 XFS 文件系统,并设置文件系统标签 LAB_DATA。
1. 创建 XFS 文件系统
mkfs.xfs /dev/nvme0n2p1命令拆解:
mkfs:make filesystem,建立文件系统。.xfs:指定创建 XFS。/dev/nvme0n2p1:目标必须是实验分区 p1。

mkfs.xfs 的输出展示了:
- inode 大小
- block 大小
- allocation group 数量
- 内部日志
- reflink、bigtime 等 XFS 特性
这些是创建成功后的文件系统结构信息,不是错误。
mkfs会破坏目标分区中的原有文件系统和数据。不能对/dev/nvme0n1*执行本实验命令,也不能把整个/dev/nvme0n2当成 p1 格式化。
2. 验证文件系统和 UUID
lsblk -f
blkid /dev/nvme0n2p1
创建文件系统时自动生成了本次实验的 UUID:
d63071f7-13f7-4e86-a3a7-4d8fc7f54428重新格式化会生成新的 UUID,因此笔记中的值不能直接照搬到另一台机器。
3. 设置文件系统标签
由于格式化时没有同时指定标签,后续使用:
xfs_admin -L LAB_DATA /dev/nvme0n2p1验证:
lsblk -f
也可以在第一次格式化时直接写:
mkfs.xfs -L LAB_DATA /dev/nvme0n2p1参数:
-L LAB_DATA:把 XFS 文件系统标签设为LAB_DATA。
LABEL、PARTLABEL 和 UUID
| 名称 | 所属层次 | 说明 |
|---|---|---|
LABEL | 文件系统 | 人工设置的可读名称 |
UUID | 文件系统 | 创建文件系统时生成的唯一标识 |
PARTLABEL | GPT 分区表 | GPT 中的分区名称 |
PARTUUID | GPT 分区表 | GPT 分区的唯一标识 |
五、练习 4:临时挂载并验证读写
目标
把 /dev/nvme0n2p1 挂载到 /opt/storage_lab/mount_data,验证文件确实写入实验分区。
1. 挂载
mount /dev/nvme0n2p1 /opt/storage_lab/mount_data基本格式:
mount 文件系统所在设备 挂载目录挂载不是复制数据,而是把一个文件系统接入 Linux 的统一目录树。
2. 多角度验证
findmnt /opt/storage_lab/mount_data
lsblk -f
df -Th
三个命令的侧重点:
findmnt:确认目标路径当前真正由哪个设备提供,并查看挂载选项。lsblk -f:从设备树角度确认文件系统和挂载点。df -Th:查看已经挂载的文件系统容量。
3. 创建并读取测试文件
cd /opt/storage_lab/mount_data
touch mount_test.txt
echo "hello world" > mount_test.txt
ls -l
cat mount_test.txt
命令解释:
touch mount_test.txt:文件不存在时创建空文件。>:把标准输出覆盖写入文件。ls -l:查看文件属性。cat:读取文件内容。
此时:
路径:/opt/storage_lab/mount_data/mount_test.txt
数据:保存在 /dev/nvme0n2p1 的 XFS 中临时挂载的持久性
本次只执行了 mount,没有修改真实 /etc/fstab:
- 重启后挂载关系消失。
- 分区、XFS、标签、UUID 和文件数据仍保存在虚拟磁盘上。
- 下次重新挂载同一文件系统后,可以再次看到磁盘中的文件。
六、练习 5:处理 target is busy
目标
理解为什么文件系统正在使用时不能正常卸载,并使用只读排查命令找出占用者。
1. 复现问题
Shell 当前位于:
/opt/storage_lab/mount_data此时直接执行:
umount /opt/storage_lab/mount_data出现:
target is busy2. 查看占用者
fuser -vm /opt/storage_lab/mount_data
参数:
-v:详细显示。-m:把目标视为一个已挂载文件系统,列出正在使用它的进程。
截图中的 bash 表示当前 Shell 正把这个文件系统里的目录作为工作目录。
3. 正确处理
cd /
umount /opt/storage_lab/mount_data其他可能导致 busy 的情况:
- 另一个 Shell 的当前目录位于挂载点内。
- 某个程序打开了里面的文件。
- 程序正在写日志或访问该文件系统。
- 还有下级挂载点没有卸载。
规范做法是找出占用者并正常退出或关闭文件,不把 umount -l、umount -f 当作日常解决方案。
七、练习 6:理解挂载覆盖与当前目录引用
目标
观察把文件系统挂载到非空目录后,原目录内容发生什么变化。
1. 删除实验分区中的测试文件
当 /dev/nvme0n2p1 仍挂载在 mount_data 时执行了:
cd
ls /opt/storage_lab/mount_data
rm -rf /opt/storage_lab/mount_data/mount_test.txt
这里确实删除了实验分区中的 mount_test.txt。不过删除单个普通文件更规范的写法是:
rm /opt/storage_lab/mount_data/mount_test.txt-r 用于递归删除目录,-f 会跳过部分提示,对单个普通文件没有必要。
2. 准备被覆盖的目录
根文件系统中的目录:
/opt/storage_lab/cover_test里面预先存在:
host_file.txt将实验文件系统挂载到该目录:
mount /dev/nvme0n2p1 /opt/storage_lab/cover_test正常情况下,通过路径 /opt/storage_lab/cover_test 访问时,看到的是实验文件系统的根目录;原来的 host_file.txt 被暂时遮住,但没有被删除。卸载后它会重新出现。
3. 本次出现的特殊现象
实验时 Shell 在挂载发生前已经进入了 cover_test,随后从当前目录使用:
cat host_file.txt仍读到了原目录中的文件:

原因:
- Shell 在挂载前已经取得了底层目录对象的引用。
- 在另一个文件系统覆盖该路径后,这个 Shell 的当前工作目录引用并不会自动替换。
- 因此从旧的当前目录使用相对路径,仍可能访问被遮住的底层目录。
- 从
/重新使用绝对路径进入cover_test,才会经过新的挂载关系。
更清晰的演示方法:
cd /
mount /dev/nvme0n2p1 /opt/storage_lab/cover_test
ls -la /opt/storage_lab/cover_test
umount /opt/storage_lab/cover_test
ls -la /opt/storage_lab/cover_test结论:
- 挂载到非空目录不会删除原文件,只会暂时遮住。
- 卸载后原目录内容恢复可见。
- 观察挂载覆盖前最好先
cd /,避免当前目录旧引用干扰判断。
八、练习 7:只读和读写重挂载
目标
不卸载文件系统,把已有挂载从读写模式切换为只读模式,再恢复为读写模式。
1. 切换为只读
mount -o remount,ro /opt/storage_lab/cover_test
findmnt /opt/storage_lab/cover_test参数:
-o:指定挂载选项。remount:修改现有挂载的选项。ro:read-only,只读。
测试:
cat /opt/storage_lab/cover_test/mount_test.txt
touch /opt/storage_lab/cover_test/ro_test.txt
echo "new line" >> /opt/storage_lab/cover_test/mount_test.txt
结果:
- 读取已有文件成功。
- 创建新文件失败。
- 追加写入失败。
- 报错是
Read-only file system。
文件系统级只读状态对 root 同样有效,不能靠 root 身份正常绕过。
2. 恢复为读写
mount -o remount,rw /opt/storage_lab/cover_test
findmnt /opt/storage_lab/cover_test
touch /opt/storage_lab/cover_test/rw_test.txt
cd /
umount /opt/storage_lab/cover_testrw 表示 read-write。

findmnt 与 lsblk 的只读含义不同
findmnt的OPTIONS中出现ro或rw,表示这次挂载的模式。lsblk的RO=0表示底层块设备没有被整体标记为只读。
因此 RO=0 不等于当前文件系统一定以 rw 挂载。
九、练习 8:理解 df 与 du
目标
比较文件系统整体空间与指定目录中文件占用量。
1. 未挂载时查看路径
df -Th /opt/storage_lab/mount_data
du -sh /opt/storage_lab/mount_data
此时 mount_data 只是根文件系统中的普通目录,所以:
df显示/dev/mapper/rl-root。du显示该空目录自身几乎没有占用。
df 路径 显示的是“当前承载该路径的文件系统”,并不固定显示某个设备。
2. 挂载实验文件系统后再次查看
mount /dev/nvme0n2p1 /opt/storage_lab/mount_data
df -Th /opt/storage_lab/mount_data
du -sh /opt/storage_lab/mount_data
此时:
df显示/dev/nvme0n2p1,已用约 47M。du只显示约 4K。
新建 XFS 后即使目录中几乎没有普通文件,文件系统仍需要:
- 超级块和其他元数据
- allocation group 元数据
- XFS 内部日志
- inode 等结构
因此 df 的 47M 并不代表目录中有 47M 的普通文件。
3. 分配 200M 文件
cd /opt/storage_lab/mount_data
fallocate -l 200M /opt/storage_lab/mount_data/bigfile.bin
ls -lh
du -h bigfile.bin
du -sh /opt/storage_lab/mount_data
df -Th /opt/storage_lab/mount_data参数:
fallocate:为文件快速预分配磁盘空间。-l 200M:长度为 200MiB。ls -lh:显示文件的逻辑大小。du -h:显示文件实际占用的数据块。du -sh:汇总目录占用。

结果:
bigfile.bin的逻辑大小为 200M。du显示文件约占 200M。- 整个目录约占 201M。
df的文件系统已用空间从约 47M 增加到约 247M。
4. 删除并观察空间回收
本次输入了:
rm -rf /opt/storage_lab/mount_data/bigfile.bin更规范的命令是:
rm /opt/storage_lab/mount_data/bigfile.bin验证:
df -Th /opt/storage_lab/mount_data
du -sh /opt/storage_lab/mount_data
umount /opt/storage_lab/mount_data
df 与 du 总结
| 命令 | 数据来源 | 统计范围 |
|---|---|---|
df | 文件系统空间统计 | 整个文件系统,包含文件和元数据 |
du | 遍历目录树 | 从指定目录能访问到的文件数据块 |
补充:
ls -lh看文件逻辑大小。du -h看文件实际分配的数据块。- 本次
fallocate实际分配了空间;如果是稀疏文件,ls与du可能相差很大。
十、练习 9:创建、启用和关闭 swap
目标
把 /dev/nvme0n2p2 变成 1G swap,临时启用后再关闭,并保持系统原有 swap 不受影响。
1. 查看系统原有 swap
swapon --show
free -h
结果:
/dev/dm-1 partition 2G这是系统原有的 rl-swap,本实验不能关闭或重新初始化它。
2. 修改 p2 的 GPT 分区类型
fdisk /dev/nvme0n2需要使用:
t 修改分区类型
2 选择第二个分区
L 列出可用分区类型
q 退出类型列表分页器
19 在本机列表中选择 Linux swap
p 检查分区表
w 保存第一次问题:输入了 p
在提示:
Partition type or alias:输入 p 不是“打印分区表”,而是把 p 当成分区类型别名,所以结果是:
Type of partition 2 is unchanged: Linux filesystem
同一个字母在不同提示位置可能有不同含义,必须先看清当前提示。
第二次问题:在分页器中输入 19
输入 L 后类型列表由分页器显示。屏幕底部出现类似:
:19
这时的 19 被分页器当作搜索内容,没有传给 fdisk。随后类型仍然没有改变:

正确操作:
- 在类型列表中按
q。 - 等屏幕重新出现
Partition type or alias:。 - 再输入本机列表对应的
19,也可以尝试清晰的别名swap。 - 输入
p检查,再用w保存。
3. 验证分区类型
partprobe /dev/nvme0n2
fdisk -l /dev/nvme0n2
此时只完成了“分区表中的类型标记”,还没有真正的 swap 签名。
4. 写入 swap 签名和标签
mkswap -L LAB_SWAP /dev/nvme0n2p2
lsblk -f
blkid /dev/nvme0n2p2命令解释:
mkswap:在目标分区写入 swap 数据结构和签名。-L LAB_SWAP:设置 swap 标签。lsblk -f、blkid:验证FSTYPE=swap、标签和 UUID。

本次 swap UUID:
fb96146e-638a-4e3c-b9ce-b050975b89dfmkswap 和 mkfs 一样会覆盖目标设备上的原有签名,因此设备名必须准确。
5. 临时启用实验 swap
swapon /dev/nvme0n2p2
swapon --show
free -h
结果:
- 系统原有 swap:2G。
- 实验 swap:约 1G。
free -h中总 swap:约 3G。
swapon --show 中的 PRIO 是优先级,数值越大优先级越高。本次系统 swap 是 -2,实验 swap 是 -3,因此系统 swap 优先级更高。
6. 只关闭实验 swap
swapoff /dev/nvme0n2p2
swapon --show
free -h
结果:
/dev/nvme0n2p2不再活动。/dev/dm-1仍正常启用。- 总 swap 回到约 2G。
swapoff 只停止使用,不会擦除 LAB_SWAP 标签、UUID 或 swap 签名。
swap 的三个独立步骤
- 在 GPT 中把分区类型改成
Linux swap。 - 用
mkswap写入实际 swap 签名。 - 用
swapon激活。
前一步完成不代表后一步自动完成。
持久性
本次没有向真实 /etc/fstab 添加 swap 条目,因此:
- swap 签名会保留。
- 重启后
/dev/nvme0n2p2不会因本实验自动启用。
十一、练习 10:软链接与硬链接
目标
观察 inode、链接计数、写入效果、目标改名后的行为。
1. 创建两个链接
cd /opt/storage_lab/links
ln original.txt hard_link.txt
ln -s original.txt soft_link.txt
ls -li命令解释:
ln 源 新名称:创建硬链接。ln -s 目标 新名称:创建软链接。ls -li:显示 inode 编号和链接计数。

结果:
original.txt 与 hard_link.txt inode 相同
两者链接计数均为 2
soft_link.txt inode 不同软链接行显示:
soft_link.txt -> original.txt2. 通过硬链接写入
echo "hello world" >> hard_link.txt
cat original.txt
cat soft_link.txt
>> 表示追加,而不是覆盖。
original.txt 和 hard_link.txt 不是“一份原件、一份副本”,而是两个目录项共同指向同一个 inode,所以修改的是同一份数据。
3. 使用 readlink
readlink soft_link.txt
readlink hard_link.txt
cat hard_link.txt
结果:
readlink soft_link.txt输出original.txt,因为软链接保存目标路径。readlink hard_link.txt没有输出,因为硬链接只是普通目录项,不保存“目标路径”。
4. 重命名目标文件
mv original.txt test.txt
ls
cat hard_link.txt
cat soft_link.txt结果:
hard_link.txt仍能访问数据。soft_link.txt报No such file or directory,成为悬空链接。
恢复名称:
mv test.txt original.txt
readlink soft_link.txt
软链接保存的是路径字符串。路径暂时不存在时链接失效;路径重新出现后链接又能工作。
软硬链接对比
| 项目 | 硬链接 | 软链接 |
|---|---|---|
| inode | 与其他硬链接相同 | 有自己的 inode |
| 保存内容 | 直接指向同一 inode | 保存目标路径字符串 |
| 目标改名 | 仍有效 | 原路径不存在时失效 |
| 跨文件系统 | 不可以 | 可以 |
| 链接目录 | 通常不允许普通用户这样做 | 可以 |
十二、练习 11:验证硬链接不能跨文件系统
目标
从根文件系统中的源文件向 /dev/nvme0n2p1 中创建链接,比较硬链接和软链接。
源文件:
/opt/storage_lab/links/original.txt目标目录:
/opt/storage_lab/mount_data其中 mount_data 当时挂载的是 /dev/nvme0n2p1,所以源和目标属于两个不同文件系统。
1. 创建跨文件系统硬链接
ln /opt/storage_lab/links/original.txt \
/opt/storage_lab/mount_data/cross_hard.txt结果:
Invalid cross-device link2. 创建跨文件系统软链接
ln -s /opt/storage_lab/links/original.txt \
/opt/storage_lab/mount_data/cross_soft.txt
ls -li /opt/storage_lab/mount_data
readlink /opt/storage_lab/mount_data/cross_soft.txt
cat /opt/storage_lab/mount_data/cross_soft.txt
原理
inode 编号只在所属文件系统内部有意义。硬链接必须新增一个指向同一 inode 的目录项,因此不能跨越文件系统边界。
软链接只是保存路径字符串,所以可以从一个文件系统指向另一个文件系统。
十三、练习 12:安全练习 fstab
目标
理解 /etc/fstab 的六个字段和 UUID 挂载,但不修改真实 /etc/fstab,避免影响系统启动。
1. 查询挂载状态和 UUID
findmnt -S /dev/nvme0n2p1
blkid /dev/nvme0n2p1
findmnt -S 按源设备查询;当设备未挂载时没有结果是正常的。
本次 UUID:
d63071f7-13f7-4e86-a3a7-4d8fc7f544282. 创建独立的练习文件
文件:
/opt/storage_lab/notes/fstab.practice内容:
UUID=d63071f7-13f7-4e86-a3a7-4d8fc7f54428 /opt/storage_lab/mount_data xfs defaults,nofail 0 03. 让本次 mount 只读取练习文件
mount -a -T /opt/storage_lab/notes/fstab.practice
findmnt /opt/storage_lab/mount_data
lsblk -f
df -Th /opt/storage_lab/mount_data
参数:
-a:挂载配置文件中符合条件的全部条目。-T 文件:使用指定的替代 fstab 文件,而不是默认读取/etc/fstab。
验证后:
umount /opt/storage_lab/mount_data六个字段
| 字段 | 本次内容 | 含义 |
|---|---|---|
| 1 | UUID=... | 要挂载的文件系统 |
| 2 | /opt/storage_lab/mount_data | 挂载点 |
| 3 | xfs | 文件系统类型 |
| 4 | defaults,nofail | 挂载选项 |
| 5 | 0 | 不使用传统 dump 备份标志 |
| 6 | 0 | 不安排传统启动时 fsck 顺序 |
nofail 表示设备缺失时不把该条目作为必须成功的启动条件,但它不能修复写错的 UUID、文件系统类型或挂载点。
为什么本次方法安全
- 没有编辑真实
/etc/fstab。 mount -a -T只在本次命令中读取练习文件。- 系统启动不会自动读取
fstab.practice。 - 因此本题练习的是配置格式和验证方法,并没有实现永久挂载。
十四、练习 13:使用 parted 创建 GPT 分区
目标
在第二块实验盘 /dev/nvme0n3 上建立 GPT,并创建一个约 2GB 的分区,为 XFS quota 做准备。
1. 建立 GPT 分区表
parted /dev/nvme0n3 mklabel gpt
parted /dev/nvme0n3 print2. 创建分区
parted /dev/nvme0n3 mkpart primary 1 2G
parted /dev/nvme0n3 print
命令拆解:
/dev/nvme0n3:目标实验盘。mklabel gpt:创建 GPT 分区表。mkpart:创建分区。primary:在本次 GPT 下是分区名称,并不是 MBR 中受数量限制的“主分区”类别。1:起点约为十进制 1MB。2G:终点为十进制 2GB。
parted 的修改通常立即写入,不像 fdisk 那样最后统一输入 w。因此使用时要更加谨慎。
3. 使用 MiB 查看空闲空间
partprobe /dev/nvme0n3
parted /dev/nvme0n3 unit MiB print free
lsblk -o NAME,SIZE,TYPE,PTTYPE,FSTYPE,MOUNTPOINTS
结果:
磁盘总量:3072MiB
p1:约 1906MiB
剩余未分配:约 1165MiB
lsblk 显示 p1:1.9G为什么命令写 2G,结果不是 2GiB:
parted中这里的G按十进制 GB 处理。- 终点 2000MB 换算后约为 1907MiB。
- 扣除起点后,分区约为 1906MiB,也就是约 1.86GiB。
lsblk四舍五入显示为约 1.9G。
这不是错误。本次实验无需重做。
如果需要精确约 2GiB,可以明确使用 MiB 边界,例如:
parted /dev/nvme0n3 mkpart quota 1MiB 2049MiB本次未使用这条命令,它只是单位换算的补充示例。
开头约 0.98MiB 的空隙来自 GPT 元数据和分区对齐,不是空间异常。
十五、练习 14:XFS 用户磁盘配额
目标
在 /dev/nvme0n3p1 上创建 XFS,挂载时开启用户配额,并给 alice 设置:
- 软限制:50MiB
- 硬限制:60MiB
这一部分是根据 Rocky Linux 默认使用 XFS 补充的实操,xfs_quota 的具体语法属于扩展内容。
1. 创建带标签的 XFS
mkfs.xfs -L QUOTA_LAB /dev/nvme0n3p1
blkid /dev/nvme0n3p1
参数:
mkfs.xfs:创建 XFS。-L QUOTA_LAB:创建时直接设置文件系统标签。/dev/nvme0n3p1:目标是分区 p1,而不是整个nvme0n3。
结果中:
LABEL="QUOTA_LAB"
TYPE="xfs"
PARTLABEL="primary"其中:
QUOTA_LAB是 XFS 文件系统标签。primary是前面parted mkpart primary创建的 GPT 分区名称。- 它们属于不同层次。
2. 挂载时启用用户配额
mkdir -p /opt/storage_lab/quota_data
mount -o uquota /dev/nvme0n3p1 /opt/storage_lab/quota_data参数:
-o uquota:挂载 XFS 时开启用户配额统计和执行。uquota、usrquota在这里是同类用户配额选项;findmnt可能规范化显示成usrquota。
验证:
findmnt /opt/storage_lab/quota_data
xfs_quota -x -c 'state' /opt/storage_lab/quota_data
用户配额结果:
Accounting: ON
Enforcement: ON含义:
Accounting: ON:内核正在统计各用户的使用量。Enforcement: ON:达到限制时会真正执行限制。
组配额和项目配额显示 OFF 是正常的,因为本题只启用了用户配额。
状态还显示默认块宽限期为 7 天。
XFS 配额应在挂载时启用。如果已经在不带uquota的情况下挂载,稳妥做法是正常卸载后,再带uquota重新挂载,而不是假定可以随意通过 remount 开启。
3. 创建 Alice 的实验目录
mkdir -p /opt/storage_lab/quota_data/alice_data
chown alice:alice /opt/storage_lab/quota_data/alice_data
ls -ld /opt/storage_lab/quota_data/alice_data命令解释:
mkdir -p:创建目录;父目录不存在时一起创建,已存在时不因此报错。chown alice:alice:把属主和属组都设为alice。ls -ld:查看目录本身的详细属性,而不是列出目录内部内容。
chown 的作用只是让 Alice 有权限在该目录中写入。它不能代替 quota,也不决定 quota 的统计范围。
4. 设置 Alice 的软、硬限制
xfs_quota -x \
-c 'limit bsoft=50m bhard=60m alice' \
/opt/storage_lab/quota_data命令解释:
| 部分 | 含义 |
|---|---|
xfs_quota | XFS 配额管理工具 |
-x | 进入专家/管理模式 |
-c | 执行引号中的一条内部命令 |
limit | 设置限制 |
bsoft=50m | 块空间软限制为 50MiB |
bhard=60m | 块空间硬限制为 60MiB |
alice | 按 Alice 的 UID 设置 |
| 最后的路径 | 指定要管理的 XFS 挂载点 |
这里的 b 表示块空间容量。如果限制的是 inode,则针对的是文件数量。
5. 查看配额报表
xfs_quota -x -c 'report -h -u' /opt/storage_lab/quota_data参数:
report:显示配额报表。-h:以易读容量单位显示。-u:显示用户配额。

结果:
alice Used=0 Soft=50M Hard=60M说明配额限制已经保存成功。
截图中多行命令前的:
>是 Shell 的续行提示。因为上一行末尾写了反斜杠 \,Shell 正在等待剩余命令;> 不是要手动输入的字符,也不是重定向或错误。
软限制、硬限制和宽限期
- 软限制:可以短期超过;第一次超过后开始宽限期倒计时。
- 宽限期:本次状态显示默认 7 天。
- 硬限制:绝对上限,不能正常突破,没有额外宽限期。
- 使用量降回软限制以下后,宽限计时会清除。
配额的统计范围
用户配额按 UID 统计整个 /dev/nvme0n3p1 文件系统,不是只限制:
/opt/storage_lab/quota_data/alice_data如果 Alice 在这个 XFS 的其他目录中创建文件,同样会计入配额。alice_data 只是为了方便授权和测试。
本次完成程度
本次已经完成:
- 以
uquota挂载。 - 确认用户配额 Accounting、Enforcement 均为 ON。
- 为 Alice 设置 50M/60M 限制。
- 通过报表确认限制存在。
本次尚未实际以 Alice 创建大文件验证:
- 超过 50M 后的宽限期表现。
- 超过 60M 后的
Disk quota exceeded。
因此准确结论是“配额设置成功”,不能写成“已经验证硬限制拦截成功”。
十六、练习错误与纠正复盘
这一部分集中整理本次练习中出现的错误、误判和容易混淆的正常现象。复习时应重点看“为什么错”,而不只是记住最终命令。
错误 1:把 lsblk -f 理解成查看普通文件属性
当时的理解
认为:
lsblk -f 用于显示文件的属性和信息问题
lsblk 的操作对象是 block device(块设备)。这里的 -f 是 filesystem,不是普通文件。
正确理解
lsblk -f查看的是块设备上的:
- 文件系统类型
- 文件系统版本
- 标签
- UUID
- 可用空间
- 挂载点
普通文件的权限、属主、大小等应使用:
ls -l 文件
stat 文件错误 2:把 disk 直接说成“物理磁盘”
问题
lsblk 的 TYPE=disk 表示完整磁盘形态的块设备,但本实验中的设备是:
VMware Virtual NVMe Disk它们是虚拟磁盘,不是 Mac 中真实存在的三块 NVMe 硬盘。
正确表述
disk 表示完整块设备;本实验中是 VMware 提供的虚拟磁盘。错误 3:第一次创建分区时没有先建立 GPT
当时操作
进入空盘后直接输入 n 创建分区。
现象
fdisk 显示:
Created a new DOS disklabel
Disklabel type: dos
原因
空盘没有分区表,当前版本的 fdisk 自动准备了 DOS/MBR 分区表。创建出 p1、p2 并不代表分区表类型就是题目要求的 GPT。
正确操作
进入 fdisk 后先输入:
g看到:
Created a new GPT disklabel再使用 n 创建分区,最后 p 检查、w 保存。
复习判断
可使用:
fdisk -l /dev/nvme0n2
lsblk -o NAME,PTTYPE确认出现 gpt,不能只凭“已经有两个分区”判断成功。
错误 4:恢复快照后,误以为实验目录和文件也会保留
现象
恢复快照后发现:
/opt/storage_lab不存在或内容回到了旧状态。host_file.txt等准备文件不存在。- 两块后来添加的实验盘需要重新添加。
原因
快照恢复的是“创建快照时”的虚拟机状态。快照之后在系统盘中创建的目录、文件和部分虚拟硬件状态不会自动保留。
正确处理
恢复后先重新盘点:
lsblk
ls -la /opt
findmnt再按实际状态补建实验目录,不要假定前一次操作仍在。
错误 5:挂载点命名出现 mount_date 与 mount_data 混用
现象
早期命令使用了:
/opt/storage_lab/mount_date后续实验统一使用:
/opt/storage_lab/mount_data风险
Linux 路径必须完全匹配。一个字母不同就是两个不同目录,可能导致:
- 在一个目录挂载,却去另一个目录检查。
df显示了根文件系统而不是实验盘。- 误以为文件丢失或挂载失败。
规范做法
本次最终统一为:
/opt/storage_lab/mount_data每次操作后用下面的命令确认真实挂载关系:
findmnt /opt/storage_lab/mount_data错误 6:当前目录位于挂载点内时直接卸载
当时操作
Shell 提示符显示当前位于 mount_data,仍执行:
umount /opt/storage_lab/mount_data现象
target is busy
原因
Shell 的当前工作目录本身就是对该文件系统的使用。内核不能在进程仍引用它时完成正常卸载。
正确处理
先排查:
fuser -vm /opt/storage_lab/mount_data退出挂载点:
cd /
umount /opt/storage_lab/mount_data不要一遇到 busy 就使用强制或懒卸载。应先找出并解除占用。
错误 7:混淆“文件被删除”和“文件被挂载覆盖”
实际过程
mount_test.txt 当时位于已经挂载的 /dev/nvme0n2p1 中,随后执行:
rm -rf /opt/storage_lab/mount_data/mount_test.txt这条命令确实删除了实验分区中的文件。
之后把同一个文件系统挂载到 cover_test,不能再期待其中出现已经被删除的 mount_test.txt。
与挂载覆盖的区别
- 删除:目录项被移除,文件在该文件系统中不再存在。
- 挂载覆盖:挂载点原目录中的内容只是暂时不可见,卸载后重新出现。
正确判断方法
先确认设备当前挂载在哪里:
findmnt -S /dev/nvme0n2p1再通过该挂载点查看设备中的实际内容。
错误 8:在被覆盖目录中使用旧的当前工作目录,误判挂载结果
现象
Shell 在挂载前已经进入 cover_test。挂载完成后执行相对路径:
cat host_file.txt仍然读到了底层根文件系统中的 host_file.txt,于是看起来像是“挂载没有遮住文件”。

原因
Shell 在挂载前已经持有底层目录对象的引用。挂载改变了从父目录重新解析该路径时看到的内容,但不会自动替换进程已有的当前目录引用。
正确演示
挂载前先退出:
cd /
mount /dev/nvme0n2p1 /opt/storage_lab/cover_test
ls -la /opt/storage_lab/cover_test使用绝对路径重新解析时,看到的才是当前挂载文件系统。
错误 9:未挂载时对目录执行 df,把根文件系统当成实验盘
现象
df -Th /opt/storage_lab/mount_data输出:
/dev/mapper/rl-root
原因
此时 mount_data 只是 / 文件系统中的普通目录。df 路径 显示承载该路径的文件系统,所以显示根逻辑卷完全正常。
正确判断
先确认:
findmnt /opt/storage_lab/mount_data如果没有结果,说明它不是独立挂载点。挂载 p1 后再执行 df,才会显示 /dev/nvme0n2p1。
错误 10:删除普通文件时使用 rm -rf
当时操作
rm -rf /opt/storage_lab/mount_data/bigfile.bin问题
-r用于递归删除目录。-f会跳过部分提示并忽略不存在的目标。- 对普通文件不需要这两个选项。
虽然本次明确路径下删除成功,但这种习惯会扩大输错路径时的破坏范围。
规范写法
rm /opt/storage_lab/mount_data/bigfile.bin执行前可先确认:
ls -lh /opt/storage_lab/mount_data/bigfile.bin错误 11:认为 p2 “还没有做分区”
当时状态
lsblk 已显示:
nvme0n2p2 1G part所以 p2 已经是分区。它缺少的是 swap 类型和 swap 签名。
正确区分
| 状态 | 验证命令 |
|---|---|
| 是否存在分区 | lsblk、fdisk -l |
| GPT 分区类型 | fdisk -l |
| 是否有 swap 签名 | lsblk -f、blkid |
| 是否已经启用 | swapon --show |
错误 12:在 fdisk 的“分区类型”提示中输入 p
现象
Partition type or alias: p
Type of partition 2 is unchanged: Linux filesystem
原因
p 只有在 fdisk 主菜单中才表示打印分区表。当前提示正在等待“类型编号或别名”,所以 p 被当成了无效或不匹配的类型输入。
正确做法
先看当前提示。回到主菜单后:
t → 选择 p2 → 输入 Linux swap 的编号或别名错误 13:在分区类型列表的分页器中输入 19
现象
输入 L 后看到很长的类型列表,在页面底部直接输入 19,屏幕出现:
:19
退出后检查,类型仍是 Linux filesystem。
原因
当时仍在分页器中,键盘输入由分页器处理,不是由 fdisk 的类型提示处理。
正确做法
- 按
q退出分页器。 确认重新看到:
Partition type or alias:- 再输入本机列表对应的
19或可用别名。 - 用
p检查,并用w保存。
错误 14:把“Linux swap 分区类型”当成已经可用的 swap
问题
分区表显示 Linux swap 只是 GPT 元数据。它不能替代真正的 swap 签名和启用动作。
完整流程
fdisk t → 修改 GPT 分区类型
mkswap → 写入 swap 签名
swapon → 激活
swapon --show → 验证活动状态每一步观察的是不同层次。
错误 15:没有先区分硬链接和软链接的跨文件系统能力
现象
尝试从根文件系统向挂载的 XFS 创建硬链接:
Invalid cross-device link
原因
硬链接需要指向同一个 inode,而 inode 只在各自文件系统内部有意义。
正确结论
- 硬链接不能跨文件系统。
- 软链接保存目标路径,可以跨文件系统。
- 这里的报错正是实验预期,不是磁盘损坏或权限问题。
易误判 16:findmnt -S 没有输出
现象
findmnt -S /dev/nvme0n2p1没有输出。
正确解释
-S 是按挂载源查询。设备当时没有挂载,所以没有匹配结果是正常现象,不代表设备不存在。
设备是否存在应使用:
lsblk
blkid /dev/nvme0n2p1易误判 17:parted 创建“2G”后 lsblk 只显示 1.9G
现象
parted /dev/nvme0n3 mkpart primary 1 2G结果约为:
1906MiB
lsblk:1.9G正确解释
这里的 G 使用十进制边界,2GB 不等于 2GiB。换算后约为 1.86GiB,显示 1.9G 是正常的。
如果题目要求精确二进制容量,应明确使用 MiB 或 GiB 边界。
易误判 18:findmnt 显示 usrquota,而命令输入的是 uquota
现象
挂载命令:
mount -o uquota ...findmnt 却显示:
usrquota正确解释
这是工具对同类用户配额选项的规范化显示,不是选项失效。随后:
Accounting: ON
Enforcement: ON已经证明用户配额正常启用。
教学补充 19:xfs_quota 命令没有出现在原笔记中
这一点不是用户漏记,也不是应当自行猜出的命令。它是根据 Rocky Linux 的 XFS 环境补充的扩展实操。
需要掌握的最小主线:
mount -o uquota
↓
xfs_quota ... state
↓
xfs_quota ... limit
↓
xfs_quota ... report其中:
-x是管理模式。-c执行一条内部命令。bsoft、bhard分别设置块空间软、硬限制。
截图中的 > 是反斜杠续行造成的 Shell 提示,不是需要输入的字符。
错误复盘总表
| 现象 | 根本原因 | 以后如何检查 |
|---|---|---|
| 建成两个分区却不是 GPT | 空盘上直接 n,默认得到 DOS disklabel | 看 fdisk -l 的 Disklabel type |
umount: target is busy | 当前 Shell 或其他进程仍在使用挂载点 | fuser -vm,再退出目录 |
| 挂载后仍看到底层文件 | Shell 保留了挂载前当前目录引用 | cd / 后用绝对路径重新访问 |
df 显示根逻辑卷 | 目标目录当时没有挂载实验盘 | 先执行 findmnt 目录 |
| p2 被说成“未分区” | 混淆分区、签名、启用三个层次 | 分别用 lsblk、blkid、swapon |
| swap 类型没有变化 | 在错误提示位置输入 p | 看清 Partition type or alias |
| 输入 19 后仍没变化 | 19 输入给了分页器 | 先按 q 回到 fdisk 提示 |
| 硬链接跨盘失败 | inode 不能跨文件系统 | 使用软链接或复制文件 |
2G 最终显示 1.9G | 十进制 GB 与二进制 GiB 不同 | parted ... unit MiB print free |
uquota 显示为 usrquota | 挂载选项被规范化显示 | 看 xfs_quota state 是否 ON |
十七、实验后的设备状态
/dev/nvme0n1 20G 系统盘,全程未修改
├── nvme0n1p1 vfat → /boot/efi
├── nvme0n1p2 xfs → /boot
└── nvme0n1p3 LVM2_member
├── rl-root xfs → /
└── rl-swap swap → 系统原有 swap
/dev/nvme0n2 5G,GPT 实验盘
├── nvme0n2p1 2G XFS,LABEL=LAB_DATA
├── nvme0n2p2 1G swap,LABEL=LAB_SWAP,目前已 swapoff
└── 约 2G 未分配
/dev/nvme0n3 3G,GPT 实验盘
├── nvme0n3p1 约 1.9G XFS,LABEL=QUOTA_LAB
│ 当前挂载到 /opt/storage_lab/quota_data
│ 用户配额已启用
└── 约 1165MiB 未分配十八、重启后哪些内容会保留
| 内容 | 是否保留 |
|---|---|
| GPT 分区表和分区 | 保留 |
| XFS 文件系统 | 保留 |
| 文件系统标签、UUID | 保留 |
| 分区中的普通文件 | 保留 |
mkswap 写入的 swap 签名 | 保留 |
swapoff 后的 LAB_SWAP 签名 | 仍保留 |
| Alice 的 XFS quota 限制元数据 | 保留在该 XFS 中 |
手动 mount 建立的挂载关系 | 不保留 |
手动 swapon 的活动状态 | 不因本实验自动恢复 |
fstab.practice 文件 | 文件保留,但启动过程不会读取 |
uquota 的当前挂载状态 | 不保留 |
由于真实 /etc/fstab 没有被修改,重启后若继续 quota 实验,应重新使用:
mount -o uquota /dev/nvme0n3p1 /opt/storage_lab/quota_data十九、命令与参数速查
块设备和文件系统
| 命令 | 作用 |
|---|---|
lsblk | 查看块设备树、分区、LVM 和挂载点 |
lsblk -f | 查看文件系统类型、标签、UUID |
lsblk -o ... | 自定义输出字段 |
blkid | 查看设备签名、标签、UUID、PARTUUID |
df -Th | 查看已挂载文件系统类型和空间 |
du -sh 路径 | 汇总指定目录实际占用的数据块 |
分区
| 命令或参数 | 作用 |
|---|---|
fdisk 设备 | 交互式管理分区 |
g | 在 fdisk 中创建 GPT |
n | 创建分区 |
t | 修改分区类型 |
p | 在主菜单中打印分区表 |
w | 写入并退出 |
q | 不保存退出,或退出分页器 |
parted 设备 mklabel gpt | 使用 parted 创建 GPT |
parted 设备 print | 查看分区表 |
parted 设备 unit MiB print free | 以 MiB 查看分区和空闲空间 |
partprobe 设备 | 通知内核重新读取分区表 |
文件系统与挂载
| 命令或参数 | 作用 |
|---|---|
mkfs.xfs 分区 | 创建 XFS 文件系统 |
mkfs.xfs -L 标签 分区 | 创建 XFS 并设置标签 |
xfs_admin -L 标签 分区 | 修改 XFS 标签 |
mount 设备 目录 | 临时挂载 |
mount -o remount,ro 目录 | 重挂载为只读 |
mount -o remount,rw 目录 | 重挂载为读写 |
findmnt 路径 | 查看实际挂载源、类型和选项 |
fuser -vm 路径 | 查找占用挂载文件系统的进程 |
umount 路径 | 正常卸载 |
swap
| 命令 | 作用 |
|---|---|
mkswap -L 标签 分区 | 写入 swap 签名并设置标签 |
swapon 分区 | 启用指定 swap |
swapon --show | 列出活动 swap |
swapoff 分区 | 关闭指定 swap |
free -h | 查看内存和总 swap |
链接和空间
| 命令 | 作用 |
|---|---|
ln 源 新名称 | 创建硬链接 |
ln -s 目标 新名称 | 创建软链接 |
ls -li | 查看 inode 和链接计数 |
readlink 软链接 | 输出软链接中保存的目标路径 |
fallocate -l 200M 文件 | 预分配 200MiB 文件 |
XFS 配额
| 命令或参数 | 作用 |
|---|---|
mount -o uquota ... | 挂载时启用 XFS 用户配额 |
xfs_quota -x -c 'state' 挂载点 | 查看配额状态 |
limit bsoft=... bhard=... 用户 | 设置用户块空间软、硬限制 |
report -h -u | 以易读单位显示用户配额报表 |
二十、本次练习的核心结论
- 系统盘应根据
/、/boot、/boot/efi等挂载关系判断,不能只看设备编号。 - 磁盘、分区、文件系统、挂载点是不同层次。
lsblk -f查看文件系统属性,不是普通文件属性。- GPT 和 MBR 是分区表格式,不是文件系统。
fdisk通常到w才保存;parted操作通常立即生效。mkfs、mkswap都会覆盖目标设备上的原有签名,必须先确认设备名。- 文件系统标签
LABEL与 GPT 分区名称PARTLABEL不属于同一层次。 - 挂载是把文件系统接入目录树,不会把数据复制进挂载目录。
- 挂载到非空目录只会遮住原内容,卸载后原内容重新可见。
- Shell 当前目录位于挂载点内,可能导致
umount: target is busy。 - 文件系统只读时报
Read-only file system,与普通权限不足不同。 df统计整个文件系统,du统计指定目录树中的数据块。- swap 分区类型、swap 签名和 swap 激活是三个独立步骤。
swapoff停止使用 swap,但不会清除签名和标签。- 硬链接共享 inode,不能跨文件系统。
- 软链接保存目标路径,可以跨文件系统。
- 安全 fstab 练习使用
mount -a -T读取独立文件,没有实现永久挂载。 parted中十进制2G换算后不是精确 2GiB。- XFS 用户配额要在挂载时使用
uquota/usrquota启用。 - 用户配额按 UID 统计整个文件系统,而不是只统计某个目录。
- 软限制允许在宽限期内暂时超过,硬限制是不可正常突破的绝对上限。