\input{confighandout}

\subsection{Was ist Linux?}

\subsubsection{Geschichtlicher Hintergrund}

Frühe elektronische Rechner, wie der in Abbildung \ref{img:eniac} gezeigte
ENIAC, waren nicht frei programmierbar. Sie wurden für einen bestimmten
Zweck gebaut, der ENIAC beispielsweise zur Berechnung von ballistischen
Flugbahnen.

\begin{figure}[h]
\centering
\includegraphics[width=0.5\textwidth]{images/785px-Eniac.jpg}
\caption{ENIAC (1947)}
\label{img:eniac}
\end{figure}

Im Laufe der 50-er und 60-er Jahre entwickelten sich die Rechner schnell
weiter, was vor allem durch die Erfindung des Transistors beschleunigt wurde.
Mit der freien Programmierbarkeit kam gleichzeitig die Nachfrage nach einem
Betriebssystem. Zum einen stellte man schnell fest, das bestimmte Operationen,
etwa Ein- und Ausgabe-Funktionen, von nahezu jedem Programm immer wieder
benötigt wurden. Zum anderen hatte man bald den Wunsch nach größerer
Hardware-Unabhängigkeit, damit ein einmal geschriebenes Programm ohne große
Änderungen auf verschiedenen Rechnern laufen konnte.

Die ersten Ansätze für ein universelles Betriebssystem blieben mehr oder
weniger erfolglos. Die Entwickler verzettelten sich mit immer neuen
Anforderungen und wenig durchdachten Konzepten. Die Systeme wurden
unüberschaubar und für viele der damaligen Rechner zu gross.

Erst das ab 1969 von Ken Thompson und Dennis Ritchie
(Abbildung \ref{img:ken_ritchie}) entwickelte \emph{Unix} konnte sich auf
breiter Ebene durchsetzen und zu einem Standard entwickeln.

\begin{figure}[h]
\centering
\includegraphics[width=0.5\textwidth]{images/Thompson-sitting-Richie-standing-PDP11-1972.jpg}
\caption{Ken Thompson (sitzend) und Dennis Ritchie an einer PDP11 (1972)}
\label{img:ken_ritchie}
\end{figure}

In der zweiten Hälfte der 70-er Jahre veränderte sich der Computer-Markt
radikal. Die Erfindung der integrierten Schaltung ermöglichte es, kleine und
auch für Normalbürger erschwingliche Computer zu bauen. Dadurch entwickelte
sich der bisher auf Hochschulen, Behörden und Großbetriebe beschränkte Markt
zum Massenmarkt.

\begin{figure}[h]
\centering
\includegraphics[width=0.3\textwidth]{images/Apple2.jpg}
\caption{Apple 2 (1977)}
\label{img:apple2}
\end{figure}

