Kapitel 1. Einführung in Linux

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

Linux ist das am weitesten verbreitete Betriebssystem und wird in allen Bereichen eingesetzt, von mobilen Geräten bis hin zur Cloud.

Vielleicht bist du mit dem Konzept eines Betriebssystems nicht vertraut. Oder du verwendest ein Betriebssystem wie Microsoft Windows, ohne dir groß Gedanken darüber zu machen. Oder aber du bist neu bei Linux. Um dich auf den richtigen Weg zu bringen, werden wir in diesem Kapitel die Betriebssysteme und Linux aus der Vogelperspektive betrachten.

Zuerst werden wir besprechen, was modern im Kontext dieses Buches bedeutet. Dann werfen wir einen Blick auf die Geschichte von Linux und betrachten die wichtigsten Ereignisse und Phasen der letzten 30 Jahre. Außerdem erfährst du in diesem Kapitel, was die Rolle eines Betriebssystems im Allgemeinen ist und wie Linux diese Rolle ausfüllt. Wir werfen auch einen kurzen Blick darauf, was Linux-Distributionen sind und was Ressourcentransparenz bedeutet.

Wenn du neu im Bereich Betriebssysteme und Linux bist, solltest du das gesamte Kapitel lesen. Wenn du bereits Erfahrung mit Linux hast, solltest du dasKapitel "A Ten-Thousand-Foot View of Linux" lesen, das dir einen visuellen Überblick und eine Zuordnung zu den Kapiteln des Buches bietet.

Aber bevor wir uns mit den technischen Details beschäftigen, sollten wir erst einmal einen Schritt zurücktreten und uns darauf konzentrieren, was wir meinen, wenn wir von "modernem Linux" sprechen. Das ist überraschenderweise keine triviale Angelegenheit.

Was sind moderne Umgebungen?

Im Buchtitel heißt es modern, aber was bedeutet das eigentlich? Im Kontext dieses Buches kann es alles bedeuten, von Cloud Computing bis hin zu einem Raspberry Pi. Darüber hinaus hat der jüngste Aufstieg von Docker und verwandten Innovationen in der Infrastruktur die Landschaft für Entwickler und Infrastrukturbetreiber gleichermaßen dramatisch verändert.

Werfen wir einen genaueren Blick auf einige dieser modernen Umgebungen und die herausragende Rolle, die Linux in ihnen spielt:

Mobile Geräte

Wenn ich zu unseren Kindern "Handy" sage, fragen sie: "Im Gegensatz zu was?" Um ehrlich zu sein, laufen heutzutage viele Handys - je nachdem, wen du fragst, bis zu 80 % oder mehr - sowie Tablets mit Android, einerLinux-Variante. Diese Umgebungen stellen hohe Anforderungen an den Stromverbrauch und die Robustheit, da wir täglich auf sie angewiesen sind. Wenn du dich für die Entwicklung von Android-Apps interessierst, findest du auf derAndroid-Entwicklerseite weitere Informationen.

Cloud Computing

Bei der Cloud sehen wir im Großen und Ganzen ein ähnliches Muster wie im Mobil- und Mikrobereich. Es gibt neue, leistungsstarke, sichere und energiesparende CPU-Architekturen wie das erfolgreiche ARM-basierteAWS Graviton-Angebot sowie die etablierte Auslagerung von Schwerstarbeit an Cloud-Provider, insbesondere im Zusammenhang mit Open-Source-Software.

Internet der (intelligenten) Dinge

Sicherlich hast du schon viele Projekte und Produkte gesehen, die mit dem Internet der Dinge (IoT) zu tun haben, von Sensoren bis hin zu Drohnen. Viele von uns sind bereits mit intelligenten Geräten und Autos in Berührung gekommen, die noch höhere Anforderungen an den Stromverbrauch stellen als mobile Geräte. Außerdem laufen sie vielleicht nicht die ganze Zeit, sondern wachen z. B. nur einmal am Tag auf, um Daten zu übertragen. Ein weiterer wichtiger Aspekt dieser Umgebungen ist dieEchtzeitfähigkeit. Wenn du dich für den Einstieg in Linux im IoT-Kontext interessierst, solltest du dir das AWS IoT EduKit ansehen.

Vielfalt der Prozessorarchitekturen

In den letzten 30 Jahren war Intel der führende CPU-Hersteller und dominierte den Markt für Mikrocomputer und Personal Computer. Die x86-Architektur von Intel galt als der Goldstandard. Der offene Ansatz, den IBM verfolgte (Veröffentlichung der Spezifikationen und Ermöglichung des Angebots kompatibler Geräte durch andere), war vielversprechend und führte zu x86-Klonen, die zumindest anfangs auch Intel-Chips verwendeten.

