Назад | Перейти на главную страницу

Почему mount -a неправильно монтирует привод предохранителя при удаленном выполнении (через Fabric)?

Это странная ошибка, и я не уверен, откуда она взялась. Вот краткое описание того, что я делаю.

Я пытаюсь подключить диск 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)

Все работает нормально.