mount_namespaces(7) Miscellaneous Information Manual mount_namespaces(7)

mount_namespaces — översikt över Linux monteringsnamnrymder

För en översikt över namnrymder, se namespaces(7).

Monteringsnamnrymder ger isolering av listan över monteringar som ses av processerna i varje namnrymdsinstans. Alltså, processerna i var och en av instanserna av monteringsnamnrymder kommer se distinkta enkatalogershierarkier.

Vyerna som ges av filerna /proc/pid/mounts, /proc/pid/mountinfo och /proc/pid/mountstats (som alla beskrivs i proc(5)) motsvarar monteringsnamnrymden i vilken processen med PID pid bor. (Alla processerna som bor i samma monteringsnamnrymd kommer se samma vy i dessa filer.)

En ny monteringsnamnrymd skapas genom att använda antingen clone(2) eller unshare(2) med flaggan CLONE_NEWNS. När en ny monteringsnamnrymd skapas initieras dess monteringslista enligt följande:

Om namnrymden skapas med clone(2) är monteringslistan för barnets namnrymd en kopia av monteringslistan i föräldraprocessens monteringsnamnrymd.
Om namnrymden skapas med unshare(2) är monteringslistan för den nya namnrymden en kopia av monteringslistan i anroparens tidigare monteringsnamnrymd.

Senare ändringar av monteringslistan (mount(2) och umount(2)) i endera monteringsnamnrymden kommer inte (som standard) att påverka monteringslistan som ses i den andra namnrymden (men se följande diskussion om delade underträd).

Efter implementationen av monteringsnamnrymder var klar visade erfarenheterna att isoleringen som de gav var, i några fall, för stor. Till exempel, för att göra en nyss laddad optisk disk tillgänglig i alla monteringsnamnrymder krävdes en monteringsåtgärd i varje namnrymd. För detta användningsfall, och andra, introducerades funktionen med delade underträd i Linux 2.6.15. Denna funktion tillåter automatisk, kontrollerad spridning av händelserna mount(2) och umount(2) mellan namnrymder (eller, mer exakt, mellan monteringar som är medlemmar av en partnergrupp som sprider händelser till varandra).

Varje montering markeras (via mount(2)) som att ha en av följande spridningstyper:

Denna montering delar händelser med medlemmar av en partnergrupp. Händelserna mount(2) och umount(2) omedelbart under denna montering kommer spridas till andra monteringar som är medlemmar av partnergruppen. Spridning betyder här att samma mount(2) eller umount(2) automatiskt kommer ske under alla de andra monteringarna i partnergruppen. Omvänt kommer händelserna mount(2) och umount(2) som sker under partnermonteringar att spridas till denna montering.
Denna montering är privat; den har inte någon partnergrupp. Händelserna mount(2) och umount(2) sprids inte in i eller ut från denna montering.
Händelserna mount(2) och umount(2) sprids in i denna montering från en delad (huvud)partnergrupp. Händelserna mount(2) och umount(2) under denna montering sprids inte till någon partner.
Observera att en montering kan vara slav till en annan partnergrupp och på samma gång dela händelserna mount(2) och umount(2) med en partnergrupp som den är medlem i. (Mer exakt, en partnergrupp kan vara slav till en annan partnergrupp.)
Detta är som en privat montering, och dessutom kan denna montering inte bindmonteras. Försök att bindmontera denna montering (mount(2) med flaggan MS_BIND) kommer att misslyckas.
När en rekursiv bindningsmontering (mount(2) med flaggorna MS_BIND och MS_REC) utförs på ett katalogunderträd ansas automatiskt eventuella bindningsmonteringar inuti underträdet (d.v.s., replikeras inte) när det underträdet replikeras för att skapa ett målunderträd.

För en diskussion om spridningstypen tilldelad till en ny montering, se NOTERINGAR.

Spridningstypen är en inställning per monteringspunkt; några monteringar kan markeras som delade (med varje delad montering en medlem av en distinkt partnergrupp), medan andra är privata (eller slavar eller obindbara).

Observera att en monterings spridningstyp avgör huruvida mount(2) och umount(2) av monteringar omedelbart under monteringen sprids. Alltså, spridningstypen påverkar inte spridningen av händelser för barnbarn och mer avlägsna avkommemonteringar. Vad som händer om monteringen själv avmonteras avgörs av spridningstypen som gäller för föräldern till monteringen.

Medlemmar läggs till i en partnergrupp när en montering markeras som delad och antingen:

