QEMU

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

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

qemu-img create -f qcow2 -o backing_file=/home/students/inf/PUBLIC/ZSO/zso2025.qcow2 zso2025_cow.qcow2

Czasami poza argumentem -f wymagany jest również -F.

Studenci pracujący na własnych komputerach mogą ściągnąć bazowy obraz (skompresowany programem xz) pod adresem:

https://students.mimuw.edu.pl/ZSO/PUBLIC-SO/zso2025.qcow2.xz

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=zso2025_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 lub -cpu host

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.

-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 12, 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 odpowiedniej wersji.

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 podanym numerze 0-9,

  • 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 UNIX-owego 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 KVM-a jest wolne. System może startować 1-2 minuty (w porównaniu do kilku sekund z KVM-em). 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 godzinie 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.