Como montar / tmp in / mnt no EC2?

10

Eu queria saber qual é a melhor maneira de montar o /tmpterminal no armazenamento efêmero /mntem uma instância do EC2 e conceder ao ubuntuusuário permissões de gravação padrão.

Alguns sugerem editar o /etc/rc.local desta maneira:

mkdir -p /mnt/tmp && mount --bind -o nobootwait /mnt/tmp /tmp

No entanto, isso não funciona para mim (os arquivos são diferentes).

Tentei editar a entrada padrão do fstab:

/dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2

substituindo / mnt por / tmp e dando umask = 0777, no entanto, não funciona por causa do cloudconfig.

Estou usando o Ubuntu 12.04. Obrigado.

Claudio Poli
fonte
Não consigo descobrir o que você está me pedindo para fazer. Você pode fornecer um exemplo da saída esperada usando touche ls -l?
Jeff Ferland
Por exemplo: listar arquivos em /mnt/tmpdeve retornar os mesmos arquivos /tmp, adicionando que um touch /tmp/testfileemitido pelo ubuntuusuário funcione sem o uso sudo.
Claudio Poli

Respostas:

13

Existem alguns problemas com a sugestão inicial que você lista, embora pareça que está indo em uma boa direção:

  1. Por motivos de segurança, o mkdircomando deve criar o diretório com o bit fixo definido no modo:

    mkdir -m 1777 /mnt/tmp
    
  2. O -o nobootwaitnão parece necessário, pois isso não está sendo salvo /mnt/fstab.

Então, eu recomendo tentar isso em /etc/rc.local:

test -d /mnt/tmp || mkdir -m 1777 /mnt/tmp
mount --bind /mnt/tmp /tmp

Qualquer tentativa de colocar a montagem de ligação /etc/fstabterá problemas quando você parar / iniciar a instância ou quando criar uma AMI e executar uma nova instância, já que / mnt é armazenamento efêmero e todo o conteúdo (incluindo o /mnt/tmpdiretório) desaparecerá .

Eric Hammond
fonte
Você pode recomendar colocar isso nos scripts de dados do usuário?
Claudio Poli
1
Eu adotaria a abordagem de codificar rc.local para tentar primeiro montar o dispositivo efêmero (ele já o montou em / mnt?) E, se isso falhar, formate-o e tente montar novamente. Dessa forma, uma parada e uma reinicialização devem preservá-lo (encerrar seria o caminho para começar de novo, como de costume). Eu não vejo uma necessidade definitiva de tê-lo no / etc / fstab desde que o rc.local o monte, mas ter o rc.local anexado provavelmente não vai doer.
Skaperen
1
@ ClaudioPoli: O problema de colocar isso nos dados do usuário é que o script de dados do usuário é executado apenas na primeira inicialização. Você quer que isso seja executado em cada inicialização. Você pode fazer com que os dados do usuário o adicionem ao /etc/rc.local, mas verifique se ele foi inserido antes de qualquer instrução "exit" nesse arquivo.
Eric Hammond
1
@ Skaperen: / mnt geralmente é formatado de forma limpa e montado em cada execução ou início de uma instância. Uma parada / partida fornece um limpo / novo / mnt sem dados restantes da execução anterior. Qualquer modificação que você quisesse fazer no / etc / fstab seria preservada através de stop / start, portanto, não faria sentido que o rc.local o modificasse a cada inicialização.
Eric Hammond
13

Uma abordagem mais robusta, já que você está executando o Ubuntu, seria colocar a sugestão de Eric Hammond dentro de um script Upstart e fazer a ligação imediatamente após a montagem /mnt :

# File /etc/init/mounted-mnt.conf

# mounted-mnt - Binds /tmp to /mnt/tmp

description     "Binds /tmp to /mnt/tmp"

start on mounted MOUNTPOINT=/mnt

task

script
    test -d /mnt/tmp || mkdir -m 1777 /mnt/tmp
    mount --bind /mnt/tmp /tmp
end script

Alguns servidores, como o Apache / Passenger, podem criar arquivos temporários importantes /tmp. Uma vez rc.local- o último na sequência de inicialização - executado, eles se escondiam e confundiam os servidores.

Rômulo Ceccon
fonte
Intrigante ideia ..
Tom O'Connor
1

A ideia de usar um script Upstart, como sugerido por Romulo Ceccon, é ótima. No entanto, você pode não querer ocultar a magia dentro de um script obscuro. É perfeitamente aceitável adicionar a montagem dentro do fstab, por exemplo

LABEL=cloudimg-rootfs   /    ext4   defaults    0 0

# auto mount ephemeral storage (if any)
# init contents in /etc/init/mounted-local*.conf
/dev/xvdb  /mnt/local1  auto  defaults,nofail,nobootwait,comment=cloudconfig  0 2
/dev/xvdc  /mnt/local2  auto  defaults,nofail,nobootwait,comment=cloudconfig  0 2
/dev/xvdd  /mnt/local3  auto  defaults,nofail,nobootwait,comment=cloudconfig  0 2
/dev/xvde  /mnt/local4  auto  defaults,nofail,nobootwait,comment=cloudconfig  0 2

# bind /tmp to /mnt/local1, might still be on / if no ephemeral storage
/mnt/local1  /tmp  none  bind

E este é o script Upstart:

# File /etc/init/mounted-local1.conf

# mounted-local1 - init ephemeral storage in /mnt/local1

description     "Initializes ephemeral storage in /mnt/local1"

start on mounted MOUNTPOINT=/mnt/local1

# provide defult, see /etc/init/mounted-tmp.conf for details
env MOUNTPOINT=/mnt/local1

task

script
    # fix permissions if needed
    test -d $MOUNTPOINT && chmod 1777 $MOUNTPOINT

    # log to /var/log/upstart/mounted-local1.log
    #echo "initialized $MOUNTPOINT"

end script

Dessa forma, você pode criar qualquer estrutura de diretório e o que não está no armazenamento efêmero.

Tudo o que resta é mkdir -p /mnt/local{1..4}uma reinicialização (eu não montaria / tmp sem, pois você esconderia os arquivos atuais).

sfussenegger
fonte
A montagem via fstab será bem-sucedida se não houver /mnt/local1? Talvez o evento de montagem seja mais seguro.
Rômulo Ceccon
Sim, eu assumi que / mnt / local1 está disponível. Eu deveria ter explicado, que nada é montado no / mnt, o que normalmente é o caso. A criação deste diretório faz parte da instalação. Eu não tentei usar o evento de montagem, mas talvez você esteja certo. O ponto principal da minha resposta é que talvez seja melhor manter montagens no arquivo fstab e fazer coisas como os scripts iniciantes chmod 1777ou mkir -p iniciantes.
Sfussenegger 15/05