Kommandot unshare skapar nya namnrymder (som anges med
kommandoradsflaggor som beskrivs nedan) och kör sedan det angivna
programmet. Om program inte anges körs
"${SHELL}" (standard: /bin/sh).
Som standard finns ett nytt namnområde bara kvar så
länge det har medlemsprocesser. Ett nytt namnområde kan
göras beständigt även när det inte har
några medlemsprocesser genom att binda montering av
/proc/pid/ns/typ-filer till en filsystemssökväg.
Ett namnområde som har gjorts beständigt på det
här sättet kan därefter beträdas med
nsenter(1) även efter att programmet har avslutats
(utom PID-namnområden där en permanent init-process
krävs). När en persistent namnrymd inte längre
behövs kan den avpersisteras genom att använda
umount(8) för att ta bort bind mount. Se avsnittet
EXEMPEL för mer information.
unshare eftersom util-linux version 2.36 använder
/proc/[pid]/ns/pid_for_children och
/proc/[pid]/ns/time_for_children-filer för beständiga
PID- och TIME-namnområden. Denna ändring kräver
Linux-kärnan 4.17 eller nyare.
Följande typer av namnrymder kan skapas med
unshare:
montera namnrymd
Montering och avmontering av filsystem påverkar
inte resten av systemet, utom för filsystem som uttryckligen markeras
som delade (med
mount --make-shared; se
/proc/self/mountinfo
eller
findmnt -o+PROPAGATION för flaggorna
shared).
För ytterligare information, se
mount_namespaces(7).
unshare sedan util-linux version 2.27 ställer
automatiskt in propagering till private i ett nytt
mount-namnområde för att säkerställa att det nya
namnområdet verkligen är unshared. Det är
möjligt att inaktivera den här funktionen med flaggan
--propagation oförändrad. Observera att private
är kärnans standardinställning.
UTS namnrymd
Inställning av värdnamn eller
domännamn påverkar inte resten av systemet. För
ytterligare information, se
uts_namespaces(7).
IPC-namnområde
Processen kommer att ha en oberoende namnrymd för
POSIX-meddelandeköer samt System V-meddelandeköer,
semaforuppsättningar och delade minnessegment. För ytterligare
information, se
ipc_namespaces(7).
nätverkets namnrymd
Processen kommer att ha oberoende IPv4- och IPv6-stackar,
IP-routingtabeller, brandväggsregler, katalogträden
/proc/net och
/sys/class/net, uttag, etc. För ytterligare
information, se
network_namespaces(7).
PID namnområde
Barn kommer att ha en annan uppsättning
PID-till-process-mappningar än sin förälder. För
ytterligare information, se
pid_namespaces(7).
cgroup namnområde
Processen kommer att ha en virtualiserad vy av
/proc/self/cgroup, och nya cgroup-monteringar kommer att ha sin rot i
namnrymden cgroup root. För ytterligare information, se
cgroup_namespaces(7).
användarens namnområde
Processen kommer att ha en distinkt uppsättning
UID:er, GID:er och kapaciteter. För ytterligare information, se
user_namespaces(7).
tid namnrymd
Processen kan ha en egen syn på
CLOCK_MONOTONIC och/eller
CLOCK_BOOTTIME som kan ändras
med
/proc/self/timens_offsets. För ytterligare information, se
time_namespaces(7).
-i, --ipc[=fil]
Skapa ett nytt IPC-namnområde. Om fil anges
görs namnrymden beständig genom att skapa en bind mount
på fil.
-m, --mount[=fil]
Skapa ett nytt mount-namnområde. Om fil
anges görs namnområdet beständigt genom att ett
bind-mount skapas på fil. Observera att fil måste
finnas på en mount vars propagationstyp inte är shared
(annars uppstår ett fel). Använd kommandot findmnt
-o+PROPAGATION om du inte är säker på den aktuella
inställningen. Se även exemplen nedan.
-n, --net[=fil]
Skapa ett nytt nätverksnamnområde. Om
fil anges görs namnrymden beständig genom att skapa en
bind mount på fil.
-p, --pid[=fil]
Skapa ett nytt PID-namnområde. Om
fil anges
görs namnrymden beständig genom att skapa en bind mount
på
fil. (Skapandet av ett beständigt
PID-namnområde misslyckas om flaggan
--fork inte också
anges)
Se även flaggorna --fork och
--mount-proc.
-u, --uts[=fil]
Skapa ett nytt UTS-namnområde. Om fil anges
görs namnrymden beständig genom att skapa en bind mount
på fil.
-U, --user[=fil]
Skapa ett nytt användarnamnområde. Om
fil anges görs namnområdet beständigt genom att
skapa en bind mount på fil.
-C, --cgroup[=fil]
Skapa ett nytt cgroup-namnområde. Om fil
anges görs namnområdet beständigt genom att skapa en bind
mount på fil.
-T, --time[=fil]
Skapa ett nytt tidsnamnområde. Om fil anges
görs namnrymden beständig genom att skapa en bind mount
på fil. Flaggorna --monotonic och --boottime kan
användas för att ange motsvarande förskjutning i
tidsnamnrymden.
-f, --fork
Fork det angivna programmet som en underordnad
process till unshare i stället för att köra det
direkt. Detta är användbart när du skapar ett nytt
PID-namnområde. Observera att när unshare väntar
på barnprocessen ignorerar den SIGINT och SIGTERM och
vidarebefordrar inga signaler till barnprocessen. Det är
nödvändigt att skicka signaler till den underordnade
processen.
--forward-signals
Forward
SIGTERM and
SIGINT signals received
by the parent
unshare process to the child process. When this option is
not specified,
unshare ignores these signals while waiting for the
child process to exit (the default behavior since util-linux 2.36). This
allows the parent to remain alive while the child process handles the signals.
This option is useful when the parent unshare process will
receive SIGTERM or SIGINT signals (for example, during system
reboot or from a process manager), and you want the child process to be
notified of graceful shutdown requests so it can perform cleanup operations.
If your child process has signal handlers (such as shell trap handlers),
enabling this option allows them to execute.
This option implies --fork.
--keep-caps
När flaggan --user anges ska du se till att
de möjligheter som ges i användarnamnområdet bevaras i
barnprocessen.
--kill-child[=signame]
När unshare avslutas ska signame
skickas till den förgrenade barnprocessen. Kombinerat med --pid
möjliggör detta en enkel och tillförlitlig dödande
av hela processträdet under unshare. Om signame inte
anges är standardvärdet SIGKILL. Denna flagga implicerar
--fork.
--mount-proc[=monteringspunkt]
Precis innan du kör programmet ska du montera
proc-filsystemet på monteringspunkt (standard är
/proc). Detta är användbart när du skapar ett nytt
PID-namnområde. Det innebär också att man skapar ett nytt
mount-namnområde eftersom /proc-monteringen annars skulle
störa befintliga program på systemet. Det nya proc-filsystemet
är uttryckligen monterat som privat (med
MS_PRIVATE|MS_REC).
--mount-binfmt[=monteringspunkt]
Just before running the program, mount the binfmt_misc
filesystem at mountpoint (default is /proc/sys/fs/binfmt_misc).
It also implies creating a new mount namespace since the binfmt_misc mount
would otherwise mess up existing programs on the system. The new binfmt_misc
filesystem is explicitly mounted as private (with
MS_PRIVATE|MS_REC).
--map-user uid|namn
Kör programmet först efter att det aktuella
effektiva användar-ID:t har mappats till uid. Om denna flagga
anges flera gånger har den sista förekomsten
företräde. Denna flagga implicerar --user.
--map-users
inneruid:outeruid:count|auto|subids|all
Kör programmet först efter att blocket med
användar-ID:n av storleken
count som börjar på
outeruid har mappats till blocket med användar-ID:n som
börjar på
inneruid. Denna mappning skapas med
newuidmap(1) om
unshare kördes utan privilegier. Om
intervallet med användar-ID:n överlappar med den mappning som
anges av
--map-user, kommer ett "hål" att tas bort
från mappningen. Detta kan resultera i att det högsta
användar-ID:t i mappningen inte mappas. Använd
--map-users flera gånger för att mappa mer än ett
block med användar-ID:n. Specialvärdet
auto mappar det
första blocket med användar-ID som ägs av den faktiska
användaren från
/etc/subuid till ett block som
börjar med användar-ID 0. Det särskilda värdet
subids identitetsmappar samma block. Specialvärdet
all
skapar en pass-through-mappning för varje användar-ID som finns
i det överordnade namnområdet. Denna flagga implicerar
--user.
Före util-linux version 2.39 förväntade sig
den här flaggan ett kommaseparerat argument av formen
outeruid,inneruid,count men det formatet
är nu borttaget för att överensstämma med den
ordning som används i /proc/[pid]/uid_map och
monteringsflaggan X-mount.idmap.
--map-group gid|namn
Kör programmet först efter att det aktuella
effektiva grupp-ID:t har mappats till gid. Om den här flaggan
anges flera gånger har den sista förekomsten
företräde. Den här flaggan förutsätter
--setgroups=deny och --user.
--map-groups
innergid:outergid:count|auto|subids|all
Kör programmet först efter att blocket med
grupp-ID:n av storleken
count som börjar på
outergid har mappats till blocket med grupp-ID:n som börjar
på
innergid. Denna mappning skapas med
newgidmap(1) om
unshare kördes utan privilegier. Om intervallet med grupp-ID:n
överlappar med den mappning som anges av
--map-group, kommer ett
"hål" att tas bort från mappningen. Detta kan
resultera i att det högsta grupp-ID:t i mappningen inte mappas.
Använd
--map-groups flera gånger för att mappa mer
än ett block med grupp-ID:n. Specialvärdet
auto mappar
det första blocket med användar-ID som ägs av den
faktiska användaren från
/etc/subgid till ett block som
börjar med grupp-ID 0. Specialvärdet
subids
identitetsmappar samma block. Specialvärdet
all skapar en
pass-through-mappning för varje grupp-ID som är
tillgängligt i den överordnade namnrymden. Denna flagga
förutsätter
--user.
Före util-linux version 2.39 förväntade sig
den här flaggan ett kommaseparerat argument av formen
outergid,innergid,count men det formatet
är nu borttaget för att överensstämma med den
ordning som används i /proc/[pid]/gid_map och
monteringsflaggan X-mount.idmap.
--map-auto
Mappa det första blocket med användar-ID
som ägs av den faktiska användaren från
/etc/subuid till ett block som börjar på
användar-ID 0. På samma sätt mappar du även det
första blocket med grupp-ID:n som ägs av den effektiva gruppen
från /etc/subgid till ett block som börjar på
grupp-ID 0. Den här flaggan är avsett att hantera det vanliga
fallet där det första blocket med underordnade användar-
och grupp-ID:n kan mappa hela användar- och grupp-ID-utrymmet. Den
här flaggan är likvärdigt med att ange
--map-users=auto och --map-groups=auto.
--map-subids
Identitetsmappa det första blocket med
användar-ID:n som ägs av den faktiska användaren
från /etc/subuid. På samma sätt
identitetskartläggs även det första blocket med
grupp-ID:n som ägs av den faktiska gruppen från
/etc/subgid. Denna flagga är likvärdigt med att ange
--map-users=subids och --map-groups=subids.
-r, --map-root-user
Kör programmet först efter att de aktuella
effektiva användar- och grupp-ID:n har mappats till
superanvändarens UID och GID i den nyskapade användarnamnrymden.
Detta gör det möjligt att på ett bekvämt
sätt få de funktioner som behövs för att hantera
olika aspekter av de nyskapade namnrymderna (t.ex. konfigurera
gränssnitt i nätverksnamnrymden eller montera filsystem i
mount-namnrymden) även när programmet körs utan
privilegier. Det är en ren bekvämlighetsfunktion och
stöder inte mer sofistikerade användningsfall, t.ex. mappning av
flera UID- och GID-intervall. Den här flaggan förutsätter
--setgroups=deny och --user. Den här flaggan är
likvärdigt med --map-user=0 --map-group=0.
-c, --map-current-user
Kör programmet först efter att de aktuella
effektiva användar- och grupp-ID:n har mappats till samma UID och GID i
det nyskapade användarnamnområdet. Den här flaggan
förutsätter --setgroups=deny och --user. Den
här flaggan motsvarar --map-user=$(id -ru) --map-group=$(id
-rg).
--owner uid:gid
Set the owner user and group when creating a user
namespace. These determine which user in the parent namespace has
CAP_SYS_ADMIN in the new child namespace and can
setns(2) into it. This
option allows a privileged user to create a namespace on behalf of an
unprivileged one, using its privileges to map ids and/or bind mount the
namespace into the filesystem. It implies
--user.
--propagation
private|shared|slave|unchanged
Ställer rekursivt in flaggan för
mount-propagering i det nya mount-namnområdet.
Standardinställningen är att sätta spridningen till
private. Det är möjligt att inaktivera den här
funktionen med argumentet unchanged. Flaggan ignoreras i tysthet
när namnområdet för montering (--mount) inte
begärs.
--setgroups allow|deny
Tillåt eller neka systemanropet
setgroups(2) i ett användarnamnområde.
För att kunna anropa setgroups(2) måste den
anropande processen åtminstone ha CAP_SETGID. Men sedan Linux
3.19 gäller ytterligare en begränsning: kärnan ger
tillstånd att anropa setgroups(2) först efter att
GID-kartan (/proc/pid*/gid_map*) har ställts in.
GID-kartan är skrivbar av root när setgroups(2)
är aktiverad (dvs. allow, standard), och GID-kartan blir
skrivbar av oprivilegierade processer när setgroups(2)
är permanent inaktiverad (med deny).
-R, --root dir
kör kommandot med rotkatalogen inställd
på dir.
-w, --wd dir
ändra arbetskatalog till dir.
-S, --setuid uid
Ange det användar-ID som ska användas i den
angivna namnrymden.
-G, --setgid gid
Ange det grupp-ID som ska användas i den angivna
namnrymden och släpp tilläggsgrupper.
-l, --load-interp sträng
Ladda binfmt_misc-definitionen i namnrymden
(innebär
--mount-binfmt). Argumentet
sträng
är
:namn:typ:offset:magic:mask:tolk:flaggor.
För mer information om registrering av nya binära typer, se
https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst.
För att hantera F-flaggan i
flags med
parametern
--root monteras binfmt_misc två gånger, en
gång före chroot för att ladda tolken från det
anropande filsystemet och en gång efter för att göra den
tillgänglig från chroot-användarutrymmet.
--monotonic offset
Ställ in den offset för
CLOCK_MONOTONIC som ska användas i den angivna tidsnamnrymden.
Denna flagga kräver att en tidsnamnrymd inte delas med
--time.
--boottime offset
Ställ in den offset för
CLOCK_BOOTTIME som ska användas i den angivna tidsnamnrymden.
Denna flagga kräver att en tidsnamnrymd inte delas med
--time.
-h, --help
Visa hjälptext och avsluta.
-V, --version
Visa version och avsluta.
Följande kommando skapar ett PID-namnområde och
använder --fork för att se till att kommandot
utförs i en underordnad process som (eftersom den är den
första processen i namnområdet) har PID 1. Flaggan
--mount-proc säkerställer att en ny mount-namnrymd
samtidigt skapas och att ett nytt proc(5)-filsystem monteras som
innehåller information som motsvarar den nya PID-namnrymden.
När kommandot readlink(1) avslutas rivs de nya namnrymderna
automatiskt.
# unshare --fork --pid --mount-proc readlink /proc/self
1
Skapa en ny användarnamnrymd som en icke-privilegierad
användare där användarens autentiseringsuppgifter
mappas till rot-ID:n i namnrymden:
$ 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
Som en icke-privilegierad användare skapar du ett
användarnamnområde där de första 65536 ID:n
mappas och användarens autentiseringsuppgifter mappas till rot-ID:n i
namnområdet. Mappningen bestäms av de underordnade ID:n som
tilldelats i subuid(5) och subgid(5). Demonstrera denna
mappning genom att skapa en fil med användar-ID 1 och grupp-ID 1. I
korthet visas endast mappningarna av användar-ID:
$ id -u
1000
$ katt /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 fil; chown 1:1 fil
# ls -ln --time-style=+ file
-rw-r--r-- 1 1 1 0 fil
# exit
$ ls -ln --time-style=+ fil
-rw-r--r-- 1 100000 100000 0 fil
Det första av följande kommandon skapar ett nytt
beständigt UTS-namnområde och ändrar värdnamnet
så som det visas i det namnområdet. Namnrymden öppnas
sedan med nsenter(1) för att visa det modifierade
värdnamnet; detta steg visar att UTS-namnrymden fortsätter att
existera även om namnrymden inte hade några medlemsprocesser
efter att kommandot unshare avslutades. Namnrymden
förstörs sedan genom att bind mount tas bort.
# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname FOO
# nsenter --uts=/root/uts-ns hostname
FOO
# umount /root/uts-ns
Följande kommandon upprättar ett beständigt
namnområde för montering som refereras av bindningsmonteringen
/root/namespaces/mnt. För att säkerställa att
skapandet av denna bind-mount lyckas görs den överordnade
katalogen (/root/namespaces) till en bind-mount vars spridningstyp
inte är shared.
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt
Följande kommandon visar hur du använder flaggan
--kill-child när du skapar en PID-namnrymd, för att
säkerställa att alla processer inom PID-namnrymden
dödas när unshare dödas.
# set +m # Skriv inte ut statusmeddelanden för jobb
# unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53456
# PID TTY STAT TID KOMMANDO
1 pts/3 S+ 0:00 sömn 999
3 pts/3 S+ 0:00 sömn 555
5 pts/3 R+ 0:00 ps a
# ps h -o 'comm' $! # Visa att bakgrundsjobbet är unshare(1)
unshare
# kill $! # Kill unshare(1)
# pidof sömn
Kommandot pidof(1) ger ingen utdata, eftersom
sleep-processerna har dödats. Närmare bestämt,
när sleep-processen som har PID 1 i namnrymden (dvs.
namnrymdens init-process) dödades, ledde detta till att alla andra
processer i namnrymden dödades. Däremot visar en liknande
serie kommandon där flaggan --kill-child inte används
att processerna i PID-namnområdet inte dödas när
unshare avslutas:
# unshare --pid --fork --mount-proc -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53479
# PID TTY STAT TID KOMMANDO
1 pts/3 S+ 0:00 sömn 999
3 pts/3 S+ 0:00 sömn 555
5 pts/3 R+ 0:00 ps a
# kill $!
# pidof sömn
53482 53480
Följande exempel visar hur man skapar ett
tidsnamnområde där klockan boottime är inställd
på en tidpunkt flera år bakåt i tiden:
# uptime -p # Visa upptid i det ursprungliga tidsnamnrymden
upp 21 timmar, 30 minuter
# unshare --time --fork --boottime 300000000 uptime -p
upp 9 år, 28 veckor, 1 dag, 2 timmar, 50 minuter
The following example executes a chroot into the directory
/chroot/powerpc/jessie and installs the interpreter
/bin/qemu-ppc-static to execute the powerpc binaries.
$ 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
Parametern load-interp kan läsas
på följande sätt
qemu-ppc
är namnet på den nya fil som skapas under
/proc/sys/fs/binfmt_misc för att registrera
tolken
M
definierar tolken för en viss typ av magiskt
tal
\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1
är det magiska talet för att känna
igen filen som ska tolkas (i det här fallet ELF-headern för
PPC32)
\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff
den mask som ska tillämpas på det magiska
numret
/bin/qemu-ppc-static
den tolk som ska användas med filen
OCF
filen öppnas av kärnan med legitimation och
säkerhetstoken för själva filen och laddas så
snart vi registrerar den.