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

服务器加了块新盘,或者云主机新挂了一块数据盘,系统里却看不到、用不上——这是很多人第一次接触"挂载"时的体验。硬盘插上了不代表能用,Linux 里必须经过"认盘 → 分区 → 格式化(创建文件系统)→ 挂载 → 写入 fstab 实现开机自动挂载"这几步,磁盘才能真正被业务读写。

这篇文章会完整走一遍这个流程,并重点解释几个容易出事的环节:怎么确认设备名不搞错、/etc/fstab 怎么写才不会导致开机进不了系统、用 UUID 而不是设备名来挂载的好处、以及一块盘有大容量时怎么用 GPT 而不是 MBR。文中涉及的 mkfs(格式化)会永久销毁磁盘数据,我会在每一步给出风险提示和核对方法。

读完你应该能独立、安全地给服务器挂上一块新盘,并让它在重启后自动挂载、权限正确、业务可读写。文中命令同时给出 RHEL 系(yum/dnf)和 Debian 系(apt)的差异,以及两套都能用的通用工具。

一、先认盘:确认设备名和容量

第一步永远是搞清楚新盘是哪个设备,绝对不要凭感觉写 /dev/sdb。

# 列出所有块设备及其分区、容量(最直观)
lsblk

# 带文件系统类型和 UUID 的完整信息(挂载和 fstab 必备)
lsblk -f

# 查看磁盘型号、序列号、大小
sudo fdisk -l
sudo parted -l

# 更现代的查看方式
sudo blkid
sudo hwinfo --disk 2>/dev/null   # 不一定预装

# 看内核是否识别到新盘(插盘后应有日志)
dmesg -T | grep -iE 'sd[a-z]|nvme|ata|scsi' | tail -20

设备命名规则要记住:

设备名 含义 说明
/dev/sda、/dev/sdb SATA/SAS/USB 盘 字母按识别顺序分配,顺序可能变
/dev/vda、/dev/vdb 虚拟化磁盘(KVM/Xen) 云主机常见
/dev/nvme0n1 NVMe SSD p1 后缀表示分区,如 nvme0n1p1
/dev/xvda Xen 虚拟磁盘 部分云平台

关键认知:/dev/sdX 这类设备名不是永久的。内核识别顺序、插拔顺序、虚拟化配置变化,都可能让同一块盘下次变成另一个名字。所以配置文件里不要写设备名,要写 UUID。这一点后面会重点讲。

举一个典型场景:一台云主机原本有一块系统盘 /dev/vda,你在控制台挂载了一块新数据盘,登录后发现多出 /dev/vdb。用 lsblk 能看到它的大小和是否已有分区。

lsblk
# NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# vda    252:0    0  40G  0 disk
# └─vda1 252:1    0  40G  0 part /
# vdb    252:16   0 200G  0 disk          <-- 新盘,没有分区、没挂载点

二、分区:要不要分,怎么分

关于"新盘要不要分区",有个常见的困惑。结论是:

  • 如果整块盘就做一个文件系统、不打算再分多个区,可以不分区,直接在整盘上 mkfs(比如 /dev/vdb)。很多数据盘就这么用。
  • 但如果要分多个区(比如一个区给数据、一个留给别的用途)、或者出于规范化考虑,就先用 parted/fdisk 建分区。
  • 云数据盘建议至少建一个分区,方便以后扩容和工具识别。

重要前提:大于 2TB 的盘必须用 GPT 分区表,MBR(DOS)最大只支持 2TB。所以现在新建分区一律推荐 GPT。

先介绍 parted(支持 GPT,适合大盘):

# 交互式分区(以 /dev/vdb 为例,务必核对设备名!)
sudo parted /dev/vdb

# 在 parted 交互界面里:
# (parted) mklabel gpt                 # 创建 GPT 分区表(会清空分区表!)
# (parted) mkpart primary ext4 0% 100% # 建一个占满整盘的 ext4 主分区
# (parted) print                       # 确认
# (parted) quit

也可以一条命令搞定:

sudo parted -s /dev/vdb mklabel gpt
sudo parted -s /dev/vdb mkpart primary ext4 0% 100%

传统 fdisk(交互式,适合小于 2TB 或熟悉它的人):

sudo fdisk /dev/vdb
# 交互界面里:
#   g        创建 GPT 分区表(大容量必须)
#   n        新建分区
#   p        查看分区
#   w        保存退出
#   q        不保存退出

