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:

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

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

ANTECKNINGAR

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

UPPHOVSPERSONER

SE ÄVEN

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

FELRAPPORTERING

För felrapporter, använd

TILLGÄNGLIGHET

Kommandot unshare ingår i paketet util-linux som kan hämtas från