Boot issue GRUB when transitioning into initrd initramfs.img -> error: start_image() returned 0x8000000000000001

Hi.

Context:
System worked, I did some configuring with btrfs-Zygo/bees over night on new system and maybe something else. Deleted all my Timeshift snapshots to speed up the initial bees. I also have grub-btrfs working (but no snapshots currently because I deleted them). System was not rebooted since and today rebooted the system and it doesn’t boot anymore.

System context:
Whole SSD with 1G vfat EFI partition and another LUKS-BTRFS partition by default Calamares installation.
GRUB2, Grub-btrfs, LUKS btrfs, Timeshift, bees, NVMe, GPT table, AMD5950X+nVidia3090

Runned Yay yesterday.

The only change I did in GRUB conf manually is set menu timeout style to hidden type (so GRUB menu show up only if I’m hold Shift while booting, to appear) and uncommented BEEP sound to GRUB. And removed insmod part_mdos (because I dont have MBR anywhere anymore).

Problem:
When booting when any GRUB entry selected to boot into any linux kernel this TTY text shown:

Loading Linux linux-zen ...
Loading initial ramdisk ...
error: start_image() returned 0x8000000000000001.
  
  Failed to boot both default and fallback entries.

Press any key to continue...

Pressing any key gets back to GRUB menu. Pressing entry again leads to same message and system halt.

Sometimes (randomly, reason not pinpointed) doing the same steps instead of TTY text above, the text says:

Loading Linux linux-zen ...
Loading initial ramdisk ...
error: you need to load the kernel first.

Progress:

https://discovery.endeavouros.com/system-rescue/arch-chroot/2022/12/

Used DVD live boot and correctly mounted the SSD and used arch-chroot in the Konsole. Opened /boot and found all the initramfs.img files where I expected. Really unsure why are this happening.

Maybe bees deduplication has to do something with this? But it works in block level, it shouldn’t be possible.

/boot/grub/grub.cfg content for first menu entry:

menuentry 'EndeavourOS Linux' --class endeavouros --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-00000000-0000-0000-0000-000000000000' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod cryptodisk
        insmod luks
        insmod gcry_rijndael
        insmod gcry_rijndael
        insmod gcry_sha256
        insmod btrfs
        cryptomount -u 00000000-0000-0000-0000-000000000000
        set root='cryptouuid/00000000-0000-0000-0000-000000000000'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint='cryptouuid/00000000000000000000000000000000'  00000000-0000-0000-0000-000000000000
        else
          search --no-floppy --fs-uuid --set=root 00000000-0000-0000-0000-000000000000
        fi
        echo    'Loading Linux linux-zen ...'
        linux   /@/boot/vmlinuz-linux-zen root=UUID=00000000-0000-0000-0000-000000000000 rw rootflags=subvol=@  nowatchdog nvme_load=YES rd.luks.uuid=00000000-0000-0000-0000-000000000000 nvidia-drm.modeset=1 loglevel=3
        echo    'Loading initial ramdisk ...'
        initrd  /@/boot/amd-ucode.img /@/boot/initramfs-linux-zen.img
}

Are the problem with GRUB or initial kernel filesystem image ?

Looking for solution as for now. Will update the post.

Seems very relatable issue:
https://www.reddit.com/r/archlinux/comments/1awkk67/fail_to_boot_after_update/?rdt=62674

Partial solution:

Tried this:

replaced in /boot/grub/grub.cfg file first menuentry line:

initrd  /@/boot/amd-ucode.img /@/boot/initramfs-linux-zen.img

to:

###  initrd  /@/boot/amd-ucode.img /@/boot/initramfs-linux-zen.img
        initrd  /@/boot/initramfs-linux-zen.img

and tried to boot. It was succesfull. So the problem are something with

/@/boot/amd-ucode.img

To edit GRUB menu entry /boot/grub/grub.cfg temporarily (without recovery USB and arch-chroot), you can press E key while in GRUB menu and then press F10 to boot the edit this one time.


amd-ucode version:

# pacman -Q amd-ucode
amd-ucode 20240409.1addd7dc-1

Tried reinstalling amd-ucode didnt work.


Added separate grub menuentry to run without amd-ucode. Works everytime.
With amd-ucode doesnt work every time.


