テクニカルプア

備忘録と若干の補足

mkosi でつくる nspawn 用イメージに AUR パッケージをインストールしたい

2019-10-05 追記: この内容は古くなった。もっと確実な方法を以下で書いている。 ただし単純さでいえば本項目のほうが優れているかも。


90日以上放置すると出るアレが出ていたのでくだらん内容で凌ぐ。 それと mkosi はとくに systemd-nspawn 専用のツールというわけでもなく qemu などで起動する VM 用のイメージも作れるようだが、まあ、うん、いいじゃないですか。

最初に書いておくと mkosi する過程で AUR パッケージをビルドしてイメージにインストールするという方法は扱っていない。 それをやろうとして2ヶ月ほど苦悩し、結局挫折して今に至る。

TL; DR

devtools いれて事前にホスト側でパッケージつくる。 作ったパッケージを mkosi.extra 内に置いた上で mkosi.postinstpacman -U するようにして mkosi する。

動機

https://aur.archlinux.org/packages/tor-browser/ を使いたかったのだが Firefox が動くことになるので GTK が必要だった。 一方で現在 KDE を使っていて GTK なしでなんとかなっているので GTK をインストールしたくないという気持ちがあった。 既に Chromium が動くようになっている systemd-nspawn 用イメージがあるので、そこから起動してくるコンテナに件のパッケージをインストールしてやれば万事解決するのではと考えた。

方針

AUR パッケージをビルドする際に必要となると思しきパッケージをインストールすることでホストを汚したくないという向きの為に https://www.archlinux.org/packages/extra/any/devtools/ というものがある。 どうやらこれは Arch Linux 開発者向けのものらしいが、Arch 用パッケージを作るだけという用途でも充分に効果を発揮する。

https://wiki.archlinux.org/index.php/DeveloperWiki:Building_in_a_clean_chroot が詳しいが、 devtools に同梱される各種スクリプトを使用することで chroot で隔離された環境で makepkg に類することができる。

今回の用途としては AUR から git clone してできたディレクトリ内で extra-x86_64-build してやれば事足りる。 こうすると extra-x86_64-build を実行したときに居たディレクトリ内に pacman で処理できるパッケージができる。こいつを mkosi で処理できる場所に置いてやればよい。

mkosi はこれを実行したディレクトリ内にある mkosi.extra/ というディレクトリの中身をビルド対象イメージ内に全部コピーするので、先のパッケージをこのディレクトリに置いてやればイメージ内にパッケージが持ち込まれる。

これをどうインストールしてやるかについては mkosi.postinst というビルド処理完了時にイメージ内で実行されるスクリプトがあるので、この中で対象のパッケージを pacman -U してやるようにすればよい。 なお AUR パッケージの依存関係解決が走る場合、 mkosi.postinst が実行される段階ではネットワークがうまく疎通できなくなる 1 ので、ビルド内容を定義する mkosi.default なファイルで事前に AUR パッケージが依存するパッケージを全部列記してインストールしておくようにしたほうがよい。

実例

  1. https://github.com/nosada/mkosi-files/blob/41302ee69b925ee9b65693122eab59b48d5f456b/guispawn/Makefile#L13-L20 のようにする
  2. https://github.com/nosada/mkosi-files/blob/41302ee69b925ee9b65693122eab59b48d5f456b/guispawn/mkosi.postinst#L12-L14 のようにする
  3. https://github.com/nosada/mkosi-files/blob/41302ee69b925ee9b65693122eab59b48d5f456b/guispawn/mkosi.default.tmpl#L11-L40 のように必要なパッケージを書いておく
  4. こうすると make で AUR パッケージ入りのイメージが生成される

  1. mkosi 中に AUR パッケージをビルドできず挫折したのもこれが原因。ただこれ systemd-nspawn の問題というよりは veth に対しての iptables ルールが原因な気もしている。