Während Intel in Desktop- und Laptopsystemen immer noch weit verbreitet ist, haben wir mit dem Aufkommen mobiler Geräte die zunehmende Verbreitung derARM-Architektur und neuerdings auch von RISC-V erlebt. Gleichzeitig werden Multi-Arch-Programmiersprachen und -Werkzeuge wie Go oder Rust immer weiter verbreitet, was einen perfekten Sturm erzeugt.

Alle diese Umgebungen sind Beispiele dafür, was ich als moderne Umgebungen betrachte. Und die meisten, wenn nicht sogar alle, laufen auf Linux oder nutzen es in der einen oder anderen Form.

Jetzt, wo wir über die modernen (Hardware-)Systeme Bescheid wissen, fragst du dich vielleicht, wie wir hierher gekommen sind und wie Linux entstanden ist.

Die Linux-Geschichte (bis jetzt)

Linux feierte im Jahr 2021 seinen 30. Geburtstag. Mit Milliarden von Nutzern und Tausenden von Entwicklern ist das Linux-Projekt zweifelsohne eine weltweite (Open-Source-)Erfolgsgeschichte. Aber wie hat das alles angefangen und wie sind wir hierher gekommen?

1990s

Wir können Linus Torvalds' E-Mail vom 25. August 1991 an die Newsgroupcomp.os.minix als die Geburtsstunde des Linux-Projekts betrachten, zumindest was die öffentlichen Aufzeichnungen angeht. Dieses Hobbyprojekt nahm bald Fahrt auf, sowohl was die Anzahl der Codezeilen (LOC) als auch die Akzeptanz betrifft. Nach weniger als drei Jahren wurde zum Beispiel Linux 1.0.0 mit über 176.000 LOC veröffentlicht. Zu diesem Zeitpunkt war das ursprüngliche Ziel, die meiste Unix/GNU-Software ausführen zu können, schon weit erreicht. Auch das erste kommerzielle Angebot erschien in den 1990er Jahren: Red Hat Linux.

2000 bis 2010

Als "Teenager" reifte Linux nicht nur in Bezug auf Funktionen und unterstützte Hardware, sondern wuchs auch über das hinaus, was UNIX konnte. In dieser Zeit erlebten wir auch eine enorme und stetig wachsende Akzeptanz von Linux durch die großen Unternehmen, d.h. die Übernahme durch Google, Amazon, IBM und so weiter. Es war auch der Höhepunkt derDistro-Kriege, die dazu führten, dass Unternehmen ihreRichtung änderten.

2010er Jahre bis heute

Linux hat sich als Arbeitspferd in Rechenzentren und der Cloud sowie für alle Arten von IoT-Geräten und Telefonen etabliert. In gewissem Sinne kann man sagen, dass die Distro-Kriege vorbei sind (heute basieren die meisten kommerziellen Systeme entweder auf Red Hat oder Debian), und in gewisser Weise ist der Aufstieg von Containern (ab 2014/15) für diese Entwicklung verantwortlich.

Nach diesem kurzen historischen Rückblick, der notwendig ist, um den Kontext und die Motivation für den Umfang dieses Buches zu verstehen, kommen wir zu einer scheinbar unschuldigen Frage: Warum braucht jemand Linux oder überhaupt ein Betriebssystem?

Warum überhaupt ein Betriebssystem?

Angenommen, du hast kein Betriebssystem (OS) zur Verfügung oder kannst aus irgendeinem Grund keins benutzen. Dann musst du so ziemlich alles selbst machen: Speicherverwaltung, Interrupt-Verwaltung, Kommunikation mit E/A-Geräten, Dateiverwaltung, Konfiguration und Verwaltung des Netzwerkstacks - die Liste geht weiter.

Hinweis

Technisch gesehen ist ein Betriebssystem nicht unbedingt notwendig. Es gibt Systeme, die kein Betriebssystem haben. Dabei handelt es sich in der Regel um eingebettete Systeme mit einer winzigen Grundfläche: man denke nur an ein IoT-Beacon. Sie haben einfach nicht die Ressourcen, um etwas anderes als eine Anwendung zu betreiben. Mit Rust kannst du zum Beispiel den Kern und die Standardbibliothek verwenden, um jede Anwendung aufBare Metal auszuführen.

