挂载是什么
在Windows系统里插入一块新硬盘或者U盘,系统会自动分配一个盘符,比如D盘、E盘。但在Linux里事情不太一样。Linux把所有的文件和设备都组织在一个树形目录下,要让新硬盘上的文件系统可以被访问,需要挂载(mount)到一个目录上。简单来说,mount就是"把存储设备绑定到一个目录,让用户可以访问设备上的文件"。
这个小系列前面两篇文章讲了怎么用 lsblk/blkid 查看磁盘信息、用 fdisk/parted 创建分区和格式化。现在最后一步来了:怎么把分好格式化的磁盘挂载到系统里正常使用?以及怎么设置开机自动挂载,让重启后依然能用?
mount基本挂载
手动挂载一个分区
假设我们已经给 /dev/sdb1 创建了ext4文件系统,现在要把它挂载到 /data 目录。
# 创建挂载点目录
sudo mkdir -p /data
# 挂载分区到目录
sudo mount /dev/sdb1 /data
# 验证挂载结果
df -h /data
这里 mount 命令会自动检测 /dev/sdb1 的文件系统类型(ext4)。输出可以看到容量、已用空间和挂载点等信息。
如果系统不能自动检测文件系统(比如某些比较特殊的文件系统),可以手动指定类型:
# 手动指定文件系统类型为 ext4
sudo mount -t ext4 /dev/sdb1 /data
# 挂载 XFS 文件系统
sudo mount -t xfs /dev/sdc1 /mnt/storage
但在绝大多数场景下,Linux内核都能自动识别文件系统,不需要手动加 -t 参数。
使用mount -o选项
-o 参数是mount中最灵活也最需要注意的部分。它允许你指定挂载后的各种行为特性。
# 以读写模式挂载(默认就是读写,显式写出来更清晰)
sudo mount -o rw /dev/sdb1 /data
# 以只读模式挂载(防止数据意外写入或修改)
sudo mount -o ro /dev/sdb1 /data
# 禁止执行该分区上的任何二进制程序(安全场景常用)
sudo mount -o noexec /dev/sdb1 /data
# 禁止设置SUID(Set User ID,允许普通用户以文件所有者的权限执行程序)
# 挂载外部存储时建议加上
sudo mount -o nosuid /dev/sdb1 /data
# 组合多个选项用逗号分隔
sudo mount -o rw,noexec,nosuid /dev/sdb1 /data
noexec 这个选项在防范安全风险时很有用。比如挂载临时目录或用户上传文件的目录时,加上 noexec 可以防止有人在该目录下执行恶意脚本。但要注意,如果分区上有需要执行的程序或脚本,加了 noexec 后就跑不起来了。
查看当前挂载情况
# 查看所有已挂载的文件系统
mount
# 用 df 查看磁盘使用情况
df -h
# 查看特定类型的文件系统
df -h -t ext4
mount 命令不加参数会列出所有挂载信息。但信息量比较大,通常用 df -h 更直观一些。
umount卸载分区
卸载也是一个高频操作。比如拔出U盘或移动硬盘前,应该先卸载。
# 通过挂载点卸载
sudo umount /data
# 通过设备文件卸载
sudo umount /dev/sdb1
卸载时最常见的错误就是 "target is busy"(目标忙),说明有进程正在使用这个挂载点上的文件。
# 查看哪些进程在使用该挂载点(找出肇事进程)
fuser -m /data
# 强制终结使用该挂载点的所有进程
fuser -km /data
# 强制卸载(慎用,可能导致数据丢失)
sudo umount -f /data
# 懒惰卸载(等所有进程都释放后再卸载)
sudo umount -l /data
我的建议是先用 fuser -m 查到是哪个进程占用了挂载点,确认该进程可以安全停止后再做处理。不要一上来就 umount -f 或 umount -l,强制卸载可能会导致正在写的数据丢失。
发现U盘无法卸载时,先看看终端是不是在那个目录里。
# 常见的 "target is busy" 原因:当前shell就在 /data 目录里
# 先 cd 到其他目录再卸载
cd /
sudo umount /data
有一个我刚入行时犯过的错:SSH登录到服务器后执行了 cd /mnt/backup,然后在另一个终端里执行 umount /mnt/backup,一直报busy。搞了十分钟才发现自己当前目录就是挂载点。换了目录之后再卸载就成功了,非常尴尬但记忆深刻。
/etc/fstab详解
fstab(File System Table,文件系统表)是Linux系统中最重要的配置文件之一。系统在启动时会读取这个文件,按照里面的描述自动挂载指定的文件系统。
先看一下fstab文件的格式:
# 查看当前系统的 fstab
cat /etc/fstab
每一行的格式如下:
<设备标识> <挂载点> <文件系统类型> <挂载选项> <dump备份标记> <fsck检查顺序>
下面用一个具体例子来解释每一列:
UUID=a1b2c3d4 / ext4 defaults 0 1
UUID=e5f6a7b8 /home ext4 defaults 0 2
UUID=c9d0e1f2 /data ext4 defaults 0 2
UUID=abcd1234 none swap sw 0 0
/dev/cdrom /mnt/cdrom auto noauto 0 0
第一列:设备标识。推荐使用UUID(前几篇文章强调过),因为设备名可能会变。也可以用 /dev/sdb1 这种设备文件路径,但不推荐。
第二列:挂载点。根分区必须是 /,其他分区就写你想挂载到的目录路径。
第三列:文件系统类型。ext4、xfs、vfat、ntfs、swap等。auto表示自动检测。
第四列:挂载选项。defaults 代表 rw,suid,dev,exec,auto,nouser,async 这些默认组合。常用选项包括:
- rw:读写模式
- ro:只读模式
- noexec:禁止执行程序
- nosuid:禁止SUID
- noatime:不更新文件访问时间,可以减少磁盘写入
- auto 或 noauto:是否在启动时自动挂载
- nofail:挂载失败不阻止系统启动
第五列:dump备份标记。0表示不备份,1表示需要备份。现在基本都用0。
第六列:fsck检查顺序。0表示不检查,1表示根分区(最先检查),2表示其他分区。
添加新硬盘到fstab
延续前三篇文章的案例,为新分区 /dev/sdb1 添加开机自动挂载:
# 第一步:获取新分区的UUID
sudo blkid /dev/sdb1 -o value -s UUID
# 假设输出为: f0e1d2c3-b4a5-6789-0abc-def012345678
# 第二步:备份fstab
sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)
# 第三步:编辑fstab
sudo nano /etc/fstab
# 在文件末尾添加一行:
# UUID=f0e1d2c3-b4a5-6789-0abc-def012345678 /data ext4 defaults 0 2
# 第四步:测试挂载(不需要重启!)
sudo mount -a
# 第五步:验证挂载成功
df -h /data
mount -a 的意思是重新读取 /etc/fstab 中的所有未挂载的文件系统并逐一挂载。这是个非常重要的测试步骤,它能在重启之前验证fstab的配置是否正确。如果 mount -a 报错了,马上修正fstab即可,不会影响正在运行的系统。
但如果重启了才发现fstab写错,系统可能会卡在启动阶段或进入emergency mode(紧急模式)。这时候需要用救援模式或者单用户模式进入系统,手动修改fstab。
挂载失败排查
挂载失败的原因各种各样。这里列出最常遇到的几个场景和解决方法。
场景一:挂载点不存在
# 挂载时报错:mount point /data does not exist
# 解决方案:创建目录
sudo mkdir -p /data
sudo mount /dev/sdb1 /data
场景二:文件系统需要修复
# 报错信息中包含 "mount: wrong fs type" 或 "you must specify the filesystem type"
# 或者 "mount: /dev/sdb1: can't read superblock"
# 先检查文件系统是否损坏
sudo fsck /dev/sdb1
# 或者强制检查修复(-f 强制检查,-y 自动回答yes)
sudo fsck -f -y /dev/sdb1
fsck(File System Consistency Check,文件系统一致性检查)是修复文件系统损坏的工具。但在已挂载的分区上运行fsck可能会造成更大损坏。正确的做法是先用 umount 卸载。
如果根分区损坏导致无法启动,需要从Live CD/U盘启动后进行修复。
场景三:fstab配置导致启动卡住
如果fstab中有配置错误的分区,系统启动时可能会超时等待,或进入维护模式。
# 在 emergency mode 或 rescue mode 下操作
# 查看启动时哪个挂载点出错了
journalctl -xe | grep mount
# 编辑 fstab,把出错的行的 "defaults" 改成 "defaults,nofail"
# nofail 表示挂载失败也不阻止系统继续启动
这个 nofail 选项很实用。比如你有一个外挂存储设备不是每次都连接的,加上 nofail 就能保证即使设备不在线系统也能正常启动。
场景四:NTFS(Windows文件系统)分区无法挂载
# 安装 ntfs-3g 包
sudo apt install ntfs-3g
# 挂载 NTFS 分区
sudo mount -t ntfs-3g /dev/sdb1 /mnt/windows
安全提醒
第一,修改 /etc/fstab 之前一定要备份。我自己的习惯是把备份命名为 /etc/fstab.bak.20260727 这种格式,日期清晰,恢复时不会搞混。
第二,mount -a 是验证fstab正确性的黄金操作。编辑完fstab后,在重启之前一定跑一次 mount -a 测试无误。
第三,不要在已经挂载的分区上执行 fsck。运行 df -h 确认分区没有被挂载,再用 umount 卸载后再检查。
第四,umount -f 强制卸载时要注意:正在写入的数据会被丢弃。如果一个分区上有应用程序在运行时写文件,强制卸载可能导致数据损坏或应用崩溃。
第五,挂载外部存储设备(U盘、移动硬盘)后,使用完一定要 umount 再拔出。不卸载直接拔可能会导致文件系统损坏。
第六,尽量不要在生产服务器上使用 mount -t auto 或者fstab中的 auto 文件系统类型。明确指定文件系统类型可以避免一些自动识别方面的意外。
总结
mount的使用并不复杂,核心操作就是 mount 挂载和 umount 卸载。真正容易出错的是fstab的配置。记住三个要点:用UUID不用设备名、加 nofail 保护系统启动、改完必测 mount -a。做到这三点,fstab相关的故障基本都能避免。
结合前两篇文章,你现在已经掌握了从查看磁盘、分区、格式化到挂载、自动挂载的全部技能。这三篇合起来,就是Linux磁盘管理的完整知识体系。
相关阅读
- ·
man mount:mount命令的完整参数和选项 - ·
man umount:卸载操作的详细说明 - ·
man fstab:fstab配置文件格式的官方规范 - ·
man 5 fsck:文件系统检查工具的使用方法