Jak zamontować / tmp in / mnt na EC2?

10

Zastanawiałem się, jaki jest najlepszy sposób zamontowania /tmppunktu końcowego w efemerycznym magazynie /mntw instancji EC2 i nadanie ubuntuużytkownikowi domyślnych uprawnień do zapisu.

Niektórzy sugerują edytowanie /etc/rc.local w ten sposób:

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

Jednak to nie działa dla mnie (pliki się różnią).

Próbowałem edytować domyślny wpis fstab:

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

zamieniając / mnt na / tmp i nadając mu umask = 0777, jednak to nie działa z powodu cloudconfig.

Używam Ubuntu 12.04. Dzięki.

Claudio Poli
źródło
Nie mogę zrozumieć, o co mnie prosisz. Czy możesz podać przykład oczekiwanej wydajności za pomocą touchi ls -l?
Jeff Ferland
Na przykład: wyświetlenie listy plików w /mnt/tmppowinno zwrócić te same pliki /tmp, dodając, że touch /tmp/testfilewydane przez ubuntuużytkownika powinno działać bez użycia sudo.
Claudio Poli,

Odpowiedzi:

13

Jest kilka problemów z początkową listą sugestii, choć wydaje się, że zmierza ona w dobrym kierunku:

  1. Ze względów bezpieczeństwa mkdirpolecenie powinno utworzyć katalog z bitem lepkim ustawionym w trybie:

    mkdir -m 1777 /mnt/tmp
    
  2. -o nobootwaitNie wydaje się konieczne, ponieważ to nie jest zapisany w /mnt/fstab.

Więc polecam wypróbowanie tego w /etc/rc.local:

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

Jakakolwiek próba umieszczenia montowania wiązania wiąże /etc/fstabsię z problemami, gdy zatrzymasz / uruchomisz instancję lub utworzysz AMI i uruchomisz nową instancję, ponieważ / mnt to efemeryczna pamięć masowa, a cała zawartość (w tym /mnt/tmpkatalog) zniknie .

Eric Hammond
źródło
Czy możesz polecić umieszczenie tego w skryptach danych użytkownika?
Claudio Poli,
1
Podejdę do kodowania rc.local, aby najpierw spróbować zamontować efemeryczne urządzenie (czy już to zamontował w / mnt?), A jeśli to się nie powiedzie, sformatuj je i spróbuj ponownie. W ten sposób zatrzymanie i ponowne uruchomienie powinno go zachować (zakończenie jest sposobem na rozpoczęcie od nowa, jak zwykle). Nie widzę wyraźnej potrzeby posiadania go w / etc / fstab, ponieważ rc.local go zamontuje, ale posiadanie rc.local prawdopodobnie go nie zaszkodzi.
Skaperen
1
@ClaudioPoli: Problem z umieszczeniem tego w danych użytkownika polega na tym, że skrypt danych użytkownika jest uruchamiany tylko przy pierwszym uruchomieniu. Chcesz, aby działało to przy każdym uruchomieniu. Możesz dodać dane użytkownika do /etc/rc.local, ale upewnij się, że zostały wstawione przed jakąkolwiek instrukcją „exit” w tym pliku.
Eric Hammond,
1
@Skaperen: / mnt jest ogólnie sformatowany i montowany przy każdym uruchomieniu lub początku instancji. Stop / start daje czyste, świeże / mnt bez danych pozostałych po poprzednim uruchomieniu. Każda modyfikacja, którą chciałbyś wprowadzić w / etc / fstab, zostałaby zachowana przez stop / start, więc nie ma sensu modyfikować jej przy każdym uruchomieniu.
Eric Hammond,
13

Bardziej zdecydowane podejście, ponieważ używasz Ubuntu, byłoby umieścić sugestię Erica Hammond wewnątrz Upstart skryptu i mają powiązania zrobione natychmiast po zamontowaniu /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

Niektóre serwery, takie jak Apache / Passenger, mogą tworzyć ważne pliki tymczasowe /tmp. Raz rc.local- ostatni w sekwencji rozruchowej - uruchomili się, aby się ukryć i pomylić serwery.

Rômulo Ceccon
źródło
Intrygujący pomysł ..
Tom O'Connor
1

Pomysł użycia skryptu Upstart, jak zasugerował Romulo Ceccon, jest świetny. Jednak możesz nie chcieć ukryć magii w niejasnym skrypcie. Można całkowicie dodać montaż wewnątrz fstab, np

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

A to jest skrypt 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

W ten sposób możesz utworzyć dowolną strukturę katalogów, a co nie w efemerycznym magazynie.

Pozostało mkdir -p /mnt/local{1..4}tylko ponowne uruchomienie (nie zamontowałbym / tmp bez, ponieważ ukryłbyś tam bieżące pliki).

sfussenegger
źródło
Czy montowanie przez fstab powiedzie się, jeśli nie ma /mnt/local1? Być może zdarzenie montażu jest bezpieczniejsze.
Rômulo Ceccon
Tak, założyłem, że / mnt / local1 jest dostępny. Powinienem był wyjaśnić, że nic nie jest montowane na / mnt, co zazwyczaj ma miejsce. Utworzenie tego katalogu jest zatem częścią instalacji. Nie próbowałem użyć zdarzenia montowania, ale może masz rację. Głównym punktem mojej odpowiedzi jest to, że może być lepiej trzymać wierzchowce w pliku fstab i zrobić rzeczy lubią chmod 1777lub mkir -p w skryptach nowobogackich.
sfussenegger