为什么在远程(通过 Fabric)执行时 mount -a 没有正确安装保险丝驱动器?

Jim*_*m D 3 fuse fabric s3fs

这是一个奇怪的错误,我不确定它来自哪里。这是我正在做的事情的快速总结。

我正在尝试使用 s3fs(FUSE over Amazon)将 FUSE 驱动器安装到运行 Ubuntu 10.10 的 Amazon EC2 实例。s3fs 是根据说明等从源代码编译的。我还在 /etc/fstab 中添加了一个条目,以便驱动器在启动时安装。这是/etc/fstab看起来的样子:

# /etc/fstab: static file system information.
# <file system>                                 <mount point>   <type>  <options>       <dump>  <pass>
proc                                            /proc           proc    nodev,noexec,nosuid 0       0
LABEL=uec-rootfs                                       /               ext4    defaults        0       0
/dev/sda2   /mnt    auto    defaults,nobootwait,comment=cloudconfig 0   2
/dev/sda3   none    swap    sw,comment=cloudconfig  0   0
s3fs#mybucket /mnt/s3/mybucket fuse default_acl=public-read,use_cache=/tmp,allow_other 0 0
Run Code Online (Sandbox Code Playgroud)

所以好消息是这很好用。重新启动时,连接正确安装。我也可以这样做:

$ sudo umount /mnt/s3/mybucket 
$ sudo mount -a
$ mountpoint /mnt/s3/mybucket 
/mnt/s3/mybucket is a mountpoint
Run Code Online (Sandbox Code Playgroud)

很棒,对吧?

那么问题来了。我正在使用 Fabric 来自动化构建和管理此实例的过程。我注意到在使用 Fabric 构建 s3fs 并设置挂载过程时收到此错误消息:

mountpoint: /mnt/s3/mybucket: Transport endpoint is not connected
Run Code Online (Sandbox Code Playgroud)

我将其隔离在问题中,并构建了一个重现问题的结构任务:

def remount_s3fs():
    sudo("mount -a")
Run Code Online (Sandbox Code Playgroud)

这样做:

[ec2-xx-xx-xx-xx.compute-1.amazonaws.com] Executing task 'remount_s3fs'
[ec2-xx-xx-xx-xx.compute-1.amazonaws.com] sudo: mount -a
Run Code Online (Sandbox Code Playgroud)

[是的,我确定在运行此任务之前将其卸载。] 当我使用挂载点检查挂载时,我得到:

$ mountpoint /mnt/s3/mybucket
mountpoint: /mnt/s3/mybucket: Transport endpoint is not connected

Done.
Run Code Online (Sandbox Code Playgroud)

但是如果我sudo mount -a在命令行上运行,它就可以工作。嗯。

这是 fab 任务的输出,这次是完全调试模式:

[ec2-xx-xx-xx-xx.compute-1.amazonaws.com] Executing task 'remount_s3fs'
[ec2-xx-xx-xx-xx.compute-1.amazonaws.com] sudo: sudo -S -p 'sudo password:'  /bin/bash -l -c "mount -a"
Run Code Online (Sandbox Code Playgroud)

再次,我得到那个传输端点未连接错误。我还尝试将运行的确切命令复制并粘贴到我的 ssh 会话(即sudo -S -p 'sudo password:' /bin/bash -l -c "mount -a")中,并且工作正常。

所以……那是我的问题。有任何想法吗?

Jim*_*m D 6

好吧,它的工作方式并不总是这样......在我提交这个问题时,一个昏暗的灯泡在我的脑海中熄灭了,我想起了一些关于 pty 终端 Fabric 使用时不时引起问题的事情。发现这是在 Fabric 文档中run()

您可以传递 pty=False 以放弃在远程端创建伪终端,以防出现某个伪终端导致相关命令出现问题。

好吧,如果我将sudo任务中的语句修改如下:

sudo("mount -a", pty=False)
Run Code Online (Sandbox Code Playgroud)

一切正常。