萌えハッカーニュースリーダー

2025/10/31 14:28 Nix Derivation Madness

出典: https://fzakaria.com/2025/10/29/nix-derivation-madness
hakase
博士

ロボ子、大変なのじゃ! Nixパッケージシステムで奇妙な問題が発生しているみたいだぞ。

roboko
ロボ子

博士、一体何が起こっているんですか?

hakase
博士

Rubyインタープリターのビルドで問題が起きてるみたいでな。`nix-shell ruby`ではRubyが使えるのに、対応するderivationファイルが見つからないんだぞ!

roboko
ロボ子

それは奇妙ですね。NixOSキャッシュにもderivationファイルがないとは…。

hakase
博士

そうなんじゃ。通常、derivationを評価して出力パスを決めるはずなのに、NixOSキャッシュに存在しない理由が不明らしい。

roboko
ロボ子

データベースを確認したところ、問題のRubyバイナリを生成したderivationは`/nix/store/24v9wpp393ib1gllip7ic13aycbi704g-ruby-3.3.9.drv`とのことです。

hakase
博士

ふむ、バイナリキャッシュも同じderivationを示しているのか。しかし、`nix derivation show which ruby`コマンドでは別のderivation `/nix/store/kmx8kkggm5i2r17s6l67v022jz9gc4c5-ruby-3.3.9.drv` が同じ出力になっているとは…。

roboko
ロボ子

これはfixed-output derivations(FOD)に関連する問題のようですね。

hakase
博士

そう! FODでは、derivationの内容以外の変更が出力パスに影響しないのじゃ。つまり、FODを使用するderivationでは、FODのderivationパスが変わると、出力の`/nix/store`パスも変わる。

roboko
ロボ子

FODにgarbage属性を追加してderivationパスを変更しても、出力パスは変わらないというのは、どういうことでしょうか?

hakase
博士

そこがミソなのじゃ! fixed-output derivationsの変更により、新しいderivationストアパスが生じる可能性があるが、依存するderivationの出力パスは同じになる場合がある。Nixpkgsでは、fixed-output derivationsの変更が新しい.drvファイルを作成するが、出力パスがNixOSキャッシュに保存されている場合、新しい.drvと出力パスのリンクが失われるのじゃ。

roboko
ロボ子

なるほど。複数のfixed-output derivationsを入力として持つderivationでは、同じ出力を生成する場合、入力を削除しても同じ出力が得られる場合がある、と。

hakase
博士

その通り! まさにパラドックスじゃな。まるで、魔法みたいだぞ!

roboko
ロボ子

しかし、これはNixのキャッシュシステムに深刻な問題を引き起こす可能性がありますね。

hakase
博士

そうじゃな。この問題を解決するには、fixed-output derivationsの扱いを根本的に見直す必要がありそうじゃ。

roboko
ロボ子

博士、何か良い解決策はありますか?

hakase
博士

うむ、例えば、derivationのハッシュ値を計算する際に、入力だけでなく、derivationパスも考慮に入れるようにするとか…色々考えられるのじゃ。でも、それはまた別の機会に話すとするかの。

roboko
ロボ子

承知いたしました。勉強になります。

hakase
博士

しかし、ロボ子よ。この問題、まるでシュレーディンガーの猫みたいじゃな。derivationが存在するのか、存在しないのか、実際に試してみるまで分からない…ってか?

roboko
ロボ子

博士、それは少し違うと思います…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search