...

systemd-nspawn: Docker helyett, kernelmegosztással – konténerek a Linux natív módján

Szint: Haladó | Szükséges idő: 45–60 perc | Tesztelve: Ubuntu 24.04, Fedora 41, Arch Linux Ha konténerizációról esik szó, azonnal a Docker ugrik be. Ez érthető — de a legtöbb Linux-felhasználó nem tudja, hogy a rendszerén már ott van egy komoly konténertechnológia, amely nem igényel semmilyen külső telepítést, közvetlenül a systemd része, és bizonyos esetekben egyszerűbb, átláthatóbb megoldást ad, mint a Docker. Ez a systemd-nspawn.

Ez a cikk nem elméleti — négy valódi, azonnal használható receptet mutatok be: elkülönített fejlesztői környezetek, automatikusan induló konténerszolgáltatások, erőforrás-korlátozás cgroup-okkal, és titkosított adattárolás. Ha érdekel, hogyan működik a Linux konténerizáció egy szinttel mélyebben, jó helyen jársz.

Mi az a systemd-nspawn, és miben más, mint a Docker?

A systemd-nspawn egy könnyűsúlyú konténer-futtatókörnyezet, amely névtereket (namespaces) és cgroup-okat használ a folyamatok izolálásához — ugyanúgy, mint a Docker. A különbség a megközelítésben van:

  systemd-nspawn Docker
Telepítés Beépített, systemd része Külön telepítendő daemon
Init rendszer Teljes systemd a konténerben Általában egyetlen folyamat
Hálózat Egyszerű host-megosztás vagy privát Bridge hálózat, NAT
Fájlrendszer Könyvtár vagy .raw lemezképfájl Rétegezett overlay FS
Legjobb használati eset Rendszerszintű konténerek, tesztelés, izoláció Alkalmazáskonténerek, mikroszolgáltatások

A systemd-nspawn nem Docker-helyettes minden helyzetben — de fejlesztői sandbox-hoz, egy másik disztribúció kipróbálásához, vagy egy szolgáltatás izolált futtatásához sokszor egyszerűbb és átláthatóbb.


Előfeltételek

Ellenőrizd, hogy a szükséges eszközök elérhetők:

 
 
bash
systemd-nspawn --version
machinectl --version

Ha mindkettő verziószámot ad vissza, készen állsz. Ha nem:

 
 
bash
# Debian/Ubuntu
sudo apt install systemd-container

# Fedora
sudo dnf install systemd-container

# Arch
sudo pacman -S systemd

1. recept: Elkülönített Debian sandbox Ubuntu gazdarendszeren

Ez a leghasznosabb alaptechnika: futtass egy teljesen más disztribúciót a saját rendszeredben, anélkül hogy virtuális gépet indítanál.

A konténer fájlrendszerének létrehozása

 
 
bash
sudo mkdir -p /var/lib/machines/debian-sandbox
sudo debootstrap --arch=amd64 stable /var/lib/machines/debian-sandbox http://deb.debian.org/debian/

A debootstrap telepíti a minimális Debian rendszert a megadott könyvtárba. Ez néhány percet vesz igénybe.

Ha Fedora-alapú rendszered van és Arch konténert szeretnél, használd a pacstrap parancsot ugyanilyen logikával.

Belépés a konténerbe

 
 
bash
sudo systemd-nspawn -D /var/lib/machines/debian-sandbox

Máris egy Debian shell-ben vagy. Az alap konténer hozzáfér a gazda hálózatához, de saját PID-, mount- és UTS-névtere van.

Állíts be root jelszót, majd lépj ki:

 
 
bash
passwd
exit

Rendszerindítás a konténerben (teljes init)

Ha nem csak egy shellt, hanem egy teljes, systemd-del induló rendszert szeretnél:

 
 
bash
sudo systemd-nspawn -D /var/lib/machines/debian-sandbox --boot

A --boot kapcsoló elindítja a konténer saját init folyamatát — lesz journal, lesznek service unit-ok, és a konténer úgy viselkedik, mintha valódi gép lenne.


2. recept: Automatikusan induló konténer machinectl-lel

Az előző módszer ad-hoc — minden alkalommal kézzel kell indítani. Haladó felhasználónak ez nem elég. A machinectl és a systemd-nspawn@.service sablon segítségével automatikusan induló, systemd-ként kezelt konténereket hozhatunk létre.

A konténer regisztrálása

A /var/lib/machines/ könyvtárban lévő konténerek automatikusan felismerésre kerülnek:

 
 
bash
sudo ls /var/lib/machines/
# debian-sandbox

