LXC IDMAP

Aquator

New Member
Nov 11, 2021
23
1
3
43
Ich mache hierzu mal ein eigenen Beitrag auf um a) den Beitrag HDD Storage Verwaltung Strategie nicht zu überfluten und b) damit er später vielleicht als Tutorial dienen kann.

Vorab. Ich habe micht mit dem Wikieintrag beschäftigt und nach dem Muster auch alles zum Laufen bekommen. Nur das ich die 1005 durch 1000 ersetzt habe. Verstanden habe ich das ganze aber bei weitem nicht.
Also war ich weiter auf der Suche. Ich fand ein Beitrag hier im Forum Verständnisfragen zu unprivileged LXC und lxc.idmap für Schreibzugriff auf mp. Aber auch hiermit hat sich nicht alles an Fragen in meinem Kopf gelöst.

Hier mal meine bisherigen Erkenntnisse und meine offenen Fragen.

Erkenntnisse anhand des Beispiels vom Wiki:
Bash:
/etc/pve/lxc/<ID DES LXC>.conf
# Teil 1
#
# uid map: from uid 0 map 1005 uids (in the ct) to the range starting 100000 (on the host), so 0..1004 (ct) → 100000..101004 (host)
# Das "u" und das "g" am anfang ist klar. User oder Group.
# 0 ist die Startid des Gastsystems von der jetzt ein Mapping zum Host passieren soll.
# 100000 ist dann die Startid auf dem Hostsystem, die die id auf dem Gast darstellt. Hier wird dann immer die ID des Gasts (0) auf die Startid des Hosts (100000) addiert.
# 1000 ist dann die ID des Gast bis wo hin das Mapping geschehen soll. Bis 1000, aber nicht inklusive. Also effektiv von 0 bis 999. Das wäre auf dem Host 100000 bis 100999
# Dieser Teil ist noch gut erklärt.
Code:
lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
#
# Teil 2
#
# we map 1 uid starting from uid 1005 onto 1005, so 1005 → 1005
# "g" und "u" ist wieder klar.
# Die zweite Stelle, also die erste 1000, ist vermutlich wieder die Startid des Gasts.
# Die dritte Stelle dann die Start-ID auf die im Host gemappt wird???
# Die vierte Stelle gibt dann die Anzahl an IDs an, die ab der Start ID gemappt werden sollen. Bei 3 wären es dann 1000, 1001 und 1002
Code:
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
#
# Teil 3
#
# we map the rest of 65535 from 1006 upto 101006, so 1006..65535 → 101006..165535
#"g" und "u" ist wieder klar.
# Hier im Beispiel, weil wir nur die 1000 durchreichen, geht es bei 1001 (Gast) weiter. Darum der Start bei 1001. (zweite Stelle)
# Dann die Start ID vom Host. 101001 bei der er dann weiter geht (101001).
# Als letztes wieder die Anzahl von den Startids gesehen bis zum "Ende" des ID Bereichts. Wie ich gelesen hab müssen wir hier immer auf eine Summe von 65.535 kommen.
# Hier kann man 65535 - <Letzte benutzte ID> rechnen. In diesem Beispiel ist die letzte, und einzige, ID die 1000. Also 65535 - 1000 = 64535.
# Wenn man 3 IDs hätte, 1000, 1001, 1002 wäre es entsprechend 65.535 - 1002 = 64533
Code:
lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535

Was ich schon gar nicht verstehe ist der Inhalt von
Code:
/etc/subuid
und
Code:
/etc/subgid
In beiden Dateien habe ich folgendes eingetragen:
Code:
root:1000:1
#Was bitte ist hier "root" Benutzer auf Gast oder Host?
#Was bitte ist hier die 1000? ID auf Gast oder auf Host?
#Die eins ist sicher wieder die "Anzahl". Bei 3 wäre es wieder entsprechend 1000, 1001 und 1002.
Drin stand schon:
Code:
root:100000:65536

Somit sehen beide Dateien jetzt wie folgt aus:
Code:
root:1000:1
root:100000:65536


Als letztes habe ich dann auf dem Host system das Dataset per chown angepasst.
Code:
chown -R 1000:1000 /tank0/shared

Jetzt können der root und der Benutzer mit der ID 1000 aus dem Gastsystem auf dem Bindmount schreiben.


