Guix Generation Persistence

I have been setting up a guix system. I have been trying to upgrade the system with sudo -E guix system reconfigure /home/me/system.scm.

This seems to work fine. It reports

activating system...
making '/var/guix/profiles/system-30-link' the current system... 

I run guix system describe and it shows that I’m on generation 30. I run ls -l /run/current-system and I see it points to /var/guix/profiles/system-30-link. I have new services running and I can see them in herd status.

However, if I reboot guix system describe shows Generation 30 but when I do ls -l /run/current-system it point to the same file that /var/guix/profiles/system-7-link does. The new services don’t show up in herd status.

The gnu.system in my main entry in /boot/grub/grub.cfg is the same file that my system-30-link points to.

I can’t figure out why my newest generation won’t boot.

At one point before all of this I did do system reconfigure as root. Would that have done it? How do you fix it?

Could you please try

guix system list-generations

This will list all your systems with the current one be the first. Then, you could try

guix system switch-generation 30

to see if you will switch.

Yeah guix system list-generations lists them as you say. I did the guix system switch-generation 30 command and can see:

building /gnu/store/w0qk3nl2ck5h67wxxds7cp94zzr6js3s-grub.cfg.drv… 
building /gnu/store/vd6nappx6xh7mxacbh87jprapmr4z68h-install-bootloader.scm.drv…
switched from generation 42 to 30

I can confirm that the files seem to point to the correct places like before but when I reboot, the system describe shows 30 but the current system is pointing to 7:

jesse@homelab ~$ sudo guix system describe
Password: 
Generation 30	Aug 12 2025 10:08:22	(current)
  file name: /var/guix/profiles/system-30-link
  canonical file name: /gnu/store/y5xbqa5dw7bikw848ghnc0bnp98z9adk-system
  label: GNU with Linux 6.15.6
  bootloader: grub-efi
  root device: label: "system-root"
  kernel: /gnu/store/fdmzii31wy5lxs80hyq9ji1pcyzc1k0h-linux-6.15.6/bzImage
  channels:
    guix:
      repository URL: https://git.savannah.gnu.org/git/guix.git
      branch: master
      commit: 784c15a35ecba44b51016df71156a3993de41500
    nonguix:
      repository URL: https://gitlab.com/nonguix/nonguix
      branch: master
      commit: aff3b005f46081cbd111da19e64f8ae07b5b464f
  configuration file: /gnu/store/jibrf5d0z97x3hngl76f6bpsrhc6476a-configuration.scm
jesse@homelab ~$ ls -la /run/current-system
lrwxrwxrwx 1 root root 50 Aug 14 08:52 /run/current-system -> /gnu/store/hkshsqddjpkpg0dr19kw1qz535g7ya0w-system
jesse@homelab ~$ ls -la /var/guix/profiles/system-7-link
lrwxrwxrwx 1 root root 50 Aug  7 07:11 /var/guix/profiles/system-7-link -> /gnu/store/hkshsqddjpkpg0dr19kw1qz535g7ya0w-system
jesse@homelab ~$ ls -la /var/guix/profiles/system-30-link
lrwxrwxrwx 1 root root 50 Aug 12 10:08 /var/guix/profiles/system-30-link -> /gnu/store/y5xbqa5dw7bikw848ghnc0bnp98z9adk-system

Some additional context:

I’m trying to get rootless podman going so I need to set ranges in subuid and subgid.
I do see this when I do sudo guix system reconfigure system.scm:

The following derivation will be built:
  /gnu/store/9pnd1m9k73ywkssk0yjcar7ndwqgy62q-grub.cfg.drv

building /gnu/store/9pnd1m9k73ywkssk0yjcar7ndwqgy62q-grub.cfg.drv...
#t/gnu/store/x10qlfwbi5wj22y4gbivcb9pqfhywr39-system
/gnu/store/84ppn40avs4b3xiwn4144mlm4v0z28hv-grub.cfg

activating system...
making '/var/guix/profiles/system-31-link' the current system...
populating /etc from /gnu/store/pfwv8lddz58xdncvq5b4xiqxiljai062-etc...
setting up privileged programs in '/run/privileged/bin'...
#<&subordinate-id-overflow-error range: #<<subid-range> name: "jesse" start: 100700 count: 65536>>
guix system: warning: failed to activate '/gnu/store/knnp8hms3pwakb00c2ql1dq4n39sjv67-activate-service.scm'
The following derivation will be built:
  /gnu/store/h7vsiwpywq957zj6fwi9dcj4vwm5aywa-install-bootloader.scm.drv

building /gnu/store/h7vsiwpywq957zj6fwi9dcj4vwm5aywa-install-bootloader.scm.drv...
guix system: bootloader successfully installed on '(/boot/efi)'

The failed to activate part seems particularly problematic.

I do have this section for setting up the subuid and subgids:

                     (simple-service 'homelab-subids
                                     subids-service-type
                                     (subids-extension
                                      (subgids
                                       (list
                                        (subid-range (name "jesse" ))))
                                      (subuids
                                       (list
                                        (subid-range (name "jesse" )
                                                     (start 100700))))))

This is pretty much lifted from the manual. It is in the “Subordinate User and Group ID Service” section at https://guix.gnu.org/manual/devel/en/html_node/Miscellaneous-Services.htm

I’ve tried a number of ways of setting this in the rootless-podman servce, in an extension of the etc-service, this, and even removing all subuid/subgid config all together. I still get this failed to activate message.

Thank you for the information. I see your frustration here. Is there any relation between generation 7 and generation 30?

Do you know if there is a way to diff the configs between the two?

You can try

diff <(guix system describe -f=sexp -G <generation1>) <(guix system describe -f=sexp -G <generation2>)

or

diff /var/guix/profiles/system-<gen1>-link/configuration.scm /var/guix/profiles/system-<gen2>-link/configuration.scm

Thanks for the snippets, I didn’t look to see what was in the system-<gen>-link directory. That is really cool. The second one worked there for diffing. The first one complained that -f was unrecognized.

My diffs look to be most of what I changed for the podman stuff.
Should I go back to generation 7 and then add a little in at a time? Or could I change what I currently have to be commented out to be functionally the same as 7 and change things from there generation by generation?

Sorry for the -f option. You can remove the -f=sexp.

Normally, your system reconfiguration should work.

Well I think I have it working. I’m not going to claim that I totally understand it.

So this is my first system install and I had a lot of trouble in the beginning because the HP Z440 does this really cool thing where it doesn’t persist efi entries. So I found that I had to have my boot partition laid out in the default place that the UEFI firmware looks. I have /dev/sda1 mounted to /boot and then I have /boot/EFI/BOOT/bootx64.efi.

I had a couple issues:

  • My bootloader field in my operation-system record was pointing to the wrong place.
  • I added this extra-special-files service:
		     (extra-special-file "boot/EFI/Boot/bootx64.efi"
					 "/boot/EFI/guix/grubx64.efi")

I’m not sure if that works or not, I think my biggest issue was the bootloader target misconfiguration.

Now after reboots, the generation persists and I can successfully write the subuid/subgid files.

Thanks for your help!

1 Like

Glad to know and congratulations.

you should not need to mark files in your /boot/EFI as an extra-special-file. it’s more likely that you’re getting your root profiles confused with your user’s profiles. your root user will have a separate set of system generation profiles. login via su - and see if it lists different generations for the system and /root profiles. occasionally, you’ll need to garbage collect these, as they share the same store, which will begin to inflate if the earlier profiles aren’t gc’d