这是一个奇怪的错误,我不知道它从何而来。下面简要介绍一下我正在做的事情。
我正在尝试使用 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)
一切正常。