遠端執行(通過 Fabric)時,為什麼 mount -a 沒有正確安裝保險絲驅動器?
這是一個奇怪的錯誤,我不確定它來自哪裡。這是我正在做的事情的簡要介紹。
我正在嘗試使用 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
所以好消息是這很好用。重新啟動時,連接正確安裝。我也可以這樣做:
$ 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
$$ And yes, I was sure to unmount it before running this task. $$當我使用 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"
)中,它工作正常。所以……這是我的問題。有任何想法嗎?
好吧,這不總是它是如何工作的……就像我送出這個問題一樣,一個昏暗的燈泡在我的腦海中熄滅了,我想起了一些關於 Fabric 使用的 pty 終端不時導致問題的事情。發現這是在 Fabric 文件中
run()
:您可以傳遞 pty=False 以放棄在遠端端創建偽終端,以防偽終端的存在導致相關命令出現問題。
好吧,如果我將
sudo
任務中的聲明修改如下:sudo("mount -a", pty=False)
一切正常。