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:
systemd-nspawn --version
machinectl --version
Ha mindkettő verziószámot ad vissza, készen állsz. Ha nem:
# 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
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
pacstrapparancsot ugyanilyen logikával.
Belépés a konténerbe
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:
passwd
exit
Rendszerindítás a konténerben (teljes init)
Ha nem csak egy shellt, hanem egy teljes, systemd-del induló rendszert szeretnél:
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:
sudo ls /var/lib/machines/
# debian-sandbox
Indítás és kezelés machinectl-lel
# 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
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:
sudo mkdir -p /etc/systemd/nspawn/
sudo nano /etc/systemd/nspawn/debian-sandbox.nspawn
[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
# 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
# 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
# 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
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:
sudo systemctl set-property --runtime=false systemd-nspawn@debian-sandbox.service MemoryMax=512M
Vagy szerkeszd közvetlenül a drop-in fájlt:
sudo systemctl edit systemd-nspawn@debian-sandbox.service
[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
# 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
# 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:
# 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:
sudo nano /etc/systemd/system/titkos-sandbox-mount.service
[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
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-cryptsetupkulcsfájlt is konfigurálhatsz — ez részletes TPM2-integrációt is lehetővé tesz.
Hasznos egyéb parancsok
Konténerek listázása
sudo machinectl list
Futó konténer részletes állapota
sudo machinectl status debian-sandbox
Fájl másolása gazdáról konténerbe
sudo machinectl copy-to debian-sandbox /helyi/fajl.txt /celjkonytar/fajl.txt
Konténer exportálása (biztonsági mentés)
sudo machinectl export-tar debian-sandbox debian-sandbox-backup.tar.gz
Konténer importálása
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)