You are not logged in.
Hello,
Maybe this question is a bit heretical, but I think it is a necessary step I have to take.
I have Arch Linux installed, and I have had some problems playing video games, so I decided to set up a dual boot with Windows. However, the tutorials I have found are only about installing Linux from Windows, not the other way around—installing Windows from a Linux distro.
So here is my question: can someone guide me on how to install Windows from Arch? I want to avoid formatting everything and configuring Arch Linux again, since I like my current Hyprland setup
Offline
You don't install Windows from Arch, you boot the Windows ISO and install from there. If you create space for Windows ahead of time, you should be able to tell it to just use that and the most you should have to do is redo the bootloader.
Offline
Partitioning: Open KDE Partition Manager (install it first if you don't have it). Select your main drive, right-click your partition, and choose 'Resize'. Shrink it to create space for Windows, then format that new unallocated space as NTFS.
Installation: Boot from your Windows USB and install it directly into that NTFS partition you just created.
Fixing the Bootloader: After installation, Windows might take over the boot priority. Once you boot back into Arch, you need to make GRUB see Windows. Open your terminal and run:
Install tools: sudo pacman -S os-prober ntfs-3g
Enable detection: "Edit /etc/default/grub" add GRUB_DISABLE_OS_PROBER=false to the end of the file.
Update GRUB: sudo grub-mkconfig -o /boot/grub/grub.cfg
This should successfully add the Windows option to your bootloader menu. you can use "Ventoy" for install your windows iso to usb
Last edited by jlara19 (2026-01-04 21:07:01)
Offline
Yeah, don't do any of that. Do NOT try to resize your partition while you're booted from it, do not create a partition in the unallocated space (implied in those instructions), and do not format it. Just point windows to the freespace.
As for the bootloader, we have no idea what you're using, and even if it is grub, if you want to use that to load Windows or if you want to do that from the firmware's boot manager.
Offline
hm doesn't Chill Fran / OP need to install windows first, or, preferably, remove the arch drive, install windows to a separate drive, then reattach the arch drive and fix the bootloader?
Won't installing windows after arch result in the latter being unusable?
Offline
Not really. At most, it would screw up the ESP, at best, it may just change the boot order.
Offline
there actually is an option to avoid messing up any linux bootloader: just don't use the stupid windows installer but go the manual way
to keep this "windows support" short: google for "Chris Titus: Install Windows - the Arch way"
side note: the order does not matter at all - as scimmia pointed out: at the very worst windows fiddles with the uefi boot order in a way that makes the linux entry "vanish" - that's likely if we'Re talking about a laptop here as laptop uefi implementations very often designed for and tested with windows only - this is less a problem on regular desktop hardware - although there'Re exceptions to both - but even IF then it's only the boot entry that got messed up - it should not touch any other bootloader at all except its installed into the fallback/removeable path EFI/BOOT/BOOTx64.efi which windows loves to overwrite with itself
Offline
Okay, as long as Chill Fran / OP understands that some additional work after installing windows will probably be needed to get back the arch boot option.
I would think that looking carefully at all the uefi boot options on first boot after the windows install could be important - I have been suspicious in the past that upgrading / installing windows changes some defaults in a way that is potentially unhelpful (esp. CSM support, secure boot).
Offline
If I were you I would:
Take a backup of anything important
Boot off a live USB of a distro with GParted
Now depending on how you configured your installation:
If its got 2 partitions, the EFI and the Root partition, I'd shrink the root partition. (Keep in mind, shrink, not move). If you've got a separate partition for home, I'd shrink either.
Either way, it should be obvious which is which in GParted. If not, mount each one and verify for yourself.
After making some space on the drive, I'd boot the windows installer, install windows in the unclaimed space and let it do it's job. I'd then turn off fast startup (important to prevent file system weirdness and corruption).
Now since the Linux bootloader and uefi entry are most likely overwritten, I'd boot the arch live iso, chroot to the Linux installation (and mount the existing efi partition) and reinstall the bootloader (I'm only familiar with GRUB) while making sure it also detects the windows boot manager. Voila, dual boot
Offline
I think I managed to install the Windows partition; now all the struggle is with the bootloader. I’m having trouble with rEFInd and GRUB.
With rEFInd, everything worked, but the aesthetics were horrible, so I went back to GRUB.
Now the bootloader only detects Arch Linux and ignores Windows (I can only access Windows via UEFI).
I’ve tried os-prober, editing /etc/default/grub, adding a manual entry in /etc/grub.d/40_custom, and restoring bootmgfw.efi after accidentally deleting it.
here is the output of sudo grub-mkconfig:
### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${env_block}" ] ; then
set env_block="(${root})${env_block}"
export env_block
load_env -f "${env_block}"
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
if [ "${env_block}" ] ; then
save_env -f "${env_block}" next_entry
else
save_env next_entry
fi
set boot_once=true
else
set default="0"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
if [ "${env_block}" ] ; then
save_env -f "${env_block}" saved_entry
else
save_env saved_entry
fi
fi
}
function load_video {
if [ x$grub_platform = xefi ]; then
insmod efi_gop
insmod efi_uga
elif [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root d4199250-5486-40ba-969f-7894cfdc8b64
font="/usr/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=en_US
insmod gettext
fi
terminal_input console
terminal_output gfxterm
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=10
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=10
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/10_linux ###
Found linux image: /boot/vmlinuz-linux-lts
Found initrd image: /boot/intel-ucode.img /boot/initramfs-linux-lts.img
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-d4199250-5486-40ba-969f-7894cfdc8b64' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 2A7B-EF13
echo 'Loading Linux linux-lts ...'
linux /vmlinuz-linux-lts root=UUID=d4199250-5486-40ba-969f-7894cfdc8b64 rw loglevel=3 quiet
echo 'Loading initial ramdisk ...'
initrd /intel-ucode.img /initramfs-linux-lts.img
}
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-d4199250-5486-40ba-969f-7894cfdc8b64' {
menuentry 'Arch Linux, with Linux linux-lts' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-lts-advanced-d4199250-5486-40ba-969f-7894cfdc8b64' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 2A7B-EF13
echo 'Loading Linux linux-lts ...'
linux /vmlinuz-linux-lts root=UUID=d4199250-5486-40ba-969f-7894cfdc8b64 rw loglevel=3 quiet
echo 'Loading initial ramdisk ...'
initrd /intel-ucode.img /initramfs-linux-lts.img
}
Found fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-lts-fallback.img
menuentry 'Arch Linux, with Linux linux-lts (fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-lts-fallback-d4199250-5486-40ba-969f-7894cfdc8b64' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 2A7B-EF13
echo 'Loading Linux linux-lts ...'
linux /vmlinuz-linux-lts root=UUID=d4199250-5486-40ba-969f-7894cfdc8b64 rw loglevel=3 quiet
echo 'Loading initial ramdisk ...'
initrd /intel-ucode.img /initramfs-linux-lts-fallback.img
}
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/intel-ucode.img /boot/initramfs-linux.img
menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-d4199250-5486-40ba-969f-7894cfdc8b64' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 2A7B-EF13
echo 'Loading Linux linux ...'
linux /vmlinuz-linux root=UUID=d4199250-5486-40ba-969f-7894cfdc8b64 rw loglevel=3 quiet
echo 'Loading initial ramdisk ...'
initrd /intel-ucode.img /initramfs-linux.img
}
Found fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-fallback.img
menuentry 'Arch Linux, with Linux linux (fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-fallback-d4199250-5486-40ba-969f-7894cfdc8b64' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 2A7B-EF13
echo 'Loading Linux linux ...'
linux /vmlinuz-linux root=UUID=d4199250-5486-40ba-969f-7894cfdc8b64 rw loglevel=3 quiet
echo 'Loading initial ramdisk ...'
initrd /intel-ucode.img /initramfs-linux-fallback.img
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/15_ostree ###
### END /etc/grub.d/15_ostree ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/25_bli ###
if [ "$grub_platform" = "efi" ]; then
insmod bli
fi
### END /etc/grub.d/25_bli ###
### BEGIN /etc/grub.d/30_os-prober ###
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Found Windows Boot Manager on /dev/nvme0n1p1@/efi/Microsoft/Boot/bootmgfw.efi
# This menu entry is supported only on EFI platforms.
if [ "$grub_platform" = "efi" ]; then
menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' --class windows --class os $menuentry_id_option 'osprober-efi-2A7B-EF13' {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 2A7B-EF13
chainloader /efi/Microsoft/Boot/bootmgfw.efi
}
fi
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/30_uefi-firmware ###
Adding boot menu entry for UEFI Firmware Settings ...
if [ "$grub_platform" = "efi" ]; then
fwsetup --is-supported
if [ "$?" = 0 ]; then
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
fwsetup
}
fi
fi
### END /etc/grub.d/30_uefi-firmware ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry "Windows" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --set=root 2A7B-EF13
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg
fi
### END /etc/grub.d/41_custom ###
doneLast edited by Chill Fran (2026-01-10 18:11:50)
Offline
Please use code tags for program output , not quote tags.
see https://bbs.archlinux.org/help.php#bbcode
Disliking systemd intensely, but not satisfied with alternatives so focusing on taming systemd.
clean chroot building not flexible enough ?
Try clean chroot manager by graysky
Offline
Did you mount the existing efi partition? If so, was it successful and did it throw any errors?
If you didn't , try again and make sure os prober is enabled
Offline