4、日志分析方法:dmesg、journalctl、/var/log/messages 中的挂载相关日志

大家好,我是老李。做Linux系统运维这些年,我最大的体会就是:日志是系统留给我们的最后一张底牌。启动挂载失败,说白了就是系统在启动时没找到它想要的东西——要么设备没准备好,要么文件系统坏了,要么配置写错了。

那怎么查?三个工具:dmesg、journalctl、/var/log/messages。今天我就把这几个家伙怎么用、怎么看、怎么定位问题,掰开了讲清楚。

核心思路:挂载失败时,系统一定会报错。日志就是错误的第一现场。你只要知道去哪找、怎么过滤,问题就解决了一半。

4.1 dmesg:内核的“实时监控”

dmesg 是内核日志的环形缓冲区。说白了,它记录的是内核启动以来所有的“大事小情”——包括硬件检测、驱动加载、文件系统挂载。我个人习惯,遇到挂载问题,第一个命令就是 dmesg | grep -i mount。

为什么?因为挂载操作最终是由内核完成的。用户空间的 mount 命令只是发了个请求,真正干活的是内核。内核干没干成,都会在 dmesg 里留下痕迹。

常用过滤命令

# 查看所有挂载相关日志
dmesg | grep -i mount

# 查看文件系统错误
dmesg | grep -i "ext4\|xfs\|btrfs\|ntfs"

# 查看块设备状态
dmesg | grep -i "sda\|sdb\|nvme"

# 查看超时或I/O错误
dmesg | grep -i "timeout\|error\|fail"

我在项目中遇到过一台服务器,重启后 /data 分区死活挂不上。用 dmesg | tail -50 一看,最后几行写着:

[    3.456789] EXT4-fs (sdb1): INFO: recovery required on readonly filesystem
[    3.456812] EXT4-fs (sdb1): write access unavailable, cannot proceed

嗯,看到没?文件系统需要恢复,但因为是只读挂载,没法写日志。这就是典型的“非正常关机后,文件系统标记为 dirty,需要 fsck”。

小技巧: dmesg -T 可以把时间戳转成人类可读的时间格式。不过要注意,有些老版本内核不支持这个参数。

4.2 journalctl:systemd 时代的“全能日志”

现在大部分发行版都用 systemd 了。journalctl 就是 systemd 的日志管理工具。它比 dmesg 更全面——不仅包含内核日志,还包含用户空间的服务日志、应用日志。

我个人觉得,journalctl 最大的好处是:可以按时间、按服务、按优先级过滤。你想想看,启动挂载失败,肯定是发生在启动阶段。那我们就只看启动时的日志。

常用命令

# 查看本次启动的所有日志
journalctl -b

# 查看上一次启动的日志(如果这次起不来)
journalctl -b -1

# 只看挂载相关的服务
journalctl -u systemd-fsck@.service
journalctl -u local-fs.target

# 只看错误级别以上的日志
journalctl -p err -b

# 实时跟踪日志(类似 tail -f)
journalctl -f

有一次,一个同事说服务器重启后 /home 分区没挂上。我让他跑 journalctl -u home.mount -b,结果输出是:

-- Unit home.mount has failed
-- Mount process exited with code 32
-- mount: /home: wrong fs type, bad option, bad superblock on /dev/sdc1

看到“wrong fs type”了吗?这就是典型的 /etc/fstab 里文件系统类型写错了。比如实际是 ext4,你写成了 xfs。

注意: journalctl 默认只保留最近几次启动的日志。如果系统重启次数太多,旧日志会被覆盖。我建议你设置 SystemMaxUse=500M 来增大日志容量。

4.3 /var/log/messages:传统但可靠

虽然 journalctl 很强大,但 /var/log/messages 依然是我排查问题时必看的文件。为什么?因为它是一个纯文本文件,用 grep、awk、sed 随便处理,非常灵活。

