为什么 mount -a 在远程执行(通过 Fabric)时无法正确安装 fuse 驱动器?

为什么 mount -a 在远程执行(通过 Fabric)时无法正确安装 fuse 驱动器?

这是一个奇怪的错误,我不知道它从何而来。下面简要介绍一下我正在做的事情。

我正在尝试使用 s3fs(Amazon 上的 FUSE)将 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

好消息是,这可以正常工作。重新启动后,连接正确挂载。我还可以这样做:

$ sudo umount /mnt/s3/mybucket 
$ sudo mount -a
$ mountpoint /mnt/s3/mybucket 
/mnt/s3/mybucket is a mountpoint

很棒吧?

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

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

我将其隔离开来并构建了一个重现该问题的结构任务:

def remount_s3fs():
    sudo("mount -a")

其作用是:

[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

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

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

Done.

但如果我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"

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

所以...这就是我的问题。有什么想法吗?

答案1

好吧,事情并不总是这样运作的吗......只是当我提交这个问题时,我脑子里突然灵光一闪,我记起了 Fabric 使用的 pty 终端时不时会引发问题。在 Fabric 文档中找到了以下内容run()

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

sudo好吧,如果我将任务中的语句修改如下,那就可以了:

sudo("mount -a", pty=False)

一切正常。

相关内容