mirror of
https://codeberg.org/privacy1st/nix-git
synced 2024-12-03 23:55:04 +01:00
fix: nix garbage collection
This commit is contained in:
parent
426decfc4e
commit
e19db18b71
59
NixOS.md
59
NixOS.md
@ -21,8 +21,8 @@ This document contains general notes about NixOS that are independent of my NixO
|
|||||||
* [Nix profiles](#nix-profiles)
|
* [Nix profiles](#nix-profiles)
|
||||||
* [Switch to previous system profile](#switch-to-previous-system-profile)
|
* [Switch to previous system profile](#switch-to-previous-system-profile)
|
||||||
* [List system profiles](#list-system-profiles)
|
* [List system profiles](#list-system-profiles)
|
||||||
* [Garbage collection - Keep most recent X system profiles](#garbage-collection---keep-most-recent-x-system-profiles)
|
* [Deleting generations - Keep most recent X system profiles](#deleting-generations---keep-most-recent-x-system-profiles)
|
||||||
* [Garbage collection - Delete system profiles older than X days](#garbage-collection---delete-system-profiles-older-than-x-days)
|
* [Garbage collection - Delete unreachable store objects](#garbage-collection---delete-unreachable-store-objects)
|
||||||
* [why-depends: Why is a package/dependency installed](#why-depends-why-is-a-packagedependency-installed)
|
* [why-depends: Why is a package/dependency installed](#why-depends-why-is-a-packagedependency-installed)
|
||||||
* [Compare two system profiles](#compare-two-system-profiles)
|
* [Compare two system profiles](#compare-two-system-profiles)
|
||||||
* [NixOS configuration debugging](#nixos-configuration-debugging)
|
* [NixOS configuration debugging](#nixos-configuration-debugging)
|
||||||
@ -448,33 +448,24 @@ sudo reboot
|
|||||||
|
|
||||||
### List system profiles
|
### List system profiles
|
||||||
|
|
||||||
Not sure why 432 is marked as current. It is the default generation that gets activated on next boot. The currently active generation is, however, 429.
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
|
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
|
||||||
```
|
```
|
||||||
```console
|
```console
|
||||||
...
|
...
|
||||||
428 2024-03-06 12:37:56
|
282 2024-11-10 12:53:25
|
||||||
429 2024-03-07 11:27:20
|
283 2024-11-11 10:45:46 (current)
|
||||||
430 2024-03-10 12:48:34
|
|
||||||
431 2024-03-11 11:18:57
|
|
||||||
432 2024-03-12 22:19:53 (current)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
ls -l /nix/var/nix/profiles/
|
ls -l /nix/var/nix/profiles/
|
||||||
```
|
```
|
||||||
```console
|
```console
|
||||||
lrwxrwxrwx 1 root root 43 Dez 14 12:21 default -> /nix/var/nix/profiles/per-user/root/profile
|
lrwxrwxrwx 1 root root 43 Dez 26 2023 default -> /nix/var/nix/profiles/per-user/root/profile
|
||||||
drwxr-xr-x 1 root root 16 Sep 1 2023 per-user
|
drwxr-xr-x 1 root root 16 Aug 15 2023 per-user
|
||||||
lrwxrwxrwx 1 root root 15 Mär 12 22:19 system -> system-432-link
|
lrwxrwxrwx 1 root root 15 Nov 11 10:45 system -> system-283-link
|
||||||
...
|
lrwxrwxrwx 1 root root 77 Nov 10 12:53 system-282-link -> /nix/store/jb5krdbbylwwgvxiadiv6fxja2zgc4h3-nixos-system-yodaTab-24.05pre-git
|
||||||
lrwxrwxrwx 1 root root 77 Mär 6 12:37 system-428-link -> /nix/store/damngdyial0i96xa46csdqk36j2njavi-nixos-system-yodaTux-23.11pre-git
|
lrwxrwxrwx 1 root root 77 Nov 11 10:45 system-283-link -> /nix/store/jf7ml8jzxrmg9djhfr8szq2f19hxysn5-nixos-system-yodaTab-24.05pre-git
|
||||||
lrwxrwxrwx 1 root root 77 Mär 7 11:27 system-429-link -> /nix/store/k7c7576sz868gzjci1z6l6nzmdnpd6xr-nixos-system-yodaTux-23.11pre-git
|
|
||||||
lrwxrwxrwx 1 root root 77 Mär 10 12:48 system-430-link -> /nix/store/7468m7rgk425kb23aq222a498ynfqdkc-nixos-system-yodaTux-23.11pre-git
|
|
||||||
lrwxrwxrwx 1 root root 77 Mär 11 11:18 system-431-link -> /nix/store/r51yw36ddfxq8hdsz2mm6axpbqvjaigy-nixos-system-yodaTux-23.11pre-git
|
|
||||||
lrwxrwxrwx 1 root root 77 Mär 12 22:19 system-432-link -> /nix/store/i9pxh3ax6m0yr7xlk7y7c5xdzp74xqi4-nixos-system-yodaTux-23.11pre-git
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The currently running system. This is the currently active generation. By comparing the store path with the above output, we see that it matches generation 429.
|
The currently running system. This is the currently active generation. By comparing the store path with the above output, we see that it matches generation 429.
|
||||||
@ -483,33 +474,45 @@ The currently running system. This is the currently active generation. By compar
|
|||||||
ls -l /run/current-system
|
ls -l /run/current-system
|
||||||
```
|
```
|
||||||
```console
|
```console
|
||||||
lrwxrwxrwx 1 root root 77 Mär 9 12:44 /run/current-system -> /nix/store/k7c7576sz868gzjci1z6l6nzmdnpd6xr-nixos-system-yodaTux-23.11pre-git
|
lrwxrwxrwx 1 root root 77 Nov 11 10:46 /run/current-system -> /nix/store/jf7ml8jzxrmg9djhfr8szq2f19hxysn5-nixos-system-yodaTab-24.05pre-git
|
||||||
```
|
```
|
||||||
|
|
||||||
### Garbage collection - Keep most recent X system profiles
|
### Deleting generations - Keep most recent X system profiles
|
||||||
|
|
||||||
A NixOS config example is given in [base.nix](modules/base.nix).
|
https://nix.dev/manual/nix/2.18/command-ref/nix-env/delete-generations
|
||||||
|
|
||||||
|
> Periodically deleting old generations is important to make garbage collection effective. The is because profiles are also garbage collection roots.
|
||||||
|
|
||||||
|
A NixOS config example is given in [nix-gc.nix](modules/nix-gc.nix).
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo nix-env --delete-generations +7 --profile /nix/var/nix/profiles/system
|
sudo nix-env --delete-generations +7 --profile /nix/var/nix/profiles/system
|
||||||
```
|
```
|
||||||
|
|
||||||
TODO: Should we run `sudo nix-collect-garbage --delete-old` after the above?
|
After deleting some generations, it is still necessary to collect garbage in order to free up your system. See below.
|
||||||
|
|
||||||
### Garbage collection - Delete system profiles older than X days
|
### Garbage collection - Delete unreachable store objects
|
||||||
|
|
||||||
|
https://nix.dev/manual/nix/2.18/command-ref/nix-collect-garbage
|
||||||
|
|
||||||
|
> `nix-collect-garbage` deletes all unreachable store objects in the Nix store to clean up your system.
|
||||||
|
|
||||||
* https://nixos.org/manual/nix/stable/package-management/garbage-collection.html
|
* https://nixos.org/manual/nix/stable/package-management/garbage-collection.html
|
||||||
* https://discourse.nixos.org/t/why-doesnt-nix-collect-garbage-remove-old-generations-from-efi-menu/17592/4
|
* https://discourse.nixos.org/t/why-doesnt-nix-collect-garbage-remove-old-generations-from-efi-menu/17592/4
|
||||||
|
|
||||||
A NixOS config example is given in [base.nix](modules/base.nix).
|
First delete unreachable store objects:
|
||||||
|
|
||||||
Run manually for all profiles:
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo nix-collect-garbage --delete-older-than 14d
|
# Delete unreachable store objects
|
||||||
|
sudo nix-collect-garbage
|
||||||
|
|
||||||
|
# Deletes all except the currently active generation prior to deleting unreachable store objects
|
||||||
|
#sudo nix-collect-garbage --delete-old
|
||||||
|
# Deletes all generations older than 14d prior to deleting unreachable store objects
|
||||||
|
#sudo nix-collect-garbage --delete-older-than 14d
|
||||||
```
|
```
|
||||||
|
|
||||||
Remove leftover EFI entries of removed generations:
|
Then remove leftover EFI entries of deleted generations:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo /run/current-system/bin/switch-to-configuration boot
|
sudo /run/current-system/bin/switch-to-configuration boot
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
{
|
{
|
||||||
# Keep only the 7 most recent system generations.
|
# Delete all system generations except the 7 most recent ones.
|
||||||
|
# Then delete all unreachable store objects.
|
||||||
#
|
#
|
||||||
# Based on https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/misc/nix-gc.nix
|
# Based on https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/misc/nix-gc.nix
|
||||||
#
|
|
||||||
# Alternatively: Delete generations older than 7 days
|
# Alternative: Delete generations older than 7 days and then delete unreachable store objects
|
||||||
# https://nixos.wiki/wiki/Storage_optimization#Automation
|
# https://nixos.wiki/wiki/Storage_optimization#Automation
|
||||||
#nix.gc = {
|
#nix.gc = {
|
||||||
# automatic = true;
|
# automatic = true;
|
||||||
@ -29,8 +30,10 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# View generated systemd service config with:
|
||||||
|
# cat "$(systemctl show -P FragmentPath nix-gc-7.service)" | grep ExecStart
|
||||||
systemd.services."nix-gc-7" = {
|
systemd.services."nix-gc-7" = {
|
||||||
description = "Keep only the most recent 7 system generations";
|
description = "rm old system generations and unreachable store objects";
|
||||||
|
|
||||||
conflicts = [ "shutdown.target" "sleep.target" ];
|
conflicts = [ "shutdown.target" "sleep.target" ];
|
||||||
before = [ "shutdown.target" "sleep.target" ];
|
before = [ "shutdown.target" "sleep.target" ];
|
||||||
@ -45,6 +48,7 @@
|
|||||||
|
|
||||||
script = ''
|
script = ''
|
||||||
${config.nix.package.out}/bin/nix-env --delete-generations +7 --profile /nix/var/nix/profiles/system
|
${config.nix.package.out}/bin/nix-env --delete-generations +7 --profile /nix/var/nix/profiles/system
|
||||||
|
${config.nix.package.out}/bin/nix-collect-garbage
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user