From 1d13e674d7be4bf9aa69139deac6737bf60af17b Mon Sep 17 00:00:00 2001 From: Manuel Traut Date: Wed, 1 Jul 2015 16:12:36 +0200 Subject: rework elbe training stuff to match current elbe also delete presentations that are completely outdated and rename presentations to better identify their content Signed-off-by: Manuel Traut --- distribution/elbe-adk/Kconfig | 5 + distribution/elbe-adk/Makefile | 1 + distribution/elbe-adk/mini.xml | 27 ++ distribution/elbe-adk/myapp/AUTHORS | 0 distribution/elbe-adk/myapp/ChangeLog | 0 distribution/elbe-adk/myapp/Makefile.am | 5 + distribution/elbe-adk/myapp/NEWS | 0 distribution/elbe-adk/myapp/README | 0 distribution/elbe-adk/myapp/autogen.sh | 2 + distribution/elbe-adk/myapp/configure.ac | 23 + distribution/elbe-adk/myapp/myapp.c | 12 + distribution/elbe-adk/myrepo/conf/distributions | 12 + distribution/elbe-adk/myrepo/conf/updates | 6 + distribution/elbe-adk/pres_elbe-adk_en.tex | 540 ++++++++++++++++++++++++ 14 files changed, 633 insertions(+) create mode 100644 distribution/elbe-adk/Kconfig create mode 100644 distribution/elbe-adk/Makefile create mode 100644 distribution/elbe-adk/mini.xml create mode 100644 distribution/elbe-adk/myapp/AUTHORS create mode 100644 distribution/elbe-adk/myapp/ChangeLog create mode 100644 distribution/elbe-adk/myapp/Makefile.am create mode 100644 distribution/elbe-adk/myapp/NEWS create mode 100644 distribution/elbe-adk/myapp/README create mode 100755 distribution/elbe-adk/myapp/autogen.sh create mode 100644 distribution/elbe-adk/myapp/configure.ac create mode 100644 distribution/elbe-adk/myapp/myapp.c create mode 100644 distribution/elbe-adk/myrepo/conf/distributions create mode 100644 distribution/elbe-adk/myrepo/conf/updates create mode 100644 distribution/elbe-adk/pres_elbe-adk_en.tex (limited to 'distribution/elbe-adk') diff --git a/distribution/elbe-adk/Kconfig b/distribution/elbe-adk/Kconfig new file mode 100644 index 0000000..e44a76b --- /dev/null +++ b/distribution/elbe-adk/Kconfig @@ -0,0 +1,5 @@ +config ELBE_ADK + bool "ELBE ADK" + default y + help + Example how to use the elbe adk diff --git a/distribution/elbe-adk/Makefile b/distribution/elbe-adk/Makefile new file mode 100644 index 0000000..f768656 --- /dev/null +++ b/distribution/elbe-adk/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ELBE_ADK) += pres_elbe-adk_en.pdf diff --git a/distribution/elbe-adk/mini.xml b/distribution/elbe-adk/mini.xml new file mode 100644 index 0000000..956ffc9 --- /dev/null +++ b/distribution/elbe-adk/mini.xml @@ -0,0 +1,27 @@ + + + mini xml + 1 + + optimal to use as buildenv + + armhf + + ftp.debian.org + /debian + http + + wheezy + + + mini + linutronix + foo + + + + bash + + + diff --git a/distribution/elbe-adk/myapp/AUTHORS b/distribution/elbe-adk/myapp/AUTHORS new file mode 100644 index 0000000..e69de29 diff --git a/distribution/elbe-adk/myapp/ChangeLog b/distribution/elbe-adk/myapp/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/distribution/elbe-adk/myapp/Makefile.am b/distribution/elbe-adk/myapp/Makefile.am new file mode 100644 index 0000000..73ff4e8 --- /dev/null +++ b/distribution/elbe-adk/myapp/Makefile.am @@ -0,0 +1,5 @@ +bin_PROGRAMS = myapp +myapp_SOURCES = myapp.c + +EXTRA_DIST = debian/changelog debian/compat debian/control debian/rules \ + debian/source/format diff --git a/distribution/elbe-adk/myapp/NEWS b/distribution/elbe-adk/myapp/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/distribution/elbe-adk/myapp/README b/distribution/elbe-adk/myapp/README new file mode 100644 index 0000000..e69de29 diff --git a/distribution/elbe-adk/myapp/autogen.sh b/distribution/elbe-adk/myapp/autogen.sh new file mode 100755 index 0000000..9088512 --- /dev/null +++ b/distribution/elbe-adk/myapp/autogen.sh @@ -0,0 +1,2 @@ +#!/bin/bash +autoreconf -sif diff --git a/distribution/elbe-adk/myapp/configure.ac b/distribution/elbe-adk/myapp/configure.ac new file mode 100644 index 0000000..109e8ea --- /dev/null +++ b/distribution/elbe-adk/myapp/configure.ac @@ -0,0 +1,23 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([myapp], [1.0], [manut@linutronix.de]) +AM_INIT_AUTOMAKE([-Wall -Werror]) +AC_CONFIG_SRCDIR([myapp.c]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. + +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. + +AC_CONFIG_FILES([Makefile]) + +AC_OUTPUT diff --git a/distribution/elbe-adk/myapp/myapp.c b/distribution/elbe-adk/myapp/myapp.c new file mode 100644 index 0000000..4e39438 --- /dev/null +++ b/distribution/elbe-adk/myapp/myapp.c @@ -0,0 +1,12 @@ +#include +#include + +int main (int argc, char **argv) +{ + while (1) { + printf ("Hello ELBE\n"); + sleep (1); + } + + return 0; +} diff --git a/distribution/elbe-adk/myrepo/conf/distributions b/distribution/elbe-adk/myrepo/conf/distributions new file mode 100644 index 0000000..9cd8d3b --- /dev/null +++ b/distribution/elbe-adk/myrepo/conf/distributions @@ -0,0 +1,12 @@ +Origin: myrepo +Label: myrepo +Suite: stable +Codename: wheezy +Update: - myremoterepo +Version: +Architectures: i386 amd64 armel source +Components: main +Description: my debian packages +DebIndices: Packages Release . .gz .bz2 +UDebIndices: Packages . .gz .bz2 +DscIndices: Sources Release .gz .bz2 diff --git a/distribution/elbe-adk/myrepo/conf/updates b/distribution/elbe-adk/myrepo/conf/updates new file mode 100644 index 0000000..e8df2b1 --- /dev/null +++ b/distribution/elbe-adk/myrepo/conf/updates @@ -0,0 +1,6 @@ +Name: myremoterepo +Method: http://localhost/myrepo +Components: main +Architectures: i386 amd64 source +VerifyRelease: blindtrust +IgnoreRelease: yes diff --git a/distribution/elbe-adk/pres_elbe-adk_en.tex b/distribution/elbe-adk/pres_elbe-adk_en.tex new file mode 100644 index 0000000..4e9fc1a --- /dev/null +++ b/distribution/elbe-adk/pres_elbe-adk_en.tex @@ -0,0 +1,540 @@ +\input{configpres} + +\title{ELBE ADK example} +\maketitle + +\subsection{What will be done?} + +\begin{frame} +\frametitle{Goal} +\begin{itemize} +\item generate an ELBE buildenv +\item generate a software component and manage it with debian tools +\item build own software component inside the ELBE buildenv +\item include own application in target RFS +\item define a stripped target RFS +\item setup a local debian mirror +\end{itemize} +\end{frame} + +\subsection{generate a buildenv} + +\begin{frame}[fragile] +\frametitle{use elbe-init.xml} +\begin{lstlisting} +$ cp /usr/share/doc/elbe-doc/examples/elbe-init.xml . +$ elbe init --directory=./initvm elbe-init.xml +$ cd initvm +$ make +$ make run-con +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{mini.xml} + \begin{lstlisting} + + mini xml + 1 + + optimal to use as buildenv + + armhf + + ftp.debian.org + /debian + http + + wheezy + + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{mini.xml} + \begin{lstlisting} + + mini + linutronix + foo + + + + bash + + + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{build mini.xml} +\begin{lstlisting} +$ elbe control create_project mini.xml +$ elbe control list_projects +$ elbe build /var/cache/elbe/... +\end{lstlisting} +\end{frame} + +\subsection{build an own application} + +\begin{frame}[fragile] +\frametitle{myapp.c} +\begin{lstlisting} +$ mkdir myapp +$ cd myapp +$ $EDITOR myapp.c +\end{lstlisting} +\begin{lstlisting} +#include +#include + +int main (int argc, char **argv) +{ + while (1) { + printf ("Hello ELBE\n"); + sleep (1); + } + + return 0; +} +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{use autotools} +\begin{lstlisting} +$ $EDITOR Makefile.am +\end{lstlisting} +\begin{lstlisting} +bin_PROGRAMS = myapp +myapp_SOURCES = myapp.c +\end{lstlisting} +\begin{lstlisting} +$ autoscan +$ mv configure.scan configure.ac +$ rm autoscan.log +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle {use autotools} +\begin{lstlisting} +$ $EDITOR configure.ac +\end{lstlisting} +\begin{verbatim} +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([myapp], [1.0], [manut@linutronix.de]) +AM_INIT_AUTOMAKE([-Wall -Werror]) +AC_CONFIG_SRCDIR([myapp.c]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. + +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. + +AC_CONFIG_FILES([Makefile]) + +AC_OUTPUT +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{use autotools} +\begin{lstlisting} +$ touch NEWS README AUTHORS ChangeLog +$ $EDITOR autogen.sh +\end{lstlisting} +\begin{lstlisting} +#!/bin/bash +automake --add-missing +autoreconf -sif +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{use autotools} +\begin{lstlisting} +$ chmod +x autogen.sh +$ ls -lh +insgesamt 12K +-rw-r--r-- 1 local local 0 Jan 7 09:45 AUTHORS +-rwxr-xr-x 1 local local 28 Jan 7 09:24 autogen.sh +-rw-r--r-- 1 local local 0 Jan 7 09:45 ChangeLog +-rw-r--r-- 1 local local 496 Jan 7 09:20 configure.ac +-rw-r--r-- 1 local local 35 Jan 7 09:35 Makefile.am +-rw-r--r-- 1 local local 143 Jan 7 09:18 myapp.c +-rw-r--r-- 1 local local 0 Jan 7 09:45 NEWS +-rw-r--r-- 1 local local 0 Jan 7 09:45 README +# these files may be added to your vcs +$ ./autogen.sh +$ ./configure +$ make +$ ./myapp +Hello ELBE +Hello ELBE +^C +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{debianize myapp} +\begin{lstlisting} +$ dh_make -n -p myapp_1.0 -e manut@linutronix.de +$ cd debian +$ rm *.ex *.EX docs README* copyright +$ $EDITOR changelog +\end{lstlisting} +\begin{lstlisting} +myapp (1.0) stable; urgency=low + + * Initial Release. + + -- Manuel Traut Tue, 07 Jan 2014 10:20:20 +0100 +\end{lstlisting} +\begin{lstlisting} +$ ls -lh +insgesamt 16K +-rw-r--r-- 1 local local 122 Jan 7 10:20 changelog +-rw-r--r-- 1 local local 2 Jan 7 10:20 compat +-rw-r--r-- 1 local local 517 Jan 7 10:20 control +-rwxr-xr-x 1 local local 135 Jan 7 10:20 rules +drwxr-xr-x 2 local local 19 Jan 7 10:20 source +# these files may be added to your vcs +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{debianize myapp} +\begin{lstlisting} +$ cd .. +$ $EDITOR Makefile.am +\end{lstlisting} +\begin{lstlisting} +bin_PROGRAMS = myapp +myapp_SOURCES = myapp.c + +EXTRA_DIST = debian/changelog debian/compat debian/control debian/rules \ + debian/source/format +\end{lstlisting} +\begin{lstlisting} +$ dpkg-buildpackage +$ ls .. +myapp myapp_1.0_i386.deb +myapp_1.0.dsc myapp_1.0.tar.gz +myapp_1.0_i386.changes +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{host myapp source in a debian repository} +\begin{lstlisting} +$ cd .. +$ mkdir -p myrepo/conf +$ cd myrepo +$ $EDITOR conf/distributions +\end{lstlisting} +\begin{verbatim} +Origin: myrepo +Label: myrepo +Suite: stable +Codename: wheezy +Update: - myremoterepo +Version: +Architectures: armhf source +Components: main +Description: my debian packages +\end{verbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{host myapp source in a debian repository} +\begin{lstlisting} +$ reprepro includedsc wheezy ../myapp_1.0.dsc +$ sudo mkdir /var/www/ +$ sudo rsync -av --exclude=db --exclude=conf * \ +/var/www/myrepo/ +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{build debian package inside the buildenv} +\begin{lstlisting} +# login to elbe-initvm +$ elbe initvm attach (login: root, password: root) +\end{lstlisting} +change into buildenv and configure apt to use myrepo +\begin{lstlisting} +$ elbe chroot /var/cache/elbe/... +$ echo 'deb-src http://10.0.2.2/myrepo wheezy main' >> /etc/apt/sources.list +$ apt-get update +\end{lstlisting} +retrive myapp source package and build armhf binary package +\begin{lstlisting} +$ apt-get source myapp +$ cd myapp-1.0 +$ ./autogen.sh +$ dpkg-buildpackage -b +\end{lstlisting} +copy the package to the host PC and install it into the buildenv +\begin{lstlisting} +$ scp ../myapp*.changes ../myapp*.deb 10.0.2.2:/tmp +$ dpkg -i ../myapp*.deb +$ myapp +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{add myapp armhf package to the repo} +\begin{lstlisting} +$ cd ../myrepo +$ reprepro include wheezy /tmp/myapp_1.0_armhf.changes +$ sudo rsync -av --exclude=db --exclude=conf * \ +/var/www/myrepo/ +\end{lstlisting} +\end{frame} + + +\subsection{include app in target RFS} + +\begin{frame}[fragile] +\frametitle{add repo including myapp} +\begin{lstlisting} +$ cd .. +$ $EDIT mini.xml +\end{lstlisting} +\begin{verbatim} +... + + ftp.debian.org + /debian + http + + + http://LOCALMACHINE/myrepo wheezy main + http://LOCALMACHINE/myrepo wheezy main + + + + +... +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{add myapp} +\begin{verbatim} +... + + mini + linutronix + foo + + var/cache/apt/archives/*.deb + + + bash + myapp + + + +\end{verbatim} +\end{frame} + +\subsection{define a striped target RFS} +\begin{frame}[fragile] +\frametitle{define sdcard image} +\begin{verbatim} +... + + mini + linutronix + foo + ttyAMA0,115200 + + + rootfs.tar.gz + + + + + my.img + 64MiB + + remain + + + + +... +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{create fstab and set elbe mode} +\begin{verbatim} +... + + + + + / + + ext2 + -i 0 + + + + + + +... +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{build and extract target as nfsroot} +\begin{lstlisting} +$ elbe control set_xml /var/cache/elbe/.. mini.xml +$ elbe control build /var/cache/elbe/.. +$ elbe list_files /var/cache/elbe/.. +$ elbe get_file /var/cache/elbe/.. elbe-report.txt +$ elbe get_file /var/cache/elbe/.. rootfs.tar.gz +\end{lstlisting} +hint: it is possible to generate a html page from the elbe-report.txt: +\begin{lstlisting} +$ asciidoc elbe-report.txt +\end{lstlisting} +host the nfs root filesystem +\begin{lstlisting} +$ sudo mkdir -p /nfs/elbe-armhf +$ sudo tar xzf rootfs.tar.gz -C /nfs/elbe-armhf +$ su -c \ +'echo "/nfs *(rw,sync,no_subtree_check,insecure) \ +>> /etc/exports"' +$ sudo /etc/init.d/nfs-kernel-server restart +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{build current kernel for qemu armhf boot} +\begin{verbatim} +$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux +$ cd linux +$ mkdir ../linux-qemu-arm +$ ARCH=arm CROSS_COMPILE=arm-none-eabi- make O=../linux-qemu-arm versatile_defconfig +$ # enable Kernel Features / Use the ARM EABI to compile the kernel +$ # Allow old ABI binaries to run with this kernel +$ # Networking support / Networking options / TCP/IP networking / +$ # IP: kernel level autoconfiguration / IP: DHCP Support +$ ARCH=arm CROSS_COMPILE=arm-none-eabi- make O=../linux-qemu-arm menuconfig +$ ARCH=arm CROSS_COMPILE=arm-none-eabi- make O=../linux-qemu-arm -j5 +$ cd .. +\end{verbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{boot nfsroot with qemu} +\begin{lstlisting} +qemu-system-arm -M versatilepb -no-reboot \ + -m 256 -usb \ + -kernel linux-qemu-arm/arch/arm/boot/zImage \ + -append 'root=/dev/nfs nfsroot=10.0.2.2:/nfs/elbe-armhf + ip=dhcp init=/usr/bin/myapp' +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{strip the nfsroot} +\begin{verbatim} +$ sudo rm -rf /nfs/elbe-armhf/etc +$ sudo rm -rf /nfs/elbe-armhf/sbin +$ sudo rm -rf /nfs/elbe-armhf/var +$ sudo rm -rf /nfs/elbe-armhf/usr/share +$ sudo rm -rf /nfs/elbe-armhf/usr/lib +$ sudo rm -rf /nfs/elbe-armhf/usr/sbin +$ sudo cp /nfs/elbe-armhf/usr/bin/myapp . +$ sudo rm -rf /nfs/elbe-armhf/usr/bin/* +$ sudo mv myapp /nfs/elbe-armhf/usr/bin/ +$ sudo cp -a /nfs/elbe-armhf/lib/arm-linux-gnueabi/ld-* . +$ sudo cp -a /nfs/elbe-armhf/lib/arm-linux-gnueabi/libc-2.13.so . +$ sudo cp -a /nfs/elbe-armhf/lib/arm-linux-gnueabi/libc.so.6 . +$ sudo rm /nfs/elbe-armhf/lib/arm-linux-gnueabi/* +$ sudo mv libc-2.13.so /nfs/elbe-armhf/lib/arm-linux-gnueabi/ +$ sudo mv libc.so.6 /nfs/elbe-armhf/lib/arm-linux-gnueabi/ +$ sudo mv ld-* /nfs/elbe-armhf/lib/arm-linux-gnueabi/ +\end{verbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{update the ELBE XML file} +\begin{verbatim} +$ sudo mkdir /nfs/elbe-armhf-orig +$ sudo tar xzf rootfs.tar.gz -C /nfs/elbe-armhf-orig/ +$ elbe pkgdiff +$ sudo elbe diff /nfs/elbe-armhf-orig /nfs/elbe-armhf > diff.txt +$ cd .. +\end{verbatim} +\begin{verbatim} +$ vim mini.xml +$ # place cursor in finetuning section +$ :read target/diff.txt +$ # remove everything until 'suggesting:' +$ :x +\end{verbatim} +\begin{verbatim} +$ elbe create --directory=target-stripped mini.xml +$ cd target-stripped +$ make +$ # get debian kernel and initrd from the buildenv: +$ make .elbe-vm/vmkernel .elbe-vm/vminitrd +$ # boot the image +$ qemu-system-arm -M versatilepb \ +-kernel .elbe-vm/vmkernel -initrd .elbe-vm/vminitrd \ +-append 'root=/dev/sda1 init=/usr/bin/myapp' my.img +\end{verbatim} +\end{frame} + +\subsection{setup own debian mirror} + +\begin{frame}[fragile] +\frametitle{partial clone a remote debian mirror} +\begin{lstlisting} +$ mkdir -p /mirrors/debian +$ cd debian +$ debmirror -p -d wheezy, -a i386,amd64,armhf \ + --di-dist=wheezy \ + --method=http --no-check-gpg \ + -h ftp.de.debian.org . +$ cd /var/www/html +$ ln -s /mirrors/debian +\end{lstlisting} +\end{frame} + +\subsection{Conclusion} +\begin{frame} +\begin{itemize} +\item generate an ELBE buildenv with a minimal XML file +\item manage software components with autotools, dpkg and reprepro +\item build own software component inside the ELBE buildenv +\item include own debian packages in the target RFS +\item edit a running rootfs and make it reproducable +\item setup a partial, local debian mirror +\end{itemize} +\end{frame} + +\input{tailpres} -- cgit v1.2.3