(a)
monteringen replikeras när en ny monteringsnamnrymd skapas; eller
(b)
en ny bindmontering skapas från monteringen.

I båda dessa fall går den nya monteringen med i partnergruppen som den befintliga monteringen är medlem i.

En ny partnergrupp skapas också när en barnmontering skapas under en befintlig montering som är markerad som delad. I detta fall markeras även barnmonteringen som delad och den resulterande partnergruppen består av alla monteringar som replikeras under partner till föräldramonteringarna.

En montering upphör att vara medlem i en partnergrupp när antingen monteringen uttryckligen avmonteras, eller när monteringen implicit avmonteras för att en monteringsnamnrymd tas bort (för att den inte har några fler medlemsprocesser).

Spridningstypen för monteringen i en monteringsnamnrymd kan upptäckas via de ”valfria fälten” som visas i /proc/pid/mountinfo. (Se proc(5) för detaljer om denna fil.) Följande taggar kan förekomma i de valfria fälten för en post i den filen:

Denna montering delas i partnergruppen X. Varje partnergrupp har ett unikt ID som automatiskt genereras av kärnan, och alla monteringar i samma partnergrupp kommer visa samma ID. (Dessa ID:n tilldelas med början från värdet 1, och kan återanvändas när en partnergrupp upphör att ha några medlemmar.)
Denna montering är en slav till den delade partnergruppen X.
Denna montering är en slav och tar emot spridningar från den delade partnergruppen X. Denna tagg kommer alltid förekomma tillsammans med en tagg master:X. Här är X den närmaste dominanta partnergruppen under processens rotkatalog. Om X är det omedelbara huvudet av monteringen, eller om det inte finns någon dominant partnergrupp under samma rot, då finns bara fältet master:X och inte fältet propagate_from:X. För fler detaljer, se nedan.
Detta är en obindbar montering.

Om ingen av ovanstående flaggor finns, då är detta en privat montering.

Exempel på MS_SHARED och MS_PRIVATE

Anta att vi i en terminal i den initiala monteringsnamnrymden markerar en montering som delad och en annan som privat, och sedan betraktar monteringarna i /proc/self/mountinfo:


sh1# mount --make-shared /mntD
sh1# mount --make-private /mntP
sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
77 61 8:17 / /mntD rw,relatime shared:1
83 61 8:15 / /mntP rw,relatime

Av utdata från /proc/self/mountinfo ser vi att /mntD är en delad montering i partnergrupp 1, och att /mntP inte har några valfria taggar, vilket indikerar att det är en privat montering. De första två fälten i varje post i denna fil är det unika ID:t för denna montering, och monterings-ID för föräldramonteringen. Vi kan vidare inspektera denna fil för att se att föräldramonteringen till /mntD och /mntP är rotkatalogen, /, vilken är monterad privat:


sh1# cat /proc/self/mountinfo | awk '$1 == 61' | sed 's/ - .*//'
61 0 8:2 / / rw,relatime

I en andra terminal skapar vi en ny monteringsnamnrymd där vi kör ett andra skal och inspekterar monteringarna:


$ PS1='sh2# ' sudo unshare -m --propagation unchanged sh
sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
222 145 8:17 / /mntD rw,relatime shared:1
225 145 8:15 / /mntP rw,relatime

Den nya monteringsnamnrymden fick en kopia av den initiala monteringsnamnrymdens monteringar. Dessa nya monteringar behåller samma spridningstyper, men har unika monterings-ID:n. (Flaggan --propagation unchanged förhindrar att unshare(1) markerar alla monteringar som privata när den skapar en ny monteringsnamnrymd, vilket den gör som standard.)

I den andra terminalen skapar vi sedan undermonteringar under vardera av /mntD och /mntP och inspekterar uppsättningen:


sh2# mkdir /mntD/a
sh2# mount /dev/sdb6 /mntD/a
sh2# mkdir /mntP/b
sh2# mount /dev/sdb7 /mntP/b
sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
222 145 8:17 / /mntD rw,relatime shared:1
225 145 8:15 / /mntP rw,relatime
178 222 8:22 / /mntD/a rw,relatime shared:2
230 225 8:23 / /mntP/b rw,relatime

Från ovanstående kan man se att /mntD/a skapades som delad (ärvde denna inställning från sin föräldramontering) och /mntP/b skapades som en privat montering.

