Linux-zrozumienie przestrzeni nazw mount & klon Klon newns flag

Czytam & klon strony man. Chcę wyjaśnić, jak CLONE_NEWNS wpływa na widok systemu plików dla procesu potomnego.

(hierarchia plików)

Rozważmy to drzewo jako hierarchię katalogów. Lets mówi 5 i 6 są punktami montowania w procesie nadrzędnym. Wyjaśniłem punkty montowania w innym pytaniu .

Więc moje zrozumienie jest następujące: 5 i 6 są punktami montowania oznacza, że polecenie mount zostało użyte poprzednio do "montowania" systemów plików (hierarchii katalogów) w 5 i 6 (co oznacza, że muszą być też drzewa katalogów poniżej 5 i 6).

From mount man page:

 A mount namespace is the set of filesystem mounts that are visible to a process. 

From clone man page:

Every process lives in a mount namespace.  The namespace of a process is the data 
(the set of mounts) describing the file hierarchy as seen by that process.  After 
a fork(2) or clone() where the CLONE_NEWNS flag is not set, the child lives in the 
same mount namespace as the parent.

Także:

After a clone() where the CLONE_NEWNS flag is set, the cloned child is started in a 
new mount namespace, initialized with a copy of the namespace of the parent.

Teraz, jeśli użyję clone() z CLONE_NEWNS do utworzenia procesu potomnego, czy to oznacza, że dziecko otrzyma dokładną kopię punktów montowania w drzewie (5 i 6) i nadal będzie mogło uzyskać dostęp do reszty oryginalnego drzewa ? Czy oznacza to również, że dziecko może montowanie 5 i 6 według własnej woli, bez wpływu na to, co jest zamontowane na 5 lub 6 w przestrzeni nazw procesu macierzystego.

Jeśli tak, czy to również oznacza, że dziecko może zamontować / odmontować inny katalog niż 5 lub 6 i spowodować, co jest widoczne dla procesu macierzystego ?

Dzięki.
Author: Community, 2014-04-06

2 answers

"przestrzeń nazw montowania" procesu jest tylko zestawem zamontowanych systemów plików, które widzi. Po przejściu od tradycyjnej sytuacji posiadania jednej globalnej przestrzeni nazw do posiadania przestrzeni nazw dla każdego procesu, musisz zdecydować, co zrobić, tworząc proces potomny za pomocą clone().

Tradycyjnie montowanie lub odmontowywanie systemu plików zmieniało system plików tak, jak widziany przez wszystkie procesy: istniała jedna globalna przestrzeń nazw montowania widziana przez wszystkie procesy i jeśli nastąpiła jakakolwiek zmiana (np. polecenie mount) wszystkie procesy natychmiast zauważą tę zmianę niezależnie od ich stosunku do polecenia mount.

W przestrzeniach nazw montowania dla poszczególnych procesów, proces potomny może teraz mieć inną przestrzeń nazw montowania niż jego rodzic. Nasuwa się pytanie:

Czy zmiany w przestrzeni nazw mount dokonane przez dziecko powinny zostać przeniesione z powrotem na rodzica?

Oczywiście, ta funkcjonalność musi być przynajmniej wspierana i, rzeczywiście, musi być prawdopodobnie default. W przeciwnym razie uruchomienie samego polecenia mount nie spowoduje żadnych zmian (ponieważ system plików widziany przez powłokę nadrzędną nie będzie miał wpływu).

Równie wyraźnie, musi być również możliwe, aby ta niezbędna propagacja była tłumiona , w przeciwnym razie nigdy nie możemy utworzyć procesu potomnego, którego przestrzeń nazw mount różni się od jego rodzica i mamy ponownie jedną globalną przestrzeń nazw mount (system plików widziany przez init).

Tak więc musimy zdecydować, kiedy tworzymy dziecko proces z clone() czy proces potomny otrzymuje własną kopię danych o zamontowanych systemach plików od rodzica, które może zmieniać bez wpływu na rodzica, lub otrzymuje wskaźnik do tych samych struktur danych co rodzic, które może zmieniać (konieczne, aby zmiany rozprzestrzeniały się z powrotem, jak podczas uruchamiania mount z powłoki).

Jeśli znacznik CLONE_NEWNS zostanie przekazany do clone(), potomek otrzyma kopię zamontowanych przez rodzica danych systemu plików, które może zmienić bez wpływu na rodzicielska przestrzeń nazw mount. W przeciwnym razie otrzymuje wskaźnik do struktur danych montowania rodzica, gdzie zmiany wprowadzone przez potomka będą widoczne przez rodzica (tak więc samo polecenie mount może działać).

Jeśli użyję clone z CLONE_NEWNS do utworzenia procesu potomnego, czy to oznacza, że dziecko otrzyma dokładną kopię punktów montowania w drzewie (5 i 6) i nadal będzie mogło uzyskać dostęp do reszty oryginalnego drzewa?

Tak. Widzi dokładnie to samo drzewo co jego rodzica po wywołaniu do clone().

Czy to również oznacza, że potomek może zamontować 5 i 6 według własnej woli, bez wpływu na to, co jest zamontowane na 5 lub 6 w przestrzeni nazw procesu macierzystego.

Tak. Ponieważ użyłeś CLONE_NEWNS, dziecko może odmontować jedno urządzenie z 5 i zamontować tam inne urządzenie i tylko ono (i jego dzieci) może zobaczyć zmiany. Żaden inny proces nie widzi zmian wprowadzonych przez dziecko w tym przypadku.

Jeśli tak, czy oznacza to również to dziecko może zamontować / odmontować inny katalog niż 5 lub 6 i spowodować, co jest widoczne dla procesu rodzica ?

Nie. Jeśli użyłeś CLONE_NEWNS, zmiany wprowadzone w dziecku nie mogą zostać przeniesione z powrotem do rodzica.

Jeśli nie użyłeś CLONE_NEWNS, dziecko otrzymałoby wskaźnik do tej samej przestrzeni nazw mount co jego rodzic, a wszelkie zmiany wprowadzone przez dziecko będą widoczne dla każdego procesu, który współdzieli te struktury danych, w tym dla rodzica. (To dotyczy to również sytuacji, gdy nowe dziecko jest tworzone przy użyciu fork().)

 28
Author: Emmet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 20:23:55

Nie mam wystarczającej ilości punktów reputacji, aby dodać komentarz, więc zamiast tego dodaj ten komentarz jako odpowiedź. To tylko dodatek do odpowiedzi Emmeta.

AFAICU, jeśli Proces jest tworzony z ustawioną flagą CLONE_NEWNS, może montować tylko te systemy plików, które mają ustawioną flagę FS_USERNS_MOUNT. I prawie wszystkie dyskietkowe systemy plików nie ustawiają tej flagi (ze względów bezpieczeństwa). W do_new_mount jest to sprawdzenie:

        if (user_ns != &init_user_ns) {
            if (!(type->fs_flags & FS_USERNS_MOUNT)) {
                    put_filesystem(type);
                    return -EPERM;
            }

Proszę popraw mnie jeśli się mylę

 5
Author: user3820535,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 08:16:33