Indítás és kezelés machinectl-lel

 
 
bash
# Konténer indítása
sudo machinectl start debian-sandbox

# Állapot ellenőrzése
sudo machinectl status debian-sandbox

# Shell megnyitása futó konténerben
sudo machinectl shell debian-sandbox

# Leállítás
sudo machinectl stop debian-sandbox

Automatikus indítás rendszerinduláskor

 
 
bash
sudo machinectl enable debian-sandbox

Ez létrehoz egy symlinket a systemd-nspawn@debian-sandbox.service unit-hoz, és a konténer mostantól minden rendszerindításkor automatikusan elindul — akárcsak egy szokásos systemd szolgáltatás.

A service unit finomhangolása

A konténer viselkedését egy drop-in fájllal testreszabhatod:

 
 
bash
sudo mkdir -p /etc/systemd/nspawn/
sudo nano /etc/systemd/nspawn/debian-sandbox.nspawn
 
 
ini
[Exec]
# A konténer melyik felhasználóval induljon
User=root

[Network]
# Privát hálózati névtér (VirtualEthernet helyett)
Private=yes
VirtualEthernet=yes

[Files]
# Gazdarendszer egy könyvtárának bind-mountolása a konténerbe
Bind=/home/felhasznalo/projektek:/projektek

A Bind= sor különösen hasznos: a gazda egy könyvtárát elérhetővé teszi a konténerben, így kódon dolgozhatsz a gazdán, de futtathatod a konténer izolált környezetében.


3. recept: Erőforrás-korlátozás cgroup-okkal

Ez az a pont, ahol a systemd-nspawn igazán megmutatja, mire képes. A systemd natívan integrálja a cgroup v2 erőforrás-kezelést — a konténerekre vonatkozó korlátokat pontosan ugyanúgy állíthatod be, mint bármely más systemd service esetén.

CPU-korlát beállítása

 
 
bash
# A konténer legfeljebb 2 CPU-mag erejéig futhat
sudo systemctl set-property systemd-nspawn@debian-sandbox.service CPUQuota=200%

A 200% két teljes magot jelent (100% = 1 mag). Ha csak fél magot szeretnél adni: CPUQuota=50%.

Memóriakorlát beállítása

 
 
bash
# Maximum 512 MB RAM a konténernek
sudo systemctl set-property systemd-nspawn@debian-sandbox.service MemoryMax=512M

I/O-sávszélesség korlátozása

 
 
bash
# Maximum 50 MB/s olvasás és írás
sudo systemctl set-property systemd-nspawn@debian-sandbox.service IOReadBandwidthMax="/ 50M"
sudo systemctl set-property systemd-nspawn@debian-sandbox.service IOWriteBandwidthMax="/ 50M"

Aktuális erőforráshasználat megtekintése

 
 
bash
sudo systemd-cgtop

Ez valós időben mutatja az összes cgroup erőforráshasználatát — konténerekkel együtt. Praktikusabb, mint a top, ha több izolált folyamatcsoportot figyelsz egyszerre.

Az összes korlát mentése (permanens)

A set-property parancs alapértelmezés szerint csak az aktuális munkamenetre érvényes. A permanens mentéshez:

 
 
bash
sudo systemctl set-property --runtime=false systemd-nspawn@debian-sandbox.service MemoryMax=512M

Vagy szerkeszd közvetlenül a drop-in fájlt:

 
 
bash
sudo systemctl edit systemd-nspawn@debian-sandbox.service
 
 
ini
[Service]
CPUQuota=200%
MemoryMax=512M
IOReadBandwidthMax=/ 50M
IOWriteBandwidthMax=/ 50M

4. recept: Titkosított konténer systemd-cryptsetup-pal

A legelső három recept nyitott fájlrendszert használ — aki hozzáfér a gazdagéphez, beolvashatja a konténer tartalmát. Ha érzékeny adatokat tárolsz (pl. fejlesztői kulcsok, adatbázisok, tesztelési hitelesítő adatok), a konténer fájlrendszerét LUKS2 titkosítással is védheted.

Titkosított lemezképfájl létrehozása

 
 
bash
# 2 GB-os üres fájl
sudo fallocate -l 2G /var/lib/machines/titkos-sandbox.raw

# LUKS2 titkosítás inicializálása
sudo cryptsetup luksFormat --type luks2 /var/lib/machines/titkos-sandbox.raw

# Felnyitás (megnyitás) és leképezés
sudo cryptsetup open /var/lib/machines/titkos-sandbox.raw titkos-sandbox

# Ext4 fájlrendszer létrehozása a titkosított területen
sudo mkfs.ext4 /dev/mapper/titkos-sandbox