Om vi återgår till den första terminalen och inspekterar uppsättningen ser vi att den nya monteringen som skapades under den delade monteringen /mntD spreds till sin partnermontering (i den initiala monteringsnamnrymden), men den nya monteringen som skapades under den privata monteringen /mntP spreds inte:


sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
77 61 8:17 / /mntD rw,relatime shared:1
83 61 8:15 / /mntP rw,relatime
179 77 8:22 / /mntD/a rw,relatime shared:2

Exempel på MS_SLAVE

Att skapa en montering som slav låter den ta emot händelser mount(2) och umount(2) som sprids från den delade huvudpartnergruppen, samtidigt som den förhindras från att sprida händelser till huvudet. Detta är användbart om vi vill (exempelvis) ta emot en monteringshändelse när en optisk skiva monteras i den delade huvudpartnergruppen (i en annan monteringsnamnrymd), men vill förhindra händelser mount(2) och umount(2) under slavmonteringen från att ha sidoeffekter i andra namnrymder.

Vi kan demonstrera effekten av slavförhållandet genom att först markera två monteringar som delade i den initiala monteringsnamnrymden:


sh1# mount --make-shared /mntX
sh1# mount --make-shared /mntY
sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
132 83 8:23 / /mntX rw,relatime shared:1
133 83 8:22 / /mntY rw,relatime shared:2

I en andra terminal skapar vi en ny monteringsnamnrymd och inspekterar monteringarna:


sh2# unshare -m --propagation unchanged sh
sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime shared:2

I den nya monteringsnamnrymden markerar vi sedan en av monteringarna som en slav:


sh2# mount --make-slave /mntY
sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime master:2

Från ovanstående utdata ser vi att /mntY nu är en slavmontering som tar emot spridningshändelser från den delade partnergruppen med ID:t 2.

Fortfarande i den nya namnrymden skapar vi undermonteringar under var och en av /mntX och /mntY:


sh2# mkdir /mntX/a
sh2# mount /dev/sda3 /mntX/a
sh2# mkdir /mntY/b
sh2# mount /dev/sda5 /mntY/b

När vi granskar tillstånden hos monteringarna i den nya monteringsnamnrymden ser vi att /mntX/a skapades som en ny delad montering (ärvde inställningen "shared" från sin föräldramontering) och /mntY/b skapades som en privat montering:


sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime master:2
173 168 8:3 / /mntX/a rw,relatime shared:3
175 169 8:5 / /mntY/b rw,relatime

Tillbaka i den första terminalen (i den initiala monteringsnamnrymden) ser vi att monteringen /mntX/a spreds till partnern (den delade /mntX), men att monteringen /mntY/b inte spreds:


sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
132 83 8:23 / /mntX rw,relatime shared:1
133 83 8:22 / /mntY rw,relatime shared:2
174 132 8:3 / /mntX/a rw,relatime shared:3

Nu skapar vi en ny montering under /mntY i det första skalet:


sh1# mkdir /mntY/c
sh1# mount /dev/sda1 /mntY/c
sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
132 83 8:23 / /mntX rw,relatime shared:1
133 83 8:22 / /mntY rw,relatime shared:2
174 132 8:3 / /mntX/a rw,relatime shared:3
178 133 8:1 / /mntY/c rw,relatime shared:4

När vi undersöker monteringarna i den andra monteringsnamnrymden ser vi att i detta fall har den nya monteringen spritts till slavmonteringen, och att monteringen själv är en slavmontering (till partnergrupp 4):


sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime master:2
173 168 8:3 / /mntX/a rw,relatime shared:3
175 169 8:5 / /mntY/b rw,relatime
179 169 8:1 / /mntY/c rw,relatime master:4

Exempel på MS_UNBINDABLE

Ett av de primära syftena med obindbara monteringar är att undvika problemet med en ”monteringsexplosion” när man upprepat utför bindmonteringar av ett underträd på en högre nivå till en lägre nivås montering. Problemet illustreras av följande skalsession.

Anta att vi har ett system med följande monteringar:


# mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY

Anta vidare att vi önskar bindningsmontera rotkatalogen rekursivt under flera användares hemkataloger. Vi gör detta för den första användaren och granskar monteringarna:


# mount --rbind / /home/cecilia/
# mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY

När vi upprepar denna åtgärd för den andra användaren börjar vi se explosionsproblemet:


