新加了一块 2TB 的数据盘,登录服务器执行 df -h 却怎么也找不到它——这是每个运维都会遇到的第一个"硬盘问题"。原因很简单:df 只看已挂载的文件系统,一块刚插上或刚在云控制台买好并挂载的盘,对系统来说还只是一个没有文件系统、没有挂载点的裸设备。从"系统里有一块盘"到"业务能往里写文件",中间要经过分区、格式化、挂载、写入 fstab 四步。本文把这四步完整走一遍,并重点讲清 GPT 与 MBR 的区别、为什么要用 UUID 挂载、以及 fstab 写错导致开不了机的经典事故。
一、第一步:确认系统到底认没认到这块盘
不要急着分区,先确认内核已经识别到设备。lsblk(list block devices)是最直观的工具,它以树形展示磁盘与分区的关系。
# 树形查看所有块设备(推荐) lsblk # 只看磁盘设备本身,不显示分区(-d = --nodeps) lsblk -d -o NAME,SIZE,TYPE,ROTA,MODEL,SERIAL # 显示文件系统类型、UUID、挂载点(-f) lsblk -f # 传统工具:查看所有磁盘与分区表 fdisk -l # 查看内核识别磁盘的日志 dmesg | grep -i -E 'sd[a-z]|nvme|attached'
新盘通常没有挂载点、FSTYPE 为空,也没有子分区。如果 lsblk 里根本看不到,先排查:物理服务器检查线缆与 RAID 卡配置(很多阵列卡需要先把物理盘做成 Virtual Drive 才能被系统看到);云服务器检查控制台上是否完成"挂载"到该实例这一步。
二、分区:GPT 还是 MBR,这是个必须先做的决定
分区表是写在磁盘最前面的一小段元数据,描述"这块盘被切成几段"。主流有两种:MBR(MS-DOS 分区表)和GPT(GUID 分区表)。
| 对比项 | MBR(msdos) | GPT(gpt) |
|---|---|---|
| 最大寻址容量 | 2TB(2^32 扇区 × 512B),超过部分不可用 | 理论 8ZiB,实际受系统与工具限制,远超当前需求 |
| 分区数量 | 最多 4 个主分区,或 3 主 + 1 扩展 + 若干逻辑分区 | 默认 128 个主分区,无扩展/逻辑分区概念 |
| 元数据冗余 | 仅一份,在磁盘开头,损坏即整个分区表丢失 | 头部 + 尾部各一份备份,带 CRC 校验,可自动恢复 |
| 分区类型标识 | 1 字节类型码(0x83 Linux 等) | GUID 类型标识,语义更清晰 |
| 启动方式 | 传统 BIOS 启动 | UEFI 启动必需 |
| 工具 | fdisk、parted | parted、gdisk、fdisk(新版) |
结论:只要这块盘超过 2TB,或者是数据盘且计划长期使用,一律用 GPT。MBR 的 2TB 限制是硬性的——如果你用 fdisk 在 4TB 盘上建 MBR 分区,会只用到前 2TB,剩下 2TB 直接消失,而且不会有任何报错提示,这是非常隐蔽的容量事故。
2.1 用 parted 建 GPT 分区(推荐)
# 查看磁盘与分区表类型 parted /dev/sdb print # 创建 GPT 分区表(会清空分区表,注意确认设备名!) parted -s /dev/sdb mklabel gpt # 创建主分区:从 1MiB 对齐位置到磁盘 100% parted -s /dev/sdb mkpart primary ext4 1MiB 100% # 如需分两个区:第一个 500G,第二个剩余全部 parted -s /dev/sdb mkpart primary ext4 1MiB 500GiB parted -s /dev/sdb mkpart primary ext4 500GiB 100% # 设置 4K 对齐检查(start 应为 1048576B 的整数倍) parted -s /dev/sdb unit s print parted /dev/sdb align-check optimal 1
parted -s 是脚本模式,不会交互式提问,适合批量操作。注意 1MiB 起始不是随便写的:它同时满足 512B 扇区和 4K 扇区的对齐要求,可以避开固态盘/云盘的写入放大问题。写成 0% 或 1 起始都会导致分区未对齐。
2.2 用 fdisk 交互式分区(小于 2TB 的盘)
fdisk /dev/sdb # 交互按键顺序: # n → 新建分区 # p → 主分区(或直接回车用默认) # 分区号、起始扇区、结束扇区 均回车用默认(即整盘一个分区) # t → 修改分区类型(Linux 默认 83,一般不用改;做 swap 改为 82) # w → 写入分区表并退出(q 为不保存退出) # 让内核重读分区表,避免重启 partprobe /dev/sdb # 若 partprobe 无效(提示设备忙),用下面的方式 partx -u /dev/sdb lsblk # 确认出现 sdb1
如果 partprobe 报 "device is busy",说明该盘有分区已被挂载或有进程占用(比如 LVM、RAID)。先卸载相关挂载点再重读。
三、格式化:ext4 还是 XFS
分区完成后要创建文件系统。Linux 下最常见的两个选择是 ext4 和 XFS。
- ext4:最通用、生态最成熟,支持缩容(离线)、支持
e2fsck修复,单文件系统最大 1EB、单个文件最大 16TB。通用业务数据盘首选。 - XFS:在大文件、高并发、超大目录场景表现更好,支持在线扩容(
xfs_growfs),但不支持缩容,且 XFS 的修复工具xfs_repair在极端情况下可能丢弃无法归属的数据块。RHEL/CentOS 系默认文件系统。
# 格式化为 ext4(-F 强制执行,-L 设置卷标) mkfs.ext4 -F -L data01 /dev/sdb1 # 格式化为 XFS mkfs.xfs -f -L data01 /dev/sdb1 # 查看文件系统详细信息(ext4) tune2fs -l /dev/sdb1 | grep -Ei 'block count|inode count|reserved|features' # 查看 XFS 信息 xfs_info /dev/sdb1
两个实用细节:ext4 默认会预留 5% 的空间给 root(Reserved block count),在纯数据盘上这是浪费,可以用 tune2fs -m 1 /dev/sdb1 把预留降到 1%;另外 ext4 的 inode 数量在格式化时就固定了,海量小文件场景(邮件、图片碎片、日志)要在格式化时用 -i 或 -N 调大 inode 密度,否则会出现"磁盘还有空间但 df -i 显示 inode 用满"而无法写入的情况。
# 小文件多的场景:减小 bytes-per-inode,增加 inode 数量 mkfs.ext4 -i 8192 /dev/sdb1 # 查看 inode 使用情况 df -i /mnt/data
四、挂载:临时挂载与开机自动挂载
4.1 临时挂载(重启后失效,用于验证)
# 创建挂载点 mkdir -p /mnt/data # 挂载 mount /dev/sdb1 /mnt/data # 带选项挂载(noatime 减少元数据写入,提升性能) mount -o defaults,noatime /dev/sdb1 /mnt/data # 验证 df -h /mnt/data mount | grep /mnt/data touch /mnt/data/.test && rm /mnt/data/.test
常用挂载选项说明:defaults 等价于 rw,suid,dev,exec,auto,nouser,async;noatime 禁止更新文件访问时间,对读多写少的场景能明显减少不必要的写;nofail 表示设备不存在时也不阻断启动(云盘、移动介质必加);nodev,nosuid,noexec 是安全加固三件套,用于 /tmp、用户上传目录等。
4.2 开机自动挂载:/etc/fstab 的每个字段都要懂
这是整篇文章最需要小心的地方。/etc/fstab 一行六个字段,写错一个字符就可能导致系统起不来。
# 获取分区的 UUID 与文件系统类型 blkid /dev/sdb1 lsblk -f /dev/sdb1 # 备份 fstab(重要习惯) cp /etc/fstab /etc/fstab.bak.$(date +%F) # 追加一行自动挂载配置(ext4 示例) echo 'UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data ext4 defaults,noatime,nofail 0 2' >> /etc/fstab # 验证:不重启,直接按 fstab 挂载全部条目 mount -a df -h
| 字段序号 | 字段 | 含义与取值 |
|---|---|---|
| 1 | device(设备) | 要挂载的设备。推荐写成 UUID=xxx 或 LABEL=xxx;也可写 /dev/sdb1,但设备名可能随启动顺序变化 |
| 2 | mountpoint(挂载点) | 目标目录,必须已存在,如 /mnt/data |
| 3 | type(文件系统类型) | ext4/xfs/swap/nfs/auto 等 |
| 4 | options(挂载选项) | 逗号分隔,如 defaults,noatime,nofail;auto 表示开机自动挂载 |
| 5 | dump | 是否被 dump 备份工具使用,现在几乎一律填 0 |
| 6 | pass(fsck 顺序) | 开机时 fsck 检查顺序:0=不检查;1=根分区(第一个检查);2=其他需要检查的分区(在根之后) |
为什么一定要用 UUID 而不是 /dev/sdb1?因为 /dev/sdX 的字母顺序由内核探测顺序决定,加一块盘、换一个插槽、或重启后的驱动加载顺序变化,都可能让原来的 sdb 变成 sdc。一旦设备名错位,fstab 就会把错误的分区挂到错误的目录,轻则数据找不到,重则直接把数据库目录挂成空盘。UUID 是写入文件系统元数据的唯一标识,永远不会跟着设备名漂移。
五、标准操作流程清单
lsblk确认新盘设备名,核对容量大小,务必确认选中的是空盘而非已有数据的盘。- 用
parted /dev/sdX print确认当前分区表,判断是否已有分区(有数据就立即停止)。 - 大于 2TB 建 GPT 分区表:
parted -s /dev/sdX mklabel gpt。 - 创建对齐分区:
parted -s /dev/sdX mkpart primary ext4 1MiB 100%。 - 格式化:
mkfs.ext4 -F /dev/sdX1(小文件多用-i 8192)。 - 建挂载点并临时挂载验证:
mkdir -p /mnt/data && mount /dev/sdX1 /mnt/data。 blkid取 UUID,备份 fstab 后用 UUID 写入/etc/fstab,数据盘加nofail。- 必做验证:
mount -a无报错,再执行一次umount /mnt/data && mount -a && df -h模拟重启流程。 - 可选加固:对上传目录加
nodev,nosuid,noexec。 - 可选:把挂载点权限与属主设好,
chown -R app:app /mnt/data。
小结与避坑建议
挂载新硬盘的完整链路是:识别设备 → 建分区表(GPT)→ 建对齐分区 → 建文件系统 → 挂载 → 写 fstab 用 UUID → mount -a 验证。七步里任何一步跳过去都可能埋下隐患。
高频事故清单:
- 4TB 盘用 fdisk 建 MBR 分区,结果只用上 2TB,且无报错。解决方法:重建成 GPT。
- fstab 写错且不验证,重启后系统进入紧急模式(emergency mode)。云服务器没有控制台时几乎无法自救。所以改 fstab 前一定
cp /etc/fstab /etc/fstab.bak,改完一定mount -a验证。 - 忘加
nofail:云硬盘被卸载或挂载顺序异常时,系统会卡在启动阶段。数据盘建议统一加nofail(RHEL 系还可用_netdev处理网络盘)。 - 用
/dev/sdX写 fstab:设备名漂移导致挂错盘。 - 忘记
mount -a验证就交付:重启才发现挂载失败。 - 直接对整盘
mkfs而不分区(/dev/sdb而非/dev/sdb1):技术上能用,但后续扩容、迁移、工具识别都会遇到麻烦,不建议。
最后一个习惯建议:所有对磁盘的破坏性操作前,先执行一次 lsblk -f 并截屏留存。多花十秒钟确认设备名,能避免一次无法挽回的数据丢失。
本文命令基于常见 Linux 发行版,操作前请务必确认设备名并备份重要数据。
企业QQ咨询




