Por que a montagem - não está montando a unidade de fusível corretamente quando executada remotamente (via Fabric)?

3

Este é um bug estranho e eu não tenho certeza de onde ele está vindo. Aqui está uma rápida descrição do que estou fazendo.

Estou tentando montar uma unidade FUSE em uma instância do Amazon EC2 executando o Ubuntu 10.10 usando s3fs (FUSE over Amazon). O s3fs é compilado da fonte de acordo com as instruções, etc. Eu também adicionei uma entrada ao / etc / fstab para que a unidade seja montada na inicialização. Veja como é o /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

A boa notícia é que isso funciona bem. Na reinicialização, a conexão é montada corretamente. Eu também posso fazer:

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

Ótimo, certo?

Bem, aqui está o problema. Estou usando o Fabric para automatizar o processo de criação e gerenciamento dessa instância. Percebi que estava recebendo essa mensagem de erro ao usar o Fabric para construir o s3fs e configurar o processo de montagem:

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

Eu o isolei do problema e criei uma tarefa de malha que reproduz o problema:

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

O que faz:

[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

[E sim, eu tinha certeza de desmontá-lo antes de executar esta tarefa.] Quando eu verifico a montagem usando o ponto de montagem, fico:

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

Done.

Mas se eu executar sudo mount -a na linha de comando, isso funciona. Hrm.

Aqui está a saída da tarefa fab novamente, desta vez no modo de depuração completo:

[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"

Novamente, obtenho esse nó de extremidade de transporte não conectado ao erro. Eu também tentei copiar e colar o comando exato executado na minha sessão ssh (ou seja, sudo -S -p 'sudo password:' /bin/bash -l -c "mount -a" ) e funciona bem.

Então ... esse é o meu problema. Alguma idéia?

    
por Jim D 15.03.2011 / 16:40

1 resposta

5

Ok, não é sempre assim que funciona ... quando eu apresentei esta pergunta, uma lâmpada fraca se acendeu na minha cabeça e me lembrei de algo sobre o terminal pty que o Fabric usa causando problemas de vez em quando. Encontrado isso está nos documentos de tecido para run() :

You may pass pty=False to forego creation of a pseudo-terminal on the remote end in case the presence of one causes problems for the command in question.

Bem, com certeza se eu alterar a declaração sudo na minha tarefa da seguinte forma:

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

Tudo funciona bem.

    
por 15.03.2011 / 16:45

Tags