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
lubkvm-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.