#format rst #language de Beagle Bone Black ================= .. contents:: .. sectnum:: Lokaler Arbeitsbereich auf SSD ------------------------------ NICHT IM HOME-VERZEICHNIS DES RZ KOMPILIEREN!!! Verwende lokale SSD Platte des Rechners **elinux-remote**, oder ihren eigene Rechner Jede/Jeder legt sich Arbeitsbereich an nach dem Muster **/home/elinux_work/ + "_" + ** Beispiele: - ``/home/elinux_work/hoegl_h`` - ``/home/elinux_work/schaeferling_m`` Achtung: Gesamte Partition hat ca. 500 GByte frei. Bei 25 Teilnehmern waeren das ca. 20 GByte je TN. Das reicht zum Kompilieren von U-Boot, Kernel, Buildroot. Beim Kompilieren von Yocto fallen bis zu 60 GByte Daten an. Das kann dann natuerlich nicht jeder zur gleichen Zeit machen. Der Kompiliervorgang dauert auch mehrere Stunden! U-Boot kompilieren ------------------ An Anleitungen von **Robert C. Nelson** halten. Er Applikationsingenieur bei Texas Instruments und hat praktisch das komplette Linux auf AM335x angepasst. https://forum.digikey.com/t/debian-getting-started-with-the-beaglebone-black/12967 .. code-block:: text sudo apt install bison wget -c https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz tar xf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz export CC=`pwd`/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- git clone -b v2019.04 https://github.com/u-boot/u-boot --depth=1 wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-am335x_evm-uEnv.txt-bootz-n- fixes.patch wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0002-U-Boot-BeagleBone-Cape- Manager.patch cd u-boot/ patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch patch -p1 < ../0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch patch -p1 < ../0002-U-Boot-BeagleBone-Cape-Manager.patch make ARCH=arm CROSS_COMPILE=${CC} distclean make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig make ARCH=arm CROSS_COMPILE=${CC} * Wie konfiguriert man das U-Boot? Kernel kompilieren ------------------ Anleitung von R. C. Nelson: https://forum.digikey.com/t/debian-getting-started-with-the-beaglebone-black/12967 .. code-block:: text git clone https://github.com/RobertCNelson/bb-kernel cd bb-kernel/ git checkout origin/am33x-v4.19 -b tmp Immer wieder: warning: konnte nicht auf '/rzhome/hhoegl/.config/git/attributes' zugreifen: Keine Berechtigung Installieren: lzop, ./build_kernel.sh # siehe build_kernel.log * Wie konfiguriert man den Kernel? Vorarbeiten zum Booten ueber TFTP/NFS ------------------------------------- Auf dem Hostrechner ist ein TFTP Server und ein NFS Server zu installieren. Auf dem TFTP Server wird der Kernel (uImage) und der Device Tree liegen. Auf dem NFS Server wird das Root Filesystem liegen. Der Kernel wird am Ende des Bootvorgangs das Root Filesystem ueber NFS mounten. TFTP ```` Installiere "tftpd-hpa" Server und "tftp-hpa" Client (zum Testen). :: apt install tftpd-hpa apt install tftp-hpa man tftpd man tftp systemctl status tftpd-hpa.service Konfigurationsdatei: /etc/init/tftpd-hpa.conf Server Verzeichnis: /srv/tftp/ Test: tftp -v 127.0.0.1 -c get Defaults:: $ cat /etc/default/tftpd-hpa # /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure" NFS ``` :: apt install nfs-kernel-server man nfsd man exports man exportfs man nfsstat man showmount /etc/default/nfs-kernel-server systemctl status nfs-kernel-server.service /etc/exports sudo exportfs -ra # bei Aenderungen der /etc/exports Datei, oder Daemon # restart Beispiele fuer Eintraege in ``/etc/exports``: /pfad/zu/den/dateien *(rw,sync,subtree_check) /nfs 10.11.12.1/255.255.255.0(rw,sync,no_root_squash) /media/disk/avr32-work/rootfs 10.11.12.2(rw,sync,no_root_squash,subtree_check) /srv/ngw100 192.168.1.2(rw,no_root_squash,sync,no_subtree_check) /srv/bbb/rootfs *(rw,no_root_squash,sync,no_subtree_check) <=== Mein aktueller Eintrag Client (zum Test): mount -t nfs :/pfad/zu/den/dateien /mnt sudo mount -t nfs 127.0.0.1:/srv/bbb/rootfs mnt/ mount -t nfs -o nfsvers=2,nolock 10.11.12.2:/nfs /mnt showmount -e # show exports Yocto Project -------------- Lit.: - Buch von Simmonds, ab Seite 162 - Artikel von Mirza Krak, "Linux IoT Development: Adjusting from a Binary OS to the Yocto Project Workflow", Linux Journal, July 2019. http://hhoegl.informatik.hs-augsburg.de/elinux/yocto/yocto-lj-300-2019.pdf - Building BeagleBone Systems with Yocto, August 2020. Verwendet Poky "dunfell" (= Version 3.1). Hat auch Meta-Layer fuer BBB gemacht. Sehr gute Anleitung, die man nachvollziehen sollte! https://jumpnowtek.com/beaglebone/BeagleBone-Systems-with-Yocto.html .. How to create your own Linux distro using Yocto, Oct 2020 - allg. Anleitung, ohne Bezug auf BBB https://www.fosslinux.com/43266/how-to-create-your-own-linux-distro-using-yocto.htm - Build and deploy Yocto Linux on the Beaglebone Black (2014) - Im Prinzip okay, von den Versionen her natuerlich veraltet! https://android.serverbox.ch/?p=1273 - Prinzipiell okay, da von 2016 auch von den Versionen her gesehen veraltet: https://beagleboard.org/p/30847/yocto-on-beaglebone-black-9ae649 - Yokto Doku - https://www.yoctoproject.org/docs/3.1/overview-manual/overview-manual.html - https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html Installation, Kongiguration und Kompilation ``````````````````````````````````````````` Verwende entweder Version "dunfell" (3.1) oder "hardknott" (3.3). Es kann sein, dass man vorher auf dem Kompilier-Rechner noch ein paar Pakete installieren muss. Bei mir waren das:: apt install chrpath diffstat gawk Das haengt aber von der verwendeten Distribution ab. :: $ git clone -b dunfell git://git.yoctoproject.org/poky.git $ cd poky $ source oe-init-build-env Neues Buildverzeichnis "build" wird angelegt. $ cd build/ In conf/local.conf die richtige MACHINE setzen: MACHINE ?= "beaglebone-yocto" Kompilierung starten mit $ bitbake core-image-base Kompilierung dauert je nach Rechner mehrere Stunden. Es muessen auch viele Pakete aus dem Netz geholt werden, deswegen braucht man eine gute Internetverbindung. Ein moderner 6-Kern oder 8-Kern Prozessor und 32 GByte RAM ist empfehlenswert. Die Xeon CPU im Rechner "elinux-remote" hat 4 Kerne und ist damit gerade halbwegs dafuer geeignet. Erzeugte Dateien ```````````````` Siehe ``poky/build/tmp/deploy/images/beaglebone-yocto/`` Device Tree ``````````` DTB in das tftpd Verzeichnis kopieren:: sudo cp am335x-boneblack.dtb /srv/tftp Kernel `````` Kernel (zImage) nach uImage umwandeln (U-Boot eigenes Format). Benoetige "mkimage". sudo apt install u-boot-tools man mkimage Allgemeiner Aufruf:: mkimage -A -O linux \ -T kernel -C none -a -e \ -n "Linux kernel" -d arch/arm/boot/zImage uImage Fuer BBB: Arch: arm Load address: 0x80800000 oder 0x82000000 Entry point: 0x00000000 :: (base) hhoegl@msi:~/poky/build/tmp/deploy/images/beaglebone-yocto$ mkimage \ -A arm -O linux -T kernel -C none -a 0x80800000 -e 0x80800000 -n "Linux kernel" -d zImage uImage Image Name: Linux kernel Created: Mon May 3 20:25:50 2021 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 7568576 Bytes = 7391.19 KiB = 7.22 MiB Load Address: 80800000 Entry Point: 80800000 Mit "mkimage -l" prüfen: :: (base) hhoegl@msi:~/poky/build/tmp/deploy/images/beaglebone-yocto$ mkimage -l uImage Image Name: Linux kernel Created: Mon May 3 20:36:23 2021 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 7568576 Bytes = 7391.19 KiB = 7.22 MiB Load Address: 80800000 Entry Point: 80800000 Schauen Sie sich die Optionen von mkimage an. Dazu einfach ohne Argumente starten. Danach uImage in TFTP Verzeichnis kopieren:: $ sudo cp uImage /srv/tftp/ Kernel und Busybox konfigurieren (optional) ``````````````````````````````````````````` :: bitbake -c menuconfig virtual/kernel bitbake -c menuconfig busybox Root Filesystem ``````````````` Im Yocto Ausgabeverzeichnis ``poky/build/tmp/deploy/images/beaglebone-yocto/`` folgendes Kommando aufrufen:: sudo tar jxvf core-image-base-beaglebone-yocto.tar.bz2 -C /srv/bbb/rootfs/ Damit wird das Root Filesystem im NFS Ordner des Hostrechners entpackt. U-Boot Kommandos ```````````````` Doku: https://u-boot.readthedocs.io/en/latest :: => setenv ipaddr 192.168.178.107 # feste IP Adresse fuer BBB vergeben, oder ... => setenv netmask 255.255.255.0 => setenv autoload no; dhcp; # ... dynamische IP Adresse per DHCP holen => setenv serverip 192.168.178.111 # TFP/NFS Server (= Entwicklungsrechner) Kernel Kommandozeile => setenv bootargs console=ttyO0,115200 root=/dev/nfs nfsroot=192.168.178.111:/srv/bbb/rootfs rw ip=192.168.178.107 Siehe Kernel-Doku: Documentation/filesystems/nfs/nfsroot.txt Kernel holen per TFTP => tftp 0x82000000 192.168.178.111:uImage DTB holen per TFTP => tftp 0x88000000 192.168.178.111:am335x-boneblack.dtb Booten => bootm 0x82000000 - 0x88000000 XXX Aktuell noch ein Fehler: TFTP klappt, jedoch kann der Kernel das RootFS nicht mounten. Woran liegt es?