# mount --rbind / /home/henry
# mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
/dev/sda1 on /home/henry
/dev/sdb6 on /home/henry/mntX
/dev/sdb7 on /home/henry/mntY
/dev/sda1 on /home/henry/home/cecilia
/dev/sdb6 on /home/henry/home/cecilia/mntX
/dev/sdb7 on /home/henry/home/cecilia/mntY

Under /home/henry har vi inte bara rekursivt lagt till monteringarna /mntX och /mntY, utan även de rekursiva monteringarna av dessa kataloger under /home/cecilia som skapades i förestående steg. Vid upprepning av steget för en tredje användare blir det uppenbart att explosionen är exponentiell till sin natur:


# mount --rbind / /home/otto
# mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
/dev/sda1 on /home/henry
/dev/sdb6 on /home/henry/mntX
/dev/sdb7 on /home/henry/mntY
/dev/sda1 on /home/henry/home/cecilia
/dev/sdb6 on /home/henry/home/cecilia/mntX
/dev/sdb7 on /home/henry/home/cecilia/mntY
/dev/sda1 on /home/otto
/dev/sdb6 on /home/otto/mntX
/dev/sdb7 on /home/otto/mntY
/dev/sda1 on /home/otto/home/cecilia
/dev/sdb6 on /home/otto/home/cecilia/mntX
/dev/sdb7 on /home/otto/home/cecilia/mntY
/dev/sda1 on /home/otto/home/henry
/dev/sdb6 on /home/otto/home/henry/mntX
/dev/sdb7 on /home/otto/home/henry/mntY
/dev/sda1 on /home/otto/home/henry/home/cecilia
/dev/sdb6 on /home/otto/home/henry/home/cecilia/mntX
/dev/sdb7 on /home/otto/home/henry/home/cecilia/mntY

Problemet med monteringexplosionen i ovanstående scenario kan lösas genom att göra varje ny montering obindbar. Effekten av att göra detta är att rekursiva monteringar av rotkatalogen inte kommer replikera de obindbara monteringarna. Vi gör en sådan montering för den första användaren:


# mount --rbind --make-unbindable / /home/cecilia

Före vi går vidare visar vi att obindbara monteringar verkligen är obindbara:


# mkdir /mntZ
# mount --bind /home/cecilia /mntZ
mount: /mntZ: fel filsystemstyp, felaktig flagga,
       felaktigt superblock på /home/cecilia,
       teckentabell eller hjälpprogram saknas, eller annat fel.
       dmesg(1) may have more information after failed mount system call.

Nu skapar vi obindbara rekursiva bindmonteringar för de andra två användarna:


# mount --rbind --make-unbindable / /home/henry
# mount --rbind --make-unbindable / /home/otto

Vid granskning av listan av monteringar ser vi att det inte har varit någon explosion av monteringar eftersom de obindbara monteringarna inte replikerades under varje användares katalog:


# mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
/dev/sda1 on /home/henry
/dev/sdb6 on /home/henry/mntX
/dev/sdb7 on /home/henry/mntY
/dev/sda1 on /home/otto
/dev/sdb6 on /home/otto/mntX
/dev/sdb7 on /home/otto/mntY

Följande tabell visar effekten tillämpning av en ny spridningstyp (d.v.s., mount --make-xxxx) har på den befintliga spridningstypen hos en montering. Raderna motsvarar de befintliga spridningstyperna, och kolumnerna är den nya spridningsinställningen. Av utrymmesskäl förkortas ”privat” som ”priv” och ”obindbar” som ”obind”.

make-shared make-slave make-priv make-unbind
delad delad slav/priv [1] priv obind
slav slav+delad slav [2] priv obind
slav+delad slav+delad slav priv obind
privat delad priv [2] priv obind
obindbar delad obind [2] priv obind

Observera följande detaljer om tabellen:

[1]
Om en delad montering är den enda monteringen i sin partnergrupp görs den automatiskt privat om den görs till en slav.
[2]
Att göra en odelad montering till slav har ingen effekt på monteringen.

Anta att följande kommando utförs:


mount --bind A/a B/b

Här är A källmonteringen, B är målmonteringen, a är en underkatalogsökväg under monteringspunkten A och b är en underkatalogsökväg under monteringspunkten B. Spridningstypen för den resulterande monteringen, B/b, beror på spridningstyperna för monteringarna A och B, och sammanfattas i följande tabell.

källa(A)
delad privat slav obind
mål(B) delad delad delad slav+delad otillåten
odelad delad privat slav otillåten