Even through amd-ucode are nice to have, but sadly had to remove it for now:

sudo pacman -R amd-ucode # Removes amd-ucode package
sudo grub-mkconfig -o /boot/grub/grub.cfg # Updates GRUB entries

Then reboot and have working system.

If someone knows how to get better solution and amd-ucode working again, please do here. I will mark solution as yours.

In that thread you linked, the problem turned out to be the AMD microcode was getting double-loaded. It was bundled into the image by dracut, and then Grub was also loading it a second time which was causing the issue.

You can prevent Grub from doing this by setting this option in /etc/default/grub:

GRUB_EARLY_INITRD_LINUX_STOCK=''

This reliably resolved the issue in testing, and ended up being the solution which was pushed to the new ISO in the thread you linked above: https://gitlab.com/garuda-linux/tools/garuda-tools/-/commit/ff149a752c19fd1862f1764ee76928334e7974ca

1 Like

How can I check/see if dracut has added amd-ucode content bundled already into image?

Are there any programmed way to check into the image file to see it there?


Does Dracut logs show indications when it bundles amd-ucode into initramfs image? [Edited here to answer]

# pacman -S amd-ucode
...
...
...
:: Building fallback initramfs for linux-zen (6.8.7-zen1-1-zen)
dracut[I]: Executing: /usr/bin/dracut --force --no-hostonly /boot/initramfs-linux-zen-fallback.img 6.8.7-zen1-1-zen
dracut[I]: memstrack is not available
dracut[I]: If you need to use rd.memdebug>=4, please install memstrack and procps-ng
dracut[I]: *** Including module: systemd ***
...
...
...
dracut[I]: *** Generating early-microcode cpio image ***
dracut[I]: *** Constructing AuthenticAMD.bin ***
...
...
...
(3/3) Refreshing PackageKit...

If it is installed, dracut will add it for you automatically.

Unless you have enabled the “quiet” initramfs generation by setting the flag in /etc/eos-dracut.conf, it should announce it is adding the microcode when you build the images.

Another way to check is to use lsinitcpio to see if the microcode is in the image, for example something like this might work:

sudo lsinitcpio /boot/initramfs-linux.img | grep code

Change the path to the image for whatever image you would like to check.

1 Like

But lsinitcpio tool is in mkinitcpio package. Which is rival to dracut. Is it safe to have both packages installed at the same time?

1 Like

you tried sudo dracut-rebuild , before ?

but dont mix mkinitcpio and dracut :slight_smile: then is hard to help

2 Likes

Oops, you are right about that! My mistake. :face_with_hand_over_mouth:

I would not risk it because it is easy to accidentally introduce a conflict this way. Perhaps there is a dracut equivalent for this tool, or another way to examine the image contents.

For getting info about images built by dracut, I believe you could use lsinitrd.

2 Likes

Very nice!

# lsinitrd -m /boot/initramfs-linux.img

Image: /boot/initramfs-linux.img: 101M
========================================================================
Early CPIO image
========================================================================
drwxr-xr-x   1 root     root            0 Apr 22 21:07 .
-rw-r--r--   1 root     root            2 Apr 22 21:07 early_cpio
drwxr-xr-x   1 root     root            0 Apr 22 21:07 kernel
drwxr-xr-x   1 root     root            0 Apr 22 21:07 kernel/x86
drwxr-xr-x   1 root     root            0 Apr 22 21:07 kernel/x86/microcode
-rw-r--r--   1 root     root        39172 Apr 22 21:07 kernel/x86/microcode/AuthenticAMD.bin
========================================================================
Version: dracut-101

dracut modules:
systemd
systemd-initrd
i18n
btrfs
crypt
dm
kernel-modules
kernel-modules-extra
btrfs-snapshot-overlay
rootfs-block
terminfo
udev-rules
dracut-systemd
usrmount
base
fs-lib
shutdown
========================================================================

Lines containing kernel/x86/microcode and kernel/x86/microcode/AuthenticAMD.bin clearly indicate that, now. Thanks!

Thinking probably best universal solution once and for all, would be improving existing /etc/grub.d/10_linux script so it could checks if microcode is already inside target initramfs.img while generating grub entries.

2 Likes

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.