Extended Slackware

Using QEMU

Data dodania: Wed, 15 Mar 2006 23:06:47 +0100

Autor: dozzie

Co to jest QEMU?

QEMU to darmowy emulator komputera PC, podobny do VMware czy Bochsa, przy czym szybkością przewyższający Bochsa wieloktrotnie (nie mierzyłem z VMware, ale podobno jest wolniejszy). QEMU jest o tyle wygodny, że pracuje całkowicie w przestrzeni użytkownika (moduł kernela przyspieszający pracę jest opcjonalny), więc w razie czego nie potrzebujesz przywilejów administratora.

Instalacja

Pełny proces instalacji zaczynający na źródłach jest opisany skryptem slackbuild, dostępnym w moim katalogu ze źródłami QEMU, więc się nie będę zbytnio rozwodził. Ściągnij gotowy pakiet z QEMU albo źródła i slackbuilda i zbuduj sobie paczkę. Chyba nie muszę opisywać zalet trzymania pakietów zamiast ręcznych kompilatów w /usr/local?

W zasadzie QEMU już jest gotowe do pracy, ale warto wykonać jeszcze parę czynności:

  1. zamountować /dev/shm jako tmpfs (QEMU korzysta z tego katalogu jako katalogu tymczasowego), alternatywnie możesz ustawić zmienną $QEMU_TMPDIR
  2. utworzyć skrypt /etc/qemu-ifup inicjalizujący wirtualny interfejs sieciowy
  3. zbudować moduł kernela przyspieszający działanie

Konfiguracja sieci

Jeśli chcesz używać sieci na guest OS-ie, musisz mieć ten skrypt (albo podać go jako jeden z parametrów QEMU, zalecam lekturę man qemu). Wystarczy, że będzie zawierał coś takiego (zakładam, że sudo pozwala ci uruchamiać programy jako root):

#!/bin/sh

IPADDR=192.168.11.1
OUTIFACE=eth0

sudo /sbin/ifconfig "$1" "$IPADDR"
sudo /usr/sbin/iptables -t nat -A POSTROUTING -s "$IPADDR"/24 -j MASQUERADE
sudo sh -c "echo 1 > /proc/sys/net/ipv4/conf/$1/forwarding"
sudo sh -c "echo 1 > /proc/sys/net/ipv4/conf/$OUTIFACE/forwarding"

Ten skrypt najpierw ustawia IP interfejsu, którego używa QEMU, potem zakłada na nim maskaradę (NAT), a na koniec pozwala na przekazywanie pakietów między interfejsami używanym przez QEMU i twoim wyjściowym (zakładam, że to eth0).

Teraz musisz jeszcze powiedzieć QEMU, że chcesz korzystać z sieci. Wersje przed 0.8.0 nie wymagały specjalnych zabiegów, po prostu korzystały z interfejsu tun (potrzebne było prawo odczytu i zapisu do /dev/net/tun). W wersji 0.8.0 wprowadzono troszkę bardziej złożony, ale i elastyczniejszy sposób zestawiania sieci. QEMU teraz potrafi używać interfejsu tap (możesz postawić niechwilowy interfejs tap używając narzędzia tunctl z User-mode Linuksa).
QEMU oczekuje podania danych interfejsów, które zgłosi systemowi pod emulatorem i danych interfejsów, których użyje na systemie goszczącym (pod którym uruchamiasz emulator). Powiązania między tymi interfejsami to, w terminologii QEMU, tzw. vlany. Do opcji uruchomienia dodajesz -net nic,vlan=0, co utworzy w emulatorze kartę sieciową połączoną z vlanem 0. Możesz podać parę takich wpisów, dla tego samego lub innych vlanów. Dla każdego vlana przydałaby się jeszcze jakaś metoda połączenia z systemem goszczącym. Jeśli chcesz skorzystać ze stosu w pełni user-space, to wystarczy dodać -net user,vlan=0 (dla zerowego vlanu). Jeśli chcesz użyć interfejsu tap, to podajesz opcję -net tap,vlan=0,ifname=tap3, co połączy vlan 0 z interfejsem tap3 (jeśli tap3 nie istnieje, to zostanie utworzony).
Żeby nie było niedomówień: podajesz -net (co najmniej) dwukrotnie: raz dla interfejsu w emulatorze i raz dla interfejsu, do którego emulator się podłącza.
Teraz wystarczy na guest OS-ie ustawić adres IP 192.168.11.x i adres bramy domyślnej na 192.168.11.1.

Moduł przyspieszający

Jeśli chcesz używać modułu kqemu, musisz go najpierw zbudować. Gdy używasz mojego pakietu z QEMU, wystarczy że skopiujesz katalog /usr/share/qemu-<wersja>/kqemu na przykład do /tmp, wejdziesz do /tmp/kqemu i wydasz polecenie make. Makefile rozpozna, pod jakim kernelem pracujesz (2.4 czy 2.6) i zbuduje odpowiedni moduł.
Symlink /lib/modules/`uname -r`/build musi wskazywać na katalog ze źródłami kernela (tak się dzieje, gdy masz własnoręcznie budowane jądro). Jeśli źródła kernela masz gdzie indziej albo nie masz symlinka /lib/modules/`uname -r`/build, wydaj polecenie make KERNEL_PATH=/sciezka/do/zrodel/kernela.
Moduł kqemu.o (kqemu.ko pod kernelem 2.6) zbudowany, teraz trzeba go zainstalować. Utwórz sobie katalog /lib/modules/`uname -r`/misc i tam skopiuj moduł, po czym wydaj polecenie depmod -a, co przebuduje listę symboli w modułach. Teraz musisz załadować moduł (modprobe kqemu) i dopisać automatyczne jego ładowanie przy starcie (w /etc/rc.d/rc.modules dodajesz taką samą linijkę z modprobe).
Zostało tylko utworzenie pliku /dev/kqemu, przez który QEMU będzie się komunikowało z modułem. Ten plik ma być plikiem znakowym o numerach major 250 i minor 0. Możesz go utworzyć poleceniem mknod /dev/kqemu c 250 0. Musisz mieć oczywiście prawo odczytu/zapisu do tego pliku, więc pewnie bez chmod lub chown się nie obejdzie.

Używanie

Najpierw musisz stworzyć dysk wirtualny dla QEMU. Polecam dd if=/dev/zero of=disk.img bs=1M count=650, co utworzy 650 MB plik disk.img. Załóżmy, że w pliku /mnt/iso/slackware-10.1-cd1.iso masz obraz pierwszej płyty instalacyjnej Slackware 10.1. Uruchom QEMU poleceniem

$ qemu -m 64 disk.img -cdrom /mnt/iso/slackware-10.1-cd1.iso -boot d

To da maszynie wirtualnej 64 MB pamięci, każe używać dysku disk.img, wskaże, co jest CD-ROM-em i każe bootować z tego CD-ROM-u. Pokaże ci się instalator ukochanej dystrybucji Linuksa. Po zainstalowaniu Slackware wystarczy uruchomić

$ qemu -m 64 disk.img

I już możesz korzystać z maszyny wirtualnej.

Engine by Dozzie. Awful design by Dozzie.