很多人的第一块新硬盘,都是在某个深夜插进机器里的。插上去,开机,Ubuntu 桌面安安静静,文件管理器里什么都没有,于是心里开始犯嘀咕:是不是盘有问题?其实盘基本没坏,只是系统默认只会自动挂载它认识的那些盘,你手动加进来的新硬盘,它根本不会主动“安排”。要让 Ubuntu 识别并正式启用一块新硬盘,至少要走完“认清设备 → 建立分区表 → 分区 → 格式化 → 挂载 → 配置开机自动挂载”这几步。这篇文章就以最常用的命令行方式,把整条链路完整走一遍,适合刚接触 Linux 服务器运维、或者给台式机加数据盘的朋友参考。
1. 挂载前先认清盘:lsblk 是操作的第一道安全锁
先讲一个很典型的场景。朋友往一台 Ubuntu 机器上插了一块新盘,开机后打开文件管理器,翻来覆去没看到新磁盘,跑来问我“新硬盘是不是坏的”。
绝大多数情况下硬盘没坏,问题出在很多人默认“插上就能用”,但 Linux 不会像 Windows 那样自动给新盘分配盘符并弹提示。插上一块全新的、没分区没格式化、也没有文件系统的硬盘,Ubuntu 默认压根不会自动挂载它。文件管理器里看不到是正常现象,不是故障。
所以第一条要掌握的技能是:用 lsblk 列出当前系统里所有块设备。
lsblk输出大概是这样的(不同机器略有差异):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 477.5G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 476.9G 0 part / sdb 8:16 0 3.7T 0 disk道理很直白:sda 是原来的系统盘,sdb 就是刚插上去的新硬盘。TYPE 一列里,disk 代表整块物理盘,part 代表分区。如果 sdb 下没有子项(比如 sdb1、sdb2),说明它还是一块“白盘”,没分区、没文件系统,操作系统能看到这颗硬件但不知道怎么用。
1.1 设备名的命名规律,别等翻车了才知道
Linux 的设备名有一定规律,但不是固定不变的。常见的有:
- /dev/sda、/dev/sdb:以 SCSI/SATA 接口为代表的磁盘,现代 USB 硬盘、SATA 硬盘都会走这个命名;
- /dev/nvme0n1、/dev/nvme0n2:NVMe 固态硬盘,前一个数字是控制器编号,后一个数字是命名空间,一般一块盘就是 n1;
- /dev/vda、/dev/vdb:虚拟机里的 VirtIO 磁盘,比如在 QEMU/KVM、Proxmox 下的虚拟机磁盘;
- /dev/mmcblk0:SD 卡、eMMC 存储设备。
很多人会犯一个习惯性错误:看到 sdb 就直接当新盘,觉得“sda 是系统盘,sdb 就是新加的”。但机器上可能同时插着 U 盘、移动硬盘、老仓库盘,设备名是按识别顺序来的,不是按你的插槽顺序来的。比如你原本有一块 sda 系统盘和一块 sdb 数据盘,这次想加新盘,新盘可能顺延成 sdc,也可能因为某个启动项变化变成 sdb,直接把旧的 sdb 顶到 sdc 去——如果你没认清设备就执行格式化,很容易把旧数据盘给抹掉。
稳妥的做法是加上 MODEL 和 SERIAL 列一起看:
lsblk -o NAME,SIZE,MODEL,SERIALMODEL 显示硬盘型号,SERIAL 显示序列号,可以和硬盘外壳上的标签一一对应。物理机上插一块新盘,你亲眼看到标签上的序列号和系统输出一致,再动手操作,这一条比什么命令都管用。
1.2 在虚拟机里看不到 sdb 别慌
如果你是在虚拟机里测试,比如 VMware、VirtualBox,或者云主机,看到的设备名可能不是 sdb,而是 vda、vdb 或 nvme0n1。这不影响后续操作,只是设备名写法不同。在 Proxmox 这类虚拟化平台上给 Ubuntu 挂载一块新虚拟磁盘,客户机里大概率是vdb。看到 vdb 不要觉得奇怪,流程完全一样。
还有一类特殊情况:有些云厂商的块设备是直接映射出来的,比如 AWS 的 NVMe 实例会把 EBS 卷以/dev/nvme1n1之类的名字暴露出来。这种情况下依然用lsblk最靠谱,因为名字虽然变了,但容量、序列号这些特征不会骗人。
1.3 设备名变化会让旧挂载失效
这里要提前埋一个坑:设备名是动态的,不是固定的。如果你之前配过开机会自动挂载(fstab),并且当时写的是/dev/sdb1这种设备名,这次新加一块盘之后,设备名整体顺延一位,原来的/dev/sdb1就变成/dev/sdc1了,之前的配置立即失效。这就是为什么后来我会反复强调,永久挂载一定要用 UUID,而不是设备名。
2. 分区表怎么选:GPT 还是 MBR,新盘上别犯选择困难
既然已经认清哪块盘是新盘了,下一个问题是:这盘要不要搞分区表?搞什么样的分区表?
分区表是硬盘最开头的一段元数据,用来描述硬盘上有哪些分区、每个分区从哪个扇区开始、到哪个扇区结束。没有分区表,操作系统就不知道该在这块盘上怎么切分空间。分区表主要有两种格式:MBR 和 GPT。
2.1 MBR 的三个天生缺陷
MBR(Master Boot Record)是上世纪八十年代就定下的老标准,到现在还活跃在大量旧硬盘上,但它有三个非常明显的限制:
- 容量上限 2TB。大于 2TB 的盘用 MBR,系统只能识别和使用其中 2TB 的空间,剩下的全部浪费;
- 最多 4 个主分区。想分更多就得折腾扩展分区和逻辑分区,那套绕弯的做法又麻烦又容易出错;
- 可靠性差。MBR 分区表只有一份,存在磁盘最开头,一旦那一段扇区出现坏块或意外损坏,整个分区表都读不出来。
GPT(GUID Partition Table)是现代 UEFI 时代的标准。它支持 2TB 以上的超大磁盘,分区数量理论上基本不受限制,而且在磁盘尾部还存了一份备份分区表,万一主分区表坏了可以从备份恢复。现在新买的电脑和服务器,出厂基本都是 GPT。
2.2 最容易执行的判断标准
| 条件 | MBR | GPT |
|---|---|---|
| 磁盘容量小于 2TB | 可用 | 可用 |
| 磁盘容量大于 2TB | 不可用 | 必须用 |
| 传统 BIOS 启动的旧设备 | 兼容性好 | 部分老 BIOS 不支持 |
| UEFI 启动 | 兼容 | 原生支持 |
我个人的建议是:新盘一律 GPT。哪怕它只有 500GB,用 GPT 也完全没有坏处,反而给将来扩容和重新分区留下了空间。只有当你非常确定这块盘要接到一台十几年前的旧电脑或者某个不支持 GPT 的嵌入式设备上,才需要迁就 MBR。
有些老教程会让你根据“启动方式是 BIOS 还是 UEFI”来判断,但在单纯加数据盘这个场景下,这根本不重要。数据盘不参与系统启动,分区表格式和启动方式没有直接关系。别再为这个问题纠结了。
2.3 整盘一个分区还是分多个区
不少人一听说“分区”,就条件反射觉得要把盘切成好几块。其实完全不是这样。
如果这块盘就是当数据仓库用——存视频、存文档、放数据库备份——那直接一个分区用满整块盘最省事。你不需要为“万一以后想分”而提前规划,因为 GPT 本身就是弹性结构,以后想缩并不难,但真的很少有人在数据盘上做这种操作。
如果这块盘要承载好几个不同用途的独立区域,比如一部分存视频、一部分做备份、一部分放虚拟机镜像,那按用途分多个区是合理的。但这也意味着每个分区要单独挂载、单独设置权限、单独考虑空间不足时的扩容问题。管理成本是线性上升的。
我的实际体感是:能一个分区解决的问题,绝对不要分多个。真正有动态扩容、快照、合并多盘需求的场景,用 LVM 或 ZFS 是更现代也更灵活的方案,而不是靠传统分区去解决。
2.4 用 fdisk 分区:实际对话演示
分区工具我习惯用 fdisk。它交互式操作直观,并且现在已经完全支持 GPT。下面是给 /dev/sdb 建 GPT 分区表的完整过程:
sudo fdisk /dev/sdb进入交互界面后:
- 输入
g,创建全新的 GPT 分区表; - 输入
n,新建分区。fdisk 会询问分区号(默认 1)、起始扇区(直接回车用默认)、结束扇区(直接回车或用 +500G 指定大小); - 输入
w,把分区表写入磁盘。
Command (m for help): g Created a new GPT disklabel (GUID: ...) Command (m for help): n Partition number (1-128, default 1): First sector (2048-7814037166, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (..., default 7814037134): Created a new partition 1 of type 'Linux filesystem' Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.如果你只想要一个占满整块盘的分区,上面三步全程回车就能搞定。如果你想分出多个区,比如一个 500G 给资料,剩下给备份,就在输入 Last sector 时写+500G,然后再次输入n创建新分区。
关于扇区值,有一个新手最容易手滑的点:千万别手动指定起始扇区。默认的 2048 是为了对齐现代硬盘的 4K 物理扇区,一旦你手滑填了奇怪的数字,磁盘读写性能会肉眼可见地下降。全程回车用默认值,是最安全的操作。
写完分区表后,别忘了用 lsblk 确认新分区已经出现:
lsblk如果看到sdb1,说明分区建好了。
3. 格式化与文件系统:从 ext4 到 XFS 的选择逻辑
分区建好了,但分区还只是“一块划分好的空白区域”。要让 Ubuntu 能真正往里写文件,必须给分区创建文件系统。文件系统决定了数据以什么结构存放在磁盘上,怎么管理文件名、目录、权限、碎片、校验这些事。
常见的 Linux 文件系统有 ext4、XFS、Btrfs。选哪个,直接关系到后续使用的性能和可维护性。
3.1 三种文件系统的对比
ext4是 Ubuntu 的默认文件系统,也是 Linux 世界最成熟、兼容性最好的选择。几乎所有发行版都认识 ext4,老工具、救援环境、各种 Live CD 都支持。如果你弄不清自己需要什么,选 ext4 基本不会错。
XFS是 Red Hat 系企业系统的默认选择,特长是超大文件和高并发场景。它在处理大文件连续读写时表现很好,还支持在线扩容——卷不够用了直接在挂载状态下扩展,不用卸载。如果你的盘是 8TB 以上,并且主要跑视频素材、数据库文件这类大块数据,XFS 有明显优势。
Btrfs功能最花哨,支持快照、压缩、校验和、设备池等高级特性。但它对普通“挂一块数据盘”的场景来说,管理复杂度高于收益。除非你真的需要快照和压缩,否则没必要为了“看起来高级”而选它。
| 使用场景 | 推荐文件系统 | 理由 |
|---|---|---|
| 桌面资料、普通文件、通用数据盘 | ext4 | 兼容性最好,工具链最成熟 |
| 大文件存储、数据库备份、仓库盘 | XFS | 大文件性能好,支持在线扩容 |
| 需要快照、压缩、高级特性 | Btrfs | 功能丰富,但需要学习成本 |
3.2 格式化实操:命令与参数含义
假设新盘是 sdb,刚才建了 sdb1 分区,格式化命令如下:
sudo mkfs.ext4 -L data_disk /dev/sdb1-L参数用来设置卷标(LABEL)。这个卷标相当于给文件系统起了个名字,以后查blkid或lsblk -f时一眼就能看懂这块盘是干什么的。别嫌多打这几个字符,等你有三五块盘的时候就知道卷标有多救命。
如果是 XFS:
sudo mkfs.xfs -L data_disk /dev/sdb1注意,XFS 工具不是系统自带,需要先安装:
sudo apt update && sudo apt install xfsprogs -y格式化完成后,用 blkid 查看文件系统信息:
sudo blkid /dev/sdb1输出类似:
/dev/sdb1: UUID="6d3daf63-4c1f-4a2b-8b3f-9c0f..." TYPE="ext4" LABEL="data_disk"这个 UUID 是文件系统创建时生成的唯一标识,永久挂载时我们会用它来绑定设备。
3.3 块大小和对齐,普通用户别乱动
mkfs.ext4 有一个容易被忽略的点,就是块大小。大多数情况下默认块大小是 4KB,这正好匹配现代大容量硬盘的 4K 物理扇区(Advanced Format)。4K 对齐的意思是文件系统的逻辑块和硬盘的物理扇区边界对齐,如果没对齐,一次读写在逻辑上要跨越两个物理扇区,性能可能掉 30% 以上。
大多数人不需要知道这层细节,因为默认参数就是对齐的。但有一种情况需要注意:不要因为教程上说“小块大小适合小文件”就手动指定 512 字节块大小。在 4K 物理扇区的盘上搞 512 字节块,性能和可靠性都可能出问题,而且在 Ubuntu 桌面版上完全没有必要。
格式化完成后,如果这是一块固态硬盘,建议执行一次 TRIM:
sudo fstrim -v /挂载点TRIM 命令会让 SSD 主动清理已删除数据占用的块,长期来看对性能和寿命都有好处。机械硬盘不需要这一步。
3.4 格式化前最后的确认动作
格式化是不可逆的,命令敲下去,盘上的所有数据会立即消失并开始重建文件系统。虽然这是一块“新盘”,你也必须养成一个习惯:格式化之前,用lsblk核对设备名、用cat /proc/partitions看一眼容量、最好再看一眼 MODEL 和 SERIAL。三重确认之后才动手。
我在一次给旧机器加数据盘的时候,因为新盘和旧盘都是同品牌同容量的 4T 盘,差点把存满照片的旧盘格式化掉。幸好格式化前多看了一眼 lsblk 里的序列号。那之后我就立了一条规矩:任何分区、格式化、删除操作之前,必须停下 30 秒重新确认设备对象。这条规矩救了我很多次。
4. 挂载是树上的一个“挂点”:从 mount 到永久挂载
盘已经分区、格式化完毕,到了核心环节:挂载。
挂载对很多初学者是个抽象词。你可以把 Linux 的目录结构想象成一棵树,而一块硬盘是一个外来的“书架”。要让书架融入树里,你得在树上找一个位置把它挂住,这个位置就是“挂载点”(mountpoint)。挂载的本质,是把一个文件系统挂到系统目录树的某个目录上。之后你访问这个目录,就是在访问这块硬盘的内容。
4.1 临时挂载:mount 的基本用法
挂载点一般选在 /mnt 或 /media 下,也可以自定义任意路径,只要那个目录是空的就行。
比如我想把盘挂到 /data:
sudo mkdir -p /data sudo mount /dev/sdb1 /data然后看效果:
df -h输出里会出现/dev/sdb1 3.6T ... /data。此时你已经可以往 /data 里写数据了。
但注意,这只是一个临时挂载:重启之后系统不会自动重新挂载。如果你只是想临时用一下,比如从旧盘把数据搬到新盘,这个方式完全够。但如果你希望每次开机都自动挂载,就要配置文件/etc/fstab。
4.2 fstab 一行一规则,结构固定
/etc/fstab 是一个纯文本文件,每一行代表一条挂载规则。拿一条典型配置来说:
# <file system> <mount point> <type> <options> <dump> <pass> UUID=6d3daf63-... /data ext4 defaults 0 2从左到右六个字段分别是:
- 文件系统标识:这里写 UUID,也可以写 /dev/sdb1 这种设备名,但我不推荐后者;
- 挂载点:即目录路径;
- 文件系统类型:ext4、xfs、ntfs 等;
- 挂载选项:defaults 是最常用的,包含 rw、suid、dev、exec、auto、nouser、async 等默认组合;
- dump:是否备份,0 表示不备份;
- pass:开机时是否检测文件系统。根分区一般是 1,其他分区用 2,不需要检测就写 0。
4.3 为什么要用 UUID 而不是设备名
这个点值得反复强调。因为 /dev/sdb1 这个名字不是固定的。系统启动时,Linux 内核负责枚举设备,设备名受硬件枚举顺序、其他设备插拔、甚至内核版本影响。今天你的新盘是 sdb,明天插了块 U 盘再拔掉,新盘可能就变成 sdc。如果 fstab 里写的是 /dev/sdb1,设备名一变,开机挂载就会失败。
UUID 是文件系统本身生成的标识,和设备名无关。无论设备名怎么变,UUID 始终指向同一个文件系统。这就是为什么所有 Linux 教程都告诉你,fstab 里一定要用 UUID。
获取 UUID 的命令:
sudo blkid /dev/sdb1把输出里的 UUID 值填到 fstab 里即可。
4.4 测试 fstab 的正确姿势:不要直接重启
写 fstab 最怕的就是写错,然后重启进不了系统。避免这个噩梦有一个简单办法:写完 fstab 后先不重启,执行mount -a。
sudo mount -a这个命令会重新读取 fstab,并自动挂载其中所有尚未挂载的分区。如果命令没有报错,说明配置基本没问题。如果报错,当场就能看到是哪个字段错了,修起来便宜得多。
再用 df 验证:
df -h | grep /data看到挂载成功后,还要执行sudo reboot测试一次开机自动挂载。这一步我强烈建议做,因为 fstab 里偶尔会出现“配置看起来没问题但开机时不生效”的边界情况,只有重启验证过才算真正完成。
4.5 修改前的备份习惯
改 /etc/fstab 之前,先备份:
sudo cp /etc/fstab /etc/fstab.bak这是一秒钟的事,但一旦写错 fstab 进不去系统,这个备份就是救命稻草。我的习惯是每次修改系统配置文件前都做一次 .bak 备份,成本极低、收益极高。
5. 实操绕不开的坑:权限、挂载点争议与开机失败处理
挂载成功了,数据能往盘里写了,这套流程就基本走完。但实际使用中,还有几个非常容易卡住人的地方,单独拿出来说一说。
5.1 挂载点必须是空目录
有人图省事,直接把新盘挂到 /home 这种现成目录上,结果挂载后发现自己以前的文件“不见了”。其实文件没丢,只是被新盘“遮住”了。
原理很简单:Linux 的挂载点一旦挂上文件系统,原来的目录内容就会被隐藏。你访问 /home 看到的是新盘的内容,原来 /home 里的文件还在底层,只是暂时看不到。此时如果你觉得“反正文件丢了”,格式化或者删除挂载点里的数据,旧文件可能就真没了。
解决办法也简单:挂载点必须是一个空的目录。如果挂载前发现目标目录里已经有文件,先把文件移到别处,或者换个目录路径。
5.2 普通用户写不进去:权限处理方案
分区格式化完成后,挂载点如果属于 root,普通用户可能写不进去。比如根目录下的 /data 默认属主是 root,你当前登录用户试图往里面建文件,提示“Permission denied”。
处理方式分两类。
第一类,对于 ext4、XFS 这类原生 Linux 文件系统,挂载后直接改属主即可:
sudo chown -R $USER:$USER /data-R 表示递归修改挂载点内所有文件的属主。在新盘上执行这个命令很快,但如果盘上已经有大量数据,耗时会长一些。
第二类,对于 FAT/exFAT/NTFS 这类没有 Linux 原生权限概念的文件系统,它们在 Linux 下无法用 chown 改属主,只能在挂载时通过 uid 和 gid 参数指定:
sudo mount -o uid=$(id -u),gid=$(id -g) /dev/sdb1 /data或者写成 fstab 里的 options 字段:
UUID=xxxx /data exfat uid=1000,gid=1000,defaults 0 05.3 fstab 写错导致开机失败的处理
这是挂载硬盘最让人心惊的故障。fstab 写错,比如 UUID 复制错、文件系统类型写错,开机时系统尝试挂载失败,可能出现这些情况:
- 系统卡在提示符界面,显示 "A start job is running for /data" 然后等 90 秒;
- 等完超时后以只读模式进入系统;
- 更严重时直接进不去,提示 maintenance mode。
正确解法分几步:
- 开机时在 GRUB 菜单里按
e进入编辑模式; - 找到以
linux开头的那一行,在末尾加上systemd.unit=rescue.target; - 按
Ctrl+X或 F10 启动,进入救援模式; - 执行
mount -o remount,rw /,把根分区重新以可写方式挂载(救援模式下根分区有时是只读的); - 编辑 /etc/fstab,把有问题的行注释掉,或者用备份恢复:
sudo cp /etc/fstab.bak /etc/fstab- reboot 重启。
如果连 GRUB 都进不去,或者你根本没来得及备份,就用 Ubuntu 安装 U 盘启动进入 Live 环境,挂载系统分区后直接修改里面的 fstab:
sudo mount /dev/sda2 /mnt sudo nano /mnt/etc/fstab这时候你会真切体会到“提前备份”三个字的分量。
5.4 机械硬盘的挂载选项优化
给机械硬盘做数据盘时,挂载选项里加一个noatime往往是值得的。默认情况下,Linux 每次读取文件都会更新文件的访问时间(atime),这会在机械盘上产生大量额外的小写入。加了noatime之后,系统不再更新访问时间,能明显减少无谓的磁盘写操作,对机械盘的寿命和日常响应都有好处。
典型配置:
UUID=6d3daf63-... /data ext4 defaults,noatime 0 2如果挂载点里只存纯数据文件,不需要运行任何程序,还可以加noexec,防止这个目录下的程序被执行,算是一层安全加固。不过如果你的盘上确实要放脚本或二进制程序,那就别加 noexec,免得后面执行时报 Permission denied 找半天原因。
5.5 多块盘时注意父目录先挂载
当有多块数据盘同时打算挂载到同一棵目录树下,要注意挂载的有序性。比如 A 盘挂到 /data,B 盘挂到 /data/subdir,那么 fstab 里关于 /data 的行必须写在 /data/subdir 之前。虽然现代 systemd 有挂载依赖自动解决机制,但写清楚顺序能避免在极端启动条件下出现挂载失败的怪问题。
还有一种情况是两块盘都想挂到同一个挂载点,这不是“叠罗汉”,而是后挂载的盘覆盖先挂载的盘,后者的内容会被隐藏。如果不小心把两块盘挂到同一个目录,乍一看数据还在,实际上你看到的只是其中一块盘的内容。这种问题排查起来特别费劲,因为 df 能正常显示、lsblk 也看不出异常,只有卸载一块盘才会发现另一块盘其实是空的或藏着别的内容。
5.6 常见挂载失败速查
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| mount -a 报 unknown filesystem type | 文件系统类型写错,或缺少对应驱动 | 检查 fstab 第三列,安装 xfsprogs/exfat-fuse 等工具 |
| mount -a 报 wrong fs type | 挂载点目录不存在 | 先 mkdir -p 创建挂载点 |
| df 看不到新盘 | fstab 挂载点路径大小写写错 | 重新校对挂载点路径 |
| 能挂载但写入提示只读 | 文件系统损坏或以只读方式挂载了 | dmesg 查错误,fsck 修复文件系统 |
| 开机卡 90 秒后进系统 | fstab 中某行设备找不到 | 进 rescue 模式,注释或删除错误行 |
这套速查表是我实际排障中用得最顺手的一份清单。遇到问题先对照一遍,大多数情况能在十分钟内定位。
从新盘插上机器,到 lsblk 认清设备,再到分区、格式化、挂载、写 fstab,这条链路基本完整了。按照这套流程走一遍,绝大多数新硬盘在 Ubuntu 上都能实现开机自动挂载。
最后说一句实在话:挂载新硬盘本身不难,难的是每一步都带着确认去做。分区格式化不是日常操作,敲错命令的代价远大于多花几秒钟核对。我自己在给一台旧机器加数据盘时,因为新盘和旧盘容量完全一样,差点格式化错盘,还好格式化前多看了一眼序列号。从那天起,每次操作磁盘前我都会做设备名三重确认,这个习惯推荐给所有刚接触 Linux 的朋友。
还有一个小技巧值得分享:格式化时把卷标设置为有意义的名字,比如-L media_backup,以后查 blkid 或 lsblk -f,一眼就能知道这块盘是干什么的。卷标就像抽屉外面的标签纸,是给自己看的,别省那几个字符的功夫。至少在这些细节上多花一点时间,以后排查问题时能省下成倍的时间。