68
Embedded-Linux Wie komme ich zu einem Embedded-Linux-System? Andreas Klinger [email protected] IT - Klinger http://www.it-klinger.de Linux-Tag Berlin 22.05.2013 Andreas Klinger 1/ 68

Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

  • Upload
    others

  • View
    21

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-LinuxWie komme ich zu einem Embedded-Linux-System?

Andreas [email protected]

IT - Klingerhttp://www.it-klinger.de

Linux-Tag Berlin22.05.2013

Andreas Klinger 1 / 68

Page 2: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Teil I

Embedded-Linux-System

Andreas Klinger 2 / 68

Page 3: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

1 Aufbau — Embedded-Linux

2 Toolchain

3 JTAG und OpenOCD

4 Linux-Kernel

5 Root-Filesystem

6 Dateisysteme

7 Ausblick

Andreas Klinger 3 / 68

Page 4: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

1 Aufbau — Embedded-Linux

Andreas Klinger 4 / 68

Page 5: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Ist Embedded-Linux ein anderes Linux? I

Embedded- und Desktop-/Server-Linux haben gemeinsam:

Bootloader für Initialisierungen und Ladevorgänge

Linux-Kernel, das eigentliche Betriebssystem

Root-Filesystem, eine Sammlung von Programmen und Tools

Dämonen als Hintergrund-Prozesse

Andreas Klinger 5 / 68

Page 6: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Ist Embedded-Linux ein anderes Linux? II

Unterschiede hinsichtlich:

Hardware-Architektur

Resourcen-Limitierungen (Rechenleistung, Speicher, Peripherie,...)

Verfügbarkeit, auch im autonomen Betrieb

Echtzeitanforderungen

System-Update im Feld

Reproduzierbarkeit des Komplettsystems

Massenspeicher (managed / unmanaged Flash)

Andreas Klinger 6 / 68

Page 7: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Ist Embedded-Linux ein anderes Linux? III

Deshalb:

Embedded-Linux ist ein kleines, auf definierte Aufgabenreduziertes Linux

Produkt wird verkauftBenutzer kennt eingesetztes Betriebssystem nicht⇒ kein User / Admin vorhanden

Die eine Distribution für alle Embedded-Linux-Systeme nichtvorhanden

Andreas Klinger 7 / 68

Page 8: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Komponenten eines Embedded-Linux-Systems

Linux-Embedded-System

Bootloader Linux-Kernel

Root-Filesystem

Init-Prozeß

/sbin/init

Librarieslibc

/lib

DeviceNodes

/dev

Shell-ProgrammeDämonen

/bin/sbin

/usr/bin...

Konfiguration

/etc

Andreas Klinger 8 / 68

Page 9: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux entwickeln — Vorgehensweise

Entwicklungsschritte für ein Board ohne Bootloader und Linux

1 Cross-Development-Toolchain (gcc, binutils, gdb, libc, ...)

2 Bootloader (aufspielen und debuggen mittels JTAG und OpenOCD)

3 laden von Linux-Kernel mit RAM-Disk durch Bootloader

4 schreibbares Root-Filesystem (UBI-FS, ext3, ...) anlegen undKernel flashen

Andreas Klinger 9 / 68

Page 10: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Übungsboard — Hardware

Beispiele im Vortrag beziehen sich auf nachfolgende HardwareZielsystem ähnlich aber nicht identisch mit Sheevaplug

Board von Wiesemann & Theiss: ARM 926ejs, Marvell Kirkwood,Feroceon-CPU - Typ 88F6180

NAND-Flash 1 GB mit 128 k Erasesize und 2 k Pagesize, SamsungK9K8G08U0A

128 MB DDR2-RAM mit 64 Mib x 16 (MT47H64M16HR-3:E;D9HNZ)

Console auf UART-1 (ttyS1), MPP-Pins 13 u. 14, Typ NC16550

On-Chip-Debugging mit OpenOCD

JTAG-Adapter: ARM-USB-TINY-H, FTDI-2232-Chip

Andreas Klinger 10 / 68

Page 11: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Übungsboard — Flash-Layout

Start Größe Verwendung

0x00000000 0x000E0000u-boot (896k)Bootloader

0x000E0000 0x00020000u-boot-env (128k)Umgebungsvariablen vomBootloader

0x00100000 0x02000000kernel (32M)Linux-Kernel

0x02100000 0x08000000rootfs (128M)Root-Filesystem

0x0A100000 0x35F00000data (951M)Anwendungsdaten

Andreas Klinger 11 / 68

Page 12: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

2 Toolchain

Andreas Klinger 12 / 68

Page 13: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Cross-Development-Toolchain

Entwicklungswerkzeuge auf dem Host-System erstellenBootloader, Kernel und Root-Filesystem des Target

produzieren und verarbeiten Instruktionen des Ziel-Systems

⇒ Cross-Development-Toolchain

Open-Source-Tools für die Generierung der Toolchain

die Erstellung einer Toolchain „From-The-Scratch“ kannerheblichen Aufwand bedeuten

auf passende Version hinsichtlich Kernel und Target achten

Andreas Klinger 13 / 68

Page 14: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Buildroot — Toolchain und Root-FS

Entwicklungsrechner — buildroothttp://www.buildroot.org Version 2013.02

cd /home/linux/inst

tar -xzf buildroot-2013.02.tar.gzcd buildroot-2013.02make sheevaplug_defconfig

make menuconfig

make

⇒ Cross-Development-Toolchain (/usr/arm-linux)⇒ Root-Filesystem (output/images/rootfs.ext2)

Andreas Klinger 14 / 68

Page 15: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Cross-Development-Toolchain verwenden I

Installationspfad der Toolchain einstellenBuild options→ Host dir→ /usr/arm-linux

→ Toolchain dort verwenden, wo sie erstellt wurde (absoluter Pfad)→ auf anderem Rechner im identischen Pfad verwendbar→ ansonsten: Sysroot setzen

Andreas Klinger 15 / 68

Page 16: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Cross-Development-Toolchain verwenden II

Source-Datei armenv.sh erstellenexport PATH=/usr/arm-linux/usr/bin:$PATHexport ARCH=armexport CROSS_COMPILE=arm-linux-

Umgebungsvariablen sourcensource armenv.sh oder. armenv.sh

⇒ Bootloader, Kernel, Anwendungen, ... damit kompilieren

Beispiel für eigenes Makefileall:

${CROSS_COMPILE}gcc appl.c -o appl

Andreas Klinger 16 / 68

Page 17: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

3 JTAG und OpenOCD

Andreas Klinger 17 / 68

Page 18: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

JTAG-Schnittstelle

JTAG (Joint Test Action Group)

ursprünglich zum Testen und Debuggen integrierter Schaltungenentwickelt (In-Circuit)

bei vielen Boards als Hardware-Debugging undFlash-Programmier-Schnittstelle nutzbar

Bsp: Aufspielen und Debuggen des Bootloaders

Vorrausetzung: JTAG-Adapter zwischen Embedded-Board undEntwicklungsrechner sowie unterstützende Software zumProgrammieren, Debuggen, ...

neben kommerziellen Produkten auchOpen-Source-Entwicklungen verfügbar

Andreas Klinger 18 / 68

Page 19: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

OpenOCD

OpenOCD (Open On-Chip Debugger) wurde im Rahmen einerDiplomarbeit an der FH Augsburg entwickelt

OpenOCD-Dämon kommuniziert mit JTAG-Adapter und liefert

Schnittstelle für Terminal-Verbindung (Port 4444)

Schnittstelle für gdb-Debugger (Port 3333)

Konfigurationsskripte:

JTAG-Adapter

CPU-Kern

Board

Vorraussetzung: JTAG-Verbindung zum Embedded-Board

Andreas Klinger 19 / 68

Page 20: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

JTAG-Verbindung — OpenOCD

Entwicklungsrechner

Target

telnet localhost 4444

wut_initload_image u-bootresume 0x600000...

4444

OpenOCD OlimexFT 2232

USB JTAG

RAM

CPU

Flash

Andreas Klinger 20 / 68

Page 21: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

OpenOCD installieren I

libftdi installierenDownload von libftdi:http://www.intra2net.com/en/developer/libftdi/download.php

cd /home/linux/inst

tar -xzf libftdi-0.20.tar.gzcd libftdi-0.20

./configure −−prefix=/usr

makemake install

Andreas Klinger 21 / 68

Page 22: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

OpenOCD installieren II

OpenOCD installierencd /home/linux/inst

git clone git://openocd.git.sourceforge.net/ \gitroot/openocd/openocd

cd openocd./bootstrap./configure −−enable-maintainer-mode \−−enable-ft2232_libftdi −−prefix=/usr

makemake install(installiert unter /usr/share/openocd/)

Andreas Klinger 22 / 68

Page 23: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

OpenOCD installieren III

OpenOCD verwendencd /home/linux/inst

cp /usr/share/openocd/scripts/ \board/sheevaplug.cfg ./openocd.cfg

openocd

Default-Skript openocd.cfg anpassen:Interface richtig einstellen (find interface/...)JTAG-Geschwindigkeit (jtag_khz 2000)Prozedur wut_init() erstellen mit CPU-Register-Einstellungen(abgeleitet von sheevaplug_init())

Andreas Klinger 23 / 68

Page 24: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Debuggen mit JTAG-Verbindung — OpenOCD

Entwicklungsrechner

Target

telnet localhost 4444wut_initload_image u-boot

step 0x6000004444

arm-linux-gdb u-boottarget remote lo.:3333break start_armboot

continue

3333

OpenOCD OlimexFT 2232

USB JTAG

RAM

CPU

Flash

Andreas Klinger 24 / 68

Page 25: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

4 Linux-Kernel

Andreas Klinger 25 / 68

Page 26: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Booten des Linux-Kernels

öffnet Konsole

entpackt sich selber (optional)

initialisiert zentrale Einheiten, den „Kern des Kernels“:Memory-Management, Scheduling, Interprozess-Kommunikation

initialisiert Geräte- und Dateisystemtreiber

mountet das Root-Filesystem

startet den init-Dämon /sbin/init

Andreas Klinger 26 / 68

Page 27: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Bootvorgang eines Embedded-Linux mit RAM-Disk

1aaa

KonfigurationDaten

(UBI-FS)

rimage.gzRoot-FS

bzImage

Linux-Kernel

Bootloader

Flash2AAAAA

/bin/dev/etc/lib/proc/sbin

init...3

RAM-Disk

bzImage

RAM

!!

kopieren

!!

entpacken

symbolischeLinks

Andreas Klinger 27 / 68

Page 28: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Kernel konfigurieren und erstellen

Entwicklungsrechner — Kernel erstellenhttp://ftp.kernel.org linux-3.6.1-rt1

Kernel entpacken, RT-Patch einspielen

source armenv.sh

make kirkwood_defconfigmake menuconfig

make Kernel-Image

Andreas Klinger 28 / 68

Page 29: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

U-Boot-Image generieren

rootfs.ext2zImage

Linux-Kernel

mkimage

rootfs.ext2zImage

Linux-Kernel

wut.img

Andreas Klinger 29 / 68

Page 30: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Bootloader-Verbindung

Entwicklungsrechner

Targetminicom -stftp wut.imgbootm 800000

tftpd (Daemon)

/tftpboot

wut.imgEthernet

u-boot

RS-232

RAM

zImage

RAM-Disk

Flash

u-boot

Andreas Klinger 30 / 68

Page 31: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Linux-Target mit RAM-Disk

Target

Entwicklungsrechner

ssh [email protected] -lhvi /etc/inittabcat /proc/mtd

scp [email protected]:/etc/shadow .

Ethernet

Linux

sshd

Flash

u-boot

zImage

Root-FS

Andreas Klinger 31 / 68

Page 32: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

5 Root-FilesystemAufbau vom Root-FSbuildrootRoot-FS flashen

Andreas Klinger 32 / 68

Page 33: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

init-Dämon — /sbin/init

Konfigurationsdatei: /etc/inittab

nimmt Systemeinstellungen vor (IP-Adresse, ...)

