我先把结论放前面:如果你手里有一块装着Windows系统的硬盘,或者另一块Linux系统盘,插到当前Linux机器上没反应、桌面上找不到、不知道去哪看数据,那这篇文章就是写给你看的。
“关于Linux的挂在其他的系统盘”这个话题,说白了两句话:第一,Linux底下没有盘符概念,设备必须挂载到某个目录才能访问;第二,挂载不是插上就完事,系统盘比你想象的更特殊,里面有Windows的NTFS分区、可能还有EFI分区、恢复分区,甚至LVM卷组,直接硬挂常常会踩坑。这篇文章把整个流程从查看磁盘、临时挂载、开机自动挂载,到LVM、加密盘、嵌入式开发板这些特殊场景全部走一遍,再附上我实际踩过的坑和排查方法。适合刚接触Linux的新手,也适合在服务器或者嵌入式板卡上折腾过挂载但总出问题的人参考。
1. 为什么非要“挂载”:Linux目录树与设备的接入逻辑
1.1 挂载到底做了什么
Linux的设计哲学是“一切皆文件”。你的磁盘、分区、U盘,本质上都是一个块设备文件,比如 /dev/sda、/dev/nvme0n1p1。但设备文件本身只是“门把手”,你拧不动它,必须把里面存储的文件系统“挂”到当前系统的根目录树(/)下面的某个位置,系统才知道怎么读、怎么写它。
打个比方:你的Linux系统就是一套房子,/ 是客厅,/mnt/data 是客厅里的一个柜子。硬盘里的数据相当于一批还没搬进来的书,挂载就是把书搬进柜子、贴上标签,之后你随时可以从柜子里取。不挂载,书就是书,堆在门外,你看着它却拿不到。
这也是为什么Windows用户刚到Linux都会蒙圈:Windows给每个盘一个盘符C、D、E,你点进去就是内容。Linux没有这个机制,所以你插上另一块系统盘,桌面文件管理器里啥都没有,很正常的。
1.2 哪些场景需要挂载其他系统盘
“其他系统盘”这几个字涵盖的场景非常多,我列几个最常见的:
- 从Windows迁移数据到Linux:你给老电脑装了Linux,但Windows盘还在,想把桌面、下载、文档里的资料搬过来。
- 双系统互访:一台机器装了Windows和Linux,Linux启动后想读Windows的C盘和D盘。
- 服务器批量换盘/数据恢复:机器坏了,把原来系统盘拆下来接到另一台Linux服务器上,想读取里面的数据库文件、配置、日志。
- 移动硬盘、U盘手动挂载:桌面版的图形环境一般会自动挂载,但最小化安装、服务器版、开发板这些没有桌面环境的地方,必须手动挂载。
- 嵌入式开发板挂载Ubuntu系统盘:比如RK、全志这类开发板,需要挂载SD卡、eMMC里的系统分区,或者通过NFS把开发主机上的Ubuntu根文件系统挂载到板子上。
- LVM、加密盘等特殊文件系统:服务器上常见的LVM逻辑卷、LUKS加密盘,直接mount是挂不上的,需要先激活卷组、解密设备。
另外要澄清一个容易混淆的说法:挂载系统盘和“把U盘做成系统启动盘”完全不是一回事。制作启动盘是把系统镜像写入U盘并设置引导;挂载系统盘是读一块已经包含系统的硬盘里的内容。这篇文章只讲后者。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手前先摸清家底:磁盘、分区与文件系统识别
2.1 三件套命令:lsblk、blkid、fdisk
挂载前的第一件事不是急着 mount,而是先搞清楚盘在哪里、上面的分区是什么文件系统、设备名是什么。我习惯固定用这三条命令:
bash复制lsblk -f
blkid
sudo fdisk -l
lsblk -f 是我最推荐的,它有树形结构,一眼就能看出设备层级关系,而且直接列出文件系统类型、UUID和挂载点。输出大概长这样:
text复制NAME FSTYPE FSVER LABEL UUID MOUNTPOINTS
sda
├─sda1 vfat FAT32 ABCD-1234 /boot/efi
├─sda2 ext4 1.0 a1b2c3d4-... /
└─sda3 swap 1.0 5e6f7a8b-... [SWAP]
sdb
├─sdb1 ntfs DCBA5678 /media/win
└─sdb2 ntfs 8765DCBA
sdb 这块盘就是典型的Windows系统盘,sdb1 是EFI引导分区(FAT32),sdb2 是实际的C盘(NTFS)。MOUNTPOINTS 列如果是空的,就说明还没有挂载,这正是我们要处理的。
blkid 的输出更干净,专门用来查设备属性和UUID,写 /etc/fstab 之前基本都要靠它。fdisk -l 则能看分区表类型(GPT还是MBR)、分区起始扇区和大小,遇到分区表异常或者识别不到文件系统的时候用得最多。
2.2 如何判断一块盘是Windows盘还是Linux盘
根据文件系统类型可以快速判断:
- NTFS / exFAT:基本都是Windows盘,也可能是移动硬盘。
- FAT32 / vfat:U盘、SD卡、Windows引导分区(EFI分区)都是这个。
- ext4 / xfs / btrfs:Linux原生文件系统,多半是另一套Linux系统盘或者数据盘。
- swap:Linux交换分区,不是完整系统盘,但也是Linux安装时创建的。
- LVM2_member:这种最麻烦,说明不是普通分区,而是LVM物理卷,后面有一节专门讲。
还有一个细节:Windows系统盘往往有多个分区,比如恢复分区、EFI分区、MSR(保留分区)、C盘。有些新电脑还有D盘恢复分区。要找到真正的数据分区,一般找容量最大的那个NTFS分区。如果你不确定,可以看 lsblk -f 里的LABEL列,Windows的C盘通常会有卷标(比如“系统”“Windows”或者留空)。
2.3 文件系统与内核支持自查
新版Linux内核(5.15以上)默认把NTFS读写的驱动 ntfs3 编进了内核模块,而exFAT的支持也早已进入内核主线。但很多发行版的最小化安装没有把这些模块拉进来,或者没有安装用户态工具,直接挂载会报 unknown filesystem type。
挂载之前可以先确认内核是否支持:
bash复制ls /lib/modules/$(uname -r)/kernel/fs/ | grep -E "ntfs|exfat"
modinfo ntfs3 exfat 2>/dev/null
如果没有对应的工具或模块,Debian/Ubuntu用 apt 装:
bash复制sudo apt install ntfs-3g exfat-fuse exfatprogs
CentOS/RHEL/Fedora系用 dnf:
bash复制sudo dnf install ntfs-3g exfatprogs
一句话总结:挂载之前,先看你手上有什么盘、什么分区、什么文件系统、内核缺什么。这个阶段花两分钟,后面能省两小时。
3. mount命令实操:临时挂载其实很简单
3.1 一条命令完成挂载的基础写法
临时挂载用 mount 就够了,基本格式:
bash复制sudo mkdir -p /mnt/data
sudo mount /dev/sdb2 /mnt/data
第一条命令是创建挂载点目录,名字随意,但目录必须存在。第二条命令把 /dev/sdb2 挂到 /mnt/data。挂载成功之后,你用 ls /mnt/data 就能看到盘里的内容了。
为什么先创建目录?因为Linux不允许把一个设备挂载到一个不存在的目录上,这是新手最容易忽略的一步。我见过有人直接 mount /dev/sdb1 不带第二个参数,结果系统打印一行Usage就结束了。
挂载成功后,可以用 df -h 或者 lsblk -f 确认:
bash复制df -h | grep /mnt/data
这里有个坑要注意:挂载点目录里如果有原来的文件,挂载之后会被“遮蔽住”。也就是说,你进入 /mnt/data 看到的是新挂载盘的内容,原目录里的文件并没有消失,只是暂时被挡住,卸载之后就回来了。所以挂载点尽量用空目录,别把系统某个正在使用的目录直接当成挂载点。
3.2 挂载Windows分区(NTFS/exFAT)的细节
Windows系统盘最常见的文件系统是NTFS,挂载命令有两种方式:
bash复制# 方式一:使用内核自带的ntfs3驱动(内核5.15+)
sudo mount -t ntfs3 /dev/sdb2 /mnt/win
# 方式二:使用经典的ntfs-3g用户态驱动
sudo mount -t ntfs-3g /dev/sdb2 /mnt/win
我实测下来,ntfs3 性能更好,写入速度稳定,在读写大文件时优势明显;ntfs-3g 兼容性更老道,尤其是遇到Windows那边没正常卸载、文件系统有脏标记的时候,ntfs-3g 处理得更稳妥。如果你两个都试了不放心,优先用 ntfs-3g。
exFAT的挂载更简单:
bash复制sudo mount -t exfat /dev/sdc1 /mnt/usb
这种U盘、移动硬盘最常见。exFAT没有NTFS那些权限和日志概念,挂载起来基本零问题。
这里要特别说一个Windows系统盘特有的现象:如果Windows开启了“快速启动”(默认开启),关机并不会完全关闭系统,而是进入休眠状态,NTFS分区会有脏标记。Linux挂载这种NTFS分区时,往往会以只读方式挂载,防止数据损坏。你执行 mount 的时候没报错,但写文件时就报 Read-only file system。解决办法是回到Windows里彻底关机(Shift+关机按钮),或者在Linux下用 ntfsfix 清一下脏标记:
bash复制sudo ntfsfix /dev/sdb2
注意,ntfsfix 只能处理一些简单的挂载标记问题,不能修复真正的文件系统损坏。遇到“Windows没正常关机导致的挂载失败”,可以先试试这个,不行再拿到Windows里做磁盘检查。
3.3 挂载其他Linux系统盘(ext4/xfs/btrfs)
另一块Linux系统盘的挂载其实比Windows盘还简单,因为它本身就是Linux的文件系统:
bash复制sudo mkdir -p /mnt/otherlinux
sudo mount /dev/sdc2 /mnt/otherlinux
如果不确定文件系统类型,可以不带 -t 参数,让内核自动识别。ext4、xfs、btrfs都是支持自动识别的。
挂载一块完整的Linux系统盘通常能看到这些目录:/etc、/home、/root、/usr、/var……这些就是彼Linux的根文件系统内容。想要修改那边的配置,比如改 /etc/ssh/sshd_config,直接编辑挂载后的文件就行,但要特别小心权限问题。用root挂载的话,写入的文件owner是root,挂回去原系统可能因为权限不对起不来。
我自己有个习惯:读别人系统盘里的配置时,尽量用只读挂载,防止手滑改错:
bash复制sudo mount -o ro /dev/sdc2 /mnt/otherlinux
3.4 只读挂载、强制卸载与权限控制
临时挂载场景里,几个高频选项值得背下来:
bash复制# 只读挂载
sudo mount -o ro /dev/sdb2 /mnt/win
# 指定uid/gid,让普通用户可读写(否则root挂载的NTFS盘,普通用户往往只能读)
sudo mount -o uid=1000,gid=1000,utf8 /dev/sdc1 /mnt/data
# 卸载
sudo umount /mnt/data
卸载的时候如果提示 target is busy,说明有进程还在这个目录里读写,最常见的是你当前shell的当前目录就停在挂载点里面。先 cd / 回到根目录,再试卸载。还不行就找是谁占着:
bash复制fuser -mv /mnt/data
fuser -mv 会列出占用该目录的进程PID和命令名。确认没问题的前提下可以用 sudo fuser -km /mnt/data 强制结束占用进程,然后再 umount。一般不建议直接 umount -l(懒惰卸载),因为这会儿可能还有进程在写数据,强制卸载容易造成数据损坏,Lazy卸载只适合确实找不到占用进程却又必须拔盘的极端情况。
4. 开机自动挂载:把 /etc/fstab 彻底讲透
4.1 fstab每列是干什么的
临时挂载重启就没了,对于长期要用的盘,比如从Windows双系统迁移过来的数据盘、服务器上常驻的备份盘,应该写在 /etc/fstab 里实现开机自动挂载。
/etc/fstab 每一行对应一个挂载项,共6列,用空格或Tab分隔:
text复制设备标识 挂载点 文件系统类型 挂载选项 dump pass
举两个实际例子:
bash复制# 挂载Windows C盘到 /mnt/win
UUID=8765DCBA8765DCBA /mnt/win ntfs-3g defaults,uid=1000,gid=1000,utf8,nofail 0 0
# 挂载另一块Linux的根分区到 /mnt/otherlinux
UUID=a1b2c3d4-... /mnt/otherlinux ext4 defaults,nofail 0 2
各列说明:
- 第一列:设备标识,强烈建议写UUID而不是
/dev/sdb2,原因下一节细说。 - 第二列:挂载点,必须是一个已经存在的目录。
- 第三列:文件系统类型,
ext4、xfs、ntfs-3g、exfat、vfat等都行。 - 第四列:挂载选项,
defaults表示 rw、suid、dev、exec、auto、nouser、async 的组合。常用的还有ro、noexec、nofail、utf8、uid=...。 - 第五列:是否备份,一般写0。
- 第六列:开机是否做fsck。
0不做;根分区写1;其他数据分区写2。如果你不确定,就都写0,别乱写,写错了可能导致开机卡住。
4.2 优先用UUID而不是设备名
为什么不用 /dev/sdb2?因为设备名是根据检测顺序动态分配的。你今天插着U盘开机,你的系统盘可能是 /dev/sda;明天U盘拔了,系统盘可能变成 /dev/sdb,原来的 /dev/sdb1 就可能指向另一个完全不同的盘。用UUID则不会变,只要分区本身不重新格式化,UUID就是固定的。
查看UUID用 blkid:
bash复制sudo blkid /dev/sdb2
然后把这个UUID复制到fstab第一列,格式是 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 或者NTFS那种 UUID=8765DCBA...。
4.3 挂载选项细节:defaults、nofail、x-systemd.device-timeout
fstab第四列的选项是重灾区,很多“开机卡在Waiting for device”的故障都来自这里。
defaults 很省事,但有个致命问题:如果fstab里写了某个设备,而这个设备在开机时候不存在,系统会一直等它,导致启动超时,甚至掉进emergency mode。移动硬盘、U盘这类不固定的设备,务必要加 nofail 选项:
text复制UUID=xxxx /mnt/backup ext4 defaults,nofail 0 2
加了 nofail,设备不在时系统会跳过这个挂载项,不会卡死启动流程。
还有一个面向systemd的选项,移动硬盘、冷备机械盘经常用:
text复制UUID=xxxx /mnt/backup ext4 defaults,nofail,x-systemd.device-timeout=10 0 2
x-systemd.device-timeout=10 表示最多等设备10秒,10秒等不到就跳过。这对USB外接硬盘尤其管用,因为USB设备枚举有时比较慢。
经常有人问Windows的NTFS盘要不要加 uid/gid。如果你是希望普通用户能直接读写,必须加。桌面版Linux通常还会让用户的uid是1000,所以写成:
text复制UUID=xxx /mnt/win ntfs-3g defaults,uid=1000,gid=1000,utf8,nofail 0 0
exFAT同理。
4.4 修改完fstab一定要先做这两步
每次改动 /etc/fstab,我强烈建议做两步验证,否则真的可能开不了机。
第一步,备份原文件:
bash复制sudo cp /etc/fstab /etc/fstab.bak
第二步,用 mount -a 测试配置是否有效:
bash复制sudo mount -a
mount -a 会按照fstab的配置把所有应挂载但还没挂载的设备全部挂载一遍。如果配置有错,当前这次操作就会报错,你可以在不重启的情况下及时改回来。
我还习惯故意用 mount -a 之后立刻 ls 一下挂载点,确认内容真的可见。因为fstab语法错误有时候不报错,但挂到空白目录上了,那种最难发现。
另外提一个高频需求:服务器上挂载NAS或者CIFS(Windows共享文件夹)也要走fstab,写法多一行 credentials 文件:
text复制//192.168.31.10/share /mnt/nas cifs credentials=/root/.smbcreds,uid=1000,gid=1000,nofail 0 0
其中 /root/.smbcreds 内容为:
text复制username=yourname
password=yourpass
这文件的权限要改成600,否则挂载可能拒绝读取密钥文件。
5. 高级场景:LVM、加密盘、嵌入式设备的特殊挂载
5.1 LVM逻辑卷盘怎么挂
服务器上很常见的LVM盘,直接 mount /dev/sdb2 是挂不上的。原因很简单:LVM的逻辑卷不是直接落在磁盘分区上,而是经过物理卷(PV)、卷组(VG)、逻辑卷(LV)三层抽象,挂载时要用的是 /dev/mapper/... 路径。
挂载LVM盘的标准流程:
bash复制# 1. 扫描所有磁盘上的物理卷
sudo pvscan
# 2. 激活卷组(关键步骤)
sudo vgchange -ay
# 3. 查看有哪些逻辑卷
sudo lvscan
执行完 vgchange -ay 之后,/dev/mapper/ 下会出现逻辑卷设备,比如 /dev/mapper/ubuntu--vg-root。接下来就能正常挂载了:
bash复制sudo mkdir -p /mnt/lvmroot
sudo mount /dev/mapper/ubuntu--vg-root /mnt/lvmroot
这里最容易踩的坑是:另一块Linux系统盘里的LVM卷组名和当前系统的卷组名冲突。如果两边都叫 ubuntu-vg,系统会自动把新的改成带后缀的名字,但也会导致识别混乱。更稳妥的办法是用 vgimportclone 或者在挂载前单独跑 vgchange -ay <vgname>,只激活你需要的卷组,别一股脑全激活。
如果提示找不到卷组,先确认盘里确实是LVM:
bash复制lsblk -f
FSTYPE 列显示 LVM2_member 的就是LVM物理卷。另外 PV 上可能没有LV,那就需要 vgcfgrestore 或者 pvck 去修复元数据了,这部分属于数据恢复范畴,操作风险高,最好在镜像备份后再动手。
5.2 LUKS加密盘和BitLocker加密盘
遇到加密盘,首先得知道加密方式。
LUKS盘在Linux下用 lsblk -f 看到的是 crypto_LUKS 类型。挂载前需要解密:
bash复制# 打开加密设备,映射成一个解密后的设备
sudo cryptsetup luksOpen /dev/sdb2 mydata
执行后会提示输入密码。成功后 /dev/mapper/mydata 出现了,这时候再 mount 这个映射设备:
bash复制sudo mount /dev/mapper/mydata /mnt/encrypted
用完以后先卸载再关闭映射:
bash复制sudo umount /mnt/encrypted
sudo cryptsetup luksClose mydata
如果是Windows的BitLocker加密盘,Linux不能直接挂载,得借助 dislocker 工具:
bash复制sudo apt install dislocker
sudo mkdir -p /mnt/bitlocker_key /mnt/bitlocker_mount
# 用恢复密钥文件解密
sudo dislocker -V /dev/sdb2 -r /mnt/bitlocker_key/ -- /mnt/bitlocker_mount
dislocker会把BitLocker盘解密后以虚拟文件系统形式呈现出来,你再去挂载底层 dislocker-file 那个文件:
bash复制sudo mount -o loop /mnt/bitlocker_mount/dislocker-file /mnt/win
这块操作容易把人绕晕,我的经验是:能不用命令行交互就别用,一定先把 -r 的解密结果跑通再继续。很多时候BitLocker盘挂载失败,都是因为恢复密钥格式不对,或者没有提供 -r 的目录。
5.3 开发板上挂载Ubuntu系统盘:从SD卡到NFS
标题里热搜提到“开发板挂载ubuntu”“玩外文游戏如何挂载汉化”“qt5.5.10 arm linux开发”,说明有一部分读者是在嵌入式开发板上折腾。嵌入式场景的挂载通常分两种。
第一种是挂载SD卡或eMMC里的系统分区。开发板的系统镜像做出来后,会分为boot分区(FAT32)和rootfs分区(ext4)。插上读卡器后:
bash复制lsblk -f
sudo mkdir -p /mnt/sd_boot /mnt/sd_root
sudo mount /dev/sdb1 /mnt/sd_boot
sudo mount /dev/sdb2 /mnt/sd_root
挂载rootfs以后,你就能直接改板子上的文件系统,比如往 /mnt/sd_root/etc/rc.local 写入开机脚本,或者直接把交叉编译结果拷到 /mnt/sd_root/usr/bin。这种方式非常常用,但要注意不要在这个目录里乱动权限,否则板子启动会异常。
第二种是NFS挂载,典型场景是开发板跑Linux,开发主机跑Ubuntu,板子上通过NFS挂载主机的目录,实现代码共享和根文件系统调试:
bash复制# 开发主机Ubuntu:安装nfs服务,编辑/etc/exports
sudo apt install nfs-kernel-server
# /etc/exports里加一行:
# /srv/ubuntu_nfs *(rw,sync,no_subtree_check,no_root_squash)
sudo systemctl restart nfs-kernel-server
# 开发板上挂载
mkdir -p /mnt/nfs
mount -t nfs 192.168.1.10:/srv/ubuntu_nfs /mnt/nfs
NFS挂载失败90%的原因是主机防火墙没放行2049端口,或者 /etc/exports 的权限参数设置不对。可以先用 showmount -e 192.168.1.10 测试主机导出了哪些目录。
5.4 系统盘更换、扩容与live环境挂载
热搜词里还有“系统盘更换”“统信系统可以给系统盘扩容吗”“再生龙备份linux系统怎么安装”“esxi挂载usb硬盘”这些,本质上都是同一个玩法:从Live CD启动,把原来系统盘挂载进来,然后做扩容、备份、恢复、修复配置。
最常见的一套流程,假设你是从U盘里的Ubuntu Live环境启动,要把原系统的根分区挂载起来做chroot修复:
bash复制lsblk -f
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
chroot进去之后,你执行的就是原来系统盘里的程序了(包括grub、update-initramfs这些),可以做引导修复、改密码、重装内核。系统盘扩容也是这个套路,先在Live环境下用 gparted 或者 fdisk 重新划分分区,扩展根分区。
这里我给个明确建议:绝不要在没有备份的情况下chroot去动别人的系统盘。 我见过太多因为chroot后误执行 grub-install 到错误磁盘、导致引导彻底损坏的情况。先想清楚你的目标盘是哪个,lsblk 多确认两遍再下手。
6. 挂载松不掉、乱码、重启丢失:问题排查实录
6.1 报错信息速查表
下面这张表是我自己整理的高频挂载报错,每条都实际碰到过,按照现象找原因最直接:
| 报错现象 | 大概率原因 | 处理思路 |
|---|---|---|
mount: unknown filesystem type 'ntfs' |
内核或用户态缺NTFS支持 | 安装 ntfs-3g,或改用 mount -t ntfs3 |
mount: unknown filesystem type 'exfat' |
缺exFAT工具 | 安装 exfat-fuse exfatprogs(Ubuntu/Debian) |
wrong fs type, bad option, bad superblock |
文件系统类型错误、分区损坏或者没有文件系统 | 先 blkid 确认类型,再用 fsck 检查 |
Device or resource busy |
挂载点被进程占用 | cd /,用 fuser -mv 找进程,再umount |
Read-only file system |
NTFS脏标记、物理只读开关、文件系统错误 | Windows彻底关机;ntfsfix;检查硬盘盒开关 |
utf8 导致文件名乱码 |
字符集参数没配对 | NTFS加 utf8,FAT32/vfat加 iocharset=utf8 或 codepage=437 |
mount: /mnt/xxx: mount point does not exist |
挂载点目录没创建 | mkdir -p /mnt/xxx |
failed to read last sector |
分区表或读取扇区异常 | 检查盘是否扩容过,fdisk -l 看分区表 |
| LVM卷组看不到 | 卷组未激活或VG冲突 | pvscan + vgchange -ay |
CIFS挂载提示 Permission denied |
凭据文件权限过高或凭据错误 | chmod 600 凭据文件,检查用户名密码 |
| 系统启动卡在fstab相关等待 | fstab里设备不存在且没写nofail | 启动进入紧急模式,修复fstab |
6.2 一个典型的“重启丢失”排查过程
有位朋友的电脑是Windows+Linux双系统,Linux装在第二块硬盘上。某天他给系统盘做了“更换”,把新硬盘插到原来的接口,原来的Linux盘变成了从盘。开机进Linux后,老系统盘里的数据不在预期位置,我用 df -h 一看,确实没挂载上。查fstab,里面写的是 UUID=... /data ext4 defaults 0 2,但 lsblk -f 里那块盘的UUID完全不匹配。
为什么?因为那块Linux系统盘的分区不是原来的分区,可能是他重装过系统、或者用DiskGenius处理过分区导致UUID变了。解决方式很简单:用 blkid 拿到新UUID,更新fstab,然后 mount -a。
这个案例给了一个教训:fstab里写UUID,并不意味着永远不出问题。凡是系统盘在别的机器上被重新分区、格式化、或者用第三方工具调整过分区,UUID就可能变化。 排查“重启丢失”问题,第一件事永远是 lsblk -f,而不是在fstab里瞎猜。
6.3 文件系统损坏与Secure Boot等特殊报错
挂载后的文件系统损坏,最常见的表现是挂载时直接报 bad superblock,或者挂载成功了但是一访问目录就出现I/O错误。这种时候能救就救,不能救就别硬操作:
bash复制# 先卸载
sudo umount /mnt/data
# 检查/修复ext4分区
sudo fsck.ext4 -f /dev/sdb2
# 检查NTFS分区
sudo ntfsfix /dev/sdc1
fsck的时候如果提示 Device or resource busy,一定先把所有占用解除,否则强制检查可能把文件系统搞坏。
还有一个跟挂载看着不搭边、但确实会拦住你的报错,就是开机时出现 invalid signature detected check secure boot policy。这个报错通常出现在主板开启Secure Boot、且系统加载了未签名内核模块(比如某些版本的ntfs3驱动、NVIDIA第三方驱动)的时候。Secure Boot会拒绝加载没有有效签名的模块,挂载自然就失败。解决办法有几个方向:
- 进BIOS临时关闭Secure Boot,测试确认是否这个原因;
- 用发行版官方签名的驱动模块;
- 使用支持签名的模块加载机制(比如DKMS签名的自己签)。
这个报错不是Linux挂载的“常规操作”,但它确实会出现在装了双系统、换了主板或者升级内核的用户身上,知道怎么排查比硬杠有价值。
6.4 乱码与U盘、光盘不自动挂载的问题
中文乱码的问题,常见于老旧的FAT32 U盘和没有正确设置挂载参数的环境。解决起来不复杂:
bash复制# vfat挂载加字符集参数
sudo mount -t vfat -o iocharset=utf8,codepage=437 /dev/sdc1 /mnt/usb
NTFS乱码多在单纯用 -t ntfs-3g 没带 utf8 选项时出现,加上即可。桌面环境自动挂载一般会正确设置字符集,手动挂载才需要自己操心。
至于“为什么我的UDF光盘不自动挂载”,则是另一个方向的问题:桌面环境下光驱插入了UDF格式的光盘,文件管理器没有自动弹出内容。检查一下系统有没有装 udftools,没有就装上:
bash复制sudo apt install udftools
再手动挂载:
bash复制sudo mount -t udf /dev/sr0 /mnt/cdrom
内核没有UDF支持的话,mount 会报 unknown filesystem type 'udf',那就去确认内核模块 udf.ko 是否被加载。
最后再分享一点个人经验
做Linux运维和嵌入式开发这么多年,挂载这块我最大的体会是:能不写fstab就别写,写了一定要加nofail。很多新手朋友图省事,看到教程就照着把设备名写进fstab,第二天开机直接卡在启动界面,原因是U盘拔了、移动硬盘没插、或者设备名变了。系统进不去,心态直接崩。
另一个习惯是:挂载Windows系统盘之前,先想想Windows是不是开了快速启动。如果你刚在Windows那边关机,拔盘插到Linux这边,NTFS分区很可能只读,这不是Linux的问题,是Windows在搞鬼。先回Windows彻底关机一次,或者在Linux里 ntfsfix 一下,能省很多怀疑人生的时间。
最后就是,如果你手头那块“其他系统盘”里有重要的数据,别一上来就修复、扩容、改配置。先做成镜像,或者在只读模式下确认数据能正常读取,再动手写操作。数据无价这句话,等盘丢了以后才能真正听懂。
