Ten post powstał jako uaktualnienie procesu opisanego tutaj, przez Zacharego Cutlipa.
Po ponad dwóch latach od napisania tamtego tutoriala pewne rzeczy nieco się zdezaktualizowały lub zostały pominięte w opisie, skutkiem czego przyspożyły mi żmudnej pracy, której Tobie chciałbym oszczędzić 🙂
Wymagania nie powinny stanowić żadnego problemu:
Z racji tego, że nowe wersje QEMU mają poprawiony błąd w pliku /linuxuser/elfload.c, wystarczy pobrać jedną z zalecanych wersji na stronie pobierania i dokonać niewielkiej zmiany w pliku Makefile. W moim przykładzie posłużę się wersją 2.2.1.
Na maszynie wirtualnej z Ubuntu wydajemy następujące polecenia:
sudo apt-get install -y autoconf automake libtool zlib1g-dev libglib2.0-dev
wget http://wiki.qemu-project.org/download/qemu-2.2.1.tar.bz2
tar xvjf qemu-2.2.1.tar.bz2
Tak jak w poradniku Zachary’ego, modyfikujemy plik Makefile znajdujący się w głównym katalogu rozpakowanego archiwum.
Zamieniamy:
pixman/Makefile: $(SRC_PATH)/pixman/configure (cd pixman; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) –disable-gtk –disable-shared –enable-static)
na:
pixman/Makefile: $(SRC_PATH)/pixman/configure (cd pixman; aclocal; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) –disable-gtk –disable-shared –enable-static)
Kompilujemy:
cd qemu-2.2.1 ./configure –static make sudo make install
Ze strony pobieramy gotowe obrazy Debiana dla QEMU w architekturach MIPS (Big Endian) oraz MIPSel (Little Endian).
Należy mieć na uwadze, że do różnych wersji kerneli są przyporządkowane inne obrazy HDD, które nie są ze sobą kompatybilne. Oczywiście, również jądra pomiędzy architekturami nie są ze sobą zgodne.
Jądra dla obrazów debian_squeeze_mips_standard.qcow2 oraz debian_squeeze_mipsel_standard.qcow2
Jądra dla obrazów debian_wheezy_mips_standard.qcow2 oraz debian_wheezy_mipsel_standard.qcow2
Skrypt do włączania i wyłączania interfejsów sieciowych nie uległ zmianie, podobnie jak zawartość pliku /etc/network/interfaces, dlatego pomijam ten krok.
W skrypcie uruchamiającym maszyny wirtualne poprawiamy ścieżki do obrazów HDD oraz jąder systemów, również zamieniamy “XX” w ostatnim oktecie adresów MAC.
Bardzo ważną zmianą jest usunięcie z polecenia QEMU do uruchomienia systemu parametru -nographic. Przełącznik ten odpowiada za pominięcie uruchomienia serwera VNC maszyny wirtualnej i przekierwowanie wyjścia na konsolę. Niestety podczas ładowania z tą opcją system operacyjny zawiesza się. W przypadku usunięcia tego przełacznika wszystko działa idealnie 🙂
Polecenie ma wyglądać w następujący sposób:
$qemu -net nic,macaddr=$macaddr -net tap,ifname=$iface -M malta -kernel $kernel -hda $image -append “root=/dev/sda1 console=tty0”
Po edycji zapisujemy plik skryptu i możemy uruchomić wybraną przez siebie VM’kę za pomocą debqemu.sh be (dla Big Endian) \ le (Little Endian).
Do maszyny wirtualnej możemy połączyć się za pomocą dowolnego klienta VNC pod adresem 127.0.0.1:5900.
Logujemy się za pomocą poświadczeń root:root i aktualizujemy system operacyjny:
apt-get update apt-get upgrade
Instalacja niezbędnych programów, wedle uznania (serwer SSH jest już zainstalowany):
apt-get install -y mc git gdb build-essential
To by było na tyle w pierwszej części. W kolejnej (ostatniej) opiszę proces uruchamiania binarek skompilowanych na MIPS i “zdalne” debugowanie za pomocą GDB Server i IDA Pro.