¿Cómo montar / tmp in / mnt en EC2?

10

Me preguntaba cuál es la mejor manera de montar el /tmppunto final en el almacenamiento efímero /mnten una instancia EC2 y otorgar al ubuntuusuario permisos de escritura predeterminados.

Algunos sugieren editar /etc/rc.local de esta manera:

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

Sin embargo, eso no funciona para mí (los archivos difieren).

Intenté editar la entrada predeterminada de fstab:

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

reemplazando / mnt con / tmp y dándole un umask = 0777, sin embargo, no funciona debido a cloudconfig.

Estoy usando Ubuntu 12.04. Gracias.

Claudio Poli
fuente
No puedo entender qué me estás pidiendo que haga. ¿Puede proporcionar un ejemplo de la salida esperada usando touchy ls -l?
Jeff Ferland
Por ejemplo: enumerar archivos en /mnt/tmpdebería devolver los mismos archivos /tmp, agregando que un touch /tmp/testfileemitido por el ubuntuusuario debería funcionar sin usar sudo.
Claudio Poli

Respuestas:

13

Hay un par de problemas con la sugerencia inicial que enumera, aunque parece que se dirige en una buena dirección:

  1. Por motivos de seguridad, el mkdircomando debe crear el directorio con el bit fijo establecido en el modo:

    mkdir -m 1777 /mnt/tmp
    
  2. El -o nobootwaitno parece necesario ya que esto no se está guardando en /mnt/fstab.

Por lo tanto, recomiendo probar esto en /etc/rc.local:

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

Cualquier intento de poner el montaje de enlace tendrá /etc/fstabproblemas cuando detenga / inicie la instancia o cuando cree una AMI y ejecute una nueva instancia ya que / mnt es almacenamiento efímero y todo el contenido (incluido el /mnt/tmpdirectorio) va a desaparecer .

Eric Hammond
fuente
¿Me puede recomendar poner esto en scripts de datos de usuario?
Claudio Poli
1
Tomaría el enfoque de codificar rc.local para intentar primero montar el dispositivo efímero (¿ya lo montó en / mnt?), Y si eso falla, formatee e intente montar nuevamente. De esa manera, una parada y un reinicio deberían preservarlo (terminar sería la forma de comenzar de nuevo, como de costumbre). No veo una necesidad definitiva de tenerlo en / etc / fstab ya que rc.local lo monta, pero tener rc.local adjunto probablemente no haga daño.
Skaperen
1
@ClaudioPoli: El problema con poner esto en datos de usuario es que el script de datos de usuario solo se ejecuta en el primer arranque. Desea que esto se ejecute en cada arranque. Podría hacer que los datos de usuario agreguen esto a /etc/rc.local, pero asegúrese de que esté insertado antes de cualquier declaración de "salida" en ese archivo.
Eric Hammond
1
@Skaperen: / mnt generalmente tiene un formato limpio y se monta en cada ejecución o inicio de una instancia. Una parada / inicio le brinda un aspecto limpio, fresco / mnt sin datos restantes de la ejecución anterior. Cualquier modificación que desee realizar en / etc / fstab se conservará mediante stop / start, por lo que no tendría sentido que rc.local lo modifique en cada arranque.
Eric Hammond
13

Un enfoque más robusto, ya que está ejecutando Ubuntu, sería poner la sugerencia de Eric Hammond dentro de un script Upstart y hacer el enlace inmediatamente después del montaje /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

Algunos servidores, como Apache / Passenger, pueden crear archivos temporales importantes en /tmp. Una vez rc.local, el último en la secuencia de arranque, se ejecutaban, se ocultaban y confundían a los servidores.

Rômulo Ceccon
fuente
Idea intrigante ..
Tom O'Connor
1

La idea de usar un script Upstart como lo sugiere Romulo Ceccon es genial. Sin embargo, es posible que no desee ocultar la magia dentro de un script oscuro. Está perfectamente bien agregar el soporte dentro de fstab, p. Ej.

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

Y este es el 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

De esta manera, puede crear cualquier estructura de directorio y lo que no sea en el almacenamiento efímero.

Todo lo que queda es mkdir -p /mnt/local{1..4}un reinicio (no montaría / tmp sin, ya que ocultaría los archivos actuales allí).

sfussenegger
fuente
¿El montaje a través de fstab tendrá éxito si no hay /mnt/local1? Quizás el evento de montaje sea ​​más seguro.
Rômulo Ceccon
Sí, supuse que / mnt / local1 está disponible. Debería haber explicado que nada está montado en / mnt, que suele ser el caso. Crear este directorio, por lo tanto, es parte de la configuración. No he intentado usar el evento de montaje, pero tal vez tengas razón. El punto principal de mi respuesta es que podría ser mejor mantener los montajes en el archivo fstab y hacer cosas como el chmod 1777o mkir -p en los scripts de inicio.
sfussenegger