NixOS に関する小ネタ集
これは何?
- 関数型パッケージマネージャを持つ NixOS と言う Linuxについての Tips 集です
- 割と雑多かつランダムに話を書いています
- 何か分からない事あったらコメント等で質問を受け付けてます
NixOS って?
- 元は 2010 年頃に提出された whitepaper に元づく Linux Distro
- 関数型言語である Nix expression language で設定を書いてシステムが構築される Linux
- docker などとは違い、ソフトウェアやライブラリの完全なバージョン固定などが出来る
書いた内容
- エコシステム
- Linux Desktop として使う
- 実用便利ネタ
あとで書く
-
wrapGAppsHook
とかwrapQtAppsHook
とかの辺り -
nixpkgs
に無いパッケージ定義の書き方 - Input method 周り
- Xorg 周り
- Wayland 周り
- nixpkgs の master の追い掛け方
- バイナリパッケージをNixOS で使う方法
- nixpkgs を使える NixOS 以外の環境について
- NixOS を使う際のストレージ容量についての注意点
- nix-ld でポン置きの実行バイナリを動かす
NixOS で困った時に見るところ
- NixOS のパッケージとオプションが検索できる
- ここで検索すれば、既存の設定を利用できるか自分で設定を書くかの判別が付く
- 他の Linux である package は大体見つかる。ただ場合によって中身が更新されてないのもある
- パッケージによって NixOS 特有の設定が必要な場合、ここに情報が記載されている場合がある
- あと NixOS でのコミュニティリンクが掲載されているので、それを辿るのが便利
- ただし欲しい情報が常にある訳ではない
- nixpkgs の定義であの関数ってどう使うんだっけ?と言う時に見る
- nixpkgs 特有の関数とか shell script の function の引数など載っている
- ただし関数の存在を知っていないと辞書的に引けない面もある
- Archlinux じゃねぇか!と思われるかもしれないが、Linux toolchain の使い方を見る分には便利
- NixOS で困ったら Archlinux の Wiki を見て NixOS で再現する、と言う場合も結構ある
- ただしすべての方法が NixOS で再現できる訳でもないので、その点は注意
Nix flake って何?
- nixpkgs の定義の version を固定したり task runner として使ったり色々できる仕組み
- 最新かつ experimental な仕組みなので NixOS や nixpkgs での設定が必要
- 一回設定すると便利なので積極的に使ってくと良い
Nix flake で出来ること
- 公式リポジトリを含む nixpkgs 定義の追従と lock
-
nix build
できるパッケージ定義の提供 -
nix run
できるアプリケーションの指定 -
nix develop
で用意できる開発環境の整備 - nixpkgs overlay の提供
- nixos module の提供
その他細かいところは 上記 nixos.wiki の Flakes のページを見ればある程度把握できます。
Nix flake を使うと便利なこと
-
nix run
を task runner として使ったりnix develop
で開発用シェルを用意できる - flake.lock で nixpkgs 定義の revision を固定できる。これにより再現性が上がる
- nixpkgs overlay や nixos module の拡張が出来る。これにより NixOS の柔軟性がさらに上がる
Nix flake で不便なこと
-
flake.nix
を毎回用意するのが面倒(とは言えこれは template を用意すればなんとかなる?) - システムの
flake.lock
と各開発リポジトリのflake.lock
を合わせるのが面倒 - nix flake は experimental なので意図的に有効にする必要がある
NixOS でポン置き実行バイナリを動かす方法
ポン置き実行バイナリってそもそも何よ?
- Go 言語とかで良くある実行バイナリ自体が配布されているアレ
- 主にバイナリ形式で実行権限を付けるだけで使える様になるソフトウェアのこと
- ポン置き実行バイナリは大抵の Linux で実行できるが NixOS は例外として対策しないと使えない
NixOS でポン置き実行バイナリを動かせない理由
- 一言で言えば
/lib64/ld-linux-x86-64.so
が定位置に無いため - Linux の実行バイナリは
ld-linux.so
が無いとバイナリを実行できない - そのため NixOS ではこれに対し何かしらの対策をする必要がある
patchelf
で --set-interpreter
する
対策(1): - これは ELF 実行バイナリ内の
/lib64/ld-linux-x86-64.so
のパスを改変する方法 - バイナリにパッチするので ELF バイナリによっては実行バイナリが壊れる。特に Go 製
- また
glibc
が更新される度にld-linux.so
の位置が変わるので、それを手当するのが面倒 - ただし nixpkgs 管理下であればこの手法は良く使われている
nix-ld
を使う
対策(2):
- NixOS に代わって
ld-linux.so
を用意する方法。私はこの方法を使っている - 利点としては上記 repo の README に従って環境設定すれば大抵の ELF バイナリは動かせる
- ただし
NIX_LD_LIBRARY_PATH
にあれこれ設定しずぎると nixpkgs の実行環境が壊れたりもする
GUI 環境での Input method はどうすれば良いのか
NixOS に限らず、Linux で日本語入力しようとすると悩みのタネとなる事柄として、
- Input Method(日本語入力・日本語変換)をどうするか
と言う事柄がありますが、NixOS の場合これがさらにややこしくなります。
と言うのも NixOS では、まず Input Method を設定する際には /etc/nixos/configuration.nix
において
i18n.inputMethod.enabled = "fcitx5"
と言う様な設定を行います。ちなみにもう少し細かい部分は、
で見れます。なお日本でメジャーどころだと ibus
、fctix
、fcitx5
、uim
辺りが使えます。
そしてその際に Gnome や KDE Plasma をそのまま使っていればそれ以上の設定はあまり必要ないのですが、Gnome や KDE Plasma を使わず、Openbox (Xorg) や labwc (Wayland) などを直接使う場合、gsettings 周りで追加の設定が必要な場合があります。
特に ibus
で顕著なのですが、Gnome や KDE Plasma と言った細かい設定コミコミ ではない Windows Manager や Wayland Compotisor を使う場合、gsettings
周りへの手当てが行なわれていないと、
- そもそも Input Method が起動しない
- Input Method が起動しても設定が保存されない
と言ったトラブルが発生します。
そしてこれを回避するにはどうするか、と言うと、
- Gnome を有効にする際の gsettings 周りの設定を自分の nixpkgs に移植する
と言う実装が必要となります。なので Gnome や KDE Plasma 以外を使う方は覚悟しましょう。
なおこの辺りをどう移植するか、については、オリジナルの実装と私の設定リポジトリでのコミットを見ればなんとなくの雰囲気は掴めると思います。
Input Method 評論
で、実際問題として Input Method は何を使ったらええんや?と聴かれそうなので私なりの答えを書いておくと、面倒な諸々を避けるのであれば、
fcitx5
を使っとけ、と言う感じの答えとなります。
と言うのも、現実問題として fcitx5
以外の Input method は下記の様な感じだからです(私見を含む)。
-
ibus
-gsettings
周りを正しく処理しないとそもそも正常に機能しない -
uim
- Qt on Wayland で動かない。あと公式の定義では Qt5 で使えない -
fcitx(4)
- メンテモードでこれ以上は更新されない
それと私は skk 使いなのですが、何もせず skk
が使えるのは fcitx(4)
と uim
だけで、 ibus
と fcitx5
については、自分で定義ファイルを書いてモジュールをコンパイルする必要があります。
そして私は以前にibus-skk
を自分でビルドして使っていましたが、ibus-skk
はしばらく前から core dump するのが解決できなくなっているため、私は fctix5-skk
を自前でビルドして使っています。
以上
まぁ NixOS での Input Method については、面倒なことをやりたくないのであれば、 fcitx(4)
か fcitx5
を使っておけば、余計なトラブルを背負わなくても良い様な気がしています。が、これは自分の環境だけかもしれないので、各自の環境で色々試してみることをお勧めします。
なお私が使っている fcitx5
と fcitx5-skk
の設定などは、
を参考にしてみて下さい。
Waydroid で LineageOS 18.1 を動かす方法
Waydroid とは?
Waydroid は Wayland 環境下で動く Android Container で、Wayland な GUI 環境で Android アプリを動かせる実行環境です。
Waydroid は Linux Desktop だけで使われているかと思いきや Linux Mobile (Ubuntu Touch とか postmarketOS など)を搭載した PinePhone などでも使われている様です。
Waydroid で LineageOS 18.1 系を動かす方法
具体的には /etc/nixos/configuration.nix
の様な設定ファイルで、下記の様な設定を足します:
{ lib, pkgs, ... }: {
virtualisation = {
waydroid.enable = true;
lxd.enable = true;
};
# LineageOS 18.1 系を動かす際には必須。ただし 17.1 系を動かす場合には削除が必要
environment.etc."gbinder.d/waydroid.conf".source = lib.mkForce
(pkgs.writeText "waydroid.conf" ''
[Protocol]
/dev/binder = aidl3
/dev/vndbinder = aidl3
/dev/hwbinder = hidl
[ServiceManager]
/dev/binder = aidl3
/dev/vndbinder = aidl3
/dev/hwbinder = hidl
[General]
ApiLevel = 30
'');
}
その他の細かいことは、
を見れば大体分かると思います。
注意点
上記に記載した nixpkgs の設定の内、
environment.etc."gbinder.d/waydroid.conf"
の中身については、LineageOS 18.1 系と LineageOS 17.1 系では設定を切り替える必要があります。
と言うのもどうも Lineage 18.1 系と Lineage 17.1 系では binderfs で利用する ABI が異なっているらしく、公式の設定ファイルの中身 では aidl2
を使う様に設定されていますが、 LineageOS 18.1 系では aidl3
が使われているため、aidl2
を使う設定のままだと LineageOS 18.1 がうまく起動しません。
また上記設定を切り替える際に lib.mkForce
を使っていますが、これは lib.mkForce
を使わないままだとデフォルトの設定が conflict を起こし nixos-rebuild
が失敗するため、 現時点(2022-11-06)では lib.mkForce
による設定は必須です。
以上
ちなみにこの Waydroid 、まだまだ発展途上で一部のアプリが起動すらしなかったり、amd64 環境で arm 系バイナリを動かす場合には hack が必要だったりと、色々手間暇掛けないと実用的な環境が揃う感じではありません。
とは言え色々と手間暇掛ければ Android アプリを Desktop 環境でも動かせる様になるので、そう言った意味ではチャンジしてみる価値はあるんじゃないかと思います。