Observera att en rekursiv bindning av ett underträd följer samma semantik som vid en bindningsåtgärd på varje montering i underträdet. (Obindbara monteringar ansas automatiskt från målmonteringspunkten.)

För vidare detaljer, se Documentation/filesystems/sharedsubtree.rst i kärnans källträd.

Anta att följande kommando utförs:


mount --move A B/b

Här är A källmonteringen, B är målmonteringen och b är en underkatalogsökväg under monteringspunkten B. Spridningstypen för den resulterande monteringen, B/b, beror på spridningstyperna för monteringarna A och B, och sammanfattas i följande tabell.

källa(A)
delad privat slav obind
mål(B) delad delad delad slav+delad otillåten
odelad delad privat slav obindbar

Observera: att flytta en montering som bor under en delad montering är inte tillåtet.

För vidare detaljer, se Documentation/filesystems/sharedsubtree.rst i kärnans källträd.

Anta att vi använder följande kommando för att skapa en montering:


mount enhet B/b

Här är B målmonteringen och b är en underkatalogsökväg under monteringspunkten B. Spridningstypen för den resulterande monteringen, B/b, följer samma regler som för en bindmontering där spridningstypen för källmonteringen alltid anses vara privat.

Anta att vi använder följande kommando för att riva ner en montering:


umount A

Här är A en montering på B/b, där B är föräldramonteringen och b är en underkatalogsökväg under monteringspunkten B. Om B är delad, då avmonteras alla senast monterade monteringar vid b på monteringar som tar emot spridningar från monteringen B och inte har undermonteringar under sig.

Taggen propagate_from:X visas i de valfria fälten av en post i /proc/pid/mountinfo i fall då en process inte kan se en slavs omedelbara huvud (d.v.s., sökvägen för huvudet kan inte nås från filsystemets rotkatalog) och därför inte kan avgöra spridningskedjan mellan monteringarna den kan se.

I följande exempel skapar vi först en tvålänks huvud-slav-kedja mellan monteringarna /mnt, /tmp/etc och /mnt/tmp/etc. Sedan används kommandot chroot(1) för att göra monteringspunkten /tmp/etc onåbar från rotkatalogen, vilket skapar en situation där huvudet för /mnt/tmp/etc inte är nåbart från den (nya) rotkatalogen för processen.

Först bindmonterar vi rotkatalogen på /mnt och sedan bindmonterar vi /proc/mnt/proc så att efter en senare chroot(1) filsystemet proc(5) fortsätter att vara synligt på rätt plats i den chroot:ade miljön.


# mkdir -p /mnt/proc
# mount --bind / /mnt
# mount --bind /proc /mnt/proc

Därefter ser vi till att monteringen /mnt är en delad montering i den nya partnergruppen (utan någon partner):


# mount --make-private /mnt  # Isolera från eventuell tidigare partnergrupp
# mount --make-shared /mnt
# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
239 61 8:2 / /mnt ... shared:102
248 239 0:4 / /mnt/proc ... shared:5

Därefter bindmonterar vi /mnt/etc/tmp/etc:


# mkdir -p /tmp/etc
# mount --bind /mnt/etc /tmp/etc
# cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/ - .*//'
239 61 8:2 / /mnt ... shared:102
248 239 0:4 / /mnt/proc ... shared:5
267 40 8:2 /etc /tmp/etc ... shared:102

Från början är dessa två monteringar i samma partnergrupp, men sedan gör vi /tmp/etc till en slav till /mnt/etc, och därefter gör vi även /tmp/etc delad, så att den kan sprida händelser till nästa slav i kedjan:


# mount --make-slave /tmp/etc
# mount --make-shared /tmp/etc
# cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/ - .*//'
239 61 8:2 / /mnt ... shared:102
248 239 0:4 / /mnt/proc ... shared:5
267 40 8:2 /etc /tmp/etc ... shared:105 master:102

Därefter bindmonterar vi /tmp/etc/mnt/tmp/etc. Återigen är de två monteringarna initialt i samma partnergrupp, men vi gör sedan /mnt/tmp/etc till en slav till /tmp/etc:


# mkdir -p /mnt/tmp/etc
# mount --bind /tmp/etc /mnt/tmp/etc
# mount --make-slave /mnt/tmp/etc
# cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/ - .*//'
239 61 8:2 / /mnt ... shared:102
248 239 0:4 / /mnt/proc ... shared:5
267 40 8:2 /etc /tmp/etc ... shared:105 master:102
273 239 8:2 /etc /mnt/tmp/etc ... master:105