Lege ich eine Datei mit dem Benutzer root an steht im Gast auch root:root und im Host 100000:10000.
Beim Benutzer "test" mit der ID 1000 (Gast) steht dann im Gastsystem test:test und im Host 1000:1000.
Versuche ich mit dem Benutzer "test2" mit der ID 1001 (Gast) eine Datei auf Shared anzulegen kommt eine Berechtigungsmeldung. Das passt ja auch und soll so sein.

Fragen:
1. Müssen in der
Bash:
/etc/pve/lxc/<ID DES LXC>.conf
die Teile 1 und 3 überhaupt sein? Weil vor meinem Eintrag steht davon ja auch nichts in der conf. Eigentlich will ich ja nur user 1000 durchreichen. Oder muss das sein, weil ich einen versteckten default Wert überschreibe? Und irgendwo steht im hintergrund lxc.idmap = u 0 101001 65535??

2. Die beiden sub-dateien muss mir mal einer erklären.

3. Wie würde ein Beispiel aussehen wenn man auf dem Gast den Benutzer mit ID 1000 auf den den Host mit der ID 10000 mappen möchte? Vermute aber irgendwie das ist keine gute Idee. Hatte das nur als Idee falls man mal auf dem Host einen Benutzer anlegen sollte, warum auch immer, dann bekommt der auch die ID 1000 und das wäre dann blöd. Dann gehört dem ja gleich der Shared.
Oder wenn man mehrere Shared hat und mehrere Gastsysteme.
Oder kann man beim erstellen eines Benutzers irgendwie selber bestimmen welche ID der bekommt?
 
# 1000 ist dann die ID des Gast bis wo hin das Mapping geschehen soll. Bis 1000, aber nicht inklusive. Also effektiv von 0 bis 999. Das wäre auf dem Host 100000 bis 100999
# Dieser Teil ist noch gut erklärt.
Code:
lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
Nein, 1000 ist der Bereich der gemappt werden soll. "lxc.idmap = u 0 100000 1000" sagt mappe 1000x ab UID 0 nach UID 100000. Also 0 wird zu 100000, 1 wird zu 100001, ...und das halt 1000 mal, also bis hoch zu 999 nach 100999.
# Teil 2
#
# we map 1 uid starting from uid 1005 onto 1005, so 1005 → 1005
# "g" und "u" ist wieder klar.
# Die zweite Stelle, also die erste 1000, ist vermutlich wieder die Startid des Gasts.
# Die dritte Stelle dann die Start-ID auf die im Host gemappt wird???
# Die vierte Stelle gibt dann die Anzahl an IDs an, die ab der Start ID gemappt werden sollen. Bei 3 wären es dann 1000, 1001 und 1002
Code:
lxc.idmap = u 1000 1000 1
[/QUOTE]
Ja, bei "lxc.idmap = u 1000 1000 3" würde es heißt mappe 3x von ab 1000 zu ab 1000. Also 1000 nach 1000, 1001 nach 1001 und 1002 nach 1002.
Bei "lxc.idmap = u 1000 1000 3" würde ausschließlich von 1000 nach 1000 gemappt werden.
[QUOTE="Aquator, post: 431343, member: 134914"]
# Als letztes wieder die Anzahl von den Startids gesehen bis zum "Ende" des ID Bereichts. Wie ich gelesen hab müssen wir hier immer auf eine Summe von 65.535 kommen.
# Hier kann man 65535 - <Letzte benutzte ID> rechnen. In diesem Beispiel ist die letzte, und einzige, ID die 1000. Also 65535 - 1000 = 64535.
# Wenn man 3 IDs hätte, 1000, 1001, 1002 wäre es entsprechend 65.535 - 1002 = 64533
[CODE]lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535
Genau.
Was ich schon gar nicht verstehe ist der Inhalt von
Code:
/etc/subuid
und
Code:
/etc/subgid
Das ist mir bis heute leider auch nicht ganz klar warum das nötig ist.
Fragen:
1. Müssen in der
Bash:
/etc/pve/lxc/<ID DES LXC>.conf
die Teile 1 und 3 überhaupt sein? Weil vor meinem Eintrag steht davon ja auch nichts in der conf. Eigentlich will ich ja nur user 1000 durchreichen. Oder muss das sein, weil ich einen versteckten default Wert überschreibe? Und irgendwo steht im hintergrund lxc.idmap = u 0 101001 65535??
Das muss wohl schon so ein. Standardmäßig wird halt 0-65535 nach 100000-165535 gemappt. Willst du da was ändern musst du halt sicherstellen, dass da wirklich alle 65536 UIDs/GIDs korrekt umgemappt werden.
2. Die beiden sub-dateien muss mir mal einer erklären.
Das wäre ich auch interessiert wenn das einer vom Staff mal etwas genauer erklären konnte.
3. Wie würde ein Beispiel aussehen wenn man auf dem Gast den Benutzer mit ID 1000 auf den den Host mit der ID 10000 mappen möchte? Vermute aber irgendwie das ist keine gute Idee. Hatte das nur als Idee falls man mal auf dem Host einen Benutzer anlegen sollte, warum auch immer, dann bekommt der auch die ID 1000 und das wäre dann blöd. Dann gehört dem ja gleich der Shared.
Oder wenn man mehrere Shared hat und mehrere Gastsysteme.
Müsste wohl so aussehen:
lxc.idmap = u 0 100000 1000 # mappt 0-999 nach 100000-100999
lxc.idmap = u 1000 10000 1 # mappt 1000 nach 10000
lxc.idmap = u 1001 101001 64534 # mappt 1001-65535 nach 101001-165535
Oder kann man beim erstellen eines Benutzers irgendwie selber bestimmen welche ID der bekommt?
Das kann man immer selbst bestimmen. Haben adduser und useradd Befehle entsprechende Argumente für.
 
