Getting older, not necessarily wiser!
In this exercise I will attempt to dual boot a laptop using Microsoft Windows 11 and Arch Linux. This laptop will be a daily driver for use in both the home and the field. Many people I work with are set in there ways and not willing to try something different, hence the need for Microsoft Windows.
My approach will be to identify the hardware, check for any drivers that might be needed, determine the storage drive partitioning layout, set up the BIOS, install Microsoft Windows 11, and then install Arch Linux.
Technically this should work with Windows 7 or latter. However Windows 11 does depend on some specific requirements; x86 64 bit processor (there is a version for ARM processors but you are unlikely to run across it), TPM Version 2.0, EFI boot, and a Microsoft account (we will be getting around that last one).
The laptop is officially out of warranty. While not a major concern, if you are attempting this and have issues during the warranty period, it is always easier to deal with the Manufacturer when you are running the Operating System (OS) they installed.
At this point there is no telling what the next version of Windows will require. Arch Linux, on the other hand, is a rolling release, and some things can change daily. Arch is not a hand holding Distribution, Unless you are ready to do the research and work, you are probably better off using a user friendly main line Linux distribution, rather than Arch.
Before even torching the storage drives I performed a few operations, in no particular order, I suggest you perform also.
Backup: All my important data on the laptop (I have been using it for a year). While I back things up regularly, for convenience in this project I saved my files to an external physical drive just before getting started. My tools of choice are robocopy on Windows and rsync on Linux.
Recovery USB Key: Create a manufactures recovery disk (USB key in this case), so I can return things to factory defaults if I need too. Note on this project I will be using a vanilla Windows image instead of the manufacturers image to avoid some bloat. But it never hurts to have be prepared.
License Key: Recover the Windows License Key, so I can install and authenticate vanilla windows. I got mine from the command line with this;
Wmic path softwarelicensingservice get OA3xoriginalproductkey
System Hardware Identification: There are a number of ways to do this in both Windows and Linux. You can also check the manufacturers specification sheet. Pay special attention to things like WiFi, Bluetooth, sound, and video drivers (RGB also if you are in to that). These have a good possibility of requiring special/additional firmware.
Technically it is possible to combine the two drives into one large storage area in a variety of ways. However doing so adds needless complications to an already complex install. So no pooling space between multiple drives. Also since I am using UEFI, all drives must be setup as GTP. Since I have the space, I want to separate my data between drives. I want to keep my active data I use daily on one partition, and store longer term data that does not require frequent changes on another partition. This leads me to the following partition layout for my two drives (yours will most defiantly differ depending on your needs).
EFI Partition: I will create this manually, and make it 530 GB (no reason other than a specific issue I have had with Fedora Linux in the past).
Windows Space: Windows will create multiple partitions in this space depending on a few factors. I will set aside 300 GB.
Linux Swap Space: 4 GB (2 GB on each drive). Probably not needed, but I am adding it as it is minimal impact.
Linux Space: Arch Linux requires nowhere near as much space as Windows 11. I set aside 150 GB., and this is not the place to argue the necessity of swap space. For the uninitiated swap space is like the Windows page file.
Data: The rest of one drive will be used for working data.
Storage: Drive two will be used for storage of files I do not actively work on or have archived.
Once I decided on a partition layout, I proceeded with the partitioning. There are multiple ways to partition drives. Below is my method. Note I am using Ventoy to keep all my ISO files on one USB drive.
The first thing I do is boot into the Arch Linux Installer. I am installing Arch, and the installer is not fancy, but it is fast and has all the tools I need.
I use the lsblk command to see my drives. Then I use cfdisk on both drives to delete any existing partitions and set drive type to GPT. I continue to use cfdisk to re-partition the drives. There are other tools, like fdisk or GPART, that others may prefer to use. Going forward I am not going to continue talking about alternate tools, use what works for you.
I use NTFS type for both Data and Storage partitions. You might be wondering about the extensive use of NTFS. Since there are so many much better options. Since Windows, without some coxing, does not play nice with other file systems this leaves NTFS and FAT for our shared partitions. While FAT works, it is old and NTFS is the best option.
I am not going to install from my recovery drive (see above). Instead I am installing a vanilla copy of Windows 11 (somewhat less bloatware this way).
Also, I am not going to run through the Windows 11 installation procedure, as most of us have probably done it multiple times, and there are no real surprises here. I point the installer at the Windows reserved space and let it go to town.
There is one place where I do manually intervene however. When I reach the first sign in screen, I perform a procedure that you may or may not want to use. I disconnect my Ethernet cable and press Shift + F10 to open a command prompt, and type the following;
This will take you back a few screens in the install process and you will have to reenter some information. But if this still works, when you get to the sign in page section you should have a “No Internet” option and then a “Limited Install” option. This will allow you to proceed with a local account instead of a Microsoft account.
One thing that must be done before installing Linux, disable fast start for Windows. If you do not do this, then your other NTFS partitions might end up locked by Windows when it does a fast shuts down. Strangely to get to to this setting I went through the control panel; Control Panel > Hardware > Power > What Power Button Does. You will need to enable extra options as the fast start option can not be changed by default.
I am also not going through the list of things you should do to cut back on Microsoft telemetry, tracking, and spying. There are plenty of other sites showing the different things you can do. However I do caution taking some suggestions with a large grain of salt and some basic research. Some suggestions can be detrimental in some cases.
Okay this is where things get a little complicated. This is my experience, and yours may differ. So take what I say with a grain of salt also.
Synchronize Time: I have had issues with signed keys being invalid in the install environment, which I traced back to time issues. If you try to install packages and get a lot of errors, this may be something to try. The below steps will setup NTP server and synchronize the system clock to network time.
Activate the NTP line and add some servers for your region (for example in the US; 0.us.pool.ntp.org). You can also activate the FallbackNTP line if you want. Save the file.
timedatectl set-ntp true
This will turn on synchronization with online NTP servers.
systemctl restart systemd-timesyncd
You can wait a few minutes for time synchronization to to happen or you can restart the time sync service to force synchronization.
This will confirm if the system clock is synchronized to the NTP server.
Setting up file systems: Use the following commands to format the file systems; mkfs.fat, mkfs.ext4, mkfs.ntfs, and makeswap. However I suggest setting up the NTFS partitions from Windows.
Mounting Partitions: Before installing we need to mount our partitions. In my example, I will mount my main Linux partition to /mnt. Other partitions I will mount to folders I create within /mnt. Again I am using my example drives, yours will vary, so use lsblk to see what is what.
swapon /dev/nvme0n1p4 swapon /dev/nvme1n1p1 mount /dev/nvme0n1p5 /mnt mkdir -p /mnt/boot/efi mkdir -p /mnt/srv/data mkdir /mnt/srv/storage mount /dev/nvme0n1p6 /mnt/data mount /dev/nvme1n1p2 /mnt/storage
You may notice I have not mounted my efi partition, It does not need to be mounted unless one is changing something about the boot sequence. And it definitely does not need to be in /etc/fstab.
Load the System: Next we need to load a basic OS onto /mnt with the pacstrap command.
Pacstrap -K /mnt base linux linux-firmware vi networkmanager \ os-prober grub efiboootmgr sof-firmware ntfs-3g
The -K option loads the keyring (which should be in sync now). The first couple of packages are the base system, kernel, and standard firmware. We need a text editor (vi, but nano works also), a network manager, os-prober will find our Windows install, grub is the boot loader, efibootmgr manages UEFI stuff, sof-firmware is for the sound card (see above – review hardware) and ntfs-3g provides ntfs fiel ssytem support.
Generate FSTAB file: Now we need to generate our fstab file so all our drives will be auto mounted on startup.
genfstab -U /mnt >> /mnt/etc/fstab
Change Root: We can now change root into the newly installed system. Note this command is specific to the Arch install environment.
I follow the standard install up to the boot loader point; set locale, set local time, set language, set host name, add entries to hosts file, set root password. Things change a little at the boot loader setup. Don’t forget we have done a chroot, so we no longer add /mnt to the path.
To detect Windows, we need to modify the /etc/default/grub file. We want to activate os-prober. This is sort of a double negative as we need to un-comment the line GRUB_DISABLE_OS_PROBER=false.
Next we need to mount or efi drive. Then generate and configure our grub files.
mount /dev/nvme0n1p1 /boot/efi grub-install target=X86_64-efi --bootloader-id=GRUB –efi-directory=/boot/efi grub-mkconfig -o /boot/grub/grub.cfg
It has been my experince in dual booting that this never detects windows. This is due to some idiosyncrces with the Arch chgroot environment. But do not worry, we can fix this.
At this point we need to exit the chgroot environment and reboot the computer. Make sure to enter your system board firmware on restart (F11 during MSI screen on this laptop). Go to the boot section and make sure that the GRUB bootloader is in front of the Microsoft bootloader. Then save and exit.
At this point you shoud boot to the GRUB screen., then into Arch Linux. We want to remount the efi partition to /boot/efi. Then rerun the grub-mkconfig command. At this point, the Windows OS should be detected and added.
Now when you reboot again, in the Grub screen you should see both Arch Linux and Windows. Use the arrow keys to select which OS to boot into.
In this post I have installed both Windows 11 and Arch Linucx on a laptop. Admittedly the Arch install is a littel bare bones at the moment. I plan to remedy this situaiton by instyalling the KDE Plasma desktop. But that is beyond the nscope of this post. Both Arch and Windows are installed and working. We cann chose which OS to boot thoruhg the Grub boot loader.
So mission accomplished.