Emergency Mode "Failed to mount /efi" during boot (systemd-boot + Btrfs + NVMe)

Present Situation: I updated my system today (December 18). I didn’t check for errors during the update process and simply rebooted when KDE notified me that a restart was recommended. After rebooting, my EndeavourOS system now boots directly into Emergency Mode.

Debugging the problem: Systemd fails to mount EFI partition (/efi) during boot (Exit Code 32). Because this mount fails, the local-fs.target dependency also fails.

The Kernel is loading (proving the bootloader works), and the Root filesystem (nvme0n1p4) is healthy and accessible. The issue is strictly a mounting configuration error for the EFI partition.

I am currently in LIVE ISO that I downloaded on Dec 8

some system logs from eos tool: https://0x0.st/Prhn.txt

  • Root Drive: /dev/nvme0n1p4 (Btrfs, UUID starts 6cab...)

  • EFI Partition:/dev/nvme0n1p5 (FAT32, UUID 1448-DD78)

  • Bootloader: systemd-boot

  • Kernel: 6.18.1-arch1-2

What I Have Done So Far:

  1. Fixed Mounts: Manually mounted Root (/mnt) and EFI (/mnt/efi) correctly in the Live ISO.

  2. Restored Files: Created the missing kernel directory (.../6.18.1-arch1-2/) on the EFI partition and manually copied vmlinuz-linux and initramfs-linux.img there.

  3. Updated Boot Config: Created a new loader entry (endeavouros-6.18.conf) pointing to these new files.

  4. Checked fstab: Verified the fstab file has the correct UUID (1448-DD78) for /efi.

Even though the files are correct, the system still “panics” when trying to mount /efi at boot. This is likely due to a “dirty bit” on the FAT32 filesystem (common after crashes) or a strict mount option that halts the boot process on failure.

Not sure what to do now. I really need to get into my system safe and sound.

Background: I dual-boot Windows and EndeavourOS. On December 4, my laptop stopped charging; I had it repaired, and the issue was traced to the motherboard and the charger. Following the repair, EndeavourOS failed to boot. It was a database lock issue and what not that I don’t remember exactly, I think I managed to fix it using arch-chroot among many other things, after which everything worked correctly. I think I also performed a system update on December 8, which caused no issues.

This seems awfully strange. This is not the right thing to do. Where did you copy the kernel and initrd from?

Can you share the output of pacman -Q | grep -E "dracut|mkinit" from the arch-chroot?

Hi Dalto, thanks for replying. The EFI part contains the old kernel folder (6.17.9) but is missing the new kernel folder (6.18.1). The systemd-boot loader configuration for the new kernel is also missing.

So I created the folder, copy the files, and add the boot entry.

I copied them manually from /boot/vmlinuz-linux and /boot/initramfs-linux.img (inside the chroot) to the EFI partition. I did this because the automation wasn’t working and I was trying to manually match the systemd-boot entry I saw in the logs.

I also had to compress the boot file because it was too large and I was constantly getting not enough space error message.

[root@EndeavourOS /]# pacman -Q | grep -E "dracut|mkinit"
dracut 109_eos-1
mkinitcpio 40-2
mkinitcpio-busybox 1.36.1-1

These shouldn’t exist. That is a problem. Something is very wrong here.

What do you mean? What boot file and how did you compress it?

[root@EndeavourOS /]# pacman -Q | grep -E "dracut|mkinit"
dracut 109_eos-1
mkinitcpio 40-2
mkinitcpio-busybox 1.36.1-1

Is this from within the chroot? If so, this is the problem. It looks like you installed mkinitcpio and removed kernel-install-for-dracut. That will absolutely break your boot process.

I would delete all the directory and files you copied. Delete the entry conf you created. Delete any old files in /efi tied to old kernels,

Then run pacman -R mkinitcpio-busybox mkinitcpio, pacman -S kernel-install-for-dracut and finally reinstall-kernels

Yes, I went with mkinitcpio

/etc/mkinitcpio.conf

# vim:set ft=sh
# MODULES
# The following modules are loaded before any boot hooks are
# run.  Advanced users may wish to specify all system modules
# in this array.  For instance:
#     MODULES=(piix ide_disk reiserfs)
MODULES=(vmd)

