一、挂载基础概念

大家好,我是老张。做Linux运维十几年了,每次遇到启动挂载失败的问题,我都会想起刚入行时那个加班的深夜。说实话,挂载这个概念,说简单也简单,说复杂,它能让你折腾一整天。今天咱们就来聊聊挂载的基础,把地基打牢。

1.1 什么是挂载?

挂载(Mount),说白了就是把一个存储设备“接”到Linux文件系统树上的过程。你想想看,Linux里一切皆文件,硬盘、U盘、光盘,甚至内存,都得通过挂载才能被访问。

我个人习惯把挂载理解成“贴标签”。比如你买了个新硬盘,它本身只是一堆电子元件。你把它挂载到 /data 目录下,那以后往 /data 里写东西,实际上就是往这块硬盘里写。

核心要点:挂载前,设备不可见;挂载后,设备通过挂载点被访问。

举个例子,你插入一个U盘:

# 查看系统识别的设备
lsblk
# 输出类似:
# sdb      8:16   1  14.9G  0 disk 
# └─sdb1   8:17   1  14.9G  0 part 

# 手动挂载U盘到 /mnt/usb
mount /dev/sdb1 /mnt/usb

# 挂载后,访问 /mnt/usb 就是访问U盘
ls /mnt/usb

嗯,这里要注意:挂载点必须是一个空目录。如果你挂载到一个有文件的目录,原来的文件会被“隐藏”掉,直到卸载后才重新出现。我曾经有个同事,把硬盘挂载到了 /home,结果用户数据全“消失”了,吓得脸都白了。其实数据没丢,只是被覆盖了而已。

1.2 文件系统与挂载点的关系

文件系统,就是存储设备上数据的组织方式。Linux支持很多种:ext4、xfs、btrfs、ntfs等等。挂载点,则是文件系统在Linux目录树中的入口。

它们的关系,我画了张图,你看一眼就明白了:

文件系统与挂载点关系图 Linux 目录树 / (根目录) /home /var /data 挂载点 存储设备 /dev/sda ext4 文件系统 挂载到 / /dev/sdb xfs 文件系统 挂载到 /data /dev/sdc1 vfat 文件系统 挂载到 /mnt/usb 每个设备有独立的文件系统 通过挂载点接入目录树

从图上你能看到:每个存储设备都有自己的文件系统格式,通过挂载点“接入”到Linux目录树中。根目录 / 本身也是一个挂载点,它挂载的是系统盘。

我的经验:排查挂载问题时,先用 df -hT 查看当前挂载情况,再用 lsblk -f 看设备文件系统类型。这两个命令能解决80%的疑惑。

1.3 Linux启动流程中的挂载环节

启动挂载失败,是很多运维的噩梦。要理解它为什么失败,得先知道启动时挂载是怎么一步步发生的。

我总结了一下,Linux启动中的挂载大致分三个阶段:

阶段 执行者 挂载内容 配置文件
第一阶段 initramfs 挂载根文件系统(/) 内核参数、initramfs内脚本
第二阶段 systemd(或init) 挂载虚拟文件系统(/proc、/sys、/dev等) 内核自动挂载 + systemd单元
第三阶段 systemd 挂载/etc/fstab中定义的设备 /etc/fstab

第一阶段:initramfs 挂载根文件系统

内核启动后,首先加载 initramfs(初始内存文件系统)。它是个迷你系统,包含了必要的驱动和工具。它的任务只有一个:找到真正的根文件系统并挂载它。

为什么会这样?因为内核本身不认识硬盘上的文件系统,它需要驱动。而驱动又存在文件系统里...这就成了“先有鸡还是先有蛋”的问题。initramfs 就是用来打破这个死循环的。

# 查看当前系统的 initramfs 内容(以CentOS为例)
lsinitrd /boot/initramfs-$(uname -r).img | grep -E "mount|fstab"

第二阶段:挂载虚拟文件系统

根文件系统挂载成功后,系统会切换到真正的根环境。接着挂载 /proc、/sys、/dev、/run 这些虚拟文件系统。它们不占用磁盘空间,是内核与用户空间通信的接口。

注意:这些虚拟文件系统如果挂载失败,系统虽然能启动,但很多命令会报错。比如 /proc 没挂载,ps、top 就用不了。

第三阶段:挂载 /etc/fstab

这是最关键的环节,也是故障高发区。/etc/fstab 文件定义了系统启动时需要自动挂载的所有设备。

一个典型的 fstab 条目长这样:

# 设备       挂载点      文件系统  选项       dump  fsck
/dev/sda1    /           ext4     defaults   0     1
/dev/sdb1    /data       xfs      defaults   0     2
UUID=abc123  /backup     ext4     nofail     0     2
//192.168.1.100/share  /mnt/nfs  nfs  defaults,_netdev  0  0

每一列的含义:

  • 设备:可以是设备路径(/dev/sda1),也可以是UUID或LABEL
  • 挂载点:挂载到哪个目录
  • 文件系统:ext4、xfs、nfs等
  • 选项:defaults、noatime、nofail等
  • dump:是否备份(0表示不备份)
  • fsck:开机检查顺序(1为根,2为其他,0为不检查)

避坑指南:我曾经遇到一个案例,某台服务器重启后起不来了。排查了半天,发现是 fstab 里写了一个不存在的UUID。系统在挂载时找不到设备,卡在了那里。从那以后,我改 fstab 前都会先执行 blkid 确认UUID,改完后用 mount -a 测试一遍。

启动时,systemd 会按顺序处理 fstab 中的条目。如果某个挂载失败,默认行为是进入 emergency mode(紧急模式),让你手动修复。这也是为什么启动挂载失败时,你会看到类似这样的提示:

Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" to try again
to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

嗯,这时候别慌。输入 root 密码进入系统,先看日志:

journalctl -xb | grep -i "mount\|fstab\|failed"

通常日志里会直接告诉你哪个设备挂载失败了,原因是什么。可能是设备不存在、文件系统损坏、或者网络不通(对于NFS挂载)。

我个人习惯是,先检查 fstab 的语法:

# 检查 fstab 语法
findmnt --verify

# 或者手动尝试挂载所有条目
mount -a -v

这两个命令能快速定位问题。如果 mount -a 报错,它会明确告诉你哪一行出了问题。

小技巧:对于非关键的数据盘,可以在 fstab 的选项列加上 nofail。这样即使挂载失败,系统也不会进入紧急模式,而是跳过继续启动。比如:UUID=xxx /data ext4 defaults,nofail 0 2

好了,挂载的基础概念就聊到这里。记住三个核心:挂载是连接设备和目录的桥梁,文件系统决定了数据的组织方式,启动挂载分三个阶段进行。这些是后续排查问题的基石。

可可精品资料库