\documentclass{beamer} \usetheme{linutronix} \usepackage{german} \usepackage[utf8]{inputenc} \usepackage{pgf} \usepackage{graphicx} \usepackage{lxextras} \title{Block \lq Cross Development\rq} \institute{Linutronix GmbH} \lstset{keywordstyle=\color{blue},commentstyle=\color{orange}} \begin{document} \maketitle \begin{frame} \frametitle{Übersicht} \tableofcontents \end{frame} \section{Cross Übersetzen} \begin{frame}[containsverbatim] \frametitle{Cross ''Hello world''} \begin{lstlisting}[language=c] /* cross_hello.c */ #include int main(void) { printf("Hello cross compiling world\n"); return 0; } \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Übersetzen für das Zielsystem} \begin{lstlisting}[language=bash] # Uebersetzen powerpc-linux-gnu-gcc -static -o cross_hello \ cross_hello.c \end{lstlisting} \begin{lstlisting}[language=bash] # Executable ueberpruefen $ file cross_hello cross_hello: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.10, with unknown [...] not stripped \end{lstlisting} \end{frame} \section{Testing auf dem Host} \begin{frame} \frametitle{Qemu als Werkzeug zur Cross Entwicklung} \begin{alertblock}{Was ist Qemu?} Qemu ist eine sehr performante Emulations- und Virtualisierungsumgebung für alle gängigen CPU Architekturen. \end{alertblock} \end{frame} \begin{frame}[containsverbatim] \frametitle{Testen eines Executables mit der Qemu user emulation} \begin{lstlisting}[language=bash] $ ./cross_hello bash: ./cross_hello: cannot execute binary file $ qemu-ppc ./cross_hello Hello cross compiling world \end{lstlisting} \end{frame} \section{Rootfilesystem} \subsection{Filesystem from scratch} \begin{frame} \frametitle{Komponenten des Zielsystems} \begin{overprint} \onslide <1> \begin{figure}[h] \centering \includegraphics[width=6cm]{images/target.png} \end{figure} \onslide <2> \begin{figure}[h] \centering \includegraphics[width=6cm]{images/target_highlight_rfs.png} \end{figure} \end{overprint} \end{frame} \begin{frame}[containsverbatim] \frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur} 1) Busybox \begin{lstlisting}[language=bash] mkdir -p /tftpboot/nfsroot cd busybox-1.16.1 make menuconfig make CROSS_COMPILE=powerpc-linux-gnu- install rsync -Hav _install/ /tftpboot/nfsroot cd /tftpboot/nfsroot \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur} 2) Grundstruktur erstellen: \begin{lstlisting}[language=bash] # Verzeichnisstruktur mkdir lib etc tmp dev mnt sys proc # Devices nodes (als root!) mknod dev/console c 5 1 mknod dev/null c 1 3 mknod dev/ttyS0 c 4 64 mknod dev/tty0 c 4 0 mknod dev/tty1 c 4 1 mknod dev/tty2 c 4 2 mknod dev/tty3 c 4 3 mknod dev/tty4 c 4 4 \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur} 3) Startscript(e) erstellen \begin{lstlisting}[language=bash] cd /tftpboot/nfsroot mkdir etc/init.d vim etc/init.d/rcS \end{lstlisting} /etc/rc.d/rcS: \begin{verbatim} #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys mount -o remount,rw / \end{verbatim} \begin{lstlisting}[language=bash] chmod u+x etc/rc.d/rcS \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur} 4) Libraries kopieren \begin{lstlisting}[language=bash] # Loader $ cp /path_to_my_libc/lib/ld.so.1 \ /tftpboot/nfsroot/lib # Getting the dependencies and copy them $ powerpc-linux-gnu-objdump -x \ /tftpboot/nfsroot/bin/busybox | grep NEEDED NEEDED libm.so.6 NEEDED libc.so.6 $ cp /path_to_my_libc/lib/libm.so.6 \ /tftpboot/nfsroot/lib $ cp /path_to_my_libc/lib/libc.so.6 \ /tftpboot/nfsroot/lib \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur} 5) Berechtigungen korrigieren: \begin{lstlisting}[language=bash] chown -R root:root /tftpboot/nfsroot \end{lstlisting} That's it!! :) \end{frame} \subsection{Exportieren per NFS} \subsubsection{Konfiguration} \begin{frame}[containsverbatim] \frametitle{Exportieren per NFS} 1) nfs-kernel-server installieren \begin{lstlisting} # Auf Debian basierten Systemen (als root) apt-get install nfs-kernel-server \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Exportieren per NFS} 2) Directory exportieren \begin{lstlisting}[language=bash] vim /etc/exports \end{lstlisting} \begin{verbatim} /tftpboot/nfsroot \ 192.168.0.0/255.255.255.0\ (rw,no_root_squash,no_subtree_check,insecure) \ 127.0.0.1\ (rw,no_root_squash,no_subtree_check,insecure) \ 10.0.2.0/255.255.255.0\ (rw,no_root_squash,no_subtree_check,insecure) \end{verbatim} \begin{lstlisting}[language=bash] /etc/init.d/nfs-kernel-server restart \end{lstlisting} \end{frame} \subsubsection{Filesystem mit Qemu testen} \begin{frame}[containsverbatim] \frametitle{RFS mit Qemu booten} \begin{lstlisting} qemu-system-ppc -nographic \ -kernel images/vmlinux \ -append \ "console=ttyS0 ip=dhcp \ root=/dev/nfs \ nfsroot=10.0.2.2:/tftpboot/nfsroot" \ -net nic -net user \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{RFS mit Qemu booten} \begin{verbatim} [...] IP-Config: Got DHCP answer from 10.0.2.2, my address IP-Config: Complete: device=eth0, addr=10.0.2.15, mask=255.255.255.0 host=10.0.2.15, domain=, nis-domain=(none), bootserver=10.0.2.2, rootserver=10.0.2.2, rootpath= Looking up port of RPC 100003/2 on 10.0.2.2 Looking up port of RPC 100005/1 on 10.0.2.2 VFS: Mounted root (nfs filesystem) readonly. Freeing unused kernel memory: 208k init Please press Enter to activate this console. \end{verbatim} \end{frame} \begin{frame} \frametitle{Congrats!!!} Ihr erstes eigenes Linux System!! :) \end{frame} \subsection{RFS um SSH erweitern} \begin{frame} \frametitle{dropbear} Dropbear ist eine schlanke SSH Server und Client Implementierung und wird daher recht häufig in Embedded Systemen verwendet. \begin{alertblock}{Vorteile} \begin{itemize} \item Einfach zu übersetzen \item Schlank / Wenig Footprint \item Einfach Konfiguration \end{itemize} \end{alertblock} \begin{alertblock}{Nachteile} \begin{itemize} \item Keine eigene SFTP Implementierung \end{itemize} \end{alertblock} \end{frame} \begin{frame}[containsverbatim] \frametitle{Dropbear übersetzen} \begin{lstlisting}[language=bash] $ ./configure --host=powerpc-linux-gnu \ --disable-zlib --prefix=/usr make # Als root make DESTDIR=/tftpboot/nfsroot install \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Dropbear: Benötigte Bibliotheken} \begin{lstlisting}[language=bash] # Schritt 1: libnss cp /path_to_my_libc/lib/libnss_* lib/ # Schritt 2: It's your turn! \end{lstlisting} Aufgabe: Ermitteln der benötigten Bibliotheken von Dropbear und kopieren an die richtige Stelle im RFS. \end{frame} \begin{frame}[containsverbatim] \frametitle{Dropbear: Benötigte Bibliotheken / Lösung} \begin{lstlisting}[language=bash] $ powerpc-linux-gnu-objdump -x \ /tftpboot/nfsroot/usr/sbin/dropbear | grep NEEDED NEEDED libutil.so.1 NEEDED libcrypt.so.1 NEEDED libc.so. $ cp /path_to_my_libc/libcrypt.so.1 \ /tftpboot/nfsroot/lib $ cp /path_to_my_libc/libutil.so.1 \ /tftpboot/nfsroot/lib \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{RFS um SSH erweitern} Vorbereitungen: \begin{lstlisting}[language=bash] cd /tftpboot/nfsroot mknod dev/urandom c 1 9 mknod dev/ptmx c 5 2 mkdir root echo "root:x:0:0::/root:/bin/sh" >> etc/passwd echo "root:x:0:" >> etc/group mkdir dev/pts mkdir etc/dropbear \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Password für root setzen} \begin{lstlisting}[language=bash] qemu-system-ppc -nographic \ -kernel images/vmlinux \ -append "console=ttyS0 ip=dhcp root=/dev/nfs \ nfsroot=10.0.2.2:/tftpboot/nfsroot" \ -net nic -net user,hostfwd=tcp::12345-:22 \end{lstlisting} \begin{lstlisting}[language=bash] # Im gebooteten System: passwd \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{Dropbear: Startskript erweitern} \begin{lstlisting}[language=bash] vim /tftpboot/nfsroot/etc/init.d/rcS \end{lstlisting} \begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{7}{7}\selectfont] [...] mount devpts /dev/pts -t devpts if [ ! -f /etc/dropbear/dropbear_rsa_host_key ] then dropbearkey -type rsa -f /etc/dropbear/dropbear_rsa_host_key fi if [ ! -f /etc/dropbear/dropbear_dss_host_key ] then dropbearkey -type dss -f /etc/dropbear/dropbear_dss_host_key fi /usr/sbin/dropbear \end{lstlisting} \end{frame} \begin{frame}[containsverbatim] \frametitle{SSH testen} \begin{enumerate} \item Qemu session starten: \begin{lstlisting}[language=bash] qemu-system-ppc -nographic \ -kernel images/vmlinux \ -append "console=ttyS0 ip=dhcp root=/dev/nfs \ nfsroot=10.0.2.2:/tftpboot/nfsroot" \ -net nic -net user,hostfwd=tcp::12345-:22 \end{lstlisting} \item Vom Host-System: \begin{lstlisting}[language=bash] ssh -p 12345 root@localhost \end{lstlisting} \begin{verbatim} root@localhost's password: # \end{verbatim} \end{enumerate} \end{frame} \subsection{Filesystem auf dem Target testen} \begin{frame} \frametitle{Auf dem Target} HAND'S ON! :) \end{frame} \end{document}