为什么 mount 对我来说无声无息地失败了?

yur*_*mix 6 filesystems ext4 mount

我正在尝试安装设备但没有成功。奇怪的是mount命令成功,返回退出码0,但是设备并没有挂载。关于为什么会发生这种情况或如何进行调查的任何想法?请看下面的例子:

[root@mymachine ~]# blkid -o list
device         fs_type  label     mount point        UUID
-----------------------------------------------------------------------------------------
/dev/xvda1     xfs                /                  29342a0b-e20f-4676-9ecf-dfdf02ef6683
/dev/xvdy      ext4               /vols/data         72c23c30-2704-42ec-9518-533c182e2b22
/dev/xvdb      swap               <swap>             990ff722-158c-4ad5-963a-0bc9e1e2b17a
/dev/xvdx      ext4               (not mounted)      956b5553-d8b4-4ffe-830c-253e1cb10a2f
[root@mymachine ~]# grep /dev/xvdx /etc/fstab
/dev/xvdx /vols/data5 ext4 defaults 0 0
[root@mymachine ~]# mount -a; echo $?
0
[root@mymachine ~]# blkid -o list
device         fs_type  label     mount point        UUID
-----------------------------------------------------------------------------------------
/dev/xvda1     xfs                /                  29342a0b-e20f-4676-9ecf-dfdf02ef6683
/dev/xvdy      ext4               /vols/data         72c23c30-2704-42ec-9518-533c182e2b22
/dev/xvdb      swap               <swap>             990ff722-158c-4ad5-963a-0bc9e1e2b17a
/dev/xvdx      ext4               (not mounted)      956b5553-d8b4-4ffe-830c-253e1cb10a2f
[root@mymachine ~]# mount /dev/xvdx /vols/data5; echo $?
0
[root@mymachine ~]# blkid -o list
device         fs_type  label     mount point        UUID
-----------------------------------------------------------------------------------------
/dev/xvda1     xfs                /                  29342a0b-e20f-4676-9ecf-dfdf02ef6683
/dev/xvdy      ext4               /vols/data         72c23c30-2704-42ec-9518-533c182e2b22
/dev/xvdb      swap               <swap>             990ff722-158c-4ad5-963a-0bc9e1e2b17a
/dev/xvdx      ext4               (not mounted)      956b5553-d8b4-4ffe-830c-253e1cb10a2f
[root@mymachine ~]#
Run Code Online (Sandbox Code Playgroud)

完整的 fstab:

[root@mymachine ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Mon May  1 18:59:01 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=29342a0b-e20f-4676-9ecf-dfdf02ef6683 /                       xfs     defaults        0 0
/dev/xvdb swap swap defaults,nofail 0 0
/dev/xvdy /vols/data ext4 defaults 0 0
/dev/xvdx /vols/data5 ext4 defaults 0 0
Run Code Online (Sandbox Code Playgroud)

Ral*_*edl 10

如果出现问题,通常 mount 不会返回 0。当我遇到类似问题时,原因是systemd在挂载后立即卸载了文件系统。

您可以尝试strace mount /dev/xvdx /vols/data5查看系统调用的结果。您还可以尝试mount /dev/xvdx /vols/data5; ls -li /vols/data5在 mount 命令之后立即查看是否安装了某些内容。

  • @yurmix 那几乎可以肯定是 systemd。开发人员似乎认为他们比实际用户更了解,因此它会自动卸载定义了挂载单元的任何东西,但它认为该单元所需的设备尚未准备好。 (4认同)
  • 开发人员多年来一直知道这个问题 https://github.com/systemd/systemd/issues/1741 (2认同)

Rod*_*ney 9

除了已接受的答案之外,该答案指出某些东西(可能是 systemd)正在卸载文件系统 - 让我更详细地解释我的案例中发生的情况。

正如journalctl所示,它确实是systemd。

在我的场景中,我的 fstab 中有这个

/dev/sda6 /fasthome           ext4    defaults        0       2
/dev/sda7 /mnt/vms  ext4 defaults 0 2
Run Code Online (Sandbox Code Playgroud)

(fasthome,如果您想知道是一个无需加密即可执行磁盘密集型操作的地方)。

因此,当我插入外部 USB 驱动器启动时,它变成了 sda,而我的内部驱动器变成了 sdb。显然这些挂载点不起作用,所以我更正它们如下:

/dev/disk/by-uuid/<some uuid> /fasthome ext4 defaults 0 2
/dev/disk/by-uuid/<other uuid> /mnt/vms ext4 defaults 0 2
Run Code Online (Sandbox Code Playgroud)

然后我运行mount -a并且命令完成,没有错误,但似乎它们没有安装。所以我尝试mount /dev/disk/by-uuid ...同样的事情,最后我提出了这个问题。

是的,它是 systemd 卸载它们的,在我的例子中,这是因为之前 /fasthome尝试安装到/dev/sda6,systemd 全部挂在该非活动设备上。因此,尽管我的 uuid 路径符号链接正确指向/dev/sdb6systemd,但不喜欢这里发生的情况。

在这种特殊情况下,答案很简单,就是重新启动,这样错误的设备引用就消失了。

我确信有 1001 种相似但不同的情况可能会导致这个问题,希望这里的细节能为人们提供足够多的线索来了解他们的具体情况。