Från det ovanstående ser vi att /mnt är huvud till slaven /tmp/etc, vilken i sin tur är huvud till slaven /mnt/tmp/etc.

Därefter gör vi chroot(1) till katalogen /mnt, vilket medför att monteringen med ID 267 blir onåbar från den (nya) rotkatalogen:


# chroot /mnt

När vi sedan undersöker tillståndet för monteringarna inuti den chroot:ade miljön ser vi följande:


# cat /proc/self/mountinfo | sed 's/ - .*//'
239 61 8:2 / / ... shared:102
248 239 0:4 / /proc ... shared:5
273 239 8:2 /etc /tmp/etc ... master:105 propagate_from:102

Ovan ser vi att monteringen med ID 273 är en slav vars huvud är partnergrupp 105. Monteringspunkten för det huvudet är onåbar, och därför visas en tagg propagate_from, vilket indikerar att den närmaste dominanta partnergruppen (d.v.s., den närmaste nåbara monteringen i slavkedjan) är partnergruppen med ID 102 (vilket motsvarar monteringspunkten /mnt före chroot(1) gjordes).

Linux.

Linux 2.4.19.

Spridningstypen som tilldelas en ny montering beror på spridningstypen hos föräldramonteringen. Om monteringen har en förälder (d.v.s., det är en annan monteringspunkt än roten) och spridningstypen hos föräldern är MS_SHARED, då är spridningstypen för den nya monteringen också MS_SHARED. Annars är spridningstypen för den nya monteringen MS_PRIVATE.

Oaktat det faktum att standardsspridningstypen för nya monteringar i många fall är MS_PRIVATE så är MS_SHARED typiskt mer användbart. Av detta skäl monterar systemd(1) automatiskt om alla monteringar som MS_SHARED vid systemstart. På de flesta moderna system är alltså standardspridningstypen i praktiken MS_SHARED.

Eftersom att när man använder unshare(1) för att skapa en ny monteringsnamnrymd så är målet vanligtvis att ge fullständig isolering av monteringarna i den nya namnrymden återställer unshare(1) (sedan util-linux 2.27) i sin tur stegen som utfördes av systemd(1), genom att göra alla monteringar privata i den nya namnrymden. Det vill säga, unshare(1) utför motsvarande följande i den nya monteringsnamnrymden:


mount --make-rprivate /

För att förhindra detta kan man använda flaggan --propagation unchanged till unshare(1).

Ett program som skapar en ny monteringsnamnrymd direkt med clone(2) eller unshare(2) kan vilja förhindra spridning av monteringshändelser till andra monteringsnamnrymder (så som unshare(1) gör). Detta kan göras genom att ändra spridningstypen för monteringar i den nya namnrymden till antingen MS_SLAVE eller MS_PRIVATE med ett anrop som det följande:


mount(NULL, "/", MS_SLAVE | MS_REC, NULL);

För en diskussion om spridningstyper när monteringar flyttas (MS_MOVE) och när bindmonteringar skapas (MS_BIND), se Documentation/filesystems/sharedsubtree.rst.

Observera följande punkter med avseende på monteringsnamnrymder:

[1]
Varje monteringsnamnrymd har en användarnamnrymd som ägare. Som förklaras ovan, när en ny monteringsnamnrymd skapas är dess monteringslista initierad som en kopia av monteringslistan från en annan monteringsnamnrymd. Om den nya namnrymden och den namnrymd som monteringslistan kopierades ifrån ägs av olika användarnamnrymder, då betraktas den nya monteringsnamnrymden som mindre privilegierad.
[2]
När en mindre privilegierad monteringsnamnrymd skapas reduceras delade monteringar till slavmonteringar. Detta säkerställer att avbildningar som utförs i mindre privilegierade monteringsnamnrymder inte kommer spridas till mer privilegierade monteringsnamnrymder.
[3]
Monteringar som kommer som en enda enhet från en mer privilegierad monteringsnamnrymd låses ihop och kan inte separeras i en mindre privilegierad monteringsnamnrymd. (Åtgärden unshare(2) CLONE_NEWNS för med sig alla monteringarna från originalmonteringsnamnrymden som en enda enhet, och rekursiva monteringar som sprids mellan monteringsnamnrymder sprids som en enda enhet.)
I detta sammanhang betyder ”kan inte separeras” att monteringarna låses så att de inte kan avmonteras individuellt. Betrakta följande exempel:

