summaryrefslogtreecommitdiff
path: root/linux-basics
diff options
context:
space:
mode:
Diffstat (limited to 'linux-basics')
-rw-r--r--linux-basics/Makefile6
-rw-r--r--linux-basics/boot-process/handout_boot-process_de.tex150
-rw-r--r--linux-basics/sh-programming/Makefile9
-rw-r--r--linux-basics/sh-programming/handout_sh-programming_de.tex207
-rw-r--r--linux-basics/sh-programming/pres_sh-programming_de.tex247
-rw-r--r--linux-basics/what-is-linux/pres_what-is-linux_de.tex13
6 files changed, 610 insertions, 22 deletions
diff --git a/linux-basics/Makefile b/linux-basics/Makefile
new file mode 100644
index 0000000..ab3b327
--- /dev/null
+++ b/linux-basics/Makefile
@@ -0,0 +1,6 @@
+SUBDIRS = boot-process filesystem-structure important-tools linux-processes sh-programming what-is-linux
+
+all clean::
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && make $@); \
+ done
diff --git a/linux-basics/boot-process/handout_boot-process_de.tex b/linux-basics/boot-process/handout_boot-process_de.tex
index 4c391b2..7f39dc7 100644
--- a/linux-basics/boot-process/handout_boot-process_de.tex
+++ b/linux-basics/boot-process/handout_boot-process_de.tex
@@ -1,17 +1,155 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Der Linux-Boot-Prozess}
-\subsection*{Abschnitt1}
+\subsection*{Aufgaben des Bootloaders}
-Text
+Hauptaufgabe des Bootloaders ist die rudimentäre Initialisierung der
+Hardware, so dass mindestens das RAM benutzt werden kann. Dazu ist auf den
+meisten Boards die Initialisierung eines (S)DRAM-Controllers erforderlich.
-\subsection*{Abschnitt2}
+Soll das Board aus einem NAND-Flash booten können, so muss auch dessen
+Controller initialisiert werden.
-Text
+Viele Prozessoren beinhalten PLLs, die aus dem Prozessortakt andere Clocks
+für verschiedene Peripherie-Einheiten generieren. Auch diese müssen
+initialisiert werden.
+
+Anschließend müssen die Peripherie-Einheiten initialisiert werden, die
+der Bootloader benötigt, um den Kernel laden zu können. Für TFTP-Boot wäre
+dies beispielsweise der Netzwerk-Chip.
+
+Meist ist es auch erwünscht, dass der Bootloader eine serielle Schnittstelle
+initialisiert. Dies ermöglicht nicht nur hilfreiche Meldungen aus dem
+Bootloader, es ermöglicht auch dem Kernel bereits im frühen Stadium des
+Bootvorgangs die Ausgabe von Meldungen (und nicht erst nach dem Laden seines
+UART-Treibers und der Konsole). Viele Bootloader bieten ausserdem eine Art
+Monitorprogramm, mit dem man mit Hilfe eines Terminalprogramms interaktiv
+Einstellungen ändern oder Speicher lesen und schreiben kann.
+
+Nach erfolgreicher Initialisierung lädt der Bootloader von der gewählten
+Quelle das komprimierte Kernel-Image ins RAM. Am Anfang eines komprimierten
+zImage steht (natürlich unkomprimiert) der Dekompressor-Code. Der Bootloader
+springt diese Adresse an und hat damit seine Arbeit beendet. Alles weitere
+läuft im Kernel ab.
+
+\subsection*{Gängige Bootloader}
+
+Die Wahl des Bootloaders ist weitgehend eine Geschmacksfrage. Die
+verbreiteten Bootloader U-Boot und Redboot bieten im Wesentlichen die gleiche
+Funktionalität. Die Bedienung unterscheidet sich zwar deutlich, aber der
+ohnehin nötige Einarbeitungsaufwand dürfte bei beiden etwa gleich sein.
+
+Auch beim Kompilieren dieser Bootloader sind die Unterschiede nicht gross.
+Beide zeichnen sich durch schwer durchschaubaren Sourcecode und ein
+eigenwilliges Buildsystem aus.
+
+Es gibt aber auch die Möglichkeit, ganz auf einen derartigen Bootloader zu
+verzichten. Statt dessen verwendet man einen minimalen \emph{Initial Program
+Loader (IPL)}, der lediglich die rudimentären Initialisierungsaufgaben
+erfüllt und danach einen minimalen Bootkernel lädt und ausführt. Dieser
+lädt wiederum den eigentlichen Produktiv-Kernel nach.
+
+Vorteile der letztgenannten Vorgehensweise sind hohe Flexibilität und die
+Tatsache, dass man im Bootkernel schon nach wenigen hundert Millisekunden
+jeden gewünschten Treiber zur Verfügung hat. Dadurch können in elegante
+Weise Anforderungen wie das Anzeigen eines Bildes auf einem TFT (500
+Millisekunden nach dem Einschalten) gelöst werden. Wollte man dies mit
+einem der oben erwähnten Bootloader erreichen, müsste man zunächst die
+für das TFT benötigten Treiber vom Kernel in den Bootloader portieren und
+dort zum Laufen bringen. Ähnliches gilt für andere gängige Forderungen,
+wie das Booten von einem USB-Stick.
+
+Es erscheint als überflüssige Mühe, einen im Kernel bereits
+funktionierenden Treiber in den Bootloader portieren zu müssen. Mit IPL und
+Bootkernel sind ausserdem komplexe Aufgaben während des Bootvorgangs,
+beispielsweise automatisierte und sichere Firmware-Updates leicht
+realisierbar.
+
+\subsection*{Bootprobleme: Im Bootloader}
+
+Während der Entwicklungsphase sind Probleme im Bootloader besonders
+unangenehm. Falls dieser bereits abstürzt, ehe er die serielle Schnittstelle
+initialisieren konnte, so sieht man schlichtweg gar nichts. Aber auch bei
+späteren Fehlern ist der Entwicklungszyklus mühsam, da man den Bootloader
+meist erst mit einem JTAG-Adapter oder ähnlichen Werkzeugen ins Flash des
+Boards befördern muss, bevor man den nächsten Versuch machen kann. Bei
+Änderungen am Bootloader-Code ist daher große Sorgfalt geboten. Wenn möglich,
+sollte man zu zweit an solchem Code arbeiten und sich ständig gegenseitig
+kontrollieren.
+
+Häufige Problemquellen im Bootloader sind beispielsweise:
+
+\begin{itemize}
+\item Der Bootloader wurde nicht korrekt ins Flash geschrieben. In einem Fall
+ passierte dies beispielsweise, wenn der Compiler ein Binary mit
+ ungerader Länge erzeugte. Aber auch falsche Konfiguration des JTAGer
+ kann zu solchen Problemen führen.
+\item Im Bootloader wurden die Timings für Bus-Schnittstellen wie RAM oder
+ Flash nicht korrekt eingestellt. Gerade wenn die Timings nicht ganz
+ falsch, sondern nur grenzwertig sind, kann es zu schwer
+ reproduzierbaren Bootproblemen kommen.
+\item Die Ladeadresse für den Kernel ist nicht korrekt. Bei manchen
+ Bootloadern kann es leicht zu Verwechslungen zwischen physikalischen
+ und virtuellen Adressen kommen. Weder U-Boot noch Redboot melden
+ einen Fehler, wenn man den Kernel an eine Adresse lädt, an der
+ sich überhaupt kein RAM befindet...
+\item Beim Laden des Kernels per TFTP kann es zusätzlich weitere Probleme
+ geben, die mit dem Netzwerk zusammenhängen. Diese reichen von falsch
+ aufgesetzten TFTP-Servern über falsch konfigurierte DHCP-Server oder
+ falschen IP-Adressen bis hin zu Treiber- oder Hardware-Problemen.
+\end{itemize}
+
+\subsection*{Bootprobleme: Im Kernel}
+
+Bootprobleme im Kernel sind vergleichsweise einfach zu finden, sobald man
+eine Konsole auf der seriellen Schnittstelle hat. Der Kernel gibt meist recht
+aussagekräftige Fehlermeldungen und bietet viele zusätzliche Debug-Funktionen,
+die man in der Kernel-Konfiguration aktivieren kann. Falls sich der Kernel
+bereits früher aufhängt, so dass man nach der Meldung
+
+\cmd{Uncompressing Linux.....}
+
+überhaupt nichts mehr sieht, dann wird es schwieriger. Man sollte zunächst
+überprüfen, ob die im Bootloader vorgegebene Commandline für den Kernel
+korrekt ist, insbesondere die Einstellung der für die Konsole verwendeten
+seriellen Schnittstelle (\cmd{console=tty...}).
+
+Ein weiteres gängiges Problem ist, dass der Kernel am Ende des Bootvorgangs
+kein Root-Filesystem mounten kann. Dies kann daran liegen, dass man bei der
+Kernelkonfiguration vergessen hat, dass \emph{alle} für das Rootfs nötigen
+Hardware- und Dateisystem-Treiber in den Kernel einkompiliert sein müssen
+und nicht etwa als Module gebaut wurden. Bei Medien, die erst detektiert
+werden müssen (z.B. SD-Karten) kann es passieren, dass das Medium noch nicht
+bereit ist, wenn der Kernel es mounten will. In diesem Fall hilft der
+Parameter \cmd{rootwait}.
+
+Falls der Kernel zwar das Rootfs mounten kann, aber danach mit einer
+Fehlermeldung hängen bleibt, anstatt \cmd{/sbin/init} zu starten, dann
+liegt dies oft an fehlenden Device-Nodes im Verzeichnis \cmd{/dev}.
+Überprüfen Sie dies.
+
+\subsection*{Bootprobleme: In den Startskripten}
+
+Wenn der Kernel erfolgreich das Rootfs mounten und \cmd{/sbin/init} starten
+konnte, wird letzteres versuchen, die in \cmd{/etc/inittab} angegebenen
+Anweisungen auszuführen. Dies ist normalerweise zunächst der Aufruf eines
+Startskripts, das in der Regel weitere Skripte und Programme aufruft. Je
+nach Art der aufgerufenen Programme kann es hier zu weiteren Problemen
+kommen. Dazu gehören etwa fehlerhafte Konfigurationsdateien, fehlende
+Device-Nodes oder Ähnliches.
+
+Ausserdem kommt es bei Startskripten vor, dass diese nicht auf jede Situation
+sauber und fehlertolerant reagieren. Man sollte vermeiden, dass sich das
+Skript zur Konfiguration des Netzwerks aufhängt, wenn kein DHCP-Server
+gefunden wurde oder kein Netzwerkkabel eingesteckt ist. Des weiteren sollte
+das Skript selber erkennen, wenn über die Netzwerkschnittstelle das Rootfs
+per NFS gemountet wurde, und dann eine Neukonfiguration tunlichst unterlassen.
\end{document}
diff --git a/linux-basics/sh-programming/Makefile b/linux-basics/sh-programming/Makefile
new file mode 100644
index 0000000..325aad0
--- /dev/null
+++ b/linux-basics/sh-programming/Makefile
@@ -0,0 +1,9 @@
+all:
+ pdflatex pres_sh-programming_de.tex
+ pdflatex hints_sh-programming_de.tex
+ pdflatex handout_sh-programming_de.tex
+ pdflatex handout_sh-programming_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/linux-basics/sh-programming/handout_sh-programming_de.tex b/linux-basics/sh-programming/handout_sh-programming_de.tex
index 4c391b2..f27f70e 100644
--- a/linux-basics/sh-programming/handout_sh-programming_de.tex
+++ b/linux-basics/sh-programming/handout_sh-programming_de.tex
@@ -1,17 +1,212 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Einführung in die Shell-Programmierung}
-\subsection*{Abschnitt1}
+\subsection*{Aufbau von Shell-Skripten}
-Text
+\begin{itemize}
+\item Syntax: \cmd{\#!/ein/interpreter}
+\item Beliebiges Programm als Interpreter möglich
+\item Beispiele hier: \cmd{\#!/bin/sh}
+\item Danach beliebige Shell-Befehle möglich
+\end{itemize}
-\subsection*{Abschnitt2}
+Das übliche \cmd{Hello World} sieht als Shell-Skript etwa so aus:
-Text
+\begin{lstlisting}
+#!/bin/sh
+echo Hello World
+\end{lstlisting}
+
+\subsection*{Variablen und Parameter}
+
+\begin{lstlisting}
+#!/bin/sh
+
+MY_VAR=17
+PAR_1=$1
+datum=`date`
+
+echo variable is $(MYVAR), parameter is $(PAR_1)
+\end{lstlisting}
+
+Variablen können einfach in der Form \cmd{Name=Wert} geschrieben werden. Sie
+haben in Shell-Skripten keinen Typ und werden bei der ersten Verwendung
+automatisch angelegt.
+
+\subsection*{Ausgabe-Umleitung}
+
+\begin{lstlisting}
+#!/bin/sh
+
+# How many lines in addr.txt contain "Jones" ?
+# Store the result in "jones_count"
+grep Jones addr.txt | wc -l > jones_count
+
+# Append a message to a log file
+echo "My message" >> log_file
+
+exit 0
+\end{lstlisting}
+
+
+\subsection*{Bedingte Verzweigungen}
+
+Allgemeine Form:
+
+\begin{lstlisting}
+#!/bin/sh
+
+if [ bedingung ]
+ then
+ ...
+ else
+ ...
+fi
+
+# in one line:
+
+if [ bedingung ] ; then ... ; fi
+\end{lstlisting}
+
+Zahlentests:
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Zahlentests: -eq -ne -lt -gt -le -ge
+zahl=15
+if [ $zahl -lt 20 ] ; then ...
+
+# String-Tests: = != < > -n -z
+string="Hallo"
+if [ $string != "hello" ] ; then ...
+\end{lstlisting}
+
+Dateitests:
+
+\begin{lstlisting}
+#!/bin/sh
+# Dateitests, z.B. if [ -f $datei ] ; then ...
+# Auswahl:
+# -f ist eine normale Datei
+# -d ist ein Verzeichnis
+# -e existiert
+# -s existiert und ist nicht leer
+# -r ist lesbar
+# -w ist schreibbar
+# -x ist ausfuehrbar
+# -b ist ein Block Device
+# -c ist ein Character Device
+\end{lstlisting}
+
+Test des Rückgabewerts von Programmen:
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Does addr.txt contain "Jones" ?
+if grep Jones addr.txt ; then ...
+
+# Return value 0 means OK
+exit 0
+
+\end{lstlisting}
+
+Short circuit tests:
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Short circuit tests:
+
+make && make install
+
+grep Jones addr.txt || echo "No Jones found!"
+\end{lstlisting}
+
+
+\subsection*{Schleifen}
+
+For-Schleife:
+
+\begin{lstlisting}
+#!/bin/sh
+
+for datei in datei1 datei2 datei3
+do
+ cp $datei $datei.bak
+done
+
+for datei in *
+do
+ ...
+done
+\end{lstlisting}
+
+While-Schleife:
+
+\begin{lstlisting}
+#!/bin/sh
+
+while [ bedingung ]
+do
+ ...
+done
+
+while [ bedingung ] ; do ... ; done
+
+# bedingung wie bei if
+\end{lstlisting}
+
+\subsection*{Funktionen}
+
+\begin{lstlisting}
+#!/bin/sh
+
+error_log() {
+ echo "Fehler: $1" >> my_log_file
+}
+
+...
+
+error_log "Datei nicht gefunden."
+\end{lstlisting}
+
+\subsection*{Einbinden anderer Skripte}
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Include an external script:
+. my_other_script
+
+# run another script/command in the background:
+my_other_script&
+
+\end{lstlisting}
+
+\subsection*{Zugriff auf Dateien}
+
+\begin{lstlisting}
+#!/bin/sh
+
+ls -1 > dateiliste.txt
+
+while read dateiname
+do
+ if [ -d $dateiname ]
+ then
+ echo "$dateiname ist ein Verzeichnis"
+ fi
+done < dateiliste.txt
+
+\end{lstlisting}
\end{document}
diff --git a/linux-basics/sh-programming/pres_sh-programming_de.tex b/linux-basics/sh-programming/pres_sh-programming_de.tex
index 07db328..dbecb3d 100644
--- a/linux-basics/sh-programming/pres_sh-programming_de.tex
+++ b/linux-basics/sh-programming/pres_sh-programming_de.tex
@@ -1,24 +1,251 @@
-\documentclass{article}
+\documentclass{beamer}
+\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
+
+\title{Einführung in die Shell-Programmierung}
+\institute{Linutronix GmbH}
\begin{document}
-\section*{Block \lq Was ist Linux?\rq}
+\maketitle
-\subsection*{Lernziele}
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Aufbau von Shell-Skripten}
\begin{itemize}
-\item Lernziel 1
-\item Lernziel 2
-\item Lernziel 3
+\item Syntax: \cmd{\#!/ein/interpreter}
+\pause
+\item Beliebiges Programm als Interpreter möglich
+\pause
+\item Beispiele hier: \cmd{\#!/bin/sh}
+\pause
+\item Danach beliebige Shell-Befehle möglich
\end{itemize}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Hello World als Shell-Script}
+\begin{lstlisting}
+#!/bin/sh
+echo Hello World
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Variablen und Parameter}
+\begin{lstlisting}
+#!/bin/sh
+
+MY_VAR=17
+PAR_1=$1
+datum=`date`
+
+echo variable is $(MYVAR), parameter is $(PAR_1)
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Ausgabe-Umleitung}
+\begin{lstlisting}
+#!/bin/sh
+
+# How many lines in addr.txt contain "Jones" ?
+# Store the result in "jones_count"
+grep Jones addr.txt | wc -l > jones_count
+
+# Append a message to a log file
+echo "My message" >> log_file
+
+exit 0
+
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+if [ bedingung ]
+ then
+ ...
+ else
+ ...
+fi
+
+# in one line:
+
+if [ bedingung ] ; then ... ; fi
+
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+# Zahlentests: -eq -ne -lt -gt -le -ge
+zahl=15
+if [ $zahl -lt 20 ] ; then ...
+
+# String-Tests: = != < > -n -z
+string="Hallo"
+if [ $string != "hello" ] ; then ...
+
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+# Dateitests, z.B. if [ -f $datei ] ; then ...
+# Auswahl:
+# -f ist eine normale Datei
+# -d ist ein Verzeichnis
+# -e existiert
+# -s existiert und ist nicht leer
+# -r ist lesbar
+# -w ist schreibbar
+# -x ist ausfuehrbar
+# -b ist ein Block Device
+# -c ist ein Character Device
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+# Does addr.txt contain "Jones" ?
+if grep Jones addr.txt ; then ...
+
+# Return value 0 means OK
+exit 0
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+# Short circuit tests:
+
+make && make install
+
+grep Jones addr.txt || echo "No Jones found!"
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Schleifen}
+\begin{lstlisting}
+#!/bin/sh
+
+for datei in datei1 datei2 datei3
+do
+ cp $datei $datei.bak
+done
+
+for datei in *
+do
+ ...
+done
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Schleifen}
+\begin{lstlisting}
+#!/bin/sh
+
+while [ bedingung ]
+do
+ ...
+done
+
+while [ bedingung ] ; do ... ; done
+
+# bedingung wie bei if
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Funktionen}
+\begin{lstlisting}
+#!/bin/sh
+
+error_log() {
+ echo "Fehler: $1" >> my_log_file
+}
+
+...
+
+error_log "Datei nicht gefunden."
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Einbinden anderer Skripte}
+\begin{lstlisting}
+#!/bin/sh
+
+# Include an external script:
+. my_other_script
+
+# run another script/command in the background:
+my_other_script&
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Zugriff auf Dateien}
+\begin{lstlisting}
+#!/bin/sh
-\subsection*{Unterrichts-Ablauf}
+ls -1 > dateiliste.txt
-Hinweise zur Präsentation, Zeitplanung, etc.
+while read dateiname
+do
+ if [ -d $dateiname ]
+ then
+ echo "$dateiname ist ein Verzeichnis"
+ fi
+done < dateiliste.txt
-\subsection*{Übungen bei vorhandener Hardware}
+\end{lstlisting}
+\end{frame}
-Hinweise zu Übungen, Zeitlimit dazu.
\end{document}
diff --git a/linux-basics/what-is-linux/pres_what-is-linux_de.tex b/linux-basics/what-is-linux/pres_what-is-linux_de.tex
index 85bcdb2..fbd44f1 100644
--- a/linux-basics/what-is-linux/pres_what-is-linux_de.tex
+++ b/linux-basics/what-is-linux/pres_what-is-linux_de.tex
@@ -46,6 +46,19 @@
\end{frame}
% ----- Slide ------------------
+\begin{frame}[fragile]
+\begin{verbatim}
+Hello everybody out there using minix -
+
+I'm doing a (free) operating system (just a hobby,
+won't be big andprofessional like gnu) for
+386(486) AT clones. This has been brewing
+since april, and is starting to get ready.
+\end{verbatim}
+Linus Torvalds (1991 / Minix newsgroup)
+\end{frame}
+
+% ----- Slide ------------------
\begin{frame}
\begin{figure}[h]
\centering