Nein, 1000 ist der Bereich der gemappt werden soll. "lxc.idmap = u 0 100000 1000" sagt mappe 1000x ab UID 0 nach UID 100000. Also 0 wird zu 100000, 1 wird zu 100001, ...und das halt 1000 mal, also bis hoch zu 999 nach 100999.
Ist das nicht das selbe was ich schrieb nur etwas anders formuluert? :D
Ob ich schreibe von 0 bis 1000 (ich) oder ein Bereich von 1000 (du). Ich denke wir meinen beide das selbe.
Es ist der Teil vor der von uns gewünschten ID der, wie default auch, gemappt werden muss.
Wie du weiter unten geschrieben hast MÜSSEN alle 65535 IDs gemappt sein. Und wenn wir anfangen eine, oder mehr, umzubiegen müssen wir auch sorge tragen das alle anderen dann weiterhin gemappt sind. Soweit hatte ich es mir gedacht, und nun verstanden. Danke.

Müsste wohl so aussehen:
lxc.idmap = u 0 100000 1000 # mappt 0-999 nach 100000-100999
lxc.idmap = u 1000 10000 1 # mappt 1000 nach 10000
lxc.idmap = u 1001 101001 64534 # mappt 1001-65535 nach 101001-165535
Probiere ich gleich mal in meiner Testumgebung aus. Ich hatte (2 Zeile) die 1.000 und 10.000 bei meinem Versuch anders herum. Das klappte irgendwie nicht.

Ich habe mir dann den Satz über den "Sub-Datein" noch ein paar mal durchgelesen...
Then we have to allow lxc to actually do the mapping on the host. Since lxc creates the CT using root, we have to allow root to use these uids in the container.

LXC muss also irgendwie dem Gast erlauben auf dem Host das neue Mapping anzuwenden. Interesannt warum das aus der Richtung passiert. Weil der LXC ist ja vom Host ... also könnte man denken der weiß vom Mapping bevor der Container es weiß.

Der zweite Satz verwirrt mich dann aber wieder. Jetzt passiert etwas im CT. Da der CT mit Root erstellt wurde (ich vermute damit ist der Host root gemeint), muss dieser root (wieder vom Host) die UIDs im CT (Gast) zu verwenden. *HEADSHOT* was????

Nehmen wir mein Beispiel:
root:1000:1
also ist hier mit "root" der vom Host gemeint? Nach dem motto "root" du darfst jetzt etwas.
1000 ist also die ID auf dem Host?!? Im Beispiel mit meiner Frage wegen der ID 1000 (Gast) auf 10000 (Host) müsste dann hier 10000 stehen?
Die 1 ist dann wieder die Anzahl/Bereich für den diese Regel gilt. Hier ausschließlich für die 1000.

Ich probiere mal wild hin und her.
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!