Open11

Nix関係の個人的QA集

kuukuu

NixやNixOSについて躓いて解決したポイントや気になって調べたこと、コミュニティで尋ねて解決して頂いたことなどをQA形式で記述しておく。

P.S. 改めて書き出したら結構な割合natsukiumさんに答えてもらってる気がするので感謝

kuukuu

Q. インストール済んだけど何をしたらいい?
A. configuration.nix(NixOSの場合)を書き換えたりnix shellやnix profileを叩くなどして適当にnixpkgsからパッケージを引っ張ってくるだけでも十分便利だと思う。
色々やりたくなったらこのへん読みながら適当にいじるといいと思う。
https://zenn.dev/asa1984/books/nix-introduction
https://zenn.dev/asa1984/books/nix-hands-on
https://zenn.dev/natsukium/scraps/d260e091cb8fdc

kuukuu

Q. インストール後の環境で無線ネットワークを使っても繋がらない。インストール時と同じことをしようとすると失敗する
A. 折角NixOS使ってんならNix wayでやれ、宣言的に書けるぞ。やり方はドキュメントに全部載っている。
具体的にはこう

networking.wireless.networks = {
  "にゃおん" = {
    psk = "nyancat_nixisthebest";
  };
};
kuukuu

Q. Wi-Fiのパスワードを直書きしたら設定を公開できないんだけど
A. network.wireless.secretsFile にパスを書いて以下のようにする
これはコミットしなくていいので分離できる。

configuration.nix:

networking.wireless.secretsFile = "/path/to/wireless.conf";
networking.wireless.networks = {
  "にゃおん" = {
    pskRaw = "ext:psk_nyaon";
  };
};

wireless.conf:

psk_nyaon=nyancat_nixisthebest
kuukuu

Q. Flakeの依存はバージョン指定をしないけど、どのタイミングで固定されるの?
A. 最初に依存が解決された時の最新に固定され、flake.lockに書き込まれる。
更新したくなったら nix flake update で更新できる。

kuukuu

Q. /tmpがtmpfsじゃないので吹き飛ばないんだけど
A. boot.tmp.useTmpfs = true; をどこかに書くとtmpfsになる

kuukuu

Q. Live Mediaみたく電源を切ると状態が吹き飛ぶようにしたい
A. NixOSは /nix があれば立ち上がるので / をtmpfsにしてしまえばいい。後はブートローダーの書き込み用に /boot もどこかに置けばいい。
やり方はimpermanenceの例に載っている。
注意点としては、パスワードを設定しても吹き飛ぶので users.users.{user}.hashedPasswordmkpasswd の結果を書き込む必要がある。

kuukuu

Q. tmpfs rootをやると nix flake update の度に毎回ダウンロードが走る
A. この手のfetchのcacheは ($(NIX|XDG)_CACHE_HOME|~/.cache)/nix で管理されているので、どうにかして永続化してやればおk。
環境変数いじるのが多分一番早い。

kuukuu

Q. リモートビルドではなく別マシンで完全にnixos-rebuildをやりたい
A. nixos-rebuild buildの結果をnix copyしてresult/bin/switch-to-configurationを叩くといい。nixos-rebuildは実は中でこれをやっているだけ

Q. nixos-rebuild build-vmしたVM内でこれやると壊れるんだが
A. VM用に書き換えられた部分を剥がそうとするのでおかしくなる。なのでnixos-rebuild build-vmの結果をnix copyすると便利。ご丁寧にresult/systemにリンク貼ってくれているのでこれを転送するだけ

kuukuu

Q. staticビルドをしたい
A. できる。genericに実装されているのでできないパッケージもある。

nixpkgsの参照が pkgs だとすると pkgs.pkgsStatic に切り替えると、staticビルドされるようになる。
定義はこれ