NixのGC
一般的なプログラミング言語のGCと同じようにGCを行う
つまり、rootから辿ることができるものだけを残す
root
Nixのrootは/nix/var/nix/gcroots profiles dir
前のgenerationのものなど入っている
これからも分かるように、今使ってなくても、過去のgenerationが依存しているものはずっとstoreに残り続ける
消したいときは、$ nix-env --delete-generations <n>で世代を消すなどする
auto dir
個別にderivationをbuildした時(?)に作られるderivationなど #?? あんまりちゃんと理解していないmrsekut.icon
autoから辿れるということは、使用していなくてもgcで削除されないということになる
/nix/var/nix/gcroots/autoからそれを手で消す
するとrootから辿られなくなるのでgcで消える
Remove the result symlink
これ正確にどういう意味なのかわかっていないmrsekut.icon
resultというのはpillsの7とかで自分で作ったderivationのやつ
「result symlinkを消す」というのは、ここでは「/home/nix/内のresultを手動で消す」という意味だろうか
実際、nix-collect-grabageを実行したら消えたが、autoに入っているやつ全部が消えたので意味があったのかわからんmrsekut.icon
commands
$ nix-collect-garbage
/nix/var/nix/gcrootsから辿れないものを全て削除する
$ nix-store --gc
nix-collect-garbageとは何が違う #?? 誰も使っていないpackageを削除
/nix/store/trashとは
nix-collect-grabageの実行中に使用されるdir
消す対象をこのdirに放り込んでいき、最後にこのdirごと削除してるっぽい
だから通常時は、/nix/store/trashというdirは存在しない
nix-collect-garbageの実行の最後に表示されるlogはこんな感じ
code:log
...
deleting '/nix/store/qhx1k40l7zj4xki00d7cb4arpqwiqnca-js-flot-0.8.3-data'
deleting '/nix/store/3vli5kpdv500zbl4yafi4xz6b0r1vmcv-shake-0.19.6-data'
deleting '/nix/store/trash'
deleting unused links...
note: currently hard linking saves 0.00 MiB
3486 store paths deleted, 10356.19 MiB freed
今使ってなくても、過去のgenerationが依存しているものはずっとstoreに残り続ける
例えば古いversionのpackageとか
そういうものを全て消したいときは以下を実行する
ただし、前のgenerationに戻れなくなるので、今正常に動いていることを確認してからやったほうが良い
code:a
$ nix-channel --update
$ nix-env -u --always
$ rm /nix/var/nix/gcroots/auto/*
$ nix-collect-garbage -d
nix-shellみたいに環境から独立するものって毎回消されたりしないの
消されても入れ直せるから問題ないけど、時間の問題として気になるmrsekut.icon
ここを知るためには、GCの知識というよりか、nix-shellの方の知識が要りそうmrsekut.icon
参考