☰
Linux硬盘挂载全流程:从lsblk认盘到fstab开机自动挂载与排错
2026/10/8 19:55:59 网站建设 项目流程

最近两周我至少收到四个类似消息:新买的SSD插上去了,系统里看不到盘;或者挂载时报个没见过英文错,直接卡在wrong fs type那里不知道怎么办;还有人在/etc/fstab里写了一行,结果重启后愣是卡在emergency mode。这类问题我在工作里遇到过太多次,其实Linux挂载硬盘这件事本身并不难,难点在于大部分人上来就跳过“认盘”和“选文件系统”这两步,直接执行mount,一旦环境跟教程不一致,就容易翻车。

这篇内容我就按自己平时处理服务器的习惯来写:从认盘开始,到临时挂载、开机自动挂载,再到排查各种常见报错,最后补一个开发板和NFS场景。不管你是刚把第二块硬盘塞进台式机,还是在机房给新机器接存储,照着这套路子走,基本不会再瞎折腾。

1. 挂载之前,先认清硬盘

1.1 lsblk和blkid:两个最常用的“透视镜”

拿到一块没有系统的新硬盘,多数人第一反应是fdisk -l,这个命令确实能看到设备,但输出信息非常啰嗦,尤其当机器上插了好几块盘,一堆扇区、磁头、柱面参数看得人眼花。我更推荐先执行lsblk,它的输出是按树形结构列出来的,一眼就能看出谁是谁的分区,谁还没被分区。

lsblk

输出大概长这样:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 223.6G 0 disk ├─sda1 8:1 0 500M 0 part /boot/efi ├─sda2 8:2 0 222.7G 0 part / └─sda3 8:3 0 512M 0 part [SWAP] sdb 8:16 0 1.8T 0 disk

注意看,sdb下面没有任何─子项,MOUNTPOINT列也是空的,这表示整块盘还没分区、没格式化,系统根本不知道该拿它怎么办。这时候直接mount /dev/sdb1 /mnt肯定报错,因为/dev/sdb1还不存在。

如果想看更详细的文件系统信息,用blkid。它会把每块分区当前已经写好的文件系统类型、UUID都列出来:

blkid

输出类似:

/dev/sda2: UUID="a1b2c3d4..." TYPE="ext4" PARTUUID="..." /dev/sdb: PTUUID="..." PTYPE="gpt"

注意sdb那一行只有PTUUID、PTYPE,没有TYPE,这同样说明它还没有文件系统。一旦你看到某块盘带了TYPE="ext4"这类信息,那就说明它曾经被格式化过,可以直接挂载。

实操心得:拿到自己不熟悉的机器,先lsblk再blkid,两个命令一结合,设备的“体检报告”就出来了。别急着敲mount,先花十秒钟看清盘,后面少踩一半的坑。

1.2 分区表:GPT还是MBR,别再凭感觉

分区表决定硬盘怎么组织分区。老的MBR最多支持4个主分区,而且单分区容量超过2TB时会有各种别扭;GPT没有主分区数量限制,也支持更大容量。现在的新硬盘,除非你有非常特殊的兼容性要求(比如老主板纯Legacy引导、某些老设备固件),否则闭着眼睛选GPT就行。

我见过有人在2TB以上的新盘上非要手动建MBR分区表,结果建完只有不到2TB可用的尴尬场面。所以这里给个明确建议:

  • 新盘、大容量盘(>2TB):一律GPT
  • 老设备、老系统装机引导:保留MBR
  • 拿不准:GPT优先

分区工具推荐gdisk或者parted,操作风格不同,但底层都是改分区表。以最常见的场景为例:一块全新的盘,打算整块盘分成一个区来用,用parted可以这样:

parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary ext4 0% 100%

0% 100%意思是从头到尾占满整块盘。如果你只想分一半做数据盘,可以把后面改成0% 50%,再补一条命令建第二个分区。这个百分比写法比直接填扇区号友好太多,我处理新盘时基本都用它。

1.3 新盘收到之后的基本检查流程

收到一块新盘,别急着往机箱里塞,我一般按下面的顺序走一遍:

  1. 插上盘,启动系统后执行lsblk,确认系统有没有认到设备(如果完全没有,优先检查供电和线缆)。
  2. 执行dmesg | tail,看看有没有异常报错。新盘通常会看到类似sdb: sdb1的信息,如果看到I/O error,基本可以断定是盘本身或线材的问题。
  3. 确认设备名后,再确认分区表类型和分区情况。
  4. 格式化、挂载,一步步来。

