Instalacja i uruchominie OpenWrt w środowisku maszyny wirtualnej
Ostatnia zmiana: 2013-11-26 18:43

Testowe środowisko

Często jesteśmy ciekawi jak wygląda dany firmware, co można z nim zrobić lub jakie ma ustawienia. Lub potrzebujemy po prostu dodatkowego systemu gdzie można by było coś ustawić i przetestować.
Z pomocą przychodzi wirtualizacja, technika pozwalająca na uruchomienie na danym komputerze wielu systemów operacyjnych jednocześnie. Przy wykorzystaniu maszyny wirtualnej (KVM, qemu, vmware lub virtualboxa) można uruchomić i przetestować działania niektórych firmware.

Do wykonania przykładów wykorzystano linuksa (Debian SID, jądro 2.6.28) wraz z kvm. Powinno to także działać na Ubuntu oraz najprawdopodobniej na innych dystrybucjach. W przypadku systemów Windows należy użyć VMware lub VirtualBox'a. Oczywiście dobrze jest posiadać jeden z nowych procesorów wspierający sprzętową wirtualizację, dzięki temu całość emulowanego systemu będzie szybciej chodziła.

Obraz firmware należy przekonwertować do formatu obsługiwanego przez daną maszynę wirtualną. W niektórych przypadkach może zaistnieć potrzeba specjalnej konfiguracji sieci, żeby można było dostać się do danego firmware (tak jak w tym przypadku dla kvm). Jeżeli maszyna wirtualna podsiada swój własny adres ip, nie trzeba robić nic z konfiguracją sieci.

Firmware

Mimo że niektóre maszyny wirtualne (qemu) mogą emulować inne procesory (mips) należy wykonać podstawowe założenie - musi być dostępny firmware na platformę x86. Przy takim założeniu można przetestować jak działają:

- OpenWrt Kamikaze (LuCI - 8.09) - moja kompilacja (trunk)
- OpenWrt Kamikaze (X-Wrt - 8.09) - moja kompilacja (trunk)
- OpenWrt Kamikaze (Gargoyle - 1.0.0beta4) - moja kompilacja

oraz

- DD-WRT (v24 sp1)

Należy pobrać jeden lub kilka z powyższych obrazów. Jeżeli obraz jest spakowany - należy go rozpakować.
Z powodu niedostępności Tomato na platformy inne niż broadcom nie da się uruchomić tego firmware w ten sposób.

Instalacja i konfiguracja hosta

Hostem będzie nazywany dalej komputer na którym zainstalowana jest maszyna wirtualna i na którym uruchamiane są poszczególne obrazy systemu.

Linux

Należy zainstalować
- kvm - maszyna wirtualna
- qemu (niezbędny jest program qemu-img z tego pakietu)
- vde (lub vde2) - do konfiguracji sieci

Jądro linuksa powinno zawierać także wsparcie dla TUN/TAP (sekcja Device Drivers -> Network device support -> Universal TUN/TAP device driver support) oraz, jeżeli to możliwe, wsparcie dla wirtualizacji. Jądra dystrybucyjne powinny zawierać już skompilowane moduły.

Zostaje teraz konfiguracja sieci. Jak root (dla użytkowników Ubuntu: sudo su) należy wydać następujące polecenia:


    vde_switch -tap tap0 -daemon
    ifconfig tap0 192.168.1.254 netmask 255.255.255.0
    echo "1" > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Ponieważ większość firmware ma na stałe ustawiony adres na 192.168.1.1 tworzymy nowy interfejs z tej klasy (tu: 192.168.1.254) oraz dajemy emulowanemu systemowi dostęp do internetu (zakładając że interfejsem łączącym hosta ze światem jest interfejs eth0, jeżeli nie trzeba go zmienić na odpowiedni). Jeżeli nasz adres na interfejsie hosta jest już właśnie z tej klasy można go dowolnie zmienić pamiętając o późniejszej zmianie tego adresu w określonym firmware.

Konwersja firmware

W zależności od posiadanej maszyny wirtualnej należy jeszcze wykonać konwersji obrazu na zgodny format. Do tego celu należy wykorzystać program qemu-img.
Założenia: openwrt-x86-ext2.image to nazwa pobranego obrazu, openwrt.qcow2 to nazwa docelowego obrazu dla maszyny wirtualnej.

KVM lub qemu



    qemu-img convert -f raw openwrt-x86-ext2.image -O qcow2 openwrt.qcow2

VMware



    qemu-img convert -f raw openwrt-x86-ext2.image -O vmdk openwrt.vmdk

Niektóre firmware (np. DD-WRT) dostarczają już gotowych obrazów na VMware.

Uruchomienie

Sprowadza się do wydania polecenia (jako root!)


    vdekvm -m 64 -localtime -usb openwrt.qcow2

Firmware powinien wystartować oraz uruchomić LAN pod adresem 192.168.1.1. Można to zmienić jeżeli używamy innej klasy adresowej.
Aby zobaczyć jak wygląda gui danego firmware należy na hoście uruchomić przeglądarkę i wpisać adres 192.168.1.1 lub taki, na jaki został zmieniony. Oczywiście brakuje interfejsu WLAN (chyba że mamy coś na usb). Do firmware można dostać się także w tradycyjny sposób - przez telnet lub ssh, dostępne są także wszystkie usługi skonfigurowane i uruchomione (ftp, samba itp). W przypadku OpenWrt można normalnie instalować dodatkowe paczki z pakietami - domyślne rozmiary obrazu to 48MB (czyli tak, jakby urządzenie miało 48MB pamięci flash).

UWAGA: W zależności od maszyny wirtualnej może być potrzebny określony sterownik do kart sieciowej. Moje obrazy (LuCI, X-Wrt, Gargoyle) oraz DD-WRT powinien poradzić sobie bez problemu, w przypadki oryginalnego LuCI i X-Wrt może nie uruchomić się sieć. W takim przypadku należy zainstalować odpowiedni pakiet do obsługi karty sieciowej (kmod-3c59x, kmod-8139too, kmod-e1000, kmod-e100, kmod-r8169, kmod-natsemi, kmod-ne2k-pci, kmod-pcnet32 lub kmod-sis900).

Specyficzne właściwości dla poszczególnych obrazów

LuCI

Po uruchomieniu firmware należy ustawić hasło poleceniem passwd, chociaż da się także wejść na gui bez hasła. Adres domyślny: http://192.168.1.1

X-Wrt

Można zmienić hasło po starcie. Przy pierwszym wejściu przeglądarką także będzie można zmienić hasło. Adres domyślny: http://192.168.1.1

Gargoyle

Domyślny użytkownik: root, domyślne hasło: password. Należy połączyć przez przez https nie http z powodu problemu na platformie x86 w moim kompilacie. Adres domyślny: https://192.168.1.1

DD-WRT

Domyślny użytkownik: root, domyślne hasło: admin, adres domyślny: http://192.168.1.1 (ps. na starcie pojawia się dużo komunikatów o błędach - niestety dd-wrt tak ma i należy je zignorować).

Dostęp do sieci

Ponieważ w ten sposób uruchomione obrazy komunikują się poprzez interfejs LAN, nie ma domyślnie w nich dostępu do internetu. Aby zmienić to należy w OpenWrt wydać następujące polecenia


    route add default gw 192.168.1.254
    echo "nameserver 208.67.222.222" >> /tmp/resolv.conf.auto

ping na dowolny adres powinien już działać.
Lub zgodnie z ideologią OpenWrt (na stałe w pliku /etc/config/network):


    uci set network.lan.gateway=192.168.1.254
    uci set network.lan.dns=208.67.222.222
    uci network commit

Inna metoda - przekonfigurować całość tak, żeby eth0 było interfejsem WAN (to zostawiam jako zadanie domowe - patrz inne moje howto)

Podsumowanie

Na hoście:


    vde_switch -tap tap0 -daemon
    ifconfig tap0 192.168.1.254 netmask 255.255.255.0
    echo "1" > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    vdekvm -m 64 -localtime -usb openwrt.qcow2

w OpenWrt


    route add default gw 192.168.1.254
    echo "nameserver 208.67.222.222" >> /tmp/resolv.conf.auto

Zakończenie

Całość można sprowadzić do jednego skryptu który ustawi sieć i uruchomi dany firmware. Dzięki temu mamy możliwość przyjrzenia się jak działa i wygląda dany firmware a także doskonałe środowisko do testów (chociaż pozbawione dostępu do specyficznego sprzętu na danej platformie).

Jeden obraz warty tysiąca słów:


(kliknij, aby powiększyć)