Rekurencyjny umount po zamontowaniu rbind


13

Wchodząc do chroota, czasami konieczne jest zamontowanie / sys i / dev przy użyciu opcji -rbind zamiast -bind, aby upewnić się, że wszystko jest na właściwym miejscu, gdy ktoś szuka.

Problem pojawia się podczas odmontowywania.

Prosty umount zawsze zawodzi; wydaje się, że z zamontowanymi dziećmi również są w użyciu:

$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))

Innym możliwym rozwiązaniem jest wypisanie montowań z proc i umountowanie każdego z nich:

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount

Jednak to również się nie udaje, ponieważ rekurencyjne podłączenia nie są w rzeczywistości zarejestrowane w mtab:

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)

Być może rozwiązaniem jest wykonanie leniwego umounta, ale wydaje mi się to dość niebezpieczne.

Czy istnieje lepszy sposób na zrobienie tego, za czym tęskniłem?


1
Czy jesteś pewien, że /mnt/chroot/sys/kernel/securityjest zamontowany w tym momencie? Jaka jest wydajność grep /sys/kernel/security /proc/mounts? umountnie musi być wymieniony w argumencie /etc/mtab. Jeśli go przejdziesz -n, plik nie zostanie w ogóle otwarty.
Gilles „SO- przestań być zły”

Jeśli przyjrzysz się uważnie mojemu poleceniu grep do tworzenia xargs dla umount, wysyłam je tylko
mountom

Odpowiedzi:


11

Działa to dla mnie poprawnie - /unix//a/264488/4319 :

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test

To było ważne, aby mieć dwa pierwsze polecenia jako dwóch oddzielnych komend: nie łączyć --rbindi --make-rslavew jednym wezwaniem wierzchowca.

Bez --make-rslavetego zachowanie było niepożądane (i nie powiodło się):

  • umount -l wpłynie również na oryginalne stare punkty montowania,
  • i umount -Rbędą miały wpływ na zajęte (otwarte) pliki w oryginalnych starych punktach montowania. (Bardzo nieoczekiwany ...)

Nie wiem, czy zostało to naprawione w najnowszej wersji mounta, ale można w pełni łączyć --rbindi używać --make-rslavetego samego wywołania mounta:mount --rbind --make-rslave /dev /mnt/test
Javi Merino

1
Chociaż możesz łączyć dwa argumenty, zamiast tego robi on nierekurencyjne montowanie. Więc to tak naprawdę nie działa zgodnie z przeznaczeniem.
Miral

10

Podziękowania należą się Gillesowi za tę odpowiedź; Gilles zauważył w komentarzach do pytania, że ​​przełącznik „-n” ignoruje mtab i odmontowuje wszystko wymienione w / proc / mounts.

Z strony podręcznika:

-n     Unmount without writing in /etc/mtab.

Aby odpowiedzieć na moje pytanie, jak rozwikłać wierzchowca --rbind, jest to pełne polecenie, które zadziałało dla mnie:

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n

Merci, Gilles!


1
Próbuję mount --rbind / /mnt && umount -n /mnt/dev/shm(lub pts), rozumiem umount: /mnt/dev/shm: target is busy. umount -l /mntzabija system (np. sudo nie powie, że stdin nie jest tty). To jest na zainstalowanym systemie Fedora. Myślę, że to mój stary problem: unix.stackexchange.com/questions/269695/…
sourcejedi

3

Od wersji util-linux v2.23 (25 kwietnia 2013 r.) umountPolecenie obsługuje tę -R, --recursiveopcję.

Oto, co mówi strona podręcznika:

Rekurencyjnie odmontowuj każdy określony katalog. Rekursja dla każdego katalogu zostanie zatrzymana, jeśli jakakolwiek operacja odmontowania w łańcuchu zakończy się niepowodzeniem z jakiegokolwiek powodu. Zależność między punktami montowania jest określana przez /proc/self/mountinfo wpisy. System plików musi być określony przez ścieżkę punktu montowania; rekurencyjny odmontowanie według nazwy urządzenia (lub UUID) nie jest obsługiwane.


0

Dziękuję za to. Używam tego w moich skryptach, aby odmontować całe drzewo chroot: (Pamiętaj, aby odpowiednio ustawić $ MNT)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.