# BINARIES
# This setting includes any additional binaries a given user may
# wish into the CPIO image.  This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
BINARIES=()

# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way.  This is useful for config files.
FILES=()

# HOOKS
# This is the most important setting in this file.  The HOOKS control the
# modules and scripts added to the image, and what happens at boot time.
# Order is important, and it is recommended that you do not change the
# order in which HOOKS are added.  Run 'mkinitcpio -H <hook name>' for
# help on a given hook.
# 'base' is _required_ unless you know precisely what you are doing.
# 'udev' is _required_ in order to automatically load modules
# 'filesystems' is _required_ unless you specify your fs modules in MODULES
# Examples:
##   This setup specifies all modules in the MODULES setting above.
##   No raid, lvm2, or encrypted root is needed.
#    HOOKS=(base)
#
##   This setup will autodetect all modules for your system and should
##   work as a sane default
#    HOOKS=(base udev autodetect block filesystems)
#
##   This setup will generate a 'full' image which supports most systems.
##   No autodetection is done.
#    HOOKS=(base udev block filesystems)
#
##   This setup assembles a pata mdadm array with an encrypted root FS.
##   Note: See 'mkinitcpio -H mdadm' for more information on raid devices.
#    HOOKS=(base udev block mdadm encrypt filesystems)
#
##   This setup loads an lvm2 volume group on a usb device.
#    HOOKS=(base udev block lvm2 filesystems)
#
##   NOTE: If you have /usr on a separate partition, you MUST include the
#    usr, fsck and shutdown hooks.
HOOKS=(base udev modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard)

# COMPRESSION
# Use this to compress the initramfs image. By default, gzip compression
# is used. Use 'cat' to create an uncompressed image.
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
#COMPRESSION="lzma"
#COMPRESSION="xz"
#COMPRESSION="lzop"
#COMPRESSION="lz4"
COMPRESSION="zstd"

# COMPRESSION_OPTIONS
# Additional options for the compressor
#COMPRESSION_OPTIONS=()

I think I also did something in /efi/loader/entries/endeavouros-6.18.conf that I don’t know how to see now. Also don’t remember about compression. Can’t look back into history as ISO is started from scratch.

I had touched a lot of things. Sorry, I didn’t know any better. I should have asked help earlier itself.

I am now going to implement your suggestions but I think it is very likely that I will again see the emergency mode screen.

[liveuser@eos-2025.11.24 ~]$ sudo mount -o subvol=@ /dev/nvme0n1p4 /mnt
[liveuser@eos-2025.11.24 ~]$ sudo mount /dev/nvme0n1p5 /mnt/efi
[liveuser@eos-2025.11.24 ~]$ sudo arch-chroot /mnt
[root@EndeavourOS /]# rm /efi/loader/entries/endeavouros-6.18.conf
[root@EndeavourOS /]# rm -rf /efi/d95a4396b9a144b981ff0d6325920b9f


[root@EndeavourOS /]# pacman -R mkinitcpio-busybox mkinitcpio
checking dependencies...

Package (2)         Old Version  Net Change

mkinitcpio          40-2          -0.21 MiB
mkinitcpio-busybox  1.36.1-1      -0.51 MiB

Total Removed Size:  0.72 MiB