这个流程听起来很基础,但真能省下不少排查时间。我遇到过好几次“硬盘插上没反应”的求助,最后查下来是SATA线没插紧或者供电线分叉没插到位。“系统认不到盘”九成是硬件问题,不是软件问题,别一开始就在软件里折腾。

2. 临时挂载:先跑通,再谈永久

2.1 决定文件系统:ext4、XFS、NTFS/exFAT怎么选

挂载之前,你得先让盘上有文件系统,也就是“格式化”。这块盘将来要拿来做什么,决定了你选什么格式:

场景推荐文件系统理由
Linux系统盘、普通数据盘ext4兼容性最好,老牌稳定,新手首选
大文件存储、数据库备份XFS大文件读写性能好,适合单文件大容量场景
跨Windows/Linux双系统读写NTFS或exFATWindows原生支持,Linux要装ntfs-3g
移动硬盘、U盘exFAT跨平台兼容好,避免单文件4GB限制

ext4我还是最推荐给第一次接触Linux的用户,原因无他:生态最成熟,网上能查到的资料最多,出了问题也好修。

格式化命令:

mkfs.ext4 /dev/sdb1

如果打算整块盘不分区直接格式化,也可以mkfs.ext4 /dev/sdb,但不建议,因为后续做分区调整会非常被动,还是老老实实分一个区再格式化。

2.2 mount的基本用法和常用参数

格式化完成之后,临时挂载就简单了:

mkdir -p /data mount /dev/sdb1 /data

挂载的本质是把一块已经格式化好的分区,跟系统目录树里的某个目录“连接”起来。这里有个必须理解的逻辑:挂载点目录必须是已经存在的空目录。如果目录里原本有文件,挂载之后这些文件会被“遮住”,你看不到了,但数据还在,卸载之后又会重新出现。

mount还有一些常用参数,挑几个最实用的说一下:

mount -o ro /dev/sdb1 /data # 只读挂载,适合排查盘的数据安全场景 mount -o noexec /dev/sdb1 /data # 禁止执行二进制文件,适合防病毒的场景 mount -o loop ubuntu.iso /mnt/iso # 挂载镜像文件 mount --bind /data /srv/data # 目录绑定,不新建分区也能把目录挂到别处

--bind这个用法很多人不知道,但它在服务迁移时极好用。比如某个服务写死路径/srv/data,而你的真实数据在/data,不用挪数据,一条bind命令就搞定。

2.3 umount卸不掉?这说明有人在占用

对应mount的是umount:

umount /data

如果提示target is busy,说明还有进程在访问这个目录。先执行lsof +f -- /data或fuser -mv /data看清楚是谁占着,再决定是停掉进程,还是用强制卸载兜底。

umount -l /data

-l参数是lazy umount,意思是立刻把这个挂载点从目录树里摘掉,但等占用它的进程全部退出后才真正卸载底层设备。这个参数很适合生产环境:你不能停掉正在写数据的业务进程,但你又确实需要卸载这块盘去处理问题。用了-l之后,目录里的数据不会丢,进程写到一半的数据也会继续完成写入。

踩过的坑:很多人习惯cd到挂载目录里再执行umount,结果永远提示target is busy。因为当前shell的工作目录还停留在挂载点里,shell本身就是那个占用进程。先cd /再umount,问题直接消失。

3. 开机自动挂载:fstab的正确打开方式

3.1 fstab的六个字段,逐行讲清楚

临时挂载只能解决当下,重启之后系统不会自动恢复挂载关系,所以要把挂载信息写进/etc/fstab。这个文件每行有固定的六个字段,我用一个例子来拆解:

UUID=xxxx-xxxx-xxxx /data ext4 defaults 0 2

依次是:

  1. 设备标识:推荐写UUID,不推荐写/dev/sdb1
  2. 挂载点:一个不存在的目录,系统会先创建再挂载
  3. 文件系统类型:这里写ext4
  4. 挂载选项:defaults代表rw, suid, dev, exec, auto, nouser, async的组合
  5. dump备份标记:基本写0,现在很少人用dump
  6. fsck检查顺序:根分区写1,其他想开机自检的分区写2,不想自检写0

一个典型的数据盘示例:

UUID=abcdef00-1234-5678-9abc-def012345678 /data ext4 defaults,nofail 0 2

3.2 为什么推荐用UUID,而不是/dev/sdX

