summaryrefslogtreecommitdiff
path: root/distribution/elbe-example/pres_elbe-example_en.tex
diff options
context:
space:
mode:
Diffstat (limited to 'distribution/elbe-example/pres_elbe-example_en.tex')
-rw-r--r--distribution/elbe-example/pres_elbe-example_en.tex556
1 files changed, 556 insertions, 0 deletions
diff --git a/distribution/elbe-example/pres_elbe-example_en.tex b/distribution/elbe-example/pres_elbe-example_en.tex
new file mode 100644
index 0000000..db8c2d7
--- /dev/null
+++ b/distribution/elbe-example/pres_elbe-example_en.tex
@@ -0,0 +1,556 @@
+\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}
+
+\lstset{language=xml}
+\begin{frame}[fragile]
+\frametitle{minimal XML file}
+\begin{lstlisting}
+<ns0:RootFileSystem
+ xmlns:ns0="https://www.linutronix.de/projects/Elbe"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ created="2009-05-20T08:50:56" revision="6"
+ xsi:schemaLocation="https://www.linutronix.de/projects/Elbe dbsfed.xsd">
+ <project>
+ <name>mini xml</name>
+ <version>1</version>
+ <description>
+ optimal to use as buildenv
+ </description>
+ <buildtype>armel</buildtype>
+ <mirror>
+ <primary_host>ftp.debian.org</primary_host>
+ <primary_path>/debian</primary_path>
+ <primary_proto>http</primary_proto>
+ <url-list>
+ <url>
+ <binary>http://debian.linutronix.de/elbe wheezy main</binary>
+ </url>
+ </url-list>
+ </mirror>
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{minimal XML file}
+\begin{lstlisting}
+ <suite>wheezy</suite>
+ <buildimage>
+ <kinitrd>elbe-bootstrap</kinitrd>
+ <pkg-list>
+ <pkg>build-essential</pkg>
+ <pkg>debhelper</pkg>
+ <pkg>devscripts</pkg>
+ <pkg>autotools-dev</pkg>
+ <pkg>automake</pkg>
+ </pkg-list>
+ </buildimage>
+ </project>
+ <target>
+ <hostname>mini</hostname>
+ <domain>linutronix</domain>
+ <passwd>foo</passwd>
+ <finetuning>
+ </finetuning>
+ <pkg-list>
+ <pkg>bash</pkg>
+ </pkg-list>
+ </target>
+</ns0:RootFileSystem>
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{create and build mini.xml}
+\begin{lstlisting}
+$ elbe create --directory=./buildenv mini.xml
+$ cd buildenv
+$ make
+\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{lstlisting}
+# -*- 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{lstlisting}
+\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
+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 in a debian repository}
+\begin{lstlisting}
+$ cd ..
+$ mkdir -p myrepo/conf
+$ cd myrepo
+$ $EDITOR conf/distributions
+\end{lstlisting}
+\begin{lstlisting}
+Origin: myrepo
+Label: myrepo
+Suite: stable
+Codename: wheezy
+Update: - myremoterepo
+Version:
+Architectures: i386 amd64 source
+Components: main
+Description: my debian packages
+\end{lstlisting}
+\begin{lstlisting}
+$ $EDITOR conf/updates
+\end{lstlisting}
+\begin{lstlisting}
+Name: myremoterepo
+Method: http://localhost/myrepo
+Components: main
+Architectures: i386 amd64 armel source
+VerifyRelease: blindtrust
+IgnoreRelease: yes
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{host myapp in a debian repository}
+\begin{lstlisting}
+$ reprepro include wheezy ../myapp_1.0_i386.changes
+$ 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}
+$ cd ../buildenv
+$ make run-con
+\end{lstlisting}
+login into buildenv and configure apt to use myrepo
+\begin{lstlisting}
+$ 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 armel 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 armel package to the repo}
+\begin{lstlisting}
+$ cd ../myrepo
+$ reprepro include wheezy /tmp/myapp_1.0_armel.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{lstlisting}
+...
+ <mirror>
+ <primary_host>ftp.debian.org</primary_host>
+ <primary_path>/debian</primary_path>
+ <primary_proto>http</primary_proto>
+ <url-list>
+ <url>
+ <binary>http://debian.linutronix.de/elbe wheezy main</binary>
+ </url>
+ <url>
+ <binary>http://LOCALMACHINE/myrepo wheezy main</binary>
+ <source>http://LOCALMACHINE/myrepo wheezy main</source>
+ </url>
+ </url-list>
+ </mirror>
+ <noauth/>
+...
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{add myapp}
+\begin{lstlisting}
+...
+ <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{lstlisting}
+\end{frame}
+
+\subsection{define a striped target RFS}
+\begin{frame}[fragile]
+\frametitle{define sdcard image}
+\begin{lstlisting}
+...
+ <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{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{create fstab and set elbe mode}
+\begin{lstlisting}
+...
+ </images>
+ <fstab>
+ <bylabel>
+ <label>rfs</label>
+ <mountpoint>/</mountpoint>
+ <fs>
+ <type>ext2</type>
+ <tune2fs>-i 0</tune2fs>
+ </fs>
+ </bylabel>
+ </fstab>
+ <diet />
+ <norecommend />
+ <finetuning>
+...
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{build and extract target as nfsroot}
+\begin{lstlisting}
+$ elbe create mini.xml --directory=./target
+$ cd target
+$ make
+\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-armel
+$ sudo tar xzf rootfs.tar.gz -C /nfs/elbe-armel
+$ 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 armel boot}
+\begin{lstlisting}
+$ 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{lstlisting}
+\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-armel ip=dhcp init=/usr/bin/myapp'
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{strip the nfsroot}
+\begin{lstlisting}
+$ sudo rm -rf /nfs/elbe-armel/etc
+$ sudo rm -rf /nfs/elbe-armel/sbin
+$ sudo rm -rf /nfs/elbe-armel/var
+$ sudo rm -rf /nfs/elbe-armel/usr/share
+$ sudo rm -rf /nfs/elbe-armel/usr/lib
+$ sudo rm -rf /nfs/elbe-armel/usr/sbin
+$ sudo cp /nfs/elbe-armel/usr/bin/myapp .
+$ sudo rm -rf /nfs/elbe-armel/usr/bin/*
+$ sudo mv myapp /nfs/elbe-armel/usr/bin/
+$ sudo cp -a /nfs/elbe-armel/lib/arm-linux-gnueabi/ld-* .
+$ sudo cp -a /nfs/elbe-armel/lib/arm-linux-gnueabi/libc-2.13.so .
+$ sudo cp -a /nfs/elbe-armel/lib/arm-linux-gnueabi/libc.so.6 .
+$ sudo rm /nfs/elbe-armel/lib/arm-linux-gnueabi/*
+$ sudo mv libc-2.13.so /nfs/elbe-armel/lib/arm-linux-gnueabi/
+$ sudo mv libc.so.6 /nfs/elbe-armel/lib/arm-linux-gnueabi/
+$ sudo mv ld-* /nfs/elbe-armel/lib/arm-linux-gnueabi/
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{update the ELBE XML file}
+\begin{lstlisting}
+$ sudo mkdir /nfs/elbe-armel-orig
+$ sudo tar xzf rootfs.tar.gz -C /nfs/elbe-armel-orig/
+$ elbe pkgdiff
+$ sudo elbe diff /nfs/elbe-armel-orig /nfs/elbe-armel > diff.txt
+$ cd ..
+\end{lstlisting}
+\begin{lstlisting}
+$ vim mini.xml
+$ # place cursor in finetuning section
+$ <ESC>:read target/diff.txt<RETURN>
+$ # remove everything until 'suggesting:'
+$ <ESC>:x<RETURN>
+\end{lstlisting}
+\begin{lstlisting}
+$ 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{lstlisting}
+\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,armel,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}