Ein Betriebssystem übernimmt all diese undifferenzierten Aufgaben, abstrahiert die verschiedenen Hardwarekomponenten und stellt dir eine (normalerweise) saubere und schön gestaltete Anwendungsprogrammierschnittstelle (API) zur Verfügung, wie zum Beispiel den Linux-Kernel, den wir uns in Kapitel 2 genauer ansehen werden. Normalerweise nennen wir diese APIs, die ein Betriebssystem zur Verfügung stellt, Systemaufrufe oder kurz Syscalls. Höhere Programmiersprachen wie Go, Rust, Python oder Java bauen auf diesen Syscalls auf und verpacken sie möglicherweise in Bibliotheken.

So kannst du dich auf die Geschäftslogik konzentrieren, anstatt die Ressourcen selbst zu verwalten, und kannst dich auch um die unterschiedliche Hardware kümmern, auf der du deine App ausführen möchtest.

Schauen wir uns ein konkretes Beispiel für einen Syscall an. Nehmen wir an, wir wollen die ID des aktuellen Benutzers ermitteln (und ausdrucken).

Zuerst schauen wir uns den Linux Syscall angetuid(2):

...
getuid() returns the real user ID of the calling process.
...

OK, dieser getuid Syscall ist also das, was wir programmatisch aus einer Bibliothek verwenden können. Wir werden die Linux-Syscalls in"Syscalls" ausführlicher besprechen.

Hinweis

Du fragst dich vielleicht, was das (2) in getuid(2) bedeutet. Es ist eine Terminologie, die das Dienstprogramm man (denke an die eingebauten Hilfeseiten) verwendet, um den Abschnitt des Befehls zu bezeichnen, der in man zugewiesen ist, ähnlich wie eine Postleitzahl oder ein Ländercode. Dies ist ein Beispiel, in dem das Erbe von Unix deutlich wird; du kannst seinen Ursprung imUnix Programmer's Manual, siebte Ausgabe, Band 1 von 1979 finden.

In der Kommandozeile (Shell) würden wir den entsprechenden Befehl id verwenden, der wiederum den Syscall getuid benutzt:

$ id --user
638114

Nachdem du nun eine grundlegende Vorstellung davon hast, warum der Einsatz eines Betriebssystems in den meisten Fällen sinnvoll ist, kommen wir nun zum Thema Linux-Distributionen.

Linux-Distributionen

Wenn wir "Linux" sagen, ist es vielleicht nicht sofort klar, was wir meinen. In diesem Buch sagen wir "Linux-Kernel" oder einfach nur "Kernel", wenn wir den Satz von Syscalls und Gerätetreibern meinen. Wenn wir uns aufLinux-Distributionen(oder kurz Distros) beziehen, meinen wir ein konkretes Bündel von Kernel- und verwandten Komponenten, einschließlich der Paketverwaltung, des Dateisystem-Layouts, des Init-Systems und einer Shell, die für dich vorausgewählt wurden.

Natürlich könntest du all das auch selbst machen: Du könntest den Kernel herunterladen und kompilieren, einen Paketmanager auswählen und so weiter und deine eigene Distribution erstellen (oder rollen). Und genau das haben viele Leute am Anfang getan. Im Laufe der Jahre haben die Leute herausgefunden, dass sie ihre Zeit besser nutzen, wenn sie das Paketieren (und auch das Sicherheitspatching) privaten oder kommerziellen Experten überlassen und einfach die resultierende Linux-Distribution verwenden.

Tipp

Wenn du dazu neigst, deine eigene Distribution zu erstellen, vielleicht weil du ein Tüftler bist oder weil du aufgrund bestimmter geschäftlicher Beschränkungen dazu gezwungen bist, empfehle ich dir, einen genaueren Blick auf Arch Linux zu werfen, denn damit hast du die Kontrolle und kannst mit ein wenig Aufwand eine sehr individuelle Linux-Distribution erstellen.

Um ein Gefühl für die Weite der Distro-Welt zu bekommen, einschließlich traditioneller Distros (Ubuntu, Red Hat Enterprise Linux [RHEL], CentOS usw., wie in Kapitel 6 beschrieben) und moderner Distros (wie Bottlerocket und Flatcar; siehe Kapitel 9), wirf einen Blick auf DistroWatch.

Nachdem wir das Thema Distro aus dem Weg geräumt haben, lass uns zu einem ganz anderen Thema übergehen: Ressourcen und ihre Sichtbarkeit und Isolierung.

Ressourcensichtbarkeit

Linux hat in guter UNIX-Tradition standardmäßig eine globale Sicht auf Ressourcen. Das führt uns zu der Frage: Was bedeutet globale Sicht (im Gegensatz zu was?), und was sind besagte Ressourcen?