而且,有些老系统(比如 CentOS 6)没有 systemd,只能用 /var/log/messages。你想想看,如果你接手一个跑了十年的老服务器,不会用这个文件怎么行?

常用命令

# 查看挂载相关日志
grep -i mount /var/log/messages

# 查看文件系统错误
grep -i "ext4\|xfs\|btrfs" /var/log/messages

# 查看磁盘错误
grep -i "sda\|sdb\|I/O error" /var/log/messages

# 查看最近10条日志
tail -10 /var/log/messages

我曾经遇到一个案例:服务器启动时 /var 分区挂载失败,导致系统进入 emergency mode。用 grep -i "var" /var/log/messages 一看,发现日志里反复出现:

Feb 15 10:23:45 server kernel: EXT4-fs (sda3): VFS: Can't find ext4 filesystem
Feb 15 10:23:45 server kernel: EXT4-fs (sda3): VFS: Can't find ext4 filesystem

嗯,这说明 /dev/sda3 上根本就不是 ext4 文件系统。后来查出来是磁盘分区表被误改了,分区类型变成了 0x83(Linux),但实际内容是 LVM 的 PV。

避坑指南: 我曾经因为 /var/log/messages 被日志轮转覆盖了,导致查不到历史记录。后来我养成了一个习惯:遇到问题先备份日志。命令很简单:cp /var/log/messages /var/log/messages.bak.$(date +%Y%m%d)

4.4 三种日志的对比与选择

工具 适用场景 优点 缺点
dmesg 内核级问题(驱动、硬件、文件系统) 实时、简洁、直接 只保留内核日志,不包含用户空间
journalctl systemd 服务、应用日志 功能全面、过滤强大 日志可能被轮转覆盖
/var/log/messages 传统系统、通用排查 纯文本、易处理、历史久 文件可能很大,搜索慢

我个人习惯是:先用 dmesg 看内核有没有报错,再用 journalctl 看服务状态,最后用 /var/log/messages 做交叉验证。三个工具配合使用,基本没有查不到的挂载问题。

4.5 实战:一个完整的排查流程

假设你遇到一个场景:服务器重启后,某个分区没挂上。你会怎么做?

  1. 第一步:确认现象
    df -h 看看哪个分区没挂上。比如 /data 不见了。
  2. 第二步:查 dmesg
    dmesg | grep -i "data\|mount\|error" 看看内核有没有报错。
  3. 第三步:查 journalctl
    journalctl -u data.mount -b 看看挂载服务的具体错误。
  4. 第四步:查 /var/log/messages
    grep -i "data\|mount" /var/log/messages | tail -20 看看有没有更多上下文。
  5. 第五步:检查 /etc/fstab
    cat /etc/fstab 看看配置有没有写错。
  6. 第六步:手动尝试挂载
    mount /dev/sdb1 /data 看看报什么错。

这个流程我用了十年,从来没失手过。你想想看,日志就是系统的“黑匣子”,只要你会读,问题就藏不住。

最后说一句: 别怕日志多。用 grep 过滤、用 tail 看最后几行、用 less 翻页。慢慢你就发现,日志其实很有规律。看多了,一眼就能看出问题在哪。

挂载失败日志排查流程图 挂载失败 第一步:确认现象(df -h) 第二步:dmesg 查内核日志 第三步:journalctl 查服务日志 第四步:/var/log/messages 交叉验证 定位问题 关键过滤词 • mount • error / fail • ext4 / xfs / btrfs • sda / sdb / nvme • timeout • I/O error • superblock • fsck • read-only • wrong fs type • bad option

这张图就是我平时排查挂载问题的标准流程。从上到下,一步接一步。你只要照着做,90% 的问题都能在 5 分钟内定位到。

好了,关于日志分析的方法就讲到这里。记住:日志不会骗人,骗人的是你没看对地方。下次遇到挂载失败,别慌,先打开这三个日志文件看看。