.. _01-qemu: ==== 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 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 `` 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 cols 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 -append `` Uruchamia bezpośrednio jądro linuxa z podanego pliku z podanymi opcjami, zamiast przechodzić przed standardowy proces bootowania. Czasem przydatna. ``-gdb tcp::`` Pozwala na podłączenie się do qemu przez gdb (polecenie ``target remote localhost:``) 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 `` instalacja oprogramowania ``apt-cache search `` 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 : 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.