🔁
NixOS で /boot/efi がいっぱいになったときの対処
発生したエラー
nixos-rebuild
したら以下のようなエラーが発生した。
OSError: [Errno 28] No space left on device: '/nix/store/xxxxxxxxxxxxxxxxxx-initrd-linux-x.xx.xx/initrd' -> '/boot/EFI/nixos/xxxxxxxxxxxxxxxxxx-initrd-linux-x.xx.xx-initrd.efi'
Failed to install bootloader
/bootのディスクが不足してbootloaderのinstalに失敗してしまっている。
/boot配下のいらなそうなファイルを消してもエラーになってしまう。
解決策
system プロファイルの古い世代を削除したら解決する。
10世代より古いのを削除する場合の例
sudo nix-env --delete-generations +10 -p /nix/var/nix/profiles/system
解決の記録のメモ
おそらくだが、古い世代でインストールしているlinux kernel分ブートローダーに書き込むためディスクが足りなくて失敗してしまう。残っている古い世代を削除すれば解決するだろうといろいろ調べた結果、仮説立てた。
しかし、nix-env --delete-generations
などをしても解決しない。
nixos-rebuild --list-generations
とnix-env --list-generations
を比較した結果、別々のprofileを使っている事に気がついた。/nix/var/nix/profiles/
を確認したところ nixos-rebuildが使うprofileはsystemだということがわかった。
そこで古い世代を削除してみたところ問題が解決した。
参考文献など
調べている過程で、「やはり消してみるよね」と思えて気が楽になった。
Discussion
nixosの再現性が維持できないのでできれば、nix-envを実行せずにconfigure.nixに最新の5世代だけ残す。とか、削除スクリプトを作ってnixos-rebuild毎に実行できるといいですね。
世代分だけ残す。nixファイルの例