Kategória: Raspberry π

Zmenené: 16. máj 2013

Raspberry Pi v qemu

Pretože som netrpezlivý, rozhodol som sa vyskúšať RaspberryPi vo virtuálnom prostredí. No, možno presnejšie vyskúšať distribúciu Raspbian, ktorá je pre tento minipočítačodporúčaná. Nebola to pre mňa celkom ľahká úloha, pretože qemupoužívam veľmi málo a Raspbiansom použil po prvý krát.

Príprava prostredia

Začnite tým, že si nainštaluje virtualizačný nástroj qemu:

aptitude install qemu

ja som síce qemu nainštalované mal, ale o jeho verzii a možnostiach neviem nič, tak som si pre istotu skontroloval, či dokáže emulovať procesor arm1176:

qemu-system-arm -cpu ? | grep arm1176

Tak, moja verzia to dokáže, ale ak príkaz nevypíše žiadny výstup, je možné použiť procesor arm1136-r2:

qemu-system-arm -cpu ? | grep arm1136-r2

Varovanie

Ak ani toto nič nevypíše, mali by ste sa určite poobzerať po inej (pravdepodobne novšej) verzii qemu!

Dobrým zvykom je pripraviť si samostatný adresár, kde budú uložené všetky potrebné veci pekne pohromade a nebudú sa miešať s ničím iným. Do pripraveného adresára si stiahnite obraz jadra:

mkdir raspi_qemu
cd raspi_qemu
wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu

Ostáva stiahnuť obraz disku distribúcie Raspbianzo stránky Raspberry Pi (v dobe písania wheezy). Stiahnutý obraz disku je komprimovaný vo formáte zip, preto ho rozbaľte, napríklad pomocou unzip:

unzip 2013-02-09-wheezy-raspbian.zip

Výsledkom je súbor 2013-02-09-wheezy-raspbian.img v aktuálnom adresári s veľkosťou približne 2 GB.

Tip

Nezabudnite upraviť meno súboru podľa verzie stiahnutého obrazu disku!

Úprava obrazu

Aby stiahnutý obraz disku fungoval v qemu, je v ňom treba zmeniť obsah súboru /etc/ld.so.preload, kde treba zakomentovať celý jeho obsah (jeden riadok). Pretože však obraz obsahuje dve partície, tak je treba zistiť posun partície v obraze:

Upozornenie

Odporúčam použiť kpartx a nie tento starý postup…

file 2013-02-09-wheezy-raspbian.img

Vo výstupe je treba hľadať hodnotu startsector druhej partície, napríklad:

partition 2: ID=0x83, starthead 165, startsector 122880, 3665920 sectors, code offset 0xb8

Túto hodnotu je potrebné vynásobiť 512 (veľkosť sektora), tj. 122880x512=62914560, a použiť v nasledujúcom príkaze na pripojenie druhej partície obrazu:

mkdir /tmp/raspi
sudo mount 2013-02-09-wheezy-raspbian.img -o offset=62914560 /tmp/raspi

Po pripojení ostáva otvoriť súbor v textovom editore:

sudo mcedit /tmp/raspi/etc/ld.so.preload

V tomto súbore je spomenutý jediný riadok:

/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so

