Ich hatte das gleiche Problem beim Testen meiner Ansible-Playbooks, für die systemd erforderlich ist. Und wie Sie sagten, scheint Docker hier der beste Ansatz zu sein, da es viel einfacher ist, einen Container als eine virtuelle Maschine auf und ab zu bringen.
Zunächst einmal ist das Base / Archlinux- Image veraltet - Sie sollten stattdessen Archlinux / Base verwenden. Um systemd völlig unprivilegiert auszuführen, sollten einige Dinge getan werden:
- Geben Sie eine Variable "conrainer =" an, damit systemd nicht versucht, eine Reihe von Aufgaben auszuführen, die normalerweise beim Booten einer Hardwaremaschine ausgeführt werden
- systemd verwendet aktiv cgroups, also binden Sie das Dateisystem mount / sys / fs / cgroup von einem Host
- bind mount / sys / fs / fuse ist nicht erforderlich, hilft jedoch, Probleme mit sicherungsabhängiger Software zu vermeiden
- systemd ist der Meinung, dass die Verwendung von tmpfs überall ein guter Ansatz ist, aber das Ausführen von nicht privilegierten Dateien macht es unmöglich, tmpfs zu mounten, wo immer es will, also mounten Sie tmpfs vorab in / tmp, / run und / run / lock
- Als letztes Bit müssen Sie sysinit.target als Standardeinheit zum Booten anstelle von multi-user.target oder was auch immer angeben, da Sie wirklich keine grafischen Elemente in einem Container starten möchten
Die resultierende Befehlszeile ist
docker run \
--entrypoint=/usr/lib/systemd/systemd \
--env container=docker \
--mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup \
--mount type=bind,source=/sys/fs/fuse,target=/sys/fs/fuse \
--mount type=tmpfs,destination=/tmp \
--mount type=tmpfs,destination=/run \
--mount type=tmpfs,destination=/run/lock \
archlinux/base --log-level=info --unit=sysinit.target
Wenn wir über das Ausführen eines bestimmten Dienstes wie ntpd aus Ihrem Beispiel sprechen, müssen Sie hinzufügen
--cap-add=SYS_TIME
Andernfalls schlägt ntpd mit der Verweigerung der Berechtigung fehl, da niemand möchte, dass ein Container standardmäßig die Systemzeit festlegt.
Ps Ich habe eine ganze Weile gelernt, wie sich systemd verhält, und es geschafft, es mit der Anzahl der Betriebssystem-Images zum Laufen zu bringen. Ich habe meine Erfahrung in einem Artikel beschrieben, in dem systemd im Docker-Container ausgeführt wird . Es ist auf Russisch, aber ich glaube, Google Übersetzer sollte in Ihrem Browser funktionieren. Vielen Dank
ENTRYPOINT
System geben . Wenn Sie nach einer Art Container-Integration mit systemd suchen, können Sie einen nspawn-Service