Fixing a windows EFI boot directory
After making my usual Debian drive unusable ( thanks Nvidia ) from an
apt upgrade I found myself re-installing Debian all over again. Luckily
I keep my
/ mounted on separate partitions so this was
pretty easy. When it came time to pick a drive to boot off of however I comletely
forgot that I had a Windows drive that I had been using to jankily boot off of.
Sidenote: I only forgot because I never bothered to remedy the situation of being forced to smack F12 9999 times every time I booted for a few months. 🤷
After re-installing Debian and getting setup once more I went to boot into Windows since I had some avatar modeling I wanted to do and…. couldn’t boot.
Discovering what happened
From Debian, check where the
/boot is mounted to.
In my case I have drives
sdb which contain Debian and Windows data
respectively. I found the following
/bootwas mounted to
/boot/efi/EFI/did not contain any sort of Windows folder
🔍 HINT: there are tools in Debian repos to repair this folder however I tested literally none so good luck.
Basically the new Grub installation had wiped out the old
which I never paid attention to and removed it 🤦 hence why it had
no Windows section. Normally an
update-grub would suffice if that folder
was present but this was not enough.
To make Windows bootable I setup a Windows installation USB drive using dd as such:
dd if=/path/to/Windows.iso of=/dev/<usb-drive> status=progress
Also this will hang when it gets to the end but seriously just give it some time because it basically has to verify everything after it’s been copied over.
Finally I found this post on superuser which shows how to bring back the EFI bootloader for windows so that Grub create a new entry for it and we can boot like normal ➡️ answer
Raw paste of Solution from 🌐 superuser
In case that answer ever gets clobbered here is the raw paste:
The other answers given here work great on MBR/BIOS systems, however if you’re on a UEFI system like I am, bootsect will just write a semi-functional boot MBR over the 🌐 GPT protective MBR and bootrec just gives an “Access denied” error message, and neither one has a functional option to fix a broken 🌐 EFI system partition, which on a UEFI/GPT drive is what contains the bootloader that used to be stored in the MBR. There’s unfortunately almost no up-to-date guides on fixing the UEFI Windows Boot Manager (almost all of them just say to run the graphical Startup Repair utility, but that doesn’t fix the problem in all cases), but I finally found the correct solution buried in 🌐 this article, which requires the use of the 🌐 bcdboot command instead:
Grab the 🌐 Media Creation Tool, make yourself a Windows 10 installation DVD or USB drive, and then boot into it.
When prompted, choose “Repair your computer”, followed by “Troubleshoot”, “Advanced Options”, and finally “Command Prompt”.
list disk. Note the disk number for the disk with your EFI system partition (ESP).
Select that disk with
select disk x(where
xis the disk number from the last step).
list volume. Note the volume number for your EFI system partition (ESP).
select volume x(where
xis the volume number for the ESP) and then
assign letter=N:to mount the partition. Run
list volumeagain and note that the ESP is now assigned a driver letter. Run
(Optional) If you are not currently dual booting and want to fully clean the ESP before writing a new bootloader, run
format N: /FS:FAT32to reformat it as FAT32. This is probably not necessary under normal circumstances, however, as
bcdbootseems to do a good job of cleaning things up itself. Especially do not do this if you have a Linux distro on another partition or else you’ll have to reinstall GRUB as well once you’re done with this. Also note that the following steps should not affect an EFI GRUB install as long as you do not otherwise delete GRUB’s existing directory on the ESP.
Finally, write the new bootloader to the partition with
bcdboot C:\windows /s N: /f UEFI. This command rebuilds a new UEFI-compatible bootloader on the ESP mounted at
N:using the Windows installation mounted at C:\windows. Once it’s done, you can verify the new bootloader was written by running
dir N:\EFI, where you should see a
Microsoft directorycontaining the new Windows Boot Manager as well as a
boot directorycontaining the fallback bootloader (along with other directories for any other bootloaders you have installed, such as GRUB for Linux).
(Optional) If you are dual booting, you will probably need to boot into your Linux distro and run
sudo update-grubto allow the GRUB scripts to detect and add the new Windows bootloader.
Now boot into your BIOS setup and make sure “Windows Boot Manager” (or GRUB, if you’re dual-booting) is set as the top boot choice. Save and reboot and you’ll finally be back in Windows (or GRUB).
Here are some links to help you understand EFI stuff ( because I still don’t )