mkosi でつくる nspawn 用イメージに AUR パッケージをインストールしたい
2019-10-05 追記: この内容は古くなった。もっと確実な方法を以下で書いている。 ただし単純さでいえば本項目のほうが優れているかも。
90日以上放置すると出るアレが出ていたのでくだらん内容で凌ぐ。 それと mkosi はとくに systemd-nspawn 専用のツールというわけでもなく qemu などで起動する VM 用のイメージも作れるようだが、まあ、うん、いいじゃないですか。
最初に書いておくと mkosi
する過程で AUR パッケージをビルドしてイメージにインストールするという方法は扱っていない。
それをやろうとして2ヶ月ほど苦悩し、結局挫折して今に至る。
TL; DR
devtools
いれて事前にホスト側でパッケージつくる。
作ったパッケージを mkosi.extra
内に置いた上で mkosi.postinst
で pacman -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 パッケージが依存するパッケージを全部列記してインストールしておくようにしたほうがよい。
実例
- https://github.com/nosada/mkosi-files/blob/41302ee69b925ee9b65693122eab59b48d5f456b/guispawn/Makefile#L13-L20 のようにする
- https://github.com/nosada/mkosi-files/blob/41302ee69b925ee9b65693122eab59b48d5f456b/guispawn/mkosi.postinst#L12-L14 のようにする
- https://github.com/nosada/mkosi-files/blob/41302ee69b925ee9b65693122eab59b48d5f456b/guispawn/mkosi.default.tmpl#L11-L40 のように必要なパッケージを書いておく
- こうすると
make
で AUR パッケージ入りのイメージが生成される