Hinweis

Warum sprechen wir hier überhaupt über Ressourcentransparenz? Der Hauptgrund ist, das Bewusstsein für dieses Thema zu schärfen und dich auf eines der wichtigsten Themen im Zusammenhang mit modernem Linux einzustimmen: Container. Mach dir keine Sorgen, wenn du jetzt nicht alle Details verstehst; wir werden im Laufe des Buches und insbesondere in Kapitel 6, in dem wir Container und ihre Bausteine genauer besprechen, auf dieses Thema zurückkommen.

Vielleicht hast du schon einmal den Spruch gehört, dass unter Unix und damit auch unter Linux alles eine Datei ist. Im Kontext dieses Buches verstehen wir unter Ressourcen alles, was zur Ausführung von Software verwendet werden kann. Dazu gehören Hardware und ihre Abstraktionen (z. B. CPU und RAM, Dateien), Dateisysteme, Festplattenlaufwerke, Solid-State-Laufwerke (SSDs), Prozesse, netzwerkbezogene Dinge wie Geräte oder Routing-Tabellen und Anmeldeinformationen für Benutzer.

Warnung

Nicht alle Ressourcen in Linux sind Dateien oder werden durch eine Dateischnittstelle dargestellt. Es gibt jedoch Systeme wie Plan 9, die in dieser Hinsicht viel weiter gehen.

Werfen wir einen Blick auf ein konkretes Beispiel für einige Linux-Ressourcen. Zuerst wollen wir eine globale Eigenschaft abfragen (die Linux-Version) und dann spezifische Hardware-Informationen über die verwendeten CPUs (die Ausgabe wurde aus Platzgründen gekürzt):

$ cat /proc/version 1
Linux version 5.4.0-81-generic (buildd@lgw01-amd64-051)
(gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04))
#91~18.04.1-Ubuntu SMP Fri Jul 23 13:36:29 UTC 2021

$ cat /proc/cpuinfo | grep "model name" 2
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
1

Drucke die Linux-Version aus.

2

Druckt CPU-bezogene Informationen und filtert nach Modell.

Mit den vorangegangenen Befehlen haben wir erfahren, dass dieses System über vier Intel i7-Kerne verfügt. Wenn du dich mit einem anderen Benutzer anmeldest, würdest du erwarten, dass du die gleiche Anzahl an CPUs siehst?

Betrachten wir eine andere Art von Ressource: Dateien. Wenn zum Beispiel der Benutzer troyeine Datei unter /tmp/myfile mit der entsprechenden Berechtigung erstellt ("Berechtigungen"), würde dann ein anderer Benutzer, worf, die Datei sehen oder sogar in sie schreiben können?

Oder nehmen wir den Fall eines Prozesses, d.h. eines Programms im Speicher, das über alle notwendigen Ressourcen verfügt, um zu laufen, wie z.B. CPU und Speicher. Linux identifiziert einen Prozess anhand seiner Prozess-ID, kurz PID ("Process Management"):

$ cat /proc/$$/status | head -n6 1
Name:   bash
Umask:  0002
State:  S (sleeping)
Tgid:   2056
Ngid:   0
Pid:    2056
1

Druckt den Prozessstatus, d.h. Details über den aktuellen Prozess, und beschränkt die Ausgabe auf die ersten sechs Zeilen.

Kann es unter Linux mehrere Prozesse mit demselben PID geben? Was wie eine dumme oder nutzlose Frage klingt, ist die Grundlage für Container (siehe "Container"). Die Antwort lautet: Ja, es kann mehrere Prozesse mit demselben PID geben, und zwar in verschiedenen Kontexten, den Namensräumen (siehe "Linux Namensräume"). Das passiert zum Beispiel in einem containerisierten Setup, wenn du deine App in Docker oder Kubernetes ausführst.

Jeder einzelne Prozess könnte denken, dass er etwas Besonderes ist, weil er PID 1 hat, was in einem traditionelleren Setup für die Wurzel des User-Space-Prozessbaums reserviert ist (siehe "Der Linux-Startup-Prozess" für weitere Details).

Was wir aus diesen Beobachtungen lernen können, ist, dass es sowohl eine globale Sicht auf eine bestimmte Ressource geben kann (zwei Benutzer sehen eine Datei am exakt gleichen Ort) als auch eine lokale oder virtualisierte Sicht, wie das Prozessbeispiel. Das wirft die Frage auf: Ist alles in Linux standardmäßig global? Spoiler: Ist es nicht. Schauen wir uns das mal genauer an.