风险提示:mklabel、fdisk 的写操作、以及任何带 -s 的自动分区,都会改写磁盘分区表。如果设备名写成了系统盘或已有数据的盘,数据会直接丢失。执行前务必用 lsblk 反复确认设备名、容量、挂载点,确认这块盘上没有你要保留的数据。对云主机,建议先打快照。

分区后让内核重新读取分区表:

sudo partprobe /dev/vdb
# 或
sudo udevadm settle
lsblk        # 应能看到 vdb1

三、格式化:创建文件系统

分区好了(或决定整盘直接用),下一步是创建文件系统,也就是"格式化"。

风险提示:mkfs.* 会销毁目标设备上的全部数据。这是不可逆操作。执行前再次 lsblk -f 确认目标设备,确认上面没有要保留的数据。

先选文件系统类型:

文件系统 适用场景 特点
ext4 通用、兼容性最好 成熟稳定,大多数场景首选
XFS 大文件、高并发、RHEL 系默认 大文件性能好,不能缩小
Btrfs 需要快照、校验 特性多,运维相对复杂
tmpfs 内存文件系统 不落盘,重启清空

格式化命令:

# ext4(通用)
sudo mkfs.ext4 /dev/vdb1
# 整盘直接用:
# sudo mkfs.ext4 /dev/vdb

# XFS(RHEL 系常用)
sudo mkfs.xfs /dev/vdb1

# 带参数示例:ext4 设置卷标和预留空间比例为 1%(默认 5%)
sudo mkfs.ext4 -L data -m 1 /dev/vdb1

说明一下 -m 1:ext4 默认给 root 保留 5% 空间,数据盘上这个比例偏大,常见的 200G 盘会白白占用约 10G。数据盘通常可以设成 1%(经验值),系统盘建议保留默认。

# 查看格式化结果
lsblk -f
sudo blkid /dev/vdb1
# 记下输出的 UUID,后面 fstab 要用
# ---- 工具安装(按需)----
# RHEL / Rocky / Alma
sudo dnf install -y e2fsprogs xfsprogs parted
# Debian / Ubuntu
sudo apt install -y e2fsprogs xfsprogs parted

四、挂载:临时挂载与验证

格式化完,先做临时挂载验证,确认没问题再写 fstab。

# 1. 创建挂载点(目录名按业务来,比如 /data 或 /mnt/disk1)
sudo mkdir -p /data

# 2. 临时挂载
sudo mount /dev/vdb1 /data

# 3. 验证
df -hT /data
lsblk -f
mount | grep vdb1

挂载后要处理权限。新格式化的 ext4/XFS 根目录默认属主是 root:root、权限 755,如果你的业务进程用非 root 用户(比如 nginx、mysql、应用专用账号)读写,需要改属主:

# 把 /data 交给某个用户和组
sudo chown -R appuser:appgroup /data
sudo chmod -R 755 /data

# 或者建个子目录专门给某个服务
sudo mkdir -p /data/nginx
sudo chown -R nginx:nginx /data/nginx

# 看某个目录的属主
ls -ld /data

XFS 挂载选项、ext4 挂载选项可以在挂载时指定,比如禁用访问时间记录以减少写入:

# noatime 能减少不必要的元数据写入,数据库和高 IO 场景常见
sudo mount -o noatime /dev/vdb1 /data

五、开机自动挂载:正确书写 /etc/fstab

临时挂载重启就没了,要持久化就得写 /etc/fstab。这是全篇最关键也最容易导致系统起不来的地方——fstab 写错,开机时系统挂载失败,可能直接掉进紧急模式(emergency mode),远程机器就失联了。

先看 fstab 的格式,每一行六个字段:

cat /etc/fstab
# 格式:
# <设备>  <挂载点>  <文件系统>  <挂载选项>    
字段 含义 建议值
设备 用 UUID= 或 /dev/xxx 优先 UUID
挂载点 目录路径 事先 mkdir 好的目录
文件系统 ext4 / xfs 等 与 mkfs 时一致
选项 defaults、noatime 等 defaults 或 defaults,noatime
dump 备份标志 0
pass fsck 顺序 数据盘 0,根分区 1

为什么用 UUID:前面说过设备名会变。UUID 是文件系统的唯一标识,跟着文件系统走,不受设备名影响,所以是持久化的正确做法。先查 UUID:

sudo blkid /dev/vdb1
# 输出示例:
# /dev/vdb1: UUID="a1b2c3d4-...." TYPE="ext4"

编辑 fstab:

# 先备份 fstab!
sudo cp /etc/fstab /etc/fstab.bak

sudo vi /etc/fstab

追加一行(用上一步查到的 UUID):

# <设备>                                  <挂载点>  <类型>  <选项>             
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890  /data     ext4    defaults,noatime  0      0

也可以用卷标或设备名(不推荐):LABEL=data /data ext4 defaults 0 0 / /dev/vdb1 /data ext4 defaults 0 0。

写完后必须验证,验证方法有两种,都不要省:

# 验证方式一:不重启,测试 fstab 里所有条目能否正确挂载
sudo umount /data 2>/dev/null     # 若之前已临时挂载,先卸载
sudo mount -a                     # 按 fstab 挂载所有未挂载项,无报错即为正常
df -hT | grep data

# 验证方式二:更严格地检查(systemd 系统)
sudo systemctl daemon-reload
sudo findmnt --verify --verbose    # 会校验 fstab 语法和可挂载性

mount -a 无报错、findmnt 通过,基本可以认为配置正确。不要跳过验证就去重启,那样一旦写错就要靠救援模式救。

如果确实写错了导致开机进紧急模式,处理办法是:进入系统(救援模式或紧急 shell)后,vi /etc/fstab 把出错行注释掉(行首加 #),保存后 reboot,或直接恢复 /etc/fstab.bak。

# 紧急模式下根分区可能只读,需要重挂为可写
mount -o remount,rw /
vi /etc/fstab      # 注释掉有问题的行
reboot

六、几个进阶但常见的点

扩容:云盘扩容后,文件系统不会自动变大,需要手动扩。

# 以 ext4 为例,假设分区已用 growpart 扩过(GPT 盘)
sudo growpart /dev/vdb 1
sudo resize2fs /dev/vdb1
# XFS 用:
sudo xfs_growfs /data
df -hT /data

绑定挂载(bind mount):把一个目录挂到另一个位置,适合日志目录重定向等场景。

sudo mount --bind /data/logs /var/log/app
# fstab 写法:
# /data/logs  /var/log/app  none  bind  0 0

LVM:如果一开始就用 LVM 管理磁盘,扩容会更灵活,但要提前规划,事后改比较麻烦。生产上大体量业务常直接上 LVM。

性能提示:机械盘顺序读写经验值约 100~200 MB/s,普通 SATA SSD 约 400~550 MB/s,NVMe SSD 可达 1~7 GB/s,云盘的 IOPS 和吞吐则取决于所购规格。这些都是量级参考,实际取决于硬件和负载。用 dd 或 fio 可以实测。

# 简单的顺序写测试(会写入文件,注意别在满盘上跑)
dd if=/dev/zero of=/data/testfile bs=1M count=1024 oflag=direct
rm -f /data/testfile

常见问题

Q1:新盘插上后 lsblk 看不到怎么办?
先看 dmesg -T | tail 有没有识别日志。云主机要在控制台确认真实已挂载到虚拟机;物理机检查背板、线缆、RAID 卡是否把盘做了阵列或未透传。RAID 卡可能需要先在卡的管理界面把盘建为 JBOD 或虚拟磁盘。

Q2:fstab 用 UUID 还是设备名?
用 UUID。设备名可能因识别顺序变化而改变,导致开机挂载失败甚至进不了系统。

Q3:写错 fstab 导致开机进紧急模式怎么救?
用云控制台/带外进入,mount -o remount,rw / 后编辑 fstab 注释掉问题行,或恢复备份,再重启。这也说明改 fstab 前备份和 mount -a 验证有多重要。

Q4:格式化后数据能恢复吗?
mkfs 会重建文件系统元数据,常规手段基本无法恢复。所以格式化前一定确认设备没有有用数据,必要时先做块设备级备份。

Q5:挂载点目录必须是空的吗?
通常是的,挂载会"遮住"挂载点原有内容。如果目录里有文件,挂载后会被隐藏,卸载后才可见。所以挂载点目录一般新建一个空的专用目录。

总结

  • 挂盘流程是:lsblk 认盘 → 分区(大容量必须 GPT)→ mkfs 建文件系统 → 临时 mount 验证 → 写 /etc/fstab 持久化。
  • 设备名会漂移,fstab 中一律使用 blkid 查到的 UUID;分区前反复确认设备名和容量,避免误伤系统盘或数据盘。
  • /etc/fstab 写错可能导致开机进紧急模式,改前必须备份,改后用 mount -a 和 findmnt --verify 验证,验证通过再重启。
  • ext4 默认保留 5% 空间,纯数据盘可考虑调到 1%(经验值);挂载后用 chown 设好属主,否则非 root 业务进程无法写入。
  • 云盘扩容后文件系统不会自动变大,需要用 growpart + resize2fs(ext4)或 xfs_growfs(XFS)手动扩展。