Vorgeschichte
Vor kurzem habe ich mir ein neues ThinkPad zugelegt. Da ich mehr unter Linux (Fedora 34) arbeite, aber ab und zu auch Windows für Photo/Video und 3D brauche, war ich mir zu Anfang unschlüssig wie ich Windows installieren sollte. Parallel oder nur in eine VM. Habe mich dann entschlossen Windows parallel im dual Boot Modus zu verwenden.
Windows war ja schon vorinstalliert, daher habe ich nur die Partition verkleinert und Fedora zusätzlich installiert. Vorher hatte ich mir noch Images von der Boot-, Recovery- und 16MB großen Windows Reserved Partition, mit dd gezogen.
Um die Systeme besser zu trennen, mehr Platz zu haben und Windows auch zusätzlich mittels KVM in einer VM zu laden, habe ich mich entschlossen eine zweite M.2 SSD zu kaufen. Diese passt sehr gut in den Slot, der eigentlich für ein WWAN Modul gedacht ist. Wichtig ist nur, dass das ein 2242 Modul ist und mit B-Key ausgestattet ist. M und B Key geht auch… Habe hier das SN520 SSD 256GB M.2 2242 PCIe genommen.
Probleme über Probleme
Der Einbau ging noch sehr gut von Statten, das ThinkPad hatte sogar schon eine M.2 Schraube drin.
Bei der Installation habe ich jedoch, gefühlt, alles falsch gemacht, was man falsch machen kann. Ich habe die Partitionstabelle der zusätzliche M.2 nicht geprüft. Als ich die Platte in GParted angeschaut habe, hatte ich nur gesehen, dass schon eine 1GB große Boot-Partition drauf war. Daher hatte ich mir hier keine weiteren Gedanken gemacht. Dummerweise war die Tabelle MBR und nicht GPT.
Auch habe ich zu früh mit den bestehenden EFI Boot Dateien rumgespielt, wodurch immer wieder der Dual Boot kaputt ging.
Um es zu verkürzen, hier nun nur die Schritten, die sofort zum Erfolg führen sollten:
Vorgehensweise
Voraussetzung ist, dass schon Windows und Fedora auf der original Partition installiert sind und sich im Dualboot auch starten lassen. Auch sollte nun schon die zweite M.2 eingebaut sein.
An dieser Stelle noch mal in das Windows booten und die UUID dort auslesen und notieren. Im Terminal das ausführen:
wmic csproduct get UUID
Partitionen anlegen und kopieren
Jetzt geht ihr her und erstellt euch ein GParted Live USB Stick und bootet von dort.
Wählt in GParted die zweite M.2 aus und erstellt eine GPT Partitionstabelle. Anschließend erstellt ihr am Anfang der Festplatte eine 260MiB große Fat32 Partition mit der Bezeichnung „System„. Wenn die Partition erstellt ist, bekommt sie die Markierung: Boot, esp und hidden.
Als nächstes habe ich eine 16MB große, unformatierte Partition erstellt, ohne Bezeichnung und der Markierung: msftres. Ob die wirklich benötigt wird, müsst ihr selber noch mal recherchieren.
Nun kopiert ihr die Windows Partition von der original M.2 (/dev/nvme0n1) und fügt sich hinter die zuletzt erstellte Reserved Partition.
Zu guter Letzt kopiert ihr noch die Windows Recovery Partition. Ich habe sie ganz ans Ende der neuen M.2 eingefügt um die Windows Partition vergrößern zu können. Markierung sollte hier sein: hidden und diag.
Zum Schluss könnt ihr die alte Windows Partition auf der original M.2 löschen. Wenn ihr wollt könnt auch auch gleich die Fedora Partition verschieben und vergrößern.
Fedora präparieren
Wir müssen die neue M.2 blacklisten, damit Fedora hier kein Blödsinn mit anstellt und wir das Modul sauber per „PCI Passthrough“ durch reichen können.
Das machen wir jetzt erst mal temporär, da wir später noch mal die Windows M.2 dem Grub Bootmanager hinzufügen wollen.
Um das zu bewerkstelligen, müssen wir erst einige Kernel Module aktivieren und Optionen setzen. Erstelle eine Datei: /etc/modprobe.d/kvm.conf mit dem Inhalt:
options kvm_intel nested=1 options kvm_intel emulate_invalid_guest_state=0 options kvm ignore_msrs=1 report_ignored_msrs=0
Und eine Datei: /etc/modules-load.d/vfio.conf:
vfio vfio-pci vfio_virqfd vfio-iommu-type1
Dann passt die Grub Datei an: /etc/default/grub
und ergänzt die Zeile GRUB_CMDLINE_LINUX mit:
intel_iommu=on iommu=pt rd.driver.pre=vfio-pci
Jetzt die Module und Einstellungen aktivieren:
dracut -f --kver $(uname -r) grub2-mkconfig > /etc/grub2-efi.cfg
Nun das System einmal neu startet und wieder in Fedora booten.
Dann können wir die PCI ID auslesen, um die M.2 zu blacklisten:
for g in /sys/kernel/iommu_groups/; do echo "IOMMU Group ${g##/}:"; for d in $g/devices/; do echo -e "\t$(lspci -nns ${d##/})"; done; done
Bei mir taucht unter anderem dieser Eintrag auf:
IOMMU Group 16: 08:00.0 Non-Volatile memory controller [0108]: Sandisk Corp PC SN520 NVMe SSD [15b7:5005] (rev 01)
Hier brauche ich die ID: 15b7:5005
In einer neuen Datei: /etc/modprobe.d/vfio.conf schreiben wir dies hinein:
options vfio-pci ids=15b7:5005
Jetzt wieder Kernel neu konfigurieren:
dracut -f --kver $(uname -r)
Und System neu starten.
VM einrichten
Wenn KVM noch nicht installiert ist, können wir das nun tun:
dnf install @virtualization edk2-ovmf
Mit virt-manager können wir die VM anlegen, aber ohne Festplatte, diese fügen wir als PCI Host-Gerät an und wählen dort unsere Windows M.2 aus. Gleich zu Anfang sollte auch die Firmware auf: OVMF_CODE.fd gestellt werden. Bei der CPU ist es wichtig, nur einen Sockel auszuwählen und dann Kerne und Threads zu vergeben.
Jetzt die VM nicht starten, sondern das XML von ihr bearbeiten. Am besten einen Dump machen:
virsh dumpxml win10 > win10.xml
Dann die XML bearbeiten und die ID, die wir vom original Windows notiert haben, gleich am Anfang unter <uuid> einfügen.
Unter <vcpu>*</vcpu> fügen wir noch diesen Block ein:
<sysinfo type="smbios"> <bios> <entry name="vendor">[vendor]</entry> <entry name="version">[version]</entry> </bios> <system> <entry name="manufacturer">[manufacturer]</entry> <entry name="product">[product]</entry> <entry name="version">[version]</entry> <entry name="uuid">[uuid]</entry> <entry name="sku">[sku]</entry> <entry name="family">[family]</entry> </system> <baseboard> <entry name="manufacturer">[manufacturer]</entry> <entry name="product">[product]</entry> <entry name="version">[version]</entry> <entry name="serial">[serial]</entry> </baseboard> <chassis> <entry name="manufacturer">[manufacturer]</entry> <entry name="serial">[serial]</entry> </chassis> </sysinfo>
Die Infos dafür bekommt ihr mit dem Tool: dmidecode.
Mit dem fertigen XML definiert ihr die Windows VM neu. Dieser Eintrag simuliert in der VM die gleiche Hardware, wie der physische PC und kann daher unter anderem Lizenzprobleme vorbeugen.
Windows Bootmanager in VM installieren
Jetzt braucht ihr eine aktuelle Windows 10 ISO, die ihr der VM zuweisen müsst und von dieser auch booten sollt.
Ihr wählt nun statt Installation, Computerreparaturoptionen, dann Problembehandlungen und dort Eingabeaufforderung.
Im Terminal gebt ihr diskpart ein und vergibt so die Laufwerkbuchstaben, dass Windows C hat und die SYSTEM Boot Partition K hat. Weiter Infos dazu hier: repair-efi-gpt-bootloader.
Dann könnt ihr den Bootloader installieren:
bcdboot C:\Windows /l de-DE /s k: /f ALL
Jetzt sollte die Windows VM bootfähig sein.
Dual Boot reparieren und Windows zu Grub hinzufügen
Zu diesem Zeitpunkt lässt sich Windows nicht mehr normal booten. Um das zu beheben, müssen wir die neue M.2, die geblacklistet ist, wieder für Fedora aktivieren. Also die Datei /etc/modprobe.d/vfio.conf wieder öffnen und die Option kommentieren. Kernelmodule wieder konfigurieren:
dracut -f --kver $(uname -r)
System neu starten. Dann mit efibootmgr den Windows Booteintrag entfernen. Z.B. mit: efibootmgr -b 0000 -B. Vorher aber ID prüfen, mit efibootmgr -v.
Nun die neue Bootpartition auf der neuen M.2 dem EFI Menü hinzufügen:
efibootmgr -c -L "Windows Boot Manager" -l "\EFI\Microsoft\Boot\bootmgfw.efi" -d /dev/nvme1n1 -p 1
Und die Grub Konfig neu schreiben:
grub2-mkconfig > /etc/grub2-efi.cfg
Jetzt wieder die Windows M.2 blacklisten, booten und kontrollieren, ob Windows auch normal gestartet werden kann.
Das war’s…
Anhang und Haftungsausschluss
Ich möchte hier noch mal drauf hinweisen, dass ich keine Haftung für eventuelle Schäden übernehme. Bei dieser Anleitung handelt es sich lediglich um ein mögliches Szenario was nicht alle Hürden und Fehler abdeckt. Auch muss eventuelle Lizenzprobleme der Windows Installation geprüft werden.
Quellen:
https://gist.github.com/jb-alvarado/d6aef18ddb965939442838d7310c5b31
https://superuser.com/questions/1507636/how-to-create-from-0-a-bootable-disk-partition-for-windows-10
https://bobcares.com/blog/repair-efi-gpt-bootloader/
https://recoverit.wondershare.com/partition-tips/repair-efi-bootloader-in-windows.html
https://www.linuxbabe.com/command-line/how-to-use-linux-efibootmgr-examples
https://www.nextofwindows.com/the-best-way-to-uniquely-identify-a-windows-machine