Scroll to navigation

UNSHARE(1) Användarkommandon UNSHARE(1)

NAMN

unshare - kör program i nya namnområden

SYNOPSIS

unshare [flaggor] [program [argument]]

BESKRIVNING

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:

monteringsnamnrymd

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-namnrymd

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ätverksnamnrymd

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-namnrymd

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-namnrymd

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ändarnamnrymd

Processen kommer att ha en distinkt uppsättning UID:er, GID:er och kapaciteter. För ytterligare information, se user_namespaces(7).

tidsnamnrymd

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).

FLAGGOR

-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

Vidarebefordra signalerna SIGTERM och SIGINT som föräldraprocessen unshare tar emot till barnprocessen. Om flaggan inte anges ignorerar unshare dessa signaler medan den väntar på att barnprocessen avslutas (standardbeteende sedan util-linux 2.36). Detta gör att föräldern kan fortsätta leva medan barnprocessen hanterar signalerna.

Flaggan är användbar när föräldraprocessen unshare kommer att ta emot SIGTERM eller SIGINT (exempelvis vid systemomstart eller från en processhanterare), och du vill att barnprocessen ska underrättas om begäran om ordnad avstängning så att den kan städa upp. Om barnprocessen har signalhanterare (såsom trap-hanterare i skal) gör flaggan att dessa kan köras.

Denna flagga medför --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]

Montera filsystemet binfmt_misc vid monteringspunkt (standard är /proc/sys/fs/binfmt_misc) precis innan programmet körs. Detta medför också att en ny monteringsnamnrymd skapas, eftersom binfmt_misc-monteringen annars skulle störa befintliga program på systemet. Det nya binfmt_misc-filsystemet monteras uttryckligen som privat (med 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:n som ägs av den effektiva användaren från /etc/subuid till ett block som börjar på användar-ID 0. Mappa på samma sätt 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. Alternativet är avsett för 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. Det motsvarar --map-users=auto och --map-groups=auto.

--map-subids

Identitetsmappa det första blocket med användar-ID:n som ägs av den effektiva användaren från /etc/subuid. Identitetsmappa på samma sätt det första blocket med grupp-ID:n som ägs av den effektiva gruppen från /etc/subgid. Alternativet motsvarar --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

Ställ in ägaranvändare och ägargrupp när en användarnamnrymd skapas. Dessa avgör vilken användare i föräldranamnrymden som har CAP_SYS_ADMIN i den nya barnnamnrymden och kan gå in i den med setns(2). Flaggan tillåter en privilegierad användare att skapa en namnrymd åt en användare utan privilegier, och använda sina privilegier för att mappa id:n och/eller bind-montera namnrymden i filsystemet. Medför --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.

ANMÄRKNINGAR

Filsystemen proc och sysfs som monteras som root i ett användarnamnområde måste begränsas så att en mindre privilegierad användare inte kan få mer tillgång till känsliga filer som en mer privilegierad användare gjorde otillgängliga. Kort sagt är regeln för proc och sysfs så nära en bind mount som möjligt.

EXEMPEL

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
$ 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 file; chown 1:1 file # ls -ln --time-style=+ file -rw-r--r-- 1 1 1 0 file # exit $ ls -ln --time-style=+ file -rw-r--r-- 1 100000 100000 0 file

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 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' $! # Visa att bakgrundsjobbet är unshare(1) unshare # kill $! # Avsluta unshare(1) # pidof sleep

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 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

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

Följande exempel kör en chroot till katalogen /chroot/powerpc/jessie och installerar tolken /bin/qemu-ppc-static för att köra powerpc-binärfilerna.

$ 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.

UPPHOVSPERSONER

Mikhail Gusarov <dottedmag@dottedmag.net>, Karel Zak <kzak@redhat.com>

SE ÄVEN

newuidmap(1), newgidmap(1), nsenter(1), lsns(8), clone(2), unshare(2), namespaces(7), mount(8)

FELRAPPORTERING

För felrapporter, använd felhanteraren <https://github.com/util-linux/util-linux/issues>.

TILLGÄNGLIGHET

Kommandot unshare ingår i paketet util-linux som kan hämtas från Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.

2026-09-25 util-linux 2.42.4