1 %##############################################################################
2 % Filename: grml-paper.de.tex
3 % Purpose: Arbeit über 'grml' für die LV "Erstellen schriftlicher Arbeiten SS/2005"
4 % Latest change: Wed Sep 14 22:55:29 CEST 2005 [mika]
5 %##############################################################################
6 \documentclass[11pt,a4paper,german]{article}
7 %\documentclass[12pt,a4paper]{scrbook} % for longer documents
9 \usepackage[latin1]{inputenc} % for german umlauts
10 \usepackage{ngerman} % new german "Rechtschreibung"
11 %\usepackage[T1]{fontenc} % This package supports the "<" ">" and more signs
12 \usepackage{ae} % optimize for Acrobat Reader - only for display!
13 \usepackage{palatino} % This is just a font you maybe do not need ->
14 \usepackage{listings} % code
16 %% this specification checks wheter you use pdf or not:
18 \ifx\pdfoutput\undefined
19 \pdffalse % we are not running PDFLaTeX
21 \pdfoutput=1 % we are running PDFLaTeX
25 % now usepackage for pdf
30 anchorcolor=rltbrightblue,
33 menucolor=webdarkblue,
35 pdftitle={grml, Knoppix für Systemadministratoren und Texttool-User},
36 pdfauthor={Michael Prokop - mika (at) grml.org - www.grml.org / www.michael-prokop.at},
37 pdfsubject={grml, Knoppix für Systemadministratoren und Texttool-User},
38 pdfkeywords={grml, Knoppix, Linux, Systemadministratoren, Texttool-User, Geeks, Michael Prokop},
41 bookmarksopen=true]{hyperref}
43 %\usepackage[pdftex]{graphicx}
44 %\usepackage{thumbpdf}
49 anchorcolor=rltbrightblue,
52 menucolor=webdarkblue,
53 citecolor=webgreen]{hyperref}
58 \ifx\pdfoutput\undefined
66 \usepackage[pdftex]{color}
67 \usepackage[pdftex]{graphicx}
70 \usepackage[dvips]{color}
71 \usepackage[dvips]{graphicx}
75 % define the colors which are used in the pdf-document:
76 \definecolor{rltbrightred}{rgb}{1,0,0}
77 \definecolor{rltred}{rgb}{0.75,0,0}
78 \definecolor{rltdarkred}{rgb}{0.5,0,0}
79 \definecolor{rltbrightgreen}{rgb}{0,0.75,0}
80 \definecolor{rltgreen}{rgb}{0,0.5,0}
81 \definecolor{rltdarkgreen}{rgb}{0,0,0.25}
82 \definecolor{rltbrightblue}{rgb}{0,0,1}
83 \definecolor{rltblue}{rgb}{0,0,0.75}
84 \definecolor{rltdarkblue}{rgb}{0,0,0.5}
85 \definecolor{webred}{rgb}{0.5,.25,0}
86 \definecolor{webblue}{rgb}{0,0,0.75}
87 \definecolor{webgreen}{rgb}{0,0.5,0}
91 %% clear header and footer
95 \lfoot{Michael Prokop}
96 \rfoot{\thepage\ von \pageref{LastPage}}
97 %\rfoot{\thepage\ von 5}
98 %% clear the 'nice' lines
99 \renewcommand{\headrulewidth}{0pt}
100 \renewcommand{\footrulewidth}{0pt}
103 \title{grml - Linux fuer Systemadministratoren und Texttool-User}
104 \date{Revision: \today}
105 \author{{\bfseries Michael Prokop}\\
106 (Projektleiter des grml-Projektes,\\
113 Dieses Dokument gibt im ersten Teil einen Einstieg in die Linux-Live-CD
114 namens grml. Grundlegende Konzepte sowie Möglichkeiten von und mit grml
115 werden erläutert. Im zweiten Teil werden die Technologien hinter grml
116 beschrieben. Welche Möglichkeiten zur Hardwareerkennung existieren, kommen
117 zum Einsatz und welche Technologien sind für Live-Systeme von Interesse.
119 Diese Version des Dokumentes bezieht sich auf grml 0.4 und grml-small 0.1 sowie
120 die in Kürze erscheinenden Versionen grml 0.5, grml-small 0.2 und grml-usb 0.1.
125 % grml, Linux, Live-CD, Kernel, Knoppix, Systemadministratoren, Texttool-User,
126 % Hardwareerkennung, zsh
135 Dieses Dokument entstand aus der Motivation, dass es zu den Themen grml,
136 Linux als Live-System und Hardwareerkennung mit Linux kaum bzw. keine
137 Dokumentation jenseits des Quellcodes gibt. Diese Arbeit soll diese Kluft
138 schließen und dem Leser einen Einblick in grml geben.
142 \subsection{Was ist grml?}
144 'Die Freiheit beschäftigt die Menschheit seit ihrer Entwicklung von der
145 Rotte zum staatsbildenden Individuum. Beschäftigten sich in der
146 Vergangenheit vorwiegend Philosophen, Staatstheoretiker und Politiker mit
147 dem Thema, hat nun die IT-Branche dessen Relevanz für sich entdeckt.'
150 So entstand im Herbst 2004 ein weiteres, neues OpenSource-Projekt namens
151 ''grml''. grml ist eine kostenlos via Internet erhältliche Live-CD. 'Eine
152 Live-CD ist eine bootfähige CD, welche ein Betriebssystem beinhaltet, das
153 aber nicht installiert werden muss, um zu funktionieren.' \cite{wikicd}.
155 Die bekannteste auf Linux basierende Live-CD ist Knoppix von Klaus Knopper.
156 Die Zielgruppe von Knoppix sind Ein- und Umsteiger, die sich die
157 Möglichkeiten von ''Linux ohne Risiko'' anschauen möchten. Das Zielpublikum der
158 hier behandelten Live-CD namens grml sind Fortgeschrittene und Experten.
159 Sowohl für Systemadministratoren (die oft Systeme debuggen und reparieren
160 müssen) als auch Textool-User (jene Personen, die gerne auf der Konsole
161 arbeiten) sind die zur Arbeit notwendigen Applikationen vorhanden. Über
162 2200 Software-Pakete sind Teil von grml, über 800 davon sind welche, die
163 man auf Knoppix nicht findet. In \cite{knoppixhacks} ist zu lesen, dass
164 'Knoppix das Schweizer Taschenmesser der Live-CDs' ist. grml ist das
165 Schweizer Taschenmesser der Systemadministratoren und Texttool-User.
167 \subsection{Was braucht man für die Nutzung von grml?}
169 Um grml zu nutzen empfiehlt sich die typische Computerausstattung in Form
170 eines Computers mit CD-Laufwerk, Monitor sowie Eingabegeräte wie Tastatur
171 und Maus. grml bringt eine automatische Hardware-Erkennung von Haus aus
172 mit. Man muss sich zum Beispiel keine Sorgen darüber machen, welche
173 Netzwerkkarte im Rechner steckt und welches Kernelmodul dafür notwendig
174 ist. grml erkennt Hardware selbstständig und ohne manuelles Zutun.
175 Natürlich kann durch manuelles Eingreifen - wie z.B. via einem speziellen
176 Bootparameter - diese Erkennung gesteuert werden.
178 \subsection{Was kann man mit grml machen?}
180 grml eignet sich hervorragend für typische Systemadministratortätigkeiten.
181 Darunter fallen Arbeiten wie Dateisystemchecks, Bootloader-Reparaturen,
182 Hardware-Untersuchungen und Netzwerkdebugging. Aber auch für forensische
183 Untersuchungen kommt grml zum Einsatz. Bei einer solchen Untersuchung wird
184 'ein forensisches Duplikat der betroffenen Datenträger
185 erstellt'\cite{geschonneck}. Dabei ist es wichtig, dass der betroffene
186 Datenträger - im Normalfall eine Festplatte - absolut unverändert und
187 unangetestet bleibt. Dies ist mit einem von CD laufenden grml-System
188 möglich. Weitere dient grml dem Testen von Software sowie als eine
189 risikoarme Test- und transportable Arbeitsumgebung. grml2hd ist ein
190 Installationsprogramm, mit dessen Hilfe man ein laufendes grml-System auf
191 die Festplatte schreiben und von dort nutzen kann. Innerhalb von wenigen
192 Minuten und mit nur wenigen zu beantwortenden Fragen hat man auf diese Art
193 und Weise ein benutzbares und mit Hardware-Erkennung ausgestattetes
194 Linux-System zur Verfügung. grml kann also auch zum Prototyping und Testen
195 von Hardware-Support seitens Linux herangezogen werden.
197 \subsection{Das grml-Team}
199 Die Projektleitung und Hauptentwicklung wird vom Autor dieses Dokumentes -
200 Michael Prokop - ausgeführt. Weitere Hauptentwickler kümmern sich um zentrale
201 Komponenten des grml-Systems. Der grml-Installer grml2hd zum Beispiel wird von
202 Andreas Gredler betreut, Michael Gebetsroither kümmert sich unter anderem um den
203 grml-Terminalserver. grml-Kontributoren wiederum sind Leute, die sich um
204 spezielle Aufgabengebiete wie Applikationskonfiguration, Grafiken und Fotos
205 sowie Accessibility/Zugänglichkeit aber auch Spezialgebiete wie udev kümmern.
209 Kostenfreier Support ist über die englischsprachige \cite{grmlml} sowie den
210 IRC-Kanal \#grml auf irc.freenode.org zu beziehen. Speziell angepasste
211 Versionen von grml, längerfristiger Support mit garantierter Reaktionszeit,
212 Audits/Beratung, Vorträge, Workshops sowie Schulungen sind von den
213 grml-Entwicklern gegen Entgeld zu beziehen. Mehr Details dazu gibt es auf
214 \href{http://solutions.grml.org/}{solutions.grml.org}.
216 \subsection{News rund um grml}
218 Ankündigungen zu neuen grml-Releases, neuen Teammitgliedern und anderen
219 wichtigen Neuerungen rund um grml werden auf der \cite{grml}
220 bekanntgegeben. Zusätzlich zu der HTTP-Variante kann auch der
221 \cite{grmlrss}\footnote{engl. Really Simple Syndication, eine XML-Datei um
222 sich mit einem RSS-Reader auf dem Laufenden zu halten} abonniert werden.
224 Ein wichtiger Teil von grml ist die offene und transparente Entwicklung.
225 Deswegen sind aktuelle News zur Entwicklung von grml im öffentlich
226 verfügbaren \cite{grmldevblog} zu finden.
228 \subsection{Informationen rund um grml}
230 Der Hauptanlaufpunkt ist natürlich die \cite{grml}, auf der es nicht nur
231 allgemeine Informationen sowie eine
232 \cite{grmlfaq} (Frequently Asked Questions), sondern auch Informationen rund um
233 die jeweiligen Releases gibt.
235 Seit dem 5. Juli 2005 gibt es zusätzlich auch das \cite{grmlwiki}. In diesem
236 \cite{wiki} werden relativ ''bewegliche'' Informationen gesammelt. Angefangen
237 von einer Todoliste, über aktuelle Informationen bis hin zu Tipps und Tricks ist
238 dort alles Relevante zu finden. Das Wiki kann nicht nur von jedem gelesen,
239 sondern auch bearbeitet werden. Mitarbeit ist nicht nur möglich sondern
240 ausdrücklich erwünscht!
242 \subsection{Die ''grml-Geschmacksrichtungen''}
244 Am 15. Mai 2005 hat Marc Haber in der Newsgroup de.comp.os.unix.linux.misc
245 eine Debian-basierte Live-CD-Distribution mit einer ISO-Größe von maximal
246 55 MB gesucht \cite{groupsgooglehaber}. Es gab schon von grml-Entwicklern
247 öfters den Ruf nach einer kleineren, spezialisierten grml-Version.
248 Motiviert durch die Anforderungen von Marc Haber und durch Gespräche mit
249 ihm wurde an einer ''Miniversion'' von grml gearbeitet. Am 5. Juli 2005
250 wurde dann grml-small in Version 0.1 veröffentlicht. grml-small ist ein
251 rund 50MB großes ISO-Image und beinhaltet einen - im Vergleich zu grml(-large) -
252 abgespeckten aber trotzdem aktuellen Kernel und ein paar grundlegende und
253 für die Systemadministration wichtige Softwarepakete. Weder ein X-Server
254 noch große Softwarepakete wie LaTeX oder Emacs sind an Board, die
255 platzfressende Dokumentation wurde ausgespart und auch eine
256 Festplatteninstallation via grml2hd ist (aktuell) nicht vorgesehen. Für
257 Rescue-Zwecke ist es aber ausreichend und dank der geringen ISO-Größe passt
258 grml-small sowohl auf Visitenkartenrohlinge als auch kleinere (<=64MB)
261 grml-usb ist ein weitere grml-Version, welche im Zeitraum September
262 2005 veröffentlicht wird. Während grml(-large) der Luxusdampfer ist, der alle
263 Features bringt und grml-small ein minimalistisches System - vergleichbar
264 mit einem Jetski - ist, stellt grml-usb die Mitte - als eine Art Motorboot
265 - dar. grml-usb ist ein ISO-Image mit ca. 240 MB und ist - wie es der Name schon
266 andeutet - für den Einsatz auf USB-Sticks angepasst. Ein 256MB-USB-Stick
267 reicht aus um sowohl das grml-ISO-Image als auch persönliche Dateien
268 unterzubringen. Mit dem Skript \cite{grml2usb} lässt sich ein grml-ISO
270 einfach und unkompliziert auf einen USB-Stick installieren. grml-usb bringt
271 sowohl einen X-Server als auch viele Netzwerk- und Securitytools mit. Eine
272 Festplatteninstallation via grml2hd ist möglich, nur große Softwarepakete
273 wie LaTeX und Emacs mussten - aus offensichtlichen Gründen - eingespart
276 Im Folgenden wird die 700MB Variante von grml als \textbf{das} grml
277 bezeichnet, im Zweifelsfall wird es auch grml-large benannt. grml-small und
278 grml-usb kennzeichnen sich natürlich durch die Bezeichnung nach dem
281 \subsection{Qualitätssicherung}
283 Der Releasezyklus sieht öffentliche, stabile Releases alle zwei bis drei
284 Monate vor. Abweichungen können sich durch die Einführung von
285 speziellen Features ergeben, werden aber öffentlich angekündigt (siehe auch
286 \cite{grmlroadmap}). Der Debian-Unstable-Zweig - auf dem grml basiert -
287 befindet sich in ständiger Entwicklung. Auch die von grml unterstützte
288 Hardware kann aufgrund ihrer Vielfältigkeit nicht vollständig und im Detail
289 von den Entwicklern getestet werden. Aus diesem Grund wurde nach Erscheinen
290 von grml Version 0.3 das Beta-Tester-Unterprojekt ins Leben gerufen. Teil
291 dieses Projektes sind alle zwei bis drei Wochen erscheinende
292 Entwicklungsversionen. Diese Schnappschüsse der aktuell stattfindenen
293 Arbeit an der grml-CD werden von grml-Entwicklern, Kontributoren und
294 Beta-Testern getestet und etwaige Bugs werden zentral gesammelt. Stabile
295 Releases können dann freigegeben werden, sobald das 0-Bugs-Kriterium
296 erfüllt wurde. Bugs können natürlich auch bei stabilen Releases vorkommen.
297 Informationen, wie man einen Bug meldet, findet man im \cite{grmlwiki}
299 \href{http://wiki.grml.org/doku.php?id=bugs}{http://wiki.grml.org/doku.php?id=bugs}.
301 Diskussionen rund um neue Features und eventuelle Probleme finden auf der
302 geschlossenen Development-Mailingliste statt. Alle für die Allgemeinheit
303 relevanten Informationen werden dann in gekürzter und aufbereiteter Form im
304 \cite{grmldevblog} veröffentlicht.
306 \subsection{grml-Spezialitäten}
308 \subsubsection{Softwareauswahl}
310 In den über 2200 Softwarepaketen steckt eine Vielzahl an Applikationen. Die
311 Software stammt hierbei zu >90\% aus dem Debianprojekt. Den Rest stellen
312 Debian-Pakete aus Ubuntu, vereinzelten anderen Quellen und natürlich dem
313 grml-Pool selbst dar. Die Software im grml-Pool wurde eigens für grml
314 paketiert, der Einsatz ist an sich aber auch auf reinen Debian-Systemen
315 möglich. Software, die als interessant eingestuft wird, aber weder bei
316 Debian, noch Ubuntu oder weiteren Quellen zu finden ist, wird von den
317 grml-Entwicklern selbst paketiert und in grml integriert.
319 Natürlich gehören verschiedene Editoren zum Lieferumfang von grml.
320 Angefangen bei \textbf{vim} und \textbf{nano} über \textbf{joe} und
321 \textbf{emacs} bis hin zu dem Original-Vi-Port \textbf{ex-vi} ist alles
322 dabei. Texttool-User bekommen mit dem Mailclient \textbf{mutt} und dessen
323 Fork \textbf{mutt-ng}, dem Newsreader \textbf{slrn}, dem
324 Instant-Messaging-Client \textbf{centericq} und dem IRC-Client
325 \textbf{irssi} wertvolle Software zur Auswahl.
327 Natürlich sind auch Tools zur Datenrettung an Board. \textbf{gpart} errät
328 Partitionstabellen, mit \textbf{recover} lassen sich Dateien auf
329 ext2-Dateisystemen wiederherstellen. \textbf{salvage-ntfs} und
330 \textbf{scrounge-ntfs} dienen zur Datenrettung auf Partitionen mit dem
331 NTFS-Dateisystem. Mit \textbf{ntfsresize} lassen sich NTFS-Partition
332 verkleinern und vergrößern.
334 Für Auditing gibt es ebenfalls eine Vielzahl an Software an Board. Mit
335 \textbf{rats} lassen sich typische Programmierfehler in Programmen - die in
336 C, C++, PHP, Perl oder Python geschrieben sind - identifizieren. Mit
337 \textbf{pscan} kann man typische Securityfehler in C-Quellcode aufspürfen.
338 \textbf{bass} ist ein so genannter ''Bulk Auditing Security Scanner'' mit
339 dem man nach einer Vielzahl von Exploits suchen kann. \textbf{satan} ist
340 eine Softwaresammlung um Netzwerke auf ihre Sicherheit hin zu überprüfen.
341 Mit \textbf{smb-nat} lassen sich Audits für NetBIOS-Dateifreigben
344 Nachdem grml auch für Netzwerkdebugging zum Einsatz kommt, ist eine
345 Vielzahl an Netzwerkapplikationen zu finden. Obligatorische Software wie
346 der Securityscanner \textbf{nessus} sowie \textbf{nmap} fehlen dabei
347 natürlich nicht. Mit \textbf{hping} lassen sich spezielle Netzwerkpakete
348 erzeugen. \textbf{doscan} wiederum eignet sich für das verteilte Scannen
349 von großen Netzwerken.
351 %TCP-Stack-Fingerprinting zum Beispiel kommt bei Security-Audits sehr oft
352 %zum Einsatz. Es 'besteht daraus, eine Vielzahl von Paketuntersuchungen
353 %gegen ein Ziel zu schleudern und das entfernte Betriebssystem durch den
354 %Vergleich der Änderungen mit einer Datenbank vorherzubestimmen. Nmap von
355 %Fyodoor, zu finden auf Insecure.org, gilt als das beste Werkzeug für diesen
356 %Job.'\cite{kennedeinenfeind}
358 Der Nachfolger von CVS namens \textbf{subversion} ist sowohl als Client als
359 auch in Serverform vertreten. Der bekannte Webserver \textbf{Apache} ist in
360 Version 1.3 und Version 2.0 zu finden. Wer Datenbanken braucht, bekommt mit
361 \textbf{MySQL}, \textbf{PostgreSQL} und \textbf{sqlite} bekannte Vertreter
362 der OpenSource-Datenbanken zur Verfügung gestellt. Clients für weitere
363 Revisionssysteme wie \textbf{bazaar}, \textbf{darcs} und \textbf{tla} sind
364 natürlich auch verfügbar.
366 \subsubsection{zsh und zsh-lovers}
368 Jene Shell die im interaktiven Bereich auf Linuxsystemen meistens zum
369 Einsatz kommt ist die Bash. Während die Bash Grundfunktionalitäten durchaus
370 bietet, gibt es für Poweruser eine noch interessantere Shell: die Z-Shell,
371 kurz zsh\cite{zsh}. Die zsh ist sehr modular aufgebaut, bietet einen
372 hochkonfigurierbaren Vervollständigungsmechanismus und eine mächtige
373 Skriptingsprache. Die Aussage von Thorsten Zilm und Karsten Günther trifft
374 den Nagel auf den Kopf: 'Ihre Anwendung ist aufgrund der Leistungsfähigkeit
375 nicht unbedingt einfach; sie wird daher überwiegend von Spezialisten
376 eingesetzt.'\cite{bash} Aus diesem Grund kommt die zsh als die zentrale
377 Shell bei grml zum Einsatz. Sie ist auf grml aber nicht nur die
378 Standard-Loginshell, sondern sie wird auch als Interpreter für /bin/sh
379 herangezogen. Da die zsh in ihrer Standardkonfiguration leider sehr minimal
380 ist, wird sie auf grml mit einer erweiterten und angepassten Konfiguration
381 ausgeliefert. So können praktische Funktionen wie der
382 Vervollständigungsmechanismus sowie vordefinierte Shellaliases und
383 -funktionen out-of-the-box genutzt werden. zsh-Anfänger können so die
384 Mächtigkeit und Möglichkeiten der zsh in kurzer Zeit erlernen und nutzen.
385 Details zu der Konfiguration gibt es auf der \cite{grmlzsh} und in der dort
386 erhältlichen \textbf{grml-zsh-Referenzkarte}. Diese Referenzkarte
387 dokumentiert vordefinierte Aliases, Funktionen und Einstellungen der zsh
390 Die zsh bietet eine Vielzahl an eleganten Lösungen für den Alltag eines
391 Systemadministrators und Texttool-Users. Viele dieser Beispiele werden im
392 zsh-lovers-Projekt gesammelt, das Teil von grml ist. In der Manualpage
393 \textbf{zsh-lovers} ('man zsh-lovers') sind viele Tipps und Tricks
394 gesammelt und es soll dem interessierten Anwender eine Anlaufstelle für
395 Probleme und ein Ideengeber sein. Mehr Informationen zu der zsh bei grml
396 und dem zsh-lovers-Projekt gibt es auf der \cite{grmlzsh}.
398 \subsubsection{grml-etc}
400 Das Paket grml-etc beinhaltet diverse Konfigurationsdateien, die vor allem
401 eine verbesserte Standardkonfiguration mit sich bringen. So können
402 Programme in einer für den User angenehmeren Konfiguration ausgeliefert
405 \subsubsection{grml-scripts}
407 Im Paket grml-scripts werden verschiedene Skripte, für die ein jeweils
408 eigenes Paket zu viel Aufwand bedeuten würde, in Form einer Skriptsammlung
411 \subsubsection{grml2hd}
413 Das grml-System kann auf Systemen ohne Festplatte gebootet werden.
414 Allerdings kann man grml nicht nur von CD-ROM nutzen, sondern es gibt auch
415 eine Möglichkeit um es auf eine Festplatte zu installieren. Das dafür
416 zuständige Programm ist grml2hd. Dieses Programm kopiert das aktuell
417 laufende System mit nur einigen wenigen Nachfragen auf die Festplatte. Auf
418 diese Weise kann man ein Linuxsystem inklusive vollständiger
419 Hardwareerkennung - diese lässt sich natürlich direkt via Live-CD testen -
420 schnell und einfach aufsetzen. Ein Beispiel, um grml auf der Partition
421 /dev/hda1 sowie den Masterbootrecord (MBR) in /dev/hda zu installieren:
424 # grml2hd /dev/hda1 -mbr /dev/hda
427 In weiterer Folge muss man nur mehr ein paar generelle Frage beantworten.
428 Mehr ist nicht notwendig und wenige Minuten später ist das System schon
429 bootfähig. Die Dauer der Installation hängt primär von der verwendeten
430 Hardware - vor allem dem CD-ROM-Laufwerk - ab, mit einem schnellen
431 CD-ROM-Laufwerk, ca. 256MB RAM und einer schnellen Festplatte lässt sich
432 eine Installation innerhalb von 10 Minuten durchführen.
434 Weitere Informationen zu grml2hd gibt es auf \cite{grml2hd}.
436 \subsubsection{grml-terminalserver}
438 Nicht nur via CD-ROM oder via Festplatte lässt sich grml nutzen. Man kann
439 mit dem grml-terminalserver das grml-ISO auch über das Netzwerk booten.
440 Einerseits indem man die PXE-Möglichkeit\cite{wikipxe} (engl. Preboot
441 Execution Environment) des Rechners aktiviert oder indem man eine Diskette
442 mit dem notwendigen Netzwerktreiber nutzt. Beide Varianten werden vom
443 grml-terminalserver unterstützt. Mehr Details dazu auf
444 \cite{grmlterminalserver}.
446 \subsubsection{Bootmöglichkeiten von grml}
448 Der Vollständigkeit halber sollte noch erwähnt werden, welche Bootmedien
449 von grml unterstützt werden. Wie bereits zu lesen war, kann man grml nicht
450 nur von CD/DVD oder über das Netzwerk (via grml-terminalserver) booten.
451 Auch das Booten von einem USB- oder Firewire-Gerät ist möglich. Das
452 bedeutet, man kann grml z.B. via USB-Stick (siehe das Skript grml2usb), via
453 USB-Festplatte oder einem DVD-Laufwerk, das via Firewire angeschlossen ist,
454 booten. Selbstverständlich lässt sich grml auch auf einer
455 Compact-Flashkarte nutzen.
457 \subsubsection{Kernel}
459 Mit Kernel 2.6 wurde das Entwicklungsmodell von den Kernelentwicklern
460 abgeändert. Stabile Releases wie man es noch von Kernel 2.4 gekannt hat
461 gibt es nicht mehr. Die Qualitätssicherung und einen ''brauchbaren'' Kernel
462 muss nun der Distributor zur Verfügung stellen. Obwohl mit den
463 2.6.x.y-Releases ein enormer Fortschritt zu bemerken ist, erfüllt man mit
464 einem unveränderten Kernel von \cite{kernel} - dem so genannten
465 Vanilla-Kernel - nicht immer alle gewünschten Anforderungen. Aus diesem
466 Grund gibt es auch bei grml einen angepassten Kernel.
468 Der Kernel umfasst einerseits aktuelle Bugfixes, aber auch zusätzliche
469 Funktionalitäten wie Support für Microsoft PPP compression/encryption
470 (MPPC/MPPE), das Reiser4-Dateisystem und Speakup-Support. Kernelmodule für
471 viele Wireless-LAN-Netzwerkkarten wie zum Beispiel ipw2100/2200, madwifi
472 und ndiswrapper werden ebenfalls unterstützt. Weitere Details rund um den
473 Kernel bei grml gibt es auf \cite{grmlkernel}.
475 \section{Die Technik hinter grml}
479 Die Beschreibung der folgenden Technologien bezieht sich - sofern nicht
480 explizit erwähnt - auf jene Implementierung, die in Debian GNU/Linux zum
481 Zeitpunkt der Entstehung dieses Dokumentes zu finden ist.
485 Das Debian-Projekt ist eine Gemeinschaft von Individuen, die in
486 Gemeinschaftsarbeit ein freies Betriebssystem namens Debian GNU/Linux -
487 oder kurz einfach nur Debian - entwickeln. Der Name Debian GNU/Linux
488 erklärt sich dadurch, dass das dem grml-System zugrunde liegende
489 Betriebssystem Linux ist. Ein Großteil der sogenannten Coreutils
490 (Software wie cp und tar) entstammt dabei dem GNU-Projekt (GNU's Not UNIX).
491 Debian bietet eine große Auswahl an Software (über 15.000 Softwarepakete),
492 öffentlich zugängliche Mailinglisten, Bug-Tracking-Systeme und frei
493 verfügbare Installationsmedien. Weitere Informationen rund um Debian gibt
494 es unter \cite{aboutdebian}.
496 \subsection{Paketmanagement}
498 grml beinhaltet über 2200 Softwarepakete. Um den Überblick über diese große
499 Anzahl an Paketen nicht zu verlieren und die über 123.000 Dateien und
500 Verzeichnisse aktuell zu halten bedarf es eines Paketmanagements. Dieses
501 Paketmanagement ermöglicht ein automatisierbares und einheitlich
502 anzuwendendes Hinzufügen (Installation), Entfernen (Deinstallation) und
503 Aktualisieren (Update/Upgrade) der gewünschten Software. Wichtig ist auch,
504 dass Benutzer eine dokumentierte Schnittstelle und keinen WFM-Hack (Works
505 For Me) vorfinden. Aus diesem Grunde wurde Debian als Basis gewählt. Das
506 Paketmanagement von Debian (bekannt als DPKG/APT bzw. die Debian-Pakete mit
507 der Dateiendung .deb) ermöglicht auch eine sehr gute Qualitätssicherung und
508 -kontrolle. Details zu APT findet man in \cite{apthowto}.
510 \subsection{Bootvorgang}
512 Um die Hardwareerkennung zu verstehen, bedarf es auch grundlegenden Wissens
513 über den Bootvorgang auf einem Live-CD-System. Beim Start von grml ist als
514 Erstes ein Bootsplash zu sehen. Dieser Bootsplash wird von isolinux
515 geladen. isolinux ist ein Bootloader für Linux, der im 'No-Emulation-Modus'
516 dem ISO 9660/El Torito-Standard folgt. Dadurch können das Limit des
517 Floppy-Emulation-Modus und die Kompatibilitätsprobleme des
518 Harddisk-Emulation-Modus umgangen werden.\cite{isolinux}
520 isolinux lädt dann den Linux-Kernel und dieser führt wiederum eine initiale
521 Ramdisk - bekannt unter dem Namen initrd - aus. Um jedoch überhaupt auf
522 das Root-Dateisystem zugreifen zu können, bedarf es je nach verwendeter
523 Hardware verschiedene Treiber. Das Root-Dateisystem selbst ist mit SquashFS
524 komprimiert, der dafür notwendige Treiber ist fix in den Kernel eingebaut.
525 Wenn das grml-ISO aber zum Beispiel in einem SCSI-CD-ROM-Laufwerk liegt,
526 muss man für das SCSI-Laufwerk den dafür passenden Treiber laden bevor man
527 die komprimierte Datei überhaupt erst ansprechen kann. Die Ramdisk
528 ermöglicht nun das Ausführen verschiedener Kommandos noch bevor das
529 Root-Dateisystem angesprochen wird. Der Vorgang soll möglichst flexibel und
530 mächtig sein, gleichzeitig soll die Ramdisk aber trotzdem klein sein, da
531 sie ja in den Speicher geladen werden muss. Dies wird durch die Verwendung
532 der statisch kompilierten Busybox-Shell erreicht. Auch die Einbindung von
533 UnionFS findet im Bootstrapping in der initrd statt.
535 Zur Erstellung der initrd gibt es verschiedene Möglichkeiten. Der erste
536 Schritt ist das Anlegen einer loop-back-Datei:
538 \subsubsection{initrd}
541 # dd if=/dev/zero of=/tmp/initrd bs=1024 count=5000
542 # mke2fs -b 1024 -N 8192 -F -q -m 0 /tmp/initrd
543 # mount -t ext2 -o loop /tmp/initrd /mnt/test
544 # cd /mnt/test ; rm -rf lost+found
547 In diesem Dateisystem werden dann die notwendigen Treiber, Skripte und
548 Binaries platziert. Um Platz zu sparen wird die Datei noch mit gzip
549 komprimiert. Der Kernel dekomprimiert die initrd dann und bindet sie als
550 temporäres Root-Dateisystem ein. Dann wird die Datei /linuxrc ausgeführt
551 und sobald diese terminiert, wird das temporäre Dateisystem wieder
552 ausgebunden (engl. unmounted) und die eigentliche Hardwareerkennung beim
553 Bootvorgang kann ausgeführt werden.
555 In Zukunft ist auch der Einsatz von initramfs-tools nicht
556 auszuschließen.\cite{initramfs} Bei Debian ist weiters ein neues
557 init-System namens init-ng im Entstehen. grml verwendet für den Bootvorgang
558 via grml-autoconfig zwar bereits spezielle Methoden wie Statusmeldungen und
559 Parallelisierung, eine Integration von init-ng ist aber durchaus nicht
560 ausgeschlossen und bereits angedacht.
562 % Auch Ubuntu ist dabei, diese Umstellung zu wagen.\cite{initramfs-ubuntu}
563 % TODO: init http://www.linuxfibel.de/booten.htm
565 \subsection{Hardware-Erkennung}
567 \subsubsection{hotplug}
569 Hotplugging nennt sich die Möglichkeit, Geräte zur Laufzeit dem System
570 hinzu zu fügen oder zu entfernen. Während man eine solche Möglichkeit
571 früher nur von PCMCIA kannte, wurde mit der Verbreitung von USB- und
572 Firewire-Geräten sowie dem Ausblick auf PCI-Hotplugging der Wunsch,
573 Hotplugging-Support im Kernel zu haben immer größer. Seit dem Kernel 2.4
574 ist Hotplugging ein Standard-Feature von GNU/Linux.
576 Damit nicht jeder Linux-Distributor selbst Shellskripte entwickeln muss,
577 wurde im Rahmen des linux-hotplug-Projektes\cite{hotplug} unter Leitung von
578 David Brownell eine Shellskript-Sammlung für das Hotplugging geschaffen.
579 Bei der aktuellen Hotplugging-Implementierung namens hotplug werden neu
580 erkannte Geräte dem Userland via dem Shellskript-Wrapper /sbin/hotplug
581 zugänglich gemacht. Dieses Shellskript lädt auf einem Debian-System die zur
582 Geräteklasse gehörenden Skripte in /etc/hotplug.d/. Diese Skripte wiederum
583 kümmern sich darum, dass die passenden Treiber via modprobe geladen und via
584 rmmod entladen werden.
586 Allerdings ist zu beachten, dass bei Verwendung von udev dessen udevsend
587 noch zwischen Kernel und hotplug steht. Die manuelle Kontrolle mittels
588 ''cat /proc/sys/kernel/hotplug'' zeigt, ob wirklich udevsend zum Einsatz
589 kommt. Bei grml ist dies der Fall und udevsend leitet die Events an den
592 Eine Zuweisung von einer Gerätenummer (engl. device-id) zu deren passenden
593 Treiber (Kernelmodul) wäre in Shellskript-Form mit zu großem Overhead
594 versehen. Daher wird jedem Kernelmodul entnommen, welche Geräte es
595 unterstützt. Diese Information wird beim Lauf von depmod durch Suchen nach
596 MODULE\_DEVICE\_TABLE() in den Treiberdateien in eine Tabelle geschrieben.
597 Diese Tabellen sind dann unter
598 /lib/modules/~\$KERNELVERSION/modules.\$(CLASS)map zu finden. Die
599 hotplug-Implementierung kann dann anhand dieser Zuweisungen die Zuordnung
600 vom Gerät zum passenden Treiber vornehmen. Aber nicht nur Treiber können
601 ge- und entladen werden, auch Netzwerkinterfaces können automatisch hinauf-
602 und hinuntergefahren und gleichzeitigt konfiguriert werden. Ebenso können
603 externe Geräte wie USB-Sticks automatisch in das Dateisystem eingebunden
604 und auf Wunsch auch ein Icon am Desktop angelegt werden.
606 Kernel 2.6 stellt Hotplugging für alle auf sysfs-basierenden Subsysteme
607 (Bussysteme und Treiber) zur Verfügung. Für jedes Gerät, das ein so
608 genanntes kobject im sysfs registriert, wird ein Hotplug-Event ausgelöst.
609 Obwohl der Name hotplug nur das Feature Hotplugging suggeriert, unterstützt
610 hotplug auch das so genannte Coldplugging, also die Erkennung von Geräten,
611 die nicht erst zur Laufzeit erkannt werden. Deswegen ist hotplug ein
612 essentieller Teil der Hardwareerkennung bei grml.
614 Die Shellskript-Implementierung hat leider einen entscheidenden Nachteil:
615 die modules.*map-Dateien werden zeilenweise mit Shellkomperatoren (engl.
616 bash comparitors) geparst. Dies ist sehr zeitintensiv und besonders bei
617 einer kurzen Bootzeit sehr störend. Diesem Problem wirken zwei weitere
618 Implementierung entgegen: hotplug-perl und hotplug-ng.
620 Die Perl-Implementierung namens hotplug-perl nutzt für jedes Subsystem ein
621 eigenes Perlmodul. Die Modulmappings (modules.*map) und die Blacklist
622 werden nur einmal pro Instanz gelesen und als Array bzw. Hash zur weiteren
623 Verarbeitung gespeichert.\cite{hotplug-perl}
625 hotplug-ng geht noch einen Schritt weiter und ist eine
626 hotplug-Implementierung in der Programmiersprache C.\cite{hotplug-ng}
627 Allerdings hat hotplug-ng noch keinen Einzug in Debian gefunden. Die
628 Autoren von udev die gleichzeitig auch hotplug-ng entwickelt haben
629 bezeichnen sogar selbst hotplug-ng für obsolet, da in Zukunft udev die
630 relevanten Teile von hotplug vollständig übernehmen könnte.
632 Um den Bootvorgang zu optimieren, kommt bei grml-small 0.1 und auch bei den
633 in Kürze erscheinenden Versionen grml 0.5 und grml-usb 0.1 hotplug-light
634 zum Einsatz. Diese von Marco D'Itri entwickelte Variante beschleunigt den
635 Bootprozess enorm, nutzt aber gleichzeitig die Features von hotplug
636 kombiniert mit den Möglichkeiten von udev.
638 % http://portal.suse.com/sdb/de/2004/05/91_coldhotplug.html
640 % chandev default dock ieee1394 input net pci scsi usb
642 % http://lkml.org/lkml/2005/2/10/179
643 % http://lwn.net/Articles/123932/
644 % http://www.kroah.com/linux/talks/ols_2001_hotplug_paper/hotplug.ps -
645 % Greg Kroah-Hartman - 2001 / Ottawa Linux Symposium
649 udev ist ein Userspace-Gerätedateisystem (engl. devfs - Device Filesystem).
650 Es überwacht Hotplug-Events und anhand von Geräteinformationen aus dem
651 sysfs (/sys) erstellt es dynamisch und zur Laufzeit Gerätedateien unter
652 /dev. Der Vorteil der Auslagerung aus dem Kernel (wie es beim früheren
653 Standard devfs der Fall war) ist eine hohe Flexibilität. Geräte können
654 beliebig benannt werden und die Benennung ist konform der LSB (Linux
655 Standard Base\footnote{ein, von der Free Standards Group verabschiedeter
656 Standard, mit dem Ziel, die verschiedenen Linux-Distributionen hinsichtlich
657 Dateisystemstruktur und grundsätzlich notwendiger Bibliotheken zu
658 vereinheitlichen, um eine zu starke Zersplitterung zu
659 vermeiden.\cite{wikilsb}}).
661 Vor allem kann auch Persistenz in der Namensgebung erreicht werden, wenn
662 Geräte de- und aktiviert werden. Wenn ein USB-Drucker angeschlossen wird,
663 bekommt die Gerätedatei die entsprechend der \cite{lanana} vordefinierte
664 Majornummer 180 und die erste freie Minornummer zugewiesen. Sofern noch
665 kein anderer USB-Drucker den Platz belegt wird die erste Minornummer '0'
666 vergeben. Was aber passiert wenn nun ein zweiter USB-Drucker angeschlossen
667 wird? Dieser bekommt die Minornummer '1' zugewiesen. Wenn aber der nun als
668 /dev/usb/lp1 anzusprechende zweite USB-Drucker unter /dev/usb/lp0 erwartet
669 wurde und eine dementsprechende Zuordnung via /etc/fstab geplant ist,
670 schlägt dies fehl. Durch die Verwendung von udev, der Verwendung
671 einer eindeutigen Geräte-Identität und einem definierten Mountpunkt (zum
672 Beispiel /mnt/usbdrucker\_raum42) kann sichergestellt werden, dass der
673 gewünschte Drucker passend anzusprechen ist.
675 Zum udev-Paket gehören mehrere Applikationen. Der udev-Daemon udevd
676 serialisiert die Hotplug-Events vom Kernel, so dass die Events im Userspace
677 in der richtigen Reihenfolge ankommen. Seit Release 0.050 kann udev auch
678 die Rolle des hotplug-Multiplexers selbst übernehmen. Dies bietet den
679 Vorteil, dass hotplug-Aufruf in der passenden Reihenfolge für die
680 Generierung der benötigten Gerätedateien geschieht.
682 udevsend leitet die die Events an den udev-Daemon. Das Tool scsi\_id dient
683 dazu, um die SCSI-Identifikation auszulesen und eine eindeutige
684 Identifikationsnummer zu generieren. udev\_volume\_id wird im Normalfall
685 von den udev-Regeln aufgerufen, um Gerätenamen passend zum Namen, UUID oder
686 dem Dateisystemtyp einer Partition anzulegen. % STIMMT DAS?!
688 Information zu einem Gerät können via udev mit dem Tool udevinfo abgefragt
689 werden. Mit udevtest kann simuliert werden, was udev im Nicht-Testlauf
690 ausführen würde. udevstart wiederum kommt - wie es schon der Name
691 suggeriert - beim Start von udev zum Einsatz. udevstart geht durch das
692 sysfs-Dateisystem und legt für jeden gefunden Eintrag ein Gerät im
693 Geräteverzeichnis /dev an. So kann ein leeres /dev-Verzeichnis befüllt
696 udev entwickelt sich sehr rasch und da ein gutes Zusammenspiel mit dem
697 verwendeten Kernel vorhanden sein soll (teilweise ist sogar eine relativ
698 aktuelle Kernelversion Voraussetzung zur vollständigen Funktion), nimmt das
699 grml-Team die Paketierung von udev selbst vor. In Zukunft wird udev noch
700 weitere Teile von hotplug übernehmen und es womöglich sogar obsolet
703 Im Folgenden nun ein paar Beispiel des Einsatze von udev:
707 mika@grml ~ % udev_volume_id -l /dev/hdc % Dateisystemlabel auslesen
709 mika@grml ~ % udevinfo -q path -n /dev/hdc % sysfs-Pfad eines Gerätes anzeigen
711 mika@grml ~ % udevinfo -q all -n /dev/hdc % alle Werte zu einem Gerät anzeigen
718 mika@grml ~ % udevtest `udevinfo -q path -n /dev/hdc` % Testlauf durchführen
720 looking at '/block/hdc'
721 opened class_dev->name='hdc'
722 configured rule in '/etc/udev/rules.d/cd-aliases.rules[9]' applied, \
723 added symlink '%c{1} %c{2} %c{3} %c{4} %c{5} %c{6}'
724 creating device node '/dev/hdc', major = '22', minor = '0', \
725 mode = '0660', uid = '0', gid = '24'
727 mika@grml % udevinfo -a -p /sys/class/net/eth0 % detaillierte Informationen
729 udevinfo starts with the device the node belongs to and then walks up the
730 device chain, to print for every device found, all possibly useful attributes
731 in the udev key format.
732 Only attributes within one device section may be used together in one rule,
733 to match the device for which the node will be created.
735 looking at class device '/sys/class/net/eth0':
737 SYSFS{address}="11:22:33:44:55:66"
738 SYSFS{broadcast}="ff:ff:ff:ff:ff:ff"
739 SYSFS{features}="0x3"
740 SYSFS{flags}="0x1002"
744 SYSFS{tx_queue_len}="1000"
747 follow the class device's "device"
748 looking at the device chain at '/sys/devices/pci0000:00/0000:00:09.0':
751 SYSFS{class}="0x020000"
752 SYSFS{detach_state}="0"
753 SYSFS{device}="0x9200"
755 SYSFS{subsystem_device}="0x1000"
756 SYSFS{subsystem_vendor}="0x10b7"
757 SYSFS{vendor}="0x10b7"
759 looking at the device chain at '/sys/devices/pci0000:00':
762 SYSFS{detach_state}="0"
767 % udevinfo -a -p `udevinfo -q path -n /dev/hdc`
769 %\href{ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/udev.html}{udev-Homepage}
770 %\href{ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ}{udev-FAQ}
771 %\href{http://www.gentoo.org/doc/en/udev-guide.xml}{udev-Guide von Gentoo}
772 %\href{http://www.reactivated.net/udevrules.php}{Writing udev rules}
773 %\href{http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf}{Greg Kroah-Hartman - Linux-Symposium 2003 / Ottawa}
775 \subsubsection{discover}
777 Discover ist ein von der Firma Progeny Linux Systems Inc. entwickeltes
778 Hardware-Identifikationssystem, das auf der Bibliothek libdiscover2
779 basiert. Discover besteht aus den drei Kommandozeilenapplikationen
780 discover-modprobe (Laden von Kernelmodulen), discover-config (Information
781 über die Paketkonfiguration) und discover (die zentrale
782 Hardwareerkennungs-Applikation). Die Implementierung für Linux wurde
783 basierend auf dem Code von detect von MandrakeSoft SA durchgeführt.
785 Bei discover werden in XML-Dateien Informationen zu Geräten und ihrer
786 Identifikation gespeichert. Es verwendet dabei für jeden Bustyp bis zu drei
787 verschiedene Arten von Listen: eine Bustypliste (busclass-list), eine
788 Herstellerliste (vendor-list) und eine Geräteliste (device-list). Discover
789 unterstützt aktuell die Bustypen ATA, PCI, PCMCIA, SCSI und USB. Die
790 Herstellerliste stellt nach außen hin Informationen zu einem bestimmten
791 Gerät zur Verfügung. Gültige Gerätetypen wären zum Beispiel audio, bridge,
792 display, network und printer. Die XML-Dateien sind auf einem Debian-System
793 unter /lib/discover/ zu finden. In diesen wird nun zum Beispiel angegeben,
794 welches Kernelmodul mit welchen Optionen für ein bestimmtes Gerät zu
797 Ein Beispiel um Informationen über die verfügbaren Grafikkarten zu
801 %\begin{lstlisting}[language=bash, emph={}, emphstyle=\underbar, breaklines=true, showstringspaces=false]
802 %\begin{lstlisting}[breaklines=false, showstringspaces=false]
804 % discover -v --type-summary --disable-bus all --enable-bus pci display
811 Loading XML data... pci Done
812 ATI Technologies Inc RV350 AP [Radeon 9600]
813 ATI Technologies Inc RV350 AP [Radeon 9600] (Secondary)
818 Weite Details zu discover sind in der offiziellen
819 Dokumentation auf der \cite{discover} zu finden.
821 \subsubsection{hwinfo}
823 hwinfo ist ein auf der Hardware-Detection-Bibliothek (libhd) aufbauendes
824 Hardwareerkennungstool der Firma SuSE. hwinfo steht unter der GPL und kommt
825 bei grml aktuell nur bei der Grafikkartenerkennung bei grml-x zum Einsatz.
826 Eine weitergehende Integration in den Prozess der Hardwareerkennung ist
827 aber nicht auszuschließen. hwinfo liest seine Hardwareinformationen nämlich
828 anders als zum Beispiel kudzu (das bei grml aber ebenfalls nicht mehr
829 eingesetzt wird) nicht aus einer externen Datei aus, sondern bringt es in
830 der libhd mit. Dies hat zwar den Nachteil, dass eine Aktualisierung der
831 Hardwareinformationen (diese wird in den IDS-Dateien vorgenommen) ein
832 Neubauen der Software bedingt. Es bringt umgekehrt aber einen
833 Performancevorteil, der gerade beim Bootvorgang nicht zu vernachlässigen
836 Wie funktioniert hwinfo nun im Groben? Anhand eines Beispieles soll dies
837 nun nachvollzogen werden. Wir interessieren uns für die Grafikkarte und
838 möchten Herstellerinformationen über diese, aber auch den Namen des zu
839 ladenden Treibers bekommen. lspci liefert uns Informationen über Geräte die
840 an den PCI-Bus angeschlossen sind:
845 0000:01:00.0 VGA compatible controller: ATI Technologies Inc Rage Mobility P/M AGP 2x (rev 64)
846 % lspci -n | grep "0000:01:00.0"
847 0000:01:00.0 0300: 1002:4c4d (rev 64)
851 Nachdem wir nun die PCI-ID kennen, vergleichen wir den Output einmal mit
856 % hwinfo --gfxcard | grep -A3 " Vendor:"
857 Vendor: pci 0x1002 "ATI Technologies Inc"
858 Device: pci 0x4c4d "3D Rage P/M Mobility AGP 2x"
859 SubVendor: pci 0x104d "Sony Corporation"
860 SubDevice: pci 0x80f6
865 Nun der dazu passende Ausschnitt aus den IDS-Dateien des hwinfo-Quellcodes:
870 &device.id pci 0x4c4d
871 +device.name 3D Rage P/M Mobility AGP 2x
876 Die Information darüber wird wirklich aus der libhd gelesen, wie uns das
877 nachfolgende Kommando beweist:
881 % strings /usr/lib/libhd.so | grep "3D Rage P/M Mobility AGP 2x"
882 3D Rage P/M Mobility AGP 2x
887 % http://portal.suse.com/sdb/de/2004/05/91_sysconfig.html
889 \subsubsection{D-BUS}
891 D-BUS ist ein Nachrichten-Bussystem.\cite{dbus} Ein Systemdaemon kümmert
892 sich um Systemnachrichten wie 'neue Hardware wurde hinzugefügt'. Ein
893 Userspace-Dämon (per-user-login-session daemon) kümmert sich um die
894 Interprozesskommunikation (engl. IPC - Inter Process Communication)
895 zwischen den Userlandapplikationen. D-BUS bietet optional Bindings für
896 GLib, Qt, Python und Mono/.NET. Projekte die auf D-BUS aufsetzen, sind
897 unter anderem udev und HAL.
901 Die Idee hinter \cite{hal} (Hardware Abstraction Layer, engl. Hardware
902 Abstraktionsschicht) ist es, die Hardware-Ebene zu abstrahieren und in Form
903 einer Bibliothek für Software zur Verfügung zu stellen. So muss sich
904 Software nicht um Details rund um die Hardware und deren Verwendung
905 kümmern. Applikationen können dadurch plattformübergreifend geschrieben und
906 verwendet werden. Sobald der HAL-Daemon (hald) und das D-BUS-System laufen,
907 kann man sich mit 'lshal' Hardwareinformationen anzeigen lassen. Ein
908 Beispiel der Anwendung um Prozessor-Informationen zu beziehen:
911 %\begin{lstlisting}[breaklines=fales, showstringspaces=false]
913 % lshal 2>/dev/null | sed -ne "/^udi = .*Processor/,/^$/p"
915 udi = '/org/freedesktop/Hal/devices/Processor'
916 linux.procfs.cpuinfo.bogomips = '3578.26' (string)
917 linux.procfs.cpuinfo.flags = 'fpu vme de pse tsc msr pae mce [...]
918 linux.procfs.cpuinfo.wp = 'yes' (string)
919 linux.procfs.cpuinfo.cpuid_level = '1' (string)
920 linux.procfs.cpuinfo.fpu_exception = 'yes' (string)
921 linux.procfs.cpuinfo.fpu = 'yes' (string)
922 linux.procfs.cpuinfo.coma_bug = 'no' (string)
923 linux.procfs.cpuinfo.f00f_bug = 'no' (string)
924 linux.procfs.cpuinfo.hlt_bug = 'no' (string)
925 linux.procfs.cpuinfo.fdiv_bug = 'no' (string)
926 linux.procfs.cpuinfo.cache_size = '256 KB' (string)
927 linux.procfs.cpuinfo.cpu_mhz = '1795.462' (string)
928 linux.procfs.cpuinfo.stepping = '1' (string)
929 linux.procfs.cpuinfo.model_name = 'AMD Athlon(tm) XP 2200+' (string)
930 linux.procfs.cpuinfo.model = '8' (string)
931 linux.procfs.cpuinfo.cpu_family = '6' (string)
932 linux.procfs.cpuinfo.vendor_id = 'AuthenticAMD' (string)
933 linux.procfs.cpuinfo.processor = '0' (string)
934 info.parent = '/org/freedesktop/Hal/devices/computer' (string)
935 info.product = 'Processor' (string)
936 info.bus = 'unknown' (string)
937 info.capabilities = 'linux.sysinfo' (string)
942 Via 'lshal --monitor' kann man die Geräteliste überwachen. Nützlich ist HAL
943 in Kombination mit hardwarenahen Applikationen wie udev und hotplug.
945 % \subsubsection{Diverses}
947 % TODO: Manuelle Erkennung... - dmidecode, ddcprobe, laptop-detect,
948 % xdebconfigurator, xviddetect, lshw, mdetect, nictools-nopci, nictools-pci,
949 % pconf-detect, read-edid,...
951 % http://wiki.debian.net/?HardwareAutodetection
952 % http://www.ubuntulinux.org/wiki/HardwareDatabase
954 \subsection{squashfs}
956 SquashFS ist ein komprimiertes read-only-Dateisystem für Linux. SquashFS
957 komprimiert Daten, Inodes und Verzeichnisse und kann dabei Dateien sowie
958 Dateisysteme bis zu einer Größe von 4 GB verarbeiten. Dabei werden
959 Blockgrößen von bis zu 64 KB verwendet, dies ermöglicht bessere
960 Komprimierungsraten im Vergleich zu normalen Blockgrößen wie 4KB.
961 Dateiduplikate werden dabei von SquashFS erkannt und entfernt.
963 Für SquashFS-Support benötigt man den SquashFS-Linuxkernel-Patch und das
964 Tool mksquashfs. Als ersten Schritt lädt man das SquashFS-Modul via insmod
965 bzw. modprobe. Dann überprüft man am Besten, ob der Kernel SquashFS
969 % grep squashfs /proc/filesystems
973 Nun kann man via folgendem Kommando aus dem Verzeichnis
974 /ein/verzeichnis die SquashFS-Datei test.sqsh erzeugen:
977 % mksquashfs /ein/verzeichnis test.sqsh
979 % mksquashfs /Grml/grml\_uncompressed /Grml/grml\_cd/GRML/GRML -noappend
981 Die Datei test.sqsh ist vom Speicherbedarf her nun wesentlich kleiner als
982 das Verzeichnis /ein/verzeichnis. Diese Technik macht es möglich, dass bei
983 grml rund 2.1 GB auf einen 700 MB-Rohling passen. Um diese SquashFS-Datei
984 nun zu nutzen bindet man sie in das Dateisystem wie folgt ein:
987 % mount test.sqsh /mnt/test -t squashfs -o loop
990 Weitere Informationen zu SquashFS findet man auf der \cite{squashfs} sowie
991 im \cite{squashfshowto}.
995 'Typischerweise besteht ein komplettes Linux-System aus mehreren Tausend
996 bis hin zu einigen Millionen Dateien, die zum Speichern von Programmen,
997 Daten und allen Arten von Informationen verwendet werden. Bekanntlich
998 werden hierarchische Verzeichnisstrukturen verwendet, um Dateien zu
999 katalogisieren und zu gruppieren. Es gibt verschiedene Ansätze, um die dazu
1000 notwendigen Strukturen zusammen mit den Daten permament zu
1001 speichern.'\cite{mauerer} Gängig sind hierbei Dateisysteme wie ext2/ext3,
1002 reiserfs und XFS. Klassische Dateisysteme unter Linux werden als Ganzes in
1003 eine bestehende Verzeichnisstruktur eingebunden. Die ursprünglichen Inhalte
1004 eines Verzeichnisses werden dabei ausgeblendet. Die Kombination von zwei
1005 Dateisystemen ist also nicht einfach möglich. Um dies trotzdem zu
1006 ermöglichen, gibt es so genannte transluzente Dateisysteme.
1008 'Ein transluzentes Dateisystem baut auf zwei anderen Dateisystemen auf und
1009 vereinigt deren Inhalte in besonderer Form: Auf das erste der beiden
1010 unterliegenden Dateisysteme wird nur lesend zugegriffen und es dient als
1011 Basis für das transluzente Dateisystem. Das zweite Dateisystem erlaubt
1012 zusätzlich Schreibzugriffe und hat die Aufgabe neue und veränderte Dateien
1013 aufzunehmen. Ansonsten verhält sich das Letztere für den Benutzer
1014 durchsichtig daher der Name transluzent (translucent, engl: durchsichtig).' \cite{zitterell}
1016 Durch diese Technologie ist es möglich, ein read-only-Medium wie zum
1017 Beispiel eine CD-ROM mit einer RAM-Disk (Bereich in einem temporären
1018 Speicher [RAM oder Swap]) zu vereinen und virtuell schreibbar zu machen.
1019 Unionfs ist ein solches transluzentes Dateisystem und ermöglicht es, eine
1020 RAM-Disk tranparent über das Dateisystem zu legen und das System somit wie
1021 eine Festplatteninstallation nutzbar zu machen. Der Name rührt daher, dass
1022 Unionfs mehrere Verzeichnisse in einer 'unified view' (einzelnen Sicht)
1025 % Linux hält sich bei der Verwaltung der Datesisysteme an sein ''Vorbild''
1026 % Unix. ''Verwaltet werden diese vom VFS [Virtual FileSystem], das die
1027 % dateisystemspezifischen Funktionen der einzelnen Implementierungen
1028 % aufruft, um die Struktur zu füllen. Diese Funktionen sind in jeder
1029 % konkreten Implementierung enthalten.''\cite{kernelprogrammierung} Dies
1030 % ist dadurch auch bei Unionfs der Fall.
1032 Transluzente Dateisysteme können dabei in zwei verschiedenen Arten
1033 implementiert werden: durch Manipulation von Systemaufrufen oder durch die
1034 Verwendung des virtuellen Dateisystemlayers VFS des Kernels. Die Variante
1035 mit Systemaufrufen hat aber folgende Nachteile:
1038 \item Dateioperationen des Kernels werden nicht berücksichtigt
1039 \item seit Kernelversion 2.6 ist eine Manupulation der Systemaufrufe nicht
1040 mehr ohne Änderung der Kernelquellen möglich
1041 \item großer Overhead durch Überprüfen der den Systemcalls übergebenen
1042 Zeichenketten (Probleme zum Beispiel mit Symlinks)
1043 \item das Behandeln konkurrierender Prozesse ist problematisch
1044 \item Caching kaum bzw. sehr schwer möglich
1047 Aus diesem Grund setzt Unionfs auf dem VFS auf. Unionfs ist dabei nicht die
1048 einzige Implementierung eines transluzenten Dateisystems. FreeBSD bietet
1049 schon seit längerem ein sogenanntes 'union filesystem', dieses ist aber
1050 relativ schlecht dokumentiert und hat mit dem hier behandelten UnionFS
1051 nichts zu tun. Für SUN Solaris gibt es mit tfs auch ein äquivalentes
1052 Projekt. Weitere transluzente Dateisysteme sind Translucency von Bernhard
1053 Wiedemann, mini\_fo sowie cowfs als Teil der
1054 shadowfs-LD\_PRELOAD-Wrapper-Sammlung von Clifford Wolf. UnionFS ist
1055 relativ jung, aber aktuell die am weitesten fortgeschrittene Implementierung
1056 eines transluzenten Dateisystems.
1059 % Inheriting File System (IFS)
1060 % Overlay Filesystem
1063 % Stackable Filesystems
1065 % Fan Out Filesystems
1068 % cowfs ist ein LD\_PRELOAD-Wrapper der libc-Funktionen (open, fopen, creat,
1069 % mknod,...) abfängt und passend verarbeitet.
1071 % www.denx.de/PDF/Diplomarbeit-MK-1.0-net.pdf
1073 % shadowfs is a collection of various LD\_PRELOAD wrappers for adding fancy
1074 % filesystem features to a linux system.
1076 % This project builds a stackable unification file system, which can appear to
1077 % merge the contents of several directories (branches), while keeping their
1078 % physical content separate. Unionfs is useful for unified source tree management,
1079 % merged contents of split CD-ROM, merged separate software package directories,
1080 % data grids, and more. Unionfs allows any mix of read-only and read-write
1081 % branches, as well as insertion and deletion of branches anywhere in the fan-out.
1082 % To maintain unix semantics, Unionfs handles elimination of duplicates,
1083 % partial-error conditions, and more. Unionfs is part of the larger FiST project.
1085 Um Unionfs zu nutzen benötigt man das Unionfs-Kernelmodul. Via 'modprobe
1086 unionfs' lädt man das Modul. Ob das Modul wirklich geladen ist kann man
1087 via 'lsmod | grep unionfs' überprüfen. Bei grml wird Unionfs bereits in der
1088 initrd-Phase geladen, da direkt nach dem Zugriff auf die SquashFS-Datei
1089 Unionfs transparent über das Root-Dateisystem ('/') gelegt wird.
1091 Ein Beispiel, wie man aus einem readonly-Verzeichnis namens /GRML mit dem
1092 Darüberlegen eines schreibbaren Verzeichnisses (/ramdisk) mittels Unionfs
1093 ein schreibbares Verzeichnis erreichen kann:
1097 % mount -t unionfs -o dirs=/ramdisk=rw:/GRML=ro none /UNIONFS
1101 Ein weiteres Beispiel demonstriert, wie man die Verzeichnisse /dvd1 und
1102 /dvd2 gemeinsam in einem dritten Verzeichnis /mnt/allinone vereinen kann:
1106 % mount none -t unionfs /mnt -o \
1107 % dirs=/dvd1/i586=ro:/dvd2/i586=ro:/dvd1/noarch=ro:/dvd2/noarch=ro
1110 mount -t unionfs -o dirs=/dvd1:/dvd2 none /mnt/allinone
1114 Unionfs steht aktuell noch in aktiver und ständiger Entwicklung. Mit
1115 weiteren Funktionen und einer erhöhten Stabilität kann in Zukunft also
1118 % http://www.unionfs.org/
1119 % Overlay Filesystem: http://ovlfs.sourceforge.net/
1120 % http://www.fsl.cs.sunysb.edu/docs/unionfs-tr/index.html
1123 \section{Zusammenfassung}
1125 Wir haben in diesem Dokument gezeigt, dass grml eine mächtige Live-CD ist,
1126 die sowohl für Systemadministratoren als auch für Texttool-User sehr gut
1127 geeignet ist. Der Bereich der Hardwareerkennung ist ein sich ständig
1128 weiterentwickelndes Betätigungsfeld. Neuartige Technologien müssen
1129 sorgfältig überprüft, getestet und in bestehende Systeme eingefügt werden.
1130 Nur dann ist ein stabiler und zufriedenstellender Betrieb möglich.
1132 Feedback, Ergänzungen und Korrekturen zu diesem Dokument werden vom Autor
1133 gerne entgegen genommen! \href{http://grml.org/contact/}{grml.org/contact/}
1136 \begin{thebibliography}{5}
1137 % Kapitel~\ref{key} + in Kapitel~\ref{key} auf Seite~\pageref{key}
1138 % \bibitem[Beck, Böhme, Dziadzka, Kunitz, Magnus, Schröter 2001]{kernelprogrammierung} Michael Beck, Harald Böhme, Mriko Dziadzka, Ulrich Kunitz, Robert Magnus, Claus SChröter, Dirk Verworner: ``Linux Kernelprogrammierung``; Addison-Wesley Verlag, München (2001)
1139 \bibitem[Rankin 2005]{knoppixhacks} Kyle Rankin: ``KNOPPIX HACKS``; O'Reilly Media Inc., Gravenstein Highway North (2005)
1140 \bibitem[Mauerer 2004]{mauerer} Wolfgang Mauerer: ``Linux Kernelarchitektur``; Carl Hanser Verlag, München/Wien (2004)
1141 \bibitem[Peikari, Chuvakin 2004]{kennedeinenfeind} Cyrus Peikari und Anton Chuvakin: ``Kenne deinen Feind``; O'Reilly Verlag GmbH \& Co. KG, Köln (2004)
1142 \bibitem[O'Reilly \& Associates 2005]{opensource} O'Reilly \& Associates: ``Open Source - kurz \& gut``; O'Reilly Verlag GmbH \& Co. KG, Köln (1999)
1143 \bibitem[Zilm, Günther 2004]{bash} Thorsten Zilm und Karsten Günther: ``Bash ge-packt``; mitp-Verlag, Bonn (2004)
1144 \bibitem[Geschonneck 2004]{geschonneck} Alexander Geschonneck: ``Computer Forensik``; dpunkt.verlag GmbH, Heidelberg (2004)
1145 \bibitem[APT-Howto]{apthowto}\url{http://www.debian.org/doc/manuals/apt-howto/index.de.html} (25.08.2005, Debian)
1146 \bibitem[Debian-Homepage: About Debian]{aboutdebian}\url{http://www.debian.org/intro/about} (01.06.2005, Debian)
1147 \bibitem[D-BUS]{dbus}\url{http://hal.freedesktop.org/wiki/Software_2fdbus} (26.04.2005, freedesktop.org)
1148 \bibitem[Discover-Homepage]{discover}\url{http://componentizedlinux.org/discover/documentation/guide.html} (25.08.2005, Progeny)
1149 %\bibitem[grml-Betatester 2005]{grmlbetatester}\url{http://grml.org/beta-tester/} (25.08.2005, grml)
1150 \bibitem[FAQ]{grmlfaq}\url{http://grml.org/faq/} (25.08.2005, grml)
1151 \bibitem[grml2hd-Webseite]{grml2hd}\url{http://grml.org/grml2hd/} (25.08.2005, grml)
1152 \bibitem[grml2usb]{grml2usb}\url{http://grml.org/files/scripts/grml2usb} (25.08.2005, grml)
1153 \bibitem[grml-Devel-Weblog]{grmldevblog}\url{http://grml.supersized.org/} (25.08.2005, grml)
1154 %\bibitem[grml IRC 2005]{grmlirc}\url{http://grml.org/irc/} (25.08.2005, grml)
1155 \bibitem[grml-Kernel]{grmlkernel}\url{http://grml.org/kernel/} (25.08.2005, grml)
1156 \bibitem[grml-Mailingliste]{grmlml}\url{http://grml.org/mailinglist/} (25.08.2005, grml)
1157 \bibitem[grml-Webseite]{grml}\url{http://grml.org/} (25.08.2005, grml)
1158 \bibitem[grml-Wiki]{grmlwiki}\url{http://wiki.grml.org/} (25.08.2005, grml)
1159 \bibitem[grml-Roadmap]{grmlroadmap}\url{http://grml.org/roadmap/} (25.08.2005, grml)
1160 \bibitem[grml-RSS-Feed]{grmlrss}\url{http://grml.org/index.rss} (25.08.2005, grml)
1161 %\bibitem[grml-Support 2005]{grmlsupport}\url{http://grml.org/support/} (25.08.2005, grml)
1162 \bibitem[grml-zsh-Webseite]{grmlzsh}\url{http:/grml.org/zsh/} (25.08.2005, grml)
1163 \bibitem[grml-terminalserver-Webseite]{grmlterminalserver}\url{http:/grml.org/terminalserver/} (25.08.2005, grml)
1164 \bibitem[Posting von Marc Haber in dcoulm]{groupsgooglehaber}\url{http://groups.google.at/group/de.comp.os.unix.linux.misc/msg/5220e8d133791129} (15.05.2005)
1165 \bibitem[HAL]{hal}\url{http://hal.freedesktop.org/wiki/Software_2fhal} (25.08.2005, freedesktop.org)
1166 \bibitem[hotplug-Webseite]{hotplug}\url{http://linux-hotplug.sourceforge.net/} (25.08.2005, linux-hotplug)
1167 \bibitem[hotplug-perl-Webseite]{hotplug-perl}\url{http://opensource.idealcorp.com/hotplug-perl/} (25.08.2005, I.D.E.A.L. Technology Corporation)
1168 \bibitem[hotplug-ng-Webseite]{hotplug-ng}\url{http://kernel.org/pub/linux/utils/kernel/hotplug/} (25.08.2005, kernel.org)
1169 \bibitem[initramfs]{initramfs}\url{http://lwn.net/Articles/14776/} (09.06.2005, LWN.net)
1170 %\bibitem[initramfs-ubuntu 2005]{initramfs-ubuntu}\url{http://www.ubuntulinux.org/wiki/Initramfs} (09.06.2005, Canonical Ltd.)
1171 \bibitem[isolinux-Homepage]{isolinux}\url{http://syslinux.zytor.com/iso.php} (25.08.2005, H. Peter Anvin)
1172 \bibitem[kernel.org]{kernel}\url{http://kernel.org/} (25.08.2005, kernel.org)
1173 \bibitem[LANANA-Liste]{lanana}\url{http://www.lanana.org/docs/device-list/devices.txt} (25.08.2005, The Linux Assigned Names And Numbers Authority)
1174 \bibitem[SquashFS-HowTo]{squashfshowto}\url{http://www.artemio.net/projects/linuxdoc/squashfs/SquashFS-HOWTO.html} (25.03.2005, Artemiy I. Pavlov)
1175 \bibitem[squashfs-Webseite]{squashfs}\url{http://squashfs.sourceforge.net/} (25.08.2005, squashfs.sourceforge.net)
1176 \bibitem[Wikipedia: Live-CD]{wikicd}\url{http://de.wikipedia.org/wiki/Live-CD} (22.05.2005, Wikipedia)
1177 \bibitem[Wikipedia: PXE]{wikipxe}\url{http://de.wikipedia.org/wiki/Preboot_Execution_Environment} (25.08.2005, Wikipedia)
1178 \bibitem[Wikipedia: LSB]{wikilsb}\url{http://de.wikipedia.org/wiki/Linux_Standard_Base} (25.08.2005, Wikipedia)
1179 \bibitem[Wiki]{wiki}\url{http://de.wikipedia.org/wiki/Wiki} (28.08.2005, Wikipedia)
1180 \bibitem[Zitterell 2005]{zitterell}\url{http://www.ks.uni-freiburg.de/download/studienarbeit/WS04/01-05-Studienarbeit-ThZitterell.pdf} (Jänner 2005)
1181 \bibitem[zsh-Webseite]{zsh}\url{http:/www.zsh.org/} (25.08.2005)
1182 \bibitem[zsh-Userguide]{zshuserguide}\url{http://zsh.sunsite.dk/Guide/zshguide.html} (02.06.1999)
1183 \end{thebibliography}
1185 \section{Revisisionen dieses Dokumentes}
1188 Wed Sep 14 22:55:29 CEST 2005: einige Stilverbesserungen,
1189 Rechtschreibkorrekturen nach Hinweis durch Nico Golde\newline
1190 Tue Sep 13 12:06:57 CEST 2005: Rechtschreibfehler korrigiert,
1191 Textvorhebungen und Verweis auf grml-zsh-Referenzkarte nach Hinweis durch
1192 Marcel Cedric\newline
1193 Mon Sep 12 01:16:48 CEST 2005: Zwei Rechtschreibfehler nach Hinweis durch
1194 Ronny Plattner beseitigt\newline
1195 Thu Sep 01 11:12:41 CEST 2005: Veröffentlichung der 1. Revision
1199 % ######################## END OF FILE ####################################