Это странная ошибка, и я не уверен, откуда она взялась. Вот краткое описание того, что я делаю.
Я пытаюсь подключить диск FUSE к экземпляру Amazon EC2 под управлением Ubuntu 10.10 с помощью s3fs (FUSE over Amazon). 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 /mnt/s3/mybucket
mountpoint: /mnt/s3/mybucket: Transport endpoint is not connected
Done.
Но если я убегу 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: sudo -S -p 'sudo password:' /bin/bash -l -c "mount -a"
Опять же, я получаю сообщение об отсутствии подключения к транспортной конечной точке. Я также попытался скопировать и вставить точную команду, запущенную в мой сеанс ssh (т.е. sudo -S -p 'sudo password:' /bin/bash -l -c "mount -a"
) и все работает нормально.
Итак ... это моя проблема. Любые идеи?
Ладно, не всегда так работает ... Просто когда я отправил этот вопрос, у меня в голове погасла тусклая лампочка, и я вспомнил кое-что о том, что терминал pty, который использует Fabric, время от времени вызывает проблемы. Обнаружил, что это в документации по Fabric для run()
:
Вы можете передать pty = False, чтобы отказаться от создания псевдотерминала на удаленном конце в случае, если его присутствие вызывает проблемы для данной команды.
Ну, конечно, если я исправлю sudo
Утверждение в моей задаче следующее:
sudo("mount -a", pty=False)
Все работает нормально.