.. _01-qemu: ==== 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 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 `` 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 cols 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 -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 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 `` 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 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.