fli4l auf Raspberry Pi (nativ)
Einleitung
Es folgt eine Beschreibung, wie man einen Kernel aus dem fli4l Repository auf einem Raspberry Pi booted. Derzeit ist der Funktionsumfang noch beschränkt, weil z.B. die Netzwerkschnittelle mangels USB Treiber noch nicht verwendet werden kann. Eine Ausgabe per HDMI Schnittstelle auf einem Monitor kann ebenfalls noch nicht erfolgen. Stattdessen wird das System mittels serieller Konsole über den UART des Pis bedient.
Serielle Konsole
Um die Kernelmeldungen zu sehen und den Raspberry bedienen zu können ist eine serielle Konsole hilfreich. Diese kann über den GPIO Port (Pins 6, 8, 10) erreicht werden. Die Pins führen den UART (RS-232) mit TTL Pegeln. Das heißt, es muß ein Pegelkonverter verwendet werden, wenn eine Standard RS-232 Schnittstelle am Rechner verwendet werden soll. Die beste Alternative ist die Verwendung eines FT232 USB<->RS232 Adapters, da dieser von Haus aus ebenfalls mit TTL Pegeln auf der seriellen Schnittstelle arbeitet. Günstig zu erwerbende Mini PCBs aus China eingnen sich hervorragend und werden meist miteiner Pfostenleiste und einem Satz entsprechender Steckbrücken geliefert. Mein Setup:
Die Verdrahtung ist wie folgt (praktisch 3-adriges Nullmodemkabel):
Pi FT232
Pin 6 (GND) ---- GND
Pin 8 (TXD) ---- RX
Pin 10 (RXD) ---- TX
Die Einstellungen für das Terminal sind:
- Baudrate: 115200 bps
- 8 Datenbits
- keine Parität
- kein Handshaking (RTS/CTS bzw. Xon/Xoff)
Bootmedium erstellen
Der Raspberry Pi booted von einer SD-Karte, die eine FAT32 Partition enthält. Hier wird die folgende Partitionierung auf einer 2GB SD-Karte verwendet (Devicenamen ggf. anpassen):
$ sudo fdisk /dev/sdd
Command (m for help): p
Disk /dev/sdd: 988 MB, 988807168 bytes
31 heads, 61 sectors/track, 1021 cylinders, total 1931264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000dcb9d
Device Boot Start End Blocks Id System
/dev/sdd1 * 2048 121023 59488 c W95 FAT32 (LBA)
/dev/sdd2 121024 1930710 904843+ 83 Linux
Command (m for help): q
$ sudo mkfs.vfat /dev/sdd1
mkfs.fat 3.0.26 (2014-03-07)
Auf die FAT32-Bootpartition müssen einige Binaries kopiert werden, die aus einem raspbian image übernommen wurden. Man kann sich die Datei auch aus dem Firmware-Repository von Raspberry Pi beschaffen. Mindestens die Dateien:
- bootcode.bin
- start.elf
müssen vorhanden sein.
Desweiteren werden zwei config Dateien (config.txt und cmdline.txt) benötigt. Die minimalen Inhalte sind wie folgt.
config.txt
kernel kernel
initramfs rootfs.img followkernel
cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 boot=/dev/mmcblk0p1
Damit wird die Konsole auf den UART /dev/ttyAMA0) umgelenkt. Die Konfiguration des Terminals erfolgt wie oben beschrieben. Der Parameter kgdboc ist notwendig, damit auch tatsächlich alle Meldungen auf der seriellen Konsole ausgegeben werden. Andernfalls ist nach der Ausgabe des Kernels Schluss. Außerdem muss eine Bootpartition mittels boot Parameter angegeben werden, weil das fli4l-boot Skript aktuell nicht die richtige Parition selbst erkennt.
Kernel und rootfs erstellen
Mittels updatefli4l.sh aus dem _TOOLS Ordner des svn wurde ein fli4l Verzeichnis erstellt. Ich habe folgende Minimalkonfiguration verwendet:
revision=r$localRev
arch=rpi
svnDir=$fli4lBaseDir/svn/4.0/trunk
configDir=$fli4lBaseDir/configs/${client}
tarballDir=$fli4lBaseDir/routers/$client/$client$delim$revision$delim$arch
unpack="base dns_dhcp kernel_4_0 tools usb"
contrib=""
#avm="avm-fcpci"
In den Configs wurden folgende Parameter verwendet (Auszüge):
BOOT_TYPE='hd'
LIBATA_DMA='disabled'
KERNEL_VERSION='4.0.4'
KERNEL_BOOT_OPTION=''
POWERMANAGEMENT='none'
BEEP='no'
SER_CONSOLE='yes'
SER_CONSOLE_IF='0'
SER_CONSOLE_RATE='115200'
NET_DRV_N='1'
NET_DRV_1='smsc95xx'
NET_DRV_1_OPTION=''
Da beim Raspberry Pi Port eine Hand voll Kernel Module für USB fehlen, muss die Datei opt/usb.txt angepasst werden. Die Einträge für die Module ehci-pci.ko in Zeile 23, ohci-pci.ko in Zeile 25 und uhci-hcd.ko in Zeile 26 habe ich zunächst schlicht entfernt.
Danach kann mklfli4l.sh aufgerufen werden. Anschließend werden die erstellten Dateien kernel, rc.cfg, rootfs.img und opt.img auf die FAT32-Partition der SD-Karte kopiert.
$ cp config/build/{kernel,rc.cfg,rootfs.img,opt.img} /media/florian/BOOT/
Dann kann die SD-Karte ausgehangen und in den Raspberry Pi gesteckt werden. Die serielle Konsole sollte dann Ausgaben ähnlich derer in den Screenshots zeigen.