Installing Arch Linux with Hyprland (Dual Boot with Windows - Seperate Drives)
By Eben van Deventer on August 22, 2025
IntermediateHave you always wanted to be able to add the iconic words; "I use Arch BTW" to your signature on a Linux forum? Are you distro-hopping and thought it would be a good idea to try out Arch Linux? It doesn't really matter because it took me a bit of trial-and-error to get a working Arch installation that could co-exist with my Windows Installation with each on separate physical drives (I have my reasons), but now that I have done that, I guess I can share the steps that I used. At the very least, I can refer to this post when I inevitably do it again.
My setup is such that I have Windows 11 running on a 1TiB NVMe drive and Arch (using systemd-boot) running on a separate 512GB NVMe drive. I also have a shared vfat partition on my 512GB Linux drive that I makes it rather convenient to share files between the two OS' but that is highly optional.
The boot sequence, obviously, is to boot to the Linux Drive (using systemd-boot) where I can then select Windows 11, Arch or an EFI Shell (Which is handy when you need to set up systemd-boot to boot Windows).
I game a bit and need the proprietary nvidia drivers, I also do some cuda development and need the nvidia-cuda-toolkit, so I will be installing these along with my arch installation.
In this installation, and for those extra cudos, we drop DEs and instead use a WM. Since we like Wayland, let's use Hyprland.
Step 1 - Get Installation Media
Look, if you need my help with this step, then Arch is likely not for you and you should consider something a bit easier.
- Download an iso from the Arch Downloads Page
- Verify it (or not, I don't care)
- Burn it to USB media (Use Balena Etcher)
I just dumped a copy of the ISO (After verification) onto my Ventoy drive and took it from there.
Step 2 - Boot the Installation Media
Firstly, you will need to disable SecureBoot in your UEFI (BIOS), this is required as you will not be able to boot the installation media with it enabled.
Change your boot order or, use the boot-selection option (Depends on your hardware) to boot to the USB Media containing the Arch Installation Media
When the Grub Bootloader on the media starts up, select: "Arch Linux install medium (x86_64, UEFI)
Wait for the Arch Installation Environment to finish booting and you should see a command prompt like this:
root@archiso ~ # _
Congratulations, you have just booted into the installation environment, notice the lack of any assistance or an installation Wizard, yeah, that's the point. You need to perform each step along the way to get your installation running and whil the Arch Installation Instructions do help, it iexpects you to have a working understaning of each of the steps along the way to get your system working just right.
Step 3 - Connect to the Internet (WiFi)
You are going to need to download several required packages to get your Arch Installation working and, unless you are connected via ethernet, you are going to notice the lack of internet connectivity quite fast so let's get that WiFi Connection up and running.
Start the iwctl tool:
iwctl
You should now be in the iwd utility, so firstly, find your wireless device:
device list
This should list all the detected Wireless devices on your system (If none are shown, try restarting, sometimes my Intel Comet Lake Wireless need a restart cycle, I don't know why but it mostly occurs for the first few restart cycles and then goes away). In my case, I see wlan0 so that's the one I'm using (Your mileage may vary), now let's put the wireless device in scan mode:
station wlan0 scan
Next we need to find a Wireless AP to connect to, so we use the get-networks function:
station wlan0 get-networks
You should now see a populated list of available wireless networks, in my case, BuFf0k Wireless is the SSID I want, so to connect (The brackets are necessary if there are spaces or special characters in the SSID name):
station wlan0 connect "BuFf0k Wireless"
It will ask for your passphrase, which you just enter and it should now be connected, once succesfully connected, exit the utility with Ctrl+D.
Test your connection by pinging google.com:
ping google.com
If this didn't work, you likely didn't use the correct passphrase, just repeat points 1 through 7 again.
Now that we have a working internet connection we can go to the next step of the installation.
Step 4 - Partition your boot drive (Not the one with Windows on), format the partitions and then mount them
Let's list our drives so that we choose the right drive:
fdisk -l
This will list each drive detected by fdisk, in my case, it shows some Microsoft Partitions on /dev/nvme1n1 so I know that is not the drive I want, the one I want is /dev/nvme0n1 so I will tell fdisk to use that drive:
fdisk /dev/nvme0n1
Firstly, delete all existing partitions using d (Do this as many times as you need to make sure there are no more partitions, it will, by default, delete the last partition so in my case no. 3 first. Once all partitions are deleted, we can create our first partition with the n command.
Since we are starting with the EFI Partition, make sure that it is Partition number 1, leave the First Sector at the default and set the last sector at 1Gb by typing +1G.
Set the partition type to EFI by typing t and hitting enter (Note, you can then use L to list all the different options, but in my case EFI is option 1 so I choose that).
Now we are going to create a root partition, sure you can add swap and seperate home partitions but I don't want to so I am not going to. Again I use the n command and leave the default partition number and starting sector but, as this is also the last partition, I am using the default last sector as this will use the rest of the drive if you don't want the shared vfat partition, in my case I set it to +400G, leaving around 79Gb for my shared partition.
As the default partition type is Linux, I don't need to change this and can now write our changes with w. If successful, this will exit fdisk and take us back to the prompt.
Optionally, I now create my shared partition and change the type to Windows Standard, using t and selecting 7.
Since we have partitioned the drive, we need to format those partitions, so firstly, we format the EFI Partition (/dev/sda1) as FAT32:
mkfs.fat -F32 /dev/nvme0n1p1
Then we format the root partition as EXT4 (Or whatever you wish)
mkfs.ext4 /dev/nvme0n1p2
Optionally, we will need to format the shared partition:
mkfs.vfat /dev/nvme0n1p3
Now we just need to mount the two (or three) partitions (Note that I am first mounting the second created (root) partition to /mnt and thereafter mounting the first created EFI partition to /mnt/boot, this matters and the last created shared partition to /mnt/mnt/shared) (Also, don't miss the --mkdir switch when mounting the furhter partitions and the fact that shared is /mnt/mnt (to be in the /mnt directory of the installed system):
mount /dev/nvme0n1p2 /mnt
mount --mkdir /dev/nvme0n1p1 /mnt/boot
mount --mkdir /dev/nvme0n1p3 /mnt/mnt/shared
Congratulations, you have no succesfully created, formatted and mounted the necessary partitions where we are going to install Arch to.
Step 5 - Optimize pacman to speed up the installation of Arch Linux:
This step is optional, but recommended as it should speed up not only the installation of Arch but also updates in future.
Update pacman repos:
pacman -Syy
Install reflector:
pacman -S reflector
Generate an updated mirrorlist for pacman using the fastest mirrors for your region (Note I am using ZA for South Africa):
reflector -c "ZA" -f 12 -l 10 -n 12 --save /etc/pacman.d/mirrorlist
Increase the number of concurrent downloads in pacman:
nano /etc/pacman.conf
ParallelDownloads = 10
And that is done, we should now be using the fastest possible mirrors for the rest of our installation.
Step 6 - Download and install the base Linux System
Now we are finally going to install the necessary linux packages to get a bootable system. Note here that I am including wayland, gnome, if you want another x-manager or DE, go ahead, it's your system (Note I include nvidia and nvidia-settings but if you don't have an nVidia GPU then don't), if you get :
pacstrap -K /mnt base base-devel linux linux-headers linux-firmware sof-firmware fwupd intel-ucode nvidia-open nvidia-utils edk2-shell xorg-xwayland xorg-xlsclients qt5-wayland qt5-declarative glfw-wayland networkmanager network-manager-applet ghostty yazi fastfetch fzf sudo nano bash-completion git vlc bluez bluez-utils blueman tlp tlp-rdw acpi hyprland hyprpaper hyprpicker hypridle hyprlock hyprcursor hyprgraphics hyprland-qt-support hyprland-qtutils hyprshot hyprsunset nwg-displays nwg-panel wofi waybar otf-font-awesome ttf-jetbrains-mono pipewire-alsa pipewire-pulse uwsm
Step 7 - Generate an fstab file
You need to have the installed system be able to mount it's partitions at boot, otherwise you won't be suing your system. Yeah, I know, sounds basic but we are working with Arch here:
genfstab -U /mnt >> /mnt/etc/fstab
Optionally, if you created the shared partition, you will need to adjust fstab to allow read write permissions, that is done by removing fmask=022 and dmask=022 and adding user and umask=000 to the newly created fstab file:
# /dev/nvme0n1p2UID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 rw,relatime 0 1# /dev/nvme0n1p1UUID=xxxx-xxxx /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2# /dev/nvme0n1p3UUID=xxxx-xxxx /mnt/shared exfat rw,relatime,user,umask=000,iocharset=utf8,errors=remount-ro 0 2
Step 8 - Configure your newly installed system
Hah, thought you were done, having installed everything and told Linux where all the installed stuff can be found, guess again, because it still doesn't work, for that, we are going to chroot into the installed system to configure a few last things:
chroot into the newly installed system using arch-chroot:
arch-chroot /mnt
Now we need to system clock and location, this is done by creating a symlink as follows (Note I am using Africa/Johannesburg as this is GMT+2 for where I live):
ln -sf /usr/share/zoneinfo/Africa/Johannesburg /etc/localtime
Syncrhonize the clock (Assuming your system clock is set to UTC):
hwclock --systohc
Edit the /etc/locale.gen file to uncomment any locales you will need, for my purposes I am using en_ZA.UTF-8 so I can just uncomment that line:
nano /etc/locale.gen
Generate the locale your chosen language:
locale-gen
Now generate the /etc/locale.conf file with your chosen language:
echo LANG=en_ZA.UTF-8 > /etc/locale.conf
Since we are in chroot, we need to set the locale environment variable for the session:
export LANG=en_ZA.UTF-8
Next we need to set the hostname for your new system, I am using buff0k, but feel free to substitute your own:
echo buff0k > /etc/hostname
You also need to create the /etc/hosts file:
touch /etc/hosts
Populate the /etc/hosts file with your settings, again, note that I am using the hostname, buff0k, this should be the same as per point 8 above in your case:
nano /etc/hosts
And add the following to the file:
127.0.0.1 localhost::1 localhost ip6-loopback ip6-localhost127.0.1.1 buff0k.local buff0k
Set the root user's password for your new system:
passwd
Configure your timezone in timedatectl:
timedatectl set-timezone "Africa/Johannesburg"
Create your user account and home directories:
useradd -m buff0k
Set a password for your new user:
passwd buff0k
And grant the required privileges to this user (Note, we will add wheel to the sudoers list in the next step so there is no need to include sudo):
usermod -aG wheel,audio,video,storage buff0k
In order to have sudo access for the wheel group, you can edit the sudo configuration:
EDITOR=nano visudo
And uncomment the following line:
%wheel ALL=(ALL:ALL) ALL
Optionally, if you dont't want to require a password for sudo, uncomment this line instead:
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
Next we need to install the systemd-boot bootloader:
bootctl install
We also need to enable some systemd services:
systemctl enable NetworkManager.service
systemctl enable bluetooth.service
systemctl enable systemd-boot-update.service
systemctl mask systemd-rfkill.service
systemctl mask systemd-rfkill.socket
systemctl enable fstrim.timer
Earlier we installed the edk2-shell EFI shell, which we now need to make bootable, since systemd-boot can only boot from its own partition, we need to copy the EFI shell there. This is also how we are going to get systemd-boot to boot Windows from another partition:
cp /usr/share/edk2-shell/x64/Shell.efi /boot/shellx64.efi
Now to create a boot entry for the EFI shell for systemd-boot, all we need to do is create a loader entry .conf file:
nano /boot/loader/entries/efi.conf
and edit to look like this:
title EFI Shellefi /shellx64.efi
In order to create a loader entry for Arch Linux, we will need to know the UUID for the root partition, in order to get that we use blkid:
blkid
and note down the UUID (Not the PARTUUID) for nvme0n1p2, it will resemble: UUID=240e775a-6e20-47f5-8ab1-91cd47c34894
Now we just create a boot entry for Arch for system-d boot:
nano /boot/loader/entries/arch.conf
and, using the UUID from point 22 above, edit to look like this:
title Arch Linuxlinux /vmlinuz-linuxinitrd /intel-ucode.imginitrd /initramfs-linux.imgoptions root=UUID=240e775a-6e20-47f5-8ab1-91cd47c34894 rw rootfstype=ext4 nvidia-drm.modeset=1 nvidia-drm.fbdev=1
Optionally, you can also create a Arch Linux Fallback entry:
nano /boot/loader/entries/arch-fallback.conf
and, using the same UUID as point 23 above, edit it to look like this:
title Arch Linux Fallbacklinux /vmlinuz-linuxinitrd /intel-ucode.imginitrd /initramfs-linux-fallback.imgoptions root=UUID=240e775a-6e20-47f5-8ab1-91cd47c34894 rw rootfstype=ext4 nvidia-drm.modeset=1 nvidia-drm.fbdev=1
We are now ready to finalize the installation of Arch by exitint arch-chroot:
exit
We can unmount the /mnt partition:
umount -R /mnt
And now we can safely reboot into Arch:
reboot
We should also setup a pacman hook to gracefully update systemd-boot after any systemd updates are applied, in order to do this we need to create a hook:
nano /etc/pacman.d/hooks/95-systemd-boot.hook
And paste this into it:
[Trigger]Type = PackageOperation = UpgradeTarget = systemd[Action]Description = Gracefully upgrading systemd-boot...When = PostTransactionExec = /usr/bin/systemctl restart systemd-boot-update.service
Step 9 - Add the Windows Boot Loader to systemd-boot
Now that we have a working installation of Arch, we need to add a loader entry for Windows, but since this requires a bit of EFI knowledge, we need to restart our computer and choose the EFI entry from the systemd-boot selection screen. This is because it will boot to an EFI shell which will list all the FS Alias' that EFI uses, and we need to know the FS Alias for the Microsoft EFI partition on the second drive, in our case, it was HD1b, so making a note of that, we can restart back into arch and then open our terminal.
Once in terminal, we need to create two files:
We need a windows.nsh file, which tells the EFI loader where to find the Windows Boot Loader, to do that:
sudo nano /boot/windows.nsh
We now use the FS Alias (HD1b in my case) for the Windows Boot Loader Partition and make this file look like this:
HD1b:EFI\Microsoft\Boot\bootmgfw.efi
Now that we have an nsh script for the EFI shell, we need to create an entry for systemd-boot:
sudo nano /boot/loader/entries/windows.conf
and edit the file to point to that entry:
title Windows 11efi /shellx64.efioptions -nointerrupt -noconsolein -noconsoleout windows.nsh
Optionally, we might want to set a default option, this can be done by editing the loader.conf file:
sudo nano /boot/loader.conf
and edit to point to the .conf file of your choice (arch.conf, arch-fallback.conf, windows.conf or efi.conf):
default arch.conftimeout 5console-mode keep
We now have a fully working bootloader to dual-boot between Arch and Windows using systemd-boot.
Step 10 - Further configurations:
With all the real work done, we can now add some additional software just to make using the AUR easier, I like to use YAY and pamac for that purpose:
Firstly, we need to git clone the yay-bin repo from the AUR:
git clone https://aur.archlinux.org/yay-bin.git
Then we need to cd into the yay-bin directory:
cd yay-bin
And then simply install yay:
makepkg -si
Once yay is installed, we can safely remove the yay-bin directory:
rm -rf ~/yay-bin
Now we can use yay to install some additional software, noting that it will ask you for options on how to compile and which specific packages to overwrite, so pay attention, this is AUR:
yay -S microsoft-edge-stable-bin visual-studio-code-bin
Step 11 - Automatically start Hyprland on login
If you want to automatically start Hyprland at user login, you should setup your .bashrc file to do that for you:
nano /etc/.bashrc
And append this to the end of the file:
if uwsm check may-start; thenexec uwsm start hyprland-uwsm.desktopfi
More articles on Arch Linux