Open17

スパコンでNixしたい

ultimatileultimatile

はじめに

背景として共同利用スパコンにおける制約を簡単に説明します。

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

まとめるとスパコンではそれ自身がsudoなしでインストール可能で、パッケージインストールにもsudoを要求せず、ソース・バイナリのダウンロードとビルドを分離して実行できるパッケージマネージャーが必要です。また、場合によってはシンボリックリンクであるパスを正しく取り扱う必要があります。


natsukiumさんに1から10まで教えてもらった内容のメモになっています.頭が上がらねぇ...

脚注
  1. 負荷分散のためログインノードが複数あるということもありますが ↩︎

ultimatileultimatile

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

ultimatileultimatile

non-rootにnixを入れる

そこでnix!となればいいですが,nixの入れ方でよく出てくるDeterminate Nix installerを使うとsudoを要求してきます[1]

https://wiki.nixos.org/wiki/Nix_Installation_Guide#Installing_without_root_permissions

大体ここに書いてあります.
あとでこの中の内容を展開するかも.

やらないといけないこととしては

  • defaultだとuser権限で作成できない/nixを作成しようとするのでそれをuser書き込み可能領域に変更
  • その下にあるbinaryとかの置き場所の/path/to/nix/storeのpathを--store optionでnix実行時に渡す必要がある
    という感じです.
脚注
  1. Single-User installとかMulti-User installとかありますがどちらにせよsudo必要です ↩︎

ultimatileultimatile

Nixの消し方

ここでは.nixにNixをインストールしたとする

chmod -R u+w .nix
rm -r .nix
ultimatileultimatile
  • 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