systemd-nspawn コンテナを便利に使おう

eix-update の定期実行

eix-update を実行するユニット eixupdate.service を作成する

vim /etc/systemd/system/eixupdate.service

    [Unit]
    Description=execute eix-update

    [Service]
    Type=simple
    ExecStart=/usr/bin/eix-update
    RemainAfterExit=no

eixupdate.service が正常に実行できる事を確認する

# 実行
systemctl start eixupdate.service

# ログの確認
systemctl status eixupdate.service
journalctl -f -u eixupdate

timer ユニットを作成する

vim /etc/systemd/system/eixupdate.timer

    # 毎朝 9 時に eixupdate.service を実行する
    [Unit]
    Description=execute eix-update

    [Timer]
    OnCalendar=*-*-* 9:30:00
    Unit=eixupdate.service

    [Install]
    WantedBy=multi-user.target

eixupdate.timer を有効にする

systemctl daemon-reload
systemctl start eixupdate.timer
systemctl status eixupdate.timer
systemctl enable eixupdate.timer

timer ユニット一覧を確認する

systemctl list-unit-files -t timer
systemctl list-timers

Appendix

注釈

reboot ができない対処

--keep-unit オプションは machinectl コマンドで制御する為に必要だが使うと reboot コマンドを打つと shutdown されてしまう。 これを回避する為には対象のコンテナについては専用 Unit を書き machinectl を使わずに制御する。

個別設定のユニットを作りたい場合はスタートアップに追加した時に作られるユニットをコピーする

cp -ip /etc/systemd/system/machines.target.wants/systemd-nspawn@mailbase.service /etc/systemd/system/container-mailbase.service
# %I をコンテナ名に書き換え、ExecStart 等を追加、変更する
vim container-mailbase.service
# 起動を確認
systemctl daemon-reload
systemctl status container-mailbase.service
systemctl start container-mailbase.service

コマンド一覧

コンテナの起動停止

machinectl start gbase
machinectl poweroff
# machinectl reboot
# machinectl terminate
# machinectl kill

コンテナのスタートアップ

machinectl enable gbase
machinectl disable gbase

その他

machinectl copy-to
machinectl copy-from
machinectl bind

稼働中のコンテナの確認

machinectl list
machinectl status gbase
machinectl show gbase

コンテナイメージの確認

machinectl list-images
machinectl image-status
machinectl show-image

コンテナイメージの複製

machinectl clone [From] [To]

コンテナイメージのリネーム、削除

machinectl rename [From] [To]
machinectl remove [コンテナ名]

コンテナイメージの容量制限

machinectl set-limit

コンテナイメージのアーカイブ、展開

# アーカイブ
machinectl export-tar --format=[gz, bzip2, xz] [コンテナ名] [ファイル名]
# xz でマルチスレッド圧縮をする例 (一番お勧め!)
maxz() { machinectl export-tar $1 $1.tar && nice -n 20 xz -z -f -T $(nproc) -vv $1.tar; }
maxz gbase

# インポート
machinectl import-tar [ファイル名] [コンテナ名]

format

size

Compression speed

Expanding speed

無圧縮

980305920

00:06

00:06

gzip

320368608

00:34

00:09

bzip2

279357808

01:16

00:31

xz

209442372

04:39

00:19

xz(maxz)

214837408

01:10

省略

Web サーバからイメージをダウンロードする

# machinectl pull-tar [URL] [name]
machinectl pull-tar --verify=no http://spica:8000/gbase.tar.gz gbase

# pull の最中に Ctrl+C で処理をバックグラウンドにする事ができるが、バックグラウンドの処理を見たい時に実行する。
machinectl list-transfers

#ワンライナーで Web サーバ
python3 -m http.server

コンテナイメージ操作 未調査

# machinectl export-raw
# machinectl import-raw

本番用 Tips

ディスククォータの設定

set-limit
  • MemoryLimit ?

    ulimit -m

使用する CPU の固定

# Unit で cpuaffinity
CPUAffinity=0 1 2 3