Ein Teil der Illusion, die entsteht, wenn mehrere Benutzer oder Prozesse parallel laufen, ist die (eingeschränkte) Sicht auf Ressourcen. Der Weg, um eine lokale Sicht auf (bestimmte unterstützte) Ressourcen in Linux zu ermöglichen, führt über Namensräume (siehe "Linux Namespaces").

Eine zweite, unabhängige Dimension ist die der Isolation. Wenn ich hier den BegriffIsolation verwende, muss ich ihn nicht unbedingt einschränken, d. h. ich mache keine Annahmen darüber, wie gut die Dinge isoliert sind. Eine Möglichkeit, Prozesse zu isolieren, besteht zum Beispiel darin, den Speicherverbrauch zu begrenzen, damit ein Prozess andere Prozesse nicht aushungern kann. Ich gebe deiner Anwendung zum Beispiel 1 GB RAM zur Verfügung. Wenn sie mehr verbraucht, wird sie"out-of-memory"beendet. Das bietet ein gewisses Maß an Schutz. In Linux verwenden wir eine Kernel-Funktion namens cgroups, um diese Art von Isolation zu ermöglichen. In"Linux cgroups" erfährst du mehr darüber.

Andererseits erweckt eine vollständig isolierte Umgebung den Anschein, dass die Anwendung völlig auf sich allein gestellt ist. Zum Beispiel kann eine virtuelle Maschine (VM; siehe auch"Virtuelle Maschinen") verwendet werden, um eine vollständige Isolierung zu erreichen.

Ein Blick aus zehntausend Metern Höhe auf Linux

Wow, wir sind schon ziemlich tief ins Unkraut geschlittert. Es ist Zeit, tief durchzuatmen und sich neu zu orientieren. In Abbildung 1-1 habe ich versucht, dir einen Überblick über das Linux-Betriebssystem zu verschaffen und es den Kapiteln des Buches zuzuordnen.

lmlx 0101
Abbildung 1-1. Zuordnung des Linux-Betriebssystems zu den Buchkapiteln

Der Kern jeder Linux-Distribution ist der Kernel, der die API bereitstellt, auf der alles andere aufbaut. Die drei Kernthemen Dateien, Netzwerke und Beobachtbarkeit begleiten dich überall und du kannst sie als die grundlegenden Bausteine über dem Kernel betrachten. Aus der reinen Nutzungsperspektive wirst du bald lernen, dass du es am häufigsten mit der Shell (Wo ist die Ausgabedatei für diese Anwendung?) und mit Dingen im Zusammenhang mit der Zugriffskontrolle (Warum stürzt diese Anwendung ab? Ah, das Verzeichnis ist schreibgeschützt, puh!) zu tun hast.

Nebenbei bemerkt: In Kapitel 9 habe ich einige interessante Themen gesammelt, von virtuellen Maschinen bis zu modernen Distros. Ich nenne diese Themen vor allem deshalb "fortgeschritten", weil ich sie für optional halte. Das heißt, du könntest auch ohne sie auskommen. Aber wenn du wirklich, wirklich, wirklich von den Möglichkeiten profitieren willst, die dir das moderne Linux bietet, empfehle ich dir dringend, Kapitel 9 zu lesen. Ich nehme an, es versteht sich von selbst, dass der Rest des Buches - also die Kapitel 2 bis 8 -essentielle Kapitel sind, die du auf jeden Fall lernen und anwenden solltest.

Fazit

Wenn wir in diesem Buch etwas als "modern" bezeichnen, meinen wir damit den Einsatz von Linux in modernen Umgebungen wie Telefonen, Rechenzentren (von Public Cloud-Providern) und eingebetteten Systemen wie einem Raspberry Pi.

In diesem Kapitel habe ich einen Überblick über die Hintergründe von Linux gegeben. Wir haben die Rolle eines Betriebssystems im Allgemeinen besprochen - die zugrundeliegende Hardware zu abstrahieren und den Anwendungen eine Reihe grundlegender Funktionen wie Prozess-, Speicher-, Datei- und Netzwerkmanagement zur Verfügung zu stellen - und wie Linux diese Aufgabe erfüllt, insbesondere im Hinblick auf die Sichtbarkeit von Ressourcen.

Die folgenden Ressourcen helfen dir, dich weiterzubilden und die in diesem Kapitel behandelten Konzepte zu vertiefen :

O'Reilly-Titel
Andere Ressourcen

Und nun, ohne weitere Umschweife: Beginnen wir unsere Reise in das moderne Linux mit dem Kern, ähm, Kernel, der Sache!

Get Modernes Linux lernen now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.