跳转至

15 - 磁盘与文件系统管理(fdisk、parted、ext4/xfs/btrfs)

前提条件

  • 已完成第二阶段前置安全加固(SSH、fail2ban、AppArmor、nftables/ufw、端口扫描)
  • 以 root 身份登录,或 ops 用户执行 sudo -i 切换至 root 环境
  • 系统运行在 Debian 12 Bookworm(虚拟机至少 2 块虚拟磁盘:系统盘 + 数据盘)
  • VMware Workstation Pro:建议添加第二块虚拟硬盘(SCSI 控制器,≥ 40 GB)用于练习

全局参数

主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops

详细步骤

1. 查看当前磁盘与分区状态

lsblk -f               # 推荐:树形显示磁盘、分区、文件系统、挂载点
fdisk -l               # 列出所有磁盘与分区表(含容量、类型)
parted -l              # 显示分区表类型(gpt/msdos)与扇区信息
df -hT                 # 已挂载文件系统使用情况(含文件系统类型)

2. 在 VMware 中添加新虚拟磁盘

  1. 虚拟机关机 → VM → Settings → Hardware → Add → Hard Disk
  2. 新建虚拟磁盘:≥ 40 GB,SCSI 控制器
  3. 启动虚拟机后确认新磁盘已被内核识别:
lsblk
# 新磁盘通常出现为 /dev/sdb(无分区标记)

3. 使用 fdisk 创建分区(MBR,适合 < 2 TB 磁盘)

fdisk /dev/sdb

交互操作流程:

按键 操作 说明
n 新建分区
p 主分区
1 分区号 1
Enter 默认起始扇区
Enter 默认结束扇区(全盘)
t 更改类型 83 = Linux,8e = LVM
w 写入分区表并退出

验证分区并通知内核:

fdisk -l /dev/sdb
partprobe /dev/sdb

4. 使用 parted 创建 GPT 分区(推荐 > 2 TB 或现代系统)

一步命令行方式(生产推荐,可脚本化):

parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary xfs 1MiB 100%
partprobe /dev/sdb

对齐说明

起始位置使用 1MiB(而非 0),确保 4K 扇区物理对齐,避免虚拟机和 SSD 上的性能惩罚。

5. 创建并格式化文件系统

三种常见文件系统对比:

文件系统 核心优势 主要限制 推荐场景
ext4 稳定、兼容性最佳、支持缩小 大文件并发性能一般 系统盘、通用数据盘
xfs 高并发、大文件、在线扩容 不支持缩小 数据库、日志、媒体文件
btrfs 子卷、快照、内置压缩/RAID 生产稳定性需充分验证 需要快照的开发/测试环境

格式化命令(推荐数据盘使用 xfs):

mkfs.xfs -f -L data /dev/sdb1

检查点

lsblk -f /dev/sdb 输出 FSTYPE 列显示 xfsLABEL 列显示 data

6. 挂载与持久化

创建挂载点并临时挂载:

mkdir /data
mount /dev/sdb1 /data
df -h /data

获取 UUID 并写入 fstab:

blkid /dev/sdb1
# 输出示例:UUID="a1b2c3d4-..." TYPE="xfs" LABEL="data"

vim /etc/fstab

添加行(使用 UUID,比设备名更稳定):

UUID=a1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx   /data   xfs   defaults,noatime   0 2

fstab 字段说明

字段 示例值 说明
设备 UUID=... 优先用 UUID,防止设备名漂移
挂载点 /data 目录须已存在
文件系统类型 xfs 与格式化时一致
挂载选项 defaults,noatime noatime 减少不必要的 inode 写入
dump 0 0 = 不备份
fsck 顺序 2 0=跳过,1=优先(根分区),2=其他

测试 fstab 配置(不重启验证):

umount /data
mount -a            # 重新挂载所有 fstab 条目
df -h /data         # 确认挂载成功

检查点

mount -a 无任何错误输出,df -h /data 显示正确容量和挂载点。

7. 在线扩展分区(虚拟机场景)

VMware 扩展磁盘大小后,无需重启即可扩展分区和文件系统:

apt install -y cloud-guest-utils   # 包含 growpart 工具
growpart /dev/sdb 1                # 扩展 /dev/sdb 的第 1 个分区
xfs_growfs /data                   # xfs 在线扩展文件系统(无需卸载)
# ext4 使用:resize2fs /dev/sdb1
df -h /data                        # 确认新容量

实践任务

  1. 在 VMware 中添加一块新虚拟磁盘(/dev/sdb),用 lsblk 确认出现
  2. parted 创建 GPT 分区 + xfs 文件系统,挂载到 /data
  3. 编辑 /etc/fstab 添加永久挂载(使用 UUID),执行 mount -a 测试无报错
  4. df -hTlsblk -f 验证新分区已正确挂载和文件系统类型识别正确

自测问题

1. fdisk 和 parted 的主要区别是什么?什么时候优先用 parted?

维度 fdisk parted
分区表支持 MBR(最大 2 TB,最多 4 主分区) MBR + GPT(支持 > 2 TB,最多 128 分区)
交互方式 仅交互式菜单 支持命令行一步操作(可脚本化)
单位支持 扇区、柱面 MiB/GiB 等人类可读单位
适用场景 快速交互操作旧磁盘 现代系统、大磁盘、自动化脚本

超过 2 TB 的磁盘必须使用 parted 创建 GPT 分区表;生产自动化脚本(Ansible、云初始化)也优先使用 parted -s 的非交互模式。

2. 为什么现代系统推荐使用 UUID 而不是 /dev/sdb1 来写 fstab?

设备名(/dev/sdb)由内核按枚举顺序分配,取决于磁盘初始化顺序。在以下场景中设备名会发生漂移:添加/移除磁盘后重启、更换控制器、虚拟机迁移、热插拔操作。UUID 是格式化时生成的全局唯一标识符,与设备在哪个槽位无关,始终准确指向同一个分区。fstab 中写错设备名会导致系统无法正常启动(进入 emergency mode)。

3. xfs 文件系统无法"缩小"的根本原因是什么?

xfs 的元数据(AG 分配组头、inode 表、空闲空间映射)按固定间隔分布在整个文件系统的各个 AG(Allocation Group)中,最后一个 AG 的元数据区域位于文件系统末尾。缩小文件系统意味着截断末尾区域,会破坏这些元数据结构,xfs 的设计从未实现安全的缩小算法(官方文档明确不支持)。需要缩小时,唯一方法是备份数据 → 重新格式化 → 恢复数据。

4. 如果虚拟机磁盘扩容后分区未变大,第一步操作是什么?

使用 growpart 扩展分区边界:

growpart /dev/sdb 1        # 扩展 /dev/sdb 的第 1 个分区到磁盘末尾

分区扩展后,文件系统仍需单独扩展(分区和文件系统是两层独立的结构):

xfs_growfs /data           # xfs 在线扩展(挂载状态下操作)
resize2fs /dev/sdb1        # ext4 扩展(xfs 用 xfs_growfs,ext4 用 resize2fs)

总结

掌握磁盘分区、文件系统创建、挂载与在线扩展是存储管理的基础技能。生产环境中优先选择 GPT + xfs + UUID fstab + LVM(下一章),确保数据盘可弹性扩展、无停机迁移。本章操作完成后,/data 将用于后续 NFS 共享、备份目标和数据库数据目录。