diff options
| author | Manuel Traut <manut@mecka.net> | 2014-03-16 20:25:02 +0100 |
|---|---|---|
| committer | Manuel Traut <manut@mecka.net> | 2014-03-16 20:25:02 +0100 |
| commit | 6f4862dba013c38bfba0109ba9363195b5171c7b (patch) | |
| tree | fe366d5a7ccc01860b047c551bda12324c7029ad | |
| parent | 5761d1eb8a47437375c4f61bb54d09e60b67c816 (diff) | |
| parent | 2f46ad6a6f7393dc7898672a7ea3337395bafae9 (diff) | |
Merge ../projects/schulung
95 files changed, 4584 insertions, 261 deletions
diff --git a/application-devel/embedded-devel/pres_embedded-devel_de.tex b/application-devel/embedded-devel/pres_embedded-devel_de.tex index 22e0d8d..e8f2e87 100644 --- a/application-devel/embedded-devel/pres_embedded-devel_de.tex +++ b/application-devel/embedded-devel/pres_embedded-devel_de.tex @@ -344,7 +344,7 @@ libhello.so.1 -> libhello.so.1.0.2 # New minor version libhello.so.1 -> libhello.so.1.0.3 # New Major version -libhello.so.2 -> libhello.so.1.0.1 +libhello.so.2 -> libhello.so.2.0.1 \end{verbatim} SONAME beeinhaltet die Majornumber. Der Symbolic Link mit der Majornumber(SONAME) zeigt normalerweise auf die Bibliotheksversion @@ -392,7 +392,7 @@ GNU make kontrolliert und automatisiert Buildprozesse. \begin{frame}[containsverbatim] \frametitle{Einfaches Beispiel} \begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -% Makefile +# Makefile hello: hello.o gcc -o $@ $< diff --git a/configpres.tex b/configpres.tex index c2189cd..0c4ab4d 100644 --- a/configpres.tex +++ b/configpres.tex @@ -18,12 +18,11 @@ numbers=left, stepnumber=1, numbersep=5pt, - numberstyle=\tiny, breaklines=true, breakautoindent=true, postbreak=\space, tabsize=2, - basicstyle=\ttfamily\tiny, + basicstyle=\ttfamily\small, showspaces=false, showstringspaces=false, extendedchars=true, @@ -35,11 +34,4 @@ \begin{document} -\AtBeginSubsection[] -{ -\begin{frame}{Outline} -\tableofcontents[currentsection,currentsubsection] -\end{frame} -} - \input{section} diff --git a/distribution/elbe-devel/Makefile b/distribution/debian/Makefile index d641258..d641258 100644 --- a/distribution/elbe-devel/Makefile +++ b/distribution/debian/Makefile diff --git a/distribution/debian/debian.png b/distribution/debian/debian.png Binary files differnew file mode 100644 index 0000000..e23ddfb --- /dev/null +++ b/distribution/debian/debian.png diff --git a/distribution/debian/dsa.png b/distribution/debian/dsa.png Binary files differnew file mode 100644 index 0000000..85d9e26 --- /dev/null +++ b/distribution/debian/dsa.png diff --git a/distribution/debian/pres_debian.tex b/distribution/debian/pres_debian.tex new file mode 100644 index 0000000..5736c4e --- /dev/null +++ b/distribution/debian/pres_debian.tex @@ -0,0 +1,136 @@ +\input{configpres} + +\begin{frame} +\begin{figure}[ht] +\includegraphics[width=1.0\textwidth]{debian.png} +\end{figure} +Manuel Traut, Linutronix GmbH +\end{frame} + +\subsection{Agenda} +\begin{frame} +Debian is a community driven distribution, + +well-known for + +its high quality standard + +and a clear focus on Security. + +We also have a look at the open-source infrastructure of Debian. +\end{frame} + +\subsection{community driven distribution} +\begin{frame} +The Debian Project is +\begin{itemize} +\item a worldwide group of volunteers +\item an operating system distribution +\item composed entirely of free software +\end{itemize} +\end{frame} + + +\subsection{well-known for} +\begin{frame} +its huge number of supported architectures +\begin{itemize} +\item 32-Bit PC/Intel IA-32 (i386) +\item 64-Bit PC/Intel EM64T/x86-64 (amd64) +\item ARM EABI (armel and armhf for devices with FPU) +\item MIPS (mips - Big-Endian and mipsel - Little-Endian) +\item Motorola/IBM PowerPC (powerpc) +\item Sun/Oracle SPARC (sparc) +\item Intel Itanium (ia64) +\item IBM S/390 (31 Bit s390 und 64 Bit s390x) +\end{itemize} + +\dots and its huge number of packages (about 35.000 per arch) +\end{frame} + + +\subsection{its high quality standard} +\begin{frame} +There is an extensive set of policies and procedures for packaging and +delivering software. + +These standards are backed up by +\begin{itemize} +\item tools (dh\_make, lintian, debuild, reprepro) +\item automation (wanna\_build, version tracking) +\item documentation (http://debian.org/doc/): +\begin{itemize} + \item New Maintainer Guide + \item Debian Policies + \item Porting Guide + \item Developer Reference + \item Securing Debian +\end{itemize} +\end{itemize} +All of Debian's key elements are open and visible. +\end{frame} + + +\subsection{and a clear focus on security.} +\begin{frame} +\begin{itemize} +\item Security issues are discussed openly on the debian-security mailing list +\item When a security problem arises, the security update is prepared and + distributed as fast as possible. +\item There is a 'secure by default' policy for service installations + which could impose restrictions on their normal use. +\item Debian Security Advisories (DSAs) are sent to public mailing lists, + are published on http://www.debian.org/security/\#DSAS +\end{itemize} +\end{frame} + +\subsection{Debian Security Advisory} +\begin{frame} +\includegraphics[height=1.0\textheight]{dsa.png} +\end{frame} + +\subsection{Debian Infrastructure} +\begin{frame} +Debian has a great infrastructure which is also available as open-source. + +The following slides show a few components of the infrastructure. +\end{frame} + +\subsection{Debian Package Tracking System} +\begin{frame} +\includegraphics[width=1.0\textwidth]{qa.png} +\end{frame} + +\subsection{Source Repo of a Debian Package} +\begin{frame} +\includegraphics[width=1.0\textwidth]{x11-git.png} +\end{frame} + +\subsection{Debian Package Build} +\begin{frame} +\includegraphics[height=1.0\textheight]{x11-buildd.png} +\end{frame} + +\subsection{Debian Bugtracker} +\begin{frame} +\includegraphics[height=1.0\textheight]{x11-bugs.png} +\end{frame} + +\subsection{Debian Package Informations} +\begin{frame} +\includegraphics[height=1.0\textheight]{x11-pkg.png} +\end{frame} + +\subsection{Conclusion} +\begin{frame} +Debian stands for +\begin{itemize} +\item a huge number of packages and supported architectures +\item development is transparent and community driven +\item a focus on security +\item a strict licence compliance +\item good documentation in different languages +\end{itemize} +\end{frame} + +\input{tailpres} diff --git a/distribution/debian/qa.png b/distribution/debian/qa.png Binary files differnew file mode 100644 index 0000000..1895399 --- /dev/null +++ b/distribution/debian/qa.png diff --git a/distribution/debian/x11-bugs.png b/distribution/debian/x11-bugs.png Binary files differnew file mode 100644 index 0000000..5213ce9 --- /dev/null +++ b/distribution/debian/x11-bugs.png diff --git a/distribution/debian/x11-buildd.png b/distribution/debian/x11-buildd.png Binary files differnew file mode 100644 index 0000000..75d4da8 --- /dev/null +++ b/distribution/debian/x11-buildd.png diff --git a/distribution/debian/x11-git.png b/distribution/debian/x11-git.png Binary files differnew file mode 100644 index 0000000..514ab1b --- /dev/null +++ b/distribution/debian/x11-git.png diff --git a/distribution/debian/x11-pkg.png b/distribution/debian/x11-pkg.png Binary files differnew file mode 100644 index 0000000..9542fae --- /dev/null +++ b/distribution/debian/x11-pkg.png diff --git a/distribution/elbe-example/Makefile b/distribution/elbe-example/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/distribution/elbe-example/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/distribution/elbe-example/mini-incl-target-stripped.xml b/distribution/elbe-example/mini-incl-target-stripped.xml new file mode 100644 index 0000000..30f8f48 --- /dev/null +++ b/distribution/elbe-example/mini-incl-target-stripped.xml @@ -0,0 +1,934 @@ +<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> + minimal target rfs including a simple app + buildenv to build the simple app + </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> + <binary>http://LOCALMACHINE/myrepo wheezy main</binary> + <source>http://LOCALMACHINE/myrepo wheezy main</source> + </url> + </url-list> + </mirror> + <noauth/> + <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> + <console>ttyAMA0,115200</console> + <package> + <tar> + <name>rootfs.tar.gz</name> + </tar> + </package> + <images> + <msdoshd> + <name>my.img</name> + <size>200MiB</size> + <partition> + <size>remain</size> + <label>rfs</label> + </partition> + </msdoshd> + </images> + <fstab> + <bylabel> + <label>rfs</label> + <mountpoint>/</mountpoint> + <fs> + <type>ext2</type> + <tune2fs>-i 0</tune2fs> + </fs> + </bylabel> + </fstab> + <diet /> + <norecommend /> + <finetuning> + <rm>var/cache/apt/archives/*.deb</rm> + <command>echo "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100" >> etc/inittab</command> + <rm>/var/backups</rm> + <rm>/var/tmp</rm> + <rm>/var/log</rm> + <rm>/var/lib/dpkg/updates</rm> + <rm>/var/lib/dpkg/parts</rm> + <rm>/var/lib/dpkg/info</rm> + <rm>/var/lib/dpkg/alternatives</rm> + <rm>/var/lib/misc</rm> + <rm>/var/spool</rm> + <rm>/var/local</rm> + <rm>/usr/share</rm> + <rm>/usr/share/debianutils/shells</rm> + <rm>/usr/share/dict</rm> + <rm>/usr/share/libc-bin/nsswitch.conf</rm> + <rm>/usr/share/dpkg/archtable</rm> + <rm>/usr/share/dpkg/abitable</rm> + <rm>/usr/share/dpkg/ostable</rm> + <rm>/usr/share/dpkg/triplettable</rm> + <rm>/usr/share/dpkg/cputable</rm> + <rm>/usr/share/locale</rm> + <rm>/usr/share/locale/ja</rm> + <rm>/usr/share/locale/ja/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/ja/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ja/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/mr</rm> + <rm>/usr/share/locale/mr/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/tr</rm> + <rm>/usr/share/locale/tr/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/tr/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/pa</rm> + <rm>/usr/share/locale/pa/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/pt_BR</rm> + <rm>/usr/share/locale/pt_BR/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/pt_BR/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/pt_BR/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/nn</rm> + <rm>/usr/share/locale/nn/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/dz</rm> + <rm>/usr/share/locale/dz/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/zh_TW</rm> + <rm>/usr/share/locale/zh_TW/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/zh_TW/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/zh_TW/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/en@boldquot</rm> + <rm>/usr/share/locale/en@boldquot/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/de</rm> + <rm>/usr/share/locale/de/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/de/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/de/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/vi</rm> + <rm>/usr/share/locale/vi/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/vi/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/vi/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/fr</rm> + <rm>/usr/share/locale/fr/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/fr/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/fr/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ro</rm> + <rm>/usr/share/locale/ro/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/ro/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ro/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/et</rm> + <rm>/usr/share/locale/et/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/et/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/et/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/es</rm> + <rm>/usr/share/locale/es/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/es/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/es/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ga</rm> + <rm>/usr/share/locale/ga/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/ga/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/sv</rm> + <rm>/usr/share/locale/sv/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/sv/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/sv/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/eo</rm> + <rm>/usr/share/locale/eo/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/eo/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/lt</rm> + <rm>/usr/share/locale/lt/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/lt/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/id</rm> + <rm>/usr/share/locale/id/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/id/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/id/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/nl</rm> + <rm>/usr/share/locale/nl/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/nl/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/nl/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/bg</rm> + <rm>/usr/share/locale/bg/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/bg/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/bs</rm> + <rm>/usr/share/locale/bs/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/cs</rm> + <rm>/usr/share/locale/cs/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/cs/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/cs/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/it</rm> + <rm>/usr/share/locale/it/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/it/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/hu</rm> + <rm>/usr/share/locale/hu/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/hu/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/hu/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/hr</rm> + <rm>/usr/share/locale/hr/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/th</rm> + <rm>/usr/share/locale/th/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/zh_CN</rm> + <rm>/usr/share/locale/zh_CN/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/zh_CN/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/zh_CN/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/da</rm> + <rm>/usr/share/locale/da/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/da/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/pl</rm> + <rm>/usr/share/locale/pl/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/pl/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/pl/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/pt</rm> + <rm>/usr/share/locale/pt/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/pt/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/el</rm> + <rm>/usr/share/locale/el/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/el/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ku</rm> + <rm>/usr/share/locale/ku/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/af</rm> + <rm>/usr/share/locale/af/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/fi</rm> + <rm>/usr/share/locale/fi/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/fi/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ko</rm> + <rm>/usr/share/locale/ko/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ko/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/en@quot</rm> + <rm>/usr/share/locale/en@quot/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/gl</rm> + <rm>/usr/share/locale/gl/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/gl/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ne</rm> + <rm>/usr/share/locale/ne/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ast</rm> + <rm>/usr/share/locale/ast/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/sl</rm> + <rm>/usr/share/locale/sl/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ca</rm> + <rm>/usr/share/locale/ca/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/ca/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ca/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/uk</rm> + <rm>/usr/share/locale/uk/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/uk/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/eu</rm> + <rm>/usr/share/locale/eu/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/eu/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ms</rm> + <rm>/usr/share/locale/ms/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/nb</rm> + <rm>/usr/share/locale/nb/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/nb/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/sk</rm> + <rm>/usr/share/locale/sk/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/sk/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/sk/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ru</rm> + <rm>/usr/share/locale/ru/LC_MESSAGES/bash.mo</rm> + <rm>/usr/share/locale/ru/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/ru/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/km</rm> + <rm>/usr/share/locale/km/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/locale/ky</rm> + <rm>/usr/share/locale/ky/LC_MESSAGES/tar.mo</rm> + <rm>/usr/share/locale/tl</rm> + <rm>/usr/share/locale/tl/LC_MESSAGES/dpkg.mo</rm> + <rm>/usr/share/doc</rm> + <rm>/usr/share/doc/libbz2-1.0/changelog.gz</rm> + <rm>/usr/share/doc/libbz2-1.0/copyright</rm> + <rm>/usr/share/doc/libbz2-1.0/changelog.Debian.gz</rm> + <rm>/usr/share/doc/libc6/README.hesiod.gz</rm> + <rm>/usr/share/doc/libc6/changelog.gz</rm> + <rm>/usr/share/doc/libc6/NEWS.Debian.gz</rm> + <rm>/usr/share/doc/libc6/FAQ.gz</rm> + <rm>/usr/share/doc/libc6/test-results-arm-linux-gnueabi-libc</rm> + <rm>/usr/share/doc/libc6/copyright</rm> + <rm>/usr/share/doc/libc6/changelog.Debian.gz</rm> + <rm>/usr/share/doc/libc6/NEWS.gz</rm> + <rm>/usr/share/doc/libc6/BUGS</rm> + <rm>/usr/share/doc/libc6/README.Debian.gz</rm> + <rm>/usr/share/doc/libselinux1/changelog.gz</rm> + <rm>/usr/share/doc/libselinux1/copyright</rm> + <rm>/usr/share/doc/libselinux1/changelog.Debian.gz</rm> + <rm>/usr/share/doc/debianutils/changelog.gz</rm> + <rm>/usr/share/doc/debianutils/copyright</rm> + <rm>/usr/share/doc/debianutils/README.shells.gz</rm> + <rm>/usr/share/doc/zlib1g/changelog.gz</rm> + <rm>/usr/share/doc/zlib1g/copyright</rm> + <rm>/usr/share/doc/zlib1g/changelog.Debian.gz</rm> + <rm>/usr/share/doc/sensible-utils/changelog.gz</rm> + <rm>/usr/share/doc/sensible-utils/copyright</rm> + <rm>/usr/share/doc/tar/AUTHORS</rm> + <rm>/usr/share/doc/tar/changelog.1.gz</rm> + <rm>/usr/share/doc/tar/changelog.gz</rm> + <rm>/usr/share/doc/tar/NEWS.Debian.gz</rm> + <rm>/usr/share/doc/tar/THANKS.gz</rm> + <rm>/usr/share/doc/tar/copyright</rm> + <rm>/usr/share/doc/tar/changelog.Debian.gz</rm> + <rm>/usr/share/doc/tar/README.Debian</rm> + <rm>/usr/share/doc/tar/NEWS.gz</rm> + <rm>/usr/share/doc/bash/POSIX.gz</rm> + <rm>/usr/share/doc/bash/COMPAT.gz</rm> + <rm>/usr/share/doc/bash/FAQ</rm> + <rm>/usr/share/doc/bash/inputrc.arrows</rm> + <rm>/usr/share/doc/bash/CHANGES.gz</rm> + <rm>/usr/share/doc/bash/copyright</rm> + <rm>/usr/share/doc/bash/changelog.Debian.gz</rm> + <rm>/usr/share/doc/bash/INTRO.gz</rm> + <rm>/usr/share/doc/bash/README.commands.gz</rm> + <rm>/usr/share/doc/bash/README.abs-guide</rm> + <rm>/usr/share/doc/bash/NEWS.gz</rm> + <rm>/usr/share/doc/bash/README.Debian.gz</rm> + <rm>/usr/share/doc/libc-bin/changelog.gz</rm> + <rm>/usr/share/doc/libc-bin/TODO.Debian</rm> + <rm>/usr/share/doc/libc-bin/copyright</rm> + <rm>/usr/share/doc/libc-bin/changelog.Debian.gz</rm> + <rm>/usr/share/doc/liblzma5/AUTHORS</rm> + <rm>/usr/share/doc/liblzma5/changelog.gz</rm> + <rm>/usr/share/doc/liblzma5/THANKS</rm> + <rm>/usr/share/doc/liblzma5/copyright</rm> + <rm>/usr/share/doc/liblzma5/changelog.Debian.gz</rm> + <rm>/usr/share/doc/liblzma5/NEWS.gz</rm> + <rm>/usr/share/doc/dpkg/AUTHORS</rm> + <rm>/usr/share/doc/dpkg/changelog.gz</rm> + <rm>/usr/share/doc/dpkg/usertags.gz</rm> + <rm>/usr/share/doc/dpkg/README.feature-removal-schedule.gz</rm> + <rm>/usr/share/doc/dpkg/THANKS.gz</rm> + <rm>/usr/share/doc/dpkg/copyright</rm> + <rm>/usr/share/doc/dpkg/changelog.Debian.gz</rm> + <rm>/usr/share/doc/multiarch-support/changelog.gz</rm> + <rm>/usr/share/doc/multiarch-support/copyright</rm> + <rm>/usr/share/doc/multiarch-support/changelog.Debian.gz</rm> + <rm>/usr/share/doc/gcc-4.7-base/TODO.Debian</rm> + <rm>/usr/share/doc/gcc-4.7-base/README.Debian.armel.gz</rm> + <rm>/usr/share/doc/gcc-4.7-base/copyright</rm> + <rm>/usr/share/doc/gcc-4.7-base/changelog.Debian.gz</rm> + <rm>/usr/share/doc/base-files/README</rm> + <rm>/usr/share/doc/base-files/changelog.gz</rm> + <rm>/usr/share/doc/base-files/README.FHS</rm> + <rm>/usr/share/doc/base-files/FAQ</rm> + <rm>/usr/share/doc/base-files/copyright</rm> + <rm>/usr/share/doc/libtinfo5/changelog.gz</rm> + <rm>/usr/share/doc/libtinfo5/TODO.Debian</rm> + <rm>/usr/share/doc/libtinfo5/copyright</rm> + <rm>/usr/share/doc/libtinfo5/changelog.Debian.gz</rm> + <rm>/usr/share/doc/myapp/changelog.gz</rm> + <rm>/usr/share/doc/dash/changelog.gz</rm> + <rm>/usr/share/doc/dash/NEWS.Debian.gz</rm> + <rm>/usr/share/doc/dash/README.source</rm> + <rm>/usr/share/doc/dash/README.Debian.diet</rm> + <rm>/usr/share/doc/dash/copyright</rm> + <rm>/usr/share/doc/dash/changelog.Debian.gz</rm> + <rm>/usr/share/menu/bash</rm> + <rm>/usr/share/menu/dash</rm> + <rm>/usr/share/base-files/nsswitch.conf</rm> + <rm>/usr/share/base-files/info.dir</rm> + <rm>/usr/share/base-files/dot.bashrc</rm> + <rm>/usr/share/base-files/profile</rm> + <rm>/usr/share/base-files/dot.profile</rm> + <rm>/usr/share/base-files/motd</rm> + <rm>/usr/share/base-files/profile.md5sums</rm> + <rm>/usr/share/base-files/staff-group-for-usr-local</rm> + <rm>/usr/share/misc</rm> + <rm>/usr/share/lintian</rm> + <rm>/usr/share/lintian/overrides/libc6</rm> + <rm>/usr/share/lintian/overrides/libselinux1</rm> + <rm>/usr/share/lintian/overrides/libgcc1</rm> + <rm>/usr/share/lintian/overrides/bash</rm> + <rm>/usr/share/lintian/overrides/libc-bin</rm> + <rm>/usr/share/lintian/overrides/dpkg</rm> + <rm>/usr/share/lintian/overrides/base-files</rm> + <rm>/usr/share/man</rm> + <rm>/usr/share/man/ja</rm> + <rm>/usr/share/man/ja/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/ja/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/ja/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/ja/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/ja/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/ja/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/ja/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/ja/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/ja/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/ja/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/ja/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/ja/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/ja/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/ja/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/man8/zic.8.gz</rm> + <rm>/usr/share/man/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/man8/ld.so.8.gz</rm> + <rm>/usr/share/man/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/man8/add-shell.8.gz</rm> + <rm>/usr/share/man/man8/remove-shell.8.gz</rm> + <rm>/usr/share/man/man8/rpcinfo.8.gz</rm> + <rm>/usr/share/man/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/man8/installkernel.8.gz</rm> + <rm>/usr/share/man/man8/rmt-tar.8.gz</rm> + <rm>/usr/share/man/man8/run-parts.8.gz</rm> + <rm>/usr/share/man/man8/ldconfig.8.gz</rm> + <rm>/usr/share/man/man8/iconvconfig.8.gz</rm> + <rm>/usr/share/man/man8/savelog.8.gz</rm> + <rm>/usr/share/man/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/de</rm> + <rm>/usr/share/man/de/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/de/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/de/man8/add-shell.8.gz</rm> + <rm>/usr/share/man/de/man8/remove-shell.8.gz</rm> + <rm>/usr/share/man/de/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/de/man8/installkernel.8.gz</rm> + <rm>/usr/share/man/de/man8/run-parts.8.gz</rm> + <rm>/usr/share/man/de/man8/savelog.8.gz</rm> + <rm>/usr/share/man/de/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/de/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/de/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/de/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/de/man1/which.1.gz</rm> + <rm>/usr/share/man/de/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/de/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/de/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/de/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/de/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/de/man1/tempfile.1.gz</rm> + <rm>/usr/share/man/de/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/de/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/fr</rm> + <rm>/usr/share/man/fr/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/fr/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/fr/man8/add-shell.8.gz</rm> + <rm>/usr/share/man/fr/man8/remove-shell.8.gz</rm> + <rm>/usr/share/man/fr/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/fr/man8/installkernel.8.gz</rm> + <rm>/usr/share/man/fr/man8/run-parts.8.gz</rm> + <rm>/usr/share/man/fr/man8/savelog.8.gz</rm> + <rm>/usr/share/man/fr/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/fr/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/fr/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/fr/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/fr/man1/which.1.gz</rm> + <rm>/usr/share/man/fr/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/fr/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/fr/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/fr/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/fr/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/fr/man1/tempfile.1.gz</rm> + <rm>/usr/share/man/fr/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/fr/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/man1/sh.1.gz</rm> + <rm>/usr/share/man/man1/bash.1.gz</rm> + <rm>/usr/share/man/man1/dash.1.gz</rm> + <rm>/usr/share/man/man1/tar.1.gz</rm> + <rm>/usr/share/man/man1/getconf.1.gz</rm> + <rm>/usr/share/man/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/man1/bashbug.1.gz</rm> + <rm>/usr/share/man/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/man1/which.1.gz</rm> + <rm>/usr/share/man/man1/locale.1.gz</rm> + <rm>/usr/share/man/man1/ischroot.1.gz</rm> + <rm>/usr/share/man/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/man1/ldd.1.gz</rm> + <rm>/usr/share/man/man1/catchsegv.1.gz</rm> + <rm>/usr/share/man/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/man1/zdump.1.gz</rm> + <rm>/usr/share/man/man1/tempfile.1.gz</rm> + <rm>/usr/share/man/man1/rbash.1.gz</rm> + <rm>/usr/share/man/man1/clear_console.1.gz</rm> + <rm>/usr/share/man/man1/tzselect.1.gz</rm> + <rm>/usr/share/man/man1/iconv.1.gz</rm> + <rm>/usr/share/man/man1/localedef.1.gz</rm> + <rm>/usr/share/man/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/es</rm> + <rm>/usr/share/man/es/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/es/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/es/man8/add-shell.8.gz</rm> + <rm>/usr/share/man/es/man8/remove-shell.8.gz</rm> + <rm>/usr/share/man/es/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/es/man8/installkernel.8.gz</rm> + <rm>/usr/share/man/es/man8/run-parts.8.gz</rm> + <rm>/usr/share/man/es/man8/savelog.8.gz</rm> + <rm>/usr/share/man/es/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/es/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/es/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/es/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/es/man1/which.1.gz</rm> + <rm>/usr/share/man/es/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/es/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/es/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/es/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/es/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/es/man1/tempfile.1.gz</rm> + <rm>/usr/share/man/es/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/es/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/man7/bash-builtins.7.gz</rm> + <rm>/usr/share/man/sv</rm> + <rm>/usr/share/man/sv/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/sv/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/sv/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/sv/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/sv/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/sv/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/sv/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/sv/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/sv/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/sv/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/sv/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/it</rm> + <rm>/usr/share/man/it/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/it/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/it/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/it/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/it/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/it/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/it/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/it/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/it/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/it/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/hu</rm> + <rm>/usr/share/man/hu/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/pl</rm> + <rm>/usr/share/man/pl/man8/update-alternatives.8.gz</rm> + <rm>/usr/share/man/pl/man8/start-stop-daemon.8.gz</rm> + <rm>/usr/share/man/pl/man8/dpkg-statoverride.8.gz</rm> + <rm>/usr/share/man/pl/man8/dpkg-divert.8.gz</rm> + <rm>/usr/share/man/pl/man1/sensible-pager.1.gz</rm> + <rm>/usr/share/man/pl/man1/dpkg-maintscript-helper.1.gz</rm> + <rm>/usr/share/man/pl/man1/dpkg-deb.1.gz</rm> + <rm>/usr/share/man/pl/man1/sensible-editor.1.gz</rm> + <rm>/usr/share/man/pl/man1/dpkg.1.gz</rm> + <rm>/usr/share/man/pl/man1/sensible-browser.1.gz</rm> + <rm>/usr/share/man/pl/man1/dpkg-split.1.gz</rm> + <rm>/usr/share/man/pl/man1/dpkg-trigger.1.gz</rm> + <rm>/usr/share/man/pl/man1/dpkg-query.1.gz</rm> + <rm>/usr/share/man/pl/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/man5/gai.conf.5.gz</rm> + <rm>/usr/share/man/man5/dpkg.cfg.5.gz</rm> + <rm>/usr/share/man/sl</rm> + <rm>/usr/share/man/sl/man8/add-shell.8.gz</rm> + <rm>/usr/share/man/sl/man8/remove-shell.8.gz</rm> + <rm>/usr/share/man/sl/man8/installkernel.8.gz</rm> + <rm>/usr/share/man/sl/man8/run-parts.8.gz</rm> + <rm>/usr/share/man/sl/man8/savelog.8.gz</rm> + <rm>/usr/share/man/sl/man1/which.1.gz</rm> + <rm>/usr/share/man/sl/man1/tempfile.1.gz</rm> + <rm>/usr/share/info</rm> + <rm>/usr/share/common-licenses/GPL-3</rm> + <rm>/usr/share/common-licenses/LGPL-2.1</rm> + <rm>/usr/share/common-licenses/BSD</rm> + <rm>/usr/share/common-licenses/LGPL</rm> + <rm>/usr/share/common-licenses/GPL-2</rm> + <rm>/usr/share/common-licenses/Apache-2.0</rm> + <rm>/usr/share/common-licenses/Artistic</rm> + <rm>/usr/share/common-licenses/GFDL-1.3</rm> + <rm>/usr/share/common-licenses/LGPL-2</rm> + <rm>/usr/share/common-licenses/GFDL-1.2</rm> + <rm>/usr/share/common-licenses/GPL-1</rm> + <rm>/usr/share/common-licenses/LGPL-3</rm> + <rm>/usr/share/common-licenses/GFDL</rm> + <rm>/usr/share/common-licenses/GPL</rm> + <rm>/usr/bin/bashbug</rm> + <rm>/usr/bin/ischroot</rm> + <rm>/usr/bin/zdump</rm> + <rm>/usr/bin/ldd</rm> + <rm>/usr/bin/dpkg-query</rm> + <rm>/usr/bin/localedef</rm> + <rm>/usr/bin/sensible-pager</rm> + <rm>/usr/bin/rpcinfo</rm> + <rm>/usr/bin/getent</rm> + <rm>/usr/bin/dpkg-maintscript-helper</rm> + <rm>/usr/bin/savelog</rm> + <rm>/usr/bin/dpkg-trigger</rm> + <rm>/usr/bin/sensible-editor</rm> + <rm>/usr/bin/tzselect</rm> + <rm>/usr/bin/catchsegv</rm> + <rm>/usr/bin/dpkg-split</rm> + <rm>/usr/bin/dpkg-statoverride</rm> + <rm>/usr/bin/update-alternatives</rm> + <rm>/usr/bin/dpkg-deb</rm> + <rm>/usr/bin/dpkg</rm> + <rm>/usr/bin/locale</rm> + <rm>/usr/bin/iconv</rm> + <rm>/usr/bin/which</rm> + <rm>/usr/bin/clear_console</rm> + <rm>/usr/bin/dpkg-divert</rm> + <rm>/usr/bin/getconf</rm> + <rm>/usr/bin/sensible-browser</rm> + <rm>/usr/sbin/remove-shell</rm> + <rm>/usr/sbin/rmt-tar</rm> + <rm>/usr/sbin/add-shell</rm> + <rm>/usr/sbin/dpkg-statoverride</rm> + <rm>/usr/sbin/update-alternatives</rm> + <rm>/usr/sbin/dpkg-divert</rm> + <rm>/usr/sbin/install-info</rm> + <rm>/usr/sbin/zic</rm> + <rm>/usr/sbin/iconvconfig</rm> + <rm>/usr/lib/pt_chown</rm> + <rm>/usr/lib/mime</rm> + <rm>/usr/lib/mime/packages/sensible-utils</rm> + <rm>/usr/lib/mime/packages/tar</rm> + <rm>/usr/lib/arm-linux-gnueabi/libtic.so.5.9</rm> + <rm>/usr/lib/arm-linux-gnueabi/libtic.so.5</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1008.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-9E.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM904.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM852.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM284.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-DK-NO-A.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/INIS-CYRILLIC.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/BIG5.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_6937-2.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/libGB.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CSN_369103.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1149.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP932.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-2.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EUC-KR.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM5347.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM933.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/DEC-MCS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/VISCII.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM285.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM855.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/MIK.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GBGBK.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM875.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1125.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_5427.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1004.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-2022-KR.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM037.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM9066.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1130.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM864.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-9.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM4899.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-4.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM275.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM868.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EUC-TW.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM862.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM4909.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM861.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-15.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1258.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/MAC-SAMI.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM4971.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM278.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/HP-ROMAN9.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ARMSCII-8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/MACINTOSH.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1257.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM866NAV.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/libKSC.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM856.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-14.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/libISOIR165.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/BIG5HKSCS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-2022-JP-3.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1160.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GOST_19768-74.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1156.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/gconv-modules.cache</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/UTF-16.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-ES.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GBBIG5.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-10.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/BRF.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM9030.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-IR-209.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-1.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/UTF-7.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP775.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1157.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM420.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM437.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/TIS-620.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/UNICODE.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1166.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM905.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ECMA-CYRILLIC.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1144.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM277.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM423.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM274.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1025.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-AT-DE.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/RK1048.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM871.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EUC-JP-MS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-FI-SE-A.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM424.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/gconv-modules</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/NATS-DANO.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM866.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-FR.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1146.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/SHIFT_JISX0213.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/PT154.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1147.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1145.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-ES-S.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/libCNS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-7.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-US.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM297.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1141.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM803.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1163.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/libJIS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1158.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM860.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-IS-FRISS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM891.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/TSCII.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM038.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM874.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM930.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM939.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1137.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-ES-A.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-5.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1154.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/KOI8-RU.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/KOI8-R.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1250.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM256.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM937.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1026.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/LATIN-GREEK.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1164.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM851.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1167.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-IT.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/NATS-SEFI.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1399.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1256.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1047.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1390.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-DK-NO.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/MAC-CENTRALEUROPE.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1148.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GBK.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1255.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1388.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-11.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/HP-TURKISH8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-16.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/T.61.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CWI.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/KOI8-T.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM943.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM932.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM850.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM4517.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-2022-CN-EXT.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/libJISX0213.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/TCVN5712-1.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-3.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-2022-JP.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM857.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GREEK7-OLD.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM9448.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1132.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-IR-197.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-13.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-AT-DE-A.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM865.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_10367-BOX.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EUC-JISX0213.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1008_420.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM902.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/LATIN-GREEK-1.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/SJIS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/HP-GREEK8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM918.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO-2022-CN.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_2033.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-PT.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1162.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM12712.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1123.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GEORGIAN-ACADEMY.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM290.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-FI-SE.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GB18030.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM500.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/UHC.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISIRI-3342.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ASMO_449.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1142.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM273.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM16804.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1112.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1122.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-UK.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/HP-ROMAN8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM869.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EUC-CN.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GREEK7.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM922.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1252.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM280.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1140.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/INIS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/KOI-8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/SAMI-WS2.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GEORGIAN-PS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/MAC-IS.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1364.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP737.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_11548-1.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IEC_P27-1.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_5427-EXT.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1143.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1161.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM281.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1155.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1129.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_6937.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM880.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/MAC-UK.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1097.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO8859-6.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM870.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1254.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/KOI8-U.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/GREEK-CCITT.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1046.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM901.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM903.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/INIS-8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO_5428.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM863.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1153.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/UTF-32.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM935.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP10007.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1253.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/CP1251.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ANSI_X3.110.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/JOHAB.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1133.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EUC-JP.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/ISO646.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1124.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/EBCDIC-CA-FR.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM1371.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/HP-THAI8.so</rm> + <rm>/usr/lib/arm-linux-gnueabi/gconv/IBM921.so</rm> + <rm>/usr/lib/locale</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_IDENTIFICATION</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_NAME</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_MONETARY</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_TELEPHONE</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_ADDRESS</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_CTYPE</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_PAPER</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_TIME</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_COLLATE</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_MEASUREMENT</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_NUMERIC</rm> + <rm>/usr/lib/locale/C.UTF-8/LC_MESSAGES/SYS_LC_MESSAGES</rm> + <rm>/usr/lib/gcc</rm> + <rm>/usr/lib/gcc/arm-linux-gnueabi</rm> + <rm>/usr/lib/gcc/arm-linux-gnueabi/4.7</rm> + <rm>/sbin/start-stop-daemon</rm> + <rm>/sbin/ldconfig</rm> + <rm>/sbin/installkernel</rm> + <rm>/etc/os-release</rm> + <rm>/etc/bash.bashrc</rm> + <rm>/etc/debian_version</rm> + <rm>/etc/issue</rm> + <rm>/etc/rmt</rm> + <rm>/etc/fstab</rm> + <rm>/etc/host.conf</rm> + <rm>/etc/issue.net</rm> + <rm>/etc/inittab</rm> + <rm>/etc/bindresvport.blacklist</rm> + <rm>/etc/gai.conf</rm> + <rm>/etc/default/nss</rm> + <rm>/etc/profile.d</rm> + <rm>/etc/skel/.profile</rm> + <rm>/etc/skel/.bash_logout</rm> + <rm>/etc/skel/.bashrc</rm> + <rm>/etc/ld.so.conf.d/libc.conf</rm> + <rm>/etc/ld.so.conf.d/arm-linux-gnueabi.conf</rm> + <rm>/etc/dpkg/dpkg.cfg</rm> + <rm>/etc/dpkg/dpkg.cfg.d</rm> + <rm>/etc/dpkg/origins/debian</rm> + <rm>/etc/cron.daily/dpkg</rm> + <rm>/etc/logrotate.d/dpkg</rm> + <rm>/etc/alternatives/README</rm> + <rm>/lib/arm-linux-gnueabi/libnss_hesiod.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libbz2.so.1.0.4</rm> + <rm>/lib/arm-linux-gnueabi/libz.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libresolv.so.2</rm> + <rm>/lib/arm-linux-gnueabi/liblzma.so.5.0.0</rm> + <rm>/lib/arm-linux-gnueabi/libnss_files-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libdl-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libtinfo.so.5.9</rm> + <rm>/lib/arm-linux-gnueabi/libselinux.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libthread_db.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libnss_hesiod-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libz.so.1.2.7</rm> + <rm>/lib/arm-linux-gnueabi/libdl.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libnss_compat-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libbz2.so.1.0</rm> + <rm>/lib/arm-linux-gnueabi/libbz2.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libmemusage.so</rm> + <rm>/lib/arm-linux-gnueabi/libnsl-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libcidn.so.1</rm> + <rm>/lib/arm-linux-gnueabi/librt-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_nisplus.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libm.so.6</rm> + <rm>/lib/arm-linux-gnueabi/librt.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libnss_compat.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libutil-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libm-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libanl-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_nis-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libthread_db-1.0.so</rm> + <rm>/lib/arm-linux-gnueabi/libnsl.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libcrypt.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libpthread-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_files.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libcidn-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_dns.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libgcc_s.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libpcprofile.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_nisplus-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_nis.so.2</rm> + <rm>/lib/arm-linux-gnueabi/libSegFault.so</rm> + <rm>/lib/arm-linux-gnueabi/libanl.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libcrypt-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libnss_dns-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libutil.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libBrokenLocale.so.1</rm> + <rm>/lib/arm-linux-gnueabi/libresolv-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/libtinfo.so.5</rm> + <rm>/lib/arm-linux-gnueabi/libpthread.so.0</rm> + <rm>/lib/arm-linux-gnueabi/libBrokenLocale-2.13.so</rm> + <rm>/lib/arm-linux-gnueabi/liblzma.so.5</rm> + </finetuning> + <pkg-list> + <pkg>bash</pkg> + <pkg>myapp</pkg> + </pkg-list> + </target> +</ns0:RootFileSystem> diff --git a/distribution/elbe-example/mini-incl-target.xml b/distribution/elbe-example/mini-incl-target.xml new file mode 100644 index 0000000..c660969 --- /dev/null +++ b/distribution/elbe-example/mini-incl-target.xml @@ -0,0 +1,78 @@ +<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> + minimal target rfs including a simple app + buildenv to build the simple app + </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> + <binary>http://LOCALMACHINE/myrepo wheezy main</binary> + <source>http://LOCALMACHINE/myrepo wheezy main</source> + </url> + </url-list> + </mirror> + <noauth/> + <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> + <console>ttyAMA0,115200</console> + <package> + <tar> + <name>rootfs.tar.gz</name> + </tar> + </package> + <images> + <msdoshd> + <name>my.img</name> + <size>16MiB</size> + <partition> + <size>remain</size> + <label>rfs</label> + </partition> + </msdoshd> + </images> + <fstab> + <bylabel> + <label>rfs</label> + <mountpoint>/</mountpoint> + <fs> + <type>ext2</type> + <tune2fs>-i 0</tune2fs> + </fs> + </bylabel> + </fstab> + <diet /> + <norecommend /> + <finetuning> + <rm>var/cache/apt/archives/*.deb</rm> + <command>echo "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100" >> etc/inittab</command> + </finetuning> + <pkg-list> + <pkg>bash</pkg> + <pkg>myapp</pkg> + </pkg-list> + </target> +</ns0:RootFileSystem> diff --git a/distribution/elbe-example/mini.xml b/distribution/elbe-example/mini.xml new file mode 100644 index 0000000..fe1d65f --- /dev/null +++ b/distribution/elbe-example/mini.xml @@ -0,0 +1,42 @@ +<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> + <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> diff --git a/distribution/elbe-example/myapp/AUTHORS b/distribution/elbe-example/myapp/AUTHORS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/distribution/elbe-example/myapp/AUTHORS diff --git a/distribution/elbe-example/myapp/ChangeLog b/distribution/elbe-example/myapp/ChangeLog new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/distribution/elbe-example/myapp/ChangeLog diff --git a/distribution/elbe-example/myapp/Makefile.am b/distribution/elbe-example/myapp/Makefile.am new file mode 100644 index 0000000..73ff4e8 --- /dev/null +++ b/distribution/elbe-example/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-example/myapp/NEWS b/distribution/elbe-example/myapp/NEWS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/distribution/elbe-example/myapp/NEWS diff --git a/distribution/elbe-example/myapp/README b/distribution/elbe-example/myapp/README new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/distribution/elbe-example/myapp/README diff --git a/distribution/elbe-example/myapp/autogen.sh b/distribution/elbe-example/myapp/autogen.sh new file mode 100755 index 0000000..9088512 --- /dev/null +++ b/distribution/elbe-example/myapp/autogen.sh @@ -0,0 +1,2 @@ +#!/bin/bash +autoreconf -sif diff --git a/distribution/elbe-example/myapp/configure.ac b/distribution/elbe-example/myapp/configure.ac new file mode 100644 index 0000000..109e8ea --- /dev/null +++ b/distribution/elbe-example/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-example/myapp/myapp.c b/distribution/elbe-example/myapp/myapp.c new file mode 100644 index 0000000..4e39438 --- /dev/null +++ b/distribution/elbe-example/myapp/myapp.c @@ -0,0 +1,12 @@ +#include <stdio.h> +#include <time.h> + +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 new file mode 100644 index 0000000..f6cb43a --- /dev/null +++ b/distribution/elbe-example/myrepo/conf/distributions @@ -0,0 +1,9 @@ +Origin: myrepo +Label: myrepo +Suite: stable +Codename: wheezy +Update: - myremoterepo +Version: +Architectures: i386 amd64 armel source +Components: main +Description: my debian packages diff --git a/distribution/elbe-example/myrepo/conf/updates b/distribution/elbe-example/myrepo/conf/updates new file mode 100644 index 0000000..e8df2b1 --- /dev/null +++ b/distribution/elbe-example/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-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} diff --git a/distribution/elbe-internals/Makefile b/distribution/elbe-internals/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/distribution/elbe-internals/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/distribution/elbe-devel/pres_elbe-devel_en.tex b/distribution/elbe-internals/pres_elbe-devel_en.tex index c145d9d..c57ad47 100644 --- a/distribution/elbe-devel/pres_elbe-devel_en.tex +++ b/distribution/elbe-internals/pres_elbe-devel_en.tex @@ -113,7 +113,7 @@ at the current working directory \begin{itemize} \item the elbe project has packaged the d-i used by elbe as binary debian packages \begin{lstlisting} -testrd_0.6_armel +elbe-bootstrap_0.1_armel |- opt | +-elbe | +-initrd @@ -123,10 +123,10 @@ testrd_0.6_armel \end{lstlisting} \item the name of the debian package is specified by the 'kinitrd' tag inside the xml file -\item current packages are called testrd and are available at the debian +\item current packages are called elbe-bootstrap and are available at the debian repository: \begin{lstlisting} -deb http://debian.linutronix.de/elbe squeeze main +deb http://debian.linutronix.de/elbe wheezy main \end{lstlisting} \end{itemize} \end{frame} diff --git a/distribution/elbe-usage/pres_elbe-usage_en.tex b/distribution/elbe-usage/pres_elbe-usage_en.tex index be63d54..452d678 100644 --- a/distribution/elbe-usage/pres_elbe-usage_en.tex +++ b/distribution/elbe-usage/pres_elbe-usage_en.tex @@ -15,7 +15,7 @@ ELBE is a Debian based system to generate root-filesystems for embedded devices \begin{verbatim} # On a Debian based system $ echo 'deb http://debian.linutronix.de/elbe \ -squeeze main' >> /etc/apt/sources.list +wheezy main' >> /etc/apt/sources.list $ aptitude install elbe \end{verbatim} Or get the latest source from github: @@ -25,7 +25,7 @@ git clone https://github.com/Linutronix/elbe.git \end{frame} \begin{frame} -\frametitle{ELBE: Overview} +\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 @@ -34,10 +34,11 @@ git clone https://github.com/Linutronix/elbe.git \end{frame} \begin{frame} -\frametitle{ELBE: Documentation} +\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} @@ -60,50 +61,151 @@ git clone https://github.com/Linutronix/elbe.git \begin{frame} \frametitle{The ELBE workflow} \begin{enumerate} -\item Create an XML file +\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{ELBE: command overview} +\frametitle{command overview} Create a new project: \begin{verbatim} -elbe create \ +$ elbe create \ --directory /home/user/example example.xml \end{verbatim} \end{frame} \begin{frame}[fragile] -\frametitle{ELBE: start build} +\frametitle{start build} \begin{verbatim} -cd /home/user/example -# Note: the next step might take a while -make +$ 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{ELBE: Using the VM} +\frametitle{generated files} \begin{verbatim} -cd /home/user/example -make run -# or (without graphics) -make run-con +$ 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: +/usr/share/doc/elbe/examples/ contains a couple of examples that can be used +as templates for an own project: \begin{verbatim} -$ ls -1 /usr/share/doc/elbe/examples/ -amd64-example.xml -arm-complex-example.xml.gz -arm-example.xml -i386-example.xml +$ 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] @@ -114,7 +216,12 @@ i386-example.xml <project> <name>ARMexample</name> <version>08.15</version> -... + <description> + creates an UBI based target system without debian package management + tools for version control and package build are added to the buildimage + </description> + <buildtype>armel</buildtype> + ... </project> \end{lstlisting} \end{scriptsize} @@ -128,30 +235,17 @@ i386-example.xml <project> ... <mirror> - <primary_host>debian.tu-bs.de</primary_host> + <primary_host>ftp.de.debian.org</primary_host> <primary_path>/debian</primary_path> <primary_proto>http</primary_proto> <url-list> <url> - <binary>http://debian.linutronix.de/elbe squeeze main</binary> + <binary>http://debian.linutronix.de/elbe wheezy main</binary> + <source>http://debian.linutronix.de/elbe wheezy main</source> </url> </url-list> </mirror> -... -</project> -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format: Project setup} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} -<project> -... <noauth /> - <suite>squeeze</suite> ... </project> \end{lstlisting} @@ -165,29 +259,15 @@ i386-example.xml \begin{lstlisting} <project> ... + <suite>wheezy</suite> <buildimage> - <arch>armel</arch> - <size>20G</size> - <mem>256</mem> - <interpreter>qemu-system-arm</interpreter> - <kinitrd>testrd</kinitrd> - <console>ttyAMA0,115200n1</console> - <machine>versatilepb</machine> - <NIC> - <model>smc91c111</model> - <MAC>de:ad:be:ef:be:05</MAC> - </NIC> - <portforwarding> - <forward> - <proto>tcp</proto> - <buildenv>22</buildenv> - <host>5022</host> - </forward> - </portforwarding> + <kinitrd>elbe-bootstrap</kinitrd> <pkg-list> + <pkg>build-essential</pkg> + <pkg>debhelper</pkg> + <pkg>git</pkg> </pkg-list> </buildimage> -... </project> \end{lstlisting} \end{scriptsize} @@ -209,62 +289,30 @@ i386-example.xml </tar> </package> <finetuning> + <rm>usr/share/doc</rm> <!-- remove from target --> + <rm>/usr/share/doc</rm> <!-- remove from buildenv --> </finetuning> <pkg-list> - <pkg>build-essential</pkg> <pkg>bash</pkg> - <pkg>less</pkg> - <pkg>git</pkg> - <pkg>debhelper</pkg> - <pkg>nfs-common</pkg> - <pkg>openssh-server</pkg> </pkg-list> </target> \end{lstlisting} \end{scriptsize} \end{frame} -\begin{frame}[fragile] -\frametitle{The ELBE XML format: finetuning} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} -<target> -... - <finetuning> - <rm>/usr/share/doc</rm> - <mv path="/var">/var_ro</mv> - <cp path=/copy/me>/my/name/on/target</mv> - </finetuning> -... -</target> -\end{lstlisting} -\end{scriptsize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{The ELBE XML format: finetuning} -\lstset{language=XML} -\begin{scriptsize} -\begin{lstlisting} -<target> -... - <finetuning> - <command>cp /etc/passwd etc/ </command> - </finetuning> -... -</target> -\end{lstlisting} -\end{scriptsize} -\end{frame} \begin{frame} \frametitle{ELBE modes} \begin{itemize} -\item default -\item norecommend (can be combined with any of the other modes): Don't install recommended packages -\item setsel: The resulting image will just contain dpkg. This mode offers a finegrained control on which packages should be installed -\item diet: Only copy files referenced in the package management. Only use this for small and simple root filesystems! +\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} @@ -277,7 +325,6 @@ i386-example.xml ... <diet /> <norecommend /> - <pkg-list> <pkg>bash</pkg> </pkg-list> @@ -288,15 +335,21 @@ i386-example.xml \end{frame} \begin{frame}[fragile] -\frametitle{ELBE command overview: elbe-setsel} +\frametitle{elbe-setsel usage} \begin{enumerate} \item Create package list: \begin{verbatim} -dpkg --get-selections > selections.list +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} -elbe setsel <xmlfile> selections.list +hostpc$ elbe setsel rfs.xml /tmp/selections.list \end{verbatim} \end{enumerate} \end{frame} @@ -304,55 +357,57 @@ elbe setsel <xmlfile> selections.list \begin{frame}[fragile] \frametitle{Using a CDROM} \begin{itemize} -\item Each ELBE build will create a CD-ROM image with the package (which have been used for the installation): install.iso -\item You can use this ISO image for future builds: -\begin{verbatim} -<mirror> -<cdrom>/home/user/elbe-exmpl/install.iso</cdrom> -</mirror> -\end{verbatim} -\item You can also use the elbe-setcdrom command +\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} -\end{frame} - -\begin{frame}[fragile] -\frametitle{ELBE command overview: elbe-setcdrom} \begin{verbatim} -$ elbe setcdrom mysqueeze.xml elbe-cd.iso +$ 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. +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 command overview: elbe-chg\_archive} -It is possible to include an archive into the xml file, that is unpacked into the target root-filesystem after the finetuning step: +\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} -elbe chg_archive <xmlfile> archive.tar.bz2 +$ mkdir archive/testd +$ cd archive +$ echo 'port = 1234' > archive/testd/myconfig +$ tar cjf ../archive.tar.bz2 * +$ cd .. +$ elbe chg_archive <xmlfile> archive.tar.bz2 \end{verbatim} NOTE: The file must be a bzip2 compressed tar (.tar.bz2) \end{frame} \begin{frame}[fragile] -\frametitle{ELBE command overview: elbe-get\_archive} +\frametitle{elbe-get\_archive} It is also possible to extract an archive from an XML file: \begin{verbatim} -elbe get_archive <xmlfile> <archive> +$ elbe get_archive <xmlfile> <archive> \end{verbatim} \end{frame} \begin{frame}[fragile] -\frametitle{ELBE command overview: elbe-show} -The elbe show command prints out some textual information about an ELBE xml file: +\frametitle{elbe-show} +The elbe show command prints out some textual information about an +ELBE xml file: \begin{verbatim} -$ elbe show arm-example.xml +$ elbe show --verbose arm-example.xml == arm-example.xml: ARMexample - version 08.15 == -Debian suite: squeeze/armel +Debian suite: wheezy/armel [...] \end{verbatim} +The '--verbose' parameter shows more informations, like the complete package +list. \end{frame} \begin{frame}[fragile] -\frametitle{ELBE command overview: elbe-xsdtoasciidoc} +\frametitle{elbe-xsdtoasciidoc} Create an asciidoc documentation from an annotated XML Schema file \begin{verbatim} # Create asciidoc format @@ -360,9 +415,75 @@ $ 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: + +<rm>/etc/init.d/mountall-bootclean.sh</rm> +<rm>/etc/init.d/bootmisc.sh</rm> +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 +-<pkg>firmware-ivtv</pkg> +-<pkg>firmware-ipw2x00</pkg> +\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} @@ -404,32 +525,26 @@ $ asciidoc myasciidoc \begin{lstlisting} <fstab> <bylabel> - <label>data</label> - <mountpoint>/opt</mountpoint> - <fs> - <type>ubifs</type> - <mkfs>-x lzo</mkfs> - </fs> - <options>rw</options> - </bylabel> - <bylabel> <label>rfs</label> <mountpoint>/</mountpoint> <fs> <type>ubifs</type> <mkfs>-x lzo</mkfs> </fs> - <options>ro</options> </bylabel> - <bydev> - <source>proc</source> - <mountpoint>/proc</mountpoint> - <fs> - <type>proc</type> - </fs> - </bydev> </fstab> \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/Makefile b/distribution/elbe/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/distribution/elbe/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/distribution/elbe/elbe-logo.png b/distribution/elbe/elbe-logo.png Binary files differnew file mode 100644 index 0000000..1d3c745 --- /dev/null +++ b/distribution/elbe/elbe-logo.png diff --git a/distribution/elbe/pres_elbe.tex b/distribution/elbe/pres_elbe.tex new file mode 100644 index 0000000..8c66cb3 --- /dev/null +++ b/distribution/elbe/pres_elbe.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/section.tex b/distribution/section.tex index 41fa146..da6249a 100644 --- a/distribution/section.tex +++ b/distribution/section.tex @@ -1 +1 @@ -\section{ELBE} +\section{Distributions} diff --git a/frameworks/middleware/examples/celery/README b/frameworks/middleware/examples/celery/README new file mode 100644 index 0000000..9045901 --- /dev/null +++ b/frameworks/middleware/examples/celery/README @@ -0,0 +1,3 @@ +apt-get install python-celery +./worker.sh +./test.py diff --git a/frameworks/middleware/examples/celery/exec_task.py b/frameworks/middleware/examples/celery/exec_task.py new file mode 100644 index 0000000..9169250 --- /dev/null +++ b/frameworks/middleware/examples/celery/exec_task.py @@ -0,0 +1,15 @@ +import os + +from celery import Celery + +app = Celery ('tasks', broker='sqla+sqlite:///celerydb.sqlite', + backend='db+sqlite:///results.sqlite') + +@app.task +def execute (command): + return os.system (command) + +@app.task +def execute2 (command): + if os.system (command): + raise Exception ("command not found") diff --git a/frameworks/middleware/examples/celery/test.py b/frameworks/middleware/examples/celery/test.py new file mode 100755 index 0000000..7d79c8e --- /dev/null +++ b/frameworks/middleware/examples/celery/test.py @@ -0,0 +1,36 @@ +#!/usr/bin/python + +import sys +import traceback + +from exec_task import execute, execute2 + +execute.delay ("echo hello world") + +print "\n\n" + +result = execute.delay ("sleep 2") +print "result ready?", result.ready () +print "wait for result..." +ret = result.get (timeout=10) +print "task done", ret + +print "\n\n" + +result = execute.delay ("/bin/false") +print "/bin/false:", result.get (timeout=10) + +print "\n\n" + +result = execute2.delay ("/bin/treu") +try: + print "/bin/treu:", result.get (timeout=10) +except: + print "exception occured; backtrace:" + print result.traceback + +print "\n\n" + +result = execute2.delay ("/bin/true") +print "/bin/true:", result.get (timeout=10) + diff --git a/frameworks/middleware/examples/celery/worker.sh b/frameworks/middleware/examples/celery/worker.sh new file mode 100755 index 0000000..1705198 --- /dev/null +++ b/frameworks/middleware/examples/celery/worker.sh @@ -0,0 +1,2 @@ +#!/bin/sh +celery -A exec_task worker --loglevel=info diff --git a/frameworks/middleware/examples/corba/AUTHORS b/frameworks/middleware/examples/corba/AUTHORS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/corba/AUTHORS diff --git a/frameworks/middleware/examples/corba/ChangeLog b/frameworks/middleware/examples/corba/ChangeLog new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/corba/ChangeLog diff --git a/frameworks/middleware/examples/corba/Makefile.am b/frameworks/middleware/examples/corba/Makefile.am new file mode 100644 index 0000000..72a6a67 --- /dev/null +++ b/frameworks/middleware/examples/corba/Makefile.am @@ -0,0 +1,29 @@ +IDL_COMPILER=tao_idl +IDL_COMPILER_OPT=-GI + +IDL_GEN_H_SRV = pingI.h pingS.h +IDL_GEN_S_SRV = pingS.cpp +IDL_GEN_H_CLT = pingC.h pingC.inl +IDL_GEN_S_CLT = pingC.cpp + +pingI.h: ping.idl + $(IDL_COMPILER) $(IDL_COMPILER_OPT) ping.idl + +noinst_HEADERS = $(IDL_GEN_H_SRV) $(IDL_GEN_H_CLT) + +CLEANFILES = $(IDL_GEN_H_SRV) $(IDL_GEN_S_SRV) \ + $(IDL_GEN_H_CLT) $(IDL_GEN_S_CLT) pingI.cpp + +CORBA_CFLAGS = $(TAO_CFLAGS) $(TAO_CosNaming_CFLAGS) \ + $(TAO_PortableServer_CFLAGS) $(TAO_RTCORBA_CFLAGS) +CORBA_LIBS = $(TAO_LIBS) $(TAO_CosNaming_LIBS) $(TAO_PortableServer_LIBS) \ + $(TAO_RTCORBA_LIBS) + +bin_PROGRAMS = receiver supplier +receiver_SOURCES = ping_I.cpp $(IDL_GEN_S_SRV) $(IDL_GEN_S_CLT) Receiver.cpp +receiver_CFLAGS = $(CORBA_CFLAGS) +receiver_LDADD = $(CORBA_LIBS) + +supplier_SOURCES = Supplier.cpp $(IDL_GEN_S_CLT) +supplier_CFLAGS = $(CORBA_CFLAGS) +supplier_LDADD = $(CORBA_LIBS) diff --git a/frameworks/middleware/examples/corba/NEWS b/frameworks/middleware/examples/corba/NEWS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/corba/NEWS diff --git a/frameworks/middleware/examples/corba/README b/frameworks/middleware/examples/corba/README new file mode 100644 index 0000000..5d71b99 --- /dev/null +++ b/frameworks/middleware/examples/corba/README @@ -0,0 +1,12 @@ +apt-get install -t experimental libtao-dev mpc-ace libtao-orbsvcs-dev \ +tao-cosnaming tao-idl tao-utils + +./autogen.sh +./configure +make + +Naming_Service -ORBEndpoint iiop://localhost:55555 + + +./receiver -ORBInitRef NameService=corbaloc:iiop:localhost:55555/NameService +./supplier test -ORBInitRef NameService=corbaloc:iiop:localhost:55555/NameService diff --git a/frameworks/middleware/examples/corba/autogen.sh b/frameworks/middleware/examples/corba/autogen.sh new file mode 100755 index 0000000..58c0175 --- /dev/null +++ b/frameworks/middleware/examples/corba/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/bash +automake --add-missing +autoreconf -sif diff --git a/frameworks/middleware/examples/corba/configure.ac b/frameworks/middleware/examples/corba/configure.ac new file mode 100644 index 0000000..6127c33 --- /dev/null +++ b/frameworks/middleware/examples/corba/configure.ac @@ -0,0 +1,28 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([corba-example], [1.0], [manut@linutronix.de]) +AC_CONFIG_SRCDIR([Receiver.cpp]) +AM_INIT_AUTOMAKE([dist-bzip2]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CXX + +# Checks for libraries. +PKG_CHECK_MODULES([TAO], [TAO]) +PKG_CHECK_MODULES([TAO_CosNaming], [TAO_CosNaming]) +PKG_CHECK_MODULES([TAO_PortableServer], [TAO_PortableServer]) +PKG_CHECK_MODULES([TAO_RTCORBA], [TAO_RTCORBA]) + +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. +AC_CHECK_FUNCS([clock_gettime]) + +AC_CONFIG_FILES([Makefile]) + +AC_OUTPUT diff --git a/frameworks/middleware/examples/corba/ping_I.cpp b/frameworks/middleware/examples/corba/ping_I.cpp index 309d1e8..e02924f 100644 --- a/frameworks/middleware/examples/corba/ping_I.cpp +++ b/frameworks/middleware/examples/corba/ping_I.cpp @@ -21,4 +21,3 @@ void Linutronix_Ping_i::send ( clock_gettime(CLOCK_MONOTONIC, &time_rx); std::cout<<time_rx.tv_sec<<":"<<time_rx.tv_nsec/1000<<": "<<payload<<"\n"; } - diff --git a/frameworks/middleware/examples/dbus/AUTHORS b/frameworks/middleware/examples/dbus/AUTHORS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/dbus/AUTHORS diff --git a/frameworks/middleware/examples/dbus/ChangeLog b/frameworks/middleware/examples/dbus/ChangeLog new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/dbus/ChangeLog diff --git a/frameworks/middleware/examples/dbus/Makefile.am b/frameworks/middleware/examples/dbus/Makefile.am new file mode 100644 index 0000000..830a98e --- /dev/null +++ b/frameworks/middleware/examples/dbus/Makefile.am @@ -0,0 +1,8 @@ +bin_PROGRAMS = pingserver pingclient +pingserver_SOURCES = ping-server.c +pingserver_CFLAGS = $(DBUS_CFLAGS) +pingserver_LDADD = $(DBUS_LIBS) + +pingclient_SOURCES = ping-client.c +pingclient_CFLAGS = $(DBUS_CFLAGS) +pingclient_LDADD = $(DBUS_LIBS) diff --git a/frameworks/middleware/examples/dbus/NEWS b/frameworks/middleware/examples/dbus/NEWS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/dbus/NEWS diff --git a/frameworks/middleware/examples/dbus/README b/frameworks/middleware/examples/dbus/README new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frameworks/middleware/examples/dbus/README diff --git a/frameworks/middleware/examples/dbus/autogen.sh b/frameworks/middleware/examples/dbus/autogen.sh new file mode 100755 index 0000000..58c0175 --- /dev/null +++ b/frameworks/middleware/examples/dbus/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/bash +automake --add-missing +autoreconf -sif diff --git a/frameworks/middleware/examples/dbus/compile.sh b/frameworks/middleware/examples/dbus/compile.sh deleted file mode 100755 index d2b2822..0000000 --- a/frameworks/middleware/examples/dbus/compile.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -gcc -o server -lrt -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -ldbus-glib-1 -ldbus-1 -lgobject-2.0 -lglib-2.0 ping-server.c -gcc -o client -lrt -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -ldbus-glib-1 -ldbus-1 -lgobject-2.0 -lglib-2.0 ping-client.c diff --git a/frameworks/middleware/examples/dbus/configure.ac b/frameworks/middleware/examples/dbus/configure.ac new file mode 100644 index 0000000..bf99b42 --- /dev/null +++ b/frameworks/middleware/examples/dbus/configure.ac @@ -0,0 +1,24 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([dbus-example], [1.0], [manut@linutronix.de]) +AC_CONFIG_SRCDIR([ping-server.c]) +AM_INIT_AUTOMAKE([dist-bzip2]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. +PKG_CHECK_MODULES([DBUS], [dbus-glib-1]) +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. +AC_CHECK_FUNCS([clock_gettime]) + +AC_CONFIG_FILES([Makefile]) + +AC_OUTPUT diff --git a/frameworks/middleware/examples/dbus/ping-client.c b/frameworks/middleware/examples/dbus/ping-client.c index e3035e4..ceb3205 100644 --- a/frameworks/middleware/examples/dbus/ping-client.c +++ b/frameworks/middleware/examples/dbus/ping-client.c @@ -12,10 +12,10 @@ int main (int argc, char **argv) DBusConnection *bus; DBusError error; - if (argc > 1) - v_STRING = argv[1]; - else - v_STRING = "no arg given"; + if (argc > 1) + v_STRING = argv[1]; + else + v_STRING = "no arg given"; /* Create a new event loop to run in */ loop = g_main_loop_new (NULL, FALSE); @@ -42,8 +42,8 @@ int main (int argc, char **argv) static gboolean send_ping (DBusConnection *bus) { DBusMessage *message; - struct timespec tx_time; - struct timespec done_time; + struct timespec tx_time; + struct timespec done_time; message = dbus_message_new_signal ("/de/linutronix/Ping", "de.linutronix.Ping", "Ping"); @@ -51,12 +51,16 @@ static gboolean send_ping (DBusConnection *bus) dbus_message_append_args (message, DBUS_TYPE_STRING, &v_STRING, DBUS_TYPE_INVALID); - clock_gettime(CLOCK_MONOTONIC, &tx_time); + + clock_gettime(CLOCK_MONOTONIC, &tx_time); + /* Send the signal */ dbus_connection_send (bus, message, NULL); - clock_gettime(CLOCK_MONOTONIC, &done_time); - g_print("%d:%d\n%d:%d\n\n", tx_time.tv_sec, tx_time.tv_nsec/1000, - done_time.tv_sec, done_time.tv_nsec/1000); + clock_gettime(CLOCK_MONOTONIC, &done_time); + + g_print("%d:%d\n%d:%d\n\n", tx_time.tv_sec, tx_time.tv_nsec/1000, + done_time.tv_sec, done_time.tv_nsec/1000); + /* Free the signal now we have finished with it */ dbus_message_unref (message); /* Return TRUE to tell the event loop we want to be called again */ diff --git a/frameworks/middleware/examples/dbus/ping-server.c b/frameworks/middleware/examples/dbus/ping-server.c index 36dd122..96b2397 100644 --- a/frameworks/middleware/examples/dbus/ping-server.c +++ b/frameworks/middleware/examples/dbus/ping-server.c @@ -60,7 +60,6 @@ static DBusHandlerResult signal_filter clock_gettime(CLOCK_MONOTONIC, &rx_time); g_print("ping received: %s - %d:%d\n", s, rx_time.tv_sec, rx_time.tv_nsec/1000); - // dbus_free (s); } else { g_print("ping received, but error getting message: %s\n", error.message); dbus_error_free (&error); @@ -69,4 +68,3 @@ static DBusHandlerResult signal_filter } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - diff --git a/frameworks/middleware/examples/soap/client.py b/frameworks/middleware/examples/soap/client.py new file mode 100755 index 0000000..9cd35f2 --- /dev/null +++ b/frameworks/middleware/examples/soap/client.py @@ -0,0 +1,11 @@ +#!/usr/bin/python + +from datetime import datetime +from ZSI.client import Binding + +b = Binding(url='http://localhost:8000/') +t = b.today (5) +# t = 2014-02-18 15:59:50.571927 +conv = datetime.strptime (t, "%Y-%m-%d %H:%M:%S.%f") +print "Today: %s" % conv.strftime ("%d.%m.%Y, %H:%M") +print b.load ("string") diff --git a/frameworks/middleware/examples/soap/server.py b/frameworks/middleware/examples/soap/server.py new file mode 100755 index 0000000..32a550a --- /dev/null +++ b/frameworks/middleware/examples/soap/server.py @@ -0,0 +1,18 @@ +#!/usr/bin/python + +from datetime import datetime +from ZSI import dispatch + +def today (arg): + print "today arg:", arg + today = datetime.today () + return str (today) + +def load (arg): + print "load arg:", arg + fd = open ("/proc/loadavg", "r") + loadavg = fd.read () + sysload = loadavg.split () + return sysload[0] + +dispatch.AsServer (port=8000, rpc=True) diff --git a/frameworks/middleware/examples/xmlrpc/client.py b/frameworks/middleware/examples/xmlrpc/client.py new file mode 100755 index 0000000..2b466b7 --- /dev/null +++ b/frameworks/middleware/examples/xmlrpc/client.py @@ -0,0 +1,14 @@ +#!/usr/bin/python + +import xmlrpclib +from datetime import datetime + +proxy = xmlrpclib.ServerProxy ("http://localhost:8000/") + +today = proxy.today () +# today = 20140218T14:23:45 +converted = datetime.strptime (today.value, "%Y%m%dT%H:%M:%S") +print "Today: %s" % converted.strftime ("%d.%m.%Y, %H:%M") + +load = proxy.load () +print "system load:", load diff --git a/frameworks/middleware/examples/xmlrpc/server.py b/frameworks/middleware/examples/xmlrpc/server.py new file mode 100755 index 0000000..ebde5ee --- /dev/null +++ b/frameworks/middleware/examples/xmlrpc/server.py @@ -0,0 +1,21 @@ +#!/usr/bin/python + +from datetime import datetime +from SimpleXMLRPCServer import SimpleXMLRPCServer +import xmlrpclib + +def today (): + today = datetime.today () + return xmlrpclib.DateTime (today) + +def load (): + fd = open ("/proc/loadavg", "r") + loadavg = fd.read () + sysload = loadavg.split () + return xmlrpclib.FloatType (sysload[0]) + +server = SimpleXMLRPCServer (("localhost", 8000)) +server.register_function (today, "today") +server.register_function (load, "load") +print "Listening on port 8000..." +server.serve_forever () diff --git a/frameworks/middleware/examples/xmpp/README b/frameworks/middleware/examples/xmpp/README new file mode 100644 index 0000000..ef147ce --- /dev/null +++ b/frameworks/middleware/examples/xmpp/README @@ -0,0 +1,28 @@ +a) apt-get install libqxmpp-dev psi ejabberd + +b) edit /etc/ejabberd/ejabberd.cfg to allow inband registration: + + --8<--- + %% No username can be registered via in-band registration: + %% To enable in-band registration, replace 'deny' with 'allow' + % (note that if you remove mod_register from modules list then users will not + % be able to change their password as well as register). + % This setting is default because it's more safe. + {access, register, [{allow, all}]}. + --8<--- + +c) start psi and configure it to use 'localhost' as server and create two + accounts: <yourname>:<yourpass> + qtapp:test + +d) login with <yourname> and qtapp, add both accounts to their contact list, + and try to send messages. logoff the qtapp account. + +e) build the qt client application and start it: + +qmake +make +./client + +f) the qtapp account needs now to be online in psi, write a messagte to qtapp + the message should be displayed in the commandline diff --git a/frameworks/middleware/examples/xmpp/client.cpp b/frameworks/middleware/examples/xmpp/client.cpp new file mode 100644 index 0000000..9390438 --- /dev/null +++ b/frameworks/middleware/examples/xmpp/client.cpp @@ -0,0 +1,24 @@ +/* +* Copyright (C) 2008-2010 Manjeet Dahiya +* +* Author: +* Manjeet Dahiya +* modified 2014 by Manuel Traut <manut@linutronix.de> +*/ + +#include <QtCore/QCoreApplication> + +//#include <qxmpp/QXmppLogger.h> + +#include "myclient.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + // QXmppLogger::getLogger()->setLoggingType(QXmppLogger::StdoutLogging); + + MyClient client; + client.connectToServer("qtapp@localhost", "test"); + + return a.exec(); +} diff --git a/frameworks/middleware/examples/xmpp/myclient.cpp b/frameworks/middleware/examples/xmpp/myclient.cpp new file mode 100644 index 0000000..fa28603 --- /dev/null +++ b/frameworks/middleware/examples/xmpp/myclient.cpp @@ -0,0 +1,32 @@ +/* +* Copyright (C) 2008-2010 Manjeet Dahiya +* +* Author: +* Manjeet Dahiya +* +* modified 2014 by Manuel Traut <manut@linutronix.de> +*/ + +#include <qxmpp/QXmppMessage.h> +#include <iostream> + +#include "myclient.h" + +MyClient::MyClient() : QXmppClient() +{ + bool check = connect(this, + SIGNAL(messageReceived(QXmppMessage)), + SLOT(message_rx(QXmppMessage))); + Q_ASSERT(check); + Q_UNUSED(check); +} + +MyClient::~MyClient() { ; } + +void MyClient::message_rx(const QXmppMessage& message) +{ + QString from = message.from(); + QString msg = message.body(); + std::cout<<from.toStdString()<<": "<<msg.toStdString()<<std::endl; + sendPacket(QXmppMessage("", from, "you mean " + msg + "??")); +} diff --git a/frameworks/middleware/examples/xmpp/myclient.h b/frameworks/middleware/examples/xmpp/myclient.h new file mode 100644 index 0000000..22d864c --- /dev/null +++ b/frameworks/middleware/examples/xmpp/myclient.h @@ -0,0 +1,17 @@ +#ifndef CLIENT_H +#define CLIENT_H + +#include <qxmpp/QXmppClient.h> + +class MyClient : public QXmppClient +{ + Q_OBJECT +public: + MyClient(); + ~MyClient(); + +public slots: + void message_rx(const QXmppMessage&); +}; + +#endif diff --git a/frameworks/middleware/examples/xmpp/xmpp.pro b/frameworks/middleware/examples/xmpp/xmpp.pro new file mode 100644 index 0000000..7f0be00 --- /dev/null +++ b/frameworks/middleware/examples/xmpp/xmpp.pro @@ -0,0 +1,15 @@ +###################################################################### +# Automatically generated by qmake (2.01a) Tue Feb 18 19:47:09 2014 +###################################################################### + +TEMPLATE = app +TARGET = client +DEPENDPATH += . +INCLUDEPATH += . + +# Input +SOURCES += client.cpp myclient.cpp +HEADERS += myclient.h + +QT += network +LIBS += -lqxmpp diff --git a/frameworks/middleware/pres_middleware.tex b/frameworks/middleware/pres_middleware.tex index 2f4c462..a658f83 100644 --- a/frameworks/middleware/pres_middleware.tex +++ b/frameworks/middleware/pres_middleware.tex @@ -3,23 +3,544 @@ \title{\lq Middleware\rq} \maketitle -\subsection{DBUS} \begin{frame} -\frametitle{DBUS Communication Framework} +\frametitle{Agenda} +\begin{itemize} +\item Overview +\item XML based Middleware +\item Celery +\item D-Bus +\item CORBA +\end{itemize} +GOAL: get an idea about: + +the amount of available middleware solutions + +and for what they can be used. +\end{frame} + +\subsection{Overview} + +\begin{frame} +\frametitle{Use-case} +\begin{center} +\includegraphics[width=0.8\textheight]{images/714px-Middleware_Schema.png} +\end{center} +\tiny Source: http://commons.wikimedia.org/wiki/File:Middleware\_Schema.svg +\end{frame} + +\begin{frame} +\frametitle{Why should we use a middleware?} +\begin{itemize} +\item IPC +\item scalability +\item os abstraction +\item reusability of sw components +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Kinds of Middleware} +\begin{itemize} +\item Message Oriented Middleware (MOM) +\item Remote Procedure Calls (RPC) +\item Webapplications? +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Requirements} +\begin{block}{Abstraction Layers} +\begin{itemize} +\item operating system +\item programing language +\item localization +\item transport +\item concurrent access +\end{itemize} +\end{block} +\end{frame} + +\begin{frame} +\frametitle{Requirements} +\begin{block}{Technical, product specific} +\begin{itemize} +\item os / language support +\item performance +\item requirement coverage +\item commerical, open-source, (long-time) support +\end{itemize} +\end{block} +\end{frame} + +\begin{frame} +\frametitle{Standards, Protocols} +\begin{itemize} +\item XML based Middleware +\item Celery - Job Queue Protocol +\item D-Bus - MOM +\item CORBA - Common Object Request Broker +\end{itemize} +\end{frame} + +\subsection{XML based Middleware} +\begin{frame} +\frametitle{popular protocols} +\begin{description} +\item[XML-RPC] Extensible Markup Language Remote Procedure Call +\item[SOAP/WSDL] many webservices are based on SOAP +\item[XMPP] Extensible Messaging and Presence Protocol +\end{description} +\end{frame} + +\begin{frame} +\frametitle{XML-RPC} +\begin{itemize} +\item native supported by Python (see example) +\item C/C++ Implementation: http://xmlrpc-c.sourceforge.net/ +\item Client- / Serverarchitecture +\item uses http as transport +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +server.py\#p1 +\begin{lstlisting}[language=python] +from datetime import datetime +from SimpleXMLRPCServer import SimpleXMLRPCServer +import xmlrpclib + +def today (): + today = datetime.today () + return xmlrpclib.DateTime (today) + +def load (): + fd = open ("/proc/loadavg", "r") + loadavg = fd.read () + sysload = loadavg.split () + return xmlrpclib.FloatType (sysload[0]) +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +server.py\#p2 +\begin{lstlisting}[language=python] +server = SimpleXMLRPCServer (("localhost", + 8000)) + +server.register_function (today, "today") +server.register_function (load, "load") + +print "Listening on port 8000..." +server.serve_forever () +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +client.py\#p1 +\begin{lstlisting}[language=python] +import xmlrpclib +from datetime import datetime + +proxy = xmlrpclib.ServerProxy ( + "http://localhost:8000/") +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +client.py\#p2 +\begin{lstlisting}[language=python] +today = proxy.today () +# today = 20140218T14:23:45 + +conv = datetime.strptime (today.value, + "%Y%m%dT%H:%M:%S") + +print "Today:", conv.strftime ( + "%d.%m.%Y, %H:%M") + +load = proxy.load () +print "system load:", load +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +output: +\begin{lstlisting}[language=bash] + % python client.py +Today: 18.02.2014, 14:26 +system load: 0.45 +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +http payload of today rpc call seen in wireshark: +\begin{lstlisting}[language=XML] +<?xml version='1.0'?> +<methodCall> + <methodName>today</methodName> + <params></params> +</methodCall> +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XML-RPC example in Python} +http payload of today rpc response seen in wireshark: +\begin{lstlisting}[language=XML] +<?xml version='1.0'?> +<methodResponse> + <params> + <param> + <value> + <dateTime.iso8601> + 20140218T14:26:25 + </dateTime.iso8601> + </value> + </param> + </params> +</methodResponse> +\end{lstlisting} +\end{frame} + +\begin{frame} +\frametitle{SOAP/WSDL} +\begin{block}{Overview} +\begin{itemize} +\item WSDL (Web Services Description Language) + +describes the interface and spcecial datatypes +\item the SOAP protocol is used for communication +\item SOAP can be used with various transports: + +FTP, SMTP, HTTP(S), JMS +\item hopping is supported, with different transports +\item Client- / Serverarchitecture +\end{itemize} +\end{block} +\end{frame} + +\begin{frame} +\frametitle{SOAP/WSDL} +\begin{block}{Implementations} +\begin{itemize} +\item ZSI: Python +\item KDSOAP: Qt4/5 native Library (commercial) +\item gSOAP: C/C++ +\item Apache Axis2: C++, JAVA +\item Apache CXF: JAVA (+ other middleware protocols) +\item SOAP::WSDL: Perl +\item SOAP4R: Ruby +\item wsdl2objc: Objective C +\item .NET, mono +\end{itemize} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{SOAP example in Python/ZSI} +server.py +\begin{lstlisting}[language=python] +from datetime import datetime +from ZSI import dispatch + +def today (arg): + print "today arg:", arg + today = datetime.today () + return str (today) +def load (arg): + print "load arg:", arg + fd = open ("/proc/loadavg", "r") + loadavg = fd.read () + sysload = loadavg.split () + return sysload[0] + +dispatch.AsServer (port=8000, rpc=True) +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{SOAP example in Python/ZSI} +client.py +\begin{lstlisting}[language=python] +from datetime import datetime +from ZSI.client import Binding + +b = Binding (url='http://localhost:8000/') +t = b.today (5) +# t = 2014-02-18 15:59:50.571927 +c = datetime.strptime (t, + "%Y-%m-%d %H:%M:%S.%f") +print "Today:", c.strftime ("%d.%m.%Y, %H:%M") +print b.load ("string") +\end{lstlisting} +\end{frame} + + +\begin{frame} +\frametitle{XMPP - Extensible Messaging and Presence Protocol} +\begin{block}{Overview} +\begin{itemize} +\item protocol for MOM based on XML +\item originally named Jabber +\item used for +\begin{itemize} + \item real-time Instant Messaging + \item publishing Presence Informations + \item Contactlist maintenance +\end{itemize} +\end{itemize} +\end{block} +\end{frame} + + +\begin{frame} +\frametitle{Extensible Messaging and Presence Protocol} +\begin{block}{IM for Industry??} +\begin{itemize} +\item free and open standard (IETF RFC 6120, 6121) +\item XMPP servers can be isolated, security is implemented (SASL, TLS) +\item TCP and HTTP(S) transports are supported +\item Priority support: multiple logins from same account, + +login with highest pority gets message +\item not just used for IM: +\begin{itemize} + \item smart grid + \item publish-subscribe systems + \item games + \item signalling for VoIP +\end{itemize} +\end{itemize} +\end{block} +\end{frame} + +\begin{frame} +\frametitle{Extensible Messaging and Presence Protocol} +\begin{block}{Extensible\dots} +\begin{itemize} +\item network management +\item collaboration tools +\item file sharing, gaming +\item remote systems control and monitoring +\item geolocation +\end{itemize} +\end{block} +\end{frame} + +\begin{frame} +\frametitle{Extensible Messaging and Presence Protocol} +\begin{block}{Implemmentations} +\dots too many to mention, have a look at + +http://xmpp.org/xmpp-software/ + +for libraries, clients and servers +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{XMPP Client Example} +xmpp\_client.cpp +\begin{lstlisting}[language=C++] +#include <QtCore/QCoreApplication> +#include "myclient.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + MyClient client; + client.connectToServer("qtapp@localhost", + "test"); + + return app.exec(); +} +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XMPP Client Example} +myclient.h +\begin{lstlisting}[language=C++] +#include <qxmpp/QXmppClient.h> + +class MyClient : public QXmppClient +{ + Q_OBJECT + + public: + MyClient(); + ~MyClient(); + + public slots: + void message_rx(const QXmppMessage&); +}; +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XMPP Client Example} +myclient.cpp\#p1 +\begin{lstlisting}[language=C++] +#include <qxmpp/QXmppMessage.h> +#include <iostream> + +#include "myclient.h" + +MyClient::MyClient() : QXmppClient() +{ + bool check = connect(this, + SIGNAL(messageReceived(QXmppMessage)), + SLOT(message_rx(QXmppMessage))); + + Q_ASSERT(check); + Q_UNUSED(check); +} +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{XMPP Client Example} +myclient.cpp\#p2 +\begin{lstlisting}[language=C++] +MyClient::~MyClient() { ; } + +void +MyClient::message_rx(const QXmppMessage& msg) +{ + QString from = msg.from(); + QString body = msg.body(); + + std::cout<<from.toStdString()<<": "; + std::cout<<body.toStdString()<<std::endl; + + sendPacket(QXmppMessage("",from,body+"??")); +} +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{XMPP Client Example} +\begin{itemize} +\item start ejabberd +\item start psi +\item start QT XMPP Client +\item in psi: write a message to qtapp +\item with wireshark can be seen that the connection is encrypted +\end{itemize} +\end{frame} + + +\subsection{Celery} + +\begin{frame} +\frametitle{Overview} +\begin{itemize} +\item Distributed Task Queue +\item based on message passing +\item real-time operation and scheduling +\item Tasks can be hosted on a single or on mulitple workers +\item synchronous and asynchronous execution +\item rate limit support +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{implementations} +\begin{itemize} +\item celery-project: Python +\item celery-php: PHP +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{celeryproject} +\begin{block}{supports multiple message broker} +\begin{itemize} +\item database: Django, or any supported by SQLAlchemy +\item RabbitMQ +\item Redis +\item Amazon SQS (experimental) +\end{itemize} +\end{block} +\end{frame} + +\begin{frame} +\frametitle{celeryproject} +\begin{block}{supports multiple result storage} +\begin{itemize} +\item database: any supported by SQLAlchemy +\item memcached +\item Redis +\item AMQP +\item Cassandra +\item IronCache +\end{itemize} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{celeryproject, example} +exec\_task.py +\begin{lstlisting}{language=python} +import os +from celery import Celery + +app = Celery ('tasks', broker='sqla+sqlite:///celerydb.sqlite) + +@app.task +def execute (command): + os.system (command) +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{celeryproject, example} +test.py +\begin{lstlisting}{language=python} +from exec_task import execute + +execute.delay ("echo hello world") +\end{lstlisting} + +start the example: +\begin{lstlisting}{language=bash} +term1% celery -A exec_task worker +term2% ./test.py +\end{lstlisting} +\dots an example using return values and exceptions is in the example dir +\end{frame} + + +\subsection{D-Bus} + +\begin{frame} +\frametitle{D-Bus Communication Framework} \begin{block}{Facts} \begin{itemize} -\item used by GNOME, KDE4, E17, XFCE4, HAL, \dots +\item used by GNOME, KDE4, E17, XFCE4 and many applications \item for message based local IPC \item provides 1:1 - 1:n message passing +\item there is a system and a session bus \end{itemize} \end{block} \end{frame} \begin{frame} -\frametitle{DBUS Communication Framework} +\frametitle{D-Bus Communication Framework} \begin{block}{Language Support} \begin{itemize} -\item C / C++ +\item C / C++ / Objective-C \item JAVA \item Python \item Perl @@ -27,57 +548,173 @@ \item Pascal \item Ruby \item Smalltalk -\item Tcl \end{itemize} \end{block} \end{frame} \begin{frame} -\frametitle{DBUS Communication Framework} +\frametitle{D-Bus Communication Framework} \begin{block}{Framework Support} \begin{itemize} -\item QT4 (and QT3 backport) -\item glib -\item mono -\item e\_dbus (Enlightenment, E17) -\item .NET +\item QT (C++ / Python) +\item GLib (GDBus) +\item .NET (mono) +\item edbus (Enlightenment, E17) \end{itemize} \end{block} \end{frame} +\begin{frame}[fragile] +\frametitle{Desktop Integration} +open home directory with the e17 file manager +\begin{verbatim} +% mdbus2 -i +MDBUS2> org.enlightenment.FileManager \ + /org/enlightenment/FileManager \ + org.enlightenment.FileManager.OpenDirectory \ + /home/local +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{System Integration} +e.g. hotplug events +\begin{verbatim} +% mdbus2 -s -l +[SIGNAL] +org.freedesktop.UDisks.DeviceAdded +/org/freedesktop/UDisks :1.25 +('/org/freedesktop/UDisks/devices/sdb',) +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\begin{verbatim} +[SIGNAL] +org.freedesktop.DBus.ObjectManager.InterfacesAdded +/org/freedesktop/UDisks2 :1.40 +('/org/freedesktop/UDisks2/drives/WD_My_Passport_0748_57584D314335325839363238', +{'org.freedesktop.UDisks2.Drive': + {'Vendor': <'WD'>, 'Model': <'My Passport0748'>, + 'Revision': <'1015'>, 'Serial': <'57584D314335325839363238'>, + 'WWN': <''>, 'Id': <'WD-My-Passport-0748-57584D314335325839363238'>, + 'Configuration': <@a{sv} {}>, 'Media': <''>, + 'MediaCompatibility': <@as []>, 'MediaRemovable':<false>, + 'MediaAvailable': <true>, 'MediaChangeDetected': <true>, + 'Size':<uint64 1000170586112>, + 'TimeDetected': <uint64 1392720111627238>, + 'TimeMediaDetected': <uint64 1392720111627238>, + 'Optical': <false>, OpticalBlank': <false>, + 'OpticalNumTracks': <uint32 0>, + 'OpticalNumAudioTracks': <uint32 0>, + 'OpticalNumDataTracks': <uint32 0>, + 'OpticalNumSessions': <uint32 0>, + 'RotationRate': <-1>, 'ConnectionBus':<'usb'>, + 'Seat': <'seat0'>, 'Removable': <true>, 'Ejectable': <false>, + 'SortKey': <'01hotplug/1392720111627238'>, + 'CanPowerOff': <true>, + 'SiblingId':<'/sys/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0'>}}) +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Example: Session Bus Signals} +\begin{itemize} +\item have a look at the code +\item start pingserver and pingclient +\item monitor signals with 'mdbus2 -l' +\end{itemize} +\end{frame} + +\subsection{CORBA} + \begin{frame} -\frametitle{Functional Principle} -\begin{center} -\includegraphics[height=0.8\textheight]{images/dbus.png} -\end{center} -Source: http://dbus.freedesktop.org +\frametitle{Common Object Request Broker Architecture} +\begin{itemize} +\item hosting of objects / RPC +\item typically a Client- / Serverarchitecture +\item one application can be Client and Server at the same time +\end{itemize} \end{frame} + \begin{frame} -\frametitle{Desktop Integration} +\frametitle{well-known implementations} +\begin{itemize} +\item omniORB: C++ / Python +\item ACE/TAO: C++ including RTCORBA support +\item MICO: C++ focus on security +\item JacORB: JAVA +\item IIOP.NET: .NET Remoting integration +\item ORBit2: C with C++ and Python bindings +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{communication between different operating systems} +\begin{itemize} +\item hosting of objects is abstracted, e.g. ThreadPool +\item use of OS services, e.g. sockets is abstracted +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{communication between programming languages} +\begin{itemize} +\item CORBA uses its own datatypes +\item datatype mapping needs to be implement for each language +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{common transports} +\begin{itemize} +\item IIOP +\item socket +\item shared-memory +\item implementing own transports is possible +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Functional Principle} \begin{center} -\includegraphics[height=0.8\textheight]{images/dbus-hal.png} +\includegraphics[width=1.0\textwidth]{images/orb.jpg} \end{center} -Source: http://www.redhat.com \end{frame} -\subsection{CORBA} + \begin{frame} -\frametitle{Common Object Request Broker Architecture} -\begin{block}{abstracts} +\frametitle{Functional Principle} +\begin{block}{IDL Interface Description Language} \begin{itemize} -\item operating systems -\item programming language -\item transport protocol +\item write Interface Description +\item use IDL compiler to produce stubs and skeleton code +\item implement interfaces and use interfaces in native language +\item compile applications \end{itemize} \end{block} \end{frame} \begin{frame} \frametitle{Functional Principle} -\begin{center} -\includegraphics[height=0.8\textheight]{images/orb.jpg} -\end{center} +\begin{block}{Policies} +\begin{itemize} +\item Server- or Clientsiede Policies +\item Run-time and compile-time Policies +\item e.g. for +\begin{itemize} +\item Lifetime of objects +\item Activation of objects +\item Thread Policies +\item Connection Polies +\end{itemize} +\end{itemize} +\end{block} \end{frame} \begin{frame} @@ -134,4 +771,16 @@ Source: http://www.redhat.com \end{block} \end{frame} +\subsection{Conclusion} +\begin{frame} +\frametitle{Conclusion} +\begin{itemize} +\item many frameworks available +\item different kind of abstraction +\item special frameworks for special problems +\item which framework is best for my problem? +\item is it helpful to use multiple frameworks? +\end{itemize} +\end{frame} + \input{tailpres} diff --git a/images/714px-Middleware_Schema.png b/images/714px-Middleware_Schema.png Binary files differnew file mode 100644 index 0000000..cedabeb --- /dev/null +++ b/images/714px-Middleware_Schema.png diff --git a/images/BigTreeClassicRCU.png b/images/BigTreeClassicRCU.png Binary files differnew file mode 100644 index 0000000..131d9dd --- /dev/null +++ b/images/BigTreeClassicRCU.png diff --git a/images/GracePeriodGood.png b/images/GracePeriodGood.png Binary files differnew file mode 100644 index 0000000..f6812c9 --- /dev/null +++ b/images/GracePeriodGood.png diff --git a/images/asource.png b/images/asource.png Binary files differnew file mode 100644 index 0000000..1c6f0d4 --- /dev/null +++ b/images/asource.png diff --git a/images/emu-process.png b/images/emu-process.png Binary files differindex f1b1107..0120049 100644 --- a/images/emu-process.png +++ b/images/emu-process.png diff --git a/images/kdirsource.png b/images/kdirsource.png Binary files differnew file mode 100644 index 0000000..2dd19ec --- /dev/null +++ b/images/kdirsource.png diff --git a/images/ksource.png b/images/ksource.png Binary files differnew file mode 100644 index 0000000..fbc5693 --- /dev/null +++ b/images/ksource.png diff --git a/images/overview.png b/images/overview.png Binary files differnew file mode 100644 index 0000000..ac53578 --- /dev/null +++ b/images/overview.png diff --git a/images/pinh.png b/images/pinh.png Binary files differnew file mode 100644 index 0000000..1862002 --- /dev/null +++ b/images/pinh.png diff --git a/images/pinv.png b/images/pinv.png Binary files differnew file mode 100644 index 0000000..902bc5f --- /dev/null +++ b/images/pinv.png diff --git a/images/pthread_kernelshark.png b/images/pthread_kernelshark.png Binary files differnew file mode 100644 index 0000000..d73f913 --- /dev/null +++ b/images/pthread_kernelshark.png diff --git a/images/rtarch.png b/images/rtarch.png Binary files differnew file mode 100644 index 0000000..e58ffab --- /dev/null +++ b/images/rtarch.png diff --git a/images/rtkernel.png b/images/rtkernel.png Binary files differnew file mode 100644 index 0000000..e2ead31 --- /dev/null +++ b/images/rtkernel.png diff --git a/images/rtsource.png b/images/rtsource.png Binary files differnew file mode 100644 index 0000000..009e8c7 --- /dev/null +++ b/images/rtsource.png diff --git a/images/rwlockRCUupdate.jpg b/images/rwlockRCUupdate.jpg Binary files differnew file mode 100644 index 0000000..edcedcd --- /dev/null +++ b/images/rwlockRCUupdate.jpg diff --git a/images/trace_overview.dia b/images/trace_overview.dia Binary files differnew file mode 100644 index 0000000..6b705cf --- /dev/null +++ b/images/trace_overview.dia diff --git a/images/trace_overview.png b/images/trace_overview.png Binary files differnew file mode 100644 index 0000000..7156705 --- /dev/null +++ b/images/trace_overview.png diff --git a/kernel-devel/kernel-debugging/pres_kernel-debugging_en.tex b/kernel-devel/kernel-debugging/pres_kernel-debugging_en.tex index cc1824f..82dc25b 100644 --- a/kernel-devel/kernel-debugging/pres_kernel-debugging_en.tex +++ b/kernel-devel/kernel-debugging/pres_kernel-debugging_en.tex @@ -2,6 +2,73 @@ \title{Kernel-Debugging} \maketitle + +\section{Kernel Configuration} +\begin{frame} +\frametitle{Kernel hacking / printk and dmesg options} +\begin{itemize} +\item Show timing information on printks +\item Default message log level (1-7) +\item Enable dynamic printk() support +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Kernel hacking / Compile-time checks and compiler options} +\begin{itemize} +\item Compile the kernel with debug info +\item Debug Filesystem +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Kernel hacking / Memory Debugging} +\begin{itemize} +\item Kernel memory leak detector +\end{itemize} +reports leaks in /sys/kernel/debug/kmemleak + +see also: Documentation/kmemleak.txt +\end{frame} + +\begin{frame} +\frametitle{Kernel hacking / Debug Lockups and Hangs} +\begin{itemize} +\item Debug Lockups and Hangs +\begin{description} +\item[Softlockup] loop in kernel mode +\item[Hardlockup] CPU loop in kernel mode without letting IRQs run +\item[Hung task] task is uninterruptible (D state) +\end{description} +\end{itemize} +stack trace is printed on detection +\end{frame} + +\begin{frame} +\frametitle{Kernel hacking / Lock Debugging} +\begin{itemize} +\item RT Mutex debugging, deadlock detection +\item Lock debugging: prove locking correctness, see Documentation/lockdep-design.txt. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Kernel hacking / Tracing} +\begin{itemize} +\item Kernel Function (Graph) Tracer +\item Scheduling Latency Tracer +\item Enable [k/u]probes-based dynamic events +\item enable/disable function tracing dynamically +\item Ring buffer benchmark stress tester (!!don't use it!!) +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Kernel hacking} +\begin{description} +\item[Remote debugging over FireWire] Documentation/debugging-via-ohci1394.txt +\end{description} +\end{frame} \section{printk} \begin{frame}[fragile] \frametitle{printk is your friend!!} @@ -38,6 +105,25 @@ $ cat /proc/sys/kernel/printk \end{verbatim} \end{frame} +\section{dynamic printk} +\begin{frame} +\frametitle{dynamic printk} +controlled by debugfs: dynamic\_debug/control + +format: filename:lineno [module]function flags format +\begin{description} +\item[filename] source file of the debug statement +\item[lineno] line number of the debug statement +\item[module] module that contains the debug statement +\item[function] function that contains the debug statement +\item[flags] '=p' means the line is turned 'on' for printing +\item[format] the format used for the debug statement +\end{description} +Use pr\_debug() and dev\_dbg() in your code. + +see also: Documentation/dynamic-debug-howto.txt +\end{frame} + \section{Logging messages} \begin{frame}[fragile] \frametitle{Serial Console} diff --git a/kernel-devel/kernel-perf/Makefile b/kernel-devel/kernel-perf/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/kernel-devel/kernel-perf/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/kernel-devel/kernel-perf/pres_kernel-perf_en.tex b/kernel-devel/kernel-perf/pres_kernel-perf_en.tex new file mode 100644 index 0000000..b6edfc0 --- /dev/null +++ b/kernel-devel/kernel-perf/pres_kernel-perf_en.tex @@ -0,0 +1,135 @@ +\input{configpres} + +\title{perf} +\section{Performance Analyzation} +\maketitle + +\begin{frame} +\frametitle{What is perf?} +Perf is a profiler tool for Linux 2.6+ based systems. +\begin{itemize} +\item perf\_events interface of the Linux kernel +\item perf userspace tool +\item access perf events from own applications +\end{itemize} +Perf is an event counter, no tracer. +\end{frame} + +\begin{frame} +\frametitle{perf events} +\begin{itemize} +\item hardware performance counters (PMU of Host CPU) +\item tracepoint events (from ftrace) +\item dynamic probes (e.g. kprobes or uprobes) +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{perf subcommands I} +\begin{description} +\item[list] list available events +\item[stat] measure total event count for single program or for system, for + some time +\item[top] top-like dynamic view of hottest functions +\item[record] measure and save sampling data for single program +\item[report] analyze file generated by perf record; + can generate flat, or graph profile +\item[diff] Read two perf.data files and display the differential profile +\end{description} +\end{frame} + +\begin{frame} +\frametitle{perf subcommands II} +\begin{description} +\item[sched] tracing/measuring of scheduler actions and latencies +\item[lock] analyze lock events +\item[timechart]tool to visualize total system behavior during a workload +\end{description} +\end{frame} + + +\begin{frame} +\frametitle{selecting events} +\begin{description} +\item[-e] use the specified event +\item[-f] filter events, e.g. -e irq:irq\_handler\_entry --filter irq==18 +\end{description} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Example: live-view of page-fault event} +\begin{lstlisting} +# perf stat chromium + Performance counter stats for 'chromium': + + 3733.112825 task-clock # 0.716 CPUs utilized + 8,696 context-switches # 0.002 M/sec + 1,063 cpu-migrations # 0.285 K/sec + 134,686 page-faults # 0.036 M/sec + 9,102,760,996 cycles # 2.438 GHz +[83.59%] + 6,217,623,412 stalled-cycles-frontend # 68.30% frontend cycles idle +[83.32%] + 4,755,104,208 stalled-cycles-backend # 52.24% backend cycles idle +[67.20%] + 7,262,564,269 instructions # 0.80 insns per cycle + # 0.86 stalled cycles per insn +[83.72%] + 1,495,191,394 branches # 400.521 M/sec +[83.38%] + 26,037,805 branch-misses # 1.74% of all branches +[83.04%] + + 5.214978731 seconds time elapsed +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Example: live-view of page-fault event} +\begin{lstlisting} +# sudo perf top -e page-faults +Samples: 562 of event 'page-faults', Event count (approx.): 4557 + 62.32% libc-2.17.so [.] __memcpy_ssse3_back + 20.36% libc-2.17.so [.] _int_malloc + 3.16% module.so [.] evas_gl_common_context_font_push + 2.83% libevas.so.1.7.7 [.] 0x0000000000083237 + 2.37% libdricore9.0.2.so.1.0.0 [.] 0x0000000000126050 + 1.80% libxul.so (deleted) [.] 0x000000000182e48f + 1.12% [kernel] [k] file_read_actor + 0.92% libfontconfig.so.1.6.2 [.] 0x000000000001bd43 + 0.88% libdrm_intel.so.1.0.0 [.] 0x0000000000008503 + 0.79% libc-2.17.so [.] __memset_sse2 + 0.75% libeet.so.1.7.7 [.] eet_data_image_header_decode_cipher + 0.61% module.so [.] evas_gl_common_context_image_push + 0.42% libfreetype.so.6.10.0 [.] FT_Stream_ReadFields + 0.42% libecore_x.so.1.7.7 [.] ecore_x_netwm_icons_set + 0.24% libelementary.so.1.7.7 [.] 0x000000000005ae60 +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: count CPU cycles of a ls call} +\begin{lstlisting} +# perf record -e cpu-cycles ls +<output of ls> +[ perf record: Woken up 1 times to write data ] +[ perf record: Captured and wrote 0.008 MB perf.data (~334 samples) ] +# perf report +Samples: 24 of event 'cpu-cycles', Event count (approx.): 12333055 + 21.67% ls [kernel.kallsyms] [k] get_unmapped_area + 20.77% ls ld-2.17.so [.] _dl_map_object_deps + 17.21% ls [kernel.kallsyms] [k] __slab_free + 15.73% ls [kernel.kallsyms] [k] tty_insert_flip_string_fixed_flag + 12.65% ls [kernel.kallsyms] [k] unlock_page + 6.94% ls libc-2.17.so [.] __strlen_sse2 + 3.41% ls [kernel.kallsyms] [k] count.isra.17.constprop.28 + 1.02% ls [kernel.kallsyms] [k] get_pageblock_flags_group + 0.41% ls [kernel.kallsyms] [k] perf_event_context_sched_in + 0.13% ls [kernel.kallsyms] [k] perf_ctx_unlock + 0.07% ls [kernel.kallsyms] [k] native_write_msr_safe +\end{lstlisting} +\end{frame} + + +\input{tailpres} diff --git a/kernel-devel/kernel-tracing/pres_kernel-tracing_en.tex b/kernel-devel/kernel-tracing/pres_kernel-tracing_en.tex index d73a10f..d5a9686 100644 --- a/kernel-devel/kernel-tracing/pres_kernel-tracing_en.tex +++ b/kernel-devel/kernel-tracing/pres_kernel-tracing_en.tex @@ -1,19 +1,33 @@ \input{configpres} \title{Kernel-Tracing} -\section{FTRACE} +\section{Overview} \maketitle + +\begin{frame} +\frametitle{Overview} +\tableofcontents +\end{frame} + \begin{frame}[fragile] \frametitle{Kerneltracing: Overview} \begin{itemize} \item DebugFS interface -\item Different tracers: function, function\_graph, sched\_switch, ... +\item Different tracers: function, function\_graph, wakeup, wakeup\_rt, \dots \item Custom trace events \item Graphical frontend (kernelshark) \end{itemize} \end{frame} \begin{frame}[fragile] +\frametitle{Kerneltracing: Overview} +\begin{figure}[h] +\centering +\includegraphics[width=10cm]{images/trace_overview.png} +\end{figure} +\end{frame} + +\begin{frame}[fragile] \frametitle{Kernel-Tracing: DebugFS} \begin{verbatim} $ mount -t debugfs debugfs /sys/kernel/debug @@ -23,27 +37,103 @@ blk function_graph mmiotrace wakeup_rt wakeup \end{verbatim} \end{frame} +\section{Event tracing} +\begin{frame}[fragile] +\frametitle{Event tracing} +current\_tracer can be set to NOP +\begin{verbatim} +$ cd /sys/kernel/debug/tracing +$ ls events/ +[...] +irq +sched +scsi +signal +skb +[...] +\end{verbatim} +\end{frame} \begin{frame}[fragile] -\frametitle{Kerneltracing: Trivial example} +\frametitle{Event tracing} \begin{verbatim} -$ echo function_graph > current_tracer -$ echo 1 > tracing_enabled -$ sleep 1 -$ echo 0 > tracing_enabled -$ less trace -# tracer: function_graph -# CPU DURATION FUNCTION CALLS -# | | | | | | | - 1) | enqueue_entity() { - 1) | update_curr() { - 1) 0.336 us | task_of(); - 1) 1.524 us | } - 1) 0.420 us | place_entity(); +$ cd /sys/kernel/debug/tracing +$ ls -1 events/sched/ +enable +filter +sched_kthread_stop +sched_kthread_stop_ret +sched_migrate_task +sched_pi_setprio +[...] +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Event tracing: Enable events} +\begin{verbatim} +$ cd /sys/kernel/debug/tracing +# Enable ALL events of the group ''sched'' +$ echo 1 > events/sched/enable +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Record a trace} +After enabling the events you want to see, do: +\begin{verbatim} +$ cd /sys/kernel/debug/tracing +# Start recording to the ringbuffer +$ echo 1 > tracing_on +# Stop recording to the ringbuffer +$ echo 0 > tracing_on +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Analyze a trace} +You can even do this while recording! +\begin{verbatim} +$ cd /sys/kernel/debug/tracing +# Just print the current content of the ring buffer +$ cat trace +# or: do a consuming read on the ring buffer +$ cat trace_pipe +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Trace event format and filters} +Each trace event has a specific format and parameters. +You can put a filter on those parameters for recording a trace: +\begin{verbatim} +$ cat events/sched/sched_switch/format +[...] +field:__u8 prev_comm[15]; +field:pid_t prev_pid; +field:int prev_prio; +field:long prev_state; +[...] +$ echo 'next_comm == bash' \ + > events/sched/sched_switch/filter +$ echo 1 > events/sched/sched_switch/enable +$ echo 1 > tracing_on +$ cat trace \end{verbatim} \end{frame} \begin{frame}[fragile] +\frametitle{Tracing on multicore} +\begin{itemize} +\item One ringbuffer per cpu +\item trace contains ALL events +\item the per\_cpu directory contains a trace for each cpu +\item tracing\_cpumask can limit tracing to specific cores +\end{itemize} +\end{frame} + +\section{Tracers} +\begin{frame}[fragile] \frametitle{Tracer: function} \begin{verbatim} # tracer: function @@ -59,56 +149,60 @@ wnck-2022 [003] 5766.659918: kfree <-skb \end{frame} \begin{frame}[fragile] -\frametitle{Tracer: function / latency\_format} +\frametitle{Tracer: function\_graph} \begin{verbatim} -$ echo 1 > options/latency_format +$ echo function_graph > current_tracer +$ echo 1 > tracing_on +$ sleep 1 +$ echo 0 > tracing_on $ less trace -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| /_--=> lock-depth -# |||||/ delay -# cmd pid |||||| time | caller -# \ / |||||| \ | / -wnck-app-2022 3..... 1237702us : skb_relea -wnck-app-2022 3..... 1237703us : sock_wfre +# tracer: function_graph +# CPU DURATION FUNCTION CALLS +# | | | | | | | + 1) | enqueue_entity() { + 1) | update_curr() { + 1) 0.336 us | task_of(); + 1) 1.524 us | } + 1) 0.420 us | place_entity(); \end{verbatim} -\end{frame} +\end{frame} \begin{frame}[fragile] -\frametitle{Tracer: function (custom tracepoint)} +\frametitle{function\_graph: Set a trigger function} +You can set a trigger function for the function\_graph tracer +if you just want to record specific functions and their childs: \begin{verbatim} -$ echo 1 > tracing_enabled -$ echo "MARK" > trace_marker -$ echo 0 > tracing_enabled -$ less trace -... - bash-4328 [003] 5603.687935: get_slab - bash-4328 [003] 5603.687935: _cond_re - bash-4328 [003] 5603.687936: _cond_re - bash-4328 [003] 5603.687939: 0: MARK - bash-4328 [003] 5603.687939: kfree <- -... +echo do_IRQ > set_graph_function +# Additionals triggers can be set with +echo another_function >> set_graph_function \end{verbatim} \end{frame} \begin{frame}[fragile] -\frametitle{Tracer: sched\_switch} +\frametitle{Tracer: function / latency\_format} \tiny \begin{verbatim} -# tracer: sched_switch +$ echo 1 > options/latency_format +# tracer: function # -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - bash-4328 [003] 78.553966: 4328:120:S + [003] 4328:120:S bash - bash-4328 [003] 78.553979: 4328:120:S ==> [003] 0:120:R <idle> -<idle>-0 [003] 78.553986: 0:120:R + [003] 13:120:R ksoftirqd/3 -<idle>-0 [003] 78.553988: 0:120:R ==> [003] 13:120:R ksoftirqd/3 - +# function latency trace v1.1.5 on 3.9.4-x1-00124-g0bfd8ff +# -------------------------------------------------------------------- +# latency: 0 us, #204955/25306195, CPU#0 | (M:desktop VP:0, KP:0, SP:0 HP:0 #P:4) +# ----------------- +# | task: -0 (uid:0 nice:0 policy:0 rt_prio:0) +# ----------------- +# +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / +terminol-11964 1.... 11639243us : ep_read_events_proc <-ep_scan_ready_list.isra.8 \end{verbatim} -\end{frame} +\end{frame} \begin{frame}[fragile] \frametitle{Tracer: wakeup\_rt} @@ -131,6 +225,44 @@ ls-4579 3dN... 5us : _raw_spin_unlock_irqrestore <-try_to_wake_up \end{verbatim} \end{frame} +\section{Kernel function profiler} + +\begin{frame}[fragile] +\frametitle{Kernel function profiler} +\begin{verbatim} +$ echo 1 > function_profile_enabled +$ echo 1 > tracing_on +# then do something... +$ echo 0 > tracing_on +$ less trace_stat/function0 +Function Hit Time Avg +-------- --- ---- --- +__schedule 7064 1958976725 us 277318.3 us +schedule 6961 1958965845 us 281420.1 us +[...] +\end{verbatim} +\end{frame} + +\section{trace\_marker} +\begin{frame}[fragile] +\frametitle{Custom application tracepoints: ''simple method''} +\begin{verbatim} +$ echo 1 > tracing_on +$ echo "MARK" > trace_marker +$ echo 0 > tracing_on +$ less trace +... + bash-4328 [003] 5603.687935: get_slab + bash-4328 [003] 5603.687935: _cond_re + bash-4328 [003] 5603.687936: _cond_re + bash-4328 [003] 5603.687939: 0: MARK + bash-4328 [003] 5603.687939: kfree <- +... +\end{verbatim} +\end{frame} + +\section{trace\_printk} + \begin{frame}[fragile] \frametitle{trace\_printk()} \begin{itemize} @@ -158,6 +290,10 @@ Only trace specific functions. ftrace_notrace= \end{verbatim} Don't trace specific functions. +\begin{verbatim} +trace_event= +\end{verbatim} +Just enable trace events (comma separated list) \end{frame} \begin{frame}[fragile] @@ -170,6 +306,20 @@ echo z > /proc/sysrq-trigger \end{verbatim} \end{frame} +\begin{frame}[fragile] +\frametitle{Trace instances} +You can have separate trace instances with their own +buffers and events: +\begin{verbatim} +$ cd /sys/kernel/debug/tracing +$ mkdir instances/my_inst1 +$ cd instances/my_inst1 +$ echo 1 > events/sched/enable +$ cat trace +[...] +\end{verbatim} +\end{frame} + \section{trace-cmd} \begin{frame} @@ -326,9 +476,200 @@ $ kernelshark -i mytrace.dat \includegraphics[width=10cm]{images/kernelshark_zoom.png} \end{figure} \end{frame} + +\section{Useful things} + +\begin{frame}[fragile] +\frametitle{Control a trace from your kernel code} +\begin{verbatim} +void my_kernel_function(void) +{ + tracing_on(); + do_some_stuff_i_wanna_trace(); + tracing_off(); +} +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Matching PIDs and process names of your trace(s)} +\begin{verbatim} +$ cat saved_cmdlines +[...] +5112 bash +5223 ARTHUR_DENT +5546 kworker/0:2 +8465 kworker/0:0 +[...] +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Where's my thread in the trace?!} +To ''find'' a specific thread in your trace, you can use the +following function to set the thread's name: +\begin{verbatim} +#define _GNU_SOURCE +#include <pthread.h> + +pthread_setname_np(pthread_t thread, + const char *name); +\end{verbatim} +Available since glibc version 2.12 +\end{frame} + +\begin{frame}[fragile] +\frametitle{Thread names: Example} +\begin{verbatim} +/* pthread_example */ +pthread_t test_thread; +[...] +pthread_create(&test_thread, NULL, + my_test_thread, NULL); +[...] +pthread_setname_np(test_thread, "ARTHUR_DENT"); +\end{verbatim} +Check with the ps command: +\begin{verbatim} +$ ps H -C pthread_example -o 'pid tid cmd comm' + PID TID CMD COMMAND +4515 4515 ./pthread_example pthread_example +4515 4516 ./pthread_example ARTHUR_DENT +\end{verbatim} +\end{frame} + \begin{frame} +\frametitle{Thread name in kernelshark} +\begin{figure}[h] +\centering +\includegraphics[width=10cm]{images/pthread_kernelshark.png} +\end{figure} +\end{frame} + +\section{kprobes} +\begin{frame}[fragile] +\frametitle{Dynamic kernel tracepoints: KPROBES} +\begin{itemize} +\item Similar to Tracepoints +\item Can be added / removed dynamically +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Dynamic kernel tracepoints: KPROBES} +\begin{verbatim} +$ echo 'p:my_k_event do_IRQ' > kprobe_events +$ echo 1 events/kprobes/my_k_event/enabled +$ echo 1 > tracing_on +$ cat trace +<idle>-0 [000] d... 545.173709: my_k_event: (do_IRQ+0x0/0xc0) +<idle>-0 [000] d... 545.331051: my_k_event: (do_IRQ+0x0/0xc0) +<idle>-0 [000] d... 545.331490: my_k_event: (do_IRQ+0x0/0xc0) +<idle>-0 [000] d... 545.490730: my_k_event: (do_IRQ+0x0/0xc0) +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Dynamic kernel tracepoints: KPROBES for custom modules} +Let's assume we want to have a tracepoint for the function +hello\_init in the module hello.ko +\begin{verbatim} +# Note: >> will append a new event +$ echo 'p:my_mod_event hello:hello_init' \ + >> kprobe_events +$ echo 1 > events/kprobes/my_mod_event/enable +$ insmod hello.ko +$ cat trace +insmod-9586 [000] d... 13278.003468: my_mod_event: (0xf878d080) +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Dynamic kernel tracepoints: Question / Exercise} +What happens, if we add the following event. What's different? +\begin{verbatim} +# Note >> will append a new event +$ echo 'r:my_exercise_event hello:hello_init' \ + >> kprobe_events +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{KPROBES statistics} +\begin{verbatim} +$ cat kprobe_profile +my_mod_event_ret 2 0 +my_mod_event 2 0 +\end{verbatim} +\end{frame} + +\section{uprobes} +\begin{frame}[fragile] +\frametitle{Dynamic Userspace Tracepoints: uprobes} +\begin{itemize} +\item Similar to kprobes +\item For userspace applications +\item A uprobe event is set on a specific offset in a userland process +\item Powerful method to correlate your kernel and userland events! +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Dynamic Userspace Tracepoints: uprobes} +\begin{verbatim} +$ gcc -Wall -g -o pthread_example \ + pthread_example.c -lpthread +$ objdump -F -D -S pthread_example | less +\end{verbatim} +\begin{verbatim} +08048594 <my_test_thread> (File Offset: 0x594): +[...] +void *my_test_thread(void *x_void_ptr) +[...] + for (i = 0; i < 10; i++) { +80485a1: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +80485a8: eb 1c jmp 80485c6 <my_test_thread+0x32> (File Offset: 0x5c6) + printf("The answer is 42!\n"); +80485aa: c7 04 24 50 87 04 08 movl $0x8048750,(%esp) +\end{verbatim} +So, the file offset for the printf call is 0x5aa ! +\end{frame} + +\begin{frame}[fragile] +\frametitle{Dynamic Userspace Tracepoints: uprobes II} +\begin{verbatim} +echo \ +'p:my_ev /home/devel/pthread/pthread_example:0x5aa' \ + > /sys/kernel/debug/tracing/uprobe_events +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Dynamic Userspace Tracepoints: uprobes III} +\begin{verbatim} +$ cd /sys/kernel/debug/tracing/ +$ echo 1 > events/uprobes/my_ev/enable +$ echo 1 > tracing on +$ /home/devel/pthread_example/pthread_example +$ echo 0 > tracing_on +$ less trace +# TASK-PID CPU# |||| TIMESTAMP FUNCTION +# | | | |||| | | +ARTHUR_DENT-5223 [000] d... 5653.154822: my_ev: (0x80485aa) +ARTHUR_DENT-5223 [000] d... 5654.155723: my_ev: (0x80485aa) +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{uprobes: statistics} +\begin{verbatim} +$ cat uprobe_profile +/home/devel/pthread/pthread_example my_ev 10 +\end{verbatim} +\end{frame} \section{sources} +\begin{frame} \frametitle{sources} \begin{thebibliography}{1} \bibitem{trace1} http://lwn.net/Articles/365835/ diff --git a/kernel-devel/kexec-and-crash-kernel/Makefile b/kernel-devel/kexec-and-crash-kernel/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/kernel-devel/kexec-and-crash-kernel/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff new file mode 100644 index 0000000..1d3e082 --- /dev/null +++ b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff @@ -0,0 +1,65 @@ +From: Magnus Damm <damm at opensource.se> + +Update the copy_oldmem_page() function to ioremap() only +when accessing memory that is outside the regular range +of system memory that is managed by the kernel. + +Without this patch a warning is triggered in the ARM-specific +ioremap implementation, see WARN_ON(pfn_valid()) in ioremap.c + +The copy_oldmem_page() function is used by the secondary crash +kernel to access memory using the /proc/vmcore code implemented +in fs/proc/vmcore.c. To pass information from the first kernel +to the secondary crash kernel a kernel command line option is +used to point out where the elf core hdr is located. + +The crash kernel is loaded through kexec-tools which also contains +code that reserves memory for the elfcorehdr= option. This memory +block is reserved _inside_ the main system memory of the secondary +kernel. The /proc/vmcore code in the secondary kernel is however +using copy_oldmem_page() to access both this elfcorehdr area and +the rest of the memory used by the the first kernel. + +So the copy_oldmem_page() function is used to access data that +may be located in system memory, or it may be outside. Always +using ioremap will not work, so this patch makes it conditional +based on pfn_valid(). + +For more details please look at the sh7372-based example here: +http://permalink.gmane.org/gmane.linux.ports.sh.devel/11502 + +Signed-off-by: Magnus Damm <damm at opensource.se> +--- + + arch/arm/kernel/crash_dump.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +--- 0001/arch/arm/kernel/crash_dump.c ++++ work/arch/arm/kernel/crash_dump.c 2011-06-18 20:59:49.000000000 +0900 +@@ -39,9 +39,13 @@ ssize_t copy_oldmem_page(unsigned long p + if (!csize) + return 0; + +- vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); +- if (!vaddr) +- return -ENOMEM; ++ if (pfn_valid(pfn)) { ++ vaddr = phys_to_virt(pfn << PAGE_SHIFT); ++ } else { ++ vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); ++ if (!vaddr) ++ return -ENOMEM; ++ } + + if (userbuf) { + if (copy_to_user(buf, vaddr + offset, csize)) { +@@ -52,6 +56,8 @@ ssize_t copy_oldmem_page(unsigned long p + memcpy(buf, vaddr + offset, csize); + } + +- iounmap(vaddr); ++ if (!pfn_valid(pfn)) ++ iounmap(vaddr); ++ + return csize; + } diff --git a/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff new file mode 100644 index 0000000..877f5ea --- /dev/null +++ b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff @@ -0,0 +1,28 @@ +Index: kexec-tools-2.0.3/kexec/arch/arm/crashdump-arm.c +=================================================================== +--- kexec-tools-2.0.3.orig/kexec/arch/arm/crashdump-arm.c 2011-10-03 00:56:38.000000000 +0200 ++++ kexec-tools-2.0.3/kexec/arch/arm/crashdump-arm.c 2013-07-06 17:26:13.410309437 +0200 +@@ -204,12 +204,12 @@ + * @cmdline. Note that @cmdline must be at least %COMMAND_LINE_SIZE bytes long + * (including %NUL). + */ +-static void cmdline_add_mem(char *cmdline, unsigned long size) ++static void cmdline_add_mem(char *cmdline, unsigned long size, unsigned long offset) + { + char buf[COMMAND_LINE_SIZE]; + int buflen; + +- buflen = snprintf(buf, sizeof(buf), "%s mem=%ldK", cmdline, size >> 10); ++ buflen = snprintf(buf, sizeof(buf), "%s mem=%ldK@0x%X", cmdline, size >> 10, offset); + if (buflen < 0) + die("Failed to construct mem= command line parameter\n"); + if (buflen >= sizeof(buf)) +@@ -301,7 +301,7 @@ + * prevents the dump capture kernel from using any other memory regions + * which belong to the primary kernel. + */ +- cmdline_add_mem(mod_cmdline, elfcorehdr - crash_reserved_mem.start); ++ cmdline_add_mem(mod_cmdline, elfcorehdr - crash_reserved_mem.start, crash_reserved_mem.start); + + dump_memory_ranges(); + dbgprintf("kernel command line: \"%s\"\n", mod_cmdline); diff --git a/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff new file mode 100644 index 0000000..867e13a --- /dev/null +++ b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff @@ -0,0 +1,13 @@ +Index: linux-3.2/arch/arm/mach-omap2/Makefile.boot +=================================================================== +--- linux-3.2.orig/arch/arm/mach-omap2/Makefile.boot 2012-01-05 00:55:44.000000000 +0100 ++++ linux-3.2/arch/arm/mach-omap2/Makefile.boot 2013-07-06 17:00:18.718516198 +0200 +@@ -1,3 +1,8 @@ ++ifeq ($(CONFIG_CRASH_DUMP),y) ++ zreladdr-y += 0x84008000 ++params_phys-y := 0x84000100 ++else + zreladdr-y += 0x80008000 + params_phys-y := 0x80000100 ++endif + initrd_phys-y := 0x80800000 diff --git a/kernel-devel/kexec-and-crash-kernel/pres_kexec_and_crashkernel_en.tex b/kernel-devel/kexec-and-crash-kernel/pres_kexec_and_crashkernel_en.tex new file mode 100644 index 0000000..1791267 --- /dev/null +++ b/kernel-devel/kexec-and-crash-kernel/pres_kexec_and_crashkernel_en.tex @@ -0,0 +1,70 @@ +\input{configpres} + +\title{Kexec and Crashkernels} +\maketitle +\begin{frame} +\frametitle{What is kexec?} +Kexec is a mechanism to boot Linux from within Linux, +without going through the BIOS / the Bootloader. +\end{frame} + +\begin{frame} +\frametitle{kexec-tools} +http://horms.net/projects/kexec/ +\end{frame} + +\begin{frame}[fragile] +\frametitle{Using kexec: Kernel configuration} +\begin{verbatim} +Boot options --> +[*] Kexec system call +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Using kexec: Booting the new kernel} +\begin{verbatim} +# Load the kernel image and set the commandline +$ kexec -l uImage --append=$(cat /proc/cmdline) +# Start the new kernel +$ kexec -e +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Using kexec: Crashkernel} +\begin{itemize} +\item Build production kernel (enable kexec system call!) +\item Build ''crash kernel'' (enable kexec system call and crash dump kernel): +\begin{verbatim} +Boot options --> +[*] Kexec system call +[*] Build kdump crash kernel +\end{verbatim} +\item The crash kernel option should automatically select /proc/vmcore +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Using kexec: Crashkernel} +\begin{itemize} +\item Boot production kernel (Commandline: crashkernel=256M@0x84000000) +\item Check if crashkernel memory was reserved: +\begin{verbatim} +cat /proc/iomem | grep Crash + 84000000-93ffffff : Crash kernel +\end{verbatim} +\item Load crash kernel and let the system crash ;-) +\begin{verbatim} +kexec -p uImage-crash \ + --append="$(cat /proc/cmdline | \ + sed 's/crashkernel/bla/')" +echo c > /proc/sysrq-trigger +\end{verbatim} +\item After crashing the crash kernel should boot up! +\item Within the crashkernel the core file for the production kernel is available in /proc/vmcore +\end{itemize} +\end{frame} + +\input{tailpres} diff --git a/linux-basics/filesystems/pres_filesystems_en.tex b/linux-basics/filesystems/pres_filesystems_en.tex index 5b1149b..e6339e5 100644 --- a/linux-basics/filesystems/pres_filesystems_en.tex +++ b/linux-basics/filesystems/pres_filesystems_en.tex @@ -29,6 +29,10 @@ \item ReiserFS \item XFS \end{itemize} +Filesystem for ''flash based'' block devices: +\begin{itemize} +\item F2FS +\end{itemize} \end{frame} \subsubsection{For flash} @@ -71,7 +75,8 @@ size of a filesystem \begin{itemize} \item \textbf{N}o journalling filesystem \item A good choice for ''flash-based block devices'', like SD cards or USB -sticks (ext2 minimizes the number of writes) +sticks (ext2 minimizes the number of writes), if you have heavy write access. F2FS +might be an alternative for flash devices \item Supported block sizes: 1kb, 2kb, 4kb, 8kb \item Max. filesystem size: 32TB (for 8kb blocks) \end{itemize} @@ -113,6 +118,16 @@ sticks (ext2 minimizes the number of writes) \subsubsection{Flash filesystems} \begin{frame} +\frametitle{F2FS} +\begin{itemize} +\item F lash F riendly F ilesystem +\item Available since Linux Kernel 3.8 (backports available back to 3.0) +\item Not a ''real'' flashfilesystem +\item For ''NAND flash based'' block devices, like SD, MMC, eMMC, ... +\end{itemize} +\end{frame} + +\begin{frame} \frametitle{JFFS2} \begin{itemize} \item Flash filesystem diff --git a/realtime/rt-internals/Makefile b/realtime/rt-internals/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/realtime/rt-internals/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/realtime/rt-internals/pres_rt-internals_en.tex b/realtime/rt-internals/pres_rt-internals_en.tex new file mode 100644 index 0000000..baeb2e1 --- /dev/null +++ b/realtime/rt-internals/pres_rt-internals_en.tex @@ -0,0 +1,511 @@ +% on the following slides, include icon in the left sidebar +\def\lximg{/usr/share/lx/icons/fueller.png} + +\input{configpres} + +\title{Linux Preempt-RT internals} +\maketitle + +% stop displaying 'fueller.png' on the following slides +\def\lximg{none} + +\subsection{Linux Real-Time history} +\begin{frame}[fragile] +\frametitle{Linux Real-Time history} +\begin{beamerboxesrounded}[shadow=true]{First projects in the late 1990s} +\begin{itemize} +\item KURT - Kansas University +\item RTAI - University of Milano +\item RTLinux - New Mexico Tech - Soccoro, New Mexico +\item Linux/RK - Carnegie Mellon Univeristy, Pittsburgh +\item QLinux - University of Massachusetts +\item DROPS - University of Dresden +\item ... +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Linux Real-Time history} +\begin{beamerboxesrounded}[shadow=true]{Approaches} +\begin{itemize} +\item Linux as the idle thread of a nano/micro kernel +\item Linux with implicit Real-Time properties +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Linux Real-Time history} +\begin{beamerboxesrounded}[shadow=true]{Opinion I} +\begin{quote} +With RTLinux, you have to split the app up into the hard realtime part +and the rest. +\newline +Which is, in my opinion, the only sane way to handle hard realtime. No +confusion about priority inversions, no crap. +\end{quote} +\begin{flushright} +Linus Torvalds - 2002 +\end{flushright} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Linux Real-Time history} +\begin{beamerboxesrounded}[shadow=true]{Opinion II} +\begin{quote} +It is impossible to turn a General Purpose Operating System Kernel +into a Real-Time Operating System Kernel! +\end{quote} +\begin{flushright} +Unknown participant of a podium discussion about Linux Real-Time - 2004 +\end{flushright} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Linux Real-Time history} +\begin{beamerboxesrounded}[shadow=true]{Preempt-RT} +\begin{itemize} +\item Started 2004 by Ingo Molnar +\item In kernel real-time approach +\item Driven by mainline kernel developers +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Linux Real-Time history} +\begin{beamerboxesrounded}[shadow=true]{Opinion III} +\begin{quote} +Controlling a laser with Linux is crazy, but everyone in this room is +crazy in his own way. So if you want to use Linux to control an +industrial welding laser, I have no problem with your using +PREEMPT\_RT. +\end{quote} +\begin{flushright} +Linus Torvalds - 2006 +\end{flushright} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT goals} + +\begin{frame}[fragile] +\frametitle{Preempt-RT goals} +\begin{beamerboxesrounded}[shadow=true]{What's the goal?} +\begin{itemize} +\item Full Linux kernel hardware support +\item Standard posix interface +\item No specialized user space ABI +\item Full reuse of existing tools +\item Scalability +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT goals} +\begin{beamerboxesrounded}[shadow=true]{What's the target application space?} +\begin{itemize} +\item The majority of Real-Time applications +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT properties} +\begin{frame}[fragile] +\frametitle{Preempt-RT properties} +\begin{beamerboxesrounded}[shadow=true]{Is it hard realtime?} +\begin{itemize} +\item Not by the requirement of mathematical proof +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT properties} +\begin{beamerboxesrounded}[shadow=true]{Is mathematical proof feasible?} +\begin{itemize} +\item Not for complex systems +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT properties} +\begin{beamerboxesrounded}[shadow=true]{Can it be verified?} +\begin{itemize} +\item Empirical verfication +\item Open and documented testing efforts (OSADL, RedHat) +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT technology} +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Why is mainline not realtime capable?} +\begin{itemize} +\item Hard interrupt context +\item Soft interrupt context +\item Interrupt disabled regions +\item Preemption disabled regions +\item No protection against priority inversion +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Hard interrupt context} +\begin{itemize} +\item Runs with interrupts disabled +\item Executes driver interrupt handlers +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Soft interrupt context} +\begin{itemize} +\item Runs with preemption disabled, mostly on return from hard interrupt context +\item Executes driver and infrastructure callbacks +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Interrupt disabled regions} +\begin{itemize} +\item Mostly in context of spinlocks and rwlocks +\item Few places which require explicit interrupt disable +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Why spinlocked interrupt disabled regions} +\begin{table} +\begin{tabular}{ll} + \textbf{thread} & \textbf{interrupt} \\ + spin\_lock(lock); & \\ + interrupt & \\ + & interrupt handler \\ + & spin\_lock(lock); \\ + & DEADLOCK! \\ +\end{tabular} +\end{table} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Preemption disabled regions} +\begin{itemize} +\item Mostly in context of spinlocks and rwlocks +\item Also protects per cpu variables +\item Few places which require explicit preemption disable +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Why spinlocked preempt disabled regions} +\begin{table} +\begin{tabular}{ll} + \textbf{thread A} & \textbf{thread B} \\ + spin\_lock(lock); & \\ + preemption & \\ + & spin\_lock(lock);\\ + & DEADLOCK! \\ +\end{tabular} +\end{table} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{spinlocks} +\begin{itemize} +\item RT separates them into spinlock and raw\_spinlock +\item raw\_spinlock in RT is identical to mainline +\item spinlock in RT is replaced by a "'sleeping"' spinlock +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Reader/Writer locks} +\begin{itemize} +\item rwlock in RT is replaced by a "'sleeping"' spinlock +\item Readercount in RT is limited to 1 +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Lock replacement requires} +\begin{itemize} +\item Forced interrupt threading +\item Forced soft interrupt threading +\item Substitution of percpu constructs +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Lock replacement requires} +Preservation of migration disable. In mainline migration is disabled by +\begin{itemize} +\item interrupt disable +\item preempt disable +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Priority inversion} +\begin{center} +\includegraphics[scale=0.4]{images/pinv.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Priority inheritance} +\begin{center} +\includegraphics[scale=0.4]{images/pinh.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Priority inheritance} +\begin{itemize} +\item Kernelimplementation: rtmutex +\item Nested lock boosting +\item User space interface: futex (pthread\_mutex) +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Lock replacement} +\begin{itemize} +\item Wrapper around rtmutex +\item Adaptive spinning for spinlocks and rwlocks +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Lock replacement} +All locking primitives are replaced except +\begin{itemize} +\item raw\_spinlock +\item semaphore +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Why are semaphores special?} +\begin{itemize} +\item No strict owner semantics +\item No owner, no boosting +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Further changes} +\begin{itemize} +\item per cpu locks +\item preemptible RCU +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Per CPU locks} +Protect regions which are in mainline protected by +\begin{itemize} +\item preemption disable +\item interrupt disable +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Preemptible RCU} +What's RCU? +\begin{itemize} +\item Read Copy Update +\item Scalability replacement for reader/writer locks +\item Restricted bulk refcounting +\item Poor mans garbage collector +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Preemptible RCU} +What's RCU? +\begin{center} +\includegraphics[scale=0.4]{images/GracePeriodGood.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Preemptible RCU} +RCU versus rwlocks +\begin{center} +\includegraphics[scale=0.4]{images/rwlockRCUupdate.jpg} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT technology} +\begin{beamerboxesrounded}[shadow=true]{Preemptible RCU} +\begin{itemize} +\item Original RCU implementation relied on preempt disable +\item Preemptible implementation is in mainline +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT source impact} + +\begin{frame}[fragile] +\frametitle{Preempt-RT source impact} +\begin{beamerboxesrounded}[shadow=true]{Kernel source structure} +\begin{center} +\includegraphics[scale=0.35]{images/ksource.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT source impact} +\begin{beamerboxesrounded}[shadow=true]{Kernel source structure RT patch} +\begin{center} +\includegraphics[scale=0.4]{images/rtsource.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT source impact} +\begin{beamerboxesrounded}[shadow=true]{Architecture source structure} +\begin{center} +\includegraphics[scale=0.35]{images/asource.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT source impact} +\begin{beamerboxesrounded}[shadow=true]{Architecture source structure, RT patch} +\begin{center} +\includegraphics[scale=0.35]{images/rtarch.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT source impact} +\begin{beamerboxesrounded}[shadow=true]{Core source structure} +\begin{center} +\includegraphics[scale=0.35]{images/kdirsource.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT source impact} +\begin{beamerboxesrounded}[shadow=true]{Core source structure, RT patch} +\begin{center} +\includegraphics[scale=0.4]{images/rtkernel.png} +\end{center} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT downsides} + +\begin{frame}[fragile] +\frametitle{Preempt-RT downsides} +\begin{beamerboxesrounded}[shadow=true]{Determinism comes with a prize} +\begin{itemize} +\item Reduced throughput +\item Measurable I/O performance impact +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT influence on mainline Linux} + +\begin{frame}[fragile] +\frametitle{Preempt-RT influence on mainline Linux} +\begin{beamerboxesrounded}[shadow=true]{Most of it is upstream} +\begin{itemize} +\item More than 95\% of the development has been merged +\item Only the hard to solve issues are left +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Preempt-RT influence on mainline Linux} +\begin{beamerboxesrounded}[shadow=true]{What has been achieved?} +\begin{itemize} +\item Generic interrupt subsystem +\item Generic timekeeping subsystem +\item Generic timer subsystem +\item High resolution timers +\item NOHZ infrastructure +\item Preemptible RCU +\item Consolidated locking infrastructure +\item Lock dependency validator +\item Tracing +\item ... +\end{itemize} +\end{beamerboxesrounded} +\end{frame} + +\subsection{Preempt-RT and Linus Torvalds} + +\begin{frame}[fragile] +\frametitle{Preempt-RT} +\begin{beamerboxesrounded}[shadow=true]{Famous last words} +\begin{quote} +And yeah, I still think the hard-RT people are mostly crazy. +\end{quote} +\begin{flushright} +Linus Torvalds - 2010 +\end{flushright} +\end{beamerboxesrounded} +\end{frame} + +\input{tailpres} diff --git a/realtime/rt-specialties/pres_rt-specialties_de.tex b/realtime/rt-specialties/pres_rt-specialties_de.tex index 85cf301..7061ea4 100644 --- a/realtime/rt-specialties/pres_rt-specialties_de.tex +++ b/realtime/rt-specialties/pres_rt-specialties_de.tex @@ -199,11 +199,10 @@ void stack_prefault(void) { \frametitle{Cyclictest + FTrace} \begin{lstlisting}[basicstyle=\ttfamily\fontsize{8}{10}\selectfont] # mount DebugFS -mkdir -p /mnt/debugfs -mount -t debugs debugfs /mnt/debugfs +mount -t debugs debugfs /sys/kernel/debug # list available tracers -zi:~# cat /mnt/debugfs/tracing/available_tracers +zi:~# cat /sys/kernel/debug/tracing/available_tracers wakeup_rt wakeup preemptoff function sched_switch nop \end{lstlisting} \end{frame} |
