Linux服务器如何挂载新硬盘?分区、格式化与开机自动挂载教程

新加了一块 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、partedparted、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
字段序号字段含义与取值
1device(设备)要挂载的设备。推荐写成 UUID=xxx 或 LABEL=xxx;也可写 /dev/sdb1,但设备名可能随启动顺序变化
2mountpoint(挂载点)目标目录,必须已存在,如 /mnt/data
3type(文件系统类型)ext4/xfs/swap/nfs/auto 等
4options(挂载选项)逗号分隔,如 defaults,noatime,nofail;auto 表示开机自动挂载
5dump是否被 dump 备份工具使用,现在几乎一律填 0
6pass(fsck 顺序)开机时 fsck 检查顺序:0=不检查;1=根分区(第一个检查);2=其他需要检查的分区(在根之后)

为什么一定要用 UUID 而不是 /dev/sdb1?因为 /dev/sdX 的字母顺序由内核探测顺序决定,加一块盘、换一个插槽、或重启后的驱动加载顺序变化,都可能让原来的 sdb 变成 sdc。一旦设备名错位,fstab 就会把错误的分区挂到错误的目录,轻则数据找不到,重则直接把数据库目录挂成空盘。UUID 是写入文件系统元数据的唯一标识,永远不会跟着设备名漂移。

五、标准操作流程清单

  1. lsblk 确认新盘设备名,核对容量大小,务必确认选中的是空盘而非已有数据的盘。
  2. 用 parted /dev/sdX print 确认当前分区表,判断是否已有分区(有数据就立即停止)。
  3. 大于 2TB 建 GPT 分区表:parted -s /dev/sdX mklabel gpt。
  4. 创建对齐分区:parted -s /dev/sdX mkpart primary ext4 1MiB 100%。
  5. 格式化:mkfs.ext4 -F /dev/sdX1(小文件多用 -i 8192)。
  6. 建挂载点并临时挂载验证:mkdir -p /mnt/data && mount /dev/sdX1 /mnt/data。
  7. blkid 取 UUID,备份 fstab 后用 UUID 写入 /etc/fstab,数据盘加 nofail。
  8. 必做验证:mount -a 无报错,再执行一次 umount /mnt/data && mount -a && df -h 模拟重启流程。
  9. 可选加固:对上传目录加 nodev,nosuid,noexec。
  10. 可选:把挂载点权限与属主设好,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 发行版,操作前请务必确认设备名并备份重要数据。