QEMU

Praca na zajęciach będzie odbywała się w środowisku wirtualnym z użyciem qemu.

Należy pobrać bazowy obraz (skompresowany programem xz): https://students.mimuw.edu.pl/ZSO/PUBLIC-SO/zso2021.qcow2.xz

Przed rozpoczęciem pracy, należy zdekompresować bazowy obraz i utworzyć własny obraz dysku na podstawie bazowego obrazu przygotowanego na zajęcia, używając poleceń:

unxz zso2021.qcow2.xz
qemu-img create -f qcow2 -o backing_file=zso2021.qcow2 zso2021_cow.qcow2

Tak utworzony obraz jest obrazem copy-on-write: przechowuje tylko zmiany w stosunku do bazowego obrazu, oszczędzając miejsce na dysku w przypadku istnienia wielu kopii. Choć użycie COW nie zmniejszy użycia dysku w przypadku pracy na własnym komputerze, jest wciąż zalecane, ze względu na możliwość łatwego przywrócenia oryginalnego stanu w razie problemów z systemem plików.

Aby móc użyć współdzielenia plików między maszyną wirtualną a hostem (zalecane), należy również utworzyć katalog hshare.

qemu należy uruchomić poleceniem:

qemu-system-x86_64 <opcje>

Opcje qemu do użycia na zajęciach:

-device virtio-scsi-pci,id=scsi0 -drive file=zso2021_cow.qcow2,if=none,id=drive0 -device scsi-hd,bus=scsi0.0,drive=drive0

Podłącza obraz dysku twardego przez wirtualne urządzenie blokowe. Wymagana.

-enable-kvm

Włącza sprzętową wirtualizację z użyciem KVM, znacznie przyspieszając działanie. Wymaga wsparcia ze strony systemu operacyjnego hosta: sterownik kvm-intel lub kvm-amd musi być załadowany, a qemu musi mieć dostęp do urządzenia /dev/kvm.

-smp <liczba procesorów>

Ustawia liczbę procesorów w wirtualnej maszynie. Zalecane jest ustawienie tej opcji na liczbę procesorów hosta, o ile mamy go na wyłączność i używamy sprzętowej wirtualizacji.

-cpu qemu64,smap,smep

Ustawia typ procesora z kilkoma opcjami przydatnymi na zajęciach. Zalecana, jeśli nasz procesor ją wspiera.

-m 1G -device virtio-balloon

Pozwala na dynamiczną alokację pamięci przez gościa, do limitu 1GB. Zalecana.

-net nic,model=virtio -net user

Tworzy wirtualną sieć ethernetową, podłącza do maszyny wirtualnej za pomocą wirtualnego urządzenia sieciowego, oraz podłącza do stosu TCP/IP hosta przez maskaradę. Zalecana.

-net user,hostfwd=tcp::2222-:22

Użyć zamiast -net user w powyższej opcji – przekierowuje port 2222 na hoście na port 22 w gościu, pozwalając się nam zalogować przez ssh (ssh -p 2222 127.0.0.1).

-fsdev local,id=hshare,path=hshare/,security_model=none -device virtio-9p-pci,fsdev=hshare,mount_tag=hshare

Podłącza katalog hshare/ na hoście przez protokół 9p do maszyny wirtualnej, pozwalając na łatwe zamontowanie go. Używając obrazu przygotowanego na zajęcia, tak wyeksportowany katalog będzie automatycznie widoczny w systemie gościa jako /hshare. Zalecana.

-chardev stdio,id=cons,signal=off -device virtio-serial-pci -device virtconsole,chardev=cons

Podłącza do gościa terminal, na którym działa qemu. Niestety, ze względu na ograniczenia protokołu virtio, informacja o rozmiarze terminala nie jest automatycznie przekazywana do gościa. Aby używać pełnoekranowych programów w ten sposób, należy poprawić to ręcznie, wykonując wewnątrz systemu gościa komendę:

stty rows <ilość wierszy> cols <ilość kolumn>

Właściwą ilość wierszy i kolumn dla terminala można poznać wpisując na systemie hosta komendę:

stty size

Zalecana.

-soundhw hda

Włącza emulację karty dźwiękowej w maszynie. Zalecana do drugiego zadania.

-usb -device usb-mouse

Zmienia interfejs emulowanej myszy z PS/2 na USB. Zalecana do drugiego zadania.

-display none

Wyłącza graficzny interfejs qemu. Zalecana w przypadku pracy przez sieć. Konieczne jest wtedy użycie opcji virtconsole (lub innej opcji dającej możliwość zalogowania się do maszyny).

-kernel <plik> -append <opcje>

Uruchamia bezpośrednio jądro linuxa z podanego pliku z podanymi opcjami, zamiast przechodzić przed standardowy proces bootowania. Czasem przydatna.

-gdb tcp::<port>

Pozwala na podłączenie się do qemu przez gdb (polecenie target remote localhost:<port>) i debugowanie w ten sposób jądra. Czasem przydatna.

