Wirtualizacja dostarcza wszelkich możliwych narzędzi wspomagających uruchamianie systemów operacyjnych ze szczególnymi wymaganiami. Jednym z takich wymagań jest zapewnienie możliwego bezpieczeństwa poprzez zastosowanie TPM i UEFI z uruchomieniem typu Secure Boot. Tego typu start systemu gwarantuje, że nic nie zostało zmodyfikowane w programie rozruchowym. O ile w fizycznym hoście jest to łatwe we wdrożeniu, o tyle w rozwiązaniach typ Stack wymaga już to trochę więcej pracy. O tym jak jest to rozwiązane w VMware vSphere pisałej już tutaj. Dzisiaj przetestujemy bardzo podobne rozwiązanie w CloudStack. Należy jednak zwrócić uwagę, że istniejące VM instalowane z BIOS nie będą mogły być wykorzystane, będziecie musieli stworzyć całkowicie nowe, wzorcowe VM z UEFI.
Na tę chwilę nie ma możliwości wykorzystania fizycznego TPM w wersji emulowanej w VM tak jak to ma miejsce w vSphere. Oba rozwiązania, UEFI i TPM, są w VM emulowane. Zaczniemy od UEFI, w CloudStack w wersji 4.15 wprowadzono możliwość uruchamiania VM z UEFI jako ustawienie zaawansowane, standardowo nadal jest wykorzystywany BIOS. Konfiguracja całości jest bardzo prosta, wymaga zainstalowanie w systemie operacyjnym hosta pakietu edk2-ovmf (lub po prostu OVMF) . Pakiet ten zawiera wszystkie potrzebne pliki do emulowania UEFI w obu trybach, legacy i secure. CloudStack integruje się z tym pakietem poprzez stworzenie pliku:
/etc/cloudstack/agent/uefi.properties (ścieżki należy dostosować, zależnie od pakietu w danym OS) :
CentOS 8:
guest.nvram.template.secure=/usr/share/edk2/ovmf/OVMF_VARS.secboot.fd
guest.nvram.template.legacy=/usr/share/edk2/ovmf/OVMF_VARS.fd
guest.loader.secure=/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd
guest.nvram.path=/var/lib/libvirt/qemu/nvram/
guest.loader.legacy=/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd
CentOS 7:
guest.nvram.template.secure=/usr/share/edk2.git/ovmf-x64/OVMF_VARS-with-csm.fd
guest.nvram.template.legacy=/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd
guest.loader.secure=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-with-csm.fd
guest.loader.legacy=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd
guest.nvram.path=/var/lib/libvirt/qemu/nvram/
Włączenie wymaga restartu cloudstack-agent, sam host musi być dodatkowo oznaczony w DB CloudStack że wspiera UEFI. Nie jest to problem dla nowych instalacji, dla starszych po migracji należy tę flagę ustawić ręcznie w DB (na tę chwilę). Bez tego spotkamy się od razu z komunikatem: Cannot deploy to specified host as host does n’t support uefi vm deployment, returning.
Uruchomienie vTPM wymaga zainstalowania w systemie operacyjnym hosta pakietu swtpm swtpm-tools. Nie wymaga on dodatkowej konfiguracji, do VM dodajemy TPM dokładnie tak jak to robiliśmy w przypadku GPU, poprzez konfigurację XML dodaną jako ExtraConfig. Definicja urządzenia wygląda tak:
<devices>
<tpm model=’tpm-tis’>
<backend type=’emulator’ version=’2.0’/>
</tpm>
</devices>
Nową VM tworzymy standardowo, w opcjach zaawansowanych ustawiamy UEFI/Secure, maszyny nie uruchamiamy (fajna opcja dodana w 4.15.1):
Dodajemy w ustawieniach wirtualnej maszyny vTPM jako extraconfig (i dopiero wtedy uruchamiamy i instalujemy OS):
Poniżej screen pokazujący że UEFI zostało poprawnie rozpoznane przez Windows Instalator:
Możemy też sprawdzić czy tworzą się pliki nvram:
Ostateczny rezultat wygląda tak:
I na koniec bonus, jak dodać do KVM/VM (CloudStack) urządzenia USB? Odpowiedź jest prosta, tak jak każde inne, po jego wcześniejszym zidentyfikowaniu. Na poniższym przykładzie dodam kabel USB<—>Serial do mojej VM pełniącej rolę administracyjną. Szukamy urządzenia poleceniem lsusb –v :
Następnie preparujemy plik XML i dodajemy go do VM jako extraconfig:
<devices>
<hostdev mode=’subsystem’ type=’usb’ managed=’yes’>
<source>
<vendor id=’0x0403’/>
<product id=’0x6001’/>
</source>
</hostdev>
</device>
Uruchamiamy VM i sprawdzamy rezultat, w tym wypadku kable USB<—>Serial dodaje się jako wirtualny port COM3: