In den letzten Tagen habe ich euch einige Tutorials zum aufsetzen eines OSCam Servers auf dem Raspberry Pi zur Verfügung gestellt. Zu meinem Bedauern gibt es leider recht wenige fertige Raspberry Pi Images welche bereits alle wichtigen Tools enthalten. Das möchte ich ändern und zeige euch daher wie ihr euer eigenes Raspbian Image von Grund auf erstellt und notwendige Konfigurationen und Einstellungen anpasst. Dieses HowTo ist ehr etwas für erfahrene Raspberry Pi und Linux Anwender.
Inhaltsverzeichnis
Wie funktioniert das überhaupt?
Wir verwenden hier ein Verfahren das sich debootstrapping nennt, damit wir erstellen ein Linux System in einem Verzeichnis auf einem bereits laufenden Linux System mit dem Tool debootstrap und erstellen uns dann ein eigenes Image File.
debootstrap ermöglicht die Installation eines Debian Betriebssystems aus einem laufendem System heraus. Insbesondere kann dabei das Installationsziel eine physikalische Partitionen oder aber eine chroot-Umgebung sein. Debootstrap selber installiert nur ein minimales Grundsystem, was zunächst noch einigen Anpassungen bedarf. Ist dies geschafft, kann man sehr leicht mittels apt ein vollwertiges System erstellen. Zusätzlich zu dem via debootstrap erstellten File System benötigen wir noch die Raspberry Pi Firmware, den Kernel und die Kernel Module welche wahlweise fertig aus dem git Repository geladen oder selbst erstellt werden können.
Vorbereitungen
Für das Erstellen unserer Umgebung verwende ich eine Ubuntu Installation als virtuelle Maschine, wie ihr die Genau aufsetzt habe ich euch in meinem Cross Compiling Artikel beschrieben. Zusätzlich habe ich einen SD-Karten Leser den ich an meine Virtuelle Maschine durchschleife, dieser ist aber optional da das erstellte Image später auch via Windows geschrieben werden kann.
Eigenes Raspbian Image – debootstrap
Wenn ihr euer Ubuntu System soweit vorbereitet habt benötigen wir als erstes die entsprechende Software und eine Passende Umgebung.
Wir öffnen über das Startmenu ein Terminal und legen uns als erstes ein Arbeitsverzeichnis im Home unseres Benutzers an
1 2 |
mkdir -p ~/raspberry.tips cd ~/raspberry.tips |
Dann installieren wir zwei Pakete welche wir für die Erstellung einer debootstrap Umgebung benötigen. Das ist der QEMU zum Emulieren der ARM Umgebung und das Tool debootstrap welches uns die Umgebung anlegt.
1 2 |
sudo apt-get install qemu-user-static debootstrap git kpartx |
Als nächstes führen wir das Debootstrap Tool aus, dieses läd uns alle notwendigen Sourcen aus dem Raspbian Repository. Der Vorgang dauert eine Weile. Wer sich ein Minimal Image erstellen möchte fügt den Parameter „–variant=minbase“ hinzu.
1 |
sudo qemu-debootstrap --arch armhf wheezy chroot-raspbian-armhf http://archive.raspbian.org/raspbian |
Nun benötigen wir noch einige Mounts sodass später uns chroot funktioniert, solltet ihr eure Arbeit unterbrechen und das System neu starten müssen diese erneut erstellt werden (Ihr müsst auch wieder via chroot ins raspbian wechseln).
1 2 3 |
sudo mount -t proc proc ~/raspberry.tips/chroot-raspbian-armhf/proc sudo mount -t sysfs sysfs ~/raspberry.tips/chroot-raspbian-armhf/sys sudo mount -o bind /dev ~/raspberry.tips/chroot-raspbian-armhf/dev |
Eigenes Raspbian Image – Firmware und Kernel
Da Raspbian später auf dem Raspberry Pi laufen soll benötigen wir noch aktuelle Firmware welche wir uns schon mal herunterladen, auch das wird eine weile dauern (3,1GB). Wir kopieren die Firmware in unser Raspbian nach /opt. Die Firmware enthält ebenfalls den speziell für den Raspberry Pi erstellten Kernel und die Kernel Module, wir kopieren diese in die richtigen Verzeichnisse unserer Raspbian-Umgebung. Zusätzlich erstellen wir das Boot File System und räumen dann etwas auf. (Alternativ könnt ihr natürlich auch einen eigenen Kernel bauen, hierzu hatte ich bereits eine Anleitung erstellt.)
1 2 3 4 5 6 7 |
cd ~/raspberry.tips/ git clone https://github.com/raspberrypi/firmware.git mkdir ~/raspberry.tips/bootfs sudo cp -R firmware/hardfp/opt/* chroot-raspbian-armhf/opt/ sudo cp -R firmware/modules/* chroot-raspbian-armhf/lib/modules/ sudo cp -R firmware/boot/* bootfs/ |
Eigenes Raspbian Image – chroot
Als nächstes kommt der spannende Teil, wir machen ein „chroot“ in das eben heruntergeladenen System und können dort alle notwendigen Einstellungen und Installationen vornehmen.
1 2 |
# chroot into the Raspbian filesystem sudo LC_ALL=C chroot ~/raspberry.tips/chroot-raspbian-armhf |
In der chroot Umgebung fügen wir als erstes das Raspbian Software Repository hinzu sodass wir weitere Pakete in unser Image installieren können und führen ein Update der Paket Liste durch.
1 2 3 4 5 |
echo "deb http://archive.raspbian.org/raspbian wheezy main" >> /etc/apt/sources.list echo "deb http://archive.raspberrypi.org/debian/ wheezy main" >> /etc/apt/sources.list wget http://archive.raspbian.org/raspbian.public.key -O - | apt-key add - wget http://archive.raspberrypi.org/debian/raspberrypi.gpg.key -O - | apt-key add - apt-get update |
Image Customizing
In der chroot Umgebung können wir mit dem Customizing des Image beginnen. Mein System benötigt später natürlich einen Hostnamen, da ich nicht jede Datei immer mit dem Editor öffnen möchte erledigt das folgende Code-Zeile in der Shell für uns.
1 |
sh -c 'echo raspberrytips >/etc/hostname' |
Das gleiche machen wir mit der lokalen Hosts Datei unter /etc/hosts das“t“ ist ein Tabulator und sollte nicht entfernt werden.
1 |
sh -c 'echo 127.0.0.1\traspberrytips >>/etc/hosts' |
Dann editieren wir noch die Standardeinstellungen für die Netzwerkkarten
1 2 3 4 5 6 7 8 |
sh -c 'cat > /etc/network/interfaces << EOF auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp EOF ' |
Da wir später beim booten unseres Images natürlich auch das File System Mounten wollen editieren wir noch die /etc/fstab
1 2 3 4 5 |
sh -c 'cat > /etc/fstab << EOF proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 0 EOF ' |
Dann setzen wir noch einige Umgebungsvariablen um später Fehler zu vermeiden.
1 2 3 4 5 6 |
sh -c 'cat >> /root/.bashrc << EOF LC_ALL=C LANGUAGE=C LANG=C EOF ' |
Jetzt installieren wir noch einige oft benötigte Software ins Image und erstellen den Standard Benutzer „pi“ mit dem Passwort „raspberry“.
1 2 3 4 |
apt-get install locales sudo openssh-server ntp usbmount patch less rsync sudo raspi-config adduser pi usermod -a -G sudo,staff,kmem,plugdev pi |
Da wir später einen USB Geräte verwenden konfigurieren wir noch die Einstellungen in usbmount.conf
1 |
sed -i -e 's/""/"-fstype=vfat,flush,gid=plugdev,dmask=0007,fmask=0117"/g' /etc/usbmount/usbmount.conf |
Wer noch eigene Einstellungen und Software in das Image integrieren will kann dies jetzt tun, als letztes säubern wir noch den Cache und verlassen die chroot Umgebung.
1 2 |
apt-get clean exit |
Eigenes Raspbian Image – Image für SD Karte erstellen
Wieder zurück im Ubuntu System müssen wir vor dem Erstellen eines Images noch die QEMU-Umgebung aufräumen, Achtung danach könnt ihr nicht wieder via chroot in das System wechseln.
1 2 3 4 |
sudo rm ~/raspberry.tips/chroot-raspbian-armhf/usr/bin/qemu-arm-static sudo umount --force ~/raspberry.tips/chroot-raspbian-armhf/proc sudo umount --force ~/raspberry.tips/chroot-raspbian-armhf/sys sudo umount --force ~/raspberry.tips/chroot-raspbian-armhf/dev |
ACHTUNG! Erhaltet ihr beim umount von /dev einen Fehler „Device is busy“ müsst ihr euer System einmal rebooten.
Als erstes erstellen wir eine leere Image Datei in unserem Arbeitsverzeichnis (5GB = Blocksize 1MB x 5120)
1 2 |
cd ~/raspberry.tips/ dd if=/dev/zero of=raspberry.tips.img bs=1MB count=5120 |
Dann Mounten wir das Image (bei mir als /dev/loop0)
1 |
sudo losetup -f --show raspberry.tips.img |
Jetzt bearbeiten wir die Partitionen des erstellten Images über den Mountpoint (bei mir wurde der Loop Device auf dev/loop0 gemountet). Einfach den Inhalt des folgenden Listings via copy & past in euer Terminal kopieren. Die Schritte können auch manuell ausgeführt werden. „sudo fdisk /dev/loop0“ und dann die Kommandos eingeben, immer den Buchstaben pro Zeile und dann Enter. Eine Leerzeile ist der Standardwert (mit Enter bestätigen).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sudo fdisk /dev/loop0 << EOF n p 1 +64M t c n p 2 w EOF |
Dann entfernen wir die Loop Device wieder
1 |
sudo losetup -d /dev/loop0 |
Wir passen noch das Partition Mapping via kpartx an, auch hier erhalte ich als Rückgabewert wieder meinen loop0 unter welchem die Partitions gemountet wurden.
1 |
sudo kpartx -va raspberry.tips.img | sed -E 's/.*(loop[0-9])p.*/1/g' | head -1 |
Wir formatieren noch das File System der beiden erstellten Partitionen (loop0 durch eure Rückgabe ersetzen). Unsere Boot Partition als FAT32 und unser Root File System als EXT4.
1 2 |
mkfs.vfat /dev/mapper/loop0p1 mkfs.ext4 /dev/mapper/loop0p2 |
Root File System schreiben
Jetzt können wir unser vorher erstelltes debootstrap Verzeichnis „chroot-raspbian-armhf“ in das Image schreiben. Das erledigt rsync für uns.
1 2 3 4 5 |
sudo mkdir /mnt/rootfs sudo mount /dev/mapper/loop0p2 /mnt/rootfs sudo rsync -a chroot-raspbian-armhf/ /mnt/rootfs sudo cp -a firmware/hardfp/opt/vc /mnt/rootfs/opt/ sudo umount /mnt/rootfs |
Boot File System schreiben
Jetzt können wir unser vorher erstelltes „bootfs“ in das Image schreiben. Zusätzlich erstellen wir noch eine config.txt die angibt welcher Kernel verwendet wird und wie unser Raspberry Pi takten soll. Auch hier wieder loop0 mit eurem Loop Device ersetzen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
sudo mkdir /mnt/bootfs sudo mount /dev/mapper/loop0p1 /mnt/bootfs sudo cp -R bootfs/* /mnt/bootfs sudo sh -c 'cat >/mnt/bootfs/config.txt< kernel=kernel.img arm_freq=800 core_freq=250 sdram_freq=400 over_voltage=0 gpu_mem=16 EOF ' sudo sh -c 'cat >/mnt/bootfs/cmdline.txt< dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait EOF ' sudo umount /mnt/bootfs |
Als letztes entfernen wir noch die erstellten Partition Mappings
1 |
sudo kpartx -d raspberry.tips.img |
Voilat, das wars auch schon. Ihr könnt nun euer eigenes Image wie gewohnt auf die SD-Karte eures Raspberry Pi schreiben. Ich erledige das, da ich meinen Leser durchgeschleift habe, direkt im Ubuntu (sudo dd bs=4M if=raspberry.tips.img of=/dev/sdc).
Viel Erfolg!