-S

W połączeniu z opcją -gdb, powoduje uruchomienie qemu we wstrzymanym stanie, pozwalając na ustawienie breakpointów itp. przez gdb przed uruchomieniem systemu.

W przypadku użycia qemu z interfejsem graficznym, możliwy jest dostęp do konsoli monitora qemu przez Ctrl+Alt+2 (powrót przez Ctrl+Alt+1). Ta konsola pozwala m.in. na podłączanie nowych urządzeń wirtualnych w trakcie pracy qemu oraz wymuszenie wyłączenia/resetu systemu (polecenia system_reset i quit).

Użycie innych maszyn wirtualnych niż qemu nie jest możliwe – jedno z zadań zaliczeniowych będzie wymagało napisania sterownika urządzenia dostarczonego w postaci zmodyfikowanej wersji qemu.

Środowisko wewnątrz obrazu

Systemem zainstalowanym na obrazie jest debian 8.7, z drobnymi modyfikacjami. Można się zalogować używając loginu root i hasła root. W przypadku potrzeby użycia nieuprzywilejowanego konta (np. do testów), można użyć konta zso (hasło zso).

Obraz zawiera jedną partycję typu ext4 z zainstalowanym bootloaderem grub2 i jądrem w wersji 4.20.8 (czyli takim, jakie będzie używane na zajęciach).

Przydatne polecenia:

apt-get install <nazwa paczki>

instalacja oprogramowania

apt-cache search <ciąg znaków>

przeszukiwanie bazy oprogramowania

screen

multiplekser terminali, przydatny przy pracy przez virtconsole, przydatne kombinacje klawiszy:

  • Ctrl-A Ctrl-C: tworzy nowy podterminal

  • Ctrl-A Ctrl-W: lista podterminali

  • Ctrl-A <cyfra>: przechodzi do podterminala o numerze 0-9, odpowiednio

  • Ctrl-A Ctrl-N: przechodzi do następnego podterminala

  • Ctrl-A Ctrl-P: przechodzi do poprzedniego podterminala

  • Ctrl-A ?: lista przypisań klawiszy

poweroff

zamyka system i wyłącza qemu

Jeśli qemu zostało uruchomione z odpowiednią opcją -net, system będzie miał dostęp do sieci zewnętrznej. System hosta jest dostępny pod adresem IP 10.0.2.2. Dostęp z sieci zewnętrznej do sieci gościa nie jest jednak możliwy (aby to umożliwić, należałoby użyć -net tap zamiast -net user, co wymaga praw roota i jest znacznie bardziej skomplikowane). Zamiast tego zalecane jest użycie opcji virtio-9p-pci (do współdzielenia plików) i virtconsole (dla obsługi kopiuj/wklej i sensownego terminala).

Jeśli została użyta opcja virtio-9p-pci, katalog współdzielony (hshare/ na systemie hosta) jest dostępny jako /hshare. Należy jednak zauważyć, że protokół 9p nie obsługuje poprawnie pełnej semantyki UNIXowego systemu plików, co może powodować problemy przy niektórych zastosowaniach. Niemożliwa jest m.in. kompilacja jądra wewnątrz tak zamontowanego katalogu, ze względu na wadliwą obsługę wywołania rename().

W przypadku użycia virtconsole, należy pamiętać o ustawieniu poprawnego rozmiaru terminala. Jeśli używamy cały czas tego samego rozmiaru terminala, warto dodać odpowiednie wywołania stty na przykład do pliku .bash_profile.

Jeżeli nie ma możliwości użycia qemu z obsługą KVM, warto wykonywać zadania wymagające większej mocy obliczeniowej (np. kompilacja jądra) na komputerze hosta.

Ostrzeżenia

qemu bez KVMa jest wolne. System może startować 1-2 minuty (w porównaniu do kilku sekund z KVMem). Co więcej, używany system nie wypisuje nic na virtconsole do momentu pełnego uruchomienia - brak żadnego wyjścia przez dłuższy czas w przypadku użycia -display none nie znaczy więc, że system się zawiesił.

Używanie qemu na studentsie, a szczególnie wykonywanie na nim czasochłonnych czynności, jest bardzo kiepskim pomysłem - jest to bardzo wolne, a co więcej zostanie po godzine siłowo przerwane przez limit czasu procesora. Lepiej użyć któregoś z komputerów w labach, albo własnej maszyny.

sshowanie się na wirtualną maszynę jest możliwe, z użyciem forwardowania portu 22, lecz należy pamiętać o uprzedniej zmianie hasła na kontach root i zso.

Używając obrazu copy-on-write, należy uważać, aby nigdy nie modyfikować bazowego obrazu - jakakolwiek zmiana spowoduje, że obraz copy-on-write staje się bezużyteczny. Najlepiej ustawić na nim uprawnienia 444 zaraz po ściągnięciu i dekompresji.