Ktorý treba pomocou textového editora zakomentovať a pridať na začiatok znak komentára (#). Po zmene a uložení možno pripojený obraz odpojiť:

sudo umount /tmp/raspi

Prvé spustenie

V tomto okamžiku už možno obraz Raspbianu spustiť v qemu pomocou nasledujúceho príkazu:

qemu-system-arm -kernel kernel-qemu \
        -cpu arm1176 -m 512 -M versatilepb -no-reboot -serial stdio \
        -append "root=/dev/sda2 panic=1" \
        -redir tcp:5022::22 \
        -hda 2013-02-09-wheezy-raspbian.img

Jednotlivé parametra majú tento význam:

  • -kernel kernel-qemu jadro pre qemu, ktoré ste stiahli
  • -cpu arm1176 procesor, ktorý má byť emulovaný (ARM1176JZF-S (700 MHz))
  • -m 256 veľkosť dostupnej RAM (v MB)
  • -M versatilepb typ emulovanéhostroja
  • -no-reboot namiesto reštartu skončiť qemu
  • -serial stdio presmerovať sériový port na štandardný V/V (standard I/O)
  • -append „root=/dev/sda2 panic=1“ umiestnenie koreňovej partície v obraze
  • -redir tcp:5022::22 sa postará o presmerovanie portu ssh na lokálny port 5022
  • -hda 2013-02-09-wheezy-raspbian.img meno (cesta) k súboru s obrazom disku

Neviem, či je to tým, že som upravoval obsah, ale pri prvom štarte obrazu Raspbian vypísal chybové hlásenie:

raspi_boot.png

Raspbianotvoril reláciu superpoužívateľaa v okne qemu je potrebné spustiť kontrolu súborového systému upravovanej pratície:

fsck /dev/sda2

Mne vypísalo, že systém bol naposledy pripojený v budúcnosti a vyžiadal si potvrdenie stlačením Y (pozor Y na anglickej klávesnici). Pretože však ideo predvolenú voľbu, stačí stlačiť Enter. Po úspešnej oprave súborového systému je dobré systém reštartovať:

reboot

Napriek môjmu očakávaniu, nedošlo k reštartu, ale k vypnutiu virtuálneho stroja (kvôli parametru -no-reboot). Nevadí, stačí ho jednoducho znova spustiť pomocou vyššie napísaného príkazu.

Pri štarte Raspbianuv qemusa vo výpise objavujú chyby. Nie je to také hrozné, ako to na prvý pohľad vyzerá, pretože jednoducho qemu nedokáže emulovať všetok hardvér RaspberryPi.

Prvé prihlásenie

Po úspešnej kontrole disku a reštarte virtuálneho stroja sa v okne qemuspustí konfigurátor a zároveň sa v emulátore terminálu (z ktorého bol qemu spustený) objaví konfiguračný dialóg. Rovnaký dialóg môžete spustiť aj neskôr, a to pomocou:

sudo raspi-config

Ja som si na začiatok nastavil len niekoľko vecí:

  • nastavil lokalizáciu (skaj cz)
  • vykonal aktualizáciu
  • nastavil spúšťanie ssh
  • nastavil štart grafického prostredia (pretože som zvedavý)

Po ukončení nastavenia som znova reštartoval (teda vypol a zapol) virtuálny stroj, tentokrát už pomocou:

sudo reboot

Po štarte ma už privítalo grafické prostredie no a spomínaný prihlasovací dialóg v termináli. Mimochodom, na prihlásenie v termináli použite prihlasovacie meno pi a heslo raspberry (grafické prostredie sa spustí bez prihlásenia) a na prístup k účtu root poslúži sudo su.

Po prvotných pokusoch môžete zrušiť presmerovanie sériového portu (ale nemusíte) a na ďalšie prístupy môžete použiť ssh (ak ste jeho štart povolili napr. pomocou raspi-config). Pretože je port ssh presmerovaný na port 5022 lokálneho počítača (to kvôli qemu a jeho NAT), bude pripojenie vyzerať takto:

ssh -p 5022 pi@localhost

Ak sa vám to nechce stále vypisovať (ako napríklad mne), tak stačí do súboru ~/.ssh/config pridať:

hostraspi
  hostname localhost
  port     5022
  user     pi

Teraz sa už stačí prihlasovať pomocou ssh raspi.

Prieskum stavu

Po naštartovaní som bol zvedavý na niektoré údaje, aby som si (a vy tiež) mohol utvoriť predstavu o systéme.

Pamäť

Ako prvé ma zaujíma stav pamäte. Takto to vyzerá so spusteným grafickým prostredím:

free-m
         total   used   free  shared  buffers  cached
Mem:       247     94    152       0       12      46
-/+ buffers/cache: 35    212
Swap:       99      0     99

A takto po jeho vypnutí:

free-m
         total   used   free  shared  buffers  cached
Mem:       247     48    199       0        7      23
-/+ buffers/cache: 16    230
Swap:       99      0     99

Ako vidno, pamäte je habadej. Ak vás zaráža, že je k dispozícii len 247 MB RAM, tak je to natvrdo v emulátore tejto platformy. Ak sa pokúsite spustiť emulátor s 512 MB pamäte (-m 512), systém nenaštartuje. Ak však potrebujete viac pamäte, napr. aby ste otestovali softvér pre Model B, bude potrebné pripraviť väčší swap, čím emulovaný systém zväčší svoju virtuálnu pamäť.

Súborový systém

Ako ďalšie ma zaujímalo rozdelenie partíciía ich zaplnenie:

df
Súborový systém 1K-bloky    Použ Dostupné Pou% Pripojený na
/dev/root       1804128  1463000   249480  86% /

Takže jedna partícia a zaplnená na 86 %. Teda žiadna sláva ja len pripomeniem, že obraz disku má 2 GB, takže 2 GB karta SDiste nie je riešenie.

Sieťové služby

zaujíma aj to, čo všetko je po inštalácii (a aktualizácii) spustené tak, aby komunikovalo v sieti:

netstat-tunl
ActiveInternet connections(onlyservers)
Proto Recv-Q Send-Q LocalAddress     ForeignAddress    State
tcp      0     0    0.0.0.0:22       0.0.0.0:*
udp      0     0    0.0.0.0:68       0.0.0.0:*
udp      0     0    0.0.0.0:54088    0.0.0.0:*
udp      0     0    10.0.2.15:123    0.0.0.0:*
udp      0     0    127.0.0.1:123    0.0.0.0:*
udp      0     0    0.0.0.0:123      0.0.0.0:*

Som milo prekvapený, pretože beží len ssh, klient DHCP a ntp. Priznám sa, že som čakal viac spustených služieb, ale to nie je smerodatné.

Výkon

S výkonom teda žiadna sláva:

cat/proc/cpuinfo| grep MIPS
BogoMIPS: 437.45

Kdesi na netesom našiel, že reálne raspberryPi (teda nie v qemu) má výkon 697,95, teda pomerne veľký rozdiel, a to emulácia beží na výkonnom stroji amd64.

Viac pamäte

Ako som už spomenul, vraj z RaspberryPi v qemuviac ako 256 MB RAM nedostanete, pretože je táto hodnota natvrdo zabudovaná v platforme. Riešením je urobiť partíciu pre swap (predvolene je použitý swap do súboru), a tak rozšíriť virtuálnu časť pamäte.

Vytvoril som teda nový obraz disku s veľkosťou 256 MB a menom swap.img:

qemu-img create swap.img 256M

Ostáva už len pridať ďalšiu voľbu pri spúšťaní qemu, ktorá obraz pripojí ako ďalší disk (sdb):

-hdb swap.img

Naštartovať virtuálne Raspberrya v konzole naformátovať disk (priamo, bez partície) ako swapa inicializovať ho:

mkswap -L swap -f /dev/sdb
swapon /dev/sdb

V tomto okamžiku je swap aktivovaný, hoci len do najbližšieho reštartu. Na to je potrebné pridať záznam do súboru /etc/fstab:

/dev/sdb    none      swap     sw     0    0

Samozrejme, môžete sa pohrať s parametrami UUID alebo LABEL (použite blkide), ale v qemu to považujem za zbytočné. Reštartujte systém a po štarte skontrolujte stav swapu pomocou:

swapon -s
Filename                Type        Size    Used    Priority
/dev/sdb                partition   262140  0       -1
/var/swap               :file:`     102396  0       -2

Paráda, nový swap bol pridaný pamäte je ešte viac.