一、挂载基础概念
大家好,我是老张。做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目录树中。根目录 / 本身也是一个挂载点,它挂载的是系统盘。
我的经验:排查挂载问题时,先用 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
好了,挂载的基础概念就聊到这里。记住三个核心:挂载是连接设备和目录的桥梁,文件系统决定了数据的组织方式,启动挂载分三个阶段进行。这些是后续排查问题的基石。