Konténer telepítése a titkosított képre

 
 
bash
# Mountolás
sudo mkdir -p /mnt/titkos-sandbox
sudo mount /dev/mapper/titkos-sandbox /mnt/titkos-sandbox

# Debian alap telepítése
sudo debootstrap stable /mnt/titkos-sandbox http://deb.debian.org/debian/

# Lecsatolás
sudo umount /mnt/titkos-sandbox
sudo cryptsetup close titkos-sandbox

Konténer indítása titkosítással

Minden indításkor meg kell adnod a jelszót:

 
 
bash
# 1. Felnyitás
sudo cryptsetup open /var/lib/machines/titkos-sandbox.raw titkos-sandbox

# 2. Mountolás
sudo mkdir -p /var/lib/machines/titkos-sandbox
sudo mount /dev/mapper/titkos-sandbox /var/lib/machines/titkos-sandbox

# 3. Konténer indítása
sudo machinectl start titkos-sandbox

Automatizálás systemd unit-tal

Ha ezt a folyamatot minden rendszerinduláskor le kell futtatni, érdemes egy dedikált systemd service unit-ot írni:

 
 
bash
sudo nano /etc/systemd/system/titkos-sandbox-mount.service
 
 
ini
[Unit]
Description=Titkos sandbox konténer felnyitása és mountolása
Before=systemd-nspawn@titkos-sandbox.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/cryptsetup open /var/lib/machines/titkos-sandbox.raw titkos-sandbox
ExecStart=/usr/bin/mount /dev/mapper/titkos-sandbox /var/lib/machines/titkos-sandbox
ExecStop=/usr/bin/umount /var/lib/machines/titkos-sandbox
ExecStop=/usr/bin/cryptsetup close titkos-sandbox

[Install]
WantedBy=multi-user.target
 
 
bash
sudo systemctl daemon-reload
sudo systemctl enable titkos-sandbox-mount.service

Fontos: Jelszóval védett LUKS kötet esetén a systemd a rendszerindításkor megkérdezi a jelszót. Ha nem interaktív (pl. szerver) környezetben automatizálnád, systemd-cryptsetup kulcsfájlt is konfigurálhatsz — ez részletes TPM2-integrációt is lehetővé tesz.


Hasznos egyéb parancsok

Konténerek listázása

 
 
bash
sudo machinectl list

Futó konténer részletes állapota

 
 
bash
sudo machinectl status debian-sandbox

Fájl másolása gazdáról konténerbe

 
 
bash
sudo machinectl copy-to debian-sandbox /helyi/fajl.txt /celjkonytar/fajl.txt

Konténer exportálása (biztonsági mentés)

 
 
bash
sudo machinectl export-tar debian-sandbox debian-sandbox-backup.tar.gz

Konténer importálása

 
 
bash
sudo machinectl import-tar debian-sandbox-backup.tar.gz debian-sandbox-visszaallitva

Mikor használj systemd-nspawn-t Docker helyett?

A systemd-nspawn nem minden helyzetben jobb — de vannak olyan esetek, ahol egyértelműen praktikusabb:

Válaszd a systemd-nspawn-t, ha...

  • Egy másik disztribúció izolált tesztelőkörnyezetét akarod felépíteni gyorsan
  • Teljes systemd-init-et szeretnél a konténerben (pl. cron, journald, több service)
  • Kerülni akarod a Docker daemon-t és a hozzá tartozó overhead-et
  • Meglévő systemd infrastruktúrába illesztett, egységes erőforrás-kezelést szeretnél
  • LUKS titkosítással akarod védeni a konténer tartalmát

Maradj a Dockernél, ha...

  • Rétegezett image-eket és registry-t akarsz (Docker Hub, ghcr.io)
  • Docker Compose-ra épülő multi-container alkalmazásokat kezelsz
  • CI/CD pipeline-ba kell illesztened a konténereket
  • A csapatod már Docker-alapú munkafolyamatban dolgozik

Összefoglalás

A systemd-nspawn az egyik legjobban elrejtett eszköz a Linux eszköztárában. Nem kell telepíteni, mélyen integrált a rendszerrel, és a cgroup v2 erőforrás-korlátok, a machinectl automatizálás, és a LUKS-titkosítás kombinációja komoly, production-közelbe hozható izolációt ad.

 

A négy recept után a következő lépés a systemd-networkd virtuális ethernet konfigurálása a konténerek közötti hálózathoz — de ez már egy külön cikk témája.

Hozzászólások(0)

A hozzászóláshoz be kell jelentkezned.

Bejelentkezeés