From 1d13e674d7be4bf9aa69139deac6737bf60af17b Mon Sep 17 00:00:00 2001
From: Manuel Traut <manut@linutronix.de>
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 <manut@linutronix.de>
---
 distribution/elbe-adk/pres_elbe-adk_en.tex | 540 +++++++++++++++++++++++++++++
 1 file changed, 540 insertions(+)
 create mode 100644 distribution/elbe-adk/pres_elbe-adk_en.tex

(limited to 'distribution/elbe-adk/pres_elbe-adk_en.tex')

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}
+	<project>
+		<name>mini xml</name>
+		<version>1</version>
+		<description>
+			optimal to use as buildenv
+		</description>
+		<buildtype>armhf</buildtype>
+		<mirror>
+			<primary_host>ftp.debian.org</primary_host>
+			<primary_path>/debian</primary_path>
+			<primary_proto>http</primary_proto>
+		</mirror>
+		<suite>wheezy</suite>
+	</project>
+	\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+	\frametitle{mini.xml}
+	\begin{lstlisting}
+	<target>
+		<hostname>mini</hostname>
+		<domain>linutronix</domain>
+		<passwd>foo</passwd>
+		<finetuning>
+		</finetuning>
+		<pkg-list>
+			<pkg>bash</pkg>
+		</pkg-list>
+	</target>
+	\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 <stdio.h>
+#include <time.h>
+
+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 <manut@linutronix.de>  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}
+...
+    <mirror>
+      <primary_host>ftp.debian.org</primary_host>
+      <primary_path>/debian</primary_path>
+      <primary_proto>http</primary_proto>
+      <url-list>
+        <url>
+          <binary>http://LOCALMACHINE/myrepo wheezy main</binary>
+          <source>http://LOCALMACHINE/myrepo wheezy main</source>
+        </url>
+      </url-list>
+    </mirror>
+    <noauth/>
+...
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{add myapp}
+\begin{verbatim}
+...
+  <target>
+    <hostname>mini</hostname>
+    <domain>linutronix</domain>
+    <passwd>foo</passwd>
+    <finetuning>
+      <rm>var/cache/apt/archives/*.deb</rm>
+    </finetuning>
+    <pkg-list>
+      <pkg>bash</pkg>
+      <pkg>myapp</pkg>
+    </pkg-list>
+  </target>
+</ns0:RootFileSystem>
+\end{verbatim}
+\end{frame}
+
+\subsection{define a striped target RFS}
+\begin{frame}[fragile]
+\frametitle{define sdcard image}
+\begin{verbatim}
+...
+  <target>
+    <hostname>mini</hostname>
+    <domain>linutronix</domain>
+    <passwd>foo</passwd>
+    <console>ttyAMA0,115200</console>
+    <package>
+      <tar>
+        <name>rootfs.tar.gz</name>
+      </tar>
+    </package>
+    <images>
+      <msdoshd>
+        <name>my.img</name>
+        <size>64MiB</size>
+        <partition>
+          <size>remain</size>
+          <label>rfs</label>
+        </partition>
+      </msdoshd>
+    </images>
+...
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{create fstab and set elbe mode}
+\begin{verbatim}
+...
+    </images>
+    <fstab>
+      <bylabel>
+        <label>rfs</label>
+        <mountpoint>/</mountpoint>
+        <fs>
+          <type>ext2</type>
+          <tune2fs>-i 0</tune2fs>
+        </fs>
+      </bylabel>
+    </fstab>
+    <diet />
+    <norecommend />
+    <finetuning>
+...
+\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
+$ <ESC>:read target/diff.txt<RETURN>
+$ # remove everything until 'suggesting:'
+$ <ESC>:x<RETURN>
+\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

