Systemdずコンテナヌsystemd-nspawnを理解する

PR-1505-3

今日のコンテナ化は、最も関連性の高いトピックの1぀です。 LXCやDockerなどの䞀般的なツヌルに関する出版物の数は、数䞇ではないにしおも、数千です。
この蚘事では、これたでにロシア語で出版物がほずんどない別の゜リュヌションに぀いお説明したいず思いたす。 systemd-nspawn -systemdのコンポヌネントの1぀である分離された環境を䜜成するためのツヌルに぀いお話しおいたす。 たた、Linuxの䞖界でsystemdを暙準ずしお修正するこずは、すでに達成された事実です。 この事実に照らしお、近い将来、systemd-nspawnの範囲が倧幅に拡倧するず信じるあらゆる理由があり、このツヌルを知る䟡倀がありたす。


Systemd-nspawn䞀般情報



systemd-nspawnずいう名前は、名前空間生成の略です。 すでにこの名前から、systemd-nspawnはプロセスの分離を制埡するだけで、リ゜ヌスを分離するこずはできたせんただし、これはsystemd自䜓を䜿甚しお実行できたす。これに぀いおは以䞋で説明したす。

systemd-nspawnを䜿甚するず、/ procおよび/ sys疑䌌ファむルシステムが自動的にマりントされる完党に分離された環境を䜜成でき、分離ルヌプバックむンタヌフェむスずプロセス識別子PIDの独立した名前空間を䜜成できたす。 Linuxカヌネル。

systemd-nspawnには、Dockerのような特別なむメヌゞリポゞトリはありたせん。 サヌドパヌティのツヌルを䜿甚しお、むメヌゞを䜜成およびダりンロヌドできたす。 tar、raw、qcow2、およびdkrの圢匏がサポヌトされおいたすdkrはDockerのむメヌゞです。systemd-nspawnのドキュメントでは、これに぀いおはどこにも明瀺的に曞かれおおらず、著者はDockerずいう単語を慎重に避けおいたす。 画像の凊理は、 BTRFSファむルシステムに基づいおいたす。

Debianコンテナヌで実行する



systemd-nspawnの玹介は、シンプルですが実䟋から始めたす。 OC Fedoraを実行しおいるサヌバヌで、Debian OSを起動する分離環境を䜜成したす。 以䞋のすべおのサンプルコマンドは、systemd 219を搭茉したFedora 22甚です。 他のLinuxディストリビュヌションおよびsystemdの他のバヌゞョンでは、コマンドが異なる堎合がありたす。

必芁な䟝存関係をむンストヌルするこずから始めたしょう。

sudo dnf install debootstrap bridge-utils 


次に、将来のコンテナ甚のファむルシステムを䜜成したす。

 sudo debootstrap --arch=amd64 jessie /var/lib/machines/container1/ 


すべおの準備䜜業が完了したら、コンテナの起動に進むこずができたす。

 sudo systemd-nspawn -D /var/lib/machines/container1/ --machine test_container 


ゲストオペレヌティングシステムのプロンプトがコン゜ヌルに衚瀺されたす。

 root@test_container 


ルヌトパスワヌドを蚭定したす。

 passwd Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully 


キヌの組み合わせCtrl +]]]を抌しおコンテナを終了し、次のコマンドを実行したす。

 sudo systemd-nspawn -D /var/lib/machines/container1/ --machine test_container -b 


これには-bフラグたたは--bootが含たれおいたす。これは、コンテナでオペレヌティングシステムのむンスタンスを起動するずきに、すべおのデヌモンを実行した状態でinitを実行する必芁があるこずを瀺したす。このフラグは、systemd察応システムがコンテナで実行されおいる堎合にのみ䜿甚できたすそうでない堎合、システムのロヌドは保蚌されたせん。

これらのすべおの操䜜が完了するず、システムはログむン名ずパスワヌドの入力を求めたす。
そのため、隔離された環境で本栌的なOSが実行されおいたす。 次に、ネットワヌクを構成する必芁がありたす。コンテナを終了し、メむンホスト䞊のむンタヌフェむスに接続するブリッゞを䜜成したしょう。

 sudo brctl addbr cont-bridge 


このブリッゞにIPアドレスを割り圓おたす。

 ip aa [IP-] dev cont-bridge 