新手最喜欢照抄教程里的/dev/sdb1,但这是最不该学的一种写法。设备名不是固定的,系统每次启动时发现硬盘的顺序不一样,很可能这次是/dev/sdb,下次就变成/dev/sdc了。一旦设备名错位,fstab就会挂错盘。

UUID是格式化时随机生成的一串唯一标识(部分文件系统也可以手动指定),它跟盘走的,跟系统启动顺序无关。你把这盘插到另一台机器上,UUID还是同一个。

获取UUID:

blkid /dev/sdb1

复制那一长串UUID="..."里的内容填到fstab里就行。

如果有人问:“我就一块盘,写/dev/sdb1应该没事吧?”从概率上确实没事,但这习惯不好。哪天你把一块新盘插上去,原来的sdb变成了sdc,系统起不来了,那才是最疼的。UUID虽然长,但一劳永逸。

3.3 调优选项:noatime、nofail、uid/gid

defaults能应付大部分场景,但几个实用选项值得记一下:

  • noatime:不记录文件的访问时间。能减少大量写I/O,对SSD和机械盘的随机读都有明显帮助。普通数据盘,不是特殊审计需求,建议加上。
  • nofail:如果挂载失败(比如外接硬盘没插),系统不会卡在emergency mode,而是跳过并继续启动。外接盘、虚拟机共享盘强烈建议加。
  • uid=和gid=:只对FAT/NTFS这类没有Unix权限概念的文件系统有效,可以指定挂载后文件归属的用户和用户组。后面讲NTFS时会再细说。

举个例子,一个追求性能的本地数据盘可以这么写:

UUID=xxxx /data ext4 noatime,nofail 0 2

实操心得:我维护的服务器里只要遇到外置USB硬盘或云盘冷备目录,nofail是必须加的。不加这个,哪天设备没插好,整个机器开机直接进维护模式,值班的人半夜就得爬起来处理。生产环境不要挑战这种风险。

3.4 验证fstab:别把系统整得开不了机

改完fstab想验证对不对,不要重启。先执行:

mount -a

-a会把fstab里所有还没挂载的条目按配置挂一遍,如果配置有问题,这里当场就会报错,你还来得及改。如果没报错,再执行lsblk确认挂载点生效。

另一个稳妥的验证方式是:

findmnt /data

它显示的是当前系统对这个挂载点的真实解析结果。如果fstab写得不对,但手动挂载成功了,findmnt会提示target is not mounted或是fstab与实测不一致。

我还建议改文件之前先备份一下:

cp /etc/fstab /etc/fstab.bak

一旦后面改坏了,从单用户模式或live CD里一条cp就能救回来。

4. 典型故障:报错信息就是最好的线索

4.1 “wrong fs type, bad option, bad superblock”到底在说什么

挂载时报这串英文错的人特别多:

mount: /data: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error.

这一长串其实是在说:我在挂载点里找不到一个我能识别的文件系统。常见原因有几种:

  1. 盘上根本没有文件系统(没格式化),或者文件系统已经损坏。
  2. 指定的挂载类型不对,比如明明是ext4盘,你写成了-t xfs。
  3. 缺少对应的文件系统驱动,比如挂NTFS盘但没装ntfs-3g。

排查办法很简单:先blkid /dev/sdb1看它到底识别出的TYPE是什么,再跟挂载命令里的-t对比。如果blkid显示TYPE="ntfs",那你需要先装:

apt install ntfs-3g

如果blkid没有任何输出,大概率盘没有有效的文件系统,只能重新格式化。注意,重新格式化会清空所有数据,执行之前务必确认盘上没你想要的旧数据。

4.2 明明是root,为什么还是permission denied

挂载成功了,但cd /data进去读取文件时提示permission denied。这要分两种情况看:

  • 如果挂载的是ext4/xfs这类原生Linux文件系统,问题出在文件和目录权限上。用ls -l /data看看属主和权限位,chown -R 你的用户名:组名 /data改一下即可。
  • 如果挂载的是NTFS或exFAT,问题不在常规权限,而是这两个文件系统没有Unix的owner/group概念,内核默认把它们挂载成root拥有,普通用户自然进不去。

解法是挂载时指定uid/gid。先id 你的用户名查到uid和gid,然后:

mount -t ntfs-3g -o uid=1000,gid=1000,umask=022 /dev/sdb1 /data

umask=022含义是:创建出来的文件权限是644、目录权限是755,普通用户既可以读,也拥有自己的文件。想彻底可写可删就把umask设成000——不推荐,这样所有用户都能改任何文件,双系统共享盘上容易互相误删。