$ sudo sh
# mount --bind /dev/null /etc/shadow
# cat /etc/shadow       # Ger ingen utdata

De ovanstående stegen, utförda i en mer privilegierad monteringsnamnrymd, har skapat en bindmontering som döljer innehållet av skugglösenordsfilen, /etc/shadow. Av säkerhetsskäl skall det inte vara möjligt att göra umount(2) av den monteringen i en mindre privilegierad monteringsnamnrymd, eftersom det skulle avslöja innehållet i /etc/shadow.
Anta att vi nu skapar en ny monteringsnamnrymd som ägs av en ny användarnamnrymd. Den nya monteringsnamnrymden kommer ärva kopior av alla monteringarna från den föregående monteringsnamnrymden. Dock kommer dessa monteringar vara låsta eftersom den nya monteringsnamnrymden är mindre privilegierad. Som en konsekvens misslyckas ett försök att göra umount(2) av monteringen så som visas av följande steg:

# unshare --user --map-root-user --mount \
               strace -o /tmp/log \
               umount /etc/shadow
umount: /etc/shadow: inte monterad.
# grep '^umount' /tmp/log
umount2("/etc/shadow", 0)     = -1 EINVAL (Ogiltigt argument)

Felmeddelandet från mount(8) är lite förvirrande, men utdata från strace(1) avslöjar att det underliggande systemanropet umount2(2) misslyckades med felet EINVAL, vilket är det fel som kärnan returnerar för att indikera att monteringen är låst.
Observera dock att det är möjligt att stacka upp (och ta bort från stacken) en montering ovanpå en av de ärvda låsta monteringarna i en mindre privilegierad monteringsnamnrymd:

# echo 'aaaaa' > /tmp/a    # Fil att montera på /etc/shadow
# unshare --user --map-root-user --mount \
    sh -c 'mount --bind /tmp/a /etc/shadow; cat /etc/shadow'
aaaaa
# umount /etc/shadow

Det sista kommandot umount(8) ovan, vilket utförs i den initiala monteringsnamnrymden, gör att den ursprungliga filen /etc/shadow återigen är synlig i den namnrymden.
[4]
Som en uppföljning av punkt [3], observera att det är möjligt att göra umount(2) av ett helt underträd av monteringar som spreds som en enhet in i en mindre privilegierad monteringsnamnrymd, såsom illustreras i följande exempel.
Först skapar vi nya användar- och monteringsnamnrymder med unshare(1). I den nya monteringsnamnrymden sätts spridningstypen för alla monteringar till privat. Vi skapar sedan en delad bindmontering på /mnt, och en liten hierarki av monteringar nedanför den monteringen.

$ PS1='nr1# ' sudo unshare --user --map-root-user \
                       --mount --propagation private bash
nr1# echo $$        # Vi behöver PID:en för detta skal senare
778501
nr1# mount --make-shared --bind /mnt /mnt
nr1# mkdir /mnt/x
nr1# mount --make-private -t tmpfs none /mnt/x
nr1# mkdir /mnt/x/y
nr1# mount --make-private -t tmpfs none /mnt/x/y
nr1# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
986 83 8:5 /mnt /mnt rw,relatime shared:344
989 986 0:56 / /mnt/x rw,relatime
990 989 0:57 / /mnt/x/y rw,relatime

Fortfarande i samma skalsession skapar vi sedan ett andra skal i en ny användarnamnrymd och en ny (mindre privilegierad) monteringsnamnrymd och kontrollerar tillståndet hos den spridda monteringen med rot på /mnt.

nr1# PS1='nr2# ' unshare --user --map-root-user \
                       --mount --propagation unchanged bash
nr2# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
1239 1204 8:5 /mnt /mnt rw,relatime master:344
1240 1239 0:56 / /mnt/x rw,relatime
1241 1240 0:57 / /mnt/x/y rw,relatime

Att notera i ovanstående utdata är att spridningstypen för monteringen /mnt har reducerats till slav, så som förklarades i punkt [2]. Detta betyder att undermonteringshändelser kommer spridas från huvudets /mnt i ”nr1”, men spridning kommer inte ske i den omvända riktningen.
Från ett separat terminalfönster använder vi sedan nsenter(1) för att gå in i monterings- och användarnamnrymderna som motsvarar ”nr1”. I det terminalfönstret kan vi rekursivt bindmontera /mnt/x på platsen /mnt/ppp.

