Dlaczego mój uchwyt wiązania jest widoczny poza jego przestrzenią nazw?

12

Próbuję więc zrozumieć, jak działa przestrzeń nazw montowania Linuksa. Zrobiłem mały eksperyment i otworzyłem dwa terminale i uruchomiłem następujące:

Terminal 1

root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt

Terminal 2

root@goliath:~# ls b
foo.txt

Dlaczego uchwyt jest widoczny w Terminalu 2? Ponieważ nie jest częścią przestrzeni nazw montowania, spodziewałem się, że katalog będzie tutaj pusty. Próbowałem również przekazać -o shared=noi używać --make-privateopcji z mount, ale uzyskałem ten sam wynik.

Czego mi brakuje i jak mogę ustawić go jako prywatny?

Błąd krytyczny
źródło
podłączenia są ogólnosystemowe, a nie specyficzne dla środowiska powłoki. współdzielone, niewolnicze, prywatne i nierozerwalne nie są tym, czym myślisz, że są. czytać man mount.
cas
3
@cas: Zgadzam się, że --make-privatenie tego chcę. Ale czy nie chodzi o to, aby montować przestrzenie nazw (że nie są one systemowe)?
FatalError

Odpowiedzi:

11

Jeśli korzystasz z systemowej dystrybucji z util-linuxwersją mniejszą niż 2.27, zobaczysz to nieintuicyjne zachowanie. Wynika to z faktu, że CLONE_NEWNSpropaguje flagi, takie jak sharedzależne od ustawienia w jądrze. To ustawienie jest normalne private, ale systemd zmienia to na shared. Od wersji util-linux2.27 wprowadzono łatkę, która zmienia domyślne zachowanie unsharepolecenia, które ma być używane privatejako domyślne zachowanie propagacji, aby było bardziej intuicyjne.

Rozwiązanie

Jeśli korzystasz z systemu z <2.27 util-linux, musisz ponownie zainstalować główny system plików po uruchomieniu unsharepolecenia:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

Jeśli korzystasz z systemu systemowego z> = 2.27 util-linux, powinien on działać zgodnie z oczekiwaniami w przykładzie podanym dosłownie dosłownie, bez potrzeby ponownego montowania. Jeśli nie: przejść --propagation privatedo unsharepolecenia, aby wymusić na propagację nazw zamontować być prywatne.

Dave
źródło
0

nie działało to w Ubuntu (15.04 i 14.04). działało na fedorze. i dla fedory. czy potrzebujesz - make-private czy nie, możesz również sprawdzić

cat / proc / self / mountinfo | grep udostępniony

jeśli współużytkowane, oznacza to, że niektóre inne przestrzenie nazw nadal mogą widzieć, że montuje. To jest problem związany z systemem. Możesz użyć --make-private, aby to działało

Kennan
źródło