systemd-nspawnとmachinectlコマンドまとめ

前回の記事machinectlコマンドを少し紹介しました。
今回はその続きとして、systemd-nspawnの管理コマンドを紹介します。

環境設定は前回作ったものと同じ想定です。

machinectlコマンド自体はsystemd-nspawn専用ではありませんが、こちらのコマンドを使って管理できます。
すべては紹介しきれないので個人的によく使うコマンドを紹介します。

初期設定

machinectlコマンド経由でsystemd-nspawnを起動するかたちになります。

ファイルはどこにおいても-Dオプションで指定すればいいのですが、デフォルトで/var/lib/machinesを想定しますのでこちらに移動しておくと便利です。

flow

前回作ったubuntuディレクトリは/var/lib/machinesに移動しておきます。

mv ./ubuntu /var/lib/machines

設定はお好みでOKです。


今回は以下のように設定します。
(細かいオプションの説明についてはman systemd-nspawnを参照ください)

cd /etc/systemd/system
curl https://gist.githubusercontent.com/yaasita/df722fe1fee22ca0eb05b74d3aa12d48/raw/systemd-nspawn@.service -O
systemctl daemon-reload

設定は@を付けたテンプレートユニットですので、/var/lib/machines/ubuntuに置いたコンテナは

systemctl start systemd-nspawn@ubuntu

machinectl start ubuntu # こちらでも可(後述)

として起動できます。

また、再起動時などに自動的にコンテナを起動するには

systemctl enable systemd-nspawn@ubuntu

machinectl enable # こちらでも可

というコマンドでOKです(解除する場合はdisable)。

これで設定は完了です。

コンテナ操作

machinectl list

現在起動中のコンテナ(とVM)のリストを表示します。
machinectlコマンドだけ打っても同じです。

systemd-nspawnを使って作られたコンテナは、SERVICEsystemd-nspawnと表示されています。

list

machinectl start NAME

コンテナを起動します。

  • NAMEには、/var/lib/machinesに置いたディレクトリ名を指定します。

下記のコマンドと同じ動作なのですが、タイプ数が少なくて済みます。

systemctl enable systemd-nspawn@ubuntu

machinectl poweroff NAME

コンテナをシャットダウンします。

  • NAMEには、/var/lib/machinesに置いたディレクトリ名を指定します。

こちらはsystemd経由で正しい終了処理をしてくれます。
コンテナ内に入ってshutdownコマンドでpoweroffしてもOKです。

machinectl terminate NAME

コンテナを即座に終了させます。

  • NAMEには、/var/lib/machinesに置いたディレクトリ名を指定します。

プロセスを即座に停止させるので、daemonが正しい終了処理がを行えない可能性があります。

machinectl login NAME

ログインのターミナルを開きます。

使うためにはコンテナ内でdbusが走っている必要がありますので、あらかじめ以下のコマンドでインストールしておいてください。

# コンテナ内で打つ
apt install dbus

抜けるときはCtrl-]を3回押します

machinectl shell NAME

シェルを実行してコンテナ内に入ります。

使うためにはコンテナ内でdbusが走っている必要がありますので、あらかじめ以下のコマンドでインストールしておいてください。

# コンテナ内で打つ
apt install dbus

以下のようにbashを指定して入ることもできます。

machinectl shell ubuntu /bin/bash

machinectl bind NAME PATH [PATH]

コンテナとホストのディレクトリを紐付けます。

  • 2番目のPATHを省略すると、ホストとコンテナ間で同じ位置のディレクトリをつなげます。
  • --read-onlyオプションを付けると、コンテナ内からは読み取り専用になります
# ホストの/mnt/for-containerをコンテナの/mntへ
machinectl bind ubuntu /mnt/for-container /mnt             

# 読み取り専用でbind
machinectl bind ubuntu /mnt/for-container /mnt --read-only 

# ホストの/var/tmpをコンテナの/var/tmpへ
machinectl bind ubuntu /var/tmp                            

イメージ操作

イメージ操作は/var/lib/machinesにあるディレクトリの操作なので、machinectlコマンドを使わなくても行えますが、一応紹介します。

machinectl list-image

/var/lib/machinesにあるイメージ一覧を表示します。

list-image

machinectl export-tar NAME [FILE]

/var/lib/machinesにあるNAMEのイメージをtarで固めてエクスポートしてくれます。
以下のように、拡張子から圧縮形式を類推してくれます。

machinectl export-tar ubuntu ubuntu.tar
machinectl export-tar ubuntu ubuntu.tar.gz
machinectl export-tar ubuntu ubuntu.tar.bz2

FILEを省略すると標準出力となります。
吐き出したイメージはsystemd-nspawnはもちろん、Dockerでdocker importで入れることもできます。

/var/lib/machinectlにある該当のコンテナイメージを自分で固めてもOKです。

machinectl import-tar FILE [NAME]

FILEのtarファイルをNAMEディレクトリとして/var/lib/machinesに保存します。

  • NAMEを省略するとファイル名と同じものが作られます
machinectl import-tar ubuntu.tar.gz ubuntu2
  • FILE-にすると標準入力から読み込みます。

Dockerイメージをインポートする場合はこんな感じになります。

docker export $(docker create debian:latest) | machinectl import-tar - debian

/var/lib/machinectlに解凍したものを置いてもOKです。

machinectl remove NAME

NAMEのコンテナイメージを削除します。

下記のように削除してもOKですが、NAMEコンテナの起動中には行わないようにしてください。

rm -rf /var/lib/machines/NAME

まとめ

今回はmachinectlコマンドを紹介しました。

systemd-nspawnは、ディレクトリ内でコンテナを動かすだけのとてもシンプルなツールです。

ですので、今回ご紹介したコマンドを覚えなくても、自分で/var/lib/machinesディレクトリを操作して目的を達成できる方は覚えなくてもOKです(Dockerから来た人はmachinectlコマンドを使った方がしっくりくるかもしれません)。

簡単なディレクトリ操作だけで複雑な処理は何もしていませんので、すぐ覚えられると思います。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

yamasita

東京電機大学工学部→3年間某SIerにて銀行システムの開発→bpsに入社→TechRacho外部ライター

yamasitaの書いた記事

インフラ
現場で使うansible

2014年12月25日

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