$ PS1='nr3# ' sudo nsenter -t 778501 --user --mount
nr3# mount --rbind --make-private /mnt/x /mnt/ppp
nr3# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
986 83 8:5 /mnt /mnt rw,relatime shared:344
989 986 0:56 / /mnt/x rw,relatime
990 989 0:57 / /mnt/x/y rw,relatime
1242 986 0:56 / /mnt/ppp rw,relatime
1243 1242 0:57 / /mnt/ppp/y rw,relatime shared:518

Eftersom spridningstypen hos föräldramonteringen, /mnt, var delad spred den rekursiva bindmonteringen ett litet underträd av monteringar under slavmonteringen /mnt in i ”nr2”, vilket kan verifieras genom att köra följande kommando i den skalsessionen:

nr2# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
1239 1204 8:5 /mnt /mnt rw,relatime master:344
1240 1239 0:56 / /mnt/x rw,relatime
1241 1240 0:57 / /mnt/x/y rw,relatime
1244 1239 0:56 / /mnt/ppp rw,relatime
1245 1244 0:57 / /mnt/ppp/y rw,relatime master:518

Fastän det inte är möjligt att göra umount(2) av en del av det spridda underträdet (/mnt/ppp/y) i ”nr2” är det möjligt att göra umount(2) av hela underträdet som visas med följande kommandon:

nr2# umount /mnt/ppp/y
umount: /mnt/ppp/y: inte monterad.
nr2# umount -l /mnt/ppp | sed 's/ - .*//'      # Lyckas …
nr2# grep /mnt /proc/self/mountinfo
1239 1204 8:5 /mnt /mnt rw,relatime master:344
1240 1239 0:56 / /mnt/x rw,relatime
1241 1240 0:57 / /mnt/x/y rw,relatime

[5]
Flagginställningarna av MS_RDONLY, MS_NOSUID, MS_NOEXEC och ”atime-flaggorna” (MS_NOATIME, MS_NODIRATIME, MS_RELATIME) till mount(2) blir låsta när de sprids från en mer privilegierad till en mindre privilegierad monteringsnamnrymd, och kan inte ändras i den mindre privilegierade monteringsnamnrymden.
Denna punkt illustreras i följande exempel där vi, i en mer privilegierad monteringsnamnrymd, skapar en bindmontering som markeras som endast läsbar. Av säkerhetsskäl skall det inte vara möjligt att göra monteringen skrivbar i en mindre privlegierad monteringsnamnrymd, och kärnan hindrar mycket riktigt detta.

$ sudo mkdir /mnt/dir
$ sudo mount --bind -o ro /some/path /mnt/dir
$ sudo unshare --user --map-root-user --mount \
               mount -o remount,rw /mnt/dir
mount: /mnt/dir: åtkomst nekas.

[6]
En fil eller katalog som är en monteringspunkt i en namnrymd som inte är en monteringspunkt i en annan namnrymd går att byta namn på, ta bort länken till eller tas bort (rmdir(2)) i monteringsnamnrymden i vilken den inte är en monteringspunkt (under de vanliga rättighetskontrollerna). Som en konsekvens tas monteringspunkten bort i monteringsnamnrymden där den var en monteringspunkt.
Tidigare (före Linux 3.18) resulterade försök att ta bort länken till, byta namn på eller ta bort en fil eller katalog som var en monteringspunkt i en annan monteringsnamnrymd i felet EBUSY. Det beteendet hade tekniska problem att vidmakthållas (t.ex., för NFS) och möjliggjorde tjänstevägransattacker (DoS) mot mer privilegierade användare (d.v.s., förhindra enskilda filer från att uppdateras genom att bindmontera ovanpå dem).

Se pivot_root(2).

unshare(1), clone(2), mount(2), mount_setattr(2), pivot_root(2), setns(2), umount(2), unshare(2), proc(5), namespaces(7), user_namespaces(7), findmnt(8), mount(8), pam_namespace(8), pivot_root(8), umount(8)

Documentation/filesystems/sharedsubtree.rst i kärnans källkodsträd.

ÖVERSÄTTNING

Den svenska översättningen av denna manualsida skapades av Göran Uddeborg <goeran@uddeborg.se>

Denna översättning är fri dokumentation; läs GNU General Public License Version 3 eller senare för upphovsrättsvillkor. Vi tar INGET ANSVAR.

Om du hittar fel i översättningen av denna manualsida, skicka ett mail till Tp-sv@listor.tp-sv.se.

31 oktober 2023 Linux man-pages 6.06