OPIS¶
Polecenie unshare tworzy nowe przestrzenie nazw (podane
opcjami wiersza poleceń opisanymi poniżej) i wykonuje podany
program. Jeśli nie poda się programu, uruchamia
powłokę "${SHELL}" (domyślnie:
/bin/sh).
Domyślnie, przestrzenie nazw istnieją tylko tak
długo, jak występujące w nich procesy. Można
jednak utworzyć nową przestrzeń nazw jako
trwałą, nawet gdy nie występują w niej procesy,
poprzez zamontowanie przez podpięcie plików
/proc/pid/ns/typ do ścieżki systemu
plików. W przestrzeń nazw, którą utrwalono w ten
sposób, można później wejść za
pomocą nsenter(1) nawet po zakończeniu programu
(z wyjątkiem przestrzeni nazw PID, gdzie wymagany jest trwale
działający proces init). Gdy trwała przestrzeń
nazw nie jest już dłużej potrzebna, można
zdjąć przymiot trwałości, usuwając
montowanie przez podpięcie, programem umount(8). Więcej
szczegółów w rozdziale PRZYKŁADY.
Polecenie unshare od wersji 2.36 util-linux korzysta z
plików /proc/[pid]/ns/pid_for_children oraz
/proc/[pid]/ns/time_for_children do przestrzeni nazw PID i czasu.
Zmiana ta wymaga Linuksa 4.17 lub nowszego.
Za pomocą unshare można utworzyć
następujące typy przestrzeni nazw:
przestrzeń nazw montowań
Montowanie i odmontowywanie systemów plików
nie będzie miało wpływu na resztę systemu, z
wyjątkiem systemów plików bezpośrednio oznaczonych
jako współdzielone (za pomocą
mount --make-shared;
zob.
/proc/self/mountinfo lub
findmnt -o+PROPAGATION i znaczniki
shared). Więcej szczegółów w
podręczniku systemowym
mount_namespaces(7).
Od wersji 2.27 util-linux, unshare automatycznie ustawia
propagację na private w nowych przestrzeniach nazw
montowań aby zapewnić, że nowa przestrzeń nazw
faktycznie nie jest dzielona. Można wyłączyć
tę funkcję opcją --propagation unchanged.
Proszę zauważyć, że private jest
domyślnym wyborem jądra.
przestrzeń nazw UTS
Ustawianie nazwy stacji (hostname) lub domeny
(domainname) nie będzie miało wpływu na resztę
systemu. Więcej szczegółów w podręczniku
systemowym
uts_namespaces(7).
przestrzeń nazw IPC
Proces będzie miał niezależną
przestrzeń nazw do celu: kolejek komunikatów POSIX oraz kolejek
komunikatów Systemu V, zestawów semaforów oraz
segmentów pamięci dzielonej. Więcej
szczegółów w podręczniku
ipc_namespaces(7).
przestrzeń nazw sieci
Proces będzie miał niezależne stosy
IPv4 i IPv6, tablice trasowania IP, reguły zapory sieciowej, drzewa
katalogów
/proc/net i
/sys/class/net, gniazd itp.
Więcej szczegółów w podręczniku
network_namespaces(7).
przestrzeń nazw PID
Potomkowie będą mieli oddzielny
zbiór przypisań od PID-u do procesu, od swych rodziców.
Więcej szczegółów w podręczniku systemowym
pid_namespaces(7).
przestrzeń nazw grup kontrolnych cgroup
Proces będzie miał zwirtualizowany widok
/proc/self/cgroup, a nowe montowania cgroup będą
zakorzenione w korzeniu przestrzeni nazw cgroup. Więcej
szczegółów w podręczniku systemowym
cgroup_namespaces(7).
przestrzeń nazw użytkownika
Proces będzie miał odrębny
zbiór identyfikatorów użytkownika, grup oraz
przywilejów. Więcej szczegółów w
podręczniku systemowym
user_namespaces(7).
przestrzeń nazw czasu
Proces będzie miał oddzielny widok
CLOCK_MONOTONIC i/lub
CLOCK_BOOTTIME, które można
zmienić za pomocą pliku
/proc/self/timens_offsets.
Więcej szczegółów w podręczniku systemowym
time_namespaces(7).
OPCJE¶
-i, --ipc[=plik]
Tworzy nową przestrzeń nazw IPC.
Jeśli poda się plik, to przestrzeń nazw stanie
się trwała, poprzez utworzenie montowania przez podpięcie
pod plikiem.
-m, --mount[=plik]
Tworzy nową przestrzeń nazw
montowań. Jeśli poda się plik, to
przestrzeń nazw stanie się trwała, poprzez utworzenie
montowania przez podpięcie pod plikiem. Proszę
zauważyć, że plik musi być umieszczony w
montowaniu, którego typem propagacji nie jest shared (albo
wystąpi błąd). Proszę zastosować polecenie
findmnt -o+PROPAGATION, gdy nie jest się pewnym aktualnego
ustawienia. Zob. też przykłady poniżej.
-n, --net[=plik]
Tworzy nową przestrzeń nazw sieci.
Jeśli poda się plik, to przestrzeń nazw stanie
się trwała, poprzez utworzenie montowania przez podpięcie
pod plikiem.
-p, --pid[=plik]
Tworzy nową przestrzeń nazw PID.
Jeśli poda się
plik, to przestrzeń nazw stanie
się trwała, poprzez utworzenie montowania przez podpięcie
pod
plikiem (utworzenie trwałej przestrzeni nazw PID zawiedzie,
jeśli nie poda się równocześnie opcji
--fork).
Zob. też opcje --fork i --mount-proc.
-u, --uts[=plik]
Tworzy nową przestrzeń nazw UTS.
Jeśli poda się plik, to przestrzeń nazw stanie
się trwała, poprzez utworzenie montowania przez podpięcie
pod plikiem.
-U, --user[=plik]
Tworzy nową przestrzeń nazw
użytkownika. Jeśli poda się plik, to
przestrzeń nazw stanie się trwała, poprzez utworzenie
montowania przez podpięcie pod plikiem.
-C, --cgroup[=plik]
Tworzy nową przestrzeń nazw grup
kontrolnych cgroup. Jeśli poda się plik, to
przestrzeń nazw stanie się trwała, poprzez utworzenie
montowania przez podpięcie pod plikiem.
-T, --time[=plik]
Tworzy nową przestrzeń nazw czasu.
Jeśli poda się plik, to przestrzeń nazw stanie
się trwała, poprzez utworzenie montowania przez podpięcie
pod plikiem. Opcjami --monotonic i --boottime
można podać odpowiednie przesunięcie w przestrzeni nazw
czasu.
-f, --fork
Rozgałęzia podany program jako
proces potomny programu unshare, zamiast uruchamiać go
bezpośrednio. Przydatne przy tworzeniu nowej przestrzeni nazw PID.
Proszę zauważyć, że gdy unshare oczekuje na
proces potomny, ignoruje sygnały SIGINT i SIGTERM oraz
nie przekazuje żadnych sygnałów potomkowi. Konieczne jest
wysyłanie sygnałów do procesu potomnego.
--forward-signals
Przekazuje sygnały
SIGTERM i
SIGINT
otrzymane przez proces macierzysty
unshare do jego procesów
potomnych. Gdy nie poda się tej opcji,
unshare ignoruje te
sygnały przy oczekiwaniu na zakończenie procesu potomnego
(domyślne zachowanie od util-linux 2.36). Pozwala to na utrzymanie
istnienia rodzica podczas obsługi sygnałów przez proces
potomny.
Opcja przydatna, gdy proces macierzysty unshare otrzyma
sygnały SIGTERM lub SIGINT (np. przy
przeładowaniu systemu albo od menedżera procesów), a
chce się uzyskać poinformowanie procesu potomnego o
żądaniu poprawnego wyjścia, dzięki czemu
może on przeprowadzić konieczne operacje czyszczące.
Jeśli dany proces potomny ma procedury obsługi
sygnałów (takie jak obsługa pułapek
powłoki), włączenie tej opcji pozwala na ich
wykonanie.
Opcja ta wymusza --fork.
--keep-caps
Gdy poda się opcję --user zapewnia,
że przywileje nadane w przestrzeni nazw użytkownika są
zachowywane w procesie potomnym.
--kill-child[=nazwa-sygnału]
Gdy unshare kończy się, wyśle
nazwę-sygnału do rozgałęzionego procesu
potomnego. Przy łącznym stosowaniu z --pid można
uzyskać łatwe i niezawodne zabijanie całego drzewa
procesów unshare. Jeśli nie poda się
nazwy-sygnału, domyślnie będzie to SIGKILL.
Opcja wymusza --fork.
--mount-proc[=punkt-montowania]
Tuż przed uruchomieniem programu, montuje system
plików proc w punkcie-montowania (domyślnie w
/proc). Przydatne przy tworzeniu nowej przestrzeni nazw PID. Wymusza
także utworzenie nowej przestrzeni nazw montowań,
ponieważ montowanie /proc spowodowałoby problemy dla
istniejących programów w systemie. Nowy system plików
proc jest jawnie montowany jako prywatny (z
MS_PRIVATE|MS_REC).
--mount-binfmt[=punkt-montowania]
Tuż przed uruchomieniem programu, montuje system
plików binfmt_misc w punkcie-montowania (domyślnie w
/proc/sys/fs/binfmt_misc). Wymusza także utworzenie nowej
przestrzeni nazw montowań, ponieważ montowanie binfmt_misc
spowodowałoby problemy dla istniejących programów w
systemie. Nowy system plików binfmt_misc jest jawnie montowany jako
prywatny (z MS_PRIVATE|MS_REC).
--map-user uid|nazwa
Uruchamia program jedynie po przypisaniu
bieżącego efektywnego identyfikatora użytkownika do
uid. Jeśli poda się tę opcję wielokrotnie,
pierwszeństwo ma ostatnie wystąpienie. Opcja wymusza
--user.
--map-users
wewnętrzny-uid:zewnętrzny-uid:liczba|auto|subids|all
Uruchamia program jedynie po przypisaniu bloków
identyfikatorów użytkownika o rozmiarze
liczba
zaczynających się od
zewnętrznego-uid do
bloków identyfikatorów użytkownika zaczynających
się od
wewnętrznego-uid. Przypisanie jest tworzone za
pomocą
newuidmap(1) jeśli
unshare uruchomiono jako
nieuprzywilejowany. Jeśli zakres identyfikatorów
użytkowników nachodzi na przypisania podane w
--map-user,
to "dziura" zostanie usunięta z przypisania. Może to
poskutkować tym, że najwyższy identyfikator
użytkownika nie zostanie przypisany. Można przypisać
kilka bloków identyfikatorów użytkownika, podając
opcję
--map-users wielokrotnie. Specjalna wartość
auto przypisze pierwszy blok identyfikatorów użytkownika
będący własnością efektywnego
użytkownika z
/etc/subuid do bloku zaczynającego
się od identyfikatora użytkownika 0. Specjalna
wartość
subids utworzy równoważne
przypisania tego samego bloku. Specjalna wartość
all
utworzy przypisanie przejściowe (pass-through) dla każdego
dostępnego identyfikatora użytkownika w macierzystej przestrzeni
nazw. Opcja wymusza również opcję
--user.
Przed wersją 2.39 util-linux, opcja ta oczekiwała
argumentu używającego przecinka jako separatora, w postaci
zewnętrzny-uid,wewnętrzny-uid,liczba,
jednak format ten jest obecnie przestarzały, aby zachować
spójność z kolejnością stosowaną w
/proc/[pid]/uid_map i opcji montowania X-mount.idmap.
--map-group gid|nazwa
Uruchamia program jedynie po przypisaniu
bieżącego efektywnego identyfikatora grupy do gid.
Jeśli poda się tę opcję wielokrotnie,
pierwszeństwo ma ostatnie wystąpienie. Opcja wymusza
--setgroups=deny i --user.
--map-groups
wewnętrzny-gid:zewnętrzny-gid:liczba|auto|subids|all
Uruchamia program jedynie po przypisaniu bloków
identyfikatorów grup o rozmiarze
liczba zaczynających
się od
zewnętrznego-gid do bloków
identyfikatorów grup zaczynających się od
wewnętrznego-gid. Przypisanie jest tworzone za pomocą
newgidmap(1) jeśli
unshare uruchomiono jako
nieuprzywilejowany. Jeśli zakres identyfikatorów grup nachodzi
na przypisania podane w
--map-group, to "dziura" zostanie
usunięta z przypisania. Może to poskutkować tym,
że najwyższy identyfikator grupy nie zostanie przypisany.
Można przypisać kilka bloków identyfikatorów grup,
podając opcję
--map-groups wielokrotnie. Specjalna
wartość
auto przypisze pierwszy blok
identyfikatorów grup będący
własnością efektywnej grupy z
/etc/subgid do bloku
zaczynającego się od identyfikatora grupy 0. Specjalna
wartość
subids utworzy równoważne
przypisania tego samego bloku. Specjalna wartość
all
utworzy przypisanie przejściowe (pass-through) dla każdego
dostępnego identyfikatora grupy w macierzystej przestrzeni nazw. Opcja
wymusza również opcję
--user.
Przed wersją 2.39 util-linux, opcja ta oczekiwała
argumentu używającego przecinka jako separatora, w postaci
zewnętrzny-gid,wewnętrzny-gid,liczba,
jednak format ten jest obecnie przestarzały, aby zachować
spójność z kolejnością stosowaną w
/proc/[pid]/gid_map i opcji montowania X-mount.idmap.
--map-auto
Przypisuje pierwszy blok identyfikatorów
użytkownika będący własnością
efektywnego użytkownika z /etc/subuid do bloku
zaczynającego się od identyfikatora użytkownika 0. W ten
sam sposób, przypisze również pierwszy blok
identyfikatorów grup będących
własnością efektywnej grupy z /etc/subgid do bloku
zaczynającego się od identyfikatora grupy 0. Opcja ta
służy obsłużeniu częstego przypadku, gdy
pierwszy blok podległych identyfikatorów użytkownika i
grupy może zająć całą przestrzeń
identyfikatorów użytkownika i grupy. Opcja odpowiada
jednoczesnemu podaniu --map-users=auto oraz
--map-groups=auto.
--map-subids
Utworzy równoważne przypisania pierwszego
bloku identyfikatorów użytkownika będących
własnością efektywnego użytkownika z
/etc/subuid. W ten sam sposób, utworzy również
równoważne przypisania pierwszego bloku identyfikatorów
grupy będących własnością efektywnej grupy
z /etc/subgid. Opcja odpowiada jednoczesnemu podaniu
--map-users=subids i --map-groups=subids.
-r, --map-root-user
Uruchamia program dopiero po przypisaniu aktualnych
efektywnych identyfikatorów użytkownika i grupy do UID-u i GID-u
superużytkownika w nowo utworzonej przestrzeni nazw użytkownika.
W ten sposób można wygodnie pozyskać uprawnienia
potrzebne do zarządzania różnymi aspektami nowo
utworzonych przestrzeni nazw (np. konfiguracji interfejsów w
przestrzeni nazw sieci lub montowania systemów plików w
przestrzeni nazw montowań) nawet, gdy działa się jako
użytkownik nieuprzywilejowany. Jako że jest to funkcja
powstała tylko dla wygody, nie obsługuje bardziej
złożonych przypadków, takich jak przypisania
zakresów UID-ów i GID-ów. Opcja wymusza
--setgroups=deny i --user. Odpowiada podaniu --map-user=0
--map-group=0.
-c, --map-current-user
Uruchamia program dopiero po przypisaniu aktualnych
efektywnych identyfikatorów użytkownika i grupy do tych samym
UID-ów i GID-ów w nowo utworzonej przestrzeni nazw
użytkownika. Opcja wymusza --setgroups=deny i --user.
Odpowiada podaniu --map-user=$(id -ru) --map-group=$(id -rg).
--owner uid:gid
Ustawia użytkownika i grupę
właściciela przy tworzeniu nowej przestrzeni nazw
użytkownika. Określają one, który
użytkownik z macierzystej przestrzeni nazw ma przywilej CAP_SYS_ADMIN w
nowo tworzonej potomnej przestrzeni nazw i może wykonać do niej
setns(2). Opcja pozwala użytkownikowi uprzywilejowanemu na
utworzenie przestrzeni nazw w imieniu użytkownika nieuprzywilejowanego,
korzystając ze swoich przywilejów do przypisania
identyfikatorów i/lub zamontowania przez podpięcie tej
przestrzeni nazw w systemie plików. Wymusza
--user.
--propagation
private|shared|slave|unchanged
Rekurencyjnie ustawia flagę propagacji montowania
w nowej przestrzeni nazw montowań. Domyślnie propagacja jest
ustawiana na private. Można wyłączyć
tę funkcję argumentem unchanged. Opcja jest po cichu
ignorowana, gdy nie żąda się przestrzeni nazw
montowań (--mount).
--setgroups allow|deny
Dozwala (allow) lub zabrania (deny) stosowania
wywołania systemowego
setgroups(2) w przestrzeni nazw
użytkownika.
Aby móc wywołać setgroups(2), proces
wywołujący musi mieć co najmniej przywilej
CAP_SETGID. Jednak od Linuksa 3.19 stosują się
dodatkowe ograniczenia: jądro nadaje uprawnienie do wywołania
setgroups(2) jedynie po ustawieniu przypisania GID
(/proc/pid*/gid_map*). Przypisanie GID jest do zapisu przez
roota gdy włączono setgroups(2) (tj. allow,
wartość domyślna), natomiast przypisanie GID staje
się do zapisu przez procesy nieuprzywilejowane, gdy
setgroups(2) jest na stałe wyłączone (poprzez
deny).
-R, --root katalog
uruchamia polecenie z katalogiem głównym
ustawionym na katalog.
-w, --wd katalog
zmienia katalog roboczy na katalog.
-S, --setuid id-użytkownika
Ustawia identyfikator użytkownika, który
będzie stosowany po przejściu w przestrzeń nazw.
-G, --setgid id-grupy
Ustawia identyfikator grupy, który będzie
stosowany po przejściu w przestrzeń nazw oraz porzuca grupy
dodatkowe.
-l, --load-interp łańcuch
Ładuje definicję binfmt_misc do przestrzeni
nazw (wymusza
--mount-binfmt). Argument
łańcuch ma
postać
:nazwa:typ:przesunięcie:magia:maska:interpretujący:flagi.
Więcej szczegółów o rejestrowaniu nowego typu
pliku wykonywalnego znajduje się w
<
https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst>.
Do zarządzania flagą F w
flags z
parametrem
--root, binfmt_misc jest montowane dwukrotnie, pierwszy raz
przez wykonaniem chroot do załadowania interpretującego z
systemu plików wywołującego, a następnie
później, aby był dostępny z przestrzeni
użytkownika chroot.
--monotonic przesunięcie
Ustawia przesunięcie zegara
CLOCK_MONOTONIC, które będzie stosowane po
przejściu w przestrzeń nazw. Opcja wymaga oddzielenia
przestrzeni nazw czasu za pomocą opcji --time.
--boottime przesunięcie
Ustawia przesunięcie zegara CLOCK_BOOTTIME,
które będzie stosowane po przejściu w przestrzeń
nazw. Opcja wymaga oddzielenia przestrzeni nazw czasu za pomocą opcji
--time.
-h, --help
Wyświetla ten tekst i wychodzi.
-V, --version
Wyświetla wersję i wychodzi.
PRZYKŁADY¶
Poniższe polecenie tworzy przestrzeń nazw PID,
korzystając z --fork aby zapewnić, że wykonywane
polecenie odbywa się w procesie potomnym, który (jako pierwszy
proces w przestrzeni nazw) ma PID 1. Opcja --mount-proc powoduje,
że równocześnie tworzy nową przestrzeń
nazw montowań i montuje nowy system plików proc(5),
zawierający informacje odnoszące się do nowej
przestrzeni nazw PID. Gdy polecenie readlink(1) zakończy
się, nowe przestrzenie nazw są automatycznie usuwane.
# unshare --fork --pid --mount-proc readlink /proc/self
1
Jako użytkownik nieuprzywilejowany, tworzy nową
przestrzeń nazw użytkownika, gdzie poświadczenia
użytkownika są przypisywane do identyfikatorów roota
wewnątrz przestrzeni nazw:
$ id -u; id -g
1000
1000
$ unshare --user --map-root-user \
sh -c 'whoami; cat /proc/self/uid_map /proc/self/gid_map'
root
0 1000 1
0 1000 1
Jako użytkownik nieuprzywilejowany, tworzy
przestrzeń nazw użytkownika, gdzie przypisane jest pierwszych
65536 identyfikatorów, a poświadczenia użytkownika
są przypisywane do identyfikatorów roota wewnątrz
przestrzeni nazw. Przypisanie odbywa się na podstawie
podległych identyfikatorów przypisanych w subuid(5) i
subgid(5). Następnie demonstrujemy przypisanie tworząc
plik z identyfikatorem użytkownika 1 i identyfikatorem grupy 1. Ze
względu na zwięzłość, pokazywane
są tylko przypisania identyfikatora użytkownika:
$ id -u
1000
$ cat /etc/subuid
1000:100000:65536
$ unshare --user --map-auto --map-root-user
# id -u
0
# cat /proc/self/uid_map
0 1000 1
1 100000 65535
# touch plik; chown 1:1 plik
# ls -ln --time-style=+ plik
-rw-r--r-- 1 1 1 0 plik
# exit
$ ls -ln --time-style=+ plik
-rw-r--r-- 1 100000 100000 0 plik
Pierwsze z poniższych poleceń tworzy nową,
trwałą przestrzeń nazw UTS i modyfikuje nazwę
stacji (hostname) widoczną w tej przestrzeni nazw. Następnie
wchodzimy w przestrzeń nazw za pomocą nsenter(1), aby
wyświetlić zmodyfikowaną nazwę stacji; krok ten
pokazuje, że przestrzeń nazw UTS wciąż istnieje
nawet pomimo tego, że po zakończeniu polecenia unshare,
nie posiada już żadnych procesów. Następnie
przestrzeń nazw jest niszczona poprzez usunięcie montowania
przez podpięcie.
# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname FOO
# nsenter --uts=/root/uts-ns hostname
FOO
# umount /root/uts-ns
Poniższe polecenia tworzą trwałą
przestrzeń nazw montowań, do której odnosi się
montowania przez podpięcie /root/namespaces/mnt. Aby
zapewnić, że utworzenie tego montowania przez podpięcie
powiedzie się, katalog nadrzędny (/root/namespaces)
tworzony jest jako montowania przez podpięcie, którego typem
nie jest shared.
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt
Poniższe polecenia demonstrują korzystanie z opcji
--kill-child przy tworzeniu przestrzeni nazw PID, aby
zapewnić, że gdy unshare jest zabijany, zabijane
są też wszystkie procesy wewnątrz przestrzeni nazw
PID.
# set +m # Nie wypisuje komunikatów ze stanem zadań
# unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53456
# PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# ps h -o 'comm' $! # Pokazujemy, że zadaniem w tle jest unshare(1)
unshare
# kill $! # Zabijamy unshare(1)
# pidof sleep
Polecenie pidof(1) nic nie wypisało, ponieważ
procesy sleep zostały zabite. Mówiąc
dokładniej, gdy proces sleep posiadający PID 1 w
przestrzeni nazw (tj. będący procesem init przestrzeni nazw)
został zabity, spowodowało to zabicie wszystkich
pozostałych procesów w tej przestrzeni nazw. Inaczej
będzie, gdy wydamy podobną serię poleceń nie
korzystając z opcji --kill-child; wówczas po
zakończeniu unshare procesy w przestrzeni nazw PID nie
są zabijane
# unshare --pid --fork --mount-proc -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53479
# PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# kill $!
# pidof sleep
53482 53480
Poniższy przykład pokazuje utworzenie przestrzeni
nazw czasu, w której zegar liczący czas od rozruchu jest
ustawiany na kilka lat wstecz:
# uptime -p # Pokazujemy czas dział. w pierw. prz. nazw czasu
up 21 hours, 30 minutes
# unshare --time --fork --boottime 300000000 uptime -p
up 9 years, 28 weeks, 1 day, 2 hours, 50 minutes
Poniższy przykład wykonuje chroot do katalogu
/chroot/powerpc/jessie i instaluje program interpretujący
/bin/qemu-ppc-static do wykonywania plików binarnych
powerpc.
$ unshare --map-root-user --fork --pid --load-interp=":qemu-ppc:M::\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x14:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff:/bin/qemu-ppc-static:OCF" --root=/chroot/powerpc/jessie /bin/bash -l
Parametr load-interp można
rozszyfrować następująco
qemu-ppc
jest nazwą nowego pliku tworzonego w katalogu
/proc/sys/fs/binfmt_misc, do zarejestrowania programu
interpretującego
M
definiuje program interpretujący dla danego typu
liczby magicznej
\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1
jest liczbą magiczną do rozpoznawania pliku
do zinterpretowania (w tym przypadku, jest to nagłówek ELF
PPC32)
\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff
jest maską do stosowania liczby magicznej
/bin/qemu-ppc-static
program interpretujący stosowany z danym
plikiem
OCF
plik jest otwierany przez jądro z
poświadczeniami i tokenami bezpieczeństwa samego pliku i
ładowany tuż po jego zarejestrowaniu.