テクニカルプア

備忘録と若干の補足

mkosi をつかって nspawn 用のコンテナイメージをつくる

2017-07-19 追記:

下記で GitHub 上においてある mkosi を使用してコンテナイメージをつくる設定ファイルを紹介しているが、いろいろいじくった結果この記事で紹介した内容と使い方がかなり乖離してしまうようになってしまった。
もし使用される際は README を参照のこと。

mkosi という OS イメージをいろんなフォーマットでいい感じに作れるものがある。
github.com
これを使うと、いままで

$ mkdir container
# pacstram -i -d container base
# tar cvf container container.tar
# machinectl import-tar container.tar

とかしてたやつが

# mkosi
# machinectl import-tar container.tar.xz

くらいでよくなる。
何も考えずに mkosi 叩くだけでもホストと同じ OS でコンテナを作ってくれたりといい感じに動くのだけれど、設定ファイルとかコンテナ内に置いておきたいファイルなどを事前に用意しておけばもっとよしなにやってくれるということなので、早速作ってみた。
github.com

archlinux しか知らないので archlinux 用の書き方とかファイルを使うようになってしまっている。
mkosi コマンドは AUR にしかないので、

$ pacaur -S mkosi

などしたあと、上のリンクからレポジトリを引っ張ってきて、

# mkosi

とすると、corespawn.tar.xz という名前で圧縮ファイルができる。
これを展開して systemd-nspawn に直接食わしてもよし、machinectl import-tar で取り込んで machinectl start してもよしで、作ってしまえばどうにでもなる。

レポジトリの中身は下記の通り(主要なものを記載)

.
├── mkosi.default     # 設定ファイル
├── mkosi.extra       # コンテナ作成後にコピーしたいファイルを入れる
│   ├── pacman.conf  # pacman 設定ファイル(ILoveCandy とか追記してあるだけ)
│   └── securetty    # machinectl login で root ユーザからのログインがこけるので pts/0 を追記してある
└── mkosi.postinst    # コンテナ作成後にコンテナ内部で実行するスクリプト

mkosi.default は作りたいコンテナで使う OS やパッケージ、出力するファイル形式などを指定する。
注意すべきは mkosi.extra/ で、この中にいれたファイルはコンテナ内の / 下にすべて置かれてしまう。mkosi.extra/ 単体ではいい感じのパスにファイルを置くなどはできない。
こういうことをしたければ mkosi.postinst としてコンテナ作成後に実行するスクリプトを用意し、その中で mv などをするようにするとよい。

pacstrap でやるのがめんどくさかったり pacstrap でのコンテナ作成作業をシェルスクリプトで書いていたりする場合には mkosi を使うと便利になったりするかなあと思った。