Open17
スパコンでNixしたい

はじめに
背景として共同利用スパコンにおける制約を簡単に説明します。
- root権限がない
基本的にuser権限でやる必要があります。したがってsudo apt
とかはできませんのでsudoが前提のパッケージマネージャーは使えません。linuxbrewはワンチャンありそうですが、あんまり上手くいってないです。 - 利用できる計算資源やインターネット環境に強い制限がある
- ログインノードで重い処理を行ってはいけない
基本的にuserのシェルが走っているのはログインノードとか言われる場所で多数のuserプロセスが単一ノード上で走っている[1]ことが多いです。つまるところ重いビルドプロセスがずっと流れたり、たくさん流れたりすると他のuserの邪魔になるので、ログインノードで高負荷処理を行うことは非推奨になっているのが普通です。 - 計算ノードからインターネットに接続できない
スパコンで重いビルドを実行するにはどうするかというと、実際の数値シミュレーション等用に供される計算ノードとか言われるノードを用いて重いビルドを実行するということが多いと思います。計算ノードには普通インターネット接続がありません(少なくとも接続できるスパコンを見たことないです)。したがってtarball落としてきてインストールして...という通常のパッケージのインストールの流れを計算ノードで実行できません。
- ログインノードで重い処理を行ってはいけない
-
/home
領域がNFSなどの独自ファイルシステムへのシンボリックリンクになっている可能性がある
例として私が使っている共同利用スパコンではLustreが使用されており、/home
が/lustre/home
へのシンボリックリンクになっています。Nixのデフォルトではシンボリックリンクは扱えませんので工夫が必要になります。
まとめるとスパコンではそれ自身がsudoなしでインストール可能で、パッケージインストールにもsudoを要求せず、ソース・バイナリのダウンロードとビルドを分離して実行できるパッケージマネージャーが必要です。また、場合によってはシンボリックリンクであるパスを正しく取り扱う必要があります。
natsukiumさんに1から10まで教えてもらった内容のメモになっています.頭が上がらねぇ...
-
負荷分散のためログインノードが複数あるということもありますが ↩︎

スパコンで各userに割り当てられているディスク容量にも強い制約があるので,Nixを使うとバイナリサイズが肥大しがちなのは注意が必要かも.
gc関連のメモを後で作成するかもしれない.

non-rootにnixを入れる
そこでnix!となればいいですが,nixの入れ方でよく出てくるDeterminate Nix installerを使うとsudoを要求してきます[1].
大体ここに書いてあります.
あとでこの中の内容を展開するかも.
やらないといけないこととしては
- defaultだとuser権限で作成できない
/nix
を作成しようとするのでそれをuser書き込み可能領域に変更 - その下にあるbinaryとかの置き場所の
/path/to/nix/store
のpathを--store
optionでnix
実行時に渡す必要がある
という感じです.
-
Single-User installとかMulti-User installとかありますがどちらにせよsudo必要です ↩︎

/path/to/nix/conf/
のnix.conf
にstore = /path/to/nix/store
を書くこともできる

nix
に-j0
あるいは--max-jobs 0
optionを追加してbuild実行を抑制できる

nix
には--offline
optionがありfetchとbuildを分離可能(っぽい)

awesome-nix-hpc

nix-portableというのもあるらしい?

Nixの消し方
ここでは.nix
にNixをインストールしたとする
chmod -R u+w .nix
rm -r .nix

- NixOS wikiを読むと可能ならnix-user-chrootを使った方が良い、ダメならprootと書いてある
- nix-user-chroot、メンテが止まってるしバイナリはmuslしかないしsource buildはcargo必要で無理
- ↑の
.nix-wrapped
方式はnix run
まではいける、nix build
もビルドそのものはできてるけど/nix/store/~
がnot foundといってnix profile
できないのでroot関係な気がする - nix-user-chrootのREADMEがnix-portable使えば?と言っているので試してみる
- ↑の
- nix-portable、とりあえず動かない
-
./nix-portable nix-shell --help
->Fatal error: nix is unable to build packages
-


-
/
以外をrootとして設定したstoreはchroot storeと呼ばれる - chroot storeの場合も論理的には
/nix/store
がstore pathなので、chroot storeにあるプログラムはchroot経由でビルドと実行を行う必要がある - また、Linuxで、mount namespacesとuser namespacesを有効化する必要があるらしい。

symlink関係
マウントもrootが必要なので以下の方法も不可
mkdir /nix
mount -o bind /mnt/otherdisk/nix /nix