:: Do you want to remove these packages? [Y/n] 
:: Running pre-transaction hooks...
(1/2) Performing snapper pre snapshots for the following configurations...
Thu 18 Dec 2025 09:38:55 PM IST <3> Snapshot.cc(initialize):429 reading failed
IO error (open failed path://.snapshots errno:2 (No such file or directory)).
==> root: 
(2/2) Removing linux initcpios...
:: Processing package changes...
(1/2) removing mkinitcpio                                                                                                                     [---------------------------------------------------------------------------------------] 100%
warning: /etc/mkinitcpio.conf saved as /etc/mkinitcpio.conf.pacsave
(2/2) removing mkinitcpio-busybox                                                                                                             [---------------------------------------------------------------------------------------] 100%
:: Running post-transaction hooks...
(1/3) Reloading system manager configuration...
  Skipped: Running in chroot.
(2/3) Arming ConditionNeedsUpdate...
(3/3) Performing snapper post snapshots for the following configurations...
fatal library error, lookup self
Thu 18 Dec 2025 09:38:58 PM IST <3> Snapshot.cc(initialize):429 reading failed
Invalid snapshot '--type'.
==> root: 


[root@EndeavourOS /]# pacman -S kernel-install-for-dracut
resolving dependencies...
looking for conflicting packages...

Package (1)                            New Version  Net Change  Download Size

endeavouros/kernel-install-for-dracut  1.13-1         0.02 MiB       0.02 MiB

Total Download Size:   0.02 MiB
Total Installed Size:  0.02 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 kernel-install-for-dracut-1.13-1-any                                                                              20.0 KiB   263 KiB/s 00:00 [---------------------------------------------------------------------------------------] 100%
(1/1) checking keys in keyring                                                                                                                [---------------------------------------------------------------------------------------] 100%
(1/1) checking package integrity                                                                                                              [---------------------------------------------------------------------------------------] 100%
(1/1) loading package files                                                                                                                   [---------------------------------------------------------------------------------------] 100%
(1/1) checking for file conflicts                                                                                                             [---------------------------------------------------------------------------------------] 100%
(1/1) checking available disk space                                                                                                           [---------------------------------------------------------------------------------------] 100%
:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
Thu 18 Dec 2025 09:39:02 PM IST <3> Snapshot.cc(initialize):429 reading failed
IO error (open failed path://.snapshots errno:2 (No such file or directory)).
==> root: 
:: Processing package changes...
(1/1) installing kernel-install-for-dracut                                                                                                    [---------------------------------------------------------------------------------------] 100%
:: Running post-transaction hooks...
(1/2) Arming ConditionNeedsUpdate...
(2/2) Performing snapper post snapshots for the following configurations...
Thu 18 Dec 2025 09:39:03 PM IST <3> Snapshot.cc(initialize):429 reading failed
Invalid snapshot '--type'.
==> root: 


[root@EndeavourOS /]# reinstall-kernels
Installing kernel 6.18.1-arch1-2


[root@EndeavourOS /]# exit
exit
[liveuser@eos-2025.11.24 ~]$ umount -R /mnt
umount: /mnt/efi: must be superuser to unmount.
[liveuser@eos-2025.11.24 ~]$ sudo su
[root@EndeavourOS liveuser]# umount -R /mnt
[root@EndeavourOS liveuser]# 

Will edit the following message if it worked out:

Succeeded: Yes. Thanks a lot @dalto. I hope this was a permanent fix and I won’t have to go through this again after an update.

1 Like

It should be permanent as long as you don’t install mkinitcpio again. That is what caused this issue.

You most recent update is probably the first time a kernel was updated since you installed that.

1 Like

Okay!

1 Like

Hey @dalto
Please look at this

I just ran my regular update script and got the following:

:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
IO Error (open failed path://.snapshots errno:2 (No such file or directory)).
==> NOTE: Custom flags should be put directly in: ~/.config/code-flags.conf
:: Running post-transaction hooks...
(1/6) Arming ConditionNeedsUpdate...
(2/6) Updating the MIME type database...
(3/6) Updating icon theme caches...
(4/6) Checking which packages need to be rebuilt
(5/6) Updating the desktop file MIME type cache...
(6/6) Performing snapper post snapshots for the following configurations...
Invalid snapshot '--type'.
==> root: 
Clearing pacman cache
du: cannot read directory '/var/cache/pacman/pkg/download-PjSfzt': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-IHZkl7': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-1eoECw': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-a7pCsE': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-4CIiC3': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-TF4iaR': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-ZgDts9': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-A9gWfG': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-2SgUdl': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-LG1e9A': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-IlZaK1': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-6bvV7a': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-3Lbklv': Permission denied
==> no candidate packages found for pruning
Pacman cache deleted: 13G	/var/cache/pacman/pkg/
Aur cache deleted: 295M	/home/neo/.cache/paru/clone

Can we see the update script?

paru -Syu

echo "Clearing pacman cache"
pacman_cache_space_used="$(du -sh /var/cache/pacman/pkg/)"
paccache -r
echo "Pacman cache deleted: $pacman_cache_space_used"

AUR_CACHE_DIR=$HOME/.cache/paru/clone
aur_cache_space_used="$(du -sh $HOME/.cache/paru/clone)"

# Get all cache directories for AUR helper
AUR_CACHE_REMOVED="$(find "$AUR_CACHE_DIR" -maxdepth 1 -type d | awk '{ print "-c " $1 }' | tail -n +2)"
# Remove everything for uninstalled AUR packages
AUR_REMOVED=$(/usr/bin/paccache -ruvk0 $AUR_CACHE_REMOVED | sed '/\.cache/!d' | cut -d \' -f2 | rev | cut -d / -f2- | rev)
[ -z "$AUR_REMOVED" ] || rm -rf $AUR_REMOVED

echo "Aur cache deleted: $aur_cache_space_used"

# Keep latest version for uninstalled native packages, keep two latest versions for installed packages
# Get all cache directories for AUR helper (without removed packages)
AUR_CACHE="$(find "$AUR_CACHE_DIR" -maxdepth 1 -type d | awk '{ print "-c " $1 }' | tail -n +2)"

/usr/bin/paccache -qruk1
/usr/bin/paccache -qrk2 -c /var/cache/pacman/pkg $AUR_CACHE

echo "Removing orphan packages"
#paru -Qdtq | paru -Rns -
paru -Qdtq | paru -Rn -

echo "Clearing system logs"
journalctl --vacuum-time=7d

# explicit packages txt
pacman -Q >~/myBackups/packages_list/packages-$(date +%Y%m%d-%H%M%S).txt
pacman -Qe >~/myBackups/packages_list/packages-explicit-$(date +%Y%m%d-%H%M%S).txt
echo "Packages list saved"
:: Synchronizing package databases...
 endeavouros is up to date
 core is up to date
 extra                                                                                 8.1 MiB  9.19 MiB/s 00:01 [--------------------------------------------------------------------] 100%
 multilib                                                                            127.0 KiB   508 KiB/s 00:00 [--------------------------------------------------------------------] 100%
 chaotic-aur                                                                         644.2 KiB   256 KiB/s 00:03 [--------------------------------------------------------------------] 100%
 warpdotdev is up to date
:: Starting full system upgrade...
warning: neovide-git: local (0.15.2.r16.g8885929e-1) is newer than chaotic-aur (nightly.r1.gf65b056a-1)
resolving dependencies...
looking for conflicting packages...

Package (4)                         Old Version  New Version  Net Change  Download Size

extra/libunrar                      1:7.2.2-1    1:7.2.3-1      0.00 MiB       0.18 MiB
extra/signal-desktop                7.82.0-1     7.83.0-1       0.26 MiB     110.80 MiB
extra/unrar                         1:7.2.2-1    1:7.2.3-1      0.00 MiB       0.18 MiB
chaotic-aur/visual-studio-code-bin  1.107.0-1    1.107.1-1      0.01 MiB     146.59 MiB

Total Download Size:   257.75 MiB
Total Installed Size:  887.28 MiB
Net Upgrade Size:        0.27 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 unrar-1:7.2.3-1-x86_64                                                              184.4 KiB   931 KiB/s 00:00 [--------------------------------------------------------------------] 100%
 libunrar-1:7.2.3-1-x86_64                                                           184.9 KiB   852 KiB/s 00:00 [--------------------------------------------------------------------] 100%
 visual-studio-code-bin-1.107.1-1-x86_64                                             146.6 MiB  9.89 MiB/s 00:15 [--------------------------------------------------------------------] 100%
 signal-desktop-7.83.0-1-x86_64                                                      110.8 MiB  3.98 MiB/s 00:28 [--------------------------------------------------------------------] 100%
 Total (4/4)                                                                         257.7 MiB  9.23 MiB/s 00:28 [--------------------------------------------------------------------] 100%
(4/4) checking keys in keyring                                                                                   [--------------------------------------------------------------------] 100%
(4/4) checking package integrity                                                                                 [--------------------------------------------------------------------] 100%
(4/4) loading package files                                                                                      [--------------------------------------------------------------------] 100%
(4/4) checking for file conflicts                                                                                [--------------------------------------------------------------------] 100%
(4/4) checking available disk space                                                                              [--------------------------------------------------------------------] 100%
:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
IO Error (open failed path://.snapshots errno:2 (No such file or directory)).
==> root: 
:: Processing package changes...
(1/4) upgrading libunrar                                                                                         [--------------------------------------------------------------------] 100%
(2/4) upgrading signal-desktop                                                                                   [--------------------------------------------------------------------] 100%
(3/4) upgrading unrar                                                                                            [--------------------------------------------------------------------] 100%
(4/4) upgrading visual-studio-code-bin                                                                           [--------------------------------------------------------------------] 100%
==> NOTE: Custom flags should be put directly in: ~/.config/code-flags.conf
:: Running post-transaction hooks...
(1/6) Arming ConditionNeedsUpdate...
(2/6) Updating the MIME type database...
(3/6) Updating icon theme caches...
(4/6) Checking which packages need to be rebuilt
(5/6) Updating the desktop file MIME type cache...
(6/6) Performing snapper post snapshots for the following configurations...
Invalid snapshot '--type'.
==> root: 
:: Looking for PKGBUILD upgrades...
:: Looking for AUR upgrades...
:: Resolving dependencies...
:: Calculating conflicts...
:: Calculating inner conflicts...

Aur (8)                Old Version  New Version    Make Only
aur/cursor-bin         2.2.35-1     2.2.36-1       No
aur/opencode-bin       1.0.166-1    1.0.167-1      No
aur/pacnews            2.5.0-1      2.5.1-1        No
aur/rate-mirrors-bin   0.22.0-1     0.23.0-1       No
aur/reiserfsprogs      3.6.27-5     3.6.27-6       No
aur/vercel             48.12.1-1    50.1.0-1       No
aur/windsurf           1.12.37-1    1.12.47-1      No
aur/zulip-desktop-bin  5.12.2-1     5.12.3-1       No

:: Proceed to review? [Y/n]: n
Clearing pacman cache
du: cannot read directory '/var/cache/pacman/pkg/download-PjSfzt': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-IHZkl7': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-1eoECw': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-a7pCsE': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-4CIiC3': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-TF4iaR': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-ZgDts9': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-A9gWfG': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-2SgUdl': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-LG1e9A': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-IlZaK1': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-6bvV7a': Permission denied
du: cannot read directory '/var/cache/pacman/pkg/download-3Lbklv': Permission denied
==> no candidate packages found for pruning
Pacman cache deleted: 13G	/var/cache/pacman/pkg/
Aur cache deleted: 295M	/home/neo/.cache/paru/clone
/usr/bin/sudo
Removing orphan packages
checking dependencies...

Package (3)    Old Version      Net Change

cmark-gfm      0.29.0.gfm.13-1   -0.45 MiB
rapidfuzz-cpp  3.3.3-1           -0.38 MiB
w3m            0.5.5-1           -1.90 MiB

Total Removed Size:  2.73 MiB

:: Do you want to remove these packages? [Y/n] Clearing system logs
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal/d95a4396b9a144b981ff0d6325920b9f.
Packages list saved

This looks like there is something wrong with your snapper config or you rolled back a snapshot not quite correctly. Have you ever rolled back the root snapshot? If so, how did you do it?

You can delete these directories.

Yes, on Dec 4.

I actually don’t remember how I did it.

rm -rf download-1eoECw/
trash: cannot trash directory 'download-1eoECw/' (from volume '/var/cache')
trash:  `- failed to trash download-1eoECw/ in /home/neo/.local/share/Trash, because trash dir and file to be trashed are not in the same volume, trash-dir volume: /home, file volume: /var/cache
trash:  `- failed to trash download-1eoECw/ in /var/cache/.Trash/1000, because trash dir cannot be created because its parent does not exists, trash-dir: /var/cache/.Trash/1000, parent: /var/cache/.Trash
trash:  `- failed to trash download-1eoECw/ in /var/cache/.Trash-1000, because error during directory creation: [Errno 13] Permission denied: '/var/cache/.Trash-1000'

Your user doesn’t have permission to delete them.

1 Like

Well, I am guessing you did it in a way that didn’t retain your /.snapshots

Well, I am guessing you did it in a way that didn’t retain your /.snapshots

What should I do now? I am fine if we start snapshots from scratch.. and create a first working copy.

Try sudo btrfs subvolume create /.snapshots

Then try taking a snapshot with snapper.

Also, if you aren’t familiar with snapper and snapshot management you might take a look at Btrfs Assistant. It is a GUI tool to make managing btrfs and snapper easier.

Please check these:

It looks like you have two btrfs filesystems.