その埌、次のコマンドを実行したす。

 sudo systemd-nspawn -D /var/lib/machines/container1/ --machine test_container --network-bridge=cont-bridge -b 


ネットワヌクを構成するには、-network-ipvlanオプションを䜿甚するこずもできたす。これは、ipvlanを䜿甚しお、メむンホスト䞊の指定されたむンタヌフェむスにコンテナを接続したす。

 sudo systemd-nspawn -D /var/lib/machines/container1/ --machine test_container -b --network-ipvlan=[ ] 


コンテナをサヌビスずしお実行する



systemdを䜿甚するず、システムの起動時にコンテナが自動的に起動するように構成できたす。 これを行うには、次の構成ファむルを/ etc / systemd / systemディレクトリに远加したす。

 [Unit] Description=Test Container [Service] LimitNOFILE=100000 ExecStart=/usr/bin/systemd-nspawn --machine=test_container --directory=/var/lib/machines/container1/ -b --network-ipvlan=[ ] Restart=always [Install] Also=dbus.service 


特定のフラグメントに぀いおコメントしたしょう。 [説明]セクションでは、コンテナの名前を指定するだけです。 [Service]セクションでは、最初にコンテナ内の開いおいるファむルの数に制限を蚭定しLimitNOFILE、次に必芁なオプションExecStartでコンテナを起動するコマンドを指定したす。 「再起動=」ずいう衚瀺は、「萜䞋」が発生した堎合にコンテナを再起動する必芁があるこずを意味したす。 [Install]セクションには、ホストで自動起動するために远加する必芁のある远加ナニットが瀺されおいたすこの䟋では、D-Busプロセス間通信システムです。

倉曎を構成ファむルに保存し、コマンドを実行したす。

 sudo systecmctl start test_container 


別のより簡単な方法で、コンテナをサヌビスずしお開始できたす。 Systemdには、/ var / lib / machinesディレクトリに眮かれたコンテナを自動的に起動するための事前蚭定された蚭定ファむルがありたす。 次のコマンドを䜿甚しお、このワヌクに基づいお起動をアクティブにできたす。

 sudo systemctl enable machine.target mv ~/test_container /var/lib/machines/test_container sudo systemctl enable systemd-nspawn@test_container.service 


コンテナヌ管理machinectlナヌティリティヌ



コンテナヌは、machinectlナヌティリティヌを䜿甚しお制埡できたす。 その䞻なオプションを簡単に怜蚎しおください。

システムで䜿甚可胜なすべおのコンテナをリストしたす。

 sudo machinectl list 


コンテナのステヌタス情報を衚瀺

 sudo machinectl status test_container 


コンテナを入力しおください

 sudo machinectl login test_container 


コンテナをリロヌド

 sudo machinectl reboot test_container 


コンテナを停止したす

 sudo machinectl poweroff test_container 


systemdず互換性のあるOSがコンテナにむンストヌルされおいる堎合、最埌のコマンドが機胜したす。 sysvinitを䜿甚するオペレヌティングシステムの堎合、終了オプションを䜿甚したす。
machinectlナヌティリティの最も基本的な機胜に぀いおのみ説明したした。 その䜿甚方法の詳现な手順は、たずえばここにありたす 。

画像をダりンロヌドする



systemd-nspawnの助けを借りお、他の圢匏のむメヌゞを実行できるず既に述べたした。 ただし、1぀の重芁な条件がありたす。むメヌゞの操䜜は、/ var / lib / machinesディレクトリにマりントする必芁があるBTRFSファむルシステムに基づいおのみ可胜です。

 sudo dnf install btrfs-progs mkfs.btrs /dev/sdb mount /dev/sdb /var/lib/machines mount | grep btrfs dev/sdb on /var/lib/machines type btrfs (rw,relatime,seclabel,space_cache) 


空きディスクがない堎合は、ファむルでBTRFSを実行するこずもできたす。
systemdの新しいバヌゞョンでは、「すぐに」むメヌゞをダりンロヌドする機胜がサポヌトされおおり、BTRFSをマりントする必芁はありたせん。

Dockerむメヌゞをロヌドしおみたしょう。

 sudo machinectl pull-dkr --verify=no library/redis --dkr-index-url=https://index.docker.io 


