Linux 磁盘管理实战 — 从分区到挂载全流程 / Practical Linux Disk Management from Partitioning to Mounting
📅 创建时间:2026-06-17 🏷️ 标签:#Linux #磁盘管理 #fdisk #mkfs #实战 📚 前置知识:[[03-partition-table]], [[09-linux-mount]], [[08-linux-fhs]]
📋 本章目标
- 完整演练:从一块空磁盘到可读写文件的全流程
- 掌握
lsblk— 查看磁盘拓扑 - 掌握
fdisk/gdisk— 创建 GPT/MBR 分区 - 掌握
mkfs— 格式化分区为各种文件系统 - 掌握
mount/umount— 挂载与卸载 - 掌握
blkid— 查看 UUID 和文件系统类型 - 掌握
/etc/fstab编写 —— 实现开机自动挂载 - 理解
df/du— 检查磁盘使用量 - 掌握
wipefs— 清除旧文件系统签名 - 学会常见错误的排查
第1部分:快速演练 — 完整流程速览
┌─────────────────────────────────────────────────────────────┐
│ 从空磁盘到可读写 — 五个步骤 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 查看 │
│ $ lsblk ← 看磁盘叫什么名字 │
│ $ sudo fdisk -l ← 看分区表情况 │
│ │
│ Step 2: 分区 │
│ $ sudo fdisk /dev/sdb ← 创建 GPT 分区表 + 分区 │
│ │
│ Step 3: 格式化 │
│ $ sudo mkfs.ext4 /dev/sdb1 ← 格式化为 ext4 │
│ 或 │
│ $ sudo mkfs.btrfs /dev/sdb1 ← 格式化为 btrfs │
│ 或 │
│ $ sudo mkfs.vfat -F32 /dev/sdb1 ← 格式化为 FAT32 │
│ │
│ Step 4: 挂载 │
│ $ sudo mkdir -p /mnt/data │
│ $ sudo mount /dev/sdb1 /mnt/data │
│ │
│ Step 5: 写入 fstab (可选,实现开机自动挂载) │
│ $ sudo blkid /dev/sdb1 ← 获取 UUID │
│ $ sudo vim /etc/fstab ← 添加一行 │
│ UUID=xxx-xxx /mnt/data ext4 defaults 0 2 │
│ │
│ Step 6: 验证 │
│ $ df -h ← 检查是否挂载成功 │
│ $ mount | grep sdb1 ← 另一种方式检查 │
│ $ echo "test" | sudo tee /mnt/data/test.txt ← 写文件测试 │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
第2部分:lsblk — 看懂磁盘拓扑
2.1 lsblk 输出逐字段解释
┌─────────────────────────────────────────────────────────────┐
│ lsblk 输出逐列解读 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $ lsblk -o NAME,MAJ:MIN,RM,SIZE,RO,TYPE,MOUNTPOINTS,FSTYPE│
│ │
│ NAME 设备名 │
│ ┌─────────────────────────────────────┐ │
│ │ nvme0n1 nvme = NVMe 协议 │ │
│ │ 0 = 控制器编号 │ │
│ │ n1 = namespace 1 │ │
│ │ │ │
│ │ sda sd = SCSI/SATA 设备 │ │
│ │ a = 第一块 │ │
│ │ │ │
│ │ mmcblk0 mmcblk = eMMC/SD 卡 │ │
│ │ 0 = 第一块 │ │
│ └─────────────────────────────────────┘ │
│ │
│ MAJ:MIN 设备号 (major=驱动类型, minor=具体设备) │
│ 259:0 → NVMe 驱动, 设备 0 │
│ 8:0 → SCSI 块设备驱动, 设备 0 │
│ │
│ RM 可移动标志 (Removable) │
│ 0 = 内置磁盘 (不可移除) │
│ 1 = U 盘 / 外置硬盘 (可移除) │
│ │
│ SIZE 容量 (人类可读) │
│ K=KB, M=MB, G=GB, T=TB │
│ │
│ RO 只读标志 │
│ 0 = 可读写 │
│ 1 = 只读 (SD 卡的写保护锁 / 故障磁盘) │
│ │
│ TYPE 类型 │
│ disk = 物理磁盘 │
│ part = 分区 │
│ rom = 光盘 │
│ loop = loop 设备 (回环设备, 如挂载 ISO) │
│ │
│ FSTYPE 文件系统类型 (需 root 或用 -f 参数) │
│ ext4, btrfs, vfat, ntfs, swap, crypto_LUKS... │
│ │
│ MOUNTPOINTS 挂载点 │
│ /boot, /, /home, [SWAP] │
│ │
│ 实用选项: │
│ lsblk -f 显示文件系统信息 (包括 UUID) │
│ lsblk -o +UUID 追加 UUID 列 │
│ lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,UUID │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
第3部分:fdisk — 分区操作详解
3.1 fdisk 交互式操作录播
┌─────────────────────────────────────────────────────────────┐
│ fdisk 创建 GPT 分区的完整对话 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $ sudo fdisk /dev/sdb │
│ │
│ 进入 fdisk 后只需记住 6 个命令: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ g 创建 GPT 分区表 (或 o 创建 MBR) │ │
│ │ n 新分区 │ │
│ │ d 删除分区 │ │
│ │ p 打印当前分区表 │ │
│ │ t 修改分区类型 │ │
│ │ w 写入并退出 (q = 放弃修改退出) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 实际操作: │
│ Command (m for help): g ← 创建 GPT 分区表 │
│ Created a new GPT disklabel. │
│ │
│ Command: n ← 创建第一个分区 │
│ Partition number (1-128): 1 ← 分区号 1 │
│ First sector (2048-xxx): 2048 ← 按回车, 用默认 2048 │
│ Last sector: +512M ← 512MB 大小 (ESP 分区) │
│ Created a new partition 1 of type 'Linux filesystem'. │
│ │
│ Command: t ← 修改分区类型 │
│ Partition type: 1 ← 选分区 1 │
│ Type: uefi ← 设为 EFI System │
│ (或输入类型编号: GPT 下是序号, MBR 下是十六进制代码) │
│ │
│ Command: n ← 创建第二个分区 │
│ Partition number: 2 │
│ First sector: <default> ← 按回车 │
│ Last sector: <default> ← 剩余全部空间 │
│ │
│ Command: p ← 检查一下 │
│ Number Start End Size Type │
│ 1 2048 xxxxx 512M EFI System │
│ 2 xxxxx yyyyy xxxG Linux filesystem │
│ │
│ Command: w ← 写入分区表! │
│ The partition table has been altered. │
│ │
│ 关键认知: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 在按 w 之前, 所有操作只影响内存中的分区表副本 │ │
│ │ 如果搞错了 → 按 q 退出, 磁盘上的分区表不变 │ │
│ │ w 写入后, 旧的 MBR/GPT 被覆盖 → 数据没丢, 但分区记录改了 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 分区类型对照 (常见): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ fdisk 内代码 MBR 类型号 含义 │ │
│ │ uefi (GPT专有) EFI System Partition │ │
│ │ linux (GPT专有) Linux filesystem │ │
│ │ swap (GPT专有) Linux swap │ │
│ │ windows (GPT专有) Microsoft basic data │ │
│ │ │ │
│ │ MBR: 83=Linux 82=swap 7=NTFS 0C=FAT32(LBA) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
3.2 非交互式分区 — 脚本化
# 用 parted 实现非交互分区
sudo parted /dev/sdb --script \
mklabel gpt \
mkpart ESP fat32 1MiB 513MiB \
set 1 esp on \
mkpart root btrfs 513MiB 100%
# 用 sfdisk 转储和恢复分区表
sudo sfdisk -d /dev/nvme0n1 > partition-backup.txt # 备份
sudo sfdisk /dev/sdb < partition-backup.txt # 恢复到另一块盘2
3
4
5
6
7
8
9
10
第4部分:mkfs — 创建文件系统
4.1 格式化命令速查
┌─────────────────────────────────────────────────────────────┐
│ mkfs 命令族一览 │
├─────────────────────────────────────────────────────────────┤
│ │
│ # Ext4 — Linux 最稳的选择 │
│ sudo mkfs.ext4 /dev/sdb1 │
│ # 常用选项: -L "标签名" -m 0 (不给 root 预留 5% 空间) │
│ │
│ # Btrfs — 新一代 COW 文件系统 │
│ sudo mkfs.btrfs /dev/sdb1 │
│ # 常用选项: -L "标签名" -f (强制, 覆盖已有文件系统) │
│ │
│ # FAT32 — ESP / 跨平台兼容 │
│ sudo mkfs.vfat -F32 /dev/sdb1 │
│ # -F32 = FAT32 -F16 = FAT16 -F12 = FAT12 │
│ │
│ # exFAT — U 盘 / 大文件跨平台 │
│ sudo mkfs.exfat /dev/sdb1 │
│ │
│ # NTFS — 与 Windows 共享数据分区 │
│ sudo mkfs.ntfs /dev/sdb1 │
│ # 或 sudo mkntfs /dev/sdb1 │
│ │
│ # Swap — 交换空间 │
│ sudo mkswap /dev/sdb2 │
│ sudo swapon /dev/sdb2 │
│ │
│ ⚠️ mkfs 会删除分区上的所有数据! │
│ 格式化前请确保分区是正确的! │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
4.2 wipefs — 清除旧的脏东西
┌─────────────────────────────────────────────────────────────┐
│ wipefs — 为什么有时候 mkfs 报错 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景: 你删了旧分区, 建了新分区, 然后 mkfs 报错: │
│ "Device contains existing filesystem signature" │
│ │
│ 原因: 分区表被改了, 但超级块/魔数还在磁盘上! │
│ │
│ 解决: │
│ $ sudo wipefs -a /dev/sdb1 ← 清除所有签名 │
│ $ sudo mkfs.ext4 /dev/sdb1 ← 现在可以格式化了 │
│ │
│ 查看有什么签名: │
│ $ sudo wipefs /dev/sdb1 ← 不加 -a, 只查看不删除 │
│ │
│ 为什么会出现这种情况: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 旧分区: LBA 2048 ~ LBA 1000000 → ext4 超级块在 LBA 2048│ │
│ │ 新分区: LBA 4098 ~ LBA 1000000 → 起点偏移了! │ │
│ │ mkfs 在 LBA 4098 写入新超级块 │ │
│ │ 但 LBA 2048 还有旧超级块 → mkfs 检测到冲突 → 报错 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
第5部分:挂载与验证
5.1 df 查看已挂载的文件系统
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p3 460G 86G 374G 19% /
/dev/nvme0n1p1 511M 78M 433M 16% /boot
# df 是日常最常用的磁盘工具
# -h = 人类可读 (K/M/G/T)
# -i = 显示 inode 使用情况 (df -i)
# -T = 显示文件系统类型 (df -T)2
3
4
5
6
7
8
9
5.2 du 查看目录占用
# 查看当前目录大小
$ du -sh .
# 哪个子目录最占空间?
$ du -sh * | sort -h | tail -5
# du 和 df 的差异:
# ┌─────────────────────────────────────────────────────┐
# │ du = 遍历目录树, 统计文件占用的数据块 │
# │ df = 查询超级块, 看文件系统级别的空间统计 │
# │ │
# │ 为什么两者可能不一致? │
# │ 1. 文件被删除但进程还持有句柄 → df 显示占用, du 看不到│
# │ 2. 文件系统元数据 (inode/超级块) 占的空间 → du 不算 │
# │ 3. btrfs COW 快照 → 旧版本数据 df 算, du 不重复算 │
# └─────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
5.3 mount 的常见错误
┌─────────────────────────────────────────────────────────────┐
│ mount 报错排查 │
├─────────────────────────────────────────────────────────────┤
│ │
│ "mount: /mnt/data: unknown filesystem type 'xxx'" │
│ → 内核没有这个文件系统的驱动 │
│ → 安装相应的包: sudo pacman -S ntfs-3g (NTFS) │
│ │
│ "mount: /mnt/data: wrong fs type, bad option..." │
│ → 1. 文件系统类型指定错了 │
│ → 2. 挂载选项不兼容 (如对 ext4 用了 compress) │
│ → 用 blkid 确认实际文件系统类型 │
│ │
│ "mount: /mnt/data: mount point does not exist" │
│ → 挂载点目录不存在: mkdir -p /mnt/data │
│ │
│ "mount: /mnt/data: special device /dev/sdb1 does not exist"│
│ → 设备文件不存在: lsblk 确认设备名 │
│ │
│ "mount: /mnt/data: /dev/sdb1 already mounted" │
│ → 已经挂载了: mount | grep sdb1 检查 │
│ │
│ "target is busy" (umount 报错) │
│ → 有进程在使用这个目录 (cd 进去了 / 有文件打开) │
│ → lsof | grep /mnt/data → 找到并结束进程 → umount │
│ → 或 umount -l /mnt/data (lazy, 等没人用了再卸) │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
第6部分:完整实战流程 — Arch 安装的磁盘部分回放
┌─────────────────────────────────────────────────────────────┐
│ Arch 安装时的磁盘操作完整回放 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 你可以把这当作 Arch 安装的磁盘部分"演练脚本" │
│ │
│ # 1. 查看磁盘 │
│ lsblk │
│ # 找到你的 NVMe SSD: nvme0n1 │
│ │
│ # 2. 创建分区表 + 分区 │
│ sudo fdisk /dev/nvme0n1 │
│ # g (GPT) │
│ # n → 1 → 2048 → +512M → t → 1 → uefi (ESP) │
│ # n → 2 → Enter → +16G → t → 2 → swap (交换空间) │
│ # n → 3 → Enter → Enter → 剩余全部 (根分区) │
│ # w │
│ │
│ # 3. 验证分区 │
│ lsblk /dev/nvme0n1 │
│ # nvme0n1p1 (512M) nvme0n1p2 (16G) nvme0n1p3 (剩余) │
│ │
│ # 4. 格式化 │
│ sudo mkfs.vfat -F32 /dev/nvme0n1p1 # ESP: FAT32 │
│ sudo mkswap /dev/nvme0n1p2 # Swap │
│ sudo mkfs.btrfs /dev/nvme0n1p3 # 根: btrfs │
│ │
│ # 5. 创建 btrfs subvolume (可选, 你实际做了) │
│ sudo mount /dev/nvme0n1p3 /mnt │
│ sudo btrfs subvolume create /mnt/@ │
│ sudo btrfs subvolume create /mnt/@home │
│ sudo umount /mnt │
│ │
│ # 6. 挂载 │
│ sudo mount -o subvol=@ /dev/nvme0n1p3 /mnt │
│ sudo mkdir -p /mnt/{boot,home} │
│ sudo mount /dev/nvme0n1p1 /mnt/boot │
│ sudo mount -o subvol=@home /dev/nvme0n1p3 /mnt/home │
│ sudo swapon /dev/nvme0n1p2 │
│ │
│ # 7. 生成 fstab (由 arch-install-scripts 自动) │
│ genfstab -U /mnt >> /mnt/etc/fstab │
│ # -U = 用 UUID 而不是设备名 │
│ │
│ # 8. 检查 fstab │
│ cat /mnt/etc/fstab │
│ # 确认每行的 UUID 和挂载点都正确 │
│ │
│ 至此磁盘操作完成, 可以继续 arch-chroot 安装系统了 │
│ │
└─────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
核心总结
总结1:五个命令的职责分工
lsblk → 看磁盘有什么 (只读, 安全)
fdisk → 告诉磁盘怎么切 (改分区表, 不丢数据)
mkfs → 在分区里建文件系统 (会格式化, 丢数据!)
mount → 让文件系统可用 (嫁接, 不修改数据)
fstab → 让 mount 在开机时自动执行2
3
4
5
总结2:fdisk 六个关键命令
g → GPT n → 新分区 d → 删分区
p → 查看 t → 改类型 w → 写入
q → 放弃退出 (没按 w 之前都不怕)2
3
总结3:Arch 安装的挂载顺序
必须先挂 / → 才能挂 /boot, /home (它们在 / 的目录树下)
genfstab -U 自动生成 fstab → UUID 稳定不怕设备名变化2
章节测试
测试1:查看磁盘
你的系统中有一个 1TB HDD 和一个 512GB NVMe SSD。运行 lsblk,你预期看到几个 TYPE="disk" 的条目?
测试2:fdisk 安全
在 fdisk 中做了错误的分区操作但还没按 w。你应该按什么键退出?磁盘上的数据会受影响吗?
测试3:mkfs vs wipefs
你删了旧分区、建了新分区,但 mkfs.ext4 报错 "existing filesystem"。原因是什么?怎么解决?
测试4:fstab 验证
你编辑好了 /etc/fstab,在重启之前如何验证配置是否正确?
测试5:du vs df
df -h 显示 100G 占用,du -sh / 显示 95G。5GB 的差距可能来自哪里?
参考答案
测试1答案
至少 2 个。加上可能的 U 盘、loop 设备(如 snap/flatpak 镜像),实际会更多。lsblk -d 只显示 disk 类型,过滤掉分区。
测试2答案
按 q(quit without saving)。所有操作只影响了内存中的分区表副本,磁盘上的数据完全不受影响。只有按 w 才会实际写入分区表到磁盘。
测试3答案
旧分区的文件系统超级块/魔数仍在磁盘上。虽然分区表被更新了,但磁盘 LBA 上仍然残留旧文件系统的签名。解决:sudo wipefs -a /dev/sdb1 清除所有签名,然后 mkfs。
测试4答案
sudo mount -a 会读取 /etc/fstab 并尝试挂载所有未挂载的条目。如果 mount -a 成功且 df -h 显示预期结果,fstab 配置正确。如果有错误,会在终端直接显示。注意:已挂载的不会重复挂载(除非显式 remount)。
测试5答案
可能原因:1) 被删除但进程仍持有句柄的大文件(lsof +L1 查找),2) 文件系统元数据(inode/超级块/bitmap)占用的空间 du 不计算,3) btrfs COW 快照占用的空间 du 看不到,4) du 权限不够跳过了部分目录。
相关笔记
- [[03-partition-table]] - fdisk 创建的 GPT 底层结构
- [[04-filesystem-concepts]] - mkfs 创建的文件系统内部结构
- [[09-linux-mount]] - mount 和 fstab 的完整原理
- [[13-btrfs-deep-dive]] - subvolume 和快照操作
下一步学习
- [ ] 阅读 11 - Windows 磁盘与文件系统
学习状态:🟡 开始学习