\input{configpres} \title{Der Linux-Boot-Prozess} \maketitle \subsection{Bootprozess} \begin{frame} \frametitle{Komponenten des Bootprozesses} \begin{itemize} \item Bootloader \item Linux \item ''Userspace'' \end{itemize} \end{frame} \begin{frame} \frametitle{Ablauf des Bootprozesses} \begin{enumerate} \item Bootloader initialisiert Hardware \item Bootloader reloziert Kernel \item Bootloader übergibt Parameter und startet Kernel \item Linux bootet \item Linux Kernel bindet RFS ein \item Linux Kernel startet ersten Prozeß (/sbin/init, /linuxrc, oder mit init= spezifizierter Prozeß) \end{enumerate} \end{frame} \begin{frame} \frametitle{Aufgaben des Bootloaders} \begin{itemize} \item Low-Level-Initialisierung: \item Clocks (CPU, PLLs, Peripherie...) \item Speicher (DRAM-Controller, NAND-Controller...) \item serielle Schnittstelle \item Parameterübergabe an den Linux Kernel \end{itemize} \end{frame} \begin{frame} \frametitle{Der Linux Kernel} \begin{itemize} \item Setzt Interrupts auf (z.B. Timer Interrupt) \item Lädt Treiber, initialisiert Hardware \item Mountet ''root filesystem'' nach / \item Startet ersten Prozeß \end{itemize} \end{frame} \subsection{INIT Systeme} \begin{frame} \frametitle{Das INIT System} \begin{itemize} \item System V Init (z.B. Debian) \item Upstart (Ubuntu) \item systemd (z.B. Fedora) \end{itemize} \end{frame} \begin{frame} \frametitle{System V Init} \begin{itemize} \item Verhalten in /etc/inittab definiert \item Startscripte in /etc/init.d \item Aufteilung in sogenannte Runlevels \item Runlevel beschreiben verschiedene Systemzustände (Shutdown, Single-User, Multi-User mit / ohne Netzwerk, ...) \item System V kennt keine Abhängigkeiten, sequentielles Ausführen der Startscripte \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Upstart} \begin{itemize} \item Ereignisgesteuert \item Kein /etc/inittab !! \item Konfigurationsdateien in /etc/init/, Beispiel: \begin{verbatim} start in stopped rc RUNLEVEL=[2345] stop on runlevel [!2345] respawn exec /sbin/getty -8 38400 tty1 \end{verbatim} \item Upstart benötigt Runlevel, bildet aus Kompatibilitätsgründen aber Runlevel nach \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Upstart: Erweitertes Beispiel} \begin{verbatim} # /etc/init/smbd.conf description "SMB/CIFS File Server" author "Steve Langasek" start on (local-filesystems and net-device-up) stop on runlevel [!2345] respawn [...] \end{verbatim} \end{frame} \begin{frame}[fragile] \frametitle{Upstart: Erweitertes Beispiel} \begin{verbatim} # /etc/init/network-interface.conf description "configure network device" emits net-device-up emits net-device-down [...] \end{verbatim} \end{frame} \begin{frame} \frametitle{systemd} \begin{itemize} \item Kann Prozesse parallel starten (ohne explizite Konfiguration der Abhängigkeiten): \begin{itemize} \item Legt Sockets zur Kommunikation der zu startenden Prozesse an \item Dorthin geschriebene Daten werden so lange gepuffert, bis der zu startende Prozeß diese entgegennehmen kann \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{systemd} \begin{itemize} \item Konfiguration durch einzelne Textdateien und nicht durch Shellscripte \item Aktionen werden basierend von diesen Konfigurationen von systemd (Linux-Executable) ausgeführt. Dies vermeidet das Starten vieler einzelner Shell-Instanzen. \item Administraion mittels systemctl \end{itemize} \end{frame} \begin{frame} \frametitle{systemd} \begin{itemize} \item Targets übernehmen die Rolle von Runleveln (z.B. Runlevel 0 == poweroff.target) \item Mehrere Targets können gleichzeitig aktiv sein \item Konfigurationsdateien in /etc/systemd und /lib/systemd \end{itemize} \end{frame} \begin{frame} \frametitle{systemd} \begin{itemize} \item Kompatibel zu System V Init. Skripte, die in /etc/init.d liegen, werden wie gewohnt gestartet \item Verwendet ''Control Groups'' zur Überwachung / Ausführung von Prozessen (daher mind. Kernel 2.6.24; und CGROUPS in .config aktivieren!!) \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{systemd: Integrieren eigener Services} /lib/systemd/system/training.service \begin{verbatim} [Unit] Description=Just a simple systemd service [Service] Type=oneshot ExecStart=/home/devel/systemd_test.sh StandardOutput=syslog RemainAfterExit=yes [Install] WantedBy=multi-user.target \end{verbatim} \end{frame} \begin{frame}[fragile] \frametitle{systemd: Integrieren eigener Services} /home/devel/systemd\_test.sh \begin{verbatim} #!/bin/sh echo "Here I AM :)" sleep 5 \end{verbatim} \end{frame} \begin{frame}[fragile] \frametitle{systemd: Integrieren eigener Services} /home/devel/systemd\_test.sh \begin{verbatim} $ systemctl enable training.service ln -s '/lib/systemd/system/training.service' '/etc/systemd/system/multi-user.target.wants/training.service' \end{verbatim} \end{frame} \subsection{Bootzeitanalyse} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: Bootloader} Use the scope, Luke! ;) \begin{figure}[h] \centering \includegraphics[height=5cm]{images/at91_ipl_quiet_lpj_lzo.png} \end{figure} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: Kernel} \begin{itemize} \item Booten des Targets mit initcall\_debug und printk.time=1 \item Auf dem Target: dmesg > bootlog.txt \item bootlog.txt auf den Host kopieren \item Auf dem Host: perl pfad\_zu\_kerneltree/scripts/bootgraph.pl < bootlog.txt > bootlog.svg \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: Kernel} \begin{figure}[h] \centering \includegraphics[height=5cm]{images/bootlog.png} \end{figure} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: SystemV} Analyse des Bootprozesses mit bootchart: \begin{itemize} \item Booten des Targets mit init=/sbin/bootchartd \item Nach dem Booten, stoppen von Bootchartd auf dem Target: \begin{verbatim} /sbin/bootchartd stop \end{verbatim} \item /var/log/bootchart.tgz auf den Host kopieren \item Auf dem Host SVG Grafik generieren: \begin{verbatim} java -jar bootchart.jar -f svg bootchart.tgz \end{verbatim} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: SystemV / bootchart} \begin{figure}[h] \centering \includegraphics[height=5cm]{images/bootchart.png} \end{figure} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: systemd} Analyse des Bootprozesses mit systemd: \begin{itemize} \item Booten des Targets per systemd \item Nach dem Booten systemd-analyze auf dem Target aufrufen \begin{verbatim} $ systemd-analyze blame 1897ms networking.service 1715ms vmware-tools.service 1234ms nfs-common.service # oder $ system-analyze plot > boot.svg \end{verbatim} \item Ausgaben oder Plot auf den Host kopieren und analysieren \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: systemd-analyze plot} \begin{figure}[h] \centering \includegraphics[width=8cm]{images/debian_systemd_top.png} \end{figure} \end{frame} \begin{frame}[fragile] \frametitle{Bootzeitanalyse: systemd-analyze plot} \begin{figure}[h] \centering \includegraphics[width=8cm]{images/debian_systemd_bottom.png} \end{figure} \end{frame} \begin{frame} \frametitle{Quellen} \begin{thebibliography}{1} \bibitem{kof} Linux 2012, Michael Kofler, PEARSON Verlag \bibitem{heise} http://www.heise.de/open/artikel/Das-Init-System-Systemd-Teil-1-1563259.html \end{thebibliography} \end{frame} \input{tailpres}