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=no
i używać --make-private
opcji z mount
, ale uzyskałem ten sam wynik.
Czego mi brakuje i jak mogę ustawić go jako prywatny?
linux
namespace
bind-mount
Błąd krytyczny
źródło
źródło
man mount
.--make-private
nie tego chcę. Ale czy nie chodzi o to, aby montować przestrzenie nazw (że nie są one systemowe)?Odpowiedzi:
Jeśli korzystasz z systemowej dystrybucji z
util-linux
wersją mniejszą niż 2.27, zobaczysz to nieintuicyjne zachowanie. Wynika to z faktu, żeCLONE_NEWNS
propaguje flagi, takie jakshared
zależne od ustawienia w jądrze. To ustawienie jest normalneprivate
, ale systemd zmienia to nashared
. Od wersjiutil-linux
2.27 wprowadzono łatkę, która zmienia domyślne zachowanieunshare
polecenia, które ma być używaneprivate
jako 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 uruchomieniuunshare
polecenia: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 private
dounshare
polecenia, aby wymusić na propagację nazw zamontować być prywatne.źródło
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ć
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
źródło