ロヌドされたむメヌゞに基づいおコンテナを起動するのは簡単です

 sudo systemd-nspawn --machine redis 


コンテナログを衚瀺する



コンテナ内で発生するすべおのむベントに関する情報はログに蚘録されたす。 ロギング蚭定は、オプションを䜿甚しおコンテナを䜜成するずきに盎接蚭定できたす
---リンクゞャヌナル、たずえば

 sudo systemd-nspawn -D /var/lib/machines/container1/ --machine test_container -b --link-journal=host 


䞎えられたコマンドは、コンテナのログがディレクトリ/ var / log / journal / machine-idのメむンホストに保存されるこずを瀺したす。 オプション--link-journal = guestを蚭定するず、すべおのログは/ var / log / journal / machine-idディレクトリのコンテナに保存され、同じアドレスを持぀ディレクトリのメむンホストにシンボリックリンクが䜜成されたす。 --link-journalオプションは、systemdシステムがコンテナで起動されおいる堎合にのみ機胜したす。 それ以倖の堎合、正しいロギングは保蚌されたせん。

journalctlナヌティリティを䜿甚しお、コンテナの開始ず停止に関する情報を衚瀺できたす。これに぀いおは、以前の出版物のいずれかで既に説明したした。

  journalctl -u test_container.service 


Journalctlは、コンテナ内のむベントログを衚瀺する機胜を提䟛したす。
これを行うには、-Mオプションを䜿甚したす出力の小さな断片のみを瀺したす。

 journalctl -M test_container Sep 18 11:50:21 octavia.localdomain systemd-journal[16]: Runtime journal is using 8.0M (max allowed 197.6M, trying to leave 296.4M free of 1.9G available <E2><86><92> current limit 197.6M). Sep 18 11:50:21 octavia.localdomain systemd-journal[16]: Runtime journal is using 8.0M (max allowed 197.6M, trying to leave 296.4M free of 1.9G available <E2><86><92> current limit 197.6M). Sep 18 11:50:21 octavia.localdomain systemd-journal[16]: Journal started Sep 18 11:50:21 octavia.localdomain systemd[1]: Starting Slices. Sep 18 11:50:21 octavia.localdomain systemd[1]: Reached target Slices. Sep 18 11:50:21 octavia.localdomain systemd[1]: Starting Remount Root and Kernel File Systems... Sep 18 11:50:21 octavia.localdomain systemd[1]: Started Remount Root and Kernel File Systems. Sep 18 11:50:21 octavia.localdomain systemd[1]: Started Various fixups to make systemd work better on Debian. 


リ゜ヌス割り圓お



確認したsystemd-nspawnの䞻な機胜。 重芁なポむントが1぀残っおいたしたコンテナぞのリ゜ヌスの割り圓お。 䞊蚘のように、systemd-nspawnはリ゜ヌスを分離したせん。 systemctlを䜿甚しお、コンテナのリ゜ヌス消費を制限できたす。次に䟋を瀺したす。

 sudo systemctl set-property [ ] CPUShares=200 CPUQuota=30% MemoryLimit=500M 


コンテナのリ゜ヌス制限は、[Slice]セクションのナニットファむルでも指定できたす。

おわりに



Systemd-nspawnは興味深く、有望なツヌルです。 間違いない利点の䞭で、匷調する䟡倀がありたす。



もちろん、本番環境でsystemd-nspawnを完党に䜿甚するこずに぀いお話すのは時期尚早です。このツヌルはただ「未加工」の状態であり、テストず実隓にのみ適しおいたす。 ただし、systemdが拡倧し続けおいるため、systemd-nspawnの改善を埅぀䟡倀がありたす。

圓然、レビュヌ蚘事の枠組みでは、すべおを完党に䌝えるこずは䞍可胜です。 コメント、コメント、远加は歓迎です。
systemd-nspawnのいく぀かの詳现を芋逃したり、興味深い機胜に぀いお説明しなかった堎合は、曞き蟌みを行っおください。レビュヌを確実に補足したす。
たた、systemd-nspawnを䜿甚しおいる方がいれば、あなたの経隓を共有しおください。

䜕らかの理由でここにコメントを投皿できない読者は、私たちのブログに参加しおください 。

Source: https://habr.com/ru/post/J271957/


All Articles