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 中添加新虚拟磁盘
- 虚拟机关机 → VM → Settings → Hardware → Add → Hard Disk
- 新建虚拟磁盘:≥ 40 GB,SCSI 控制器
- 启动虚拟机后确认新磁盘已被内核识别:
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 列显示 xfs,LABEL 列显示 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 # 确认新容量
实践任务
- 在 VMware 中添加一块新虚拟磁盘(
/dev/sdb),用lsblk确认出现 - 用
parted创建 GPT 分区 +xfs文件系统,挂载到/data - 编辑
/etc/fstab添加永久挂载(使用 UUID),执行mount -a测试无报错 - 用
df -hT和lsblk -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 共享、备份目标和数据库数据目录。