mountet weitere Dateisysteme (/proc, /sys, ...)

startet Dämonen entsprechend dem Runlevel (syslogd, sshd, ...)

respawned Terminals (Login-Shells)

Aufwand:

Konfiguration vornehmen

Andreas Klinger 33 / 68

Page 34: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

ext2-Filesystem-Image erstellen

leere Datei mit gewünschter Zielgröße anlegendd if=/dev/zero of=rimage bs=1k count=8192

Dateisystem in Datei anlegen (kein reservierter Bereich, 512I-Nodes, 128 Bytes / I-Node)mkfs.ext2 -m0 -v -N 512 -I 128 -F rimage

Datei als Dateisystem mittels Loopback-Device mountenmkdir mntmount -o loop [-t ext2] rimage mnt

Root-FS in gemountete Datei kopieren, unmounten undkomprimierencp -av /my_rootfs/* mnt/umount mntgzip -9 < rimage > rimage.gz

Andreas Klinger 34 / 68

Page 35: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Root-Filesystem ohne Installation testen

Mounten des Root-FS im Target:mkdir my_rootfsmount -o loop rootfs.ext2 my_rootfs

Shell mit Wurzelverzeichnis / auf gemountetes Root-FS ausführen:chroot my_rootfs /bin/sh

Beendigung mit exit

Andreas Klinger 35 / 68

Page 36: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

busybox — Programme und Dämonen

Implementierung von Shell-Programmen und Dämonen speziell fürEmbedded Systeme

Programme wurden in ihrer Funktionalität auf das Wesentlichebeschränkt (80:20-Regel)

nur ein einziges Executable, welches über Soft-Links aufgerufenwird

⇒ spart Entry- und Exit-Codesequenzen

Funktionsumfang konfigurierbar

→ make menuconfig - Skripte

Andreas Klinger 36 / 68

Page 37: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

µCLibc — schlanke Bibliotheken I

libc-Implementierung; jedoch erheblich kleiner als glibc

Konfigurierbar (locale-Support, IPV6, ...)

Optimierung auf minimalen Footprint

kein Support anderer Betriebssysteme wie MS-DOS

Verzicht auf Debugging- und Tracing-Features (z. B.backtrace())

alle wichtigen Funktionalitäten sind enthalten

Andreas Klinger 37 / 68

Page 38: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

µCLibc — schlanke Bibliotheken II

Implementierung neuer Features mit zeitlichem Versatz (z. B.NPTL-Support)

keine API-Kompatibilität zwischen Versionen oder Konfigurationen⇒ Anwendungen immer gegen die im Target verwendete µClibcerstellen

⇒ einer erstellt Toolchain inkl. µClibc und verteilt diese imEntwicklungsteam, z. B.:

tar -czf unsere-toolchain.tgz /usr/arm-linux

Andreas Klinger 38 / 68

Page 39: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

eglibc — reduzierte glibc

für Embedded Linux reduzierte glibc

Abwärtskompatibilität

Ziel: Binärkompatibel mit glibc

neue Features zusammen mit glibc

Andreas Klinger 39 / 68

Page 40: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Erstellungsprozeß eines Embedded Linux Systems

Linux-Kernel

uClibc

Busybox Programm-Pakete

Entwicklungs-Werkzeuge

Cross-Development-

Toolchain

gcc, asld, ar

nm, strip...

ZielsystemEntwicklungs-system

@@@@

����

?

@@@@@R ?

��

���

Andreas Klinger 40 / 68

Page 41: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

buildroot — automatisierter Target-Buildprozess

Erstellung des Target-Images weitestgehend automatisiert mittelsMakefiles

konfigurierbar, adaptierbar und erweiterbar

verfügbar für viele Architekturen

downloaded, patched und erstellt automatisch aus den Sourcen

komplett Open-Source-Software

Root-Filesystem inklusive Konfigurationsdateien und Device-Nodes

Andreas Klinger 41 / 68

Page 42: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Ablaufsequenz bei Verwendung von buildroot

Konfigurationmake menuconfig

?

Downloadmake source

?

Erstellen von:Cross-Toolchain,Linux-Kernel u.

Target-Packagesmake

?

Root-Filesystemzusammenstellen

?

Embedded-Linux-System

Andreas Klinger 42 / 68

Page 43: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Was beinhaltet buildroot?

Cross-Development-Toolchain für Hostsystem

native Entwicklungs- und Debugging-Werkzeuge für das Target

busybox und µClibc

viele zusätzliche Open-Source-Softwarepakete

Bootloader für unterschiedliche Architekturen und Anwendungsfälle

Linux-Kernel

Andreas Klinger 43 / 68

Page 44: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

buildroot — Anpassungen I

Konfiguration

busybox anpassen:make busybox-menuconfig

µClibc anpassen:make uclibc-menuconfig

zusätzliche Pakete im buildroot auswählen

Andreas Klinger 44 / 68

Page 45: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

buildroot — Anpassungen II

Root-FS anpassen

Login-Konsole setzen:/etc/inittab→ ttyS1

Passwort vergeben für ssh-Login:passwd→ /etc/shadow

IP-Adresse einstellen:/etc/network/interface/etc/init.d/rcS/S40network restart

dropbear-Keys weiter verwenden:/etc/dropbear

Andreas Klinger 45 / 68

Page 46: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

buildroot — Anpassungen III

Anpassungen im Root-FS integrieren

vom Target Dateien und Verzeichnisse in Root-FS übernehmen:passwd, shadow, dropbear, ...siehe Unterverzeichnis: fs/skeleton

Datei-Rechtevergabe:target/generic/device_table.txt

generierte Device-Nodes:target/generic/device_table_dev.txt

Anwendungen in Buildprozeß integrierenAnwendung kopieren nach: package/customize/sourceund Option customize in Konfiguration aktivieren

Andreas Klinger 46 / 68

Page 47: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

native virtualisiert entwickeln — elbe

QEMU emuliert Zielsystem auf Entwicklungsrechner

Nutzung von vorkompilierten Debian-Paketen für das Zielsystem

Definition des Zielsystems in XML-Datei

Architekturen: x86, amd64, arm, powerpc

Open-Source-Tool „elbe“ automatisiert diese Schritte→ Ansatz für Debian-basierte Embedded-Linux-Distribution

Andreas Klinger 47 / 68

Page 48: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Root-FS auf Flash mit JFFS2 kopieren I

Entwicklungsrechnerrootfs.ext2 wird von buildroot erstellt

scp rootfs.ext2 [email protected]:/tmp/

Andreas Klinger 48 / 68

Page 49: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Root-FS auf Flash mit JFFS2 kopieren II

Erasen und Kopieren ZielsystemZielsystem mit Kernel und RAM-Disk booten

flash_erase /dev/mtd3 0 0mount -t jffs2 /dev/mtdblock3 /mnt

mkdir /mnt2mount -o loop /tmp/rootfs.ext2 /mnt2

cp -av /mnt2/* /mnt/umount /mnt2umount /mnt

Vorteil: Kernel-Treiber erstellt Filesystem das er später nutzt

Andreas Klinger 49 / 68

Page 50: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Beispiel: Kernel für JFFS2-Root-FS flashen I

Entwicklungsrechner — U-Boot-Kernel-Image generierenErstellung eines U-Boot-Images, welches zum Booten einesJFFS2-Dateisystems geeignet ist und nur den Linux-Kernel enthält:

mkimage -A arm -O linux -T kernel -C none-a 0x00008000 -e 0x00008000-n Linux-Kernel-Image -d zImage wut.kernel

cp wut.kernel /tftpboot

Andreas Klinger 50 / 68

Page 51: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Beispiel: Kernel für JFFS2-Root-FS flashen II

U-Boot ZielsystemU-Boot> tftp wut.kernel

U-Boot> nand erase 100000 2000000U-Boot> nand write 800000 100000 2000000

U-Boot> setenv bootargs ’console=ttyS1,115200root=/dev/mtdblock3 rw rootfstype=jffs2’

U-Boot> setenv bootcmd’nand read 800000 100000 2000000;bootm 800000’

U-Boot> saveenvU-Boot> boot

Andreas Klinger 51 / 68

Page 52: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

6 DateisystemeDateisysteme-Übersichtunmanaged Flash (Raw-Flash)managed Flash (FTL-Flash)

Andreas Klinger 52 / 68

Page 53: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Dateisysteme - Übersicht

Anwendungsfall Dateisystem Beispiele

NAND- / NOR-Flash jffs2ubifs

Root-FS auf Flash;schreibbare Konfiguration

Flash mit Controller ext2, ext3fat

Root-FS auf CF-/SD-Card, ...Massenspeicher

„flüchtige“ Daten tmpfsramfs

/tmp, /var, ...InitRD beim Booten

rein lesbare Daten,komprimiert squashfs Archiv-Daten

Netzwerk nfs,cifs

Unix-Netzwerkheterogenes Netz (Samba)

Pseudo-Dateisysteme procfs, sysfsdebugfs

SysteminformationenDebugging u. Tracing

Andreas Klinger 53 / 68

Page 54: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

unmanaged Flash (Raw-Flash) I

kein FTL-Controller für Schreib-Lese-Zyklen-Optimierung

Erase-Block als kleinster löschbarer Bereich; z. B. 128 kB

Page- bzw. Sub-Page als kleinste schreibbare Datenmenge; z. B. 2kB bei NAND; bei NOR bis zu 1 Byte

Schreib-Lese-Zyklus besteht aus:einem Löschvorgang (Erase) pluseinem Schreibvorgang (Write) plusbeliebig vielen Lesevorgängen (Read)

Anzahl an Schreib-Lese-Zyklen bezieht sich auf Erase-Block undist technologisch begrenzt; z. B. 100.000

Andreas Klinger 54 / 68

Page 55: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

unmanaged Flash (Raw-Flash) II

Anforderungen

Kommunikation mit Flash→ Treiber für unterschiedliche Flash-Technologien (MTD-Schicht:Memory Technology Devices)

Dateisystem muß Erase-Write-Read-Zyklen unterstützen→ spezielle Flash-Filesysteme (jffs2, ubifs, yaffs, logfs)

Anwendungsdesign→ Schreiboperationen minimieren bzw. auslagern inRAM-basiertes FilesystemBeispiel: /var/log und /tmp im Hauptspeicher als tmpfs

Andreas Klinger 55 / 68

Page 56: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Raw-Flash-Support

Flash-Hardware

Flash-DriverCharacter-DeviceErase-Blocks

Bad-BlockVolume-Mgmt.Wear-Leveling

Filesystem

NAND NOR

/dev/mtd0

MTD

UBI

UBIFS

JFFS2

Andreas Klinger 56 / 68

Page 57: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

UBI-FS benutzen I

UBI-FS (I) Zielsystemflash_erase /dev/mtd4 0 0 nur in Entwicklungubiformat /dev/mtd4 -s 512ubinfo...UBI control device major/minor: 10:62

mknod /dev/ubictl c 10 62ubiattach /dev/ubictl -m 4

Andreas Klinger 57 / 68

Page 58: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

UBI-FS benutzen II

UBI-FS (II) Zielsystemcat /sys/class/ubi/ubi0/dev253:0mknod /dev/ubi0 c 253 0

ubimkvol /dev/ubi0 -N mydaten -m

mount -t ubifs ubi0:mydaten /mnt

UBI-FS als Root-FS ZielsystemKernel-Kommandozeile:ubi.mtd=data root=ubi0:mydaten rootfstype=ubifs

ubi.mtd=data — Name der MTD-Partition (/proc/mtd)root=ubi0:mydaten — 1. UBI-Device und Volume-Name

Andreas Klinger 58 / 68

Page 59: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

UBI-FS benutzen III

UBI-FS löschen Zielsystemumount /mnt

ubirmvol /dev/ubi0 -N dataubidetach /dev/ubictl4 -m 4

Andreas Klinger 59 / 68

Page 60: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

FTL-Flash mit eigenem Controller

Beispiele: USB-Stick, CF-Card, ...

kein spezielles Flash-Filesystem notwendig

handhabbar wie gewöhnliche Festplatte; frei partitionierbar

„normale“ Dateisysteme verwendbar (ext2, ext3, fat)→ diese optimal konfigurieren⇒ häufiges und zyklisches Schreiben vermeiden

Controller optimiert Schreib-/Lese-Zyklen-Beschränkung→ Spezifikation und Grenzen des Flash beachten→ große Qualitätsunterschiede

keinen Swap-Space anlegen

Andreas Klinger 60 / 68

Page 61: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

FTL-Flash-Support

Flash-Hardware

Wear-LevelingBad-Block

Block-DeviceSektoren

Filesystem

Flash-Speicher

FTL (Controller)

/dev/sdc1 /dev/mmcblk0p1

USB, CF-Card, MMC

FAText2ext3

squashfs

Andreas Klinger 61 / 68

Page 62: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Embedded-Linux-System

7 Ausblick

Andreas Klinger 62 / 68

Page 63: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Erstellvorgang reproduzierbar machen

bei der Installation zusätzlicher Pakete auf einem Linux-Systemändert sich ggf. der Erstellvorgang

Erstellung der Toolchain und aller Hilfsprogramme in einemeigenen Unterverzeichnis

Kopieren oder Verlinken der Sourcecodes in dasToolchain-Verzeichnis

Wechsel in dieses Unterverzeichnis mittels z. B.chroot /usr/arm-linux /bin/bash

Erstellvorgang starten

Change-Root-Umgebung verlassen:exit

Andreas Klinger 63 / 68

Page 64: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Welchen Kernel soll ich verwenden?

mit Mainstream-Kernel kommt man in den Genuß zukünftigerVerbesserungen und Entwicklungen

gegebenenfalls sind Patches notwendig:

Hardware-Architektur

Echtzeitfähigkeit (RT-Preemption-Patch)

Andreas Klinger 64 / 68

Page 65: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Linux-Kernel-Patches

Board-X + RT Preemptionc?

c 2.6.31

c 2.6.26

c 2.6.0

Kernel-Mainstream

PPPPPPPPP c2.6.31-rt11

RT-Preemption-Patch

!!!!!!!!c2.6.26-x-patch

Board-X-Patch

Andreas Klinger 65 / 68

Page 66: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Tipps für ein erfolgreiches Embedded-Linux I

Eigenschaften der notwendigen Komponenten können im Vorfeldabgeklärt werden

Buildprozess vor der Auswahl des Targets testen

⇒ Unverträglichkeiten und Probleme treten zutage

⇒ Abschätzung, ob Feature X den Aufwand Y wert ist

⇒ Eckdaten des Zielsystems werden messbar

Zusammenspiel von Komponenten testen

Andreas Klinger 66 / 68

Page 67: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Tipps für ein erfolgreiches Embedded-Linux II

es existieren viele gut funktionierende Buildumgebung

⇒ an Problemen dranbleiben und sich Hilfe holen

Start mit minimaler Default-Konfiguration beginnen und daraufsukzessive aufbauen

⇒ die zu lösenden Probleme sind kleiner und handlicher

Verfügbarkeit der Quellcodes für alle verwendeten Komponentensicherstellen

⇒ minimiert ungewollte Abhängigkeiten von Dritten

Andreas Klinger 67 / 68

Page 68: Wie komme ich zu einem Embedded-Linux-System? - linuxtag.orglinuxtag.org/2013/fileadmin/ · Embedded-Linux-System 1 Aufbau — Embedded-Linux 2 Toolchain 3 JTAG und OpenOCD 4 Linux-Kernel

Tipps für ein erfolgreiches Embedded-Linux III

funktionierende Kombinationen wählen hinsichtlich:

Hostsystem

Targetsystem

Kernel u. notwendigen Patches (Architektur + Echtzeit)

Toolchain (binutils, gcc, Debugging-Werkzeuge)

Bibliotheken (µClibc, glibc, dietlibc)

in der riesigen Auswahl an Optionen und verfügbarer Software dasZiel immer im Auge behalten

Andreas Klinger 68 / 68