Mount Slient Error

背景

正在使用的测试机器上有一个块设备/dev/nvme0n1,之前一直挂载在/disk1这个目录下的。使用mkfs对这个块设备重新格式化之后,执行mount命令想再次挂载到/disk1这个目录下,命令调用成功,没有任何报错,但是从结果来看,并没有挂载成功,然而挂载到/tmp/whatever-other-dir却是可以成功的。

过程

搜索及其它

按照惯例,先G了一遍mount not return err,并没有合适的结果。
然后分别stracemount成功和失败的操作:

1
2
sudo strace mount -t ext4 /dev/nvme0n1 /tmp/whatever-other-dir > tmp.mount.rslt 2>&1
sudo strace mount -t ext4 /dev/nvme0n1 /disk1 > disk1.mount.rslt 2>&1

结果上基本看不出什么分别。

对比检查

找到了一台相同配置,但是没有做过mkfs的机器,对比检查两台机器配置的差异。fdisk发现:

1
2
3
4
$sudo fdisk -l /dev/nvme0n1
Device Boot Start End Blocks Id System
/dev/nvme0n1p1 ... ... ... .. Linux

这个块设备是有分区的,于是在/dev/nvme0n1上创建了分区/dev/nvme0n1p1,再次尝试挂载到/disk1上,依然不对。

变量分析

事实上,只要不是挂载到/disk1,挂载到其它几乎任何目录都是可以的。那么/disk1这个目录有什么特别的呢?从/etc/fstab的内容中可以看到:

1
2
3
4
5
$cat /etc/fstab
LABEL=/boot /boot ext4 defaults 1 2
LABEL=/ / ext4 defaults 1 1
...
LABEL=disk1 /disk1 ext4 defaults,noatime 0 0

使用e2label/dev/nvme0n1打上标签disk1之后:

1
sudo e2label /dev/nvme0n1 disk1

再次进行mount,终于成功了。

诡异的事情

本以为一切现象都已经解释通了。

我尝试给/dev/nvme0n1打上一个错误的标签disk2,试图mount/disk1,并且成功了。自此之后,/disk1仿佛失去了 /etc/fstab的封印:

  • 即使/dev/nvme0n1没有了标签,也一样能mount/disk1
  • sudo e2label /dev/nvme0n1 disk1之后,/dev/nvme0n1不会再被自动mount/disk1上了

好吧,之前的错误已经无法被重现了:)

最后

真是一次失败的排查记录啊,我不得不遗憾地说明,我已经无法重现在写这篇博客时候的错误了,在我调用了几次e2label之后。不过,很幸运地是,我解决了我想解决的问题,终于把设备挂载到/disk1上了。如果以后有人碰巧和我遇到了一样的问题,但愿这篇文章能帮助到他。

参考