前阵子帮一位朋友处理一台旧服务器的存储扩容,那台机器插上新买的机械盘后,lsblk里怎么都看不到设备。他一脸笃定地说“可能是硬盘坏了”,结果我弯腰一看,SATA数据线根本没插到底。类似这种问题,我在折腾 Ubuntu 挂载硬盘的过程中遇到过太多次——fstab 里写错设备名导致开机掉进救援 shell、NTFS 移动硬盘普通用户写不进去、重启后挂载点变成空目录数据却都在、用着用着文件系统变只读……这篇文章就是把 Ubuntu 挂载硬盘从识别、分区、格式化、手动挂载、开机自动挂载,到权限处理、故障自救、健康检查这一整条链路撸清楚。刚接触 Linux 的可以按步骤照做,已经踩过坑的也能对照查漏。
1. 插上一块硬盘后我先做的事:确认系统是否真的认到了它
拿到一块硬盘,不管它是刚从电商仓库发出来的全新 SSD,还是从旧电脑上拆下来的机械盘,我的习惯永远是先确认系统能不能看到它,再谈分区和格式化。原因很简单:如果连设备名都没确认,后面所有 mount、mkfs 命令都是在炸空气。
1.1 用 lsblk、fdisk、blkid 确认设备名和文件系统状态
开机进入 Ubuntu 后,第一件事是打开终端,跑下面这几条命令:
bash复制lsblk -f
sudo fdisk -l
sudo blkid
lsblk -f 是最直观的,它会列出所有块设备、分区、文件系统类型、UUID 和挂载点。新插入的硬盘如果是一整块裸盘,大概率显示为 sdb(SATA 盘)或者 nvme0n1(NVMe 固态),下面没有任何分区,文件系统列是空的。SATA 盘和 NVMe 盘的命名规则不同,SATA 盘通常是 /dev/sda、/dev/sdb 这种,NVMe 盘则是 /dev/nvme0n1、/dev/nvme1n1,注意后面多了个 n1,代表这是控制器上的第一个命名空间。
sudo fdisk -l 会输出更详细的信息,包括磁盘总容量、扇区大小、分区表类型。如果磁盘没有被格式化过,通常会有这么一句话:Disk /dev/sdb: 3.64 TiB,但下面的分区表是空的。sudo blkid 的作用是查看已经存在的分区的 UUID 和文件系统类型,它对你判断“这块盘是不是之前已经格式化过、里面是不是有旧数据”很有帮助。
很多新手上来就用 mkfs.ext4,直接把一块可能有数据的旧盘给抹了,就是因为跳过了这一步。我自己的规则是:每次挂载前,至少用 lsblk -f 和 blkid 各看一次设备状况,确认盘符、容量、有没有分区、有没有文件系统,心里有数再动手。
1.2 硬盘“消失”的五种常见原因
有时候插上硬盘,lsblk 里根本没有出现新设备,这时候别急着怀疑盘坏了,按概率从高到低排查下面几种情况。
第一是物理连接问题。SATA 硬盘要检查 SATA 数据线和电源线有没有插紧,很多机箱里电源线会松动,插了一半导致在系统里偶尔能看到、偶尔看不到。NVMe 固态则要确认是否完全插入 M.2 插槽并用螺丝固定,有些主板的 M.2 插槽和显卡散热器靠得很近,容易没插到底。如果是 3.5 寸机械盘,还需要额外供电,电源供电不足也会导致系统里识别不了。
第二是接口或控制器问题。可以把硬盘换一个 SATA 口试试,排除主板接口故障。手边有移动硬盘盒的话,直接放到硬盘盒里通过 USB 连接,如果能看到设备,说明盘大概率是好的。
第三是在虚拟机里新增磁盘后忘了“挂载”给系统。用 KVM、VirtualBox 这类虚拟化环境时,创建了虚拟磁盘还需要在虚拟机设置中把它“接入”到虚拟机,然后 Ubuntu 里才能看到。这也是初学者很容易漏掉的一步。
第四是内核驱动不支持或硬件太老。比如非常老的 SATA 控制器在某些新内核下可能有问题。这种情况下用 dmesg | tail -30 看有没有错误信息,能提供一些线索。
第五是真的盘坏了。前面都排除了还不识别,可以接上另一台电脑或者用 USB 硬盘盒试试,如果仍然识别不到,基本上就是主控、电机或者盘片有问题,直接走售后或者换盘。
排查思路说白了就是先物理后软件,先简单后复杂。插上设备后用 dmesg -w 实时看内核日志,再插入硬盘,来自内核的新消息会立刻刷新出来,比如 /dev/sdb: new high-speed USB device number 5 或者 ATA 设备的连接日志。这一招比反复重启有效得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分区和格式化之前,先把文件系统选对
确认系统能识别硬盘后,接下来要面对两个选择:分区表用 GPT 还是 MBR,文件系统用 ext4、xfs 还是别的。这两个选择看似不起眼,但选错了,轻则浪费空间,重则换系统后数据读不出来。
2.1 分区表:为什么我更推荐 GPT
分区表是硬盘的“目录”,告诉系统这块硬盘上有哪些分区、从哪里开始到哪里结束。现在主流就两种:
| 对比项 | MBR | GPT |
|---|---|---|
| 最大支持容量 | 约 2TB | 远超 2TB,理论支持极大容量 |
| 最多主分区数量 | 4 个 | 128 个(Windows 下默认) |
| 可靠性 | 分区表信息单一,损坏后难恢复 | 在磁盘头部和尾部各存一份,抗损坏能力强 |
| 兼容性 | 老主板、老系统兼容性好 | 需要 UEFI 或较新的 BIOS 支持 |
| 适用场景 | 老旧机器、特殊嵌入式设备 | 现代 PC、服务器、数据盘 |
现在装 Ubuntu 的主板基本都是 UEFI 固件,所以如果不是有特别的兼容性需求,直接选 GPT 就行。我在这几年经手的机器里,只有一台十多年前的笔记本主板不支持从 GPT 盘引导系统,其余情况都用 GPT 没有任何问题。
分区表选择还有一个容易被忽略的点:如果硬盘用 MBR 分区且超过 2TB,你分出来的单个分区往往只能用前面 2TB 的空间,后面剩下全是“未分配空间”,数据盘尤其吃亏。所以给数据盘、仓库盘分区分表,默认 GPT 即可。
2.2 ext4、xfs、exFAT、NTFS 到底怎么挑
文件系统就是硬盘上组织数据的方式。同一个 Linux 系统下可选的很多,但面向“挂载一块硬盘”这个需求,我一般只看下面几个。
ext4 是 Ubuntu 最稳妥的选择。它成熟、文档多、遇到问题容易找人问;支持在线扩容(后面空间变大可以把分区扩大),不支持在线缩容,但对大多数场景来说“无法缩小”不是问题。缺点是单个文件大小上限和文件系统上限在日常使用中基本碰不到,除非你有一个超过 16TB 的超大文件。仓库盘、备份盘、虚拟机镜像盘,我都用 ext4。
xfs 的优势是大文件、高并发读写表现好,很多数据库、视频素材库会用。它的劣势是不能在线缩小,而且如果意外断电,恢复过程比 ext4 复杂一点。所以除非你明确知道自己有海量小文件的性能压力,或者上面跑数据库,否则没必要为了“看起来高级”而去选 xfs。
NTFS 和 exFAT 都是“跨平台盘”的选择。NTFS 是 Windows 主推的文件系统,Ubuntu 下用 ntfs-3g 驱动读写,性能有一定损失,但胜在兼容性。exFAT 是专门为 U 盘、SD 卡、移动硬盘设计的,Ubuntu 需要安装 exfat-fuse,在 Linux 和 Windows 之间来回插拔,又不想被格式化烦到的话,选 exFAT 最省心。
我自己给移动硬盘分区时,容量小于 128GB 且只在 Linux 上用,直接格式化为 ext4;需要在 Windows 和 Ubuntu 之间共用,就格式化为 exFAT。内置仓库盘则一律 ext4,日常维护省心很多。
2.3 用 parted 完成分区与格式化实操
假设你要给 /dev/sdb 这块盘格式化,上面已经确认没有旧数据,按下面步骤操作。
先创建 GPT 分区表并建立一个占满整盘的 ext4 分区:
bash复制sudo parted /dev/sdb --script mklabel gpt
sudo parted /dev/sdb --script mkpart primary ext4 1MiB 100%
第一条命令把 /dev/sdb 的分区表设为 GPT。第二条命令创建分区,从 1MiB 开始,结束于 100%。起始位置从 1MiB 而不是 0MiB,是为了给 GPT 分区表本身和后续的扇区对齐留出空间,这也是新硬盘分区的标准做法。至于分区类型名,写 primary 还是 data 影响不大,因为 GPT 下分区类型的实际意义没有 MBR 那么大,真正决定作用的是里面的文件系统。
分区创建完后,系统里会出现一个 /dev/sdb1,然后格式化:
bash复制sudo mkfs.ext4 /dev/sdb1
执行 mkfs 前一定要再三确认分区位置。我之前就见过有人把 /dev/sdb1 看成 /dev/sdb,结果在不该操作的地方跑了一遍 mkfs,好在他及时发现是空盘,没有造成损失。格式化完成后可以用 blkid /dev/sdb1 验证一下,会输出类似 UUID="xxxxxxxx-xxxx-..." TYPE="ext4" 的信息,这个 UUID 后面写 fstab 要用。
如果不用命令行,Ubuntu 桌面版可以用自带的“磁盘”工具(gnome-disks)或者 GParted,界面操作同样能完成分区和格式化,适合不喜欢记命令的人。但服务器上通常没有图形界面,命令行依然是通用方案。
3. 手动挂载和开机自动挂载,这一篇能一次讲清楚
分好区、格式好文件系统,硬盘还只是“存在”,要让系统里的目录能访问它,需要把分区“挂载”到某个目录上。理解挂载这个概念,可以打个比方:文件系统好比一个装满文件的柜子,挂载点是给这柜子安排的一个房间位置,只有把柜子推进房间里,你才能打开它取东西。
3.1 手动挂载与挂载点命名习惯
先创建挂载点目录,再挂载:
bash复制sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
df -h
/mnt/data 是挂载点,名字可以随便起,但要有可读性。Linux 系统里常见的挂载点有 /mnt(临时挂载点)、/media(桌面系统自动挂载外部设备时用)、/srv(存放服务数据)。我自己喜欢把数据盘挂到 /mnt/data、/mnt/backup 这种一目了然的位置,少用 /mnt 根目录直接挂载的方式,因为 /mnt 本身还可能要挂其他临时东西,一个目录对应一个挂载点,别混用。
挂载完成后 df -h 能看到 /dev/sdb1 出现在列表里,挂载到了 /mnt/data。取消挂载用 sudo umount /mnt/data,注意是 umount 不是 unmount,这两个拼写我经常看到新手写错。手动挂载的缺点是重启后失效,系统重启,挂载关系就没了,你还得再手动敲一遍命令。要开机自动挂载,就需要配合 /etc/fstab。
3.2 fstab 自动挂载:为什么必须用 UUID 而不是设备名
/etc/fstab 是 Linux 开机时自动挂载文件系统的核心配置文件,格式如下:
text复制设备标识 挂载点 文件系统类型 挂载选项 dump备份 文件系统检查顺序
UUID=xxxx /mnt/data ext4 defaults,noatime,nofail 0 2
六个字段从左到右依次是:设备标识、挂载点、文件系统类型、挂载选项、是否用 dump 备份(一般填 0)、是否用 fsck 检查(根文件系统填 1,其他常挂载的文件系统填 2,不需要检查填 0)。
这里最关键的一点:设备标识要写 UUID,不要写 /dev/sdb1。原因是 Ubuntu 在每次开机时,内核加载磁盘驱动的顺序并不固定,上一秒 /dev/sdb 的设备,下一次开机可能就变成 /dev/sdc。如果你在 fstab 里写了 /dev/sdb1,设备名一变,开机挂载就会失败。而 UUID 是文件系统创建时就生成的唯一标识,识别的是文件系统本身,跟内核分配的设备名无关,稳定得多。
获取 UUID 的方式:
bash复制sudo blkid /dev/sdb1
输出里有一段 UUID="xxxxxxxx-xxxx-...",复制整段到 fstab 里。然后写文件:
bash复制sudo nano /etc/fstab
添加这样一行:
text复制UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data ext4 defaults,noatime,nofail 0 2
写完不要直接重启,先测试一下:
bash复制sudo mount -a
mount -a 会读取 fstab 并尝试挂载所有标记为自动挂载的文件系统,如果 mount 后没有报错,再看看 /mnt/data 是否能正常访问,确认无误再重启验证。这一步能避免很多“fstab 写错导致开机进不了系统”的惨剧。
3.3 挂载参数怎么选:noatime、discard、nofail
fstab 的第四列是挂载选项,很多人直接写 defaults,但这往往不够好。defaults 默认包含 rw(可读写)、suid、dev、exec、auto、nouser、async,应对基本挂载没问题,但两个参数建议主动加上。
第一个是 noatime。Linux 在默认情况下,每次读取文件都会更新文件的访问时间(atime),这等于每次打开文件都要额外写一次磁盘。对机械硬盘来说,这个写入虽然不大,但对 SSD 来说会减少寿命,对备份盘和媒体库来说根本没意义。加上 noatime 可以避免每次访问文件都触发写入操作。日常数据盘我基本都会加。
第二个是 nofail。这个参数的意思是:如果这块设备开机时不存在,系统不要因为挂载失败而停在报错界面,而是跳过它继续启动。对移动硬盘、移动光驱这类不一定每次开机都在线的设备,这个参数非常重要。否则你拔掉移动硬盘没改 fstab,下一次开机就很容易卡死在启动阶段。
至于 discard,它会让文件系统每次删除文件时都自动向 SSD 发送 TRIM 指令,好处是及时回收闪存空间,坏处是在某些硬盘上会明显影响性能。现代 Ubuntu 默认通过 systemd 的定时任务执行周期性的 fstrim,效果比每个删除操作都发送 TRIM 要好。所以这里我更建议:外置 SSD 不加 discard,靠系统定时 fstrim 就行,老款 SSD 或特殊需求再考虑手动加。
4. 挂载后写不进去、权限混乱、重启失效:这些坑我全踩过
挂载命令本身不难,真正让小白崩溃的是挂载成功之后出现的一系列莫名其妙的问题。这些坑我都踩过,每一个都对应一次“明明按教程做了,怎么就是不行”的经历。
4.1 挂载后权限不足:从 mount 输出开始排查
挂载 ext4 数据盘后,用普通用户往里面写文件,提示“权限不够”,这是最常出现的问题。排查链路一般是:
先看挂载状态:
bash复制mount | grep /mnt/data
df -h | grep /mnt/data
确认挂载选项里是否有 ro(只读)。如果显示 ro,说明挂载时指定了只读,可以重新挂载成可读写:
bash复制sudo mount -o remount,rw /mnt/data
如果挂载状态是 rw,但普通用户仍然写不进去,那问题多半出在挂载点目录的所有权上。新建的目录属于 root 用户和 root 组,权限是 755,普通用户只能读不能写。解决办法是改所有权:
bash复制sudo chown -R 用户名:组名 /mnt/data
sudo chmod -R 755 /mnt/data
把 /mnt/data 的所有者改成你的登录用户,之后这个目录下的新建文件都由你控制。如果是团队共享的数据盘,可以给挂载点设置成 770,然后把需要使用这块盘的人加入同一个用户组。chown 换成群里共享方法:sudo chown -R user:sharedgroup /mnt/data 和 sudo chmod -R 2770 /mnt/data。
需要注意,chown 加 -R 会把挂载点目录下的所有现有文件的属主都改掉。如果这块盘里已经有大量数据且不希望改动它们的属主,就不要加 -R,只改挂载点目录本身:sudo chown user:group /mnt/data。新创建的文件仍然以创建者为准,可以配合目录的 setgid 位(目录权限里加 g+s)让新文件自动继承目录的用户组。
4.2 NTFS/exFAT 移动硬盘挂载成普通用户能写
外接 NTFS 或 exFAT 的移动硬盘时,很多人会发现挂载后普通用户只能读不能写,root 才能写。这是因为 ntfs-3g 驱动在默认挂载时不会自动赋予普通用户写权限,文件系统本身没有 Linux 的权限体系,所有文件对于 Linux 都属于一个“模拟出来的用户”,把权限映射成什么全靠挂载选项。
解决方法是挂载时显式指定 UID、GID 和各权限掩码:
bash复制sudo mount -t ntfs-3g -o uid=1000,gid=1000,dmask=022,fmask=133 /dev/sdb1 /mnt/usb
uid=1000 和 gid=1000 分别表示把文件系统内的所有文件归属到你当前登录用户(通常是第一个普通用户;用 id 命令可以查看自己的 uid 和 gid);dmask=022 表示目录权限为 755(允许所有者写,其他用户读);fmask=133 表示文件权限为 644(所有者可读写,其他用户只读)。这样普通用户挂载后就有读写权限了。
同样,对于 exFAT 分区,可以用 -o uid=1000,gid=1000,dmask=022,fmask=133 挂载。注意 exFAT 在 Ubuntu 上默认也走 FUSE 驱动,如果没有安装 exfat-fuse 和 exfatprogs,要先安装:
bash复制sudo apt install exfat-fuse exfatprogs
这类外接盘写入 fstab 时,文件系统类型要写 ntfs-3g 或 exfat 而不是 ext4,其他字段类似:
text复制UUID=xxxx /mnt/usb ntfs-3g uid=1000,gid=1000,dmask=022,fmask=133,nofail 0 0
4.3 fstab 写错导致开机进不了系统:完整自救链路
先说一次真实的经历:有一回在一台机器上给一块新盘写 fstab,我图省事直接填了 /dev/sdb1,当时测试 mount -a 一切正常。结果机器重启后,因为硬盘插的口换了一个,设备名变成了 /dev/sdc,系统开机时按照 fstab 挂载,找不到 /dev/sdb1,于是直接掉进了 initramfs 的紧急 shell,屏幕上全是红色报错。
这种时候不用慌,自救的完整流程是:紧急 shell 里先执行:
bash复制mount -o remount,rw /
因为此时根文件系统往往是只读状态,先把它重新挂载成可读写,才能修改 fstab。然后直接编辑:
bash复制nano /etc/fstab
找到出错的那一行,在开头加 # 注释掉,或者改成正确的 UUID,保存退出,重启。重启后如果之前只是注释掉了,系统可以正常进入,再重新执行 sudo blkid 获取正确的 UUID,用 mount -a 测试无误后再补回 fstab。
预防这种问题有四条经验:一是 fstab 里必须用 UUID 而非设备名;二是加上 nofail,即使挂载失败系统也能继续启动;三是写完 fstab 必须执行 sudo mount -a 验证;四是之后仅把设备插在同一个 SATA 口,避免开机顺序变化导致 UUID 对不上。任何一条能做到,都不至于被一次重启困住。
5. 磁盘健康检查与安全卸载:挂载只是开始
硬盘挂好了、权限理顺了、开机自动挂载也正常了,很多人觉得大功告成,直接拔盘或者关机完事。但硬盘是消耗品,挂载完成后还有两件事我建议做:定期看健康状态,以及正确卸除物理设备。
5.1 用 smartctl 建立磁盘健康基线
数据盘的价值从来不在盘本身,而在里面的数据。挂载完成后,建议先看看这块硬盘的健康状况,尤其是那些二手盘、老机械盘。
安装工具:
bash复制sudo apt install smartmontools
然后查看硬盘健康摘要:
bash复制sudo smartctl -H /dev/sdb
-H 参数显示的是 SMART 总体的健康评估结果,通常输出 PASSED 表示自检通过。想看详细参数,用 sudo smartctl -a /dev/sdb,重点关注几个指标:Reallocated_Sector_Ct(重映射扇区数,持续增长说明盘片出现物理坏道)、Current_Pending_Sector(待重映射扇区,出现且不消失说明有隐患)、Temperature_Celsius(温度,机械盘长期超过 45 度就要考虑改善散热)。
对机械盘,我习惯挂载完就手动触发一次后台全面自检:
bash复制sudo smartctl -t long /dev/sdb
自检期间硬盘可以正常读写,只是性能会有一定下降。过一段时间后用 sudo smartctl -a /dev/sdb 查看 Self-test execution status 是否完成,以及日志中是否有报错。SMART 数值不是万能的,它不会提前预报所有故障,但能帮你识别明显有问题的盘,在数据还能读取时及时备份。
5.2 安全卸载:sync、umount 和查看占用进程
Linux 为了提升性能,写文件时不会立刻把数据写到硬盘,而是先写入内存的 page cache,再找机会批量写回。所以拔出 U 盘或移动硬盘前,如果省略了同步和卸载,轻则文件损坏,重则文件系统直接变成只读。
正确的摘除流程是:
bash复制sync
sudo umount /mnt/data
sync 的作用是把内存中未写入硬盘的数据强制刷到磁盘。执行完卸载后,可以安全拔出设备。如果提示 target is busy,说明还有进程正在使用挂载点里的文件,比如某个终端还停留在 /mnt/data 目录、音乐播放器还在读取里面的歌曲。排查方法:
bash复制lsof +f -- /mnt/data
lsof 可以列出所有正在使用该目录文件的进程,找到对应的 PID 后正常关闭程序,或者用 fuser -vm /mnt/data 查看占用情况。确定没有进程占用后再卸载。
机械硬盘的卸载还要注意一点:如果盘处于休眠状态,不建议先拔电源,而是先执行上面的一整套流程。我见过有人为了省时间直接拔 SATA 盘,结果文件系统确实没坏,但目录结构里多出一堆 lost+found 里的碎片文件,花了半天才清理干净。
5.3 从零到一:一块数据硬盘的完整挂载路线图
把所有步骤串起来,给一块全新数据盘做完整挂载,我最终的流程是这样的:
- 物理安装硬盘,确认 SATA 数据线和电源线接牢(或 M.2 插到位)。
- 开机进 Ubuntu,执行
lsblk -f、blkid确认系统识别到/dev/sdb且无旧数据。 - 创建 GPT 分区表并建分区:
bash复制sudo parted /dev/sdb --script mklabel gpt
sudo parted /dev/sdb --script mkpart primary ext4 1MiB 100%
- 格式化:
bash复制sudo mkfs.ext4 /dev/sdb1
- 创建挂载点并手动挂载:
bash复制sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
- 设置挂载点所有权:
bash复制sudo chown -R 用户名:组名 /mnt/data
- 写入 fstab:
bash复制sudo blkid /dev/sdb1
sudo nano /etc/fstab
添加:
text复制UUID=xxxx /mnt/data ext4 defaults,noatime,nofail 0 2
- 测试验证:
bash复制sudo mount -a
df -h
- 顺手跑一次 SMART 摘要,登记用盘时间和健康状态:
bash复制sudo smartctl -H /dev/sdb
这套流程我已经在各种机器上重复了很多遍,每台新机器加盘我都按这个顺序走,目前还没有再遇到过因为挂载姿势不对导致的丢失数据或者启动失败。最后分享一个小习惯:我给每块数据盘都在挂载点目录下放一个 .disk-info 文本文件,记录“这块盘的型号、序列号、挂载时间、用途、容量及 UUID”,下次系统里出现多块盘时,一眼就能认出来谁是谁。挂载硬盘不是什么玄学,只要你把设备识别、文件系统选型、UUID 自动挂载、权限控制这四件事都想明白,以后挂任何盘都不慌。
