Ich habe eine Ubuntu 14.04-Serverinstallation, die als LXC-Host fungiert. Es hat zwei Benutzer: Benutzer1 und Benutzer2.
Benutzer1 besitzt einen nicht privilegierten LXC-Container, der ein Verzeichnis (in /home/user1/.local / ...) als Sicherungsspeicher verwendet.
Wie erstelle ich eine vollständige Kopie des Containers für Benutzer2? Ich kann die Dateien nicht einfach kopieren, da sie Besitzern zwischen 100000 und 100000 + zugeordnet sind, die an Benutzer1 gebunden sind.
Was meiner Meinung nach im Grunde die gleiche Frage ist, wie kann ich den LXC-Container meines Benutzers1 sicher sichern, um ihn später auf einem anderen Computer und / oder Benutzer wiederherzustellen?
linux
permissions
lxc
userns
agdev84
quelle
quelle
cp
stattmv
mit den entsprechenden Flags, um alle Eigenschaften beizubehalten, die Sie in meinem Skript beibehalten müssen.Antworten:
Ich weiß jetzt, wie das geht. Wenn Sie dieser Erklärung nicht folgen können, fragen Sie bitte zurück, aber stellen Sie auch sicher, dass Sie sich in den Lesungen, die ich unten gebe, über die Benutzer informiert haben
Vorläufige Annahmen
Ich werde mich an die folgenden Annahmen halten, die sich aus Ihrer Frage ergeben:
user1
und einuser2
, wenn eine Information nicht spezifisch für eine ist, werden wir verwendenuserX
$container
user1
unduser2
werden in der von Bash als~user1
und bekannten Notation angegeben~user2
.user1
halber 100000..165536 für und 200000..265536 sinduser2
$container
wird als gerendert$rootfs
, unabhängig davon, wo er landen wird (~userX/.local/share/lxc/$container/rootfs
)~userX/.local/share/lxc/$container/config
Container bewegen
Es gibt zwei relevante Daten, die die
userns
Container regeln :$container
/etc/sub{uid,gid}
für das Benutzerkonto (manipuliert überusermod --{add,del}-sub-{uid,gid}s
) bzw.lxc.id_map
in der$container
Konfiguration (~userX/.local/share/lxc/$container/config
)userX
Hostbenutzer beispielsweise 65536 untergeordnete GIDs und UIDs hat, ist es möglicherweise möglich, 5000 bis 65 verschiedenen Containern zuzuweisen, aber ich habe diese Hypothese nicht getestet.So ist der Kern ist wirklich , dass Sie darauf achten müssen, dass die Datei / Ordner - Besitzer und die Gruppe für den Container die Konfiguration entsprechen, die wiederum eine gültige Teilmenge des Host untergeordneter GIDs / UIDs zugeordnet sein muss
user1
unduser2
jeweils.Wenn Sie beispielsweise Bash verwenden, können Sie
$((expression))
arithmetische Ausdrücke verwenden undlet
Variablen arithmetische Ausdrücke zuweisen. Dies ist sehr nützlich, wenn Sie einen Basiswert (100000 bzw. 200000) und die GID / UID für die "internen" Benutzer kennen.Die Hauptpunkte sind:
CAP_CHOWN
oder die Superuser-Rechte erforderlichHier ist ein Skript, das wahrscheinlich noch etwas verfeinert werden muss (Beispiel: Migration von einem vom Root erstellten Container zu einem nicht privilegierten), aber es funktioniert für mich zu diesem Zweck:
Zusätzlich zu den Lizenzbedingungen des StackExchange-Netzwerks stelle ich diese öffentlich zur Verfügung. Also wiederverwenden und modifizieren für jeden Zweck, aber es kommt ohne Garantie und ich kann nicht für seine Verwendung oder Missbrauch haftbar gemacht werden.
VerwendungszweckEr geht davon aus
find
,sort
,uniq
,awk
(mawk
undgawk
sollte funktionieren)id
,bash
,chown
,chmod
und so weiter zur Verfügung zu stehen und alle Befehlszeile zu verstehen , schaltet es verwendet. Für Bashreadonly
undlet
und arithmetische Ausdrücke wird angenommen, dass sie verstanden werden. Esfind
wird davon ausgegangen, dass+
es sich um einen gültigen Terminator für die-exec
Aktion handelt.Diese Liste ist wahrscheinlich nicht vollständig.
Backups
Ja, Sie können Sicherungen erstellen und an anderer Stelle wiederherstellen, sofern Sie auch den Dateieigentümer und die Gruppe entsprechend anpassen.
Angenommen, Sie verwenden so etwas wie
tar
, gibt es eine Einschränkung:tar
Ignoriert Sockets und$rootfs/dev/log
wirft ein Problem auf - andere können ebenfalls ein ähnliches Problem verursachen.Ressourcen:
subuid(5)
subgid(5)
newuidmap(1)
newgidmap(1)
user_namespaces(7)
quelle
fuidshift
wurde zu diesem Zweck erstellt. Es scheint Teil von LXD zu sein.http://manpages.ubuntu.com/manpages/xenial/man1/fuidshift.1.html
quelle
Bearbeiten: Fuidshift ist der beste Weg, um es zu tun. In Ubuntu wird fuidshift nicht mehr ausgeliefert , da LXD von einem DEB-Paket in einen Snap konvertiert wurde, und dies wird auch nicht passieren. Sie müssen fuidshift selbst kompilieren .
Dies ist jedoch recht einfach (das Herunterladen des Quellcodes und das Kompilieren erfolgt fast automatisch), siehe https://github.com/lxc/lxc/issues/3186
- -
Sie können einfach das Verzeichnis mit dem LXC-Container von Benutzer1 nach Benutzer2 kopieren und diesen Python-Code verwenden, um UIDs und GIDs zu verschieben:
Sie müssen sich anpassen
uidmap_start
,gidmap_size
und möglicherweise auchuidmap_size
undgidmap_size
an Ihre Bedürfnisse.Ich habe diesen Python-Code verwendet, um privilegierte LXC-Container auf nicht privilegierte zu migrieren. Der Python-Code wird schneller ausgeführt als ein Shell-Skript.
quelle