Linux Containers (LXC) verwenden mehrere verschiedene Namensräume (Namespaces), um Prozesse zu isolieren. Hier sind einige der wichtigsten Arten von Namespaces, die LXC verwendet, und wie man sie verwendet:
1. PID-Namespaces: Der PID-Namespace (Prozessidentifikator) isoliert die Prozess-ID-Nummer. Dies bedeutet, dass zwei Prozesse mit der gleichen PID in verschiedenen PID-Namespaces existieren können. Um diesen Namespace zu verwenden, können Sie beim Starten eines Prozesses die Option `—pid` oder `-p` mit `unshare` oder `clone` verwenden.
2. Network Namespaces: Dieser Namespace isoliert die Netzwerkschnittstellen und Routentabellen. Jeder Network Namespace hat seine eigenen Netzwerkgeräte, IP-Adressen, IP-Routing-Tabellen, etc. Sie können diesen Namespace verwenden, indem Sie die Option `—net` oder `-n` mit `unshare` oder `clone` verwenden.
3. Mount Namespaces: Dieser Namespace isoliert die Dateisystem-Mountpunkte. Wenn ein Prozess ein Dateisystem einbindet oder aushängt, wirkt sich dies nur auf den eigenen Mount-Namespace und nicht auf den von anderen Prozessen aus. Sie können diesen Namespace verwenden, indem Sie die Option `—mount` oder `-m` mit `unshare` oder `clone` verwenden.
4. User Namespaces: Dieser Namespace isoliert die Benutzer-ID und die Gruppen-ID. Dies bedeutet, dass ein Prozess als `root` in seinem eigenen User Namespace laufen kann, während er in anderen Namespaces eine nicht privilegierte ID hat. Sie können diesen Namespace verwenden, indem Sie die Option `—user` oder `-U` mit `unshare` oder `clone` verwenden.
Um Namespaces in LXC zu verwenden, müssen Sie zuerst einen Container erstellen und starten. Während des Starts können Sie mit den Optionen `lxc.namespace.clone` und `lxc.namespace.share` bestimmen, welche Namespaces geklont oder geteilt werden sollen. Nach dem Start des Containers laufen alle Prozesse innerhalb des Containers in den angegebenen Namespaces.
Ein einfacher Befehl, um einen LXC-Container mit isolierten Namespaces zu starten, könnte etwa so aussehen:
```
lxc-create -n my_container -t download -l DEBUG -o lxc.log — -d debian -r buster -a amd64
lxc-start -n my_container -d -l DEBUG -o lxc.log
```
In diesem Beispiel würde der Befehl `lxc-create` einen neuen LXC-Container name `my_container` erstellen, und der Befehl `lxc-start` würde den Container dann im Hintergrund starten (`-d`), wobei alle Ausgaben an die Datei `lxc.log` weitergeleitet werden.
In der Konfigurationsdatei des Containers (standardmäßig in `/var/lib/lxc/my_container/config`) können Sie dann angeben, welche Namespaces geklont oder geteilt werden sollen:
```
lxc.namespace.clone = mount
lxc.namespace.clone = uts
lxc.namespace.clone = ipc
lxc.namespace.clone = user
lxc.namespace.clone = cgroup
```
Mit dieser Konfiguration würde der Container seine eigenen Mount-, UTS-, IPC-, User- und Cgroup-Namespaces haben.