czwartek, 26 marca 2026

QEMU/KVM: Windows 11 / Windows Server (uefi, secure boot, tpm)

Cześć!

Po kilku latach korzystania z Virtualbox'a przeniosłem się na "natywne" rozwiązanie w świecie Linuksa, czyli tytułowe Qemu/KVM. Rozwiązanie te jest szeroko stosowane w różnych serwerowniach (nie zawsze, są również inne rozwiązania). W zastosowania bardziej "konsumenckich" używany np w Proxmoxie.

Z upływem czasu będę publikował kolejne notki dotyczące domowej wirtualizacji z wykorzystaniem Qemu, a dziś zacznę od... przygotowania maszyny wirtualnej (VM) Windowsa 11 (preferuję wersje serwerowe, ale podstawowe wymagania co do sprzętu mają względnie zbliżone).
Domyślnie qemu/kvm emuluje bios starszego typu. Windows 11 do poprawnego działania wymaga uefi, tpm oraz secure boot.

W Debianie instalujemy następujące pakiety:
aptitude install ovmf swtpm swtpm-libs swtpm-tools
Tworzenie dysku o rozmiarze 80GB:
qemu-img create -f raw win11.img 80G
Emulujemy moduł tpm:
swtpm socket \
--tpm2 \
--tpmstate dir=/dev/shm/ \
--ctrl type=unixio,path=/dev/shm/win11.tpm \
--daemon;
ovmf ma pliki z uefi. Możemy korzystać z oryginalnych ścieżek lub skopiować dwa potrzebne pliki do folderu z VM'ką:
cp /usr/share/OVMF/OVMF_CODE_4M.secboot.fd win11.code.fd
cp /usr/share/OVMF/OVMF_VARS_4M.fd win11.vars.fd
Odpalamy naszą VM'kę:
qemu-system-x86_64 \
-cpu host -m 16G -smp 4 -enable-kvm \
-machine q35 -usb -device usb-tablet \
-device VGA,vgamem_mb=2048 \
-drive media=disk,format=raw,file=win11.img \
-drive if=pflash,format=raw,readonly=on,file=win11.code.fd \
-drive if=pflash,format=raw,file=win11.vars.fd \
-chardev socket,id=chrtpm,path=/dev/shm/win11.tpm \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0 \
-nic user \
-drive media=cdrom,file=/sciezka/do/obrazu.iso
Gdyby z jakiegoś powodu nie dało się zainstalować z użyciem konta lokalnego, wówczas:
- na ekranie tworzenia użytkownika odpalamy konsolę za pomocą Shift + F10
- wpisujemy oobe\bypassnro
- VM'ka zacznie się restartować, musimy wychwycić odpowiedni moment żeby Escapem wejść w menu bootowania VM'ki i na ekranie wyboru nośnika po prostu ją wyłączyć
- teraz wystarczy uruchomić VM'kę z opcją -nic none zamiast -nic user
- uruchamiamy, gdzieś po drodze będzie okienko umożliwiające instalację bez dostępu do internetu (dosłownie)
- jak przejdziemy resztę etapów to przed następnym uruchomieniem możemy przywrócić -nic user

Efekt finalny:
qemu-system-x86_64 \
-cpu host -m 16G -smp 4 -enable-kvm \
-machine q35 -usb -device usb-tablet \
-device VGA,vgamem_mb=2048 \
-drive media=disk,format=raw,file=win11.img \
-drive if=pflash,format=raw,readonly=on,file=win11.code.fd \
-drive if=pflash,format=raw,file=win11.vars.fd \
-chardev socket,id=chrtpm,path=/dev/shm/win11.tpm \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0 \
-nic user