Als etwas ausgereiftere Homecomputer wie der Apple 2 (Abbildung \ref{img:apple2})
zunehmend auch in Betrieben als Ergänzung zu den vorhandenen Großrechnern,
beispielsweise als `intelligente' Terminals, eingesetzt wurden, beschloss
IBM, Marktführer bei Großrechnern, dem etwas entgegen zu setzen. Man
entwickelte den IBM-PC, der 1981 erschien. Durch die sehr knappen
Zeitvorgaben war es den Entwicklern nur möglich, bereits am Markt befindliche
Standard-Chips einzusetzen. Dadurch gelang es Firmen wie Compaq in kurzer
Zeit, selbst ``IBM-kompatible'' Rechner auf den Markt zu werfen.

Auch auf Unix hatte diese Entwicklung Einfluss. Bis dahin war Unix im
universitären Umfeld entwickelt worden. Die Rechte am Code besaß zwar AT+T,
er wurde aber ohne weiteres kostenlos an Dritte weitergegeben, vor allem
zu Ausbildungszwecken. Es gab ja fast niemanden, der einen Unix-fähigen
Computer besaß. Mit dem beginnenden Massenmarkt sah AT+T die Chance, mit
Lizenzen Geld zu verdienen, und machte Unix zu Closed Source. Auch zu
Ausbildungszwecken war der Code nicht mehr verfügbar. 

Durch diese Lizenzänderung war es vielen Unix-Programmierern nicht mehr
gestattet, ihre eigenen Programme zu nutzen. Einer von ihnen, Richard
Stallman, gründete daraufhin 1984 die \emph{Free Software Foundation} und
begann, ein eigenes Unix namens \emph{GNU} völlig neu zu schreiben. Um
die eben gemachten Erfahrungen reicher, entwickelte er für den Code eine
eigene Lizenz, die \emph{GNU Public License (GPL)}. Sie stellt sicher, dass
bei Weitergabe eines Programms der Empfänger immer auch ein Recht auf den
Sourcecode hat.

Dem GNU-Projekt schlossen sich schnell weitere Programmierer an, und es
gelang ihnen in relativ kurzer Zeit, die Grundlagen eines Unix-Systems zu
erstellen. Dazu gehörten neben den vielen kleinen Unix-Systemprogrammen vor
allem auch der Compiler gcc und der Editor Emacs. Beim Kernel war man weniger
glücklich: Man entschied sich für ein zwar theoretisch interessantes, aber in
der Praxis schlecht handhabbares Microkernel-Konzept. Dieser Kernel
(\emph{GNU Hurd}) ist bis heute nicht produktiv einsetzbar...

1991 hatte der finnische Student Linus Torvalds einen Terminal-Emulator
geschrieben, mit dem er von daheim per Modem auf den Unix-Rechner der
Universität zugreifen konnte. Als er immer mehr Funktionen hinzufügte, etwa
einen Treiber zum Direktzugriff auf seine Harddisk, bemerkte er, dass er
eigentlich auch gleich einen Betriebssystem-Kernel schreiben konnte. Er
beschaffte sich die POSIX-Spezifikation, in der die Schnittstellen eines
Unix-Kernels beschrieben sind, und implementierte eine Funktion nach der
anderen.

Nachdem dieser Kernel unter dem Namen \emph{Linux} veröffentlicht war,
schlossen sich ebenfalls schnell hunderte von Programmierern an und
arbeiteten an der Weiterentwicklung mit. Durch Kombination des
GNU-Betriebssystems mit dem Linux-Kernel entstand so ein vollständig aus
freier Software bestehendes System.

Der Begriff ``Linux'' bezeichnet also streng genommen nur den Kernel.
Allerdings hat es sich mittlerweile im Sprachgebrauch eingebürgert, das
komplette System aus Programmen und Kernel als ``Linux'' zu bezeichnen.

\subsubsection{Ein Betriebssystem für Großrechner}

Unix war von Anfang an ein Betriebssystem, das für den Betrieb auf
Großrechnern ausgelegt ist. Das verwundert nicht weiter, den zur Zeit
seiner Entstehung gab es noch keine Einzelplatzrechner im Sinne des
heutigen PC. Die mit dieser Anwendung verbundenen Design-Entscheidungen
sind auch heute noch wirksam und bestimmen maßgeblich das Verhalten von
Linux-Systemen.

Durch die freie Verfügbarkeit von Linux gab und gibt es ausserdem zahlreiche
Anwender mit ganz unterschiedlichen Anforderungen. Von Cluster-basierten
Datenbankservern bis zu kleinen batteriebetriebenen PDAs ist alles vertreten.
Des weiteren werden sehr viele verschiedene Prozessor-Familien unterstützt.
Dadurch war der Kernel schon sehr früh 64-Bit- und Endian-fest.

Diesem historischen Hintergrund ist es zu verdanken, dass der Linux-Kernel
heute sehr gut mit verschiedensten Hardware-Eigenschaften skaliert. Aus dem
selben Source-Code kann ein Kernel für einen Server mit 1024 CPU-Kernen
oder ein Kernel für ein kleines Embedded-System konfiguriert und erzeugt
werden.

\subsubsection{Multiuser-Betrieb}

Eine weitere wichtige Eigenschaft von Linux, die sich aus der
Großrechner-Tradition ergibt, ist die Multitasking- und Multiuser-Fähigkeit.
Während Multitasking, also das quasi-gleichzeitige Ausführen mehrerer
Programme, heute jedem Computer-Anwender als Selbstverständlichkeit gilt,
verdient der Multiuser-Betrieb nähere Betrachtung.

Multiuser-Betrieb bedeutet, dass mehrere Anwender \emph{gleichzeitig} mit dem
System arbeiten können. Jeder Anwender hat dabei den Eindruck, dass ihm das
System allein gehört. Das Betriebssystem muss dazu Funktionalität
bereitstellen, um die Datensicherheit zu gewährleisten und die gerechte
Verteilung der Ressourcen unter den Benutzern sicherzustellen. Dazu gehört
unter anderem, dass alle Dateien und Verzeichnisse mit Benutzerkennungen
versehen werden, die jedem Benutzer sinnvolles Arbeiten ermöglichen, aber
gleichzeitig seinen Zugriff auf fremde Daten einschränken. Diese
Einschränkungen müssen im Kernel realisiert werden, damit sie nicht auf
Anwenderebene umgangen werden können.

In Unix war diese Funktionalität per Design schon immer vorhanden, während
aus der Tradition der Einzelplatz-Rechner entstandene Betriebssysteme wie DOS
oder Windows dies bis heute nicht leisten. Natürlich ist die freie Lizenz
von Linux hier ebenfalls von Vorteil. Proprietäre Betriebssysteme haben
schon aus Lizenzgründen ein Problem damit, wenn mehrere Anwender einen
Rechner nutzen können.

\subsubsection{Login}

Beim Hochfahren eines Linux-Systems werden üblicherweise alle für den
Systemstart vorgesehenen Programme automatisch gestartet, ohne dass dazu
ein Benutzereingriff nötig wäre. Durch Anpassung der dafür verantwortlichen
Startskripte kann man so auch seine eigenen Applikationen starten. An dieser
Stelle hat man root-Rechte, also vollen Zugriff auf alle Ressourcen.

Möchte nach dem Hochfahren ein Benutzer mit dem System arbeiten, so muss
er dem System mitteilen, wer er ist, und dies gegebenenfalls durch einen
Authentifizierungsprozess glaubhaft machen. Diesen Vorgang nennt man
``Login''.

\begin{figure}[h]
\centering
\includegraphics[width=0.3\textwidth]{images/CPU_und_Terminals1-600px.png}
\caption{Schematische Darstellung eines Großrechners}
\label{img:mainframe}
\end{figure}

Abbildung \ref{img:mainframe} zeigt die Situation in schematischer Weise. Am
Großrechner sind mehrere Terminals angeschlossen. Früher waren dies
Fernschreiber, daher die Bezeichnung tty (von engl. teletype). Auf Abbildung
\ref{img:ken_ritchie} kann man dies sehen -- da gab es noch keine Monitore.

Unter Linux sind dies sogenannte \emph{virtuelle Terminals}. Selbst auf einem
Laptop, der an nichts anderes angeschlossen ist, hat man mehrere solcher
virtueller Terminals zur Verfügung. Eines davon wird meist von der grafischen
Oberfläche benutzt.

Zusätzlich gibt es weitere physikalische Terminals, so haben beispielsweise
serielle Schnittstellen Bezeichnungen wie ttyS0, ttyS1 und so weiter. Jedes
dieser Terminals ist völlig autark, das heisst, man muss sich in jedem
Terminal erneut einloggen und authentifizieren.

Logins sind unter Linux auf mehreren Wegen möglich. Ausser dem von Desktops
her gewohnten Login am Bildschirm kann man sich auch mit Hilfe eines
Terminal-Programms über eine serielle Schnittstelle einloggen. Weit verbreitet
sind auch Logins über Netzwerkprotokolle wie ssh oder telnet.

Da diese Login-Möglichkeiten unter Windows nicht üblich sind, kommt es hier
häufig zu Verständnisschwierigkeiten. Als Übung sollten Sie sich per ssh
auf einem entfernten Rechner einloggen und dann ein Programm starten. Machen
Sie sich klar, dass das Programm auf dem entfernten Rechner ausgeführt wird
und nicht etwa auf dem Rechner, an dem Sie gerade sitzen.

\newpage

\subsubsection{Kontrollfragen}

\begin{enumerate}
\item Wie alt ist das Unix-Konzept mittlerweile?
\item Seit wann gibt es den Linux-Kernel?
\item Warum ist die Großrechner-Tradition von Linux auch für Embedded Systems
        von Vorteil?
\item Was passiert beim Login-Vorgang?
\end{enumerate}

\input{tailhandout}
