Utwórz przestrzeń nazw PID
Prawidłowe polecenie do użycia tutaj to unshare
. Pamiętaj, że niezbędne opcje, aby to zrobić, są dostępne tylko w util-linux 2.23
. Chodzi o to, aby utworzyć nowy obszar nazw PID dla uruchomionego programu, tak aby wszystkie jego elementy potomne również zostały utworzone w tym obszarze nazw. Możesz uruchomić polecenie w nowej przestrzeni nazw PID, po prostu wykonując:
sudo unshare -fp some_command
Aby uruchomić powłokę, po prostu pomiń polecenie. Spowoduje to utworzenie procesu, który wraz z dowolnym z jego elementów podrzędnych będzie miał PID jak zwykle w nadrzędnej (systemowej) przestrzeni nazw. Jednak w nowej przestrzeni nazw będzie miał PID 1
wraz z niektórymi szczególnymi cechami tego init
procesu. Być może najbardziej istotną cechą z punktu widzenia monitorowania jest to, że jeśli którykolwiek z jego potomków zostanie osierocony, zostanie ponownie wychowany w tym procesie, a nie w rzeczywistym init
procesie.
Takie postępowanie może wystarczyć w większości przypadków monitorowania. Jak wcześniej wspomniano, wszystkie procesy w przestrzeni nazw mają PID w nadrzędnej przestrzeni nazw, więc do monitorowania ich aktywności można używać zwykłych poleceń. Jesteśmy również pewni, że jeśli jakikolwiek proces w przestrzeni nazw zostanie osierocony, nie wypadnie on z gałęzi drzew procesu poniżej PID programu najwyższego poziomu, co oznacza, że nadal można go łatwo śledzić.
Połącz z przestrzenią nazw montowania
Jednak, czego nie możemy zrobić, to monitorowanie procesu w odniesieniu do PID, że myśli, że ma. Aby to zrobić, a zwłaszcza aby móc korzystać z ps
polecenia w nowej przestrzeni nazw, musisz zamontować osobny procfs
system plików dla przestrzeni nazw. To z kolei prowadzi do kolejnego problemu, ponieważ jedyną ps
akceptowaną lokalizacją procfs
jest /proc
. Jednym z rozwiązań byłoby utworzenie chroot
więzienia i zamontowanie procfs
tam nowego . Jest to jednak uciążliwe podejście, ponieważ musielibyśmy co najmniej skopiować (lub przynajmniej twarde łącze) dowolne pliki binarne, które zamierzamy używać wraz z bibliotekami, od których zależą od nowego katalogu głównego.
Rozwiązaniem jest również użycie nowej przestrzeni nazw montowania . W ramach tego możemy zamontować nowy procfs
w sposób, który wykorzystuje prawdziwy /proc
katalog główny , może być użyteczny w przestrzeni nazw PID i nie koliduje z niczym innym. Aby ten proces był bardzo prosty, unshare
polecenie daje --mount-proc
opcję:
sudo unshare -fp --mount-proc some_command
Teraz uruchomione ps
w połączonych przestrzeniach nazw pokażą tylko procesy z przestrzenią nazw PID i pokażą proces najwyższego poziomu jako mający PID o wartości 1
.
Co nsenter
?
Jak sama nazwa wskazuje, nsenter
można go użyć do wprowadzenia przestrzeni nazw, która została już utworzona unshare
. Jest to przydatne, jeśli chcemy, aby informacje były dostępne tylko z przestrzeni nazw z niepowiązanego skryptu. Najprościej jest uzyskać dostęp, podając PID dowolnego programu działającego w przestrzeni nazw. Aby to wyjaśnić, musi to być PID programu docelowego w obszarze nazw, z którego nsenter
jest uruchamiany (ponieważ obszary nazw można zagnieżdżać, jeden proces może mieć wiele PID). Aby uruchomić powłokę w docelowej przestrzeni nazw PID / mount, po prostu wykonaj:
sudo nsenter -t $PID -m -p
Jeśli ta przestrzeń nazw jest skonfigurowana jak powyżej, ps
będzie teraz wyświetlać listę tylko procesów w tej przestrzeni nazw.