4.3 开机进emergency mode,大概率是fstab写错了

系统重启后没有正常进桌面,而是黑屏里出现一句类似:

You are in emergency mode. After logging in, type "journalctl -xb" ...

第一反应不要慌,九成是fstab有问题。先输入root密码进维护模式,执行:

mount -a

它会明确告诉你哪一行出错。常见错误包括UUID写错、挂载点不存在、文件系统类型不一致、盘没插好。临时把那行注释掉(行首加#)再reboot就能先进系统,然后再仔细修正配置。

还有一种情况需要特别注意:挂载点目录本身不在根目录里。如果我写的是/mnt/data但忘记创建/mnt/data目录,fstab在实际挂载时会自动创建,这个倒不用担心。真正坑的是挂载点的父目录被另一张盘挂载了,导致启动顺序对不上,这种只能手动先挂父目录再挂子目录。

4.4 外接NTFS盘:只读挂载和中文乱码

双系统用户最常遇到外接NTFS盘只能读、不能写。这往往是ntfs-3g没装,或者是Windows开启了快速启动导致NTFS卷标处于“休眠”状态,Linux为了安全会以只读方式挂载。先装ntfs-3g:

apt update && apt install -y ntfs-3g

如果还是只读,进Windows关闭快速启动,或者在Linux上强制以读写方式挂载:

mount -t ntfs-3g -o remove_hiberfile /dev/sdb1 /data

remove_hiberfile会删掉Windows的休眠镜像文件,相当于放弃之前休眠状态,之后盘就正常可写了。已经有旧内核版本的ntfs驱动也可能造成乱码问题,但现代发行版默认UTF-8基本都能正常显示中文文件名。

5. 延伸:把本地经验迁移到服务器和开发板

5.1 挂载NFS网络存储

挂了本地盘,很多人下一个需求就是挂NAS。NFS是最常见的网络文件共享协议,Linux对NFS的支持几乎是原生级别的。假设NAS的IP是192.168.1.10,共享目录是/volume1/media,你想挂到本机/mnt/nas:

apt install nfs-common mkdir -p /mnt/nas mount -t nfs 192.168.1.10:/volume1/media /mnt/nas

这时用df -h能看到一条网络存储的记录。想要开机自动挂载,写进fstab:

192.168.1.10:/volume1/media /mnt/nas nfs defaults,noatime,nofail 0 0

NFS挂载相比本地盘多了网络延迟的变量,如果NAS没响应,mount命令会卡很久。所以建议在mount参数里加soft和timeo:

mount -t nfs -o soft,timeo=50,retrans=2 192.168.1.10:/volume1/media /mnt/nas

soft表示网络超时后放弃请求并报错,hard则会让进程卡住重试。生产环境要数据不丢用hard,自己家里玩玩用soft更不容易卡机。

5.2 开发板挂载ubuntu主机的目录

这块可能偏嵌入式,但我觉得值得写。开发板上磁盘空间紧张,常常需要直接访问Ubuntu主机上的交叉编译工具链或代码目录。做法也不复杂,在Ubuntu主机上装NFS服务,把需要共享的目录export出去:

apt install nfs-kernel-server vim /etc/exports

加一行:

/home/你用户名/shared 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

然后执行:

exportfs -ra systemctl restart nfs-server

开发板上再执行mount命令挂过来,效果等同于开发板直接操作主机上的目录。编译产物直接写到主机磁盘,开发板的eMMC或TF卡空间压力会小很多。

no_root_squash如果不需要,建议去掉。root_squash会让远程root在本机自动降权为nobody,这对安全性是保护。我自己在调试时图方便加过no_root_squash,后来发现一旦开发板被入侵,攻击者直接用root写我主机文件,想想都后怕。平时调代码完全用不上这个选项,默认配置就好。


说到最后,我还想提一条关于“挂载习惯”的建议:不要因为挂载命令看起来简单,就跳过前面认盘的环节直接执行。我见过太多翻车案例,最后定位都是“挂载点写错”“忘了确认盘上有没有文件系统”“fstab里用了不稳定的设备名”。按我开头说的流程走一遍,认盘、分区、格式化、临时挂载、写fstab、mount -a验证,每一步都确认好了再往下走,Linux挂硬盘这件事就能从“玄学”变成“肌肉记忆”。如果你手边正好有块闲置硬盘,挑个不忙的晚上,拿我这套流程练一遍,之后遇到服务器加盘、开发板扩容、NAS挂载,你会发现自己真的不再慌。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询