🔁

NixOS で /boot/efi がいっぱいになったときの対処

2025/03/01に公開1

発生したエラー

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-generationsnix-env --list-generationsを比較した結果、別々のprofileを使っている事に気がついた。/nix/var/nix/profiles/ を確認したところ nixos-rebuildが使うprofileはsystemだということがわかった。

そこで古い世代を削除してみたところ問題が解決した。

参考文献など

調べている過程で、「やはり消してみるよね」と思えて気が楽になった。
https://qiita.com/kino-ma/items/ce98fc6a093132465935

Discussion

tositadatositada

nixosの再現性が維持できないのでできれば、nix-envを実行せずにconfigure.nixに最新の5世代だけ残す。とか、削除スクリプトを作ってnixos-rebuild毎に実行できるといいですね。

世代分だけ残す。nixファイルの例

boot.loader.systemd-boot.configurationLimit = 5;
boot.loader.grub.configurationLimit=5