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/Kconfig | 8 +- 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 ++++++++++++++++++ distribution/elbe-commands/Kconfig | 5 + distribution/elbe-commands/Makefile | 1 + .../elbe-commands/pres_elbe-commands_en.tex | 257 +++++++++ distribution/elbe-devel/Kconfig | 5 - distribution/elbe-example/Kconfig | 5 - distribution/elbe-example/Makefile | 1 - distribution/elbe-example/mini.xml | 27 - distribution/elbe-example/myapp/AUTHORS | 0 distribution/elbe-example/myapp/ChangeLog | 0 distribution/elbe-example/myapp/Makefile.am | 5 - distribution/elbe-example/myapp/NEWS | 0 distribution/elbe-example/myapp/README | 0 distribution/elbe-example/myapp/autogen.sh | 2 - distribution/elbe-example/myapp/configure.ac | 23 - distribution/elbe-example/myapp/myapp.c | 12 - .../elbe-example/myrepo/conf/distributions | 12 - distribution/elbe-example/myrepo/conf/updates | 6 - distribution/elbe-example/pres_elbe-example_en.tex | 540 ------------------ distribution/elbe-internals/Kconfig | 5 - distribution/elbe-internals/Makefile | 1 - distribution/elbe-internals/pres_elbe-devel_en.tex | 602 --------------------- distribution/elbe-marketing/Kconfig | 5 + distribution/elbe-marketing/Makefile | 1 + distribution/elbe-marketing/elbe-logo.png | Bin 0 -> 9018 bytes .../elbe-marketing/pres_elbe-marketing.tex | 106 ++++ .../elbe-overview/pres_elbe-overview_en.tex | 38 +- distribution/elbe-usage/Kconfig | 5 - distribution/elbe-usage/Makefile | 1 - distribution/elbe-usage/pres_elbe-usage_en.tex | 550 ------------------- distribution/elbe/Kconfig | 5 - distribution/elbe/Makefile | 1 - distribution/elbe/elbe-logo.png | Bin 9018 -> 0 bytes distribution/elbe/pres_elbe.tex | 106 ---- 48 files changed, 1022 insertions(+), 1946 deletions(-) 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 create mode 100644 distribution/elbe-commands/Kconfig create mode 100644 distribution/elbe-commands/Makefile create mode 100644 distribution/elbe-commands/pres_elbe-commands_en.tex delete mode 100644 distribution/elbe-devel/Kconfig delete mode 100644 distribution/elbe-example/Kconfig delete mode 100644 distribution/elbe-example/Makefile delete mode 100644 distribution/elbe-example/mini.xml delete mode 100644 distribution/elbe-example/myapp/AUTHORS delete mode 100644 distribution/elbe-example/myapp/ChangeLog delete mode 100644 distribution/elbe-example/myapp/Makefile.am delete mode 100644 distribution/elbe-example/myapp/NEWS delete mode 100644 distribution/elbe-example/myapp/README delete mode 100755 distribution/elbe-example/myapp/autogen.sh delete mode 100644 distribution/elbe-example/myapp/configure.ac delete mode 100644 distribution/elbe-example/myapp/myapp.c delete mode 100644 distribution/elbe-example/myrepo/conf/distributions delete mode 100644 distribution/elbe-example/myrepo/conf/updates delete mode 100644 distribution/elbe-example/pres_elbe-example_en.tex delete mode 100644 distribution/elbe-internals/Kconfig delete mode 100644 distribution/elbe-internals/Makefile delete mode 100644 distribution/elbe-internals/pres_elbe-devel_en.tex create mode 100644 distribution/elbe-marketing/Kconfig create mode 100644 distribution/elbe-marketing/Makefile create mode 100644 distribution/elbe-marketing/elbe-logo.png create mode 100644 distribution/elbe-marketing/pres_elbe-marketing.tex delete mode 100644 distribution/elbe-usage/Kconfig delete mode 100644 distribution/elbe-usage/Makefile delete mode 100644 distribution/elbe-usage/pres_elbe-usage_en.tex delete mode 100644 distribution/elbe/Kconfig delete mode 100644 distribution/elbe/Makefile delete mode 100644 distribution/elbe/elbe-logo.png delete mode 100644 distribution/elbe/pres_elbe.tex (limited to 'distribution') diff --git a/distribution/Kconfig b/distribution/Kconfig index 9ad9518..1cc108e 100644 --- a/distribution/Kconfig +++ b/distribution/Kconfig @@ -2,12 +2,10 @@ menuconfig ELBE bool "Elbe build system" if ELBE - source "distribution/elbe-devel/Kconfig" - source "distribution/elbe-usage/Kconfig" + source "distribution/elbe-commands/Kconfig" source "distribution/debian/Kconfig" - source "distribution/elbe/Kconfig" - source "distribution/elbe-internals/Kconfig" - source "distribution/elbe-example/Kconfig" + source "distribution/elbe-marketing/Kconfig" + source "distribution/elbe-adk/Kconfig" source "distribution/elbe-overview/Kconfig" endif 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} diff --git a/distribution/elbe-commands/Kconfig b/distribution/elbe-commands/Kconfig new file mode 100644 index 0000000..4214f92 --- /dev/null +++ b/distribution/elbe-commands/Kconfig @@ -0,0 +1,5 @@ +config ELBE_COMMANDS + bool "ELBE subcommand overview" + default y + help + Papers about ELBE usage diff --git a/distribution/elbe-commands/Makefile b/distribution/elbe-commands/Makefile new file mode 100644 index 0000000..3d44c95 --- /dev/null +++ b/distribution/elbe-commands/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ELBE_COMMANDS) += pres_elbe-commands_en.pdf diff --git a/distribution/elbe-commands/pres_elbe-commands_en.tex b/distribution/elbe-commands/pres_elbe-commands_en.tex new file mode 100644 index 0000000..4a91e4f --- /dev/null +++ b/distribution/elbe-commands/pres_elbe-commands_en.tex @@ -0,0 +1,257 @@ +\input{configpres} + +\title{ELBE - subcommands} +\maketitle + +\subsection{ELBE commands} + +\begin{frame} +\frametitle{Documentation} +\begin{itemize} +\item Have a look at /usr/share/doc/elbe/ +\item Please read /usr/share/doc/elbe/elbeoverview-en.html +\item There are man pages e.g. 'man elbe', 'man elbe-control', \dots +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{create project} +Create a new project: +\begin{verbatim} +$ elbe initvm create \ + --directory /home/user/elbe-initvm +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{attach/start initvm} +attach to running vm: +\begin{verbatim} +$ elbe initvm attach +\end{verbatim} +start the vm (e.g. after host PC reboot): +\begin{verbatim} +$ cd /home/user/elbe-initvm +$ elbe initvm start +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{start build} +\begin{verbatim} +$ cp /usr/share/doc/elbe-doc/examples/bbb-jessie.xml.gz . +$ gunzip bbb-jessie.xml.gz +$ elbe initvm submit --build-bin --build-sources bbb-jessie.xml +Build started, waiting till it finishes +project still busy, waiting +project still busy, waiting +... +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{generated files} +\begin{verbatim} +$ ls elbe-build-$DATE +bin-cdrom.iso +elbe-report.txt +log.txt +licence.txt +sdcard.img +source.xml +src-cdrom.iso +validation.txt +\end{verbatim} +\end{frame} + +\begin{frame} +\frametitle{bin-cdrom.iso} +\begin{itemize} +\item ISO image that contains all used binary debian packages +\item it is only created if the --build-bin switch was provided at elbe initvm submit +\item a rebuild of the initvm and target image can be done with this cdrom and + without a connection to a debian repository. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{elbe-report.txt} +\begin{itemize} +\item elbe report containing informations about used packages, finetuning, etc +\item 'asciidoc elbe-report.txt' generates a html file +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{log.txt} +\begin{itemize} +\item logfile from the image build process in asciidoc format +\item 'asciidoc log.txt' generates a html file +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{licence.txt} +\begin{itemize} +\item contains the licence text of all used debian packages +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{sdcard.img} +\begin{itemize} +\item Images or archives containing the target RFS +\item The 'target' section in the XML file describes which image and archive + files are created; the 'fstab' section describes their content. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{source.xml} +\begin{itemize} +\item based on the XML file given to 'elbe create' +\item added a 'fullpkgs' section containing informations about all installed + packages and their version +\item added a 'sources\_list' section that contains the used mirrors +\item added a 'apt\_prefs' section that contains the pinning settings +\item added a 'elbe\_version' section that contains the version number of + the elbe tool that generated the file +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{src-cdrom.iso} +\begin{itemize} +\item ISO image that contains all used source debian packages +\item it is only created if the --build-source switch was provided at elbe initvm submit +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{validation.txt} +\begin{itemize} +\item if elbe create was called with a XML file containing a 'fullpkgs' section + the file contains informations if a package version differs +\item if a package in the 'pkg-list' was not found on one of the mirrors this + will be logged in this file +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-setsel usage} +\begin{enumerate} +\item Create package list: +\begin{verbatim} +# remove all pkgs not wanted on the target +target$ dpkg --purge vim-nox libxml2-dev +# export installed package list +target$ dpkg --get-selections > selections.list +# copy list to hostpc +target$ scp selections.list YOURPC:/tmp +\end{verbatim} +\item Import the package list to your xml file: +\begin{verbatim} +hostpc$ elbe setsel rfs.xml /tmp/selections.list +\end{verbatim} +\end{enumerate} +\end{frame} + +\begin{frame}[fragile] +\frametitle{initvm and target image build from a binary CDROM} +\begin{verbatim} +$ elbe initvm create --directory=elbe-from-cd \ + elbe/elbe-build-$DATE/bin-cdrom.iso +\end{verbatim} +This command builds an initvm and the target image without using 'http' +repositories. +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-chg\_archive} +It is possible to include an archive into the xml file, that is unpacked into +the target RFS before and after the finetuning step: +\begin{verbatim} +$ mkdir archive/testd +$ cd archive +$ echo 'port = 1234' > archive/testd/myconfig +$ sudo tar cjf ../archive.tar.bz2 * +$ cd .. +$ elbe chg_archive archive.tar.bz2 +\end{verbatim} +NOTE: The file must be a bzip2 compressed tar (.tar.bz2) + +Take care on access right and owners of the files. +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-get\_archive} +It is also possible to extract an archive from an XML file: +\begin{verbatim} +$ elbe get_archive +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-show} +The elbe show command prints out some textual information about an +ELBE xml file: +\begin{verbatim} +$ elbe show --verbose arm-example.xml +== arm-example.xml: ARMexample - version 08.15 == +Debian suite: wheezy/armel +[...] +\end{verbatim} +The '--verbose' parameter shows more informations, like the complete package +list. +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-checkupdates} +Use a source.xml file to check if there are updates available for an existing +image: +\begin{verbatim} +$ elbe check_updates source.xml +checking /home/user/rfs/build-release/source.xml +armel +Reading package lists... Done +Building dependency tree... Done +Reading package lists... Done +Building dependency tree... Done +adduser 3.113+nmu1 != 3.113+nmu3 +1 updates required +\end{verbatim} +This can be used e.g. as cronjob to get notifications if updates are availabe. + +Than the person responsible for updates can decide what needs to be done. +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-diff} +compares to RFS trees and suggests commands to update the archive tar and a +'finetuning' section: +\begin{verbatim} +$ sudo elbe diff rfs rfs-modified +suggesting: + +/etc/init.d/mountall-bootclean.sh +/etc/init.d/bootmisc.sh +tar rf archive.tar -C build/rfs /sbin/dhclient-script +tar rf archive.tar -C build/rfs /etc/init.d/mountfstab.sh +\end{verbatim} +This can be used if a (nfsroot) filesystem was modified and these modifications +should be included in an ELBE XML file. +\end{frame} + +\begin{frame}[fragile] +\frametitle{elbe-pkgdiff} +compares to RFS trees and displays the difference of the installed packages +\begin{verbatim} +$ sudo elbe pkgdiff `pwd`/rfs `pwd`/rfs-modified +-firmware-ivtv +-firmware-ipw2x00 +\end{verbatim} +This can be used if a (nfsroot) filesystem was modified and these modifications +should be included in an ELBE XML file. +\end{frame} + +\input{tailpres} diff --git a/distribution/elbe-devel/Kconfig b/distribution/elbe-devel/Kconfig deleted file mode 100644 index 59cde6d..0000000 --- a/distribution/elbe-devel/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config ELBE_DEVEL - bool "ELBE development papers" - default y - help - Papers about ELBE development diff --git a/distribution/elbe-example/Kconfig b/distribution/elbe-example/Kconfig deleted file mode 100644 index e70c6d1..0000000 --- a/distribution/elbe-example/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config ELBE_EXAMPLE - bool "ELBE example" - default y - help - Example project for ELBE diff --git a/distribution/elbe-example/Makefile b/distribution/elbe-example/Makefile deleted file mode 100644 index 26f94cc..0000000 --- a/distribution/elbe-example/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-$(CONFIG_ELBE_EXAMPLE) += pres_elbe-example_en.pdf diff --git a/distribution/elbe-example/mini.xml b/distribution/elbe-example/mini.xml deleted file mode 100644 index 956ffc9..0000000 --- a/distribution/elbe-example/mini.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - mini xml - 1 - - optimal to use as buildenv - - armhf - - ftp.debian.org - /debian - http - - wheezy - - - mini - linutronix - foo - - - - bash - - - diff --git a/distribution/elbe-example/myapp/AUTHORS b/distribution/elbe-example/myapp/AUTHORS deleted file mode 100644 index e69de29..0000000 diff --git a/distribution/elbe-example/myapp/ChangeLog b/distribution/elbe-example/myapp/ChangeLog deleted file mode 100644 index e69de29..0000000 diff --git a/distribution/elbe-example/myapp/Makefile.am b/distribution/elbe-example/myapp/Makefile.am deleted file mode 100644 index 73ff4e8..0000000 --- a/distribution/elbe-example/myapp/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -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-example/myapp/NEWS b/distribution/elbe-example/myapp/NEWS deleted file mode 100644 index e69de29..0000000 diff --git a/distribution/elbe-example/myapp/README b/distribution/elbe-example/myapp/README deleted file mode 100644 index e69de29..0000000 diff --git a/distribution/elbe-example/myapp/autogen.sh b/distribution/elbe-example/myapp/autogen.sh deleted file mode 100755 index 9088512..0000000 --- a/distribution/elbe-example/myapp/autogen.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -autoreconf -sif diff --git a/distribution/elbe-example/myapp/configure.ac b/distribution/elbe-example/myapp/configure.ac deleted file mode 100644 index 109e8ea..0000000 --- a/distribution/elbe-example/myapp/configure.ac +++ /dev/null @@ -1,23 +0,0 @@ -# -*- 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-example/myapp/myapp.c b/distribution/elbe-example/myapp/myapp.c deleted file mode 100644 index 4e39438..0000000 --- a/distribution/elbe-example/myapp/myapp.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include - -int main (int argc, char **argv) -{ - while (1) { - printf ("Hello ELBE\n"); - sleep (1); - } - - return 0; -} diff --git a/distribution/elbe-example/myrepo/conf/distributions b/distribution/elbe-example/myrepo/conf/distributions deleted file mode 100644 index 9cd8d3b..0000000 --- a/distribution/elbe-example/myrepo/conf/distributions +++ /dev/null @@ -1,12 +0,0 @@ -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-example/myrepo/conf/updates b/distribution/elbe-example/myrepo/conf/updates deleted file mode 100644 index e8df2b1..0000000 --- a/distribution/elbe-example/myrepo/conf/updates +++ /dev/null @@ -1,6 +0,0 @@ -Name: myremoterepo -Method: http://localhost/myrepo -Components: main -Architectures: i386 amd64 source -VerifyRelease: blindtrust -IgnoreRelease: yes diff --git a/distribution/elbe-example/pres_elbe-example_en.tex b/distribution/elbe-example/pres_elbe-example_en.tex deleted file mode 100644 index dd39b24..0000000 --- a/distribution/elbe-example/pres_elbe-example_en.tex +++ /dev/null @@ -1,540 +0,0 @@ -\input{configpres} - -\title{ELBE 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 -$ make run-con -\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} diff --git a/distribution/elbe-internals/Kconfig b/distribution/elbe-internals/Kconfig deleted file mode 100644 index 7ff8e67..0000000 --- a/distribution/elbe-internals/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config ELBE_INTERNALS - bool "Internal information about ELBE" - default y - help - Internal information and technical details about ELBE diff --git a/distribution/elbe-internals/Makefile b/distribution/elbe-internals/Makefile deleted file mode 100644 index 3649901..0000000 --- a/distribution/elbe-internals/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-$(CONFIG_ELBE_INTERNALS) += pres_elbe-devel_en.pdf diff --git a/distribution/elbe-internals/pres_elbe-devel_en.tex b/distribution/elbe-internals/pres_elbe-devel_en.tex deleted file mode 100644 index c57ad47..0000000 --- a/distribution/elbe-internals/pres_elbe-devel_en.tex +++ /dev/null @@ -1,602 +0,0 @@ -\input{configpres} - -\lstset{language=bash} - -\title{ELBE internals} -\maketitle - - -\subsection{source repository} - -\begin{frame}[fragile] -\frametitle{source tree} - -ELBE development is hosted on github: -\begin{lstlisting} -https://github.com/Linutronix/elbe -\end{lstlisting} - -Use git to retrieve the source: -\begin{lstlisting} -git clone git://github.com/Linutronix/elbe.git -\end{lstlisting} - -\begin{lstlisting} -. -|-- debian/ # debian packaging -|-- docs/ # man pages, dia files, overview -|-- elbe # python script calling several scripts from ./elbepack -|-- elbepack/ # implementation of elbe subcommands like 'create' -| |-- mako/ # script and config file templates for the buildenv -|-- examples/ # example XML files -|-- Makefile # calls dpkg-buildpackage to generate a debian package -|-- README # short introduction to ELBE -+-- setup.py # python typical setup script -\end{lstlisting} - -\end{frame} - -\subsection{elbepack/create.py} - -\begin{frame} -\frametitle{create an elbe project} -\begin{itemize} -\item the 'elbe create' command is implemented - -at elbepack/create.py -\item create.py has one mandotary parameter: - -path and name of an elbe xml file -\item create.py accepts optional parameters - -that are parsed by OptionParser -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{xml validation} -\begin{itemize} -\item verifies given xml file against elbepack/dbsfed.xsd -\item we try to do as much checks as posible with the schema -\item normaly there are no further checks inside the python code -\item validation can be skipped by --skip-validation parameter -\item elbepack/validate.py is used to verify the schema -\item elbepack/validate.py can be also called directly: - -'elbe validate examples/amd64-example.xml' -\item elbepack/validate.py uses etree from lxml - -to verify the schema -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{create build directory} -\begin{itemize} -\item creates a directory named 'build' - -at the current working directory -\item name can be overridden by --directory parameter -\item the buildenvironment will be created inside this directory -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{the debian-installer (d-i)} -\begin{itemize} -\item the d-i needs a running linux system -\item the debian project distributes the d-i in different packages: - e.g. as a bootable cd or for use with pxeboot -\item all packages include at least -\begin{itemize} -\item one Linux kernel binary -\item and an initial ramdisk with a minimal rfs and the d-i application -\end{itemize} -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{d-i common use} -\begin{itemize} -\item d-i is started on the system debian should be installed on -\item d-i does -\begin{itemize} -\item disk detection / partitioning -\item sw installation -\item system configuration -\end{itemize} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe kinitrd packages} -\begin{itemize} -\item the elbe project has packaged the d-i used by elbe as binary debian packages -\begin{lstlisting} -elbe-bootstrap_0.1_armel -|- opt -| +-elbe -| +-initrd -| +-initrd-cdrom.gz -| +-initrd.gz -| +-vmlinuz -\end{lstlisting} -\item the name of the debian package is specified by the 'kinitrd' tag inside the - xml file -\item current packages are called elbe-bootstrap and are available at the debian -repository: -\begin{lstlisting} -deb http://debian.linutronix.de/elbe wheezy main -\end{lstlisting} -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{retrieve kinitrd} -\begin{itemize} -\item elbepack/pkgutils.py:copy\_kinitrd() - -is called by elbepack/create.py -\item the pkgutils module uses python virtapt - -to retrieve the kinitrd package - -from a mirror or cdrom specified in the xml file -\item virtapt takes care on using - -the correct debian architecture and suite -\item the kinitrd package will be extracted - -and copied to the build directory -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{mako} -Mako is a template library written in Python. - -It can be used to generate files from templates. - -It is normally used to generate webpages. - -Documentation and more informations can be found on -\begin{lstlisting} -http://www.makotemplates.org/ -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{create Makefile, scripts and config files} -ELBE uses -\begin{lstlisting} -d = {"opt": opt, - "xml": xml, - "prj": xml.node("/project"), - "tgt": xml.node("/target"), - "pkgs": xml.node("/target/pkg-list"), - "fine": xml.node("/finetuning"), - "preseed": get_preseed(xml) } -... -mako.Template(filename=fname).render(**d) -\end{lstlisting} -to insert several values from the XML file into scripts and configfiles. -\begin{description} -\item[fname] the function is called for each *.mako file in elbepack/mako -\item[d] refers to several lxml.etree XML nodes -\item[xml] is a etree initialized with the ELBE XML file -\end{description} -\end{frame} - -\begin{frame}[fragile] -\frametitle{create Makefile, scripts and config files} -For example a simple txt file including all package names defined in the -$\langle$pkg-list$\rangle$ tag can be created by (pkg-list.mako): -\begin{lstlisting} -% for n in pkgs: -% if n.tag == "pkg": -${n.et.text} -% endif -% endfor -\end{lstlisting} -\end{frame} - - -\begin{frame} -\frametitle{preseeding} -Preseeding provides a way to set answers to questions asked during the -installation process, without having to manually enter the answers while -the installation is running. -\end{frame} - -\begin{frame} -\frametitle{preseeding} -Many pre-seeding rules are generated - -from the XML file with mako: - -./elbepack/mako/common.cfg.mako -\end{frame} - -\begin{frame}[fragile] -\frametitle{preseeding} -Project specific preseeding rules can be added to the xml file. -These rules are then included by ./elbepack/mako/custom-preseed.cfg.mako -\end{frame} - - -\subsection{Makefile (pre-install)} - -\begin{frame} -\frametitle{initrd.gz modification} -\begin{itemize} -\item a directory tmp-tree is created -\item all files and scripts needed inside the installer - -are copied to the tmp-tree -\item ungzip the original initrd.gz -\item use cpio to append all files of tmp-tree - -to the unzipped initrd image -\item gzip the new initrd image and remove the tmp-tree -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{create buildenv.img} -\begin{itemize} -\item qemu-img is used to create a buildenv.img file. This file will be used as -harddisk of the emulated virtual machine. -\item The debian-installer will install - -a full featured debian on this image. -\item After the debian-installer was active, - -this image can be used as a virtual build-environment. -\item The target rootfilesystem is normally - -just a subset of this image. -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{start emulator} -\begin{itemize} -\item the cmdline to start the emulator depends on several specifications made -in the XML file: -\begin{lstlisting} -.. - ${prj.text("buildimage/interpreter")} \ - -M ${prj.text("buildimage/machine")} \ - -drive file=buildenv.img,if=${hd_type},bus=1,unit=0 \ -% if prj.has("mirror/cdrom"): - -drive file=${prj.text("mirror/cdrom")},if=${cdrom_type},media=cdrom,bus=1,unit=1 \ -% endif - -kernel vmlinuz \ - -initrd initrd-preseeded.gz \ - -append 'root=/dev/${hd_name} debconf_priority=critical console=${prj.text("buildimage/console")} DEBIAN_FRONTEND=newt' \ - -no-reboot \ - -net nic,vlan=1,model=${prj.text("buildimage/NIC/model")},macaddr="${prj.text('buildimage/NIC/MAC')}" \ - -net user,vlan=1 \ - -m $(MEMSIZE) \ - -usb && reset -.. -\end{lstlisting} -\end{itemize} -\end{frame} - -\subsection{debian-installer in emulator} - -\begin{frame} -\frametitle{an ordinary debian installation} -runs inside the virtual machine: -\begin{itemize} -\item the buildenv.img will be partitionated and formated -\item the root partition will be mounted at - -/target inside the debian-installer rfs -\item a minimal rootfilesystem will be installed to /target -\item a chroot /target will be executed -\item all packages will be installed and configured -\item the /target chroot will be left -\item the preseed hook - -d-i preseed/late\_command string /post-inst.sh - -will be executed -\end{itemize} -\end{frame} - - -\begin{frame} -\frametitle{post-inst.sh} -\begin{description} -\item [cp-scipts-into-buildenv.sh] copy all (generated) scripts - -from the initrd (/) - -to the buildenv.img (/target/opt/elbe) - -\item [changeroot-into-buildenv.sh] chroot into /target again, - -trigger target (/opt/elbe/create-target-rfs.sh) - -and cdrom (/opt/elbe/mkcdrom.sh) generation. -\end{description} -\end{frame} - -\begin{frame} -\frametitle{target generation (overview)} -\begin{itemize} -\item generate file and pkg lists -\item create /target tree -\item call dump.py to -\begin{itemize} - \item validate packages / write logfile - \item add fullpkgs list to source.xml - \item add content of /etc/apt/sources.list to source.xml - \item add content of /etc/apt/preferences to source.xml - \item modify /target tree with finetuning.sh -\end{itemize} -\item generate licence information file -\item call part-target.sh to generate images from /target tree -\item (optional) generate cpio images and tarballs -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{create /target tree} -\begin{itemize} -\item depending on the ELBE mode, the filelist is generated. - -E.g. in normal mode: -\begin{lstlisting} -ls -A1 / | \ - grep -v target | grep -v proc | grep -v sys | \ - xargs find >> /opt/elbe/filelist -\end{lstlisting} -\item all files specified to be stored on the target rfs are copied: -\begin{lstlisting} -rsync -a --files-from=/opt/elbe/filelist / /target -\end{lstlisting} -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{dump.py - check if all req. packages are installed} -\begin{itemize} -\item add lines about missing packages to validation.txt: -\begin{lstlisting} - for name in [p.et.text for p in pkgs] + [kinitrd]: - - if not name in cache: - elog.printo( "- package %s does not exist" % name ) - errors += 1 - continue - - cp = cache[name] - - if not cp.installed and name != kinitrd: - elog.printo( "- package %s is not installed" % name ) - errors += 1 - continue -\end{lstlisting} -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{dump.py - check version of packages used} -(only done if a fullpkgs tag was specified in the xml file) -\begin{itemize} -\item add lines about packages with wrong version to validation.txt: -\begin{lstlisting} - for p in fullpkgs: - name = p.et.text - ver = p.et.get('version') - md5 = p.et.get('md5') - pindex[name] = p - ... - if cpi.version != ver: - elog.printo("pack %s v%s != installed v%s" % (name, ver, cpi.version)) - errors += 1 - continue - - if cpi.md5 != md5: - elog.printo("pack %s md5 %s != installed md5 %s" % (name, md5, cpi.md5) ) - errors += 1 - ... -\end{lstlisting} -\item there is also a check for packages that are installed but wasn't specified to be installed -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{dump.py - write fullpkglist to source.xml} -\begin{itemize} -\item all used packages are listed in the source.xml file - -(including version and md5sum): -\begin{lstlisting} - paktree = xml.ensure_child( 'fullpkgs' ) - paktree.clear() - pkgs = [] - for p in cache: - if p.is_installed: - pkgs.append( (p.name, p.installed.version, p.is_auto_installed, p.installed.md5)) - ... - for p in pkgs: - append_pkg_elem( paktree, p[0], p[1], p[2], p[3] ) -\end{lstlisting} -\end{itemize} -\end{frame} - - -\begin{frame} -\frametitle{dump.py - modify /target tree with finetuning.sh} -\begin{itemize} -\item the script is executed from /target. - - So files can be copied - - from the debian rfs to the target rfs - - by e.g. 'cp /etc/passwd etc/' - -\item the output of the finetuning.sh commands is appended to elbe-report.txt -\end{itemize} -\end{frame} - - -\begin{frame} -\frametitle{dump.py - filelist generation} -elbe-report.txt includes a filelist that indicates each file in the target rfs -and its origin -\begin{itemize} -\item a time stamp is recorded before and after finetuning. -\item files that show up with a modification time in that period - -can be identified as modified/created by finetuning.sh -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{generate licence information file} -all licence informations that are stored in /usr/share/* are collected in one file: -\begin{lstlisting} -find /usr/share/doc -name copyright -exec \ - /opt/elbe/print_licence.sh {} \; >> /opt/elbe/licence.txt -\end{lstlisting} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{call part-target.sh to copy /target tree to (different) images} -currently only UBI image support is functional. - -HD images are under development. They will be created by using python bindings -of libparted and loopback mounts. -\end{frame} - - -\begin{frame}[fragile] -\frametitle{build ubifs images} -\begin{itemize} -\item mkfs.ubifs -r is used to generate a ubifs image - -from a subdirectory -\item the name of the images is defined - -by the label in the fstab tag -\item the image defined first in the fstab is created first -\item the files copied to an image - -are moved temporarily away from /target: -\begin{lstlisting} - /mountA/mountB # mountA shouldn't include files like mountB/test -\end{lstlisting} -\item /target is restored as all images were created -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{(optional) generate cpio images and tarballs} -\begin{lstlisting} -% if xml.has("target/package/tar"): -tar cf /opt/elbe/target.tar -C /target . -% endif - -% if xml.has("target/package/cpio"): -cd /target -find . -print | cpio -ov -H newc >/opt/elbe/target.cpio -% endif -\end{lstlisting} -\end{frame} - - -\begin{frame} -\frametitle{binary cdrom generation} -An ISO CD image will be created: -\begin{itemize} -\item CD should contain all packages - -needed to reproduce the current ELBE run -\item the kinitrd package is installed into the buildenv - -to get it added to the cdrom like all other packages -\item CD needs to be in a debian repository format - -otherwise it won't be accepted by d-i -\item reprepo and genisoimage is used to create the CD -\end{itemize} -\end{frame} - - -\begin{frame}[fragile] -\frametitle{source cdrom generation} -upon request (by 'elbe create --build-source') - -an ISO image containing all debian source packages is created: -\begin{lstlisting} -% if opt.buildsources: - mkdir -p /opt/elbe/source - dpkg --get-selections | awk '{print $1}' > /opt/elbe/pkg-list.actual - cd /opt/elbe/source - awk '{print "apt-get -d source "$1}' /opt/elbe/pkg-list.actual | sh - cd /opt/elbe - dpkg-scansources source /dev/null | gzip -9c > source/Sources.gz - genisoimage -o /opt/elbe/source.iso -J -R source -% endif -\end{lstlisting} -\end{frame} - - -\begin{frame} -\frametitle{kinitrd package details} -\begin{itemize} -\item in xml the cdrom tag can be used instead of a mirror -\item then d-i needs to load components (udeb) from cdrom instead of web -\item this is the reason for kinitrd including two versions of the initrd: -\begin{itemize} -\item one with the d-i configured to load udebs from a web source -\item a second with d-i configured to load udebs from a cdrom source -\end{itemize} -\item there is a switch in the 'elbe create' path to select the right initrd for - the project -\end{itemize} -\end{frame} - - -\subsection{Makefile (post-install)} - -\begin{frame}[fragile] -\frametitle{copy files to host} -\begin{itemize} -\item all files produced by elbe are stored inside buildenv.img:/opt/elbe -\item they should be transfered into the build dir on the Host PC -\item the emulator is shutdown, - -then e2cp can be used to retrive the files: -\begin{lstlisting} -e2cp buildenv.img?offset=32768:/opt/elbe/licence.txt . -\end{lstlisting} -\item this is done for all files by the Makefile, e.g: -\begin{lstlisting} -% if tgt.has("images"): -% for mtd in tgt.node("images"): -% if mtd.has("partitions"): - e2cp buildenv.img?offset=${loop_offset}:/opt/elbe/${mtd.text("name")} . -% endif -% if mtd.has("binary"): - e2cp buildenv.img?offset=${loop_offset}:${mtd.text("binary")} ${mtd.text("name")} -\end{lstlisting} -\end{itemize} -\end{frame} - - -\input{tailpres} diff --git a/distribution/elbe-marketing/Kconfig b/distribution/elbe-marketing/Kconfig new file mode 100644 index 0000000..78292f8 --- /dev/null +++ b/distribution/elbe-marketing/Kconfig @@ -0,0 +1,5 @@ +config ELBE_BASICS + bool "short 'marketing' information about the ELBE project" + default y + help + Overview and basic information about ELBE diff --git a/distribution/elbe-marketing/Makefile b/distribution/elbe-marketing/Makefile new file mode 100644 index 0000000..d328362 --- /dev/null +++ b/distribution/elbe-marketing/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ELBE_BASICS) = pres_elbe-marketing.pdf diff --git a/distribution/elbe-marketing/elbe-logo.png b/distribution/elbe-marketing/elbe-logo.png new file mode 100644 index 0000000..1d3c745 Binary files /dev/null and b/distribution/elbe-marketing/elbe-logo.png differ diff --git a/distribution/elbe-marketing/pres_elbe-marketing.tex b/distribution/elbe-marketing/pres_elbe-marketing.tex new file mode 100644 index 0000000..8c66cb3 --- /dev/null +++ b/distribution/elbe-marketing/pres_elbe-marketing.tex @@ -0,0 +1,106 @@ +\input{configpres} + +\begin{frame} +\begin{figure}[ht] +\includegraphics[width=0.7\textwidth]{elbe-logo.png} +\end{figure} +\centerline{\large Embedded Linux Build Environment} +\vskip20pt +Manuel Traut, Linutronix GmbH +\end{frame} + +\subsection{Agenda} +\begin{frame} +\begin{itemize} +\item What is elbe? +\item elbe Target Architectures +\item elbe Workflow +\item elbe Features +\end{itemize} +\end{frame} + +\subsection{What is elbe?} +\begin{frame} +\begin{itemize} +\item elbe is a tool based on selected components of the Debian infrastructure +\item it is NOT another embedded Linux distribution +\item it uses the well maintained Debian binary packages +\item own application is compiled natively in a virtual machine +\item no more cross-compiling! +\end{itemize} + + +The goal of the elbe project is to + +make embedded Linux development easier and reproducable +\end{frame} + +\subsection{elbe Target Architectures} +\begin{frame} +It currently supports the following Target architectures: +\begin{itemize} +\item x86 (32 and 64 bit) +\item powerpc +\item arm and armhf +\end{itemize} +\end{frame} + +\subsection{elbe Workflow} +\begin{frame} +\begin{itemize} +\item use an example XML file and customize it +\item generate a Buildenvironment +\item build Debian Binary Package(s) from your own Application +\item add the custom Packages to the XML file +\item build the Target Image +\end{itemize} +\end{frame} + +\subsection{elbe Features / elbe Output} +\begin{frame} +\begin{itemize} +\item Buildenvironment for native development + + inside a qemu virtual machine +\item ready to use Target Image + +(tar.gz, cpio, UBI, HD/SDcard) +\item Licence Informations for all used packages +\item Source and Binary Packages as ISO Image, + +usable for regeneration builds +\end{itemize} +\end{frame} + +\subsection{elbe Features} +\begin{frame} +\begin{itemize} +\item different modes for Target Image generation +\item finetuning rules in XML +\item archive.tar.bz2 for config files embedded in XML +\item Update checker +\item Emdebian (grip) Packages can be used +\end{itemize} +\end{frame} + +\subsection{References} +\begin{frame} +\begin{description} +\item[elbe website] http://elbe-rfs.org +\item[elbe source] http://github.com/linutronix/elbe +\item[Debian website] http://debian.org +\end{description} +\end{frame} + +\subsection{Conclusion} +\begin{frame} +\begin{itemize} +\item focus on your application +\item reuse the power of Debian, don't build everything again +\item reproduce your Target Image even in 10 years ore more +\item it's possible to build full featured Debian Images +\item and optimized Images without dpkg/apt functionality +\end{itemize} +\end{frame} + +\input{tailpres} diff --git a/distribution/elbe-overview/pres_elbe-overview_en.tex b/distribution/elbe-overview/pres_elbe-overview_en.tex index 16ef882..0673d4a 100644 --- a/distribution/elbe-overview/pres_elbe-overview_en.tex +++ b/distribution/elbe-overview/pres_elbe-overview_en.tex @@ -90,12 +90,11 @@ buildroot \frametitle{init} create a new \includegraphics[height=0.7em]{images/elbe-logo.png} \ virtual-machine: \begin{verbatim} -$ elbe init example.xml +$ elbe initvm create --build-bin --build-source example.xml \end{verbatim} \pause \begin{itemize} -\item creates a project directory and Makefile -\item downloads the elbe-bootstrap package +\item creates an elbe initvm and builds the target image and cdroms \end{itemize} \end{frame} @@ -127,23 +126,6 @@ $ elbe init example.xml \includegraphics[width=\textwidth]{images/elbe-init.png} \end{frame} -\section{build project} -\begin{frame}[fragile] -\frametitle{buildchroot} -build a project: -\begin{verbatim} -$ elbe buildchroot \ - -t /opt/elbe/build \ - -o /opt/elbe/build.log \ - example.xml -\end{verbatim} -\pause -\begin{itemize} -\item creates a project directory -\item builds the project -\end{itemize} -\end{frame} - \begin{frame}[fragile] \includegraphics[width=\textwidth]{images/elbe-buildchroot.png} \end{frame} @@ -272,11 +254,15 @@ QlpoOTFBWSZTWbr9i8ICOcH////// \begin{frame}[fragile] \frametitle{generated files} \begin{verbatim} -$ ls -buildenv.images licence.txt -elbe-report.txt sdcard.images -install.iso source.xml -Makefile validation.txt +$ ls elbe-build-$DATE +bin-cdrom.iso +elbe-report.txt +log.txt +licence.txt +sdcard.img +source.xml +src-cdrom.iso +validation.txt \end{verbatim} \end{frame} @@ -468,8 +454,6 @@ $ aptitude install elbe \pause \item (automated) testing \pause - \item CDROM generation - \pause \item documentation \end{itemize} \end{frame} diff --git a/distribution/elbe-usage/Kconfig b/distribution/elbe-usage/Kconfig deleted file mode 100644 index e91060e..0000000 --- a/distribution/elbe-usage/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config ELBE_USAGE - bool "ELBE user papers" - default y - help - Papers about ELBE usage diff --git a/distribution/elbe-usage/Makefile b/distribution/elbe-usage/Makefile deleted file mode 100644 index 73ae625..0000000 --- a/distribution/elbe-usage/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-$(CONFIG_ELBE_USAGE) += pres_elbe-usage_en.pdf diff --git a/distribution/elbe-usage/pres_elbe-usage_en.tex b/distribution/elbe-usage/pres_elbe-usage_en.tex deleted file mode 100644 index 452d678..0000000 --- a/distribution/elbe-usage/pres_elbe-usage_en.tex +++ /dev/null @@ -1,550 +0,0 @@ -\input{configpres} - -\title{ELBE - Embedded Linux Build Environment} -\maketitle - -\subsection{ELBE usage} - -\begin{frame} -\frametitle{What is ELBE?} -ELBE is a Debian based system to generate root-filesystems for embedded devices -\end{frame} - -\begin{frame}[fragile] -\frametitle{How to install ELBE} -\begin{verbatim} -# On a Debian based system -$ echo 'deb http://debian.linutronix.de/elbe \ -wheezy main' >> /etc/apt/sources.list -$ aptitude install elbe -\end{verbatim} -Or get the latest source from github: -\begin{verbatim} -git clone https://github.com/Linutronix/elbe.git -\end{verbatim} -\end{frame} - -\begin{frame} -\frametitle{Overview} -\begin{itemize} -\item The Elbe system consists of the program elbe which is implemented in Python -\item Similar to git, it can be called with several sub commands -\item An Elbe project consists of an xml file that describes the project -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Documentation} -\begin{itemize} -\item Have a look at /usr/share/doc/elbe/ -\item Please read /usr/share/doc/elbe/elbeoverview-en.html -\item There are man pages e.g. 'man elbe', 'man elbe-create', \dots -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{How ELBE works} -\begin{figure}[h] -\centering -\includegraphics[width=10cm]{images/elbe-process.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{How ELBE works} -\begin{figure}[h] -\centering -\includegraphics[width=10cm]{images/emu-process.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{The ELBE workflow} -\begin{enumerate} -\item Create a XML file -\item Create a project based on that XML file -\item Change to the project directory an run make -\end{enumerate} -\end{frame} - -\begin{frame}[fragile] -\frametitle{command overview} -Create a new project: -\begin{verbatim} -$ elbe create \ - --directory /home/user/example example.xml -\end{verbatim} -\end{frame} - -\begin{frame}[fragile] -\frametitle{start build} -\begin{verbatim} -$ cd /home/user/example -$ ls -a -. .. .elbe-in Makefile -$ make -\end{verbatim} -.elbe-in contains the files needed inside the virtual build machine -\end{frame} - -\begin{frame}[fragile] -\frametitle{generated files} -\begin{verbatim} -$ ls -a -. elbe-report.txt sdcard.img -.. install.iso source.xml -buildenv.img licence.txt .stamps -.elbe-gen Makefile validation.txt -.elbe-in rootfs.tar.gz -\end{verbatim} -\end{frame} - -\begin{frame} -\frametitle{buildenv.img} -\begin{itemize} -\item Qemu HD image containing a complete Debian system -\item was used to generate the RFS for the target -\item can be used as build environment for own applications -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{.elbe-gen} -\begin{itemize} -\item files generated by the Makefile -\item including the modified initrd that contains the debian-installer -\item and a list containing the files that are copied from the buildenv to the -host PC -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{elbe-report.txt} -\begin{itemize} -\item logfile of the build process in asciidoc format -\item 'asciidoc elbe-report.txt' generates a html file -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{install.iso} -\begin{itemize} -\item ISO image that contains all used packages -\item the --skip-cds parameter of 'elbe create' can be used to skip the - generation of the image -\item the --build-source parameter of 'elbe create' can be used to also generate - a cdrom image that contains all Debian source packages -\item All mirrors configured in an elbe XML file can be replaced by an ISO image - using the command 'elbe setcdrom' -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{licence.txt} -\begin{itemize} -\item contains the licence text of all used debian packages -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{rootfs.tar.gz, sdcard.img} -\begin{itemize} -\item Images or archives containing the target RFS -\item The 'target' section in the XML file describes which image and archive - files are created; the 'fstab' section describes their content. -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{source.xml} -\begin{itemize} -\item based on the XML file given to 'elbe create' -\item added a 'fullpkgs' section containing informations about all installed - packages and their version -\item added a 'sources\_list' section that contains the used mirrors -\item added a 'apt\_prefs' section that contains the pinning settings -\item added a 'elbe\_version' section that contains the version number of - the elbe tool that generated the file -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{.stamps} -\begin{itemize} -\item status information used by the Makefile -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{validation.txt} -\begin{itemize} -\item if elbe create was called with a XML file containing a 'fullpkgs' section - the file contains informations if a package version differs -\item if a package in the 'pkg-list' was not found on one of the mirrors this - will be logged in this file -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Using the VM} -\begin{verbatim} -$ make run -\end{verbatim} -A Qemu with the buildenv.img will be started. -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format} -/usr/share/doc/elbe/examples/ contains a couple of examples that can be used -as templates for an own project: -\begin{verbatim} -$ ls /usr/share/doc/elbe/examples/ -amd64-example.xml beaglebone.xml -arm-complex-example.xml i386-example.xml -arm-example.xml ppc-example.xml -arm-wheezy-example.xml x86-example.xml -\end{verbatim} -Take a look at the different modes and finetuning sections. Also various -iamge generation methods are used. -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format: Project setup} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - - ARMexample - 08.15 - - creates an UBI based target system without debian package management - tools for version control and package build are added to the buildimage - - armel - ... - -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format: Project setup} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - -... - - ftp.de.debian.org - /debian - http - - - http://debian.linutronix.de/elbe wheezy main - http://debian.linutronix.de/elbe wheezy main - - - - -... - -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format: Project setup} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - -... - wheezy - - elbe-bootstrap - - build-essential - debhelper - git - - - -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format: Defining a target} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - - myARM - tec.linutronix.de - foo - ttyS0,115200 - - - nfsroot.tar.gz - - - - usr/share/doc - /usr/share/doc - - - bash - - -\end{lstlisting} -\end{scriptsize} -\end{frame} - - -\begin{frame} -\frametitle{ELBE modes} -\begin{itemize} -\item norecommend (can be combined with any of the other modes): - Don't install recommended packages -\item default: target is a copy of the buildenv -\item diet: Only copy files referenced in the package management. - Only use this for small and simple root filesystems! -\item setsel: The resulting image will just contain dpkg. - This mode offers a finegrained control on which packages should be installed -\item tighten: ignore dependencies, this is useful for very minimalistic busybox - based systems. Normally setsel mode should be used. -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{ELBE modes: Example} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - -... - - - - bash - -... - -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-setsel usage} -\begin{enumerate} -\item Create package list: -\begin{verbatim} -hostpc$ make run-con -# remove all pkgs not wanted on the target -target$ dpkg --purge vim-nox libxml2-dev -# export installed package list -target$ dpkg --get-selections > selections.list -# copy list to hostpc -target$ scp selections.list 10.0.2.2:/tmp -\end{verbatim} -\item Import the package list to your xml file: -\begin{verbatim} -hostpc$ elbe setsel rfs.xml /tmp/selections.list -\end{verbatim} -\end{enumerate} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Using a CDROM} -\begin{itemize} -\item Each ELBE build will create a CD-ROM image with the packages - needed for an elbe image build. -\item this ISO image can be used for future builds: -\end{itemize} -\begin{verbatim} -$ elbe setcdrom rfs.xml \ -/home/user/elbe-test/install.iso -\end{verbatim} -This command removes all configured mirrors and additional urls from the XML -file and sets the given ISO image as the only mirror. -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-chg\_archive} -It is possible to include an archive into the xml file, that is unpacked into -the target RFS before and after the finetuning step: -\begin{verbatim} -$ mkdir archive/testd -$ cd archive -$ echo 'port = 1234' > archive/testd/myconfig -$ tar cjf ../archive.tar.bz2 * -$ cd .. -$ elbe chg_archive archive.tar.bz2 -\end{verbatim} -NOTE: The file must be a bzip2 compressed tar (.tar.bz2) -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-get\_archive} -It is also possible to extract an archive from an XML file: -\begin{verbatim} -$ elbe get_archive -\end{verbatim} -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-show} -The elbe show command prints out some textual information about an -ELBE xml file: -\begin{verbatim} -$ elbe show --verbose arm-example.xml -== arm-example.xml: ARMexample - version 08.15 == -Debian suite: wheezy/armel -[...] -\end{verbatim} -The '--verbose' parameter shows more informations, like the complete package -list. -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-xsdtoasciidoc} -Create an asciidoc documentation from an annotated XML Schema file -\begin{verbatim} -# Create asciidoc format -$ elbe xsdtoasciidoc --output=myasciidoc dbsfed.xsd -# Create HTML doc -$ asciidoc myasciidoc -\end{verbatim} -This is used to create the documentation of the ELBE XML schema. -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-checkupdates} -Use a source.xml file to check if there are updates available for an existing -image: -\begin{verbatim} -$ elbe check_updates source.xml -checking /home/user/rfs/build-release/source.xml -armel -Reading package lists... Done -Building dependency tree... Done -Reading package lists... Done -Building dependency tree... Done -adduser 3.113+nmu1 != 3.113+nmu3 -1 updates required -\end{verbatim} -This can be used e.g. as cronjob to get notifications if updates are availabe. - -Than the person responsible for updates can decide what needs to be done. -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-diff} -compares to RFS trees and suggests commands to update the archive tar and a -'finetuning' section: -\begin{verbatim} -$ sudo elbe diff rfs rfs-modified -suggesting: - -/etc/init.d/mountall-bootclean.sh -/etc/init.d/bootmisc.sh -tar rf archive.tar -C build/rfs /sbin/dhclient-script -tar rf archive.tar -C build/rfs /etc/init.d/mountfstab.sh -\end{verbatim} -This can be used if a (nfsroot) filesystem was modified and these modifications -should be included in an ELBE XML file. -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-pkgdiff} -compares to RFS trees and displays the difference of the installed packages -\begin{verbatim} -$ sudo elbe pkgdiff `pwd`/rfs `pwd`/rfs-modified --firmware-ivtv --firmware-ipw2x00 -\end{verbatim} -This can be used if a (nfsroot) filesystem was modified and these modifications -should be included in an ELBE XML file. -\end{frame} - -\begin{frame}[fragile] -\frametitle{elbe-validate} -validates the xmlfile provided, and prints out errors: -\begin{verbatim} -$ elbe validate rfs.xml -rfs.xml:101 error Element 'type': [facet 'enumeration'] The value 'ext5' is -not an element of the set {'ext2', 'ext3', 'ext4', 'xfs', 'ubifs', 'tmpfs', -'debugfs', 'configfs', 'proc', 'sysfs', 'vfat'}. -rfs.xml:101 error Element 'type': 'ext5' is not a valid value of the atomic -type '{https://www.linutronix.de/projects/Elbe}fs_type'. -validation failed -\end{verbatim} -\dots there is an typo in the XML file line 105: ext5 instead of ext4 -\end{frame} - - -\begin{frame}[fragile] -\frametitle{Creating UBI images} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - - - linux.img 1 - 0 - 60MB - - - 2048 - 1533 - 126976 - 128KiB - - static - - 0 - 4MiB - /boot/vmlinuz - - - dynamic - - 1 - 26MiB - - - -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Creating UBI images} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} - - - - / - - ubifs - -x lzo - - - -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Future? elbe buildchroot} -Something like this may be used in the future: -\begin{lstlisting} -sudo elbe buildchroot -t build-chroot -o buildchroot.log -n myrfs \ ---skip-validation --skip-cdrom --debug --buildtype=armel -\end{lstlisting} -Testing and feedback is welcome! -\end{frame} - -\input{tailpres} diff --git a/distribution/elbe/Kconfig b/distribution/elbe/Kconfig deleted file mode 100644 index ede6465..0000000 --- a/distribution/elbe/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config ELBE_BASICS - bool "Basic information about the ELBE project" - default y - help - Overview and basic information about ELBE diff --git a/distribution/elbe/Makefile b/distribution/elbe/Makefile deleted file mode 100644 index c054f16..0000000 --- a/distribution/elbe/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-$(CONFIG_ELBE_BASICS) = pres_elbe.pdf diff --git a/distribution/elbe/elbe-logo.png b/distribution/elbe/elbe-logo.png deleted file mode 100644 index 1d3c745..0000000 Binary files a/distribution/elbe/elbe-logo.png and /dev/null differ diff --git a/distribution/elbe/pres_elbe.tex b/distribution/elbe/pres_elbe.tex deleted file mode 100644 index 8c66cb3..0000000 --- a/distribution/elbe/pres_elbe.tex +++ /dev/null @@ -1,106 +0,0 @@ -\input{configpres} - -\begin{frame} -\begin{figure}[ht] -\includegraphics[width=0.7\textwidth]{elbe-logo.png} -\end{figure} -\centerline{\large Embedded Linux Build Environment} -\vskip20pt -Manuel Traut, Linutronix GmbH -\end{frame} - -\subsection{Agenda} -\begin{frame} -\begin{itemize} -\item What is elbe? -\item elbe Target Architectures -\item elbe Workflow -\item elbe Features -\end{itemize} -\end{frame} - -\subsection{What is elbe?} -\begin{frame} -\begin{itemize} -\item elbe is a tool based on selected components of the Debian infrastructure -\item it is NOT another embedded Linux distribution -\item it uses the well maintained Debian binary packages -\item own application is compiled natively in a virtual machine -\item no more cross-compiling! -\end{itemize} - - -The goal of the elbe project is to - -make embedded Linux development easier and reproducable -\end{frame} - -\subsection{elbe Target Architectures} -\begin{frame} -It currently supports the following Target architectures: -\begin{itemize} -\item x86 (32 and 64 bit) -\item powerpc -\item arm and armhf -\end{itemize} -\end{frame} - -\subsection{elbe Workflow} -\begin{frame} -\begin{itemize} -\item use an example XML file and customize it -\item generate a Buildenvironment -\item build Debian Binary Package(s) from your own Application -\item add the custom Packages to the XML file -\item build the Target Image -\end{itemize} -\end{frame} - -\subsection{elbe Features / elbe Output} -\begin{frame} -\begin{itemize} -\item Buildenvironment for native development - - inside a qemu virtual machine -\item ready to use Target Image - -(tar.gz, cpio, UBI, HD/SDcard) -\item Licence Informations for all used packages -\item Source and Binary Packages as ISO Image, - -usable for regeneration builds -\end{itemize} -\end{frame} - -\subsection{elbe Features} -\begin{frame} -\begin{itemize} -\item different modes for Target Image generation -\item finetuning rules in XML -\item archive.tar.bz2 for config files embedded in XML -\item Update checker -\item Emdebian (grip) Packages can be used -\end{itemize} -\end{frame} - -\subsection{References} -\begin{frame} -\begin{description} -\item[elbe website] http://elbe-rfs.org -\item[elbe source] http://github.com/linutronix/elbe -\item[Debian website] http://debian.org -\end{description} -\end{frame} - -\subsection{Conclusion} -\begin{frame} -\begin{itemize} -\item focus on your application -\item reuse the power of Debian, don't build everything again -\item reproduce your Target Image even in 10 years ore more -\item it's possible to build full featured Debian Images -\item and optimized Images without dpkg/apt functionality -\end{itemize} -\end{frame} - -\input{tailpres} -- cgit v1.2.3