https://linupedia.org/wiki/mediawiki/api.php?action=feedcontributions&user=Robi&feedformat=atomLinupedia.org - Benutzerbeiträge [de]2024-03-29T13:25:38ZBenutzerbeiträgeMediaWiki 1.31.0https://linupedia.org/wiki/mediawiki/index.php?title=Zugriffsrechte&diff=33111Zugriffsrechte2022-02-24T20:12:25Z<p>Robi: Kontrolle und Korrektur Links</p>
<hr />
<div>Die Zugriffsrechte unter Linux/Unix sind im Grunde recht einfach aufgebaut. Einfach heißt hier aber auf keinen Fall wenig wirkungsvoll und wenig variabel. Der prinzipielle Aufbau und die Anwendung der Zugriffsrechte auf Dateien gehört zum absolutem Grundwissen für alle, die sich mit Linux beschäftigen und sollte daher im Schlaf beherrscht werden. Zugriffsrechte besitzen aber nicht nur Dateien, sondern auch Prozesse. Die Zugriffsrechte der Prozesse sind vom Grundprinzip ähnlich, wenn auch in der Gesamtheit etwas komplizierter aufgebaut, wie die Zugriffsrechte auf Dateien. <br />
<br />
<br />
== Aufbau der Zugriffsrechten für Dateien ==<br />
<br />
Jede einzelne Datei in einem Linux oder UNIX-System - also nicht nur normale Dateien sondern auch Verzeichnisse, Gerätedateien, Pipes und Sockets besitzen in ihrer [[Inode]] neben der Kennung zum Dateitype und verschiedene [[Zeitstempel von Dateien|Zeitstempel]] auch zwingend die Einträge über die [[Besitzverhältnisse]] und Zugriffsrechte auf die Datei. Die Eigentumsverhältisse einer Datei sind spezifiziert in genau einem Eigentümer und genau einer Benutzergruppe. Die Zugriffsrechte sind 3 teilig gestaffelt und beziehen sich auf <br />
* Eigentümer (User) genau dieser Datei<br />
* Gruppenmitglieder (Gruppe) Angehörige der Gruppe genau dieser Datei<br />
* alle Anderen die nicht User oder Gruppe sind also auf den Rest der Welt (Andere)<br />
<br />
User haben genau eine Primäre Gruppe, können aber zusätzlich noch mehreren Sekundären Gruppen angehören. Für die Gruppen-Zugriffsrechte auf die Dateien ist es nicht von Bedeutung ob der User primär oder sekundär über die Gruppenrechte verfügt. <br />
<br />
<br />
Der Befehl ls -l Dateiname zeigt für jede einzelne Datei die Angaben über Besitz und Zugriffsrechte<br />
<pre><br />
-rw-rw-r-- 1 otto wiki 1916 Jul 29 2006 ftp.wiki<br />
</pre><br />
<br />
Das erste Zeichen der Ausgabe der Zugriffsrechte mittels ls zeigt, um was für eine Datei es sich handelt. Folgende Dateiarten sind definiert:<br />
<br />
'''-''' Reguläre (normale) Datei<br />
'''d''' Verzeichnis (directory)<br />
'''l''' Symbolischer Link (symlink)<br />
'''b''' Blockorientierte Gerätedatei (block device)<br />
'''c''' Zeichenorientierte Gerätedatei (character device)<br />
'''p''' Feste Programmverbindung (named pipe)<br />
'''s''' Netzwerk Kommunikationsendpunkt (socket)<br />
<br />
Dem ersten Zeichen folgende 9 Zeichen sind die genaue Beschreibung der Zugriffsrechte. <br />
* die ersten drei Zeichen beschreiben die Rechte des '''Eigentümers''' der Datei<br />
* die nächsten drei die Rechte eines Gruppenmitglieds der '''Gruppe''' <br />
* die letzten drei die Rechte '''aller Anderen''' <br />
<br />
Für diese drei Kategorien (User, Gruppe, Andere) existiert jeweils die Angabe über die Berechtigung zum<br />
* lesen (read -> '''r''')<br />
* schreiben (Write -> '''w''' )<br />
* ausführen (execute -> '''x''')<br />
<br />
<br />
Das obrige Beispiel bedeutet also:<br />
<font color="red"><b>-</b></font><font color="grey">rw-rw-r--</font> die Datei ftp.wiki ist eine normale Datei <br />
<font color="red"><b>otto</b></font> der Eigentümer ist User otto<br />
<font color="red"><b>wiki</b></font> die Gruppe ist wiki<br />
<font color="grey">-</font><font color="red"><b>rw-</b></font><font color="grey">rw-r--</font> User otto darf diese Datei lesen und schreiben<br />
<font color="grey">-rw-</font><font color="red"><b>rw-</b></font><font color="grey">r--</font> User die der Gruppe wiki angehören dürfen die Datei lesen und schreiben<br />
<font color="grey">-rw-rw-</font><font color="red"><b>r--</b></font> Alle anderen dürfen diese Datei nur lesen<br />
<br />
<br />
=== Oktale Zuweisung der Zugriffsrechte ===<br />
<br />
Diese Rechte können numerisch (oktal) dargestellt werden. Dazu werden die Rechte wie folgt bezeichnet:<br />
<br />
{|style="height:50px" border="1"<br />
|+ '''Oktale Zuordnung der Zugriffsrechte''' <br />
! style="width:150px" colspan="3" align="center"| User <br />
! style="width:150px" colspan="3" align="center"| Gruppe <br />
! style="width:150px" colspan="3" align="center"| Rest<br />
|-align="center"<br />
| r || w || x || r || w || x || r || w || x <br />
|-align="center"<br />
| 4 || 2 || 1 || 4 || 2 || 0 || 4 || 0 || 0 <br />
|}<br />
<br />
Die Nummern werden für jede der drei Kategorien einzeln addiert. Ein Zugriffsrecht von '''rwxrw-r--''' wäre so also numerisch darstellbar als '''764'''. <br />
* die '''7''' errechnet sich aus dem r (4) + w (2) + x (1) des Eigentümers<br />
* die '''6''' aus dem r (4) + w (2) + - (0) für die Gruppenmitglieder<br />
* die '''4''' stammt vom r (4) + 0 + 0 für den Rest der Welt<br />
<br />
Für alle, die noch etwas unsicher sind und gerne mal etwas mit den Zugriffsrechten üben möchten, [https://wiki.selfhtml.org/wiki/Helferlein#Unix-Dateirechte-Setzer_.28chmod.29 ein interaktives Helferlein] zum spielen.<br />
<br />
== Interpretation der Zugriffsrechte ==<br />
<br />
=== normale Dateien ===<br />
<br />
Für normale (reguläre) Dateien sind diese Rechte recht einfach zu interpretieren. <br />
* '''Leserecht''' bedeutet, der Inhalt der Datei kann gelesen und damit zB auch durchsucht werden.<br />
* '''Schreibrecht''' bedeutet, daß der Inhalt der Datei darf verändert werden. Somit kann zB eine Datei erweitert und verändert aber auch eine Datei auf Länge Null, also Leer geändert werden (Inhalt gelöscht) <br />
* '''Ausführungsrecht''' bedeutet, diese Datei kann, sollte es sich um ein Script oder ein executabel Binär Programm handeln, ausgeführt werden, dazu ist jedoch bei Scripten zusätzlich noch Leserecht erforderlich. (Leserecht wird normalerweise auch für ausführbare Binärprogramme gewährt, damit kann dann jeder User zB. mit dem Befehl '''file''' feststellen, um welchen Dateitype es sich handelt oder mit '''ldd''' welche shared [[Library]]s zur Ausführung benötigt werden)<br />
<br />
<br />
=== Verzeichnisse ===<br />
<br />
Bei Verzeichnissen ist es besonders für den Linuxneuling schwieriger zu verstehen. Die andere Interpretation ist begründet im Aufbau der Verzeichnisdateien, die im Grunde genommen nur normale Textdateien sind, in denen in einer Art Tabelle jeweils ein Dateiname einer Inode zugeordnet ist. Bei Verzeichnissen bedeutet:<br />
* '''Leserecht''', der Inhalt dieses Verzeichnisses darf aufgelistet werden, (also die Dateinamen dürfen gelesen werden)<br />
* '''Schreibrecht''', Dateien dürfen im Verzeichnis angelegt, umbenannt und gelöscht werden, (Dateinamen dürfen verändert werden)<br />
* '''Ausführungsrecht''', in das Verzeichnis darf gewechselt (betreten) werden<br />
<br />
Will man in ein durch einen Pfad angegebenes Verzeichnis wechseln, so muss man das Ausführungsrecht für alle Verzeichnisse innerhalb dieses Pfades besitzen. Ist das Ausführungsrecht nicht gegeben, kann in diesem Verzeichniss auch keine Zuordnung von Dateinamen zur Inode erfolgen und somit auch kein Lesen, Schreiben oder Ausführen der Dateien in diesem Verzeichniss erfolgen, egal wie die Zugriffsrechte der dortigen Dateien gesetzt ist. Ähnliches gilt für fehlendes Leserecht im Verzeichniss, ist es nicht gesetzt kommt man eventuell über das Ausführungsrecht in das Verzeichniss, kann dort aber die Dateinamen nicht auflösen. Auch ein '''find''' Befehl würde hier mit einer Fehlermeldung abgewiesen. Allerdings wenn man dort den Namen eines Verzeichnisses kennt ''(mit '''ls''' anzeigen geht ja nicht)'' kann man in dieses Verzeichniss wechseln, sofern dort die Ausführungsrechte gesetzt sind und auch auf Dateien unterhalb dieses Verzeichnisses hat man wieder vollen Zugriff entsprechend der gesetzten Zugriffsrechte der Dateien. Man kann also so ganze Dateibäume vor neugierigen Blicken verstecken, ohne den Zugang zu bekannten Dateien innerhalb dieses Dateibaumes zu verbauen. ''(Linuxneulingen ist aber dringend anzuraten auf solche Methoden bei Verzeichnissen zu verzichten, wenn sie nicht wirklich sicher sind, welche weiteren Nebenwirkungen zB auf ein Backup damit verbunden sind)'' <br />
<br />
Dieses zeigt, die Zugriffsrechte der Verzeichnisse sind ebenso wichtig, wie die Zugriffsrechte auf die Dateien selbst. ZB kann wer Schreibrechte in einem Verzeichnis hat, dort auch jede Datei löschen, auch wenn er für diese Dateien sonst überhaupt keine Rechte hat. Wer aber nur das Schreibrecht auf eine Datei hat, aber kein Schreibrecht im Verzeichniss, kann zwar in einer Datei Zeilen oder den gesammten Inhalt löschen, den Dateinamen mit dessen Bezug auf die Inode allerdings nicht. <br />
Eine besondere Bedeutung erlangen die Zugriffsrechten von [[Mountpoint]]s. Hiermit können je nach Mountoption und Filesystemtype Eigenschaften für ein ganzes Filesystem beeinflußt werden.<br />
<br />
<br />
=== Symbolische Links ===<br />
<br />
Symbolische Links haben immer alle Zugriffsrechte gesetzt, also numerisch 777 und dieses läßt sich auch nicht ändern. Der Zugriff auf Dateien die so verlinkt sind wird damit einzig durch die Zugriffsrechte der eigentlichen Datei bestimmt.<br />
<br />
<br />
=== Hard Links ===<br />
<br />
Da Hard Links logisch gesehen nur ein weiterer Name für ein und die selbe Inode sind, die Zugriffsrechte jedoch in der Inode gespeichert sind, können Hardlinks niemals unterschiedliche Besitz oder Zugriffsrechte haben.<br />
<br />
<br />
<br />
== Spezielle Rechte ==<br />
<br />
Neben diesen 3x3 Rechten existieren noch drei weitere, die sich numerisch als eine weitere (führende) Octalziffer darstellt. Dabei handelt es sich um das '''Set UserID Bit''' (4), das '''Set GroupID Bit''' (2) und das '''Sticky Bit''' (1).<br />
<br />
<br />
=== Set UserID Bit (SUID) === <br />
<br />
Dieses Recht gilt ausschließlich für ausführbare Dateien. (in modernen Linuxsystemen nicht für Scripte) Hat eine ausführbare Datei dieses Recht gesetzt, so erscheint in der Darstellung durch das ls -l Kommando statt dem '''x''' beim Eigentümerrecht ein '''s'''. Wird dieses Programm von einem User ausgeführt, bekommt der Prozess die effektive UserID des Users, dem die Datei gehört und nicht wie normal die UserID des Users der das Programm ausführt. Sollte diese Recht gesetzt werden, ohne das auch das Ausführungsrecht des Eigentümers gesetzt ist, erscheint hier ein '''S''', dieses deutet auf logisch unvollständig gesetzte Ausführungsrechte hin.<br />
<br />
Das klassische Beispiel: das Programm /usr/bin/passwd hat die Aufgabe, daß auch normale User damit ihr eigenes Passwort ändern können. Dieses Passwort befindet sich jedoch in einer Datei, die nur von root selbst beschrieben werden darf. Nun hat das Programm /usr/bin/passwd , deren Eigentümer root ist, das Set UserID Bit gesetzt. Jeder User, der dieses Programm ausführt tut dies jetzt also unter der effektiven UserID von root und hat daher die Rechte von root mit diesem einem Prozess. Das ermöglicht es dem Prozess, das Passwort auch zu wirklich zu ändern.<br />
<br />
Das ist beim Passwort-Programm nicht problematisch, jedoch können mit diesem Zugriffsrecht richtige Sicherheitslücken entstehen, wenn zB eine Shell mit diesem Bit ausgestattet würde und der Eigentümer root ist, hätte jeder User mit dieser Shell uneingeschränktes Rootrecht. Es gehört zu den Aufgaben des Systemadministrators das System regelmäßig nach derart riskant gesetzten SUID-Bits oder riskanten Kombinationen mit Schreibrechten auf diese Dateien zu durchsuchen.<br />
<br />
=== Set GroupID Bit (SGID) ===<br />
<br />
==== bei normalen ausführbaren Dateien ====<br />
<br />
Dieses Recht gilt einerseits für ausführbare Dateien und andererseits für Verzeichnisse. Hat ein ausführbares Programm dieses Recht gesetzt, so gilt das Gleiche, wie beim Set UserID Bit, diesmal betrifft es aber die effektive Gruppenmitgleidschaft des Prozesses. Der Prozess bekommt während der Laufzeit die effektive GruppenID der Gruppe, der dieses Programm zugeordnet ist, anstatt seiner eigentlichen GruppenID. Er hat also die Rechte eines Gruppenmitglieds dieser Gruppe, auch wenn er selbst nicht Mitglied in dieser Gruppe ist. Statt dem '''x''' beim Gruppenrecht stellt das ls -l Kommando hier ein '''s''' dar. Es gilt ebenfalls, sollte das Ausführungsrecht der Gruppe nicht gesetzt sein, erscheint ein '''S''' und deutet auf logisch unvollständig gesetzte Berechtigungen hin. Auch diese SGID-Bit sollte im Linux-System unter regelmäßiger Beobachtung des Administrators stehen. Dazu kann man zB. regelmäßig den folgenden Befehl abgeben. Dieser sucht das gesamte System nach solchen Dateien ab und schreibt die Namen in eine Logdatei mit Datumskennung unterhalb des Homeverzeichnisses von root. Diese kann man dann mittels '''diff''' auf Veränderungen zur letzen Logdatei prüfen. Differenzen sollte man dann auf Plausibilität überprüfen.<br />
find / -type f \( -perm -02000 -o -perm -04000 \) -print > ~root/SUID_SGID.log`date +"%d%m%y"`<br />
<br />
<br />
==== bei Verzeichnissen ==== <br />
<br />
Ist dieses Recht auf ein Verzeichnis gesetzt, bewirkt es etwas ganz anders. Legt ein User, der Schreibrecht auf ein Verzeichnis hat, in diesem Verzeichnis eine neue Datei an, so erhält diese Datei im Normalfall immer die Gruppenmitgliedschaft der primären Gruppe dieses Users, der sie angelegt hat. Wenn jedoch zB mehrere User an einem gemeinsamen Projekt arbeiten aber unterschiedliche primären Gruppen angehören, ist das sehr unpraktisch, da der Zugriff auf die gemeinsamen Dateien dann über "Rest der Welt" geregelt werden müssten. Wird auf ein solches Verzeichnis jedoch dieses SGID gesetzt, dann erhält eine neu angelegte Datei immer die Gruppenzugehörigkeit des Verzeichnisses, unabhängig von der Gruppenzugehörigkeit des Users, der diese Datei anlegt. Mit diesem Mechanismus sind also Arbeitsverzeichnisse für bestimmte Projektgruppen realisierbar. Diese Eigenschaft gilt rekursiv auch für die Unterverzeichnisse, soweit dort nichts anderes konfiguriert ist.<br />
<br />
<br />
<br />
=== Sticky Bit ===<br />
<br />
Das Sticky Bit hat nur noch eine Bedeutung für Verzeichnisse. (In frühen Linuxversionen gab es auch Funktionen für normale Dateien mit Sticky Bit die dann spezielle Behandlung solcher Dateien bewirkte, die aber in heutigen Systemen mehr hinderlich als nützlich wäre). Weiter oben wurde schon ein Problem erwähnt, daß ein User, mit Schreibrecht auf ein Verzeichnis, auch Dateien löschen kann, auf die er sonst keine Rechte hat. Hier setzt jetzt dieses Sticky Bit an und verhindert genau das. In einem Verzeichnis in dem dieses Bit gesetzt ist, kann nur der Besitzer dieser Datei und natürlich Root diese Datei löschen. Auch dieses Bit wirkt rekursiv auf alle Unterverzeichnisse. Das Sticky Bit kann nur von Root gesetzt werden und wird bei ''ls -l'' als '''t''' anstatt des '''x''' beim Rest der Welt angezeigt. Ein logisch unvollständig gesetztes Bit wird als '''T''' angezeigt.<br />
<br />
In einem Verzeichnis, in dem jeder User Schreibrecht haben muß oder soll, wie etwa /tmp , sollte unbedingt dieses Bit gesetzt werden.<br />
<br />
=== Oktale Zuweisung der speziellen Zugriffsrechte ===<br />
<br />
Um die speziellen Rechte auch numerisch darzustellen, wird vor den oben genannten "normalen" Rechten noch eine vierte Oktalziffer am Anfang angefügt, so daß sich das folgende Logik ergibt:<br />
<br />
{|style="height:50px; background:silver" border="1" <br />
|+ '''Oktale Zuordnung der Zugriffs- und Sonderrechte'''<br />
! style="width:150px; background:yellow" colspan="3" align="center"| Sonderrechte <br />
! style="width:150px" colspan="3" align="center"| User <br />
! style="width:150px" colspan="3" align="center"| Gruppe <br />
! style="width:150px" colspan="3" align="center"| Rest<br />
|-align="center"<br />
| style="background:yellow" |SUID <br />
| style="background:yellow" |SGID <br />
| style="background:yellow" |Sticky || r || w || x || r || w || x || r || w || x <br />
|-align="center"<br />
| style="background:yellow" |4<br />
| style="background:yellow" |2 <br />
| style="background:yellow" |1 || 4 || 2 || 1 || 4 || 2 || 1 || 4 || 2 || 1 <br />
|}<br />
<br />
<br />
Ein Recht von '''4755''' bedeutet demnach, das Set UserID Bit ist gesetzt (4), der Eigentümer hat Lese-, Schreib- und Ausführungsrechte (1+2+4=7), während sowohl Gruppenmitglieder, als auch der Rest der Welt nur Lese- und Ausführungsrecht (1+4=5) besitzen. Wenn ein User dieses Programm ausführt, erhält dieser Prozess während der Laufzeit die Rechte des Besitzers dieser Datei.<br />
<br />
== Befehle rund um die Zugriffsrechte ==<br />
<br />
=== chmod ===<br />
<br />
[http://www.openbsd.org/cgi-bin/man.cgi?query=chmod&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html chmod] ('''ch'''ange '''mod'''e) ist der Befehl mit dem Zugriffsrechte von Dateien und Verzeichnissen direkt geändert werden können. Das Recht zum Ändern der Zugriffsrechte hat neben Root nur der Besitzer der Datei.<br />
<br />
Die prinzipielle Anwendung ist einfach:<br />
<br />
chmod [Optionen] Modus Datei(en)<br />
<br />
Als Modus kann entweder ein numerischer (octaler), oder ein symbolischer Modus angegeben werden. Der numerische Modus entspricht dem, was im [[#Octale Zuweisung der speziellen Zugriffsrechte|letzten Abschnitt]] beschrieben wurde, er kann sowohl 3 als auch 4 stellig angegeben werden. (häufig wird er auch 5 Stellig angegeben mit einer führenden '''0''' als Kennzeichen für die Shell, daß es sich um einen Octalzahl handelt). <br />
<br />
Ein typisches Beispiel für den Aufruf<br />
<br />
chmod 644 foo.txt<br />
<br />
würde der Datei foo.txt ein Zugriffsrecht von '''rw-r--r--''' geben. Mit numerischem Modus wird grundsätzlich immer ein absoluter Wert gesetzt, unabhängig, welche Rechte vorher auf die Datei gesetzt waren.<br />
<br />
<br />
Der symbolische Modus ist mehrteilig und besteht aus einer Angabe<br />
* für wen die Rechte geändert werden sollen Form von Buchstaben<br />
* einem Zuweisungszeichen mit dem bestimmt wird, wie sich die neuen Rechte logisch aus den ursprünglichen und den innerhalb des Befehl verwendeten zusammensetzen sollen<br />
* und der Rechte die gesetzt oder geändert werden sollen auch in Buchstaben. <br />
<br />
Die grundsätzliche Form ist:<br />
<br />
<font color="red">[ugoa]+|-|=[rwxstugo],...</font><br />
<br />
Das führende Zeichen steht für die zu verändernde Kategorie, <br />
* '''u''' steht für User (Eigentümer)<br />
* '''g''' für group (Gruppenmitglied)<br />
* '''o''' für other (Andere)<br />
* '''a''' steht für all (Alle) Wird dieses führende Zeichen weggelassen, dann wird '''a''' angenommen.<br />
<br />
Es können auch mehrere führende Zeichen kombiniert werden. zB. '''ug''' würde interpretiert als Änderen der Rechte von User und Gruppe.<br />
<br />
'''Vorsicht:''' ''häufiger Fehler die interpretation von '''o''' mit dem Begriff Owner (Eigentümer). Das kann fatale Folgen haben, weil man dann die Rechte, die man eigentlich dem Eigentümer geben will, dem Rest der Welt verleiht!''<br />
<br />
<br />
Das folgende Zuweisungszeichen '''+''', '''-''' oder '''=''' beschreibt wie die Rechte den schon bestehenden Rechten <br />
* hinzugefügt '''(+)''' werden soll<br />
* davon abgezogen '''(-)''' werden soll<br />
* oder absolut '''(=)''' also genau so gesetzt werden soll<br />
<br />
Dem Zuweisungszeichen folgt die Angabe der zu setzenden (oder addierenden oder subtrahierenden) Rechte in der Form einer Zeichenkette, die aus den Buchstaben '''r,w,x,X,s,t,u,g,o''' bestehen kann. <br />
* '''r''' Read (lesen)<br />
* '''w''' Write (schreiben)<br />
* '''x''' Execute (ausführen)<br />
* '''X''' Execute (ausführen) das Recht wird nur für Verzeichnisse gesetzt, für normale Dateien nicht<br />
* '''s''' SUID und SGID je nach Stellung bei User oder Gruppe<br />
* '''t''' Sticky Bit bei Zuweisung zu Rest der Welt<br />
<br />
<br />
Folgen dieser Angabe noch ein '''u''', '''g''' oder '''o''', so bedeutet dies ein Ausschlußkriterium in Verbindung mit dem '''a''' am Anfang. Das nachgestellte '''u''', '''g''' oder '''a''' schützt so die Rechte der User, Gruppenmitglieder bzw. Anderen vor Veränderung. ''Dieses ist jedoch eine sehr unübersichtliche Schreibweise, und sollte nur in Ausnahmefällen verwendet werden.''<br />
<br />
Diese Angaben können auch mehrmals, jeweils mit Komma getrennt, in einem Befehl angewandt werden, wichtig jedoch der gesamte symbolische String darf keine Leerzeichen enthalten.<br />
<br />
Ein typischer Beispielaufruf:<br />
chmod <font color="red">u=rwx,g=rx,o-rwx</font> foo<br />
<br />
setzt für User '''rwx''' und für die Gruppe '''r-x''' und nimmt allen Anderen eventuell gesetzte Rechte. Als Ergebniss resultiert in Jedem Fall das Recht '''rwxr-x---'''. Oftmals einfacher ist hier die Benutzung der Octalwerte (hier 750)<br />
<br />
Praktisch an der symbolischen Angabe der Modi ist die Fähigkeit, bestimmte Rechte auf die bestehenden Rechte aufzuaddieren bzw. sie von den bestehenden Rechten abzuziehen. Ein einfaches +x bedeutet z.B., daß allen drei Kategorien User, Group und Other ein Ausführungsrecht zu den schon vorhandenen Rechten gegeben wird.<br />
<br />
Eine wichtige Option von chmod ist '''-R''' oder '''--recursive''', damit kann chmod die Rechte eines ganzen Verzeichnisbaumes mit nur einem Befehl ändern.<br />
<br />
<br />
<br />
=== umask ===<br />
<br />
Mit [http://www.openbsd.org/cgi-bin/man.cgi?query=umask&format=html umask] werden die Zugriffsberechtigungen für neue Dateien bestimmt. <br />
Damit wird abgefragt bzw. festgelegt, welche Zugriffsberechtigungen beim Anlegen einer Datei verwendet werden. Die Anwendung ist aber auf den ersten Blick verwirrend und etwas merkwürdig.<br />
<br />
* ''Der Befehl umask ist ein Shellbuildin, er ist also fest in die Shell eingebaut. Obwohl die prinzipielle Funktion in allen Shell gleich ist, sprechen wir hier von umask der bash.''<br />
<br />
Zum Setzen der Zugriffsberechtigung erwartet umask eine Maske als Parameter. Das Wort Maske bedeutet hier jedoch, es werden nicht die Werte des Zugriffsmodus angegeben, die gesetzt werden sollen, sondern umgekehrt, die Werte, die nicht gesetzt (maskiert) werden sollen. '''Die Maske ist der invertierte Wert der gewünschten Zugriffsrechte.'''<br />
<br />
Die einfachste Möglichkeit die Maske zu ermitteln, besteht darin, die gewünschten oktalen Werte jeweils von 7 abzuziehen.<br />
* Beispiel : es soll das Zugriffrecht rw-r----- für neue Dateien gesetzt werden.<br />
{|style="height:50px; width:33% " border="1"<br />
|+ '''Diffenz zu 777'''<br />
|- style="background:silver" align="center"<br />
| <br />
| 7 <br />
| 7 <br />
| 7 <br />
|- align="center"<br />
| Zugriffsrecht <br />
| 6 <br />
| 4 <br />
| 0 <br />
|- style="background:yellow" align="center"<br />
| Maske <br />
| 1 <br />
| 3 <br />
| 7 <br />
|}<br />
<br />
Die folgende Tabelle soll die Zusammenhänge zwischen Zugriffsrecht und Maske weiter verdeutlichen<br />
{|style="height:50px" border="1"<br />
|+ '''Berechnung umask am Beispiel'''<br />
|- style="background:silver" align="center" <br />
| colspan="10" | Zugriffsrechte<br />
|- <br />
| <br />
! style="width:150px" colspan="3" align="center"| User <br />
! style="width:150px" colspan="3" align="center"| Gruppe <br />
! style="width:150px" colspan="3" align="center"| Rest<br />
|-align="center" <br />
! symbolisch<br />
| r || w || - || r || - || - || - || - || - <br />
|-align="center" <br />
! octal einzeln <br />
| 4 || 2 || 0 || 4 || 0 || 0 || 0 || 0 || 0<br />
|- align="center" <br />
! octal <br />
| colspan="3" | 6 <br />
| colspan="3" | 4 <br />
| colspan="3" | 0<br />
|- style="background:silver" align="center" <br />
| colspan="10" | Maske<br />
|- <br />
| <br />
! style="width:150px" colspan="3" align="center"| User <br />
! style="width:150px" colspan="3" align="center"| Gruppe <br />
! style="width:150px" colspan="3" align="center"| Rest<br />
|- align="center" <br />
! octal<br />
| colspan="3" | 1 <br />
| colspan="3" | 3 <br />
| colspan="3" | 7<br />
|-align="center" <br />
! octal einzeln<br />
| 0 || 0 || 1 || 0 || 2 || 1 || 4 || 2 || 1<br />
|-align="center" <br />
! symbolisch<br />
| - || - || x || - || w || x || r || w || x <br />
|}<br />
<br />
Hier ist noch kleinen Haken, die Verzeichnisse. Würden wir diese mit dem Modus 640 erstellen, wäre für uns selbst das Durchsuchungs-/Betretungs-Recht (x) nicht gesetzt. Linux hat aus diesem Grund dafür den Mechanismus entwickelt, daß selbst wenn im umask-Kommando das x-Recht gesetzt ist, beim Erzeugen von normalen Dateien dieses Recht nicht gesetzt wird, beim Erzeugen von Verzeichnissen hingegen schon. ''( es gibt einige wenige Ausnahmen, zB Kompiler, die ja auführbare binäre Dateien erstellen, diese werden für ausführbare Dateien auch das (x) entsprechend der umask Maske richtig setzen )''<br />
<br />
Ein vernünftiges umask-Kommando setzt also zumindestens für den Eigentümer auch das (x)-Recht.<br><br />
Damit wäre ein typischer Wert für umask z.B. '''022 (rwxr-xr-x)''' oder '''027 (rwxr-x---)'''.<br />
<br />
Neben der octalen Form gibt es aber auch die symbolische Form, die die Rechte direkt bezeichnet, also nicht invertiert.<br> Sie wird in der Form '''u=...,g=...,o=...''' eingegeben, wobei für ... immer die entsprechenden Rechte eingesetzt werden. Also würde der Befehl<br />
umask u=rwx,g=rx,o=<br />
die gleiche Wirkung haben wie<br />
umask 027<br />
<br />
Typischerweise steht eine umask-Anweisung in einer der Shell-Startdateien wie z.B. /etc/profiles oder ~/.profile. Jeder User kann somit seine Voreinstellung also auch selbst einstellen. ''Eine der wenigen Möglichkeiten, mit denen der User dem Systemverwalter ins Handwerk pfuschen kann, wenn dieser versucht, sein System sicher zu machen. Allerdings bezieht sich diese Einstellung ja dann nur auf die neu anzulegenden Dateien des jeweiligen Users.''<br />
<br />
Zum Abrufen der aktuelle gesetzten Maske für '''umask''' einfach das Komando ohne Maske oder mit der Option '''-S''' für den symbolischen Modus aufrufen.<br />
LINUX:/ # umask<br />
0022<br />
LINUX:/ # umask -S<br />
u=rwx,g=rx,o=rx<br />
<br />
<br />
<br />
=== mount ===<br />
<br />
Der [https://linux.die.net/man/8/mount mount] Befehl steht mit den Zugriffsrechten in besonderer Beziehung. Einerseits müssen über das Mounten der Filesysteme auch nicht LINUX-kompatible Zugriffssteuerungen von verschiedenen Filesystemen für Linux kompatibel gemacht werden, andererseits muss über das Mounten verhindert werden, daß zB. Programme und Zugriffsregelungen von den gemounteten Filesystemen ein Sicherheitsrisiko für das System darstellen könnten. Neben den Zugriffsrechten des [[Mountpoint]]es , spielen hier einige Optionen von mount eine besondere Bedeutung. <br />
<br />
* einige wichtige Optionen von mount in Verbindung mit Zugriffsrechten: ''selbstverständlich gibt es zu einigen Optionen auch das genaue Gegenteil, die hier allerdings nicht extra aufgeführt werden'':<br />
<br />
; ro : (read only) egal was für Zugriffsrechte auf dem gemounteten Filesystem gesetzt sind, es kann in diesem Filesystem nur gelesen werden<br />
; nodev : (no devices) eventuell auf dem Filesystem befindliche Geräteknoten werden vom System nicht unterstützt<br />
; nosuid : (no SUID) eventuell auf dem Filesystem befindliche SUID oder SGID werden ignoriert<br />
; noexec : (no execute) eventuell auf dem Filesystem befindliche ausführbare Binärdateien können nicht ausgeführt werden. <br />
<br />
<br />
* Für einige Filesystem deren Zugriffsteuerung nicht Linuxkompatibel ist gibt es noch spezielle Optionen:<br />
; uid= : setzt die UserID als Eigentümer der Dateien im Filesystem<br />
; gid= : setzt die GruppenID als Gruppe der Dateien im Filesystem<br />
; umask= : setzt die ''universal mask'' mit der die für den jeweiligen Mountpoint gesamten Dateirechte und Verzeichnisrechte vererbbar logisch ''Nicht-Und'' verknüft werden<br />
; dmask= : setzt die ''directorymask'' mit der die für den jeweiligen Mountpoint gesamten Dateirechte vererbbar logisch ''Nicht-Und'' verknüft werden<br />
; fmask= : setzt die ''filemask'' mit der die für den jeweiligen Mountpoint gesamten Verzeichnisrechte vererbbar logisch ''Nicht-Und'' verknüpft werden<br />
* Dabei werden die Masken analog zum umask-Befehl auf den jeweiligen Mountpoint und alle darunterliegenden Verzeichnise bzw. Dateien angewandt(=Vererbbarkeit von Rechten) in der Form, daß die mit chmod setzbaren Rechte einfach mit der jeweiligen Maske logisch ''Nicht-Und'' verknüpft werden. Ein Beispiel dafür ist eine Datei mit den oktalen Ausgangsberechtigungen 0700 die kombiniert mit umask=0022 nach einem chmod 1777 <Dateiname> die effektiven oktalen Dateirechte 1755 erhält.<br />
<br />
<br />
<br />
=== Zugriffsrechte beim kopieren und verschieben ===<br />
<br />
Beim Kopieren mit '''cp'' wird immer eine neue Datei erstellt, die alte Datei bleibt sowohl im Besitz wie auch mit den Orginalrechten erhalten.<br />
Die neu erzeugte Datei erhält die UserID und die GruppenID des kopierenden Users. Die normalen Zugriffsrechte werden so übernommen wie sie in den zu kopierenden Dateien gesetzt waren. Unterschiede gibt es bei den speziellen Zugriffsrechten. Während in einigen Fällen ein '''( S )''' mit übernommen wird, wird beim kopieren eines normalen Users '''( s )''' nicht übernommen, aber '''( t )''' als auch '''( T )''' dagegen schon. Bei einer Kopie als root werden auch die erweiterten Rechte komplett übernommen. ''hier ist also als root besondere Vorsicht geboten wenn Binärdateien eines Users von root mit '''cp''' kopiert werden''<br />
<br />
Beim Verschieben mit '''mv''' müssen wir prinzipell unterscheiden, wohin verschoben wird. Bleibt die Datei im selben Filesystem, dann wird sie nur umbenannt, dass bedeutet die Inode bleibt so erhalten wie sie war, sie wird nur in den Verzeichnissdateien neu zu den Dateinamen verlinkt. Damit bleiben natürlich in diesem Falle sowohl der User die Gruppe und die Zugriffsrechte, alles so wie sie waren.<br />
<br />
Etwas anders sieht es aus, wenn wir mittels '''mv''' in ein anderes Filessystem verschieben. Hier wird die Datei in dem neuem Verzeichniss neu angelegt und anschließen im altem Dateisystem gelöscht. Dabei erhält die Datei die Besitzverhältnisse der Orginaldatei nur, wenn das von root ausgeführt wird, bei einem anderem User werden die Besitzverhältnisse des Verschiebenden Users gesetzt. Die Zugriffsrechte einschließlich der speziellen Zugriffsrechte werden jedoch in jedem Falle genau so gesetzt, wie in den Orginaldateien.<br />
<br />
Daran ändert sich auch nichts wenn der verschiebende User nicht das Recht besitzt, die orginal Dateien zu löschen. In diesem Fall werden die Dateien kopiert, und die Rechte und Besitzverhältnisse gesetzt wie beim Verschieben, allerdings können die Orginaldateien nicht gelöscht werden, was auch durch Fehlermeldungen quitiert wird. Trotz dieser Fehlermeldungen wurden aber die Dateien quasi kopiert, sind jetzt also doppelt vorhanden.<br />
<br />
'''TIP:''' Es ist also durchaus keine schlechte Angewohnheit, wenn man sich angewöhnt, nach dem kopieren oder verschieben von Dateien die Eigentums und Zugriffsrechte noch einmal genauer anzuschauen.<br />
<br />
<br />
<br />
=== Zugriffsrechte bei Eigentumswechsel ===<br />
<br />
Weniger kritisch ist der Eigentumswechsel von Dateien mittels '''chown''' und '''chgrp'''. Abgesehen davon, dass dieses nur von root selbst gemacht weden kann, bleiben die Zugriffsrechte und speziellen Zugriffsrechte erhalten, und nur die UserID und GruppenID wird geändert.<br />
<br />
<br />
== Erweiterte Dateiattribute im ext2-Dateisystem ==<br />
<br />
Erweiterte Dateiattribute im EXT2-Dateisystem<br />
Dateien auf ext2/ext3-Dateisystemen besitzen neben den normalem Zugriffsattributen noch weitere. Diese Attribute werden in den zusätzlichem Flag (Wahlschalter der [[Inode|ext2-Inode]]) gespeichert. Die gesetzten Attribute können mit dem Befehl '''[https://linux.die.net/man/1/lsattr lsattr]''' angezeigt und mit '''[https://linux.die.net/man/1/chattr chattr]''' verändert (gesetzt) werden.<br />
<br />
<br />
Der Aufruf zum Verändern der Attribute erfolgt mit '''chattr +-=[ASacDdIijsTtu] DATEI'''<br><br />
* der Operator '''( + )''' bedeutet diese Attribut wird zusätzlich gesetzt<br />
* der Operator '''( - )''' bedeutet diese Attribut wird zurückgesetzt<br />
* der Operator '''( = )''' bedeutet die Attribute werden genau so gesetzt wie im Befehl angegeben<br />
<br />
<br />
<br />
Die Attribute im Überblick:<br />
<br />
{| Border="1"<br />
|+ '''Zusätzliche Dateiattribute im ext2-Dateisystem'''<br />
|-<br />
!Attribut <br />
! Erkärung<br />
|-<br />
|align="center" | A || Die '''atime''' von Dateien oder Verzeichnissen mit diesem Flag wird bei Zugriff nicht verändert. ''analog Mount-Option "noatime" bei vielen Dateisystemen .<br />
|-<br />
|align="center" |S || Dateien werden synchron geschrieben, alle Schreiboperation werden unter Umgehung des Write-Back-Caches direkt auf die Partition ausgeführt. (sync)<br />
|-<br />
|align="center" |a || Dateien mit diesem Flag können am Ende beschrieben werden, nicht jedoch beliebig überschrieben oder geändert werden. Das ist z.B. für Logfiles geeignet. ''Achtung : nicht in Verbindung mit Netzwerkdateisystemen verwenden ''<br />
|-<br />
|align="center" |c || Datei wird automatisch komprimiert auf Platte geschrieben. Der Userzugriff über das Filesystem erfolgt aber unkompimiert. <br />
|-<br />
|align="center" |D || Auf Verzeichnisse mit diesem Flag wird synchron geschrieben. Alle Schreibzugriffe werden direkt auf die Platte ausgeführt und nicht gepuffert. (dirsync)<br />
|-<br />
|align="center" |d || Dateien mit diesem Attribut werden von '''dump''' nicht gesichert.<br />
|-<br />
|align="center" |I || Statusflag mit Sonderfunktion, kann nicht mit chattr gesetzt oder gelöscht werden<br />
|-<br />
|align="center" |i || '''Immutable'''-Flag kann nur von root verändert werden. Ist es gesetzt, kann die Dateis nicht verändert werden, auch nicht von root. Root könnte natürlich das Flag auch wieder entfernen.<br />
|-<br />
|align="center" |j || Daten eines solchen Files werden durch das ext3-Journal vor Korruption geschützt, (nur wenn journaling ausgeschaltet) Darf nur von root verändert werden.<br />
|-<br />
|align="center" |s || Die Daten der Files werden beim Löschen vernichtet und nicht nur als "frei" markiert. Geeignet für sensible Daten (z.B. Passwörtfiles)<br />
|-<br />
|align="center" |T || top of directory hierarchy ''(gilt für Verzeichnisse, genaue Funktion unklar)''<br />
|-<br />
|align="center" |t || Option verhindert, daß sich eine Datei (wenn die Dateigrösse kein natürliches Vielfaches der Blockgröße ist) u.U. den letzten Block mit anderen Dateien teilen muss. ''Daß ist nur bei Dateien nötig, auf die unter Umgehung des Filesystemtreibers zugegriffen werden müßte (z.B. für /vmlinuz , wenn es durch '''lilo''' beim Bootvorgang von der Platte gelesen wird)''<br />
|-<br />
|align="center" |u || Die "undelete"able-Option sorgt dafür, dass eine Datei beim Löschen nicht wirklich gelöscht wird. Root kann die Datei bei Bedarf problemlos wiederherstellen.<br />
|-<br />
|align="center" | Z || experimental für Kompression genutzt, kann nicht mit chattr verändert werden<br />
|-<br />
|align="center" | X || experimental für Kompression genutzt, kann nicht mit chattr verändert werden<br />
|}<br />
<br />
<br />
Man sollte beachten, dass für einige experimentelle Funktionen einiger Attribute bestimmte Kernelversionen oder zusätzliche Patches im Kernel voraussetzten.<br />
<pre><br />
LINUX:/data1/test # touch test1 test2 test3 test4<br />
LINUX:/data1/test # ls -l<br />
insgesamt 8<br />
drwxr-xr-x 2 root root 4096 2006-10-24 17:44 .<br />
drwxrwxrwx 26 root root 4096 2006-10-10 21:59 ..<br />
-rw-r--r-- 1 root root 0 2006-10-24 17:44 test1<br />
-rw-r--r-- 1 root root 0 2006-10-24 17:44 test2<br />
-rw-r--r-- 1 root root 0 2006-10-24 17:44 test3<br />
-rw-r--r-- 1 root root 0 2006-10-24 17:44 test4<br />
LINUX:/data1/test # lsattr *<br />
------------- test1<br />
------------- test2<br />
------------- test3<br />
------------- test4<br />
LINUX:/data1/test # chattr +u test3<br />
LINUX:/data1/test # chattr +i test2<br />
LINUX:/data1/test # chattr +a test1<br />
LINUX:/data1/test # chattr +s test4<br />
LINUX:/data1/test # lsattr *<br />
-----a------- test1<br />
----i-------- test2<br />
-u----------- test3<br />
s------------ test4<br />
</pre><br />
<br />
<br />
<br />
== [http://de.wikipedia.org/wiki/Access_Control_List Access Control Lists] unter Linux ==<br />
<br />
Access Control Lists (Zugriffskontrolllisten), werden bei Betriebssystemen zum Kontrollieren der Zugriffsberechtigungen auf diverse Ressourcen wie Dateien und Programme, verwendet. Unter Linux unterstützen eine Reihe Dateisysteme ACLs vollständig Posix ACLs.<br />
<br />
<br />
=== Weiterführende Links zu ACL ===<br />
<br />
* [https://www.mathematik.hu-berlin.de/~ccafm/teachingBasic/allg/fs_acl-de.pdf POSIX Access Control Lists on Linux]<br />
* [https://linux.die.net/man/5/acl ACL Manpages]<br />
* [https://dewiki.de/Lexikon/Access_Control_List weitere ACS Links zB dewiki.de]<br />
<br />
<br />
<br />
== Probleme mit Zugriffsrechten in Netzwerkfilesystemen ==<br />
<br />
=== Der Mythos des x-Bits ===<br />
<br />
Was mit den normalen Unix/Linuxrechten funktioniert, das wird im Netzwerk ein Problem. <br />
ZB. die exakte Trennung zwischen den Rechten<br />
* Ausführen eines Programmes und<br />
* Lesen in dieser Datei<br />
können in Netzwerkdateisystemen so nicht durchgesetz werden, auch wenn es durch entsprechende Impementierung auf Clientseite vielleicht so scheint.<br />
<br />
'''Beispiel:''' Ein geheimes Programm auf einem Filesserver soll jeder ausführen dürfen, aber niemand soll es Lesen können. Für den Fileserver stellt das einen schlicht unlösbaren Widerspruch dar. Für ihn macht es ja gar keinen Unterschied, ob eine Datei von einem Client abgeholt wird, um sie zu lesen oder um sie auszuführen. Und selbst dann, wenn der Client eine Versicherung der Art: "''Ich will diese Datei nur ausführen, auf keine Fall lesen''" mitschickt, der Server kann die Richtigkeit dieser Angabe nur annehmen, aber nicht nachprüfen.<br />
<br />
<br />
=== Problem der Authentifizierung am Client ===<br />
<br />
Der Server des Netzwerkdateisystemes muß aber irgendwie erkennen, wer gerade versucht eine Datei von ihm abzurufen. Ansonsten, ist eine Rechteverwaltung des Dateisystems ganz sinnlos. Dazu muss sich der User in irgend einer Art ausweisen, also authentifizieren. Bei den klassischen lokalen Dateisystemen ist das einfach, der Benutzer kann sich mit der UID des jeweiligen Prozesses eindeutig zu erkennen geben. Unter dieser UID kann er nur arbeiten, wenn er sich mit seinem Passwort am Rechner angemeldet hat. Ausnahme hier vielleicht, root darf natürlich alles, der kann sich ja in jeden Benutzer verwandeln.<br />
<br />
Im Netzwerk ist eine eindeutige Authentifizierung etwas schwieriger und es wurden schon ganze Bücher damit gefüllt. Die einfachste, jedoch unsichere Methode ist die Authentifizierung am Client, wie bei NFS bis Version 3 default voreingestellt. Bei jeder Anfrage an den Server wird an den Server die UID des Benutzers auf dem Client mitgeschickt. Der Server prüft dann diese UID auf ihre Zugriffsrecht zum Beispiel für den Lesezugriff auf diese Datei und gewährt oder verweigert den Zugriff.<br />
<br />
Der Server muss dabei jedoch im gutem Glauben davon ausgehen, dass auf dem Client überhaupt erstmal Passwörter existieren und daß sich dort nicht jeder einfach mal so als root anmelden kann, um dann die ID irgend eines Users für Netzwerkzugriffe zu erlangen. Die Daten in einem solchen Netzwerk sind somit nur so sicher, wie die Clients absichert werden können. Diese Form der Netzwerksicherheit ist zwar sehr weit verbreitet, sicherheitstechnisch aber schon vollkommen überholt.<br />
<br />
<br />
=== Authentifizierung am Server ===<br />
<br />
Wenn man die Clients nicht absichern kann, dann muss man eben eine sichere Authentifizierung am Server gewähleisten. Dazu gibt es mehrere Lösungsansätze, mit unterschiedlichen Stärken und Nachteilen:<br />
<br />
# Die Verbindung zum Server wird in Form ein Sitzung vor dem ersten Zugriff aufgebaut. ''(siehe zB.: [[Zugriffrechte unter Samba]])''<br />
# mit jeder Anfrage an den Server wird ein geheimes Datenpaket mitgesendet. <br />
# Ticketbasierte Authentifikation am Server. Dabei wird vor dem ersten Zugriff z.B. das Passwort benutzt, um von einem speziellen Sicherheitsserver ein Ticket-Datenpaket (Token) zu bekommen. Diese wird bei jedem Zugriff vorgelegt. Dieses Ticket ist nur eine begrenzte Zeit (wenige Stunden) gültig. Nach Ablauf der Zeit, akzeptiert der Server das Ticket nicht mehr, und man muss sich vom Sicherheitsserver ein neues Ticket holen.<br />
<br />
<br />
=== Links zu Network Filesysteme ===<br />
<br />
* [http://de.wikipedia.org/wiki/Network_File_System Network_File_System]<br />
* [http://www.openafs.org/ OpenAFS.org]<br />
* [https://de.wikipedia.org/wiki/Network_File_System NFS]<br />
<br />
<br />
<br />
[[Category:Security]]<br />
[[Category:Konsole]]<br />
[[Category:Linux-intern]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Inode&diff=33110Inode2022-02-24T19:28:29Z<p>Robi: Kleine Überarbeitung um auf die Unterschiede in modernen FS hinzuweisen</p>
<hr />
<div>== Inode ==<br />
=== kurze Erklärung von Inode ===<br />
Die Inode sind der Dreh- und Angelpunkt sämtlicher Dateizugriffe. Ein Großteil der Arbeit des Betriebssystems ist die Umsetzung von Dateinamen in die dazugehörige Inodes. Um die Funktion einiger Befehle zu verstehen, sollte man einen groben Eindruck davon haben, wie Inodes aufgebaut sind, und welche Informationen sie beinhalten.<br><br />
Prinziell kann man sagen, die Verwaltung von Dateisysten besteht aus Verzeichnisdaten und Inodedaten und Verwaltungsstuturen die diese Daten intern verwalten. In den Verzeichnisdaten stehen die Dateinamen und dazugehörige Inodenummern. Damit wird zu einem Dateinamen eine Inode gefunden, welche dann die Eigenschaften der Datei und Verweise auf die Datenblöcke enthält. Mit hilfe diese Blockverweise sind dann die Daten der Datei zu finden. Die Verwaltungssturkturen sind in verschiedenen Dateisystemen sehr unterschiedlich und bestimmen auch maßgeblich die Eigenschaften der Dateisysteme. Einige, vor allem ältere Filesystem nutzen Tabellen, moderene oft auch [https://de.wikipedia.org/wiki/Bin%C3%A4rbaum Binäre Bäume] um Verwaltungsblöcke im Dateisystem zu organisieren. <br />
<br />
<br />
{{Box Hinweis||<br />
Inode werden in älteren Dateisystemen innerhalb von Inode-Listen geführt. Dieses trifft zB auf die ext2/3/4 Dateisysteme zu. <br />
Im weiteren Verlauf der Erklärungen beschränken wir uns auf diese Filesysteme. Moderne Dateisysteme sind intern weitaus komplexer, das Prinzip des Inodeinhalts ist aber ähnlich, auch wenn im einzelnen die Inodestrukturen komplett anders aussehen. }}<br />
<br /><br />
<br />
Inodes sind definierte Datenstrukturen, die eine Datei eindeutig beschreiben und verwalten können. In den einzelnen Filesystemen gibt es kleine Unterschiede im Aufbau der Inodestruktur. Auch ist die Verwaltung der Inode in den einzelnen Filesystemen zum Teil sehr verschieden. In einem ext2/ext3/ext4 Filesystem zum Beispiel wird bei der Erstellung die Struktur für alle Inodes im Filesystem erzeugt und im Filesystemkopf ist die genaue Anzahl der Inodes im Filesystem festgehalten. Dieses sind dann Inodetabellen in denen dann Anhand der Inodenummer schnell und eindeutig bestimmt werden kann, wo sich diese Inode im Dateisystem befinden. Die Anzahl und der Speicherort einer bestimmten Inode wird damit schon beim anlegen des Dateisystems eindeutig festgelegt.<br><br />
In Unterschied dazu zB. in einem [https://de.wikipedia.org/wiki/XFS_(Dateisystem) xfs] oder [https://de.wikipedia.org/wiki/Btrfs btrfs] werden die Inodes erst erzeugt wenn sie wirklich benötigt werden, und befinden sich auch nicht in derartig strikten Tabellen. Auch besteht ein Unterschied zwischen den Inodes die sich in den Filesystemen auf der Festplatte befinden (Disk Inode), und den Inodes die bei der Bearbeitung im Speicher von Linux (in-core inode) benutzt werden. Auf einzelnen Unterschiede können wir hier nicht näher eingehen, es geht ehr um das allgemeine Verständniss, was eine Inode ist. Als Beispiel wird hier etwas vereinfacht die Disk Inode eines ext2-Filesystems beschrieben.<br />
<br />
<br />
<br />
== Aufbau der Inode in ext2 Filesystemen ==<br />
Der Prinzipielle Aufbau eines Inode im ext2 Filesystem besteht in folgender Liste<br />
<br />
{| border="1"<br />
|+ '''schematischer Aufbau der ext2 Inode'''<br />
|-<br />
| style="width:250px" | '''Strukturelement''' <br />
| '''Erklärung'''<br />
|-<br />
| Dateimodus || definiert Dateitype und [[Zugriffsrechte]]<br />
|-<br />
| UID || userID des Besitzers der Datei<br />
|-<br />
| Dateigröße || in Byte<br />
|-<br />
| 4 Zeitstempel || letzter Zugriff, letzte Änderung, Inode Erstellung, letzte Löschung Inode<br />
|-<br />
| GUI || GruppenID der die Datei angehört<br />
|-<br />
| Links || Anzahl der Links (also Anzahl der Namen) dieser Datei<br />
|-<br />
| Flags || Wahlschalter für zusätzliche ext2 Eigenschaften<br />
|-<br />
| Datenblockadressen || Tabelle mit deren Inhalt die Addresse der Datenblöcke der Datei verwaltet werden<br />
|-<br />
| Versionsnummer || wird nur beim Anhängen über NFS verwendet<br />
|-<br />
| ACL || Verweise auf Zugriffskontrollisten<br />
|- <br />
| letztes Fragment || Adresse des letzten allokierten Teilblocks<br />
|-<br />
| Zusätzliche Teilblocke || Anzahl und Größe der zusätzliche benutzten Teilblöcke<br />
|}<br />
<br />
<br />
<br />
=== Aufbau und Funktion der Datenblockadressen ext2 und ext3===<br />
<br />
Die Tabelle der Datenblockadressen hat fünfzehn Einträge, jeder Eintrag zeigt auf einen Datenblock der die eigentlichen Daten der Datei enthält. <br />
* Die ersten 12 Einträge verweisen direkt auf die Datenblöcke<br />
* Der dreizehnte ist ein indirekter Verweis, er verweist zwar auch nur auf einen einzigen Datenblock, doch in diesem kann wiederum auf 256 Datenblöcke verlinkt werden.<br />
* Der vierzehnte Eintrag ist ein doppelt indirekter Verweis, mit seiner Hilfe könnten bis zu 256*256 Datenblöcke adressiert werden.<br />
* Der fünfzehnte Eintrag ist ein dreifach indirekter Verweis, mit seiner Hilfe könnte bis zu 256*256*256 Datenblöcke adressiert werden.<br />
<br />
<br />
<br />
<br />
Das Bild soll die Struktur der Verknüpfung der Inode in einem ext2 Filesystem mit den Datenblöcken verdeutlichen.<br />
<br />
[[Bild:Inode.gif]]<br />
<br />
== Inode bei der täglichen Arbeit mit Filesystemen ==<br />
<br />
* Bei '''ls''' wird mittels der Option '''-i''' zu den Dateinamen die Inodenummer mit ausgegeben.<br />
* Die für den Benutzer wichtigen Informationen einer Inode und damit Datei, kann man mit dem Befehl '''stat DATEINAME''' ausgeben.<br />
* Die Gesamtanzahl der Inode in den Filesystemen und die belegten- und freien Inode kann man sich mit dem Befehl '''df -i''' anzeigen lassen.<br />
* Sind in einem ext2/3/4 Filesystem keine Inode mehr frei, können keine Dateien mehr angelegt werden, auch wenn das Filesystem noch längst nicht voll ist. Solche Problem könnte mit einigen Filesystemtypen in einem Filesystem mit sehr vielen sehr kleinen Dateien auftreten, wenn nicht schon bei der Erstellung des Filesystems extra eine hohe Anzahl von Inodes in Form von Optionen angegeben wurde. Bei einem ext2/ext3 Filesystem kann man das '''bytes-per-inode ratio''' mittels der Opition '''-i''' von '''mkfs.ext2''' bestimmen. Siehe dazu auch die Manpages der '''mkfs''' Befehle.<br />
* die Anzahl der Inode, die einzelne User oder Gruppen in Filesystemen belegen dürfen, kann mit [[Disk Quota]] beschränkt werden.<br />
<br />
Die Informationen die der Befehl '''stat''' liefert:<br />
<br />
[[Image:F-stat.png]]<br />
<br />
== Weiterführende Informationen und Links ==<br />
<br />
http://www.nongnu.org/ext2-doc/ext2.html#INODE-BITMAP<br />
<br />
<br />
<br />
<br />
[[Category:Partitionen]]<br />
[[Category:Linux-intern]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Awk&diff=33107Awk2022-02-19T18:46:42Z<p>Robi: paar Links korriert, kleine Überarbeitung, hält wieder ein paar Jahre</p>
<hr />
<div>''' AWK '''-<br />
eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug<br />
<br />
<br />
== Was ist awk und was kann awk ? ==<br />
<br />
'''[http://linux.die.net/man/1/awk Awk]''' ist eine traditionelle Script-Programmiersprache und auf jedem UNIX- und Linux-System zu finden. Der Interpreter ist ein Programm namens '''awk''' ( benannt nach den geistigen Urvätern [https://en.wikipedia.org/wiki/Alfred_Aho Alfred v. '''A'''ho] ; [https://en.wikipedia.org/wiki/Peter_J._Weinberger Peter J. '''W'''einberger] und [https://en.wikipedia.org/wiki/Brian_Kernighan Brian W. '''K'''ernighan] ). Das gesamte Konzept ist für eine Batchverarbeitung ausgelegt, d.h ein awk Programm wird ohne äußeren Eingriff eines Benutzers von Anfang bis zum Ende ausgeführt. Häuptsächlich wird es zum Durchsuchen, Auswerten und Manipulieren von Daten eingesetzt. <br><br />
<br />
awk wurde in den Hauptzügen schon in den 70/80 Jahren des vorigen Jahrhunderts entwickelt und zählt zu den universellen UNIX-Standard-Werkzeugen. Es besitzt eine fest definierten Sprachumfang und läßt sich nicht wie andere Progammierspachen fast beliebig erweitern. Dafür ist es jedoch sehr portabel und heute auf vielen Plattformen zu Hause. Obwohl heute Sprachen wie Perl viele frühere Anwendungsbereiche von awk besser und schneller erledigen könnten, wird auch heute noch vielfach auf awk zurückgegriffen. Es gibt heute eine Reihe unterschiedlicher AWK-Implementierungen mit differierendem Leistungsumfang, auf Linux-Systemen ist das sehr leistungsfähige '''[http://www.gnu.org/software/gawk/ Gawk]''' der Standard. Speziell kleinere awk-Programme lassen sich gut in Shell-Skripte einbetten, was häufig genutzt wird. <br />
<br />
<br />
Das Grundprinzip von awk beruht auf der Verarbeitung einer Datei oder wenn nicht angegeben automatisch der Standardeingabe, dieser wird zeilenweise nach anwenderspezifischen Mustern durchsucht und beim Auffinden von Übereinstimmung eine dem jeweiligem Muster zugeordnete Aktion ausgeführt. Jeder Datensatz wird automatisch in Felder zerlegt, auf die man bequem zugreifen kann. Das Ergebnis wird in der Standardausgabe ausgegeben oder kann entsprechend umgeleitet werden. Die Eingabedatei wird nicht verändert. Sowohl Ein- wie auch Ausgabe wird dabei von awk als eine Folge von durch Zeilentrennzeichen separierte Zeilen (records) angesehen, die ihrerseits wieder durch Feldtrennzeichen in einzelne Felder aufgeteilt sind. Sowohl Zeilentrennzeichen (default ASCII-LF) als auch Feldtrennzeichen ( default Leerzeichen oder Tabulatorzeichen) können vom Anwender auch individuell angepasst werden. Eine Eingabezeile kann als Ganzes mit dem Bezeichner '''$0''' angesprochen werden, die einzelnen Felder der Zeile mit '''$1 , $2 , $3 .... $n'''. Besonders geeignet sind somit Dateien in Listen- oder Tabellenform oder analog die Ausgaben von Befehlen in diesem Format, und davon gibt es auf jedem Rechner jede Menge.<br />
<br />
<br />
Die Sprachelemente von awk sind denen der [http://de.wikipedia.org/wiki/C_(Programmiersprache) Programmiersprache C] nicht unähnlich. Die Möglichkeit von Konstanten und Variablen (auch als Feld und Array Elemente) die integierte Typenanpassung, die Steuerelementen z. B. in Form von Schleifen und Verzweigungen, frei definierbare und schon eingebauten Funktionen, Erweiterte Möglichkeiten der Formatierung und der Textmanipulation sowie die Integration einiger häufig benötigter mathematischer Funktionen, machen awk zu einem sehr mächtigem Tool. '''awk''' kann nicht nur mit Standard Ein-/Ausgabe sondern auch zusätzlich mit Pipes, Dateien und auch direkt mit TCP/IP und UDP/IP Verbindungen arbeiten. Damit kann es auch während der Laufzeit andere Befehle oder Scripte starten und ihnen Daten senden und oder von dort empfangen. <br />
Mit seiner Hilfe lassen sich auf einfache Weise eine Vielzahl von Problemen lösen, für die es sonst wenig andere akzeptable Lösungsmöglichkeiten im Scriptumfeld gibt. Allerdings sollte man bedenken, awk ist eine interpretierende Sprache und deshalb nicht besonders schnell in der Abarbeitung. Insbesondere bei der Bearbeitung großer Datenbestände in Punkto Geschwindigkeit ist awk gegenüber anderen kompilierbaren Sprachen und Tools, welche dann auch Multithreading konzipiert werden können, im Nachteil. Für den einmaligen oder seltenen Gebrauch solcher Programme ist jedoch oftmals eine mögliche schnellere Programmentwicklung durch awk von Vorteil. Ein Vorteil auch, es ist zB. auf Linux default installiert, benötigt keine Library und kennt keine Versionsprobleme und Abhängigkeiten, so dass man sicher sein kann, dass ein einmal sauber erstelltes Script auch auf allen anderen Rechner problemlos läuft.<br />
<br />
Kleine awk Lösungen lassen sich auf der Kommandozeile bequem mittels Pipe mit anderen Kommandos verbinden und so sowohl auf der Kommandozeile wie auch in Shellscripten sehr universell direkt benutzen. akw wird heute z. B. in der Systemverwaltung innerhalb von Scripten verwendet für die Bearbeitung von Konfigurationsdateien sowie für einmaliges oder gelegentliches komplexes Filtern, Konvertieren und Auswerten von umfangreichen Daten z. B. von Logdateien. Unterteilen kann man die Einsatzgebiete im Wesentlichen in 3 Gruppen. <br />
<br />
<br />
*; Datenauswertung und -aufbereitung:<br />
Vor allem bei Anwendungen mit Listenausgabe, dabei sind unter anderem Filteroptionen und statistische Problemstellungen, wie z. B. Berechnung oder einfach nur Summierung von Feldinhalten oder Zählung von Häufigkeiten, in Verbindung mit weiteren Auswahlkriterien möglich<br />
<br />
<br />
*; Datentransformation:<br />
Eingabedaten werden auf beliebige Weise neu gruppiert, neu formatiert oder selektiv verändert. <br />
<br />
<br />
*; Datenvalidierung:<br />
Überprüfung der Daten auf ihre syntaktische und semantische Korrektheit. Auch komplettes Neuerstellen von Konfigurationsdateien aus vom User editierten Dateien.<br />
<br />
== Der grundlegende Befehlsaufruf ==<br />
<br />
Für das Ausführens eines awk Programmes benötigen wir also einerseits den Interpreter, das ist das Programm namens awk selbst, weiterhin benötigen wir in den meisten Fällen die Datei oder den Datenstrom der bearbeitet werden soll und wir benötigen noch den awk-Programmtext. Prinzipell ist es möglich diesen Programmtext entweder in eine separaten Datei abzulegen und von dort aus darauf beim Programmaufruf zuzugreifen oder aber der Programmtext kann auch direkt auf der Komandozeile hinter dem Interpreteraufruf stehen. <br />
<br />
<br />
<br />
awk -f Programmdatei Eingabedatei<br />
; Programmtext als separate Datei :<br />
Dieser Aufruf wird meist bei umfangreichen oder universellen awk Programmen bevorzugt. Der Programmtext kann hierzu seperat in einer Datei entwickelt und genutzt werden, und muss nicht immer wieder neu auf der Komandozeile erstellt werden.<br />
<br />
<br />
<br />
awk 'Programmtext' Eingabedatei<br />
; Programmtext vor Interpretation durch die Shell geschütz direkt hinter den Programmaufruf :<br />
Diese Form ist besonders für klein und kleinste awk Programme geeignet. Im Falle eines Syntaxfehlers muss der gesamte awk Programmtext in der Komandozeile wieder neu erstellt oder eingegeben werden, das ist bei awk-Programmen die wesentlich länger als eine Zeile sind, selbst mit einer intelligenten Shell natürlich ungeschickt. Oftmals muss man auch auf hilfreiche übersichtliche Formatierung des awk Programmtextes verzichten, bei kleinsten Programmen erweist sich das nicht als Problem.<br />
<br />
<br />
<br />
Beide Aufrufmöglichkeiten lassen sich in Shellscripten verwenden. Wobei oftmals innerhalb von Shellscripten die 2. Variante bevorzugt wird, da damit das awk Programm mit dem Shellscipt gleichzeitig entwickelt werden kann und hat dann auch beides als eine übersichtliche Einheit in einer einzigen Datei. Bei universalen awk Programmtexten, die eventuell auch von mehreren Scripten aufgerufen werden können, bietet sich jedoch die erste Variante besser an.<br />
<br />
<br />
<br />
<br />
=== Die Programmstruktur ===<br />
<br />
Ein awk Programm besteht aus einer Folge von Bedingungen und Aktionen die dieser Bedingung zugeordnet sind und hat folgende allgemeine Struktur<br />
<br />
<pre><br />
BEGIN { Aktion... }<br />
Bedingung_1 { Aktion... }<br />
Bedingung_2 { Aktion... }<br />
....<br />
Bedingung_n { Aktion... }<br />
END { Aktion... }<br />
</pre><br />
<br />
<br />
* '''BEGIN''' und '''END''' sind Schlüsselworte für spezielle Bedingungen innerhalb des Programmablauf, deren Aktionen werden entweder vor oder nach der Bearbeitung der Datei ausgeführt. BEGIN oder END Aktionen sind optional, also nicht jedes awk Programm muss sie beinhalten.<br />
* Um die Bedingungen von den Aktionen unterscheiden zu können, werden die Aktionen in geschweifte Klammern '''{ }''' eingeschlossen.<br />
* Mehrere Aktionen können durch ''';''' oder durch einen Zeilentrennzeichen getrennt werden.<br />
* Bedingungungen dürfen nicht über mehrere Zeilen geschrieben werden.<br />
* ein Aktion müssen in derselben Programmzeile beginnen, in der die Bedingung steht ( "'''{'''" reicht aus ) dürfen aber über mehrere Zeilen fortgesetzt werden.<br />
* bei einer fehlenden Bedingung, wird die Aktion für jede Zeile der Eingabedatei ausgeführt.<br />
* bei einer fehlenden Aktion, wird jede zur Bedingung passenden Zeile unverändert an die Ausgabe durchgereicht.<br />
<br />
<br />
<br />
<br />
=== Der Programmablauf ===<br />
<br />
* Ist eine '''BEGIN''' Bedingung im Programm enthalten wird zuerst diese Aktion ausgeführt <br><br />
:: hier ist es zB möglich spezielle Bedingungn (zB: Feldtrennzeichen für Ein- oder Ausgabe ) für den weiteren Programmablauf festzulegen, Variablen vorzubelegen oder Ausgaben zu machen, die dann in vor den verarbeiteten Daten in der Ausgabe erscheinen <br />
<br />
* Der eigentliche Hauptprogrammablauf erfolgt in einer Doppelschleife <br><br />
:: dabei wird jeweils eine einzelne Zeile der Reihe nach auf alle programmierten Bedingungen geprüft und gegebenenfalls die dazugehörige Aktion ausgeführt. Sind alle Bedingungen für die erste Zeile abgearbeitet, wird die nächste Zeile geladen und diese wiederum auf alle Bedingungen geprüft, bis auch die letzte Zeile so abgearbeitet ist.<br />
<br />
* Ist eine '''END''' Bedingung enthalten, wird nach dem Durchlauf aller Zeilen die Aktion zur END Bedingung ausgeführt <br><br />
:: Hier können jetzt die Variablen nach dem Programmdurchlauf verarbeitet und ausgegeben werden, oder Ausgaben erfolgen, die unterhalb der verarbeiteten Daten angehängt werden.<br />
<br />
<br />
<br />
<br />
=== Die Bedingungen ===<br />
<br />
Wie oben schon beschrieben, legt eine Bedingung fest, ob für eine Zeile die dazugehörige Aktion auszuführen ist oder nicht.<br />
In awk gibt es 2 prinzipielle Möglichkeiten für Bedingungen, einmal '''[[Reguläre Ausdrücke]]''' und zum anderem '''Vergleichsausdrücke'''. Reguläre Ausdrücke müssen in Schrägstriche '''/..../''' eingeschlossen werden. Dabei kann sowohl auf den Inhalt der ganzen Zeile sowie auf deren einzelnen Felder wie auch auf die Variablen innerhalb des Programmes zugegriffen werden. Darüber hinaus ist es möglich mit logischen Verknüpfungen und Bereichen (analog etwa von - bis) zu arbeiten. Die Leistungsfähigkeit und Möglichkeiten von awk gehen hier weit über das hinaus, was andere Scriptsprachen, Tools und Programme können. An dieser Stelle nur ein paar einfache Beispiele.<br />
<pre><br />
/Kasten|Kiste/ {print $0} # alle Zeilen die das "Kasten" oder "Kisten" enthalten<br />
/^[1A]/ {print $0} # alle Zeilen die mit '1' oder 'A' beginnen<br />
/begin/,/ende/ {print $0} # alle Zeilen vom ersten "begin" bis zum ersten "ende" <br />
$2 == "System" {print $0} # alle Zeilen in denen das 2. Feld genau "System" ist<br />
$2 ~ "System" {print $0} # alle Zeilen in denen im 2. Feld "System" enthalten ist<br />
$2 !~ "System" {print $0} # alle Zeilen in denen im 2. Feld nicht "System" enthalten ist<br />
$3 >= $1+2 {print $0} # alle Zeilen in denen Feld3 Größer oder gleich (Feld1 + 2) ist<br />
NR==5 , NR==15 {print,$0} # die Zeilen 5 bis 15<br />
NR % 2 == 1 {print $0} # alle ungeraden Zeilen<br />
length > 40 {print $0} # alle Zeilen die länger als 60 Zeichen sind<br />
length($2) > 5 {print $0} # alle Zeilen deren 2.Feld größer als 5 Zeichen ist<br />
$2 !~ /[0-9]/ {print $0} # alle Zeilen deren 2.Feld keine Ziffer enthält<br />
$1 ~ /[0-9]/ && $3 !~ /t/ {print $0}# alle Zeilen wenn im Feld1 Ziffern und im Feld3 kein 't' enthalten<br />
</pre><br />
<br />
<br />
<br />
<br />
=== Die Aktion ===<br />
<br />
Mit der Aktion werden im wesentlichen 2 Dinge getätigt, zum einem werden hier die Ausgaben erstellt, und zum anderen können hier die Variablen während des Programmablaufs geändert also zB abhängig von Werten innerhalb der Zeile neu berechnet werden. Eine Aktion kann ihrerseits wieder mit Hilfe von Bedingungen oder Schleifen gesteuert werden. <br><br />
Die Ausgabe ist die wesentliche Aufgabe der Aktionen, in jedem awk Programm gibt es mindesdens eine Ausgabeaktion, denn ohne eine einzige Ausgabe würde unser awk Programm ja gar nichts machen. Die einfachste Form der Ausgabe ist die Funktion '''print''' darüber hinaus sind aber weitere sehr leistungsfähige Printfunktionen analog der [http://de.wikipedia.org/wiki/C_(Programmiersprache) Programmiersprache C] vorhanden. An dieser Stelle nur einige einfache Ausgabe-Beispiele, mit den entsprechenden Ausgaben.<br />
<pre> <br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{print $0}' <br />
1 2 3 4 5<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{print $1,$3,$5}'<br />
1 3 5<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{OFS=":";print $1,$3,$5}'<br />
1:3:5<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{print $1 $3 $5}'<br />
135<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{print "Wert3=",$3}'<br />
Wert3= 3<br />
priv0001:/tmp # echo "1 2 3 4 5" | awk '{if ($2<3) print $2 ; else print $5}'<br />
2<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{print $2, $1+5, $3*$4}'<br />
2 6 12<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{sum=0;for (i=1;i<=NF;i++)sum+=$i; print sum }'<br />
15<br />
LINUX:/tmp # echo "1 2 3 4 5" | awk '{printf "Ergebnis : %2.7f \n", $5 / $3 }'<br />
Ergebnis : 1,6666667<br />
LINUX:/tmp # echo "10 34 4 22 6" | awk '{for (i=1;i<=NF;i++){j=1;while(j<=$i){printf "%s","*";j++};print "";}}'<br />
**********<br />
**********************************<br />
****<br />
**********************<br />
******<br />
</pre><br />
<br />
eine kleine Spielerei noch zum Abschluss nur um zu verdeutlichen was mit wenigen Aktionen mit awk machbar ist.<br />
<pre><br />
awk '{for (i=1;i<=NF;i++)anzahl[$i]++} END {for (i in anzahl) print anzahl[i],i}' buch.txt <br />
</pre><br />
würde die einzelnen Worte der Datei '''buch.txt''' erfassen, statistisch zählen und im Format "Anzahl Wort" ausgeben. Ein '''sort -n''' könnte uns das dann anschließend noch sortieren <br />
<br />
<br />
<br />
<br />
<br />
== Einige einfache Beispiele mit Erläuterungen ==<br />
<br />
In den weiten des WWW gibt es genügend großartige awk-Beispiele die einzelne Funktionen sehr anschaulich oftmals sogar spektakulär belegen oder sogar die volle Leistungsfähigkeit und Genialität von awk an Hand von komplexen Programmen verdeutlichen. Jedoch oftmals sind für die Praxis wenig wirklich wiederverwendbare Elemente enthalten oder gehen in der Fülle der Informationen unter. Aus diesem Grund sehen wir uns doch einmal auf unseren Rechnern um. In vielen Scripten auf unseren Rechnern werden wir awk Befehle finden, die meisten davon sind wohl Einzeiler oder kleine kompakte Programme, genau das richtige für den Anfang. Picken wir uns doch einmal einige heraus und untersuchen sie etwas genauer.<br />
<br />
<br />
<br />
=== Beispiel 1 ===<br />
BEFEHL | awk '{print $3}' | BEFEHL<br />
Diesem sehr einfachen awk Befehlskonstrukt werden wir in vielen Scipten wiederfinden. Sie unterscheiden sich nur in der Zahl hinter dem $. <br><br />
Die Ausgabe eines Befehles wird mittels Pipe an awk übergeben. Die einfachen Hochkomma dienen hier nur dem Schutz vor der Interpretation der Shell so das unser ganzer awk Programmtext nur aus '''{print $3}''' besteht. Die Ausgabe wird anschließend wiederum an den nächsten Befehl mittels Pipe weitergereicht.<br />
<br />
'''{print $3}''' wir haben hier nur eine Aktion ohne eine einzige Bedingung, sie wird also mit jeder Zeile der Eingabedatei durchgeführt. Die Aktion bedeutet hier im Beispiel einfach nur "'''gebe für diese Zeile das Feld Nr. 3 zu Ausgabe'''". Also wir schneiden von jeder Zeile alles weg, außer Feld Nr. 3. Warum nimmt man dann nicht den Befehl '''[http://linux.die.net/man/1/cut cut]''' mit dem geht doch das auch ?<br />
<br />
Die Antwort ist sehr einfach, '''cut''' kennt nur jeweils einen einzigen Feldtrenner, '''awk''' arbeitet hier mit mehr Feldtrennern und geht damit viel intelligenter um als die sturen Regeln in '''cut'''. Wir wissen nicht was ein User beim editieren einer Datei zwischen die einzelnen Felder für Feldtrenner einbaut, ein Leerzeichen? mehrere Leerzeichen? ein Tab-Zeichen oder mehrere? oder gar Tab- und Leerzeichen gemischt? Für den User zählt hier einzig das äußere Erscheinungsbild der Datei, bei '''cut''' müssten wir hier ganz schön vorarbeiten, damit wir auch sicher genau das richtige Feld erwischen, egal was der User eingegeben hat. '''awk''' macht das im Schlaf, ein direkter Vergleich zwischen '''awk''' und '''cut''' soll das belegen.<br />
<pre><br />
# echo -e "1 2 3\t4 \t \t 5" | awk '{print $1,$2,$3,$4,$5}'<br />
1 2 3 4 5<br />
# echo -e "1 2 3\t4 \t \t 5" | cut -f 1-5<br />
1 2 3 4 5<br />
# echo -e "1 2 3\t4 \t \t 5" | cut -f 5<br />
<br />
# echo -e "1 2 3\t4 \t \t 5" | cut -f 4<br />
5<br />
# echo -e "1 2 3\t4 \t \t 5" | cut -f 3<br />
<br />
# echo -e "1 2 3\t4 \t \t 5" | cut -f 2<br />
4<br />
</pre><br />
<br />
<br />
<br />
<br />
==== Variationen ====<br />
BEFEHL | awk '" " { print $2 }' | BEFEHL<br />
hier handelt es sich um genau das selbe, nur wird hier zusätzlich noch einmal deutlich gemacht, dass hier eine leere, also keine Bedingung steht.<br />
BEFEHL | awk -F" " '{ print $8}' | BEFEHL<br />
BEFEHL | awk -F[ '{print $1}' | BEFEHL<br />
BEFEHL | awk -F. '{print $1 , $2 , $3}' | BEFEHL<br />
hier wird mit Hilfe der Option '''-F''' ein spezieller Feldtrenner für die Eingabedaten festgelegt. Im letzten Befehl wird nicht nur ein Feld ausgegeben sondern die Felder 1 2 und 3 und als Feldtrennezeichen der Ausgabe wird das Standardzeichen " " von awk verwendet. ''( '''Achtung''' wird hier '''{print $1 $2 $3}''' verwendet, dann werden die Felder ohne Trennzeichen ausgegeben) siehe auch obrige Beispiele '' <br />
VARIABLE=`BEFEHL | awk '{print $1 * 60}'`<br />
VARIABLE=`BEFEHL | awk -F: '{print $1 / $2 * $3 + 1}'`<br />
hier wird mit den Feldern vor der Ausgabe gerechnet im ersten Fall wird der 60fache Wert von Feld 1 <br><br />
und im zweiten Fall der Wert von '''Feld1 / Feld2 * Feld3 + 1''' errechnet und ausgegeben und somit in der Variable gepeichert<br />
VARIABLE=`BEFEHL | awk '{ORS=""; print $1}'`<br />
hierbei handelt es sich um eine Anpassung des Ausgabeformates, die implementierte Variable '''ORS''' in awk beinhaltet das Zeilentrennzeichen der Ausgabe, also normalerweise ''''\n''''. In diesem Falle wurde es geleert, das bedeutet in der Ausgabe dieser Aktion gibt es keinen Zeilenvorschub, die nächste Aktion würde direkt an das Ende der Ausgabe weiterschreiben.<br />
BEFEHL | awk '{OFS=";"; print $1,$3,$8}'<br />
hierbei handelt es sich ebenfalls um eine Anpassung des Ausgabeformates, nur wird hier die implementierte Variable '''OFS''' geändert, in ihr steht das Feldtrennzeichen der Ausgabe, also normalerweise ein Leerzeichen. Hier werden also für jede Zeile der Eingabe die Felder 1 3 und 8 mit einem''' ;''' getrennt ausgegeben.<br />
<br />
<br />
<br />
=== Beispiel 2 ===<br />
Befehl | awk '/Video:/ {print $4}' | BEFEHL<br />
hier haben wir jetzt neben der schon bekannten einfachen Aktion noch eine Bedingung. '''/Video:/''' <br><br />
die Schrägstriche zeigen uns es handelt sich um einen Regulären Ausdruck. Damit kommen hier für die Aktion nur die Zeilen in Betracht die irgendwo innerhalb der Zeile den Sting "'''Video:'''" enthalten. Wir haben hier also vergleichbar den Ausdruck '''| grep "Video:" | cut -f 4 |''' implementiert<br />
<br />
<br />
<br />
==== Variationen ====<br />
BEFEHL | awk -F= '/quant=/ {print $2}' | BEFEHL <br />
das kennen wir schon, es wurde nur zusätzlich noch ein anderes Feldtrennzeichen für die Eingabe definiert<br />
BEFEHL | awk '/unit/ {print sum+=$2}' | BEFEHL<br />
Diese Variante hat hier eine Neuerung für uns, es wird hier nicht der Inhalt eines Feldes selbst ausgegeben, sondern der Inhalt einer benutzerdefinierten Variable. '''sum''' <br><br />
Die Variable '''sum''' hat beim Programmstart den Wert 0 (weil nicht anders initalisiert)<br> <br />
Mit jeder Zeile in der der Suchstring "'''unit'''" enthalten ist, wird zu diesem Wert jeweils der Wert von Feld2 dazuaddiert und dann diese Summe ausgegeben.<br><br />
Bei mehreren gefundenen Zeilen mit "'''unit'''" wird unser awk Programm also eine entsprechende Zahlenreihe ausgeben, die jeweils um den Wert des Feldes2 der betreffenden Zeilen ansteigt.<br />
$hdparm -d /dev/dvd | awk '$1 == "using_dma" {print $3}' <br />
hier handelt es sich um das selbe Prinzip, nur wurde hier als Bedingung kein Regulärer Ausdruck verwendet, sondern ein Vergleichsausdruck, es wird hier geprüft ob der Inhalt von Feld 1 gleich "'''using_dma'''" entspricht, und nur in diesem Fall wird das Feld3 ausgegeben.<br />
<br />
<br />
<br />
<br />
=== Beispiel 3 ===<br />
BEFEHL | awk '{for (i=1;i<=NF;i++){print $i}}' | BEFEHL<br />
Dieser oder ein ähnlicher awk Befehl wird in einigen Scripten verwendet. Es gibt keine Bedingung also wird für jede Zeile die Aktion gestartet. ''( Die Schreibweise der for-Schleife zeigt hier auf den ersten Blick schon die Verwandschaft von '''C''' ).''<br><br />
<br />
Diese Aktion besteht aus einer FOR-Schleife in der der Wert einer Variable '''i''' mit dem Ausgangswert von '''1''' hochgezählt wird und als Abbruchkriterium der Wert von '''NF''' herangezogen wird. '''NF''' ist in awk einen integrierte Variable die jeweils die Anzahl der Felder einer Zeile enthält. Die Schleife zählt also von 1 beginnend den Wert der Variabe '''i''' hoch, solange '''i''' kleiner oder gleich der Gesamtanzahl der Felder der Zeile ist. Der Schleifenkörper (eingeschlossen in der inneren geschweiften Klammer) der dann jedesmal durchlaufen wird, enthält nur einen Befehl '''"print $i"'''. Dabei wird also bei jedem Durchlauf der Reihe nach jeweils ein Feld ausgegeben. Beim nächsten Durchlauf der Schleife das nächste usw. <br><br />
Das gesamte awk Programm macht dabei also nichts anderes, als die Felder die sich in einer Zeile befinden jeweils auf einer separaten Zeile wieder auszugeben.<br />
<br />
<br />
<br />
<br />
=== Beispiel 4 ===<br />
/sbin/lsmod | awk 'BEGIN {n = "no";} {if ($1 == "'"$module"'") n = "yes";} END {print n;}'<br />
Auch diese awk Programm kommt in der einen oder anderen Form öfter in Scripten vor. <br><br />
<br />
<br />
''('''Achtung:''' hier wird ein kleiner Tick eingesetzt, den man erst bei näherem Hinsehen erkennt:''<br><br />
'''<font color="green">awk</font> ' <font color="red">BEGIN {n = "no";} {if ($1 == "</font> ' <font color="green">"$module"</font> ' <font color="red">") n = "yes";} END {print n;}</font> ' ''' <br><br />
''Der Programmtext der für awk bestimmt ist, ist hier durch einfache Hochkommas unterbrochen, dadurch sieht die aufrufende Shell dazwischen die Shell-Variable und setzt so deren Wert beim Aufrufen des awk Programmtext entsprechend dem Inhalt der Shellvariable. )'' <br />
<br />
<br />
<br />
* als erstes haben wir hier eine '''BEGIN''' Bedingung. In der Aktion dazu wird eine Variable definiert und vorbelegt. '''n = "no"''' <br />
* Danach erfolgt der Programmablauf der da ohne weitere Bedingung auf jede einzelne Zeile die Aktion '''if ($1 == "'"$module"'") n = "yes"''' ausführt.<br />
: Dabei wird der Inhalt der Shell-Variable '''module''' , der beim Aufruf dort substituiert wird, mit dem ersten Feld verglichen. Ist er gleich, dann wird '''n = "yes"''' ausgeführt.<br />
* sind alle Zeile abgearbeitet dann startet die Bedingung '''END ''' ihre Aktion die darin besteht, den Wert der Variable '''n''' auszugeben<br />
<br />
<br />
Die gesamte Befehlszeile in Verbindung mit der Shellvariable '''module''' gibt also entweder '''no''' oder '''yes''' als Ausgabe, je nachdem ob das entsprechende Modul dessen Name in der '''module''' Variable der shell hinterlegt ist, momentan im Kernel geladen ist oder nicht.<br />
<br />
<br />
<br />
<br />
<br />
=== Beispiel 5 ===<br />
<br />
Sehr oft aber durchaus nicht immer sind die awk Programme so kurz und leicht zu verstehen wie in obrigen Beispielen<br><br />
folgender Ausschnitt wurde gefunden in '''/usr/bin/anytovcd.sh'''<br />
<pre><br />
echo "`awk -F= '/quant=/ {print $2}' "$1" | \<br />
awk '{iquant=$1; \<br />
oquant=iquant; \<br />
if (iquant>= 10) {oquant=9}; \<br />
if (iquant>= 12) {oquant=10}; \<br />
if (iquant>= 14) {oquant=11}; \<br />
....<br />
....<br />
if (iquant>= 88) {oquant=28}; \<br />
if (iquant>= 96) {oquant=29}; \<br />
if (iquant>= 104) {oquant=30}; \<br />
if (iquant>= 112) {oquant=31}; \<br />
nquant+=1; \<br />
sum_quant+=oquant; \<br />
print sum_quant/nquant}' | \<br />
tail -1 | awk -F. '{print $1}'`"<br />
</pre><br />
hier handelt es sich sogar um 3 awk Programme in einer Befehlskette. Das erste Script<br />
awk -F= '/quant=/ {print $2}' "$1"<br />
sucht in der Datei die dem Script oder der Funktion als erster Parameter übergeben wurde nach dem Vorkommen von "'''quant='''" und gibt mit dem Feldtrennzeichen "'''='''" dann jeweils das 2. Feld an die Ausgabe.<br />
<br />
<br />
über einen Pipe wird diese Ausgabe an das 2. awk Programm übergeben, da es hier keine Bedingung gibt, wird mit jeder Zeile folgende Aktionen der Reihe nach abgearbeitet.<br />
* Die Variabel '''iquant''' wird mit dem Inhalt von Feld1 belegt. (Wir wissen aus Script 1, es gibt nur diese erste Feld in jeder Zeile)<br />
* Die Variable '''oquant''' bekommt den selben Wert wie '''iquant''' <br />
* in einer langen Liste (unterscheiden sich nur durch ihre Werte) wird anschließend '''iquant''' mit Zahlen verglichen und entsprechend '''oquant''' auf einen anderen Wert gesetzt<br />
* ist diese Liste abgearbeitet hat also '''oquant''' einen anderen aber einen von der Größe von '''iquant''' abhängigen Wert<br />
* die Variable '''nquant''' wird in jeder Zeile jeweils um 1 erhöht<br />
* die Variable '''sum_quant''' wird in jeder Zeile um den Wert von '''oquant''' erhöht<br />
* zum Schluss erfolgt in jeder Zeile eine Ausgabe des Ergebnisses von '''sum_quant / nquant'''<br />
Script 2 setzt also die Eingangswerte mit einer Tabelle in andere Werte um, (vergleichbar vielleicht mit anderer nicht linear umrechenbaren Maßeinheit) und gibt jeweils das aritmethische Mittel der bis hierhin durchlaufenen Werte aus. <br />
Dieses wird dann über die Pipe weitergereicht<br />
<br />
<br />
tail -1<br />
läßt hier nur die letzte Zeile passieren und übergibt diese wiederum per Pipe an das 3. awk-Script<br />
<br />
<br />
awk -F. '{print $1}'<br />
arbeitet mit dem Feldtrenner Punkt und gibt mit dem ersten Feld desshalb nur den Ganzzahligen Wert des ihm ubergebenen Wertes aus (Kommastellen werden abgeschnitten).<br />
<br />
<br />
<br />
<br />
=== Beispiel 6 ===<br />
Wer bis hier her einigermaßen verstanden hat wie awk funktioniert, wird mit folgendem kein Problem haben<br><br />
gefunden in '''/usr/bin/fontprop.sh'''<br />
<pre><br />
awk -F- '<br />
{<br />
printf "FONTNAME_REGISTRY \"%s\"\n", $1;<br />
printf "FOUNDRY \"%s\"\n", $2;<br />
printf "FAMILY_NAME \"%s\"\n", $3;<br />
printf "WEIGHT_NAME \"%s\"\n", $4;<br />
printf "SLANT \"%s\"\n", $5;<br />
printf "SETWIDTH_NAME \"%s\"\n", $6;<br />
printf "ADD_STYLE_NAME \"%s\"\n", $7;<br />
printf "PIXEL_SIZE %d\n", $8;<br />
printf "POINT_SIZE %d\n", $9;<br />
printf "RESOLUTION_X %d\n", $10;<br />
printf "RESOLUTION_Y %d\n", $11;<br />
printf "SPACING \"%s\"\n", $12;<br />
printf "AVERAGE_WIDTH %d\n", $13;<br />
printf "CHARSET_REGISTRY \"%s\"\n", $14;<br />
printf "CHARSET_ENCODING \"%s\"\n", $15;<br />
}' $*<br />
</pre><br />
Dem awk Befehl werden hier eine oder mehrere Dateien übergeben die jeweils eine oder mehrere Zeilen mit jeweils fest definierten Spalteninhalten haben.<br />
Die einzelnen Spalten sind durch Bindestrich '''"-"''' getrennt. (eine genaue Aufschlüsselung befindet sich auch im Script)<br />
<br />
awk setzt diese Tabelle mit wagerechten Infomationen in eine vom Menschen gut verständliche zeilenweise Auflistung mit vorangesteller Feldbenennung um. Benutzt wird hierbei die '''printf''' Funktion, die wie in C funktioniert.<br />
<br />
<br />
<br />
<br />
<br />
=== Beispiel 7 ===<br />
Wer nun der Meinung ist, awk etwas zu kennen, darf sich jetzt auch etwas komplizierteren aussehenden awk Konstrukten auf seinem eigenem Rechner nähern.<br><br />
gefunden in der '''/etc/rc.d/ntp'''<br />
<br />
<pre><br />
if [ -r $NTP_CONF ] ; then<br />
cat $NTP_CONF | awk -v MAX_AUTO=$MAX_AUTO '<br />
/^[[:space:]]*server[[:space:]]+127.127/ {<br />
next<br />
}<br />
/^[[:space:]]*(server|peer)[[:space:]]/ {<br />
if ( MAX_AUTO ) {<br />
printf " %s", $2<br />
if ( --MAX_AUTO == 0 )<br />
exit 0<br />
}<br />
}<br />
'<br />
fi<br />
</pre><br />
* gestartet wird hier awk mit der Option "'''-v MAX_AUTO=$MAX_AUTO'''" Damit wird für awk eine Variable '''MAX_AUTO''' inititiert und mit den Wert der gleichnamingen Variable aus der Shellumgebung vorbelegt. <br />
* bei der weiteren Analyse des Programmes wird man dieses Mal 2 Bedingungen finden mit jeweils der dazugehörigen Aktion<br />
* Beide Bedingungen stehen in /.../ es handelt sich also um Reguläre Ausdrücke. ( die genaue Bedeutung dieser Regulären Ausdrücke ist für die weiter Untersuchung erst einmal nebensächlich.<br />
* der zur ersten Bedingung gehörende Aktionsblock enthält nur das Schlüsselwort '''next''', next gehört zu den gezielten Abbruchbedingungen von awk und bedeutet, das diese Zeile nicht mehr mit weiteren folgenden Bedingungen geprüft werden soll, sondern sofort mit der nächste Zeile und der ersten Bedingung weiter gemacht wird. Beim Zutreffen der ersten Bedingung in unserem Programm wird also die 2. Bedingung gar nicht erst geprüft, sondern gleich mit der nächsten Zeile weitergemacht.<br />
* der zur zweiten Bedingung gehörende Aktionsblock wird erst richtig erkennbar wenn wir ihn etwas umformatieren.<br />
if ( MAX_AUTO ) { printf " %s", $2 <br />
if ( --MAX_AUTO == 0 ) exit 0<br />
}<br />
* entsprechend dem Wert der Variable '''MAX_AUTO''' wird eine '''printf''' Aktion ausgeführt und zwar dann, wenn '''MAX_AUTO''' ungleich 0 ist wird das Feld 2 formatiert ausgegeben<br />
* im selben Programmblock befindet sich nach der '''printf''' Funktion noch eine weitere Aktion die danach ausgeführt wird. Dabei wird die Variable '''MAX_AUTO''' mit einem pre-Dekremen-Operator '''--''' um eins verringert und anschließend geprüft ob sie jetzt 0 ist, wenn ja wird "'''exit 0'''" ausgeführt,( '''exit''' ist eine weitere Abbruchbedingung von awk und diese beendet die gesamte Abbarbeitung des Scriptes an dieser Stelle) <br />
<br />
Das gesamte Programm kann also maximal soviele Ausgaben machen wie ihm per Variable '''MAX_AUTO''' übergeben werden.<br />
<br />
<br />
<br />
<br />
<br />
=== Beispiel 8 ===<br />
<br />
Das [http://www.linux-club.de/viewtopic.php?f=28&t=98852 Problem und die Lösung] stammt aus dem Forum.<br />
<pre><br />
cat DATEI* | awk '{z[$2]+=$1;a[$2]++}END{for(n in z)print a[n],z[n]/a[n],n}' | sort -rn | head -3<br />
</pre><br />
Um die Aufgabe dieser Programmzeile vorwegzunehmen, es handelt sich um eine einfache statistische Auswertung. Mehrere Dateien sind voll mit Daten im folgendem Format: '''"Dezimalzahl Dateiname"''' Beispiel:<br />
90.4722 '/blog/uploadPhoto.action'<br />
54.8582 '/profile/editActionPic.action' <br />
Es gilt die 3 am häufigsten vorkommenden Dateien zu ermitteln, sowie jeweils der Durchschnitt aus den dazugehörigen Dezimalzahlen.<br />
<br />
<br />
Um uns auf '''awk''' konzentieren zu können, extrahieren wir erst einmal aus der Befehlszeile alle Kommandos außer dem '''awk''' Befehl<br />
cat DATEI* | .... | sort -rn | head -3<br />
[http://linux.die.net/man/1/cat cat] ließt alle von der Shell auf die Maske '''"DATEI*"''' passenden Dateien aus und verbindet sie zu einem einzigen Stream der an awk übergeben wird. Awk übergibt sein Ergebnis dann an [http://linux.die.net/man/1/sort sort] und [http://linux.die.net/man/1/head head] die die Daten noch numerisch sortieren und <br />
nur die ersten 3 ausgeben.<br />
<br />
<br />
Den awk Befehl schreiben wir etwas um, um zuerst einmal sie Struktur näher zu untersuchen<br />
awk ' { z[$2]+=$1 ; a[$2]++ }<br />
END { for(n in z) print a[n],z[n]/a[n],n } ' <br />
Es handelt sich also um 2 Aktionen, die erste Aktion hat keine Bedingung und wird somit auf jede Zeile angewendet und besteht aus 2 Einzelaktionen.<br><br />
Nach Durchlauf aller Eingabezeilen wird eine '''END-Aktion''' gestartet, in der am print-Befehl erkennbar die Ausgaben gemacht werden.<br />
<br />
<br />
Schauen wir uns zuerst einmal die erste Anweisung des ersten Anweisungsblockes näher an.<br />
z[$2]+=$1<br />
Um zu verstehen was hier passiert, müssen einige Dinge kurz angesprochen werden, die bisher auf dieser Seite noch nicht erklärt worden sind.<br />
* Variable müssen nicht deklariert, (also vor der ersten Benutzung bekanntgegeben) werden<br />
* awk kennt nur 2 Daten-Typen "Text" und "Dezimalzahlen". Wann welcher Type verwendet wird, entscheiden die Operatoren und die Werte der Operanten, Variable sind also keinem Datentype fest zugeordnet.<br />
* Arrays werden ebenfalls nicht vorher deklariert, und können anders als in vielen Programmiersprachen nicht nur aufeinanderfolgende Zahlen als Index beinhalten, sondern der Index kann frei gewählt werden und auch Zeichenketten können als Index verwendet werden (sog. [http://de.wikipedia.org/wiki/Assoziatives_Array „assoziative“ Speicherung])<br />
<br />
Dem zu Folge ist '''"z[]"''' also ein Array (erkennbar an den eckigen Klammern) und '''"$2"''' wird als Index verwendet. Die Operation ist '''+=''' (also mathematisch) den Wert von '''"$1"''' $1 und $2 sind dabei Feldwerte auf unsere Eingabedaten, also das erst und das zweite Feld der Eingabedaten. <br />
<br />
<br />
Was jetzt genau passiert, soll jetzt hier mal an der oben abgebildeten beiden Datensätzen genau erklärt werden.<br />
* im ersten Datensatz ist '''$2 = '/blog/uploadPhoto.action''''<br />
* im Array '''"z"''' gibt es noch keinen Arrayelement mit dem Index '''z['/blog/uploadPhoto.action']''' also wird dieses neu angelegt<br />
* beim Erzeugen ist diese Element leer oder hat den nurmerischen Wert 0 und erhält also den Wert '''0 + $1''' also '''0 + 90.4722''' <br />
* Zusammengefasst passiert hier also mit der ersten Zeile '''z['/blog/uploadPhoto.action'] = z['/blog/uploadPhoto.action'] + 90.4722'''<br />
* Die zweite Eingabezeile währe dann analog '''z['/profile/editActionPic.action'] = z['/profile/editActionPic.action'] + 54.8582''' <br />
* würde jetzt eine Zeile kommen deren Index schon bekannt ist, dann würde kein neues Element erstellt, sonder der Wert von $1 dem schon bestehenden dazu addiert.<br />
<br />
Demzufolge legen wir soviel Arrayelemente an, wie wir in den Eingabedaten unterschiedliche Zeichenketten in '''$2''' vorfinden, und der Wert jeden Elementes enthält die Summe aus allen Zahlenwerten die in '''$1''' mit eben dieser Zeichenkette gefunden werden.<br />
<br />
<br />
<br />
a[$2]++ <br />
Die zweite Aktion beinhaltet also wieder ein Array '''"a[]"''' und auch hier haben wir wie eben schon als Index '''$2''' also werden auch hier soviele Arrayelemente angelegt, wie wir eindeutige Zeichenketten einlesen. Als Wert wird durch den '''"++" Operator''' bei jedem Aufruf eines Arrayelemtes dieses um 1 erhöht. Also ist der Wert jedes Elementes von '''a[]''' das gezählte Vorkommen der Zeichenkette, die dieses Element im Index mit sich führt.<br />
<br />
<br />
for(n in z) print a[n],z[n]/a[n],n<br />
In der END-Aktion wird jetzt auf die Einzelelmente der Array '''z[]''' und '''a[]''' zugegreifen. Da wir hier aber nicht mit einer numerischen Indexvariable arbeiten können also zB a[0]; a[1]; a[2] ..... gibt es in awk eine besondere Form der for-Schleife. Und zwar gewinnen wir mit <br />
for (VARIABLE in ARRAY) <br />
eine Indexvariable VARIABLE aus dem Array heraus, in dem der Reihe nach der Index aus dem ARRAY enthalten ist. In unserem Fall ist das die Variable '''"n"''' die dann also wieder die eindeutige Zeichenkette enthält, die beim Anlegen der Arrayelemente benutzt wurde.<br />
<br />
Der Rest ist nur die Printausgabe: 3 Ausgaben mit Leerzeichen getrennt und folgenden Werten und da in einer for-Schleife eben für jedes '''"n"'''<br />
* '''a[n]''' also Anzahl der gezählten Werte der Zeichenkette die in '''"n"''' enthalten ist<br />
* '''z[n] / a[n]''' also die Gesamtsumme die im Array '''"z"''' zum Element '''"n"''' dividiert durch die gezählte Häufigkeit des Vorkommens von '''"n"'''<br />
* und '''"n"''' selber, also die Zeichenkette die in den beiden Arrays als Index verwendet wurde.<br />
<br />
<br />
Durch die anschließende Sortierung mit '''sort''' , erhalten wir hier die Reihenfolge nach der Häufigkeit sortiert.<br />
<br />
<br />
<br />
<br />
== Probleme bei der Benutzung von awk ==<br />
<br />
ein häufiger anzutreffendes Problem mit awk, insbesondere bei Scripten ist die '''LANG''' Variable. Ein Befehl der auf einer Usershell zB. mit der Einstellung '''LANG=de_DE.UTF-8''' <br />
entwickelt wurde, bringt in einer Rootshell die '''LANG=POSIX''' eingestellt ist, plötzlich völlig andere Ergebnisse oder Fehler.<br />
<pre>LINUX:/tmp> echo $LANG<br />
de_DE.UTF-8<br />
LINUX:/tmp> echo | awk '{print 5/2}'<br />
2,5<br />
LINUX:/tmp> LANG=POSIX<br />
LINUX:/tmp> echo | awk '{print 5/2}'<br />
2.5</pre><br />
Beide awk Befehle sollten nur das Ergebnis von 5 / 2 ausgeben, und wie zu erkennen ist, der Dezimalpunkt ist einmal ein Punkt und einmal ein Komma. Aber nicht nur das die Ausgabe unterschiedlich ausfällt, nein auch bei der Verarbeitung von Dezimalzahlen werden diese dabei unterschiedlich interpretiert und Dezimalzahlen dann plötzlich als Integerzahlen verarbeitet. <br />
<br />
Sollte dieses Problem auftauchen, dann in den entsprechenden Scripten die '''LANG''' Variable fest definieren. <br />
<br />
<br />
<br />
<br />
== weiterführende Links ==<br />
<br />
* [http://www.ostc.de/awk.pdf deutschsprachige Einführung in awk] <br />
* [http://www.gnu.org/software/gawk/manual/html_node/index.html The GNU Awk User's Guide]<br />
* [http://linux.die.net/man/1/awk awk Manpage]<br />
* [http://www.faqs.org/faqs/computer-lang/awk/faq/ Awk Frequently Asked Questions]<br />
* [https://en.wikipedia.org/wiki/The_AWK_Programming_Language The AWK Programming Language] das orginal Buch, oder oftmals auch "Das graue Buch", sollte auch deutsch erhältlich sein<br />
* ein unvollendetes [http://de.wikibooks.org/wiki/Awk awk-Wikibook]<br />
<br />
<br />
-----<br />
<br />
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]<br />
[[Kategorie:Konsole]][[Kategorie:Scripte]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Sed&diff=33106Sed2022-02-18T23:16:42Z<p>Robi: kleine Änderungen, damit sollte der Artikel wieder für ein paar Jahre okay sein</p>
<hr />
<div>SED - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug<br />
<br />
<br />
<br />
== Was ist sed und was kann sed ? ==<br />
<br />
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. <br />
<br />
<br />
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem "programmiertem Rezept" welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.<br />
<br />
<br />
sed wurde 1973/74 von [https://en.wikipedia.org/wiki/Lee_E._McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.<br />
<br />
<br />
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. <br />
sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'<br />
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.<br />
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]<br />
<br />
<br />
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) <br />
<br />
<br />
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.<br />
<br />
<br />
<br />
<br />
=== Für was benötigen wir sed heute ? ===<br />
<br />
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.<br />
<br />
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.<br />
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:<br />
<br />
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);<br />
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen<br />
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien<br />
<br />
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.<br><br />
<br />
<br />
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. <br />
<br />
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.<br />
<br />
<br />
<br />
== das Funktionsprinzip ==<br />
<br />
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.<br />
<br />
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt '''sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.<br />
<br />
<br />
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.<br />
<br />
<br />
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also "Print-Befehle" benutzen. Die Option bei Aufruf von '''sed''' dazu ist "'''-n'''".<br />
<br />
<br />
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.<br><br />
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten <!-- mit?bei --> Option '''-n''' ;-))<br />
<br />
<br />
<br />
<br />
<br />
=== was beinhaltet sed und was kann man damit machen ===<br />
<br />
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt z.B. den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:<br />
''<br />
* Musterspeicher durch Haltespeicher ersetzen <br />
* Haltespeicher durch Musterspeicher ersetzen<br />
* Inhalt von Halte- und Musterspeicher tauschen<br />
* Inhalt von Musterspeicher an den Haltespeicher anhängen <br />
* Inhalt von Haltespeicher an den Musterspeicher anhängen<br />
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' Er dient nur zum Zwischenspeichern.<br />
<br />
<br />
Und was geht jetzt mit dem Musterspeicher?<br><br />
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht z.B.:<br />
''<br />
* Musterspeicher löschen<br />
* die nächste Zeile einlesen<br />
* die nächste Zeile hinten hinzufügen<br />
* Musterspeicher nach stdout ausgeben<br />
* Inhalte mit dem Haltespeicher austauschen<br />
* den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben<br />
* oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben<br />
* den Musterspeicher in eine Datei schreiben<br />
* Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht <br />
* einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])<br />
* und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''<br />
<br />
<br />
; Variablen ?<br />
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts<br><br />
; Schleifen ?<br />
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch<br> <br />
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.<br />
<br />
<br />
<br />
<br />
<br />
=== wie kann man damit Probleme lösen ===<br />
<br />
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?<br />
<br />
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''"suchen und ersetzen"''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdrücken]] sehr mächtig, ''([[#der s-Befehl|weiter unten, spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier z.B. auch ''"eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen"''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, z.B.: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. <br><br />
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''<br />
<br />
<br />
Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden. Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logik selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit '''sed''' anzugehen.<br><br />
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und das nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden. Der Unterschied ist: die CPU arbeitet mit Registern einer definierten Bit Breite und '''sed''' arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir z.B.. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logik, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. <br><br />
<br />
<br />
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. <br><br />
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).<br />
<br> Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logik], das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.<br><br />
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.<br />
<br />
<br />
<br />
<br />
== der Aufruf und die Optionen von sed ==<br />
<br />
=== die Optionen ===<br />
<br />
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und '''-f'''<br />
<br />
; sed -e REGEL:<br />
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) <br />
; sed -f REGELDATEI:<br />
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.<br />
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :<br />
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. <br />
<br />
<br />
<br />
=== der Aufruf ===<br />
<br />
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können<br />
<pre><br />
BEFEHL | sed -e 'REGEL' > AUSGABEDATEI<br />
<br />
sed -n -e 'REGEL' EINGABEDATEI > AUSGABEDATEI<br />
<br />
BEFEHL | sed -f REGELDATEI | BEFEHL<br />
<br />
sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' <EINGABEDATEI >AUSGABEDATEI<br />
<br />
VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` <br />
</pre><br />
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. <br />
<pre>sed -ne '<br />
BEFEHL1\<br />
Optionen zum BEFEHL1\<br />
weitere Optionen<br />
; BEFEHL2 ; BEFEHL3\<br />
Optionen zum BEFEHL3<br />
; BEFEHL4 ; BEFEHL5<br />
'</pre><br />
<br />
<br />
<br />
==== sed-Programm als Script ====<br />
<br />
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]<br />
#!/usr/bin/sed -f <br />
(eventuell noch zusätzlich die Option '''-n''') gesetzt.<br><br />
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.<br />
<br />
<br />
<br />
<br />
==== Übergabe von Shell-Variablen an Sed-Programme ====<br />
<br />
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.<br />
<br />
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell<br />
#!/bin/bash<br />
<br />
sed -n '<br />
'/$1/' !{<br />
#no match - put the current line in the hold buffer<br />
x<br />
# delete the old one, which is <br />
# now in the pattern buffer<br />
d<br />
}'<br />
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung<br><br />
<font face="Arial" size="4"><br><br />
'''<font color="red">'</font><font color="blue">/$1/</font><font color="red">'</font>!{ '''<br><br />
</font><br><br />
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''<br />
<br />
<br />
<br />
<br />
<br />
==== Nutzung von sed in Here-Dokuments's ====<br />
<br />
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]<br />
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.<br />
<pre><br />
#!/bin/bash<br />
KASSE=129.32<br />
WAEHRUNG="EURO"<br />
MITARBEITER="Hr. Maier"<br />
<br />
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'"$WAEHRUNG"'/g;s/ZZZZ/'"$MITARBEITER"'/g' <<EOF<br />
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt<br />
verantwortlich ist wie immer ZZZZ<br />
EOF<br />
</pre><br />
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.<br />
<pre>Der Bargeldbestand von 129.32 EURO wurde heute festgestellt<br />
verantwortlich ist wie immer Hr. Maier</pre> <br />
<br />
<br />
<br />
<br />
== die Befehle ==<br />
<br />
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)<br />
* p = '''p'''rint<br />
* l = '''l'''ist<br />
* i = '''i'''nsert<br />
* a = '''a'''pend<br />
*usw<br />
<br />
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. <br />
<br />
<br />
<br />
<br />
=== Adressierung der Befehle ===<br />
<br />
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können z.B. mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen. Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also "alle Anderen außer den adressierten Zeilen" treffen zu )<br />
<br />
<br />
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt<br />
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen<br />
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1 bis zur Adresse2'''<br />
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (z.B. '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) <br />
<br />
<br />
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln<br />
<br />
<br />
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei<br />
* Eine Adresse kann ein Regulären Ausdruck sein '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)<br />
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei<br />
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt <br />
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich<br />
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile<br />
* Zeilenberechnungen mit Zeilennummern wie z.B. '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht <br />
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' <br />
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen. <br />
<br />
<br />
<br />
<br />
==== Beispiele für Adressierung ====<br />
<br />
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''<br />
<pre><br />
sed -ne '1,10p' # Zeilen 1 bis 10 ausgeben<br />
sed -e '1,10p' # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben<br />
sed -e '2d' # 2. Zeile löschen<br />
sed -e '2,10!d' # Zeilen 2 bis 10 ausgeben<br />
sed -ne '2,10p' # Zeilen 2 bis 10 ausgeben<br />
sed -e '10,$p' # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben<br />
sed -ne '$p' # letzte Zeile ausgeben<br />
<br />
sed -e '/Text/d' # Alle Zeilen die nicht "Text" enthalten, ausgeben<br />
sed -e '/Text/!d' # Alle Zeilen die "Text" enthalten, ausgeben<br />
sed -ne '/Text/,$!p' # Alle Zeilen bevor eine Zeile mit "Text" kommt, ausgeben<br />
sed -ne '/Begin/,/END/p' # Alle Zeilen von "Begin" bis "END" ausgeben (wird "END" nicht gefunden bis Schluss)<br />
# Kommt nach einem "END" wieder ein "Begin" dann von dort aus wieder ausgeben </pre><br />
<br />
<br />
<br />
<br />
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind<br />
<pre><br />
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen<br />
sed -ne '3~2p' # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )<br />
sed -ne '5,/Text/p' # Ab der 5.Zeile bis zu einer Zeile mit "Text" ausgeben<br />
sed -ne '3,+7p' # Die 3.Zeile und die 7 folgenden Zeilen ausgeben<br />
sed -ne '/Begin/,+2p' # Die Zeilen die "Begin" enthalten und jeweils die nächsten 2 Zeilen ausgeben<br />
</pre><br />
<br />
<br />
<br />
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr <br />
<pre><br />
sed -ne '/^[EBH]/p' # alle Zeilen die mit "E","B" oder "H" beginnen ausgeben<br />
sed -e '/^$/d' # alle leeren Zeilen löschen<br />
sed -ne '/^[^#].*/p' # jede Zeile ausgeben, die mit einem anderem Zeichen als "#" beginnt<br />
sed -ne '/^[[:space:]]*#/d' # Zeilen deren erstes Zeichen (außer Space und Tabulator) "#" ist, löschen<br />
sed -ne '/^.\{64\}/p' # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben<br />
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'<br />
# druckt jede Zeile in der eine IP-Adresse enthalten sein könnte<br />
</pre><br />
<br />
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.<br />
<br />
<br />
Um z.B. alle fehlerfreien Zeilen zu suchen, die einen Zeitstring '''YYYY-MM-DD''' entsprechen wie ihn z.B. auch '''date +%F''' liefert, könnte man mit '''sed''' wie folgt adressieren. Es wir hier desshalb so komplex, da die Monate nicht alle 31 Tage haben und es auch noch in bestimmten Jahren ein 29. Februar gibt. All dieses muss geprüft werden wenn man Fehlerhafte Zeitstings ermitteln will. Hier mal gleich der Konsolausdruck. ;-) <br><br />
<br />
zuerst werden ein paar Zeilen mit korrekten und falschen Zeitstings in eine Datei ausgegeben.<br><br />
Anschließend wird diese Datei dann mit sed und der entsprechenden Regex durchsucht, und nur korrekte Zeilen ausgegeben<br><br />
unten sind dann die korrekten Zeilen in der Ausgabe zu sehen. <br />
<pre><br />
LINUX: # cat test1<br />
2008-10-02<br />
2008-03-19<br />
2007-09-01<br />
2006-07-28<br />
2008-10-05<br />
2007-13-01<br />
2006-06-31<br />
2008-30-02<br />
2005-02-29<br />
2006-11-31<br />
2008-00-02<br />
2004-02-29<br />
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1<br />
2008-10-02<br />
2008-03-19<br />
2007-09-01<br />
2006-07-28<br />
2008-10-05<br />
2004-02-29<br />
LINUX: # <br />
</pre><br />
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [https://aurelio.net/projects/txt2regex/ Tools] und jede Menge gute Seiten im WWW.<br />
<br />
<br />
<br />
<br />
==== ein paar Regeln zu Regulären Ausdrücken in sed ====<br />
<br />
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige Regeln<br><br />
'''sed''' verwendet '''"Basic Regular Expressions"''' einige Unterschiede zu den '''"Erweiterten Regulären Ausdrücken"''' sind z.B.:<br />
<br />
<br />
* Die Quantifikatoren "'''|'''", "'''+'''" und "'''?'''" sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash "escaped" werden)''<br />
<br />
* die Klammern '''"{" "}" "(" ''' und ''' ")"''' sind normale Zeichen und müssen mit Backslashes "escaped" (aktiviert) werden, also als "'''\{'''" ; "'''\}'''" ; "'''\('''" und "'''\)'''"geschrieben werden. <br />
<br />
* die Zeichen, die durch "'''\('''" und "'''\)'''" eingeschlossen werden, können später mit "'''\1'''" usw. (max "'''\9'''" ) dereferenziert werden<br />
<br />
* "'''^'''" ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht<br />
<br />
* "'''$'''" ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht<br />
<br />
* "'''*'''" ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen<br />
<br />
<br />
<br />
<br />
=== der s-Befehl ===<br />
<br />
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''"s///"'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit "suchen und ersetzen" erklärt. Die Schreibweise: <br> <br />
<font face="Arial" size="6"><br><br />
[ADRESSE]<font color="red">'''s/'''</font>SUCHMUSTER<font color="red">'''/'''</font>ERSETZUNG<font color="red">'''/'''</font>[FLAG] <br><br />
</font><br />
<br />
<br />
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet<br />
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#die Bedeutung der Flags|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.<br />
* '''s''' ist der Befehlsname selbst<br />
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird<br />
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.<br />
* Als Abrenzung der einzelnen Optionen sind 3 '''"/"''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''"/"''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''<br />
<br />
<br />
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.<br />
sed -e 's/Strauch/Baum/g'<br />
; Erläuterung<br />
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet<br />
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''"Strauch"'''<br />
: * Der Ersetzungtext ist '''"Baum"'''<br />
: * als Flag wird '''"global"''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.<br />
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.<br />
<br />
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination "Strauch" durch "Baum" ersetzt, also nicht nur das Wort Strauch selbst, sonder z.B. würde aus dem Wort "Strauchdieb" das Wort "Baumdieb"<br />
<br />
<br />
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann. <br />
<br />
<br />
<br />
<br />
<br />
<br />
==== die Bedeutung der Flags ====<br />
<br />
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings<br />
<br />
{| border=1<br />
|+ '''Bedeutung der Flags beim s-Befehl '''<br />
! Flag !! Bedeutung !! Beispiel !! Bemerkung<br />
|- <br />
!| N <br />
|| N=Zahl (1 < 512) ; das N'te Vorkommen <br />
!| s/AB/CD/2 <br />
|| wird N nicht angegeben dann erste Vorkommen <br />
|- <br />
!| g <br />
|| global ; alle Vorkommen <br />
!| s/AB/CD/g <br />
|| es werden alle Vorkommen ersetzt <br />
|- <br />
!| p <br />
|| print ; Ausgabe bei Ersetzung <br />
!| s/AB/CD/p <br />
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben <br />
|- <br />
!| w DATEI <br />
|| write DATEI bei Ersetzung <br />
!| s/AB/CD/w FILE<br />
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei<br />
|- <br />
!| i <br />
|| case-insensitive ; Groß-Kleinschreibung ignorieren <br />
!| s/AB/CD/i <br />
|| ist <font color="red">nicht kompatibel</font> zu allen SED-Implementierungen<br />
|- <br />
!| m <br />
|| || <br />
|| betrifft Interpretation von '''^ '''und''' $''' ; <font color="red">nicht kompatibel</font> <br />
|- <br />
!| x <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|-<br />
!| s <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|}<br />
es ist auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. z.B.<br />
<pre><br />
LINUX: # echo "abcabcabc" | sed -ne 's/AB/CD/2ip'<br />
abcCDcabc<br />
LINUX: # </pre><br />
<br />
<br />
<br />
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====<br />
<pre><br />
sed -e 's/blau\|lila/rot/2' # Das 2.Vorkommen je Zeile von "blau" oder "lila" wird durch "rot" ersetzt<br />
<br />
sed -e '/^$/!s/^/#/ ' # bei alle nichtleeren Zeilen am Zeilenanfang "#" einfügen<br />
<br />
sed -e 's/#.*$//' # von einem Zeichen "#" bis zum Zeilenende alles löschen<br />
<br />
sed 's/^[ \t]*//;s/[ \t]*$//' # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen<br />
<br />
sed -e 's/Michael[^a]/Herr &/' # ersetze "Michael" durch "Herr Michael" jedoch nicht wenn hinter "Michael" ein "a" folgt.<br />
<br />
sed -e 's/[Cc]olor/[b]&[\/b]/g' # jedes "Color" und "color" in "[b]Color[/b]" oder "[b]color[/b]" änderen<br />
<br />
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'<br />
#das Datumsformat YYYY-MM-DD umwandeln zu "heute ist der DD.MM. YYYY"<br />
</pre><br />
'''Besonderheiten der Beispiele'''<br><br />
<br />
# Beispiel: es wird eine Oderverknüpfung benutzt '''|''' muss dabei entwertet werden also '''\|'''<br />
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende<br />
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''<br />
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''"*"''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''";"''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. <br />
# Beispiel: '''[^a]''' das '''"a"''' ist durch '''"^"''' negiert, das Bedeutet ('''nicht "a"''') an dieser Stelle, das '''"&"''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.<br />
# Beispiel: Im Ersetzungsfeld steht wieder '''"&"''' der '''"/"''' im Ersetzungstext musste entwertet werden '''"\/"''' <br />
# Beispiel: Hier haben wir zum einem '''"\{ \}"''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier z.B. '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''"\( \)"''' das ist eine Gruppierung (ähnlich einer Variable) mit '''"\1" bis "\9"''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''"\3 \2 \1"'''<br />
<br />
<br />
<br />
<br />
=== Befehlsübersicht ===<br />
<br />
{| border=2<br />
|+ '''Übersicht der Befehle und Schlüsselworte'''<br />
! Kommando !! Addr !! stdin !! stdout !! Muster Speicher !! Halte Speicher !! Erklärung<br />
|-<br />
! <font color="red">;</font> || - || - || - || - || - <br />
|| Trennzeichen zwischen einzelner Befehle<br />
|-<br />
! <font color="red">!</font> || - || - || - || - || - <br />
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)<br />
|-<br />
! <font color="red">{ }</font> || 2 || - || - || - || - <br />
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden<br />
|-<br />
! <font color="red">#</font> || - || - || - || - || - <br />
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert<br />
|-<br />
! <font color="red">:</font> MARKE || - || - || - || - || - <br />
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''<br />
|-<br />
! <font color="red">=</font> || 2 || - || X || - || - <br />
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus<br />
|-<br />
! <font color="red">a</font> || 1 || - || X || - || - <br />
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus<br />
|-<br />
! <font color="red">b</font> MARKE || 2 || - || - || - || - <br />
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts<br />
|-<br />
! <font color="red">c</font> || 2 || - || X || X || - <br />
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben<br />
|-<br />
! <font color="red">d</font> || 2 || - || - || X || - <br />
|| Musterspeicher löschen<br />
|-<br />
! <font color="red">D</font> || 2 || - || - || X || - <br />
|| Musterspeicher bis zum Zeichen „newline“ löschen<br />
|-<br />
! <font color="red">g</font> || 2 || - || - || X || - <br />
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.<br />
|-<br />
! <font color="red">G</font> || 2 || - || - || X || - <br />
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt<br />
|-<br />
! <font color="red">h</font> || 2 || - || - || - || X <br />
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt<br />
|-<br />
! <font color="red">H</font> || 2 || - || - || - || X <br />
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt<br />
|-<br />
! <font color="red">i</font> || 1 || - || X || - || - <br />
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus<br />
|-<br />
! <font color="red">l</font> || 1 || - || X || - || -<br />
|| Musterspeicher ausgegeben. ("C-Notation" unbekannte Zeichen in Oktalformat)<br />
|-<br />
! <font color="red">n</font> || 2 || X || ? || X || - <br />
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden <br />
|-<br />
! <font color="red">N</font> || 2 || X || - || X || - <br />
|| Nächste Zeile an Inhalt des Musterspeichers angefügen<br />
|-<br />
! <font color="red">p</font> || 2 || - || X || - || - <br />
|| Musterspeicher ausgegeben.<br />
|-<br />
! <font color="red">P</font> || 2 || - || X || - || - <br />
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.<br />
|-<br />
! <font color="red">q</font> || 1 || - || - || - || - <br />
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben<br />
|-<br />
! <font color="red">r</font> FILE|| 1 || - || X || - || - <br />
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.<br />
|-<br />
! <font color="red">s</font>/regex/rpl/flg|| 2 || - || - || X || - <br />
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein<br />
|-<br />
! <font color="red">t</font> MARKE || 2 || - || - || - || - <br />
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos<br />
|-<br />
! <font color="red">w</font> FILE|| 2 || - || X || - || - <br />
|| Schreibt Musterspeicher in '''FILE'''<br />
|-<br />
! <font color="red">x</font> || 2 || - || - || X || X <br />
|| Inhalt von Muster- und Haltespeicher vertauschen<br />
|-<br />
! <font color="red">y</font>/src/rpc/flg|| 2 || - || - || X || - <br />
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''<br />
|}<br />
<br />
<br />
<br />
<br />
== kleine sed Programme am praktischen Beispiel erklärt ==<br />
<br />
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten. Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.<br />
Machen wir doch die Probe aufs Exempel: <br />
<br />
<br />
<br />
=== Beispiel 1 ===<br />
<br />
gefunden in '''/etc/rc.d/rpmconfigcheck'''<br />
sed -e 's/^/ /' < $configcheckfile<br />
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert<br />
* '''"^"''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. <br />
<br />
<br />
<br />
=== Beispiel 2 ===<br />
<br />
gefunden in '''/etc/rc.d/smbfs'''<br />
mountpoint=$( echo "$mountpoint"|sed "s/\/*$//")<br />
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert<br />
* '''"s/\/*$//"''' Trennzeichen ist '''"/"''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''"/"''' mit '''"\"''' entwertet <br />
* damit lautet unsere Suchmaske ohne Quotierung "'''/*$'''" und das ist schlichtweg als das letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''"/"''' ([https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren Quantoren]) <br />
gemeint<br />
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''"/"''' am Ende des Variableinhaltes abzuschneiden <br />
<br />
<br />
<br />
<br />
=== Beispiel 3 ===<br />
<br />
gefunden in '''/etc/rc.d/fbset'''<br />
mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`<br />
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert<br />
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. <br />
* die erste Regel ist ein s-Befehl, Suchmuster ist '''"^-[^ ]*"''' bedeutet Am Zeilenanfang '''"^"''' ein '''"-"''' und dann''' "[^ ]*"''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.<br />
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein, dann wird auch bis zum nächsten Leerzeichen nach dem Strich alles gelöscht. <br />
* der 2. Befehl arbeitet global, das heist es werden alle " -irgendwas" gelöscht.<br />
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem "-" aus dem Variabelinhalt zu beseitigen. <br />
<br />
<br />
<br />
<br />
=== Beispiel 4 ===<br />
<br />
gefunden in '''/etc/rc.d/network''' <br />
RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`<br />
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.<br />
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,<br />
*Dieses Mal ist das Begrenzungszeichen '''"="''' da es unmittelbar nach dem '''"s"''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''<br />
* als Flag haben wir ein '''"p"''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben<br />
* Suchmuster: am Anfang '''"id:"''' dann kommt [https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Vordefinierte_Zeichenklassen irgend ein Zeichen] das mit '''"\( \)"''' [https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierungen_und_R%C3%BCckw%C3%A4rtsreferenzen gruppiert] ist, und dann geht es weiter mit '''":initdefault"''' und anschließen alle Zeichen bis Zeilenende.<br />
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''"\1"''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierungen_und_R%C3%BCckw%C3%A4rtsreferenzen Rückwärtsreferenz]).<br />
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.<br />
<br />
<br />
<br />
<br />
=== Beispiel 5 ===<br />
<br />
gefunden in '''/etc/rc.d/xdm'''<br />
/etc/X11/xdm/SuSEconfig.xdm | \<br />
sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \<br />
/bin/logger<br />
<br />
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit "\" das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.<br />
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird dem Programm '''/bin/logger''' übergeben.<br />
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''"+"''' unmittelbar dem '''"s"''' folgt. <br />
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.<br />
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird "Alles" (beliebiges Zeichen, 0 mal oder beliebig oft)<br />
* ersetzt wird es durch "'''/etc/init.d/xdm: \1'''" , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.<br />
* das Flag '''"g"''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.<br />
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''"/etc/init.d/xdm: "''' einzufügen.<br />
<br />
<br />
<br />
<br />
=== Beispiel 6 ===<br />
<br />
gefunden in '''/usr/bin/texi2dvi4a2ps'''<br />
BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'<br />
<br />
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.<br />
* sed wird mit '''"-n"''' gestartet, also keine automatische Ausgabe jeder Zeile<br />
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''"p"''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. <br />
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''"\["''' ; dann kommt irgendetwas oder nichts '''".*"''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''"version "'''; Anschließend wird nach Zeichen im Format "XXXX-XX-XX" gesucht und irgendwas oder nichts kann bis Zeilenende kommen.<br />
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.<br />
* ersetzt wird die gesamte Zeile durch '''"txiformat=\1 txiversion="\2\3\4"''' die \1 \2 \3 \4 wird durch die Gruppen ersetzt.<br />
* der sed-Befehl formatiert also eine "Versionszeile" neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.<br />
<br />
<br />
<br />
<br />
=== Beispiel 7 (für Fortgeschrittene) ===<br />
<br />
gefunden in '''/usr/bin/autoconf'''<br />
echo X/"$0" |<br />
sed '/^.*\/\([^/][^/]*\)\/*$/{<br />
s//\1/<br />
q<br />
}<br />
/^X\/\(\/\/\)$/{<br />
s//\1/<br />
q<br />
}<br />
/^X\/\(\/\).*/{<br />
s//\1/<br />
q<br />
}<br />
s/.*/./; q'<br />
<br />
* hier wird '''"X/"''' vor '''"$0"''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.<br />
<br />
<br />
<br />
==== Analyse der Struktur ====<br />
<br />
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.<br />
/ADRESSE1/{<br />
s///<br />
q<br />
}<br />
/ADRESSE2/{<br />
s///<br />
q<br />
}<br />
/ADRESSE3/{<br />
s///<br />
q<br />
}<br />
s ; q<br />
* Den sed-Befehl '''"q"''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.<br />
* die Bedeutung, die '''"{ }"''' hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)<br />
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.<br />
<br />
<br />
<br />
<br />
==== Schauen wir uns zuerst die s-Befehle an ====<br />
<br />
* die ersten 3 s-Befehle sind gleich '''"s//\1/"''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''"\1"''' beim Ersetzen zu ?<br />
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, "fehlender Suchstring"<br />
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.<br />
* der letzte s-Befehl ist einfach '''"s/.*/./"''' ersetzt alles oder nichts durch einen einzigen Punk<br />
<br />
<br />
<br />
<br />
==== Analyse der Adressen ====<br />
<br />
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.<br />
::gesucht und gruppiert wird "ein mindestens 2 Zeichen langes Wort" Wortbegrenzer ist "/" gefunden wird die ganze Zeile.<br />
:: Achtung: hier "'''^.*\/'''" treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist. [https://learntutorials.net/de/regex/topic/429/gierige-und-faule-quantifizierer gieriges Verhalten] '''(Greediness of RegEx)'''<br />
:: gesucht wird am Zeilenanfang "irgendwas oder nichts bis ein '''"/"''' kommt" <br />
::: ist in der Shellvariable eine oder mehrere '''"/"''' (also das Programm mit dem Path aufgerufen,) dann wird hier als "irgendwas" der längst mögliche String gefunden <br />
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der "Scriptname ohne den Path" <br />
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. <br />
<br />
* ADRESSE2 '''"^X\/\(\/\/\)$"''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.<br />
:: sie sucht nach '''"X///"''' und gruppiert die letzten beiden '''"/"'''<br />
:: der s-Befehl würde also '''"//"''' ausgeben und sich beenden.<br />
<br />
* ADRESSE3 '''"^X\/\(\/\).*"''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''"/"''' weniger würde auch fündig werden bei vielen aneinandergereihten '''"/"''' und gibt nur ein '''"/"''' aus<br />
<br />
* Treffen keine der 3 Adressen zu, z.B. weil '''"$0"''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.<br />
<br />
<br />
<br />
==== Da ist noch ein kleiner Trick im Script versteckt ====<br />
<br />
Damit bei einer Leeren "$0" das sed-Programm überhaupt arbeiten kann, wird als Trick <br />
echo X/"$0"<br />
benutzt. Das vorangestellte '''"X/"''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programms.<br />
<br />
<br />
<br />
<br />
==== Das Ergebnis des gesamten sed-Programms ====<br />
<br />
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''"Scriptname ohne Path" ; "//" ; "/" oder "."'''<br />
<br />
<br />
-----<br />
<br />
== weiterführende Links ==<br />
<br />
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]<br />
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]<br />
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]<br />
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]<br />
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]<br />
<br />
<br />
<br />
<br />
-----<br />
<!-- ~~~~ --><br />
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]<br />
[[Kategorie:Konsole]][[Kategorie:Scripte]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Sed&diff=33105Sed2022-02-18T22:55:45Z<p>Robi: Links und Anker überarbeitet</p>
<hr />
<div>SED - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug<br />
<br />
<br />
<br />
== Was ist sed und was kann sed ? ==<br />
<br />
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. <br />
<br />
<br />
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem "programmiertem Rezept" welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.<br />
<br />
<br />
sed wurde 1973/74 von [https://en.wikipedia.org/wiki/Lee_E._McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.<br />
<br />
<br />
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. <br />
sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'<br />
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.<br />
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]<br />
<br />
<br />
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) <br />
<br />
<br />
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.<br />
<br />
<br />
<br />
<br />
=== Für was benötigen wir sed heute ? ===<br />
<br />
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.<br />
<br />
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.<br />
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:<br />
<br />
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);<br />
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen<br />
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien<br />
<br />
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.<br><br />
<br />
<br />
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. <br />
<br />
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.<br />
<br />
== das Funktionsprinzip ==<br />
<br />
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.<br />
<br />
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt '''sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.<br />
<br />
<br />
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.<br />
<br />
<br />
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also "Print-Befehle" benutzen. Die Option bei Aufruf von '''sed''' dazu ist "'''-n'''".<br />
<br />
<br />
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.<br><br />
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten <!-- mit?bei --> Option '''-n''' ;-))<br />
<br />
<br />
<br />
<br />
<br />
=== was beinhaltet sed und was kann man damit machen ===<br />
<br />
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt z.B. den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:<br />
''<br />
* Musterspeicher durch Haltespeicher ersetzen <br />
* Haltespeicher durch Musterspeicher ersetzen<br />
* Inhalt von Halte- und Musterspeicher tauschen<br />
* Inhalt von Musterspeicher an den Haltespeicher anhängen <br />
* Inhalt von Haltespeicher an den Musterspeicher anhängen<br />
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' Er dient nur zum Zwischenspeichern.<br />
<br />
<br />
Und was geht jetzt mit dem Musterspeicher?<br><br />
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht z.B.:<br />
''<br />
* Musterspeicher löschen<br />
* die nächste Zeile einlesen<br />
* die nächste Zeile hinten hinzufügen<br />
* Musterspeicher nach stdout ausgeben<br />
* Inhalte mit dem Haltespeicher austauschen<br />
* den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben<br />
* oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben<br />
* den Musterspeicher in eine Datei schreiben<br />
* Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht <br />
* einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])<br />
* und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''<br />
<br />
<br />
; Variablen ?<br />
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts<br><br />
; Schleifen ?<br />
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch<br> <br />
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.<br />
<br />
<br />
<br />
<br />
<br />
=== wie kann man damit Probleme lösen ===<br />
<br />
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?<br />
<br />
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''"suchen und ersetzen"''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdrücken]] sehr mächtig, ''([[#der s-Befehl|weiter unten, spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier z.B. auch ''"eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen"''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, z.B.: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. <br><br />
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''<br />
<br />
<br />
Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden. Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logik selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit '''sed''' anzugehen.<br><br />
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und das nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden. Der Unterschied ist: die CPU arbeitet mit Registern einer definierten Bit Breite und '''sed''' arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir z.B.. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logik, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. <br><br />
<br />
<br />
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. <br><br />
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).<br />
<br> Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logik], das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.<br><br />
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.<br />
<br />
== der Aufruf und die Optionen von sed ==<br />
<br />
=== die Optionen ===<br />
<br />
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und '''-f'''<br />
<br />
; sed -e REGEL:<br />
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) <br />
; sed -f REGELDATEI:<br />
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.<br />
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :<br />
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. <br />
<br />
<br />
<br />
=== der Aufruf ===<br />
<br />
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können<br />
<pre><br />
BEFEHL | sed -e 'REGEL' > AUSGABEDATEI<br />
<br />
sed -n -e 'REGEL' EINGABEDATEI > AUSGABEDATEI<br />
<br />
BEFEHL | sed -f REGELDATEI | BEFEHL<br />
<br />
sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' <EINGABEDATEI >AUSGABEDATEI<br />
<br />
VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` <br />
</pre><br />
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. <br />
<pre>sed -ne '<br />
BEFEHL1\<br />
Optionen zum BEFEHL1\<br />
weitere Optionen<br />
; BEFEHL2 ; BEFEHL3\<br />
Optionen zum BEFEHL3<br />
; BEFEHL4 ; BEFEHL5<br />
'</pre><br />
<br />
<br />
<br />
==== sed-Programm als Script ====<br />
<br />
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]<br />
#!/usr/bin/sed -f <br />
(eventuell noch zusätzlich die Option '''-n''') gesetzt.<br><br />
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.<br />
<br />
<br />
<br />
<br />
==== Übergabe von Shell-Variablen an Sed-Programme ====<br />
<br />
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.<br />
<br />
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell<br />
#!/bin/bash<br />
<br />
sed -n '<br />
'/$1/' !{<br />
#no match - put the current line in the hold buffer<br />
x<br />
# delete the old one, which is <br />
# now in the pattern buffer<br />
d<br />
}'<br />
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung<br><br />
<font face="Arial" size="4"><br><br />
'''<font color="red">'</font><font color="blue">/$1/</font><font color="red">'</font>!{ '''<br><br />
</font><br><br />
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''<br />
<br />
<br />
<br />
<br />
<br />
==== Nutzung von sed in Here-Dokuments's ====<br />
<br />
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]<br />
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.<br />
<pre><br />
#!/bin/bash<br />
KASSE=129.32<br />
WAEHRUNG="EURO"<br />
MITARBEITER="Hr. Maier"<br />
<br />
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'"$WAEHRUNG"'/g;s/ZZZZ/'"$MITARBEITER"'/g' <<EOF<br />
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt<br />
verantwortlich ist wie immer ZZZZ<br />
EOF<br />
</pre><br />
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.<br />
<pre>Der Bargeldbestand von 129.32 EURO wurde heute festgestellt<br />
verantwortlich ist wie immer Hr. Maier</pre> <br />
<br />
<br />
<br />
<br />
== die Befehle ==<br />
<br />
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)<br />
* p = '''p'''rint<br />
* l = '''l'''ist<br />
* i = '''i'''nsert<br />
* a = '''a'''pend<br />
*usw<br />
<br />
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. <br />
<br />
<br />
<br />
<br />
=== Adressierung der Befehle ===<br />
<br />
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können z.B. mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen. Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also "alle Anderen außer den adressierten Zeilen" treffen zu )<br />
<br />
<br />
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt<br />
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen<br />
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1 bis zur Adresse2'''<br />
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (z.B. '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) <br />
<br />
<br />
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln<br />
<br />
<br />
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei<br />
* Eine Adresse kann ein Regulären Ausdruck sein '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)<br />
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei<br />
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt <br />
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich<br />
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile<br />
* Zeilenberechnungen mit Zeilennummern wie z.B. '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht <br />
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' <br />
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen. <br />
<br />
<br />
<br />
<br />
==== Beispiele für Adressierung ====<br />
<br />
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''<br />
<pre><br />
sed -ne '1,10p' # Zeilen 1 bis 10 ausgeben<br />
sed -e '1,10p' # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben<br />
sed -e '2d' # 2. Zeile löschen<br />
sed -e '2,10!d' # Zeilen 2 bis 10 ausgeben<br />
sed -ne '2,10p' # Zeilen 2 bis 10 ausgeben<br />
sed -e '10,$p' # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben<br />
sed -ne '$p' # letzte Zeile ausgeben<br />
<br />
sed -e '/Text/d' # Alle Zeilen die nicht "Text" enthalten, ausgeben<br />
sed -e '/Text/!d' # Alle Zeilen die "Text" enthalten, ausgeben<br />
sed -ne '/Text/,$!p' # Alle Zeilen bevor eine Zeile mit "Text" kommt, ausgeben<br />
sed -ne '/Begin/,/END/p' # Alle Zeilen von "Begin" bis "END" ausgeben (wird "END" nicht gefunden bis Schluss)<br />
# Kommt nach einem "END" wieder ein "Begin" dann von dort aus wieder ausgeben </pre><br />
<br />
<br />
<br />
<br />
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind<br />
<pre><br />
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen<br />
sed -ne '3~2p' # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )<br />
sed -ne '5,/Text/p' # Ab der 5.Zeile bis zu einer Zeile mit "Text" ausgeben<br />
sed -ne '3,+7p' # Die 3.Zeile und die 7 folgenden Zeilen ausgeben<br />
sed -ne '/Begin/,+2p' # Die Zeilen die "Begin" enthalten und jeweils die nächsten 2 Zeilen ausgeben<br />
</pre><br />
<br />
<br />
<br />
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr <br />
<pre><br />
sed -ne '/^[EBH]/p' # alle Zeilen die mit "E","B" oder "H" beginnen ausgeben<br />
sed -e '/^$/d' # alle leeren Zeilen löschen<br />
sed -ne '/^[^#].*/p' # jede Zeile ausgeben, die mit einem anderem Zeichen als "#" beginnt<br />
sed -ne '/^[[:space:]]*#/d' # Zeilen deren erstes Zeichen (außer Space und Tabulator) "#" ist, löschen<br />
sed -ne '/^.\{64\}/p' # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben<br />
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'<br />
# druckt jede Zeile in der eine IP-Adresse enthalten sein könnte<br />
</pre><br />
<br />
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.<br />
<br />
<br />
Um z.B. alle fehlerfreien Zeilen zu suchen, die einen Zeitstring '''YYYY-MM-DD''' entsprechen wie ihn z.B. auch '''date +%F''' liefert, müsste man mit '''sed''' wie folgt adressieren. Hier mal gleich der Konsolausdruck. ;-)<br />
<pre><br />
LINUX: # cat test1<br />
2008-10-02<br />
2008-03-19<br />
2007-09-01<br />
2006-07-28<br />
2008-10-05<br />
2007-13-01<br />
2006-06-31<br />
2008-30-02<br />
2005-02-29<br />
2006-11-31<br />
2008-00-02<br />
2004-02-29<br />
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1<br />
2008-10-02<br />
2008-03-19<br />
2007-09-01<br />
2006-07-28<br />
2008-10-05<br />
2004-02-29<br />
LINUX: # <br />
</pre><br />
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [https://aurelio.net/projects/txt2regex/ Tools] und jede Menge gute Seiten im WWW.<br />
<br />
<br />
<br />
<br />
==== ein paar Regeln zu Regulären Ausdrücken in sed ====<br />
<br />
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige Regeln<br><br />
'''sed''' verwendet '''"Basic Regular Expressions"''' einige Unterschiede zu den '''"Erweiterten Regulären Ausdrücken"''' sind z.B.:<br />
<br />
<br />
* Die Quantifikatoren "'''|'''", "'''+'''" und "'''?'''" sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash "escaped" werden)''<br />
<br />
* die Klammern '''"{" "}" "(" ''' und ''' ")"''' sind normale Zeichen und müssen mit Backslashes "escaped" (aktiviert) werden, also als "'''\{'''" ; "'''\}'''" ; "'''\('''" und "'''\)'''"geschrieben werden. <br />
<br />
* die Zeichen, die durch "'''\('''" und "'''\)'''" eingeschlossen werden, können später mit "'''\1'''" usw. (max "'''\9'''" ) dereferenziert werden<br />
<br />
* "'''^'''" ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht<br />
<br />
* "'''$'''" ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht<br />
<br />
* "'''*'''" ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen<br />
<br />
<br />
<br />
<br />
=== der s-Befehl ===<br />
<br />
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''"s///"'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit "suchen und ersetzen" erklärt. Die Schreibweise: <br> <br />
<font face="Arial" size="6"><br><br />
[ADRESSE]<font color="red">'''s/'''</font>SUCHMUSTER<font color="red">'''/'''</font>ERSETZUNG<font color="red">'''/'''</font>[FLAG] <br><br />
</font><br />
<br />
<br />
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet<br />
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#die Bedeutung der Flags|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.<br />
* '''s''' ist der Befehlsname selbst<br />
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird<br />
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.<br />
* Als Abrenzung der einzelnen Optionen sind 3 '''"/"''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''"/"''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''<br />
<br />
<br />
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.<br />
sed -e 's/Strauch/Baum/g'<br />
; Erläuterung<br />
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet<br />
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''"Strauch"'''<br />
: * Der Ersetzungtext ist '''"Baum"'''<br />
: * als Flag wird '''"global"''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.<br />
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.<br />
<br />
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination "Strauch" durch "Baum" ersetzt, also nicht nur das Wort Strauch selbst, sonder z.B. würde aus dem Wort "Strauchdieb" das Wort "Baumdieb"<br />
<br />
<br />
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann. <br />
<br />
<br />
<br />
<br />
<br />
<br />
==== die Bedeutung der Flags ====<br />
<br />
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings<br />
<br />
{| border=1<br />
|+ '''Bedeutung der Flags beim s-Befehl '''<br />
! Flag !! Bedeutung !! Beispiel !! Bemerkung<br />
|- <br />
!| N <br />
|| N=Zahl (1 < 512) ; das N'te Vorkommen <br />
!| s/AB/CD/2 <br />
|| wird N nicht angegeben dann erste Vorkommen <br />
|- <br />
!| g <br />
|| global ; alle Vorkommen <br />
!| s/AB/CD/g <br />
|| es werden alle Vorkommen ersetzt <br />
|- <br />
!| p <br />
|| print ; Ausgabe bei Ersetzung <br />
!| s/AB/CD/p <br />
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben <br />
|- <br />
!| w DATEI <br />
|| write DATEI bei Ersetzung <br />
!| s/AB/CD/w FILE<br />
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei<br />
|- <br />
!| i <br />
|| case-insensitive ; Groß-Kleinschreibung ignorieren <br />
!| s/AB/CD/i <br />
|| ist <font color="red">nicht kompatibel</font> zu allen SED-Implementierungen<br />
|- <br />
!| m <br />
|| || <br />
|| betrifft Interpretation von '''^ '''und''' $''' ; <font color="red">nicht kompatibel</font> <br />
|- <br />
!| x <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|-<br />
!| s <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|}<br />
es ist auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. z.B.<br />
<pre><br />
LINUX: # echo "abcabcabc" | sed -ne 's/AB/CD/2ip'<br />
abcCDcabc<br />
LINUX: # </pre><br />
<br />
<br />
<br />
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====<br />
<pre><br />
sed -e 's/blau\|lila/rot/2' # Das 2.Vorkommen je Zeile von "blau" oder "lila" wird durch "rot" ersetzt<br />
<br />
sed -e '/^$/!s/^/#/ ' # bei alle nichtleeren Zeilen am Zeilenanfang "#" einfügen<br />
<br />
sed -e 's/#.*$//' # von einem Zeichen "#" bis zum Zeilenende alles löschen<br />
<br />
sed 's/^[ \t]*//;s/[ \t]*$//' # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen<br />
<br />
sed -e 's/Michael[^a]/Herr &/' # ersetze "Michael" durch "Herr Michael" jedoch nicht wenn hinter "Michael" ein "a" folgt.<br />
<br />
sed -e 's/[Cc]olor/[b]&[\/b]/g' # jedes "Color" und "color" in "[b]Color[/b]" oder "[b]color[/b]" änderen<br />
<br />
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'<br />
#das Datumsformat YYYY-MM-DD umwandeln zu "heute ist der DD.MM. YYYY"<br />
</pre><br />
'''Besonderheiten der Beispiele'''<br><br />
<br />
# Beispiel: es wird eine Oderverknüpfung benutzt '''|''' muss dabei entwertet werden also '''\|'''<br />
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende<br />
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''<br />
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''"*"''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''";"''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. <br />
# Beispiel: '''[^a]''' das '''"a"''' ist durch '''"^"''' negiert, das Bedeutet ('''nicht "a"''') an dieser Stelle, das '''"&"''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.<br />
# Beispiel: Im Ersetzungsfeld steht wieder '''"&"''' der '''"/"''' im Ersetzungstext musste entwertet werden '''"\/"''' <br />
# Beispiel: Hier haben wir zum einem '''"\{ \}"''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier z.B. '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''"\( \)"''' das ist eine Gruppierung (ähnlich einer Variable) mit '''"\1" bis "\9"''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''"\3 \2 \1"'''<br />
<br />
<br />
<br />
<br />
=== Befehlsübersicht ===<br />
<br />
{| border=2<br />
|+ '''Übersicht der Befehle und Schlüsselworte'''<br />
! Kommando !! Addr !! stdin !! stdout !! Muster Speicher !! Halte Speicher !! Erklärung<br />
|-<br />
! <font color="red">;</font> || - || - || - || - || - <br />
|| Trennzeichen zwischen einzelner Befehle<br />
|-<br />
! <font color="red">!</font> || - || - || - || - || - <br />
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)<br />
|-<br />
! <font color="red">{ }</font> || 2 || - || - || - || - <br />
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden<br />
|-<br />
! <font color="red">#</font> || - || - || - || - || - <br />
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert<br />
|-<br />
! <font color="red">:</font> MARKE || - || - || - || - || - <br />
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''<br />
|-<br />
! <font color="red">=</font> || 2 || - || X || - || - <br />
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus<br />
|-<br />
! <font color="red">a</font> || 1 || - || X || - || - <br />
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus<br />
|-<br />
! <font color="red">b</font> MARKE || 2 || - || - || - || - <br />
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts<br />
|-<br />
! <font color="red">c</font> || 2 || - || X || X || - <br />
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben<br />
|-<br />
! <font color="red">d</font> || 2 || - || - || X || - <br />
|| Musterspeicher löschen<br />
|-<br />
! <font color="red">D</font> || 2 || - || - || X || - <br />
|| Musterspeicher bis zum Zeichen „newline“ löschen<br />
|-<br />
! <font color="red">g</font> || 2 || - || - || X || - <br />
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.<br />
|-<br />
! <font color="red">G</font> || 2 || - || - || X || - <br />
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt<br />
|-<br />
! <font color="red">h</font> || 2 || - || - || - || X <br />
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt<br />
|-<br />
! <font color="red">H</font> || 2 || - || - || - || X <br />
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt<br />
|-<br />
! <font color="red">i</font> || 1 || - || X || - || - <br />
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus<br />
|-<br />
! <font color="red">l</font> || 1 || - || X || - || -<br />
|| Musterspeicher ausgegeben. ("C-Notation" unbekannte Zeichen in Oktalformat)<br />
|-<br />
! <font color="red">n</font> || 2 || X || ? || X || - <br />
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden <br />
|-<br />
! <font color="red">N</font> || 2 || X || - || X || - <br />
|| Nächste Zeile an Inhalt des Musterspeichers angefügen<br />
|-<br />
! <font color="red">p</font> || 2 || - || X || - || - <br />
|| Musterspeicher ausgegeben.<br />
|-<br />
! <font color="red">P</font> || 2 || - || X || - || - <br />
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.<br />
|-<br />
! <font color="red">q</font> || 1 || - || - || - || - <br />
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben<br />
|-<br />
! <font color="red">r</font> FILE|| 1 || - || X || - || - <br />
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.<br />
|-<br />
! <font color="red">s</font>/regex/rpl/flg|| 2 || - || - || X || - <br />
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein<br />
|-<br />
! <font color="red">t</font> MARKE || 2 || - || - || - || - <br />
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos<br />
|-<br />
! <font color="red">w</font> FILE|| 2 || - || X || - || - <br />
|| Schreibt Musterspeicher in '''FILE'''<br />
|-<br />
! <font color="red">x</font> || 2 || - || - || X || X <br />
|| Inhalt von Muster- und Haltespeicher vertauschen<br />
|-<br />
! <font color="red">y</font>/src/rpc/flg|| 2 || - || - || X || - <br />
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''<br />
|}<br />
<br />
<br />
<br />
<br />
== kleine sed Programme am praktischen Beispiel erklärt ==<br />
<br />
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten. Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.<br />
Machen wir doch die Probe aufs Exempel: <br />
<br />
<br />
<br />
=== Beispiel 1 ===<br />
<br />
gefunden in '''/etc/rc.d/rpmconfigcheck'''<br />
sed -e 's/^/ /' < $configcheckfile<br />
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert<br />
* '''"^"''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. <br />
<br />
<br />
<br />
=== Beispiel 2 ===<br />
<br />
gefunden in '''/etc/rc.d/smbfs'''<br />
mountpoint=$( echo "$mountpoint"|sed "s/\/*$//")<br />
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert<br />
* '''"s/\/*$//"''' Trennzeichen ist '''"/"''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''"/"''' mit '''"\"''' entwertet <br />
* damit lautet unsere Suchmaske ohne Quotierung "'''/*$'''" und das ist schlichtweg als das letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''"/"''' ([https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren Quantoren]) <br />
gemeint<br />
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''"/"''' am Ende des Variableinhaltes abzuschneiden <br />
<br />
<br />
<br />
<br />
=== Beispiel 3 ===<br />
<br />
gefunden in '''/etc/rc.d/fbset'''<br />
mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`<br />
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert<br />
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. <br />
* die erste Regel ist ein s-Befehl, Suchmuster ist '''"^-[^ ]*"''' bedeutet Am Zeilenanfang '''"^"''' ein '''"-"''' und dann''' "[^ ]*"''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.<br />
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein, dann wird auch bis zum nächsten Leerzeichen nach dem Strich alles gelöscht. <br />
* der 2. Befehl arbeitet global, das heist es werden alle " -irgendwas" gelöscht.<br />
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem "-" aus dem Variabelinhalt zu beseitigen. <br />
<br />
<br />
<br />
<br />
=== Beispiel 4 ===<br />
<br />
gefunden in '''/etc/rc.d/network''' <br />
RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`<br />
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.<br />
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,<br />
*Dieses Mal ist das Begrenzungszeichen '''"="''' da es unmittelbar nach dem '''"s"''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''<br />
* als Flag haben wir ein '''"p"''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben<br />
* Suchmuster: am Anfang '''"id:"''' dann kommt [https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Vordefinierte_Zeichenklassen irgend ein Zeichen] das mit '''"\( \)"''' [https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierungen_und_R%C3%BCckw%C3%A4rtsreferenzen gruppiert] ist, und dann geht es weiter mit '''":initdefault"''' und anschließen alle Zeichen bis Zeilenende.<br />
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''"\1"''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierungen_und_R%C3%BCckw%C3%A4rtsreferenzen Rückwärtsreferenz]).<br />
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.<br />
<br />
<br />
<br />
<br />
=== Beispiel 5 ===<br />
<br />
gefunden in '''/etc/rc.d/xdm'''<br />
/etc/X11/xdm/SuSEconfig.xdm | \<br />
sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \<br />
/bin/logger<br />
<br />
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit "\" das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.<br />
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird dem Programm '''/bin/logger''' übergeben.<br />
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''"+"''' unmittelbar dem '''"s"''' folgt. <br />
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.<br />
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird "Alles" (beliebiges Zeichen, 0 mal oder beliebig oft)<br />
* ersetzt wird es durch "'''/etc/init.d/xdm: \1'''" , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.<br />
* das Flag '''"g"''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.<br />
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''"/etc/init.d/xdm: "''' einzufügen.<br />
<br />
<br />
<br />
<br />
=== Beispiel 6 ===<br />
<br />
gefunden in '''/usr/bin/texi2dvi4a2ps'''<br />
BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'<br />
<br />
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.<br />
* sed wird mit '''"-n"''' gestartet, also keine automatische Ausgabe jeder Zeile<br />
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''"p"''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. <br />
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''"\["''' ; dann kommt irgendetwas oder nichts '''".*"''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''"version "'''; Anschließend wird nach Zeichen im Format "XXXX-XX-XX" gesucht und irgendwas oder nichts kann bis Zeilenende kommen.<br />
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.<br />
* ersetzt wird die gesamte Zeile durch '''"txiformat=\1 txiversion="\2\3\4"''' die \1 \2 \3 \4 wird durch die Gruppen ersetzt.<br />
* der sed-Befehl formatiert also eine "Versionszeile" neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.<br />
<br />
<br />
<br />
<br />
=== Beispiel 7 (für Fortgeschrittene) ===<br />
<br />
gefunden in '''/usr/bin/autoconf'''<br />
echo X/"$0" |<br />
sed '/^.*\/\([^/][^/]*\)\/*$/{<br />
s//\1/<br />
q<br />
}<br />
/^X\/\(\/\/\)$/{<br />
s//\1/<br />
q<br />
}<br />
/^X\/\(\/\).*/{<br />
s//\1/<br />
q<br />
}<br />
s/.*/./; q'<br />
<br />
* hier wird '''"X/"''' vor '''"$0"''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.<br />
<br />
<br />
<br />
==== Analyse der Struktur ====<br />
<br />
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.<br />
/ADRESSE1/{<br />
s///<br />
q<br />
}<br />
/ADRESSE2/{<br />
s///<br />
q<br />
}<br />
/ADRESSE3/{<br />
s///<br />
q<br />
}<br />
s ; q<br />
* Den sed-Befehl '''"q"''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.<br />
* die Bedeutung, die '''"{ }"''' hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)<br />
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.<br />
<br />
<br />
<br />
<br />
==== Schauen wir uns zuerst die s-Befehle an ====<br />
<br />
* die ersten 3 s-Befehle sind gleich '''"s//\1/"''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''"\1"''' beim Ersetzen zu ?<br />
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, "fehlender Suchstring"<br />
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.<br />
* der letzte s-Befehl ist einfach '''"s/.*/./"''' ersetzt alles oder nichts durch einen einzigen Punk<br />
<br />
<br />
<br />
<br />
==== Analyse der Adressen ====<br />
<br />
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.<br />
::gesucht und gruppiert wird "ein mindestens 2 Zeichen langes Wort" Wortbegrenzer ist "/" gefunden wird die ganze Zeile.<br />
:: Achtung: hier "'''^.*\/'''" treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist. [https://learntutorials.net/de/regex/topic/429/gierige-und-faule-quantifizierer gieriges Verhalten] '''(Greediness of RegEx)'''<br />
:: gesucht wird am Zeilenanfang "irgendwas oder nichts bis ein '''"/"''' kommt" <br />
::: ist in der Shellvariable eine oder mehrere '''"/"''' (also das Programm mit dem Path aufgerufen,) dann wird hier als "irgendwas" der längst mögliche String gefunden <br />
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der "Scriptname ohne den Path" <br />
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. <br />
<br />
* ADRESSE2 '''"^X\/\(\/\/\)$"''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.<br />
:: sie sucht nach '''"X///"''' und gruppiert die letzten beiden '''"/"'''<br />
:: der s-Befehl würde also '''"//"''' ausgeben und sich beenden.<br />
<br />
* ADRESSE3 '''"^X\/\(\/\).*"''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''"/"''' weniger würde auch fündig werden bei vielen aneinandergereihten '''"/"''' und gibt nur ein '''"/"''' aus<br />
<br />
* Treffen keine der 3 Adressen zu, z.B. weil '''"$0"''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.<br />
<br />
<br />
<br />
==== Da ist noch ein kleiner Trick im Script versteckt ====<br />
<br />
Damit bei einer Leeren "$0" das sed-Programm überhaupt arbeiten kann, wird als Trick <br />
echo X/"$0"<br />
benutzt. Das vorangestellte '''"X/"''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programms.<br />
<br />
<br />
<br />
<br />
==== Das Ergebnis des gesamten sed-Programms ====<br />
<br />
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''"Scriptname ohne Path" ; "//" ; "/" oder "."'''<br />
<br />
<br />
-----<br />
<br />
== weiterführende Links ==<br />
<br />
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]<br />
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]<br />
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]<br />
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]<br />
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]<br />
<br />
<br />
<br />
<br />
-----<br />
<!-- ~~~~ --><br />
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]<br />
[[Kategorie:Konsole]][[Kategorie:Scripte]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Sed&diff=33102Sed2022-02-16T21:19:45Z<p>Robi: Link neu gesetzt</p>
<hr />
<div>SED - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug<br />
<br />
<br />
<br />
== Was ist sed und was kann sed ? ==<br />
<br />
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. <br />
<br />
<br />
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem "programmiertem Rezept" welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.<br />
<br />
<br />
sed wurde 1973/74 von [https://en.wikipedia.org/wiki/Lee_E._McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.<br />
<br />
<br />
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. <br />
sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'<br />
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.<br />
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]<br />
<br />
<br />
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) <br />
<br />
<br />
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.<br />
<br />
<br />
<br />
<br />
=== Für was benötigen wir sed heute ? ===<br />
<br />
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.<br />
<br />
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.<br />
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:<br />
<br />
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);<br />
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen<br />
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien<br />
<br />
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.<br><br />
<br />
<br />
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. <br />
<br />
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.<br />
<br />
== das Funktionsprinzip ==<br />
<br />
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.<br />
<br />
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt '''sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.<br />
<br />
<br />
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.<br />
<br />
<br />
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also "Print-Befehle" benutzen. Die Option bei Aufruf von '''sed''' dazu ist "'''-n'''".<br />
<br />
<br />
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.<br><br />
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten <!-- mit?bei --> Option '''-n''' ;-))<br />
<br />
<br />
<br />
<br />
<br />
=== was beinhaltet sed und was kann man damit machen ===<br />
<br />
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt z.B. den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:<br />
''<br />
* Musterspeicher durch Haltespeicher ersetzen <br />
* Haltespeicher durch Musterspeicher ersetzen<br />
* Inhalt von Halte- und Musterspeicher tauschen<br />
* Inhalt von Musterspeicher an den Haltespeicher anhängen <br />
* Inhalt von Haltespeicher an den Musterspeicher anhängen<br />
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' Er dient nur zum Zwischenspeichern.<br />
<br />
<br />
Und was geht jetzt mit dem Musterspeicher?<br><br />
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht z.B.:<br />
''<br />
* Musterspeicher löschen<br />
* die nächste Zeile einlesen<br />
* die nächste Zeile hinten hinzufügen<br />
* Musterspeicher nach stdout ausgeben<br />
* Inhalte mit dem Haltespeicher austauschen<br />
* den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben<br />
* oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben<br />
* den Musterspeicher in eine Datei schreiben<br />
* Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht <br />
* einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])<br />
* und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''<br />
<br />
<br />
; Variablen ?<br />
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts<br><br />
; Schleifen ?<br />
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch<br> <br />
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.<br />
<br />
<br />
<br />
<br />
<br />
=== wie kann man damit Probleme lösen ===<br />
<br />
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?<br />
<br />
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''"suchen und ersetzen"''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdrücken]] sehr mächtig, ''([[#der s-Befehl|weiter unten, spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier z.B. auch ''"eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen"''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, z.B.: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. <br><br />
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''<br />
<br />
<br />
Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden. Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logik selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit '''sed''' anzugehen.<br><br />
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und das nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden. Der Unterschied ist: die CPU arbeitet mit Registern einer definierten Bit Breite und '''sed''' arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir z.B.. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logik, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. <br><br />
<br />
<br />
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. <br><br />
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).<br />
<br> Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logik], das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.<br><br />
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.<br />
<br />
== der Aufruf und die Optionen von sed ==<br />
<br />
=== die Optionen ===<br />
<br />
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und '''-f'''<br />
<br />
; sed -e REGEL:<br />
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) <br />
; sed -f REGELDATEI:<br />
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.<br />
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :<br />
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. <br />
<br />
<br />
<br />
=== der Aufruf ===<br />
<br />
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können<br />
<pre><br />
BEFEHL | sed -e 'REGEL' > AUSGABEDATEI<br />
<br />
sed -n -e 'REGEL' EINGABEDATEI > AUSGABEDATEI<br />
<br />
BEFEHL | sed -f REGELDATEI | BEFEHL<br />
<br />
sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' <EINGABEDATEI >AUSGABEDATEI<br />
<br />
VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` <br />
</pre><br />
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. <br />
<pre>sed -ne '<br />
BEFEHL1\<br />
Optionen zum BEFEHL1\<br />
weitere Optionen<br />
; BEFEHL2 ; BEFEHL3\<br />
Optionen zum BEFEHL3<br />
; BEFEHL4 ; BEFEHL5<br />
'</pre><br />
<br />
<br />
<br />
==== sed-Programm als Script ====<br />
<br />
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]<br />
#!/usr/bin/sed -f <br />
(eventuell noch zusätzlich die Option '''-n''') gesetzt.<br><br />
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.<br />
<br />
<br />
<br />
<br />
==== Übergabe von Shell-Variablen an Sed-Programme ====<br />
<br />
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.<br />
<br />
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell<br />
#!/bin/bash<br />
<br />
sed -n '<br />
'/$1/' !{<br />
#no match - put the current line in the hold buffer<br />
x<br />
# delete the old one, which is <br />
# now in the pattern buffer<br />
d<br />
}'<br />
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung<br><br />
<font face="Arial" size="4"><br><br />
'''<font color="red">'</font><font color="blue">/$1/</font><font color="red">'</font>!{ '''<br><br />
</font><br><br />
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''<br />
<br />
<br />
<br />
<br />
<br />
==== Nutzung von sed in Here-Dokuments's ====<br />
<br />
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]<br />
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.<br />
<pre><br />
#!/bin/bash<br />
KASSE=129.32<br />
WAEHRUNG="EURO"<br />
MITARBEITER="Hr. Maier"<br />
<br />
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'"$WAEHRUNG"'/g;s/ZZZZ/'"$MITARBEITER"'/g' <<EOF<br />
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt<br />
verantwortlich ist wie immer ZZZZ<br />
EOF<br />
</pre><br />
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.<br />
<pre>Der Bargeldbestand von 129.32 EURO wurde heute festgestellt<br />
verantwortlich ist wie immer Hr. Maier</pre> <br />
<br />
<br />
<br />
<br />
== die Befehle ==<br />
<br />
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)<br />
* p = '''p'''rint<br />
* l = '''l'''ist<br />
* i = '''i'''insert<br />
* a = '''a'''pend<br />
*usw<br />
<br />
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. <br />
<br />
<br />
<br />
<br />
=== Adressierung der Befehle ===<br />
<br />
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können z.B. mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen. Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also "alle Anderen außer den adressierten Zeilen" treffen zu )<br />
<br />
<br />
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt<br />
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen<br />
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1 bis zur Adresse2'''<br />
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (z.B. '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) <br />
<br />
<br />
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln<br />
<br />
<br />
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei<br />
* Eine Adresse kann ein Regulären Ausdruck sein '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)<br />
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei<br />
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt <br />
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich<br />
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile<br />
* Zeilenberechnungen mit Zeilennummern wie z.B. '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht <br />
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' <br />
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen. <br />
<br />
<br />
<br />
<br />
==== Beispiele für Adressierung ====<br />
<br />
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''<br />
<pre><br />
sed -ne '1,10p' # Zeilen 1 bis 10 ausgeben<br />
sed -e '1,10p' # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben<br />
sed -e '2d' # 2. Zeile löschen<br />
sed -e '2,10!d' # Zeilen 2 bis 10 ausgeben<br />
sed -ne '2,10p' # Zeilen 2 bis 10 ausgeben<br />
sed -e '10,$p' # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben<br />
sed -ne '$p' # letzte Zeile ausgeben<br />
<br />
sed -e '/Text/d' # Alle Zeilen die nicht "Text" enthalten, ausgeben<br />
sed -e '/Text/!d' # Alle Zeilen die "Text" enthalten, ausgeben<br />
sed -ne '/Text/,$!p' # Alle Zeilen bevor eine Zeile mit "Text" kommt, ausgeben<br />
sed -ne '/Begin/,/END/p' # Alle Zeilen von "Begin" bis "END" ausgeben (wird "END" nicht gefunden bis Schluss)<br />
# Kommt nach einem "END" wieder ein "Begin" dann von dort aus wieder ausgeben </pre><br />
<br />
<br />
<br />
<br />
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind<br />
<pre><br />
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen<br />
sed -ne '3~2p' # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )<br />
sed -ne '5,/Text/p' # Ab der 5.Zeile bis zu einer Zeile mit "Text" ausgeben<br />
sed -ne '3,+7p' # Die 3.Zeile und die 7 folgenden Zeilen ausgeben<br />
sed -ne '/Begin/,+2p' # Die Zeilen die "Begin" enthalten und jeweils die nächsten 2 Zeilen ausgeben<br />
</pre><br />
<br />
<br />
<br />
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr <br />
<pre><br />
sed -ne '/^[EBH]/p' # alle Zeilen die mit "E","B" oder "H" beginnen ausgeben<br />
sed -e '/^$/d' # alle leeren Zeilen löschen<br />
sed -ne '/^[^#].*/p' # jede Zeile ausgeben, die mit einem anderem Zeichen als "#" beginnt<br />
sed -ne '/^[[:space:]]*#/d' # Zeilen deren erstes Zeichen (außer Space und Tabulator) "#" ist, löschen<br />
sed -ne '/^.\{64\}/p' # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben<br />
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'<br />
# druckt jede Zeile in der eine IP-Adresse enthalten sein könnte<br />
</pre><br />
<br />
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.<br />
<br />
<br />
Um z.B. alle fehlerfreien Zeilen zu suchen, die einen Zeitstring '''YYYY-MM-DD''' entsprechen wie ihn z.B. auch '''date +%F''' liefert, müsste man mit '''sed''' wie folgt adressieren. Hier mal gleich der Konsolausdruck. ;-)<br />
<pre><br />
LINUX: # cat test1<br />
2008-10-02<br />
2008-03-19<br />
2007-09-01<br />
2006-07-28<br />
2008-10-05<br />
2007-13-01<br />
2006-06-31<br />
2008-30-02<br />
2005-02-29<br />
2006-11-31<br />
2008-00-02<br />
2004-02-29<br />
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1<br />
2008-10-02<br />
2008-03-19<br />
2007-09-01<br />
2006-07-28<br />
2008-10-05<br />
2004-02-29<br />
LINUX: # <br />
</pre><br />
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [http://regexp-evaluator.de/evaluator/ Tools] und jede Menge gute Seiten im WWW.<br />
<br />
<br />
<br />
<br />
==== ein paar Regeln zu Regulären Ausdrücken in sed ====<br />
<br />
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige Regeln<br><br />
'''sed''' verwendet '''"Basic Regular Expressions"''' einige Unterschiede zu den '''"Erweiterten Regulären Ausdrücken"''' sind z.B.:<br />
<br />
<br />
* Die Quantifikatoren "'''|'''", "'''+'''" und "'''?'''" sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash "escaped" werden)''<br />
<br />
* die Klammern '''"{" "}" "(" ''' und ''' ")"''' sind normale Zeichen und müssen mit Backslashes "escaped" (aktiviert) werden, also als "'''\{'''" ; "'''\}'''" ; "'''\('''" und "'''\)'''"geschrieben werden. <br />
<br />
* die Zeichen, die durch "'''\('''" und "'''\)'''" eingeschlossen werden, können später mit "'''\1'''" usw. (max "'''\9'''" ) dereferenziert werden<br />
<br />
* "'''^'''" ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht<br />
<br />
* "'''$'''" ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht<br />
<br />
* "'''*'''" ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen<br />
<br />
<br />
<br />
<br />
=== der s-Befehl ===<br />
<br />
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''"s///"'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit "suchen und ersetzen" erklärt. Die Schreibweise: <br> <br />
<font face="Arial" size="6"><br><br />
[ADRESSE]<font color="red">'''s/'''</font>SUCHMUSTER<font color="red">'''/'''</font>ERSETZUNG<font color="red">'''/'''</font>[FLAG] <br><br />
</font><br />
<br />
<br />
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet<br />
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#Adressierung der Befehle|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.<br />
* '''s''' ist der Befehlsname selbst<br />
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird<br />
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.<br />
* Als Abrenzung der einzelnen Optionen sind 3 '''"/"''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''"/"''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''<br />
<br />
<br />
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.<br />
sed -e 's/Strauch/Baum/g'<br />
; Erläuterung<br />
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet<br />
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''"Strauch"'''<br />
: * Der Ersetzungtext ist '''"Baum"'''<br />
: * als Flag wird '''"global"''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.<br />
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.<br />
<br />
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination "Strauch" durch "Baum" ersetzt, also nicht nur das Wort Strauch selbst, sonder z.B. würde aus dem Wort "Strauchdieb" das Wort "Baumdieb"<br />
<br />
<br />
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann. <br />
<br />
<br />
<br />
<br />
<br />
<br />
==== die Bedeutung der Flags ====<br />
<br />
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings<br />
<br />
{| border=1<br />
|+ '''Bedeutung der Flags beim s-Befehl '''<br />
! Flag !! Bedeutung !! Beispiel !! Bemerkung<br />
|- <br />
!| N <br />
|| N=Zahl (1 < 512) ; das N'te Vorkommen <br />
!| s/AB/CD/2 <br />
|| wird N nicht angegeben dann erste Vorkommen <br />
|- <br />
!| g <br />
|| global ; alle Vorkommen <br />
!| s/AB/CD/g <br />
|| es werden alle Vorkommen ersetzt <br />
|- <br />
!| p <br />
|| print ; Ausgabe bei Ersetzung <br />
!| s/AB/CD/p <br />
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben <br />
|- <br />
!| w DATEI <br />
|| write DATEI bei Ersetzung <br />
!| s/AB/CD/w FILE<br />
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei<br />
|- <br />
!| i <br />
|| case-insensitive ; Groß-Kleinschreibung ignorieren <br />
!| s/AB/CD/i <br />
|| ist <font color="red">nicht kompatibel</font> zu allen SED-Implementierungen<br />
|- <br />
!| m <br />
|| || <br />
|| betrifft Interpretation von '''^ '''und''' $''' ; <font color="red">nicht kompatibel</font> <br />
|- <br />
!| x <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|-<br />
!| s <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|}<br />
es ist auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. z.B.<br />
<pre><br />
LINUX: # echo "abcabcabc" | sed -ne 's/AB/CD/2ip'<br />
abcCDcabc<br />
LINUX: # </pre><br />
<br />
<br />
<br />
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====<br />
<pre><br />
sed -e 's/blau\|lila/rot/2' # Das 2.Vorkommen je Zeile von "blau" oder "lila" wird durch "rot" ersetzt<br />
<br />
sed -e '/^$/!s/^/#/ ' # bei alle nichtleeren Zeilen am Zeilenanfang "#" einfügen<br />
<br />
sed -e 's/#.*$//' # von einem Zeichen "#" bis zum Zeilenende alles löschen<br />
<br />
sed 's/^[ \t]*//;s/[ \t]*$//' # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen<br />
<br />
sed -e 's/Michael[^a]/Herr &/' # ersetze "Michael" durch "Herr Michael" jedoch nicht wenn hinter "Michael" ein "a" folgt.<br />
<br />
sed -e 's/[Cc]olor/[b]&[\/b]/g' # jedes "Color" und "color" in "[b]Color[/b]" oder "[b]color[/b]" änderen<br />
<br />
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'<br />
#das Datumsformat YYYY-MM-DD umwandeln zu "heute ist der DD.MM. YYYY"<br />
</pre><br />
'''Besonderheiten der Beispiele'''<br><br />
<br />
# Beispiel: es wird eine Oderverknüpfung benutzt '''|''' muss dabei entwertet werden also '''\|'''<br />
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende<br />
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''<br />
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''"*"''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''";"''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. <br />
# Beispiel: '''[^a]''' das '''"a"''' ist durch '''"^"''' negiert, das Bedeutet ('''nicht "a"''') an dieser Stelle, das '''"&"''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.<br />
# Beispiel: Im Ersetzungsfeld steht wieder '''"&"''' der '''"/"''' im Ersetzungstext musste entwertet werden '''"\/"''' <br />
# Beispiel: Hier haben wir zum einem '''"\{ \}"''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier z.B. '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''"\( \)"''' das ist eine Gruppierung (ähnlich einer Variable) mit '''"\1" bis "\9"''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''"\3 \2 \1"'''<br />
<br />
<br />
<br />
<br />
=== Befehlsübersicht ===<br />
<br />
{| border=2<br />
|+ '''Übersicht der Befehle und Schlüsselworte'''<br />
! Kommando !! Addr !! stdin !! stdout !! Muster Speicher !! Halte Speicher !! Erklärung<br />
|-<br />
! <font color="red">;</font> || - || - || - || - || - <br />
|| Trennzeichen zwischen einzelner Befehle<br />
|-<br />
! <font color="red">!</font> || - || - || - || - || - <br />
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)<br />
|-<br />
! <font color="red">{ }</font> || 2 || - || - || - || - <br />
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden<br />
|-<br />
! <font color="red">#</font> || - || - || - || - || - <br />
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert<br />
|-<br />
! <font color="red">:</font> MARKE || - || - || - || - || - <br />
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''<br />
|-<br />
! <font color="red">=</font> || 2 || - || X || - || - <br />
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus<br />
|-<br />
! <font color="red">a</font> || 1 || - || X || - || - <br />
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus<br />
|-<br />
! <font color="red">b</font> MARKE || 2 || - || - || - || - <br />
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts<br />
|-<br />
! <font color="red">c</font> || 2 || - || X || X || - <br />
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben<br />
|-<br />
! <font color="red">d</font> || 2 || - || - || X || - <br />
|| Musterspeicher löschen<br />
|-<br />
! <font color="red">D</font> || 2 || - || - || X || - <br />
|| Musterspeicher bis zum Zeichen „newline“ löschen<br />
|-<br />
! <font color="red">g</font> || 2 || - || - || X || - <br />
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.<br />
|-<br />
! <font color="red">G</font> || 2 || - || - || X || - <br />
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt<br />
|-<br />
! <font color="red">h</font> || 2 || - || - || - || X <br />
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt<br />
|-<br />
! <font color="red">H</font> || 2 || - || - || - || X <br />
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt<br />
|-<br />
! <font color="red">i</font> || 1 || - || X || - || - <br />
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus<br />
|-<br />
! <font color="red">l</font> || 1 || - || X || - || -<br />
|| Musterspeicher ausgegeben. ("C-Notation" unbekannte Zeichen in Oktalformat)<br />
|-<br />
! <font color="red">n</font> || 2 || X || ? || X || - <br />
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden <br />
|-<br />
! <font color="red">N</font> || 2 || X || - || X || - <br />
|| Nächste Zeile an Inhalt des Musterspeichers angefügen<br />
|-<br />
! <font color="red">p</font> || 2 || - || X || - || - <br />
|| Musterspeicher ausgegeben.<br />
|-<br />
! <font color="red">P</font> || 2 || - || X || - || - <br />
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.<br />
|-<br />
! <font color="red">q</font> || 1 || - || - || - || - <br />
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben<br />
|-<br />
! <font color="red">r</font> FILE|| 1 || - || X || - || - <br />
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.<br />
|-<br />
! <font color="red">s</font>/regex/rpl/flg|| 2 || - || - || X || - <br />
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein<br />
|-<br />
! <font color="red">t</font> MARKE || 2 || - || - || - || - <br />
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos<br />
|-<br />
! <font color="red">w</font> FILE|| 2 || - || X || - || - <br />
|| Schreibt Musterspeicher in '''FILE'''<br />
|-<br />
! <font color="red">x</font> || 2 || - || - || X || X <br />
|| Inhalt von Muster- und Haltespeicher vertauschen<br />
|-<br />
! <font color="red">y</font>/src/rpc/flg|| 2 || - || - || X || - <br />
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''<br />
|}<br />
<br />
<br />
<br />
<br />
== kleine sed Programme am praktischen Beispiel erklärt ==<br />
<br />
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten. Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.<br />
Machen wir doch die Probe aufs Exempel: <br />
<br />
<br />
<br />
=== Beispiel 1 ===<br />
<br />
gefunden in '''/etc/rc.d/rpmconfigcheck'''<br />
sed -e 's/^/ /' < $configcheckfile<br />
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert<br />
* '''"^"''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. <br />
<br />
<br />
<br />
=== Beispiel 2 ===<br />
<br />
gefunden in '''/etc/rc.d/smbfs'''<br />
mountpoint=$( echo "$mountpoint"|sed "s/\/*$//")<br />
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert<br />
* '''"s/\/*$//"''' Trennzeichen ist '''"/"''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''"/"''' mit '''"\"''' entwertet <br />
* damit lautet unsere Suchmaske ohne Quotierung "'''/*$'''" und das ist schlichtweg als letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''"/"''' ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren_.28Angabe_der_Anzahl_Wiederholungen.29 Quantoren]) <br />
gemeint<br />
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''"/"''' am Ende des Variableinhaltes abzuschneiden <br />
<br />
<br />
<br />
<br />
=== Beispiel 3 ===<br />
<br />
gefunden in '''/etc/rc.d/fbset'''<br />
mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`<br />
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert<br />
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. <br />
* die erste Regel ist ein s-Befehl, Suchmuster ist '''"^-[^ ]*"''' bedeutet Am Zeilenanfang '''"^"''' ein '''"-"''' und dann''' "[^ ]*"''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.<br />
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein, dann wird auch bis zum nächsten Leerzeichen nach dem Strich alles gelöscht. <br />
* der 2. Befehl arbeitet global, das heist es werden alle " -irgendwas" gelöscht.<br />
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem "-" aus dem Variabelinhalt zu beseitigen. <br />
<br />
<br />
<br />
<br />
=== Beispiel 4 ===<br />
<br />
gefunden in '''/etc/rc.d/network''' <br />
RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`<br />
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.<br />
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,<br />
*Dieses Mal ist das Begrenzungszeichen '''"="''' da es unmittelbar nach dem '''"s"''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''<br />
* als Flag haben wir ein '''"p"''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben<br />
* Suchmuster: am Anfang '''"id:"''' dann kommt [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Beliebiges_Zeichen irgend ein Zeichen] das mit '''"\( \)"''' [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern gruppiert] ist, und dann geht es weiter mit '''":initdefault"''' und anschließen alle Zeichen bis Zeilenende.<br />
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''"\1"''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern Rückwärtsreferenz]).<br />
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.<br />
<br />
<br />
<br />
<br />
=== Beispiel 5 ===<br />
<br />
gefunden in '''/etc/rc.d/xdm'''<br />
/etc/X11/xdm/SuSEconfig.xdm | \<br />
sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \<br />
/bin/logger<br />
<br />
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit "\" das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.<br />
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird dem Programm '''/bin/logger''' übergeben.<br />
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''"+"''' unmittelbar dem '''"s"''' folgt. <br />
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.<br />
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird "Alles" (beliebiges Zeichen, 0 mal oder beliebig oft)<br />
* ersetzt wird es durch "'''/etc/init.d/xdm: \1'''" , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.<br />
* das Flag '''"g"''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.<br />
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''"/etc/init.d/xdm: "''' einzufügen.<br />
<br />
<br />
<br />
<br />
=== Beispiel 6 ===<br />
<br />
gefunden in '''/usr/bin/texi2dvi4a2ps'''<br />
BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'<br />
<br />
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.<br />
* sed wird mit '''"-n"''' gestartet, also keine automatische Ausgabe jeder Zeile<br />
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''"p"''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. <br />
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''"\["''' ; dann kommt irgendetwas oder nichts '''".*"''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''"version "'''; Anschließend wird nach Zeichen im Format "XXXX-XX-XX" gesucht und irgendwas oder nichts kann bis Zeilenende kommen.<br />
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.<br />
* ersetzt wird die gesamte Zeile durch '''"txiformat=\1 txiversion="\2\3\4"''' die \1 \2 \3 \4 wird durch die Gruppen ersetzt.<br />
* der sed-Befehl formatiert also eine "Versionszeile" neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.<br />
<br />
<br />
<br />
<br />
=== Beispiel 7 (für Fortgeschrittene) ===<br />
<br />
gefunden in '''/usr/bin/autoconf'''<br />
echo X/"$0" |<br />
sed '/^.*\/\([^/][^/]*\)\/*$/{<br />
s//\1/<br />
q<br />
}<br />
/^X\/\(\/\/\)$/{<br />
s//\1/<br />
q<br />
}<br />
/^X\/\(\/\).*/{<br />
s//\1/<br />
q<br />
}<br />
s/.*/./; q'<br />
<br />
* hier wird '''"X/"''' vor '''"$0"''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.<br />
<br />
<br />
<br />
==== Analyse der Struktur ====<br />
<br />
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.<br />
/ADRESSE1/{<br />
s///<br />
q<br />
}<br />
/ADRESSE2/{<br />
s///<br />
q<br />
}<br />
/ADRESSE3/{<br />
s///<br />
q<br />
}<br />
s ; q<br />
* Den sed-Befehl '''"q"''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.<br />
* die Bedeutung, die '''"{ }"''' hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)<br />
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.<br />
<br />
<br />
<br />
<br />
==== Schauen wir uns zuerst die s-Befehle an ====<br />
<br />
* die ersten 3 s-Befehle sind gleich '''"s//\1/"''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''"\1"''' beim Ersetzen zu ?<br />
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, "fehlender Suchstring"<br />
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.<br />
* der letzte s-Befehl ist einfach '''"s/.*/./"''' ersetzt alles oder nichts durch einen einzigen Punk<br />
<br />
<br />
<br />
<br />
==== Analyse der Adressen ====<br />
<br />
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.<br />
::gesucht und gruppiert wird "ein mindestens 2 Zeichen langes Wort" Wortbegrenzer ist "/" gefunden wird die ganze Zeile.<br />
:: Achtung: hier "'''^.*\/'''" treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist.[http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten gieriges Verhalten] '''(Greediness of RegEx)'''<br />
:: gesucht wird am Zeilenanfang "irgendwas oder nichts bis ein '''"/"''' kommt" <br />
::: ist in der Shellvariable eine oder mehrere '''"/"''' (also das Programm mit dem Path aufgerufen,) dann wird hier als "irgendwas" der längst mögliche String gefunden <br />
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der "Scriptname ohne den Path" <br />
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. <br />
<br />
* ADRESSE2 '''"^X\/\(\/\/\)$"''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.<br />
:: sie sucht nach '''"X///"''' und gruppiert die letzten beiden '''"/"'''<br />
:: der s-Befehl würde also '''"//"''' ausgeben und sich beenden.<br />
<br />
* ADRESSE3 '''"^X\/\(\/\).*"''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''"/"''' weniger würde auch fündig werden bei vielen aneinandergereihten '''"/"''' und gibt nur ein '''"/"''' aus<br />
<br />
* Treffen keine der 3 Adressen zu, z.B. weil '''"$0"''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.<br />
<br />
<br />
<br />
==== Da ist noch ein kleiner Trick im Script versteckt ====<br />
<br />
Damit bei einer Leeren "$0" das sed-Programm überhaupt arbeiten kann, wird als Trick <br />
echo X/"$0"<br />
benutzt. Das vorangestellte '''"X/"''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programms.<br />
<br />
<br />
<br />
<br />
==== Das Ergebnis des gesamten sed-Programms ====<br />
<br />
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''"Scriptname ohne Path" ; "//" ; "/" oder "."'''<br />
<br />
<br />
-----<br />
<br />
== weiterführende Links ==<br />
<br />
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]<br />
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]<br />
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]<br />
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]<br />
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]<br />
<br />
<br />
<br />
<br />
-----<br />
<!-- ~~~~ --><br />
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]<br />
[[Kategorie:Konsole]][[Kategorie:Scripte]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Anmelden_im_Wiki&diff=33092Anmelden im Wiki2022-02-09T22:06:12Z<p>Robi: Hinweise für aktuell mögliche Probleme bei Anmeldung und Neuanmeldung</p>
<hr />
<div>{{Box Achtung||<br />
Das gesamte Linupedia Wiki ist umgezogen, damit verbunden waren eine ganze Reihe von Software Updates und Reparaturen, welche noch nicht alle abgeschlossen sind.<br><br />
Dadurch bedingt kann es aktuell immer noch noch zu kleinen Problemen zB. mit Anmeldungen und Neuanmeldungen kommen. Wir sind bestrebt alles so schnell als möglich wieder einen stabilen Zustand zu versetzen und bitten für eventuelle Probleme, um etwas Nachsicht. Hier ein paar Hinweise.<br />
}}<br />
<br />
===Muss man sich im Wiki anmelden?===<br />
<br />
Wer im Wiki nur lesen möchte, muss sich natürlich nicht anmelden.<br />
Wer im Wiki Artikel schreiben oder vorhandene Artikel editieren möchte, der muss sich jedoch mit Benutzername und Passwort im Wiki anmelden. Nur angemeldete Benutzer können im Wiki schreiben. Neuanmeldungen können derzeit nicht direkt im Wiki selbst gemacht werden, siehe weiter unten.<br />
<br />
<br />
===Registrierte Benutzer===<br />
<br />
Oben rechts gibt es einen Button, der „Anmelden“ heißt, hier tippst Du drauf. Danach gibst Du Deinen Benutzernamen und Dein Passwort ein.<br><br />
Eventuell findest du die Anmeldung oben rechts im Submenu des User '''Anonym'''. <br><br />
Die gesamte Wikiplattform ist aktuell umgezogen, und wird derzeit noch neu aufgebaut. Hier besteht die Möglichkeit, dass dein altes Passwort eventuell nicht mehr der aktuellen Passwortpolicy entspricht, in diesem Fall wirst du nach erfolgreicher Anmeldung sofort aufgefordert, ein neues.<br />
Passwort einzugeben. <br><br />
Solltest du ein registrierter Benutzer sein, aber das alte Passwort nicht mehr bekannt sein, kannst dir ein temporäres Passwort per Mail zukommen lassen. Dazu ist aber Vorraussetzung, dass die im Wiki eine Mailaddresse hinterlegt ist. Teilweise sind die Userkonten schon über 15 Jahre alt, Mailaddresse ist eventuell gar keine hinterlegt, oder seit Jahren nicht mehr geprüft worden.<br />
Wenn es hier Probleme gibt, wende dich bitte an einen der [https://linux-club.de/forum/memberlist.php?mode=group&g=6998 Moderatoren] vom Forum.<br />
<br />
<br />
===Neuanmeldungen===<br />
<br />
Neue Benutzer (User) werden vorläufig auf Nachfrage oder Wunsch erstellt. Dieses ist temporär, da aktuell noch nicht alles Sicherheits Maßnahmen installiert sind. Später soll sich jeder User auch wieder selbst registrieren können.<br><br />
Keine Angst, wir benötigen dazu keine Bewerbung und keinen Lebenslauf oder sonstige Befähigungsnachweise. Es reicht eine PN (persönliche Mitteilung) an einen der [https://linux-club.de/forum/memberlist.php?mode=group&g=6998 Moderatoren] (nur für registrierte/angemeldete Benutzer des LC aufrufbar) im [http://www.linux-club.de Linux-Club]; oder wohl schneller ist es, im Forum einen kleinen entsprechenden Beitrag zu erstellen.<br />
Folgendes würde schon ausreichen:<br />
„Bitte mich als neuen User *WUNSCH_NAME* in die Linupedia eintragen“.<br />
Dazu ist, zur Zeit, eine Anmeldung im [http://www.linux-club.de Linux-Club] notwendig, da sonst weder eine PN geschrieben, noch ein Beitrag im [http://www.linux-club.de Linux-Club] erstellt werden kann. Die Bestätigung und ein temporäres Passwort würde euch dann schnellstens per PN zukommen.<br />
<br />
<br />
<!-- ==Probleme beim Anmelden==<br />
Wenn bestimmte Zeichen wie Umlaute oder der Unterstrich "_" im Benutzernamen vorkommen, funktioniert die Anmeldung nicht. Es kommt stattdessen eine Meldung, die besagt, daß kein Benutzername eingegeben wurde, was natürlich Unsinn ist. Das Problem kann man dadurch umgehen, indem man im Forum über [http://www.linux-club.de/profile.php?mode=editprofile Profil] die entsprechenden Zeichen aus dem Benutzernamen entfernt. Ursache ist, das Forum und Wiki verschiedene Zeichenkodierungen in ihrer Datenbank verwenden. --><br />
<br />
<br />
[[Hilfe:Inhaltsverzeichnis|Zurück zur Hilfe]]<br />
<br />
[[Hauptseite|Zurück zur Startseite]]<br />
<br />
[[Kategorie:LinuxClubWiki_Hilfe]][[Kategorie:Linupedia]][[Kategorie:LinuxClubWiki]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=LinuxClubWiki:Spielwiese&diff=33089LinuxClubWiki:Spielwiese2022-02-07T21:04:06Z<p>Robi: Test : Table sortable</p>
<hr />
<div>'''Die Spielwiese dient zum Ausprobieren für Wiki-Newbies''' --[[Benutzer:Yehudi|Yehudi]] 15:11, 18. Okt 2006 (CEST)<br />
[[Category:LinuxClubWiki]]<br />
* http://de.wikipedia.org/wiki/Vorlage:Bitte_erst_NACH_dieser_Zeile_schreiben%21_%28Begr%C3%BC%C3%9Fungskasten%29 wäre eine Vorlage.<br />
<br />
<br />
== Tabellenspiele ==<br />
=== Tabelle 1 erstellt mit Openoffice ===<br />
(Table-of-Content mal rechts erwzungen eingefügt){{TOC-BOX-Rechts|30%}}<br />
{| class="prettytable"<br />
| ee<br />
| ff<br />
|-<br />
| gg<br />
| hh<br />
<br />
|}<br />
''Tabelle 1: class="prettytable"''<br />
<br />
<br />
=== Tabelle 2 = Tabelle 1 editiert ===<br />
{| border=1<br />
| ee<br />
| ff<br />
|-<br />
| gg<br />
| hh<br />
<br />
|}<br />
''Tabelle 2: border=1"''<br />
<br />
=== Tabelle 3: Testtabelle, die noch nicht so funktioniert, wie sie soll ===<br />
{| class="prettytable"<br />
|-class="hintergrundfarbe5"<br />
! Name || Regierungszeit || Abstammung<br />
|-<br />
| [[Stephan II. (Bayern)|Stephan&nbsp;II.]] || <tt>1347–1375</tt>Herzog von Bayern || Sohn Kaiser Ludwigs&nbsp;IV.<br />
|-<br />
| [[Friedrich der Weise (Bayern)|Friedrich]] || <tt>1375–1393</tt> Herzog von Bayern-Landshut || Sohn Stephans&nbsp;II.<br />
|-<br />
| [[Heinrich XVI. (Bayern)|Heinrich&nbsp;XVI.]] || <tt>1393–1450</tt> Herzog von Bayern-Landshut || Sohn Friedrichs<br />
|-<br />
| [[Ludwig IX. (Bayern)|Ludwig&nbsp;IX.]] || <tt>1450–1479</tt> Herzog von Bayern-Landshut || Sohn Heinrichs&nbsp;XVI.<br />
|-<br />
| [[Georg (Bayern)|Georg]] || <tt>1479–1503</tt> Herzog von Bayern-Landshut || Sohn Ludwigs&nbsp;IX.<br />
|}<br />
''Tabelle 3: Testtabelle von hier: http://de.wikipedia.org/wiki/Hilfe:Tabellen<br />
<br />
=== Tabelle 4: Veränderte Tabelle 3 ===<br />
{|border=1| class="prettytable"<br />
|-style="background-color:#FF8080;"<br />
! Name || Regierungszeit || Abstammung<br />
|-<br />
| [[Stephan II. (Bayern)|Stephan&nbsp;II.]] || <tt>1347–1375</tt>Herzog von Bayern || Sohn Kaiser Ludwigs&nbsp;IV.<br />
|-<br />
| [[Friedrich der Weise (Bayern)|Friedrich]] || <tt>1375–1393</tt> Herzog von Bayern-Landshut || Sohn Stephans&nbsp;II.<br />
|-<br />
| [[Heinrich XVI. (Bayern)|Heinrich&nbsp;XVI.]] || <tt>1393–1450</tt> Herzog von Bayern-Landshut || Sohn Friedrichs<br />
|-<br />
| [[Ludwig IX. (Bayern)|Ludwig&nbsp;IX.]] || <tt>1450–1479</tt> Herzog von Bayern-Landshut || Sohn Heinrichs&nbsp;XVI.<br />
|-<br />
| [[Georg (Bayern)|Georg]] || <tt>1479–1503</tt> Herzog von Bayern-Landshut || Sohn Ludwigs&nbsp;IX.<br />
|}<br />
''Tabelle 4: Testtabelle von hier: http://de.wikipedia.org/wiki/Hilfe:Tabellen mit Änderungen<br />
<br />
<br />
<br />
=== Ubuntu Tabelle ===<br />
Hier nochmal eine farbige Tabelle als Vorlage und Spielwiese:<br />
<br />
{|border=1 |class="prettytable"<br />
|+ '''Versionen von Ubuntu im Überblick'''<br />
|-----<br />
!- style="background-color:#ececec;" | Version <br />
!- style="background-color:#ececec;" | Codename <br />
!- style="background-color:#ececec;" | Veröffentlichung <br />
!- style="background-color:#ececec;" | Bemerkung<br />
|-<br />
|style="background-color:#FF8080;"| 4.10 ||style="background-color:#FF8080;"| Warty Warthog ||style="background-color:#FF8080;"| 20.10.2004 ||style="background-color:#FF8080;"| Nicht mehr unterstützt!<br />
|-<br />
|style="background-color:#FF8080;"| 5.04 ||style="background-color:#FF8080;"| Hoary Hedgehog ||style="background-color:#FF8080;"| 08.04.2005 ||style="background-color:#FF8080;"| Nicht mehr unterstützt!<br />
|-<br />
|style="background-color:#FF8080;"| 5.10 ||style="background-color:#FF8080;"| Breezy Badger ||style="background-color:#FF8080;"|13.10.2005 ||style="background-color:#FF8080;"| Nicht mehr unterstützt!<br />
|-<br />
|style="background-color:#B3B7FF;"| 6.06 ||style="background-color:#B3B7FF;"| Dapper Drake ||style="background-color:#B3B7FF;"| 01.06.2006 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#B3B7FF;"| 6.06.1 ||style="background-color:#B3B7FF;"| Dapper Drake Point One ||style="background-color:#B3B7FF;"| 10.08.2006 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#B3B7FF;"| 6.10 ||style="background-color:#B3B7FF;"| Edgy Eft ||style="background-color:#B3B7FF;"| 26.10.2006 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#B3B7FF;"| 7.04 ||style="background-color:#B3B7FF;"| Feisty Fawn ||style="background-color:#B3B7FF;"| 19.04.2007 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#A0DDA0;"| '''7.10''' ||style="background-color:#A0DDA0;"| '''Gutsy Gibbon''' ||style="background-color:#A0DDA0;"| '''18.10.2007''' ||style="background-color:#A0DDA0;"| '''Derzeit aktuelle Version!'''<br />
|-<br />
|style="background-color:#FFFF80;"| 8.04 ||style="background-color:#FFFF80;"| Hardy Heron ||style="background-color:#FFFF80;"| April 2008 (geplant) ||style="background-color:#FFFF80;"| Geplante Version<br />
|}<br />
<br />
Das Ding stammt aus dem [[Ubuntu]] Artikel. Wenn man selbst nicht weiß, wie man sowas bastelt, klaut man es sich halt zusammen und passt es an seine Bedürfnisse an. ;-) So haben wir wohl alle anfangs gearbeitet. :-)<br />
<br />
{| class="wikitable sortable"<br />
! Name and Surname<br />
! Height<br />
|-<br />
|data-sort-value="Smith, John George-Jackson"| John George-Jackson Smith<br />
| 1.85<br />
|-<br />
|data-sort-value="Ray, Ian"| Ian Ray<br />
| 1.89<br />
|-<br />
|data-sort-value="Bianchi, Zachary"| Zachary Bianchi<br />
| 1.72<br />
|-<br />
|data-sort-value="Bianchi Maria, Adele"| Adele Bianchi Maria<br />
| 1.82<br />
|- class="sortbottom"<br />
! Average:<br />
| 1.82<br />
|}<br />
<br />
== Überschrift2 ==<br />
Das neue Jahr hat begonnen<br />
<br />
=== <font color="gray"> Überschrift3 </font> ===<br />
Die heiligen drei Könige waren schon hier<br />
<br />
==== <font color="silver"> Überschrift4 </font> ====<br />
Viel Arbeit<br />
<br />
== <font color="maroon"> Überschrift2 </font> ==<br />
Das neue Jahr hat begonnen<br />
<br />
=== <font color="black"> Überschrift3 </font> ===<br />
Die heiligen drei Könige waren schon hier<br />
<br />
==== <font color="gray"> Überschrift4 </font> ====<br />
Viel Arbeit<br />
<br />
<br />
<br />
<br />
== Farben ==<br />
<br />
=== <font color="black"> black </font> ===<br />
=== <font color="maroon"> maroon </font> ===<br />
=== <font color="green"> green </font> ===<br />
=== <font color="olive"> olive </font> ===<br />
=== <font color="navy"> navy </font> ===<br />
=== <font color="purple"> purple </font> ===<br />
=== <font color="teal"> teal </font> ===<br />
=== <font color="gray"> gray </font> ===<br />
=== <font color="silver"> silver </font> ===<br />
=== <font color="red"> red </font> ===<br />
=== <font color="lime"> lime </font> ===<br />
=== <font color="yellow"> yellow </font> ===<br />
=== <font color="blue"> blue </font> ===<br />
=== <font color="fuchsia"> fuchsia </font> ===<br />
=== <font color="aqua"> aqua </font> ===</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Benutzer:CaptainOreo&diff=33084Benutzer:CaptainOreo2020-09-29T19:00:48Z<p>Robi: Leere Seite erstellt</p>
<hr />
<div></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Sed&diff=33072Diskussion:Sed2019-12-20T13:36:41Z<p>Robi: Re Tabellenformat</p>
<hr />
<div>== Layout ==<br />
<br />
Wie kann man es machen dass der Text in den Tabellenfeldern nicht so hart an Anfang klebt? nbsp's reinhauen wäre eher unschön für den Quelltext, geht das besser? --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 13:08, 14. Dez. 2019 (CET)<br />
<br />
: Hhmm, Du könntest mit den Formatierungselementen von Mediawiki experimentieren:<br />
: https://www.mediawiki.org/wiki/Help:Tables<br />
: Aber eigentlich hätte ich gedacht, dass die Form an dieser Stelle nicht so wichtig ist.<br />
: --[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 19:15, 14. Dez. 2019 (CET<br />
<br />
<br />
:: Stichwort "'''cellpadding='''" , aber ich denke auch, wer wirklich ernsthaft diese Seite ließt, dem ist das vollkommen Wurst, der ist an andern Informationen als an Schönheit interessiert.<br />
:: [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 14:36, 20. Dez. 2019 (CET) <br />
{| border=1 cellpadding="10"<br />
|+ '''Bedeutung der Flags beim s-Befehl '''<br />
! Flag !! Bedeutung !! Beispiel !! Bemerkung<br />
|- <br />
!| N <br />
|| N=Zahl (1 < 512) ; das N'te Vorkommen <br />
!| s/AB/CD/2 <br />
|| wird N nicht angegeben dann erste Vorkommen <br />
|- <br />
!| g <br />
|| global ; alle Vorkommen <br />
!| s/AB/CD/g <br />
|| es werden alle Vorkommen ersetzt <br />
|- <br />
!| p <br />
|| print ; Ausgabe bei Ersetzung <br />
!| s/AB/CD/p <br />
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben <br />
|- <br />
!| w DATEI <br />
|| write DATEI bei Ersetzung <br />
!| s/AB/CD/w FILE<br />
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei<br />
|- <br />
!| i <br />
|| case-insensitive ; Groß-Kleinschreibung ignorieren <br />
!| s/AB/CD/i <br />
|| ist <font color="red">nicht kompatibel</font> zu allen SED-Implementierung<br />
|- <br />
!| m <br />
|| || <br />
|| betrifft Interpretation von '''^ '''und''' $''' ; <font color="red">nicht kompatibel</font> <br />
|- <br />
!| x <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|-<br />
!| s <br />
|| || <br />
|| <font color="red">nicht kompatibel</font> ; nur bei ssed im Perlmodus <br />
|}</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Man_zypper&diff=33059Diskussion:Man zypper2019-11-15T19:24:31Z<p>Robi: Format ist schrecklich</p>
<hr />
<div>==Kann mal jemand bitte das Format anpassen==<br />
<br />
Mir erschließt sich zwar nicht wirklich ein Sinn, warum man in diesem Wiki diese Manpage von zypper benötigt, aber nun wo sie schon mal da ist. Aber kann bitte mal irgend jemand die Zeilenbreite anpassen (und wenn ihr einmal dabei seit, auch gleich noch bei {de|en}.opensuse.org, www.unix.com ....), eine Zeilenbreite von über 180 Zeilen haben wohl nur die wenigsten standardmäßig eingestellt, und wenn man die Ansicht vergrößert wird die Schrift so klein, dass man es nicht mehr lesen kann. Das sieht schrecklich aus. Die vernünftigsten und gut lesbare Lösung haben auf den ersten Blick ausgerechnet Debian und Ubuntu :-)<br><br />
[[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 20:24, 15. Nov. 2019 (CET)</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Virtuelle_Maschinen_und_Emulatoren&diff=33057Virtuelle Maschinen und Emulatoren2019-08-29T21:55:43Z<p>Robi: zu löschende Seite entlinkt</p>
<hr />
<div>= Virtuelle Maschinen =<br />
<br />
* [[VMware]] - Allgemeiner Artikel / Beschreibung, Tipps und Tricks zu VMware<br />
** [[VMware Player]] - Installation / Konfiguration vom VMware Player<br />
** [[VMware Server]] - Installation / Konfiguartion vom VMware Server<br />
** [[VMware Fusion]] - HowTo für Linux als Gastsystem auf OS X<br />
<br />
* [[VirtualBox]] Sehr beliebte Virtualisierungs-Software. Gilt als "die" Alternative zu VMware<br />
<br />
<br />
* [[Parallels Workstation]] eine (weitere) Alternative zu VMware<br />
* [[MS Virtual Server 2005R2]]<br />
* [[qemu]] open source processor emulator Installation und Bedienung von Qemu (mit Kernelmodul kqemu).<br />
* [[xen]] Ausgereifte Virtualisierungslösung mit Hauptanwendungsgebiet Server ([[OpenSource]])<br />
* [[kvm]] Ausgereifte Virtualisierungslösung mit Hauptanwendungsgebiet Server ([[OpenSource]])<br />
* [[Direkter Zugriff auf qemu-Images von einem Virtualisierungs-Host]]<br />
<br />
= Wine =<br />
* [[Wine]]<br />
* [[IEs4Linux]] - Internet Explorer für Linux<br />
<br />
<br />
= Quellen und weiterführende Links =<br />
<br />
* [http://www.vmware.com VMware]<br />
* [http://dosbox.sourceforge.net/ DOSBox]<br />
* [http://bochs.sourceforge.net/ Bochs]<br />
* [http://fabrice.bellard.free.fr/qemu/ QEMU]<br />
* [http://www.netraverse.com/ Win4Lin]<br />
* [http://www.winehq.com/ Wine]<br />
* [http://www.codeweavers.com/ CodeWeavers Crossover Office]<br />
* [http://www.transgaming.com/ Cedega]<br />
* [http://user-mode-linux.sourceforge.net/ User Mode Linux]<br />
* [http://www.cl.cam.ac.uk/Research/SRG/netos/xen/ XEN]<br />
* [http://www.microsoft.com/PRODUCTS/info/product.aspx?view=22&pcid=ba9e68ed-9571-4d10-82d2-b51828c33297&type=ovr Microsoft Virtual PC 2004]<br />
* [http://www.parallels.com Parallels Workstation]<br />
* [http://www.faumachine.org/ FAUmachine]<br />
* http://www3.informatik.uni-erlangen.de/Research/UMLinux/ <br />
* [http://www.freiburg.linux.de/~uae/ Ein Amiga Emulator]<br />
* http://user-mode-linux.sourceforge.net/ simuliert einen Linux Kern (anstatt einen ganzen Rechner)... schön schnell und praktisch.<br />
* http://www.colinux.org/<br />
* http://unit.aist.go.jp/it/knoppix/colinux/index-en.html<br />
* [http://www.serenityvirtual.com/evaluation/index.php Testversion SVISTA] Kommerzielles Produkt, noch etwas langsam, aber inzwischen recht stabil. Gibt's für verschiedene Plattformen und schafft es neben Windows und Linux auch OS/2 laufen zu lassen.<br />
* Als GPL neu von InnoTek: [http://www.virtualbox.org/ VirtualBox] <br />
** [http://www.heise.de/open/artikel/83678 Ein Artikel mit einem Testbericht findet sich auf Heise]: .<br />
* Falls jemand was für PPC sucht:<br />
* [http://www.gibix.net/projects/basilisk2/ BasiliskII] Emuliert Apple Macintosh, MacOS 7.5 bis maximal MacOS 8.1<br />
** http://pearpc.sourceforge.net/<br />
** http://www.softpear.org/wiki/index.php?title=Main_Page<br />
<br />
<br />
[[Category:Virtuelle Maschinen und Emulatoren]]<br />
<br />
[[Category:Wine]][[Kategorie:Übersicht]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Radiosender&diff=32963Radiosender2017-10-08T14:05:58Z<p>Robi: pure-metal.de</p>
<hr />
<div>Manche Radiostationen verstecken die URLs ihrer Server im Quelltext der Seiten.<br />
<br />
Hier entsteht eine Sammlung der direkten Stream-URL, die man dann einfach in einen Audioplayer wie mplayer (alle Betriebssysteme) kopieren kann. Wie man die URL ermittlen kann, findet man im Artikel [[Stream-URL_ermitteln]].<br />
<br />
Diese Seite hat die tinyUrl http://tinyurl.com/de-internetradio bzw. http://preview.tinyurl.com/de-internetradio (preview).<br />
<br />
== Sendertabelle ==<br />
Hier auf dieser Seite sind Sender aus dem deutschsprachigen Raum zu finden. Es existiert eine weitere Tabelle mit [[Radiosender-1|Internationalen Sendern]]<br />
{{Box Hinweis||<br />
Auf diese Seite wird mit Programmen zugegriffen, bitte dringend vor Änderungen die Diskussionsseite zu diesem Artikel beachten!}}<br />
<br />
Die folgende Tabelle beruht auf einer Sammlung von [[Benutzer:Albschrat|Albschrat]] und wurde komplett durchgefilzt von Spielwurm. Stand 10.10.2016. <br />
<br />
Wenn unter "Bitrate" "0" steht, dann konnte der Stream nicht gefunden werden.<br />
<br />
Die Farben deuten die Qualität der Streams an: hellgelb=hohe Bitrate und grün=niedrige Bitrate. Die niedrigen Bitraten sind gedacht für den Empfang durch Smartphones, um entweder Datenmenge zu sparen oder um bei G2-Verbindung noch Radio hören zu können. Gute Apps für händische Adresseingabe: "Servestream" und "Transistor" von Fdroid und "Simple Radio Player"(com.voltov.simpleradioplayer) aus dem Playstore.<br />
<br />
{| class="wikitable sortable" border="1" cellspacing="0"<br />
|- style="background-color:#009ACD;"<br />
!Sender!!Ort!!Land!!Bitrate!!Aktualisierung!!class="unsortable"|Adresse<br />
|- style="background-color:#ffee99;"<br />
| 106.4 TOP FM || Fürstenfeldbruck || Deutschland ||align="center" | 128 || 14.10.16 || http://mp3.topfm.c.nmdn.net/ps-topfm/livestream.mp3 <br />
|- style="background-color:#ffffbb;"<br />
| 14482 Babelsberg Hitradio || Potsdam || Deutschland ||align="center" | 192 || 3.10.16 || http://46.163.75.84:8000<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live.akacast.akamaistream.net/7/706/119434/v1/gnl.akacast.akamaistream.net/1live<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE diggi || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-diggi.akacast.akamaistream.net/7/965/119435/v1/gnl.akacast.akamaistream.net/1live-diggi<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE Plan B || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-plan-b.akacast.akamaistream.net/7/905/119448/v1/gnl.akacast.akamaistream.net/1live-plan-b<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE DJ Session || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-dj-session.akacast.akamaistream.net/7/679/119452/v1/gnl.akacast.akamaistream.net/1live-dj-session<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE Neu für den Sektor || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-sektor.akacast.akamaistream.net/7/551/119449/v1/gnl.akacast.akamaistream.net/1live-sektor<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE HipHop || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-hiphop.akacast.akamaistream.net/7/63/119451/v1/gnl.akacast.akamaistream.net/1live-hiphop<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE Special || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-specials.akacast.akamaistream.net/7/59/119450/v1/gnl.akacast.akamaistream.net/1live-specials<br />
|- style="background-color:#ffee99;"<br />
| 1LIVE Fiehe || Köln || Deutschland ||align="center" | 128 || 9.10.16 || http://1live-fiehe.akacast.akamaistream.net/7/201/119447/v1/gnl.akacast.akamaistream.net/1live-fiehe<br />
|- style="background-color:#ffffff;"<br />
| 80er || - || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/80ergvl<br />
|- style="background-color:#ffffff;"<br />
| 89.0 RTL || Halle (Saale) || Deutschland ||align="center" | 0 || || http://62.75.176.45/rtl-high<br />
|- style="background-color:#ffffff;"<br />
| 90er || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/90er<br />
|- style="background-color:#ffffff;"<br />
| 95.5 Charivari || München || Deutschland ||align="center" | 0 || || http://955charivari.radio.de:8000/relay-2318<br />
|- style="background-color:#ffffff;"<br />
| AgF-Radio || Viernheim || Deutschland ||align="center" | 0 || || http://stream2006.de:9000<br />
|- style="background-color:#ffffff;"<br />
| Alpenmelodie || Stein || Deutschland ||align="center" | 0 || || http://212.123.103.171<br />
|- style="background-color:#ddeeaa;"<br />
| alster radio 106!8 rock 'n pop || Hamburg || Deutschland ||align="center" | 96 || 03.10.16 || http://live96.106acht.de<br />
|- style="background-color:#ffffff;"<br />
| Angelsfox-Radio || Wesel Büderich || Deutschland ||align="center" | 0 || || http://80.237.210.71<br />
|- style="background-color:#ffee99;"<br />
| Antenne Bayern || München || Deutschland ||align="center" | 128 || 03.10.16 || http://mp3.webradio.antenne.de:80<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - 80er Kulthits || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/80er-kulthits<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Black Beatz || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/black-beatz<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Chillout || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/chillout<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Classic Rock Live || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/classic-rock-live<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Hits für Kids || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/hits-fuer-kids<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Lovesongs || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/lovesongs<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Oldies || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/oldies-but-goldies<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Bayern - Schlager || München || Deutschland ||align="center" | 96 || 03.10.16 || http://channels.webradio.antenne.de/das-schlager-karussell<br />
|- style="background-color:#ffee99;"<br />
| Antenne Bayern - Top 40 || München || Deutschland ||align="center" | 128 || 03.10.16 || http://channels.webradio.antenne.de/top-40<br />
|- style="background-color:#ccffaa;"<br />
| Antenne Brandenburg || Berlin || Deutschland ||align="center" | 48 || 03.10.16 || http://www.antennebrandenburg.de/livemp3<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Mainz || Mainz || Deutschland ||align="center" | 64 || 03.10.16 || http://rs1.radiostreamer.com:8020/<br />
|- style="background-color:#ffee99;"<br />
| Antenne Münster || Münster || Deutschland ||align="center" | 128 || 03.10.16 || http://stream.antennemuenster.de:8000/am128k<br />
|- style="background-color:#ffee99;"<br />
| Antenne Südtirol || Lana || Italien ||align="center" | 128 || 03.10.16 || http://server2.digital-webstream.de:23780<br />
|- style="background-color:#ffffff;"<br />
| ANTENNE VORARLBERG Partymix || Schwarzach || Österreich ||align="center" | 0 || || http://194.208.21.29:8010<br />
|- style="background-color:#ffffff;"<br />
| apollo radio))) || Chemnitz || Deutschland ||align="center" | 0 || || http://217.68.161.222:6300<br />
|- style="background-color:#ffffff;"<br />
| Apres Ski || Hamburg || Österreich ||align="center" | 0 || || http://dude.mp3streams.net/apresski<br />
|- style="background-color:#ffffff;"<br />
| Arabella Austropop || München || Deutschland ||align="center" | 0 || || http://stream02.arabella-de.vss.kapper.net:8000<br />
|- style="background-color:#ffffff;"<br />
| Arabella Classic-Rock || München || Deutschland ||align="center" | 0 || || http://stream05.arabella-de.vss.kapper.net:8000<br />
|- style="background-color:#ffffff;"<br />
| Arabella Herzflimmern || München || Deutschland ||align="center" | 0 || || http://stream03.arabella-de.vss.kapper.net:8000<br />
|- style="background-color:#ffffff;"<br />
| Arabella Kultschlager || München || Deutschland ||align="center" | 0 || || http://stream04.arabella-de.vss.kapper.net:8000<br />
|- style="background-color:#ffffff;"<br />
| Arabella Party || München || Deutschland ||align="center" | 0 || || http://stream06.arabella-de.vss.kapper.net:8000<br />
|- style="background-color:#ffffff;"<br />
| Arabella Webradio || München || Deutschland ||align="center" | 0 || || http://stream01.arabella-de.vss.kapper.net:8000<br />
|- style="background-color:#ffffff;"<br />
| B-Radio4U || Berlin || Deutschland ||align="center" | 0 || || http://b-radio4u.eu:8038<br />
|- style="background-color:#ffffff;"<br />
| Ballermann Radio || Mönchengladbach || Deutschland ||align="center" | 0 || || http://media.ballermann-radio.com:8000<br />
|- style="background-color:#ffee99;"<br />
| Bash.FM || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.bash-music.com:8000<br />
|- style="background-color:#ffee99;"<br />
| BassLover || Berlin || Deutschland ||align="center" | 128 || 03.10.16 || http://s7.relay-basslover.de:9000<br />
|- style="background-color:#ffee99;"<br />
| Bayern 1 Oberfranken || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-bayern1fran-m.akacast.akamaistream.net/7/101/142690/v1/gnl.akacast.akamaistream.net/br_mp3_bayern1fran_m<br />
|- style="background-color:#ddeeaa;"<br />
| Bayern 1 Oberfranken LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-bayern1fran-s.akacast.akamaistream.net/7/79/142690/v1/gnl.akacast.akamaistream.net/br_mp3_bayern1fran_s<br />
|- style="background-color:#ffee99;"<br />
| Bayern 2 Nord || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-bayern2nord-m.akacast.akamaistream.net/7/841/256282/v1/gnl.akacast.akamaistream.net/br_mp3_bayern2nord_m<br />
|- style="background-color:#ddeeaa;"<br />
| Bayern 2 Nord LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-bayern2nord-s.akacast.akamaistream.net/7/835/256282/v1/gnl.akacast.akamaistream.net/br_mp3_bayern2nord_s<br />
|- style="background-color:#ffee99;"<br />
| Bayern 3 || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-bayern3-m.akacast.akamaistream.net/7/442/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_m<br />
|- style="background-color:#ddeeaa;"<br />
| Bayern 3 LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-bayern3-s.akacast.akamaistream.net/7/464/142692/v1/gnl.akacast.akamaistream.net/br_mp3_bayern3_s<br />
|- style="background-color:#ffee99;"<br />
| BR- Klassik || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-br-klassik-m.akacast.akamaistream.net/7/120/142693/v1/gnl.akacast.akamaistream.net/br_mp3_br-klassik_m<br />
|- style="background-color:#ddeeaa;"<br />
| BR-Klassik LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-br-klassik-s.akacast.akamaistream.net/7/150/142693/v1/gnl.akacast.akamaistream.net/br_mp3_br-klassik_s<br />
|- style="background-color:#ffee99;"<br />
| Bayern plus || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-bayernplus-m.akacast.akamaistream.net/7/624/142696/v1/gnl.akacast.akamaistream.net/br_mp3_bayernplus_m<br />
|- style="background-color:#ddeeaa;"<br />
| Bayern plus LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-bayernplus-s.akacast.akamaistream.net/7/642/142696/v1/gnl.akacast.akamaistream.net/br_mp3_bayernplus_s<br />
|- style="background-color:#ffee99;"<br />
| BR Heimat || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-brheimat-m.akacast.akamaistream.net/7/738/326703/v1/gnl.akacast.akamaistream.net/br_mp3_brheimat_m<br />
|- style="background-color:#ddeeaa;"<br />
| BR Heimat LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-brheimat-s.akacast.akamaistream.net/7/748/326703/v1/gnl.akacast.akamaistream.net/br_mp3_brheimat_s<br />
|- style="background-color:#ffee99;"<br />
| Puls || München || Deutschland ||align="center" | 128 || 09.10.16 || http://br-mp3-puls-m.akacast.akamaistream.net/7/501/142689/v1/gnl.akacast.akamaistream.net/br_mp3_puls_m<br />
|- style="background-color:#ddeeaa;"<br />
| Puls LowQuality || München || Deutschland ||align="center" | 56 || 09.10.16 || http://br-mp3-puls-s.akacast.akamaistream.net/7/491/142689/v1/gnl.akacast.akamaistream.net/br_mp3_puls_s<br />
|- style="background-color:#ffee99;"<br />
| Bayerwelle Südost TS || Traunstein || Deutschland ||align="center" | 128 || 03.10.16 || http://icebwso2.srv.co.at:8000/bwchg_hi<br />
|- style="background-color:#ffffff;"<br />
| BeFM Soulstar || Barsbüttel || Deutschland ||align="center" | 0 || || http://87.118.64.222:8010<br />
|- style="background-color:#ddeeaa;"<br />
| Bermuda Funk || Mannheim || Deutschland ||align="center" | 112 || 03.10.16 || http://streaming.fueralle.org:8000/bermudafunk.ogg<br />
|- style="background-color:#ffffff;"<br />
| Best of 2008 || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/bestof2008<br />
|- style="background-color:#ffffff;"<br />
| Best of 2009 || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/bestof2009<br />
|- style="background-color:#ffffff;"<br />
| BHJMS -Radio1 || Hamburg || Deutschland ||align="center" | 0 || || http://bhjms-streamserver.mscs.net:8000<br />
|- style="background-color:#ffffff;"<br />
| bigFM || Stuttgart || Deutschland ||align="center" | 0 || || http://bigfm.radio.de:8000/relay-1444<br />
|- style="background-color:#ffffff;"<br />
| Bigvibez.com || Wien || Österreich ||align="center" | 0 || || http://bigvibez.com:7000<br />
|- style="background-color:#ffffff;"<br />
| Black || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/blackgvl<br />
|- style="background-color:#ffee99;"<br />
| BlackBeats.FM || Naundorf || Deutschland ||align="center" | 128 || 03.10.16 || http://stream.blackbeats.fm<br />
|- style="background-color:#ffffff;"<br />
| Blackmusic-radio || Hamburg || Deutschland ||align="center" | 0 || || http://listen.bmradio.de<br />
|- style="background-color:#ffffff;"<br />
| BlastFM || Bern || Schweiz ||align="center" | 0 || || http://rs11.stream24.org:8020<br />
|- style="background-color:#ffffff;"<br />
| Blitz Radio || Braunschweig || Deutschland ||align="center" | 0 || || http://blitz-stream.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Blue-Radio || Hasselfelde || Deutschland ||align="center" | 0 || || http://87.118.112.63:8811<br />
|- style="background-color:#ffffff;"<br />
| Bollywoodradio || Berlin || Deutschland ||align="center" | 0 || || http://radio.bollywoodradio.de:8080/128.mp3<br />
|- style="background-color:#ffee99;"<br />
| Bremen Eins || Bremen || Deutschland ||align="center" | 128 || 03.10.16 || http://rb-mp3-m-bremeneins.akacast.akamaistream.net/7/716/234436/v1/gnl.akacast.akamaistream.net/rb-mp3-m-bremeneins<br />
|- style="background-color:#ddeeaa;"<br />
| Bremen Eins – LowQuality mono || Bremen || Deutschland ||align="center" | 56 || 03.10.16 || http://rb-mp3-s-bremeneins.akacast.akamaistream.net/7/986/234436/v1/gnl.akacast.akamaistream.net/rb-mp3-s-bremeneins<br />
|- style="background-color:#ffee99;"<br />
| Bremen Vier || Bremen || Deutschland ||align="center" | 128 || 03.10.16 || http://rb-mp3-m-bremenvier.akacast.akamaistream.net/7/23/234437/v1/gnl.akacast.akamaistream.net/rb-mp3-m-bremenvier<br />
|- style="background-color:#ddeeaa;"<br />
| Bremen Vier – LowQuality mono || Bremen || Deutschland ||align="center" | 56 || 03.10.16 || http://rb-mp3-s-bremenvier.akacast.akamaistream.net/7/551/234437/v1/gnl.akacast.akamaistream.net/rb-mp3-s-bremenvier<br />
|- style="background-color:#ffee99;"<br />
| Bremen Next || Bremen || Deutschland ||align="center" | 128 || 03.10.16 || http://rb-mp3-m-bremennext.akacast.akamaistream.net/7/705/234439/v1/gnl.akacast.akamaistream.net/rb-mp3-m-bremennext<br />
|- style="background-color:#ddeeaa;"<br />
| Bremen Next – LowQuality mono || Bremen || Deutschland ||align="center" | 56 || 03.10.16 || http://rb-mp3-s-bremennext.akacast.akamaistream.net/7/408/234439/v1/gnl.akacast.akamaistream.net/rb-mp3-s-bremennext<br />
|- style="background-color:#ffee99;"<br />
| BRF1 || Eupen || Belgien ||align="center" | 128 || 03.10.16 || http://stream1.rtbf.be:8000/brf1<br />
|- style="background-color:#ffee99;"<br />
| BRF2 || Eupen || Belgien ||align="center" | 128 || 03.10.16 || http://stream1.rtbf.be:8000/brf2<br />
|- style="background-color:#ffffff;"<br />
| BurnFM || Hof || Deutschland ||align="center" | 0 || || http://www.radionetz.de:8000/burnfm.mp3<br />
|- style="background-color:#ffffff;"<br />
| buureradio.ch || Steinen || Schweiz ||align="center" | 0 || || http://live-three.dmd2.ch<br />
|- style="background-color:#ffffff;"<br />
| Café 80s FM || Buchholz || Deutschland ||align="center" | 0 || || http://178.77.100.114:8000<br />
|- style="background-color:#ffee99;"<br />
| Chaos-Radio || - || DE / AT / CH ||align="center" | 128 || 03.10.16 || http://stream.chaos-radio.net:5678<br />
|- style="background-color:#ffffff;"<br />
| Chatradiolive CRL || Bremen || Deutschland ||align="center" | 0 || || http://stream.chatradiolive.de:8100<br />
|- style="background-color:#ffffff;"<br />
| ChillAUT FM || Wien || Österreich ||align="center" | 0 || || http://www.chillaut.fm:1974<br />
|- style="background-color:#ffffff;"<br />
| CHROMANOVA Ambient || Berlin || Deutschland ||align="center" | 0 || || http://85.25.86.69:8100<br />
|- style="background-color:#ffffff;"<br />
| CHROMANOVA Psy Trance || Berlin || Deutschland ||align="center" | 0 || || http://85.25.86.69:8000<br />
|- style="background-color:#ffffff;"<br />
| Cityredio || Recklinghausen || Deutschland ||align="center" | 0 || || http://www.cityredio.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Club Lounge Radio || Emden-Larrelt || Deutschland ||align="center" | 0 || || http://85.25.144.209:8888<br />
|- style="background-color:#ffffff;"<br />
| coloRadio || Dresden || Deutschland ||align="center" | 0 || || http://stream.fueralle.org:8004/coloradio_160.ogg<br />
|- style="background-color:#ddeeaa;"<br />
| Countrymusic24 || Berlin || Deutschland ||align="center" | 96 || 03.10.16 || http://countrymusic24.powerstream.de:9000<br />
|- style="background-color:#ffee99;"<br />
| Crosschannel || Wetzlar || Deutschland ||align="center" | 128 || 03.10.16 || http://c14000-l.i.core.cdn.streamfarm.net/3095crosschannel_dsl.mp3<br />
|- style="background-color:#ffffff;"<br />
| Cue Radio Dreamlife || Glauchau || Deutschland ||align="center" | 0 || || http://85.214.51.47:8888<br />
|- style="background-color:#ffffff;"<br />
| Dancefox-Radio || Vettelschoss || Deutschland ||align="center" | 0 || || http://s5.pop-stream.de:9000<br />
|- style="background-color:#ffffff;"<br />
| DasDing || Baden-Baden || Deutschland ||align="center" | 0 || || http://swr.ic.llnwd.net/stream/swr_mp3_m_dasdinga<br />
|- style="background-color:#ffffff;"<br />
| DD-Radio || Dresden || Deutschland ||align="center" | 0 || || http://dd-radio.eu:8000<br />
|- style="background-color:#ffee99;"<br />
| DEFJAY.DE || Berlin || Deutschland ||align="center" | 128 || 03.10.16 || http://sc1.netstreamer.net:8040<br />
|- style="background-color:#ffffff;"<br />
| delta radio || Kiel || Deutschland ||align="center" | 0 || || http://stream.hoerradar.de/deltaradio128<br />
|- style="background-color:#ffffff;"<br />
| DELUXE LOUNGE RADIO || München || Deutschland ||align="center" | 0 || || http://c13000-l.i.core.cdn.streamfarm.net/13000deluxe/live/3304lounge/de_128.mp3<br />
|- style="background-color:#ffffff;"<br />
| DELUXE RADIO || München || Deutschland ||align="center" | 0 || || http://d85195728.i.tis.core005.cdn.streamfarm.net:80/13000deluxe/live/3258radiodeluxe/de_96.mp3<br />
|- style="background-color:#ffffff;"<br />
| Deutsche Welle || Köln || Deutschland ||align="center" | 0 || || http://c13010-ls.i.core.cdn.streamfarm.net/dwworldlive-live/13010dwrde64.mp3<br />
|- style="background-color:#ffee99;"<br />
| Deutschlandfunk MP3 || Köln || Deutschland ||align="center" | 128 || 09.10.16 || http://dradio_mp3_dlf_m.akacast.akamaistream.net/7/249/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dlf_m<br />
|- style="background-color:#ddeeaa;"<br />
| Deutschlandfunk OGG || Köln || Deutschland ||align="center" | 56 || 09.10.16 || http://dradio-ogg-dlf-m.akacast.akamaistream.net/7/359/135496/v1/gnl.akacast.akamaistream.net/dradio_ogg_dlf_medium<br />
|- style="background-color:#ccffaa;"<br />
| Deutschlandfunk OGG LowQuality || Köln || Deutschland ||align="center" | 32 || 09.10.16 || http://dradio_ogg_dlf_s.akacast.akamaistream.net/7/636/135496/v1/gnl.akacast.akamaistream.net/dradio_ogg_dlf_s<br />
|- style="background-color:#ffffff;"<br />
| Deutschlandradio Kultur || Köln || Deutschland ||align="center" | 0 || || http://dradio.ic.llnwd.net/stream/dradio_dkultur_m_a.ogg<br />
|- style="background-color:#ffffff;"<br />
| Deutschlandradio Wissen || Köln || Deutschland ||align="center" | 0 || || http://dradio.ic.llnwd.net/stream/dradio_dwissen_m_a<br />
|- style="background-color:#ffffff;"<br />
| Die Neue 107.7 || Stuttgart || Deutschland ||align="center" | 0 || || http://dieneue1077.ice.streaming.spacenet.de/dieneue1077<br />
|- style="background-color:#ffffff;"<br />
| Die Neue 107.7 - 80er || Stuttgart || Deutschland ||align="center" | 0 || || http://dieneue1077-80er.ice.streaming.spacenet.de/dieneue1077_80er<br />
|- style="background-color:#ffffff;"<br />
| Die Neue 107.7 - Livesong || Stuttgart || Deutschland ||align="center" | 0 || || http://dieneue1077-live.ice.streaming.spacenet.de/dieneue1077_live<br />
|- style="background-color:#ffee99;"<br />
| Die Neue Welle || Karlsruhe || Deutschland ||align="center" | 128 || 03.10.16 || http://live.meine-neue-welle.de/dnw_128.mp3<br />
|- style="background-color:#ffffff;"<br />
| Disco-Beatz.com || Datteln || Deutschland ||align="center" | 0 || || http://94.23.28.116:1598<br />
|- style="background-color:#ddeeaa;"<br />
| DONAU 3 FM || Ulm || Deutschland ||align="center" | 64 || 03.10.16 || http://server1.webradiostreaming.de:2640<br />
|- style="background-color:#ffffff;"<br />
| DRS Musikwelle || Zürich || Schweiz ||align="center" | 0 || || http://glb-stream10.streamserver.ch/1/drsmw/mp3_128<br />
|- style="background-color:#ffffff;"<br />
| DRS Virus || Zürich || Schweiz ||align="center" | 0 || || http://glb-stream10.streamserver.ch/1/drsvirus/mp3_128<br />
|- style="background-color:#ffffff;"<br />
| DRS1 || Zürich || Schweiz ||align="center" | 0 || || http://glb-stream10.streamserver.ch/1/drs1/mp3_128<br />
|- style="background-color:#ffffff;"<br />
| DRS2 || Zürich || Schweiz ||align="center" | 0 || || http://glb-stream10.streamserver.ch/1/drs2/mp3_128<br />
|- style="background-color:#ffffff;"<br />
| DRS3 || Zürich || Schweiz ||align="center" | 0 || || http://glb-stream10.streamserver.ch/1/drs3/mp3_128<br />
|- style="background-color:#ffffff;"<br />
| DRS4 News || Zürich || Schweiz ||align="center" | 0 || || http://glb-stream10.streamserver.ch/1/drs4news/mp3_128<br />
|- style="background-color:#ffffff;"<br />
| Eastcoast || Hamburg || Deutschland ||align="center" | 0 || || http://staff.mp3streams.net/eastcoastgvl<br />
|- style="background-color:#ccffaa;"<br />
| EBM-Radio || Rostock || Deutschland ||align="center" | 48 || 09.10.16 || http://www.ebm-radio.org:8000<br />
|- style="background-color:#ffffff;"<br />
| egoFM || München || Deutschland ||align="center" | 0 || || http://edge.live.mp3.mdn.newmedia.nacamar.net/ps-egofm_192/livestream.mp3<br />
|- style="background-color:#ffffbb;"<br />
| eldoRadio || Dortmund || Deutschland ||align="center" | 160 || 09.10.16 || http://eldoweb.eldoradio.de:8000/160.ogg<br />
|- style="background-color:#ffee99;"<br />
| Electro Radio || Schwerzenbach || Schweiz ||align="center" | 128 || 03.10.16 || http://stream.electroradio.ch:26630<br />
|- style="background-color:#ffffff;"<br />
| Electrosound.tv || München || Deutschland ||align="center" | 0 || || http://128k-audio-qlounge.electrosound.tv:8000<br />
|- style="background-color:#ffffff;"<br />
| Electrosound.tv Lounge || München || Deutschland ||align="center" | 0 || || http://192k-audio.electrosound.tv:8000<br />
|- style="background-color:#ffffff;"<br />
| enSonic.FM || Bühlertal || Deutschland ||align="center" | 0 || || http://stream5.ensonicradio.com:8500<br />
|- style="background-color:#ffffbb;"<br />
| eRadio One || Griesheim || Deutschland ||align="center" | 192 || 03.10.16 || http://stage-blue-high.eradio-one.de:62000<br />
|- style="background-color:#ddeeaa;"<br />
| ERF Radio || Wetzlar || Deutschland ||align="center" | 96 || 03.10.16 || http://d85195728.i.tis.core005.cdn.streamfarm.net:80/3212erf_96_live.mp3<br />
|- style="background-color:#ffffff;"<br />
| FFH Black Power || Bad Vilbel || Deutschland ||align="center" | 0 || || http://62.26.161.89/ffhchannels$black$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Deutsch Pur || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$deutschpur$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Die 80er || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$80er$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Die 90er || Bad Vilbel || Deutschland ||align="center" | 0 || || http://62.27.87.41/ffhchannels$dolcevita$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Dolce Vita || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.27.26.5/ffhchannels$dolcevita$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Electro Beats || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$electro$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Future || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$musicupdate$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Hit Radio || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/radioffh$livestream2.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Hits für Kids || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$hits4kids$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Jazz || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$jazz$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Lounge || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$lounge$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Lovesongs || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.27.87.40/ffhchannels$ffhspezial1$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Nachrichten || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.27.44.14/ffhchannels$newschannel$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Rock over Germany || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$rock$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Schlagerkult || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.27.87.41/hrmchannels$schlager$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Seasons || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.27.26.5/ffhchannels$seasons$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Soundtrack || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$movie$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| FFH Top40 || Bad Vilbel || Deutschland ||align="center" | 0 || || mms://62.26.161.89/ffhchannels$top40$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| ffn || Hannover || Deutschland ||align="center" | 0 || || http://rs35.stream24.org/stream<br />
|- style="background-color:#ffffff;"<br />
| FIRERADIO.FM || Gladbeck || Deutschland ||align="center" | 0 || || http://91.121.161.27:8000<br />
|- style="background-color:#ffffff;"<br />
| Flavor Mix || Berlin || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/flavormix<br />
|- style="background-color:#ffffff;"<br />
| FluxFM || Berlin || Deutschland ||align="center" | 0 || || http://85.239.108.31/fluxfm-berlin<br />
|- style="background-color:#ffffff;"<br />
| FluxFM || Bremen || Deutschland ||align="center" | 0 || || http://www.fluxfm.de/stream-bremen<br />
|- style="background-color:#ccffaa;"<br />
| Freies Radio Freudenstadt || Freudenstadt || Deutschland ||align="center" | 48 || 03.10.16 || http://85.25.176.186:9140<br />
|- style="background-color:#ffffff;"<br />
| Fritz-live || Potsdam-Babelsberg || Deutschland ||align="center" | 0 || || http://rbb.ic.llnwd.net/stream/rbb_fritz_mp3_m_b<br />
|- style="background-color:#ffffff;"<br />
| FRS || Stuttgart || Deutschland ||align="center" | 0 || || http://frs.kumbi.org:8000/frs_stereo.ogg<br />
|- style="background-color:#ffffff;"<br />
| Frühlingsradio || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/fruehlingsgefuehle<br />
|- style="background-color:#ddeeaa;"<br />
| FSK || Hamburg || Deutschland ||align="center" | 96 || 03.10.16 || http://stream.fsk-hh.org:8000/fsk.ogg<br />
|- style="background-color:#ffffff;"<br />
| Funkhaus Europa || Köln || Deutschland ||align="center" | 0 || || <br />
|- style="background-color:#ffee99;"<br />
| Funkhaus Europa Alternative || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://funkhaus-europa.akacast.akamaistream.net/7/264/119440/v1/gnl.akacast.akamaistream.net/funkhaus-europa<br />
|- style="background-color:#ffffff;"<br />
| Gong 96,3 || München || Deutschland ||align="center" | 0 || || http://radiator.nci.de:8000/live<br />
|- style="background-color:#ffffff;"<br />
| Gospelradio.de || Berlin || Deutschland ||align="center" | 0 || || http://87.106.15.93:9000<br />
|- style="background-color:#ffee99;"<br />
| HardBase FM || Mönchengladbach || Deutschland ||align="center" | 128 || 03.10.16 || http://mp3.hb-stream.net<br />
|- style="background-color:#ffffff;"<br />
| HELLWEG RADIO || Soest || Deutschland ||align="center" | 0 || || http://s2.global-streaming.net:8100<br />
|- style="background-color:#ffffff;"<br />
| Hit-Radio Antenne Bremen || Bremen || Deutschland ||align="center" | 0 || || http://edge.live.mp3.mdn.newmedia.nacamar.net/stbantennebremen/livestream.mp3<br />
|- style="background-color:#ffffff;"<br />
| Hit-Radio Antenne Niedersachsen || Hannover || Deutschland ||align="center" | 0 || || http://62.26.161.89/stbantennends$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| Hitradio Antenne 1 || Stuttgart || Deutschland ||align="center" | 0 || || http://62.27.44.59/antenne1/livestream.mp3<br />
|- style="background-color:#ffee99;"<br />
| HouseTime FM || Moers || Deutschland ||align="center" | 128 || 03.10.16 || http://mp3.ht-stream.net<br />
|- style="background-color:#ffee99;"<br />
| HR Info || Frankfurt || Deutschland ||align="center" | 128 || 03.10.16 || http://www.metafilegenerator.de/HR/hrinfo/mp3/webm.m3u<br />
|- style="background-color:#ccffaa;"<br />
| HR Info LowQuality || Frankfurt || Deutschland ||align="center" | 48 || 03.10.16 || http://www.metafilegenerator.de/HR/hrinfo/mp3/webs.m3u<br />
|- style="background-color:#ffee99;"<br />
| HR1 || Frankfurt || Deutschland ||align="center" | 128 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr1_2.m3u<br />
|- style="background-color:#ccffaa;"<br />
| HR1 LowQuality || Frankfurt || Deutschland ||align="center" | 48 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr1_1.m3u<br />
|- style="background-color:#ffee99;"<br />
| HR2 || Frankfurt || Deutschland ||align="center" | 128 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr2_2.m3u<br />
|- style="background-color:#ccffaa;"<br />
| HR2 LowQuality || Frankfurt || Deutschland ||align="center" | 48 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr2_1.m3u<br />
|- style="background-color:#ffee99;"<br />
| HR3 || Frankfurt || Deutschland ||align="center" | 128 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u<br />
|- style="background-color:#ccffaa;"<br />
| HR3 LowQuality || Frankfurt || Deutschland ||align="center" | 48 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr3_1.m3u<br />
|- style="background-color:#ffee99;"<br />
| HR4 || Frankfurt || Deutschland ||align="center" | 128 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr4_2.m3u<br />
|- style="background-color:#ccffaa;"<br />
| HR4 LowQuality || Frankfurt || Deutschland ||align="center" | 48 || 03.10.16 || http://metafiles.gl-systemhaus.de/hr/hr4_1.m3u<br />
|- style="background-color:#ffffff;"<br />
| ILoveRadio || Köln || Deutschland ||align="center" | 0 || || http://89.149.242.132<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Black || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/black<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Club || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/club<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Deep Space || Landshut || Deutschland ||align="center" | 0 || || http://chat.internetradio.de:8787<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Eurodance || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/90s<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Kultur || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/kultur<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Main || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/main<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Oldies || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/oldies<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Party || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/party<br />
|- style="background-color:#ffffff;"<br />
| Internetradio.de Rock || Landshut || Deutschland ||align="center" | 0 || || http://stream.internetradio.de/rock<br />
|- style="background-color:#ffee99;"<br />
| JACK FM || Berlin || Deutschland ||align="center" | 128 || 03.10.16 || http://tuner.jackfm.de<br />
|- style="background-color:#ffffff;"<br />
| Jazz || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/jazzgeneralgvl<br />
|- style="background-color:#ffffbb;"<br />
| jenny.fm || Dortmund || Deutschland ||align="center" | 160 || 03.10.16 || http://stream2.jenny.fm:9000<br />
|- style="background-color:#ffee99;"<br />
| JUMP || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22004mdrjump/live/3087mdr_jump/live_de_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| Kanal K || Aarau || Schweiz ||align="center" | 128 || 03.10.16 || http://82.197.165.150<br />
|- style="background-color:#ffffff;"<br />
| Kanal Ratte || Schopfheim || Deutschland ||align="center" | 0 || || http://radio.kanal-ratte.de:8000/rkr.ogg<br />
|- style="background-color:#ffffff;"<br />
| Karneval || Köln || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/karnevalstream<br />
|- style="background-color:#ffffff;"<br />
| Klassik Radio || Hamburg || Deutschland ||align="center" | 0 || || http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradio128/livestream.mp3<br />
|- style="background-color:#ffffff;"<br />
| Krautrock-World || Karlsruhe || Deutschland ||align="center" | 0 || || http://krautrock.pop-stream.de:7592<br />
|- style="background-color:#ffee99;"<br />
| laut.fm/herrmerktradio || Konstanz || Deutschland ||align="center" | 128 || 03.10.16 || http://stream.laut.fm/herrmerktradio<br />
|- style="background-color:#ffee99;"<br />
| laut.fm/travel-trends || Aschaffenburg || Deutschland ||align="center" | 128 || 03.10.16 || http://stream.laut.fm/travel-trends<br />
|- style="background-color:#ccffaa;"<br />
| Lora osteuropäisch ??? || München || Deutschland ||align="center" | 32 || 03.10.16 || http://live.lora924.de:8000/loramp3.mp3<br />
|- style="background-color:#ffffff;"<br />
| Lounge FM || Wien || Österreich ||align="center" | 0 || || http://edge.live.mp3.mdn.newmedia.nacamar.net:80/loungefmoesterreich/livestream.mp3<br />
|- style="background-color:#ffee99;"<br />
| LOUNGE GROOVES || Wettingen || Schweiz ||align="center" | 128 || 03.10.16 || http://de1.streamhosting.ch:8050<br />
|- style="background-color:#ffffff;"<br />
| love || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/love<br />
|- style="background-color:#ffffff;"<br />
| MAX-FM || Erfurt || Deutschland ||align="center" | 0 || || http://stream.max-fm.com:8000/maxfm<br />
|- style="background-color:#ffee99;"<br />
| MDR Figaro || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22007mdrfigaro/live/3087mdr_figaro/live_de_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Info || Leipzig || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22006mdr/live/3087mdr_info/live_de_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Klassik || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22008mdrklassik/live/3087mdrklassik/live_de_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Sputnik Black || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22005mdr/live/3087mdr_sputnik_ch_black.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Sputnik Club || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22005mdr/live/3087mdr_sputnik_ch_club.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Sputnik Insomnia || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22005mdr/live/3087mdr_sputnik_ch_cd1.mp3<br />
|- style="background-color:#ffffff;"<br />
| MDR Sputnik Makossa || Halle (Saale) || Deutschland ||align="center" | 0 || || http://c22033-l.i.core.cdn.streamfarm.net/22033mdr/live/3087mdr_sputnik/ch_makossa_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Sputnik Popkult || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22005mdr/live/3087mdr_sputnik_ch_cd2.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Sputnik Rock || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22005mdr/live/3087mdr_sputnik_ch_rock.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR Sputnik Soundcheck || Halle (Saale) || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22033mdr/live/3087mdr_sputnik/ch_soundcheck_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR1 Sachsen || Dresden || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22001mdr1sachsen/live/3087mdr_sachsen/live_de_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR1 Sachsen-Anhalt || Magdeburg || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22002mdr1sachsenanhalt/live/3087mdr_mdr1sa/live_de_128.mp3<br />
|- style="background-color:#ffee99;"<br />
| MDR1 Thüringen || Dresden || Deutschland ||align="center" | 128 || 03.10.16 || http://c22033-l.i.core.cdn.streamfarm.net/22003mdr1thueringen/live/3087mdr_thue/live_de_128.mp3<br />
|- style="background-color:#ddeeaa;"<br />
| memoryradio || Oberschleißheim || Deutschland ||align="center" | 96 || 03.10.16 || http://www.memoryradio.de:4000<br />
|- style="background-color:#ffffff;"<br />
| Merry Christmas || Hamburg || Deutschland ||align="center" | 0 || || http://staff.mp3streams.net/xmas<br />
|- style="background-color:#ffffff;"<br />
| Metal Refinement || Köln || Deutschland ||align="center" | 0 || || http://www.metal-refinement.de:8088<br />
|- style="background-color:#ffffff;"<br />
| Metal-Only || Deizisau || Deutschland ||align="center" | 0 || || http://metal-only.blitz-stream.de<br />
|- style="background-color:#ffffff;"<br />
| Milina Radio || Recklinghausen || Deutschland ||align="center" | 0 || || http://server4.digital-webstream.de:7130<br />
|- style="background-color:#ffffff;"<br />
| MMORPG-Radio || - || Deutschland ||align="center" | 0 || || http://www.gilde-gothic.de:8000<br />
|- style="background-color:#ffee99;"<br />
| mth.Alternative || Erlangen || Deutschland ||align="center" | 128 || 03.10.16 || http://alternative.mthn.net:8700<br />
|- style="background-color:#ffee99;"<br />
| multicult fm (multicult2.0) || Berlin || Deutschland ||align="center" | 128 || 03.10.16 || http://stream.multicult.fm:8000/hifi<br />
|- style="background-color:#ffee99;"<br />
| Munich-Radio || München || Deutschland ||align="center" | 128 || 03.10.16 || http://www.munich-radio.de:8000<br />
|- style="background-color:#ffee99;"<br />
| Munich's Hardest Hits || München || Deutschland ||align="center" | 128 || 03.10.16 || http://84.19.188.7:8010<br />
|- style="background-color:#ffee99;"<br />
| N-JOY || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/n-joy.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR 1 Niedersachsen || Hannover || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndr1niedersachsen.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR 1 Radio MV || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndr1radiomv.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR 1 Welle Nord || Kiel || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndr1wellenord.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR 2 || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndr2.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR 90,3 || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndr903.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR Info || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndrinfo.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR Info Spezial || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndrinfo_spezial.m3u<br />
|- style="background-color:#ffee99;"<br />
| NDR Kultur || Hamburg || Deutschland ||align="center" | 128 || 03.10.16 || http://www.ndr.de/resources/metadaten/audio/m3u/ndrkultur.m3u<br />
|- style="background-color:#ffee99;"<br />
| NewcomerRadio Deutschland || Wuppertal || Deutschland ||align="center" | 128 || 03.10.16 || http://streamplus14.leonex.de:15888<br />
|- style="background-color:#ffee99;"<br />
| NIGHTLINE RADIO || Berlin || Deutschland ||align="center" | 128 || 03.10.16 || http://radio1.nightline-radio.de:8000<br />
|- style="background-color:#ffee99;"<br />
| Nordwestradio || Bremen || Deutschland ||align="center" | 128 || 03.10.16 || http://rb-mp3-m-nordwestradio.akacast.akamaistream.net/7/639/234438/v1/gnl.akacast.akamaistream.net/rb-mp3-m-nordwestradio<br />
|- style="background-color:#ddeeaa;"<br />
| Nordwestradio – LowQuality mono || Bremen || Deutschland ||align="center" | 56 || 03.10.16 || http://rb-mp3-s-nordwestradio.akacast.akamaistream.net/7/542/234438/v1/gnl.akacast.akamaistream.net/rb-mp3-s-nordwestradio<br />
|- style="background-color:#ffffff;"<br />
| NRW Chaosradio || Köln || Deutschland ||align="center" | 0 || || http://217.79.190.24:8000<br />
|- style="background-color:#ffffbb;"<br />
| Ohrfunk Radio || Berlin || Deutschland ||align="center" | 192 || 09.10.16 || http://server1.digital-webstream.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Oldie95 || Hamburg || Deutschland ||align="center" | 0 || || http://edge.live.mp3.mdn.newmedia.nacamar.net/stboldie95/livestream.mp3<br />
|- style="background-color:#ffffff;"<br />
| Oldies || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/oldies<br />
|- style="background-color:#ffffff;"<br />
| oldiestar || Oranienburg || Deutschland ||align="center" | 0 || || http://www.digitalradiostream.de:8000<br />
|- style="background-color:#ffffff;"<br />
| on3radio || München || Deutschland ||align="center" | 0 || || http://gffstream.ic.llnwd.net/stream/gffstream_w9b<br />
|- style="background-color:#ffffff;"<br />
| Onkelz Rock Radio ORR || Voerde || Deutschland ||align="center" | 0 || || http://webhost110.gtk.hu:9010<br />
|- style="background-color:#ddeeaa;"<br />
| Orange || Wien || Österreich ||align="center" | 96 || 09.10.16 || http://stream3.o94.at:8000/live_standard.ogg<br />
|- style="background-color:#ffffbb;"<br />
| ORF FM4 || Wien || Österreich ||align="center" | 156 || 09.10.16 || http://mp3stream1.apasf.apa.at:8000<br />
|- style="background-color:#ffee99;"<br />
| ORF Hitradio Ö3 || Wien || Österreich ||align="center" | 128 || 09.10.16 || http://mp3stream7.apasf.apa.at:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Ö1 || Wien || Österreich ||align="center" | 192 || 09.10.16 || http://mp3stream3.apasf.apa.at:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Burgenland || Eisenstadt || Österreich ||align="center" | 192 || 09.10.16 || http://194.232.200.146:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Kärnten || Klagenfurt || Österreich ||align="center" | 156 || 09.10.16 || http://194.232.200.145:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Niederösterreich || St. Pölten || Österreich ||align="center" | 156 || 09.10.16 || http://mp3stream8.apasf.apa.at:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Oberösterreich || Linz || Österreich ||align="center" | 156 || 09.10.16 || http://194.232.200.148:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Salzburg || Salzburg || Österreich ||align="center" | 156 || 09.10.16 || http://194.232.200.147:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Steiermark || Graz || Österreich ||align="center" | 192 || 09.10.16 || http://mp3stream9.apasf.apa.at:8000/<br />
|- style="background-color:#ffffbb;"<br />
| ORF Radio Tirol || Insbruck || Österreich ||align="center" | 192 || 09.10.16 || http://194.232.200.159:8000/<br />
|- style="background-color:#ffee99;"<br />
| ORF Radio Vorarlberg || Bregenz || Österreich ||align="center" | 128 || 09.10.16 || http://194.232.200.149:8000/<br />
|- style="background-color:#ffee99;"<br />
| ORF Radio Wien || Wien || Österreich ||align="center" | 128 || 09.10.16 || http://mp3stream17.apasf.apa.at:8000/<br />
|- style="background-color:#ffffff;"<br />
| POP-Radio POP one || Velen || Deutschland ||align="center" | 0 || || http://one.audio.pop-radio.de<br />
|- style="background-color:#ffffff;"<br />
| POP-Radio POP two || Velen || Deutschland ||align="center" | 0 || || http://two.audio.pop-radio.de<br />
|- style="background-color:#ffffff;"<br />
| PRIDE1 || Recklinghausen || Deutschland ||align="center" | 0 || || http://p1standby.serveftp.org:8100<br />
|- style="background-color:#ffffff;"<br />
| Primavera online radio || Aschaffenburg || Deutschland ||align="center" | 0 || || http://62.75.162.209:8000/primavera<br />
|- style="background-color:#ffffff;"<br />
| PROJECT RELOADED || Hannover || Deutschland ||align="center" | 0 || || http://edge.live.mp3.mdn.newmedia.nacamar.net/projectreloaded/livestream.mp3<br />
|- style="background-color:#ffee99;"<br />
| PsyRadio Chillout || Duisburg || Deutschland ||align="center" | 128 || 09.10.16 || http://komplex2.psyradio.org:8030<br />
|- style="background-color:#ffee99;"<br />
| PsyRadio Progressive || Duisburg || Deutschland ||align="center" | 128 || 09.10.16 || http://komplex2.psyradio.org:8010<br />
|- style="background-color:#ffffff;"<br />
| Pure-Metal World Radio || Bielefeld || Deutschland ||align="center" | 0 || || http://pure-metal.de:29000<br />
|- style="background-color:#ffee99;"<br />
| Querfunk || Karlsruhe || Deutschland ||align="center" | 128 || 09.10.16 || http://mp3.querfunk.de:8001/qfhi<br />
|- style="background-color:#ffee99;"<br />
| R.SH || Kiel || Deutschland ||align="center" | 128 || 09.10.16 || http://stream.hoerradar.de/rsh128<br />
|- style="background-color:#ffffff;"<br />
| Radio 21 - Classic Rock || Garbsen || Deutschland ||align="center" | 0 || || http://radio21.ice.streaming.spacenet.de/radio21<br />
|- style="background-color:#ffffff;"<br />
| Radio 7 || Ulm || Deutschland ||align="center" | 0 || || http://stream.hoerradar.de/mp3-radio7-128<br />
|- style="background-color:#ffffff;"<br />
| Radio 700 || Euskirchen || Deutschland ||align="center" | 0 || || http://s1.global-streaming.net:11600<br />
|- style="background-color:#ffffff;"<br />
| Radio AENA || Straubing || Deutschland ||align="center" | 0 || || http://85.214.100.217:8055/dslTest<br />
|- style="background-color:#ffffff;"<br />
| Radio B2 Berlin-Brandenburg || Berlin || Deutschland ||align="center" | 0 || || http://www.digitalradiostream.de:9090/listen.pls<br />
|- style="background-color:#ffee99;"<br />
| Radio Bielefeld || Bielefeld || Deutschland ||align="center" | 128 || 21.05.17 || http://edge.live.mp3.mdn.newmedia.nacamar.net/ps-radiobielefeld/livestream.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio Blau || Dresden || Deutschland ||align="center" | 0 || || http://85.239.108.31:8000/radioblau<br />
|- style="background-color:#ffffff;"<br />
| Radio BOB! || Kassel || Deutschland ||align="center" | 0 || || http://85.239.108.31/mp3-radiobob<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Bonn / Rhein-Sieg || Bonn || Deutschland ||align="center" | 96 || 09.10.16 || http://ga-stream01.ga-bonn.de:80/live128<br />
|- style="background-color:#ffffff;"<br />
| Radio Brocken || Halle (Saale) || Deutschland ||align="center" | 0 || || http://stream.telvi.de:8000/radiobrocken<br />
|- style="background-color:#ffffff;"<br />
| Radio Chemnitz || Chemnitz || Deutschland ||align="center" | 0 || || mms://stream.green.ch/RadioChemnitz<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Corax || Halle || Deutschland ||align="center" | 112 || 09.10.16 || http://streaming.fueralle.org:8000/corax.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio Cottbus 94.5 || Cottbus || Deutschland ||align="center" | 0 || || http://stream.telvi.de:8000/radio_cottbus<br />
|- style="background-color:#ffffff;"<br />
| Radio Darmstadt || Darmstadt || Deutschland ||align="center" | 0 || || http://livestream.radiodarmstadt.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Radio Dresden || Dresden || Deutschland ||align="center" | 0 || || mms://stream.green.ch/RadioDresden<br />
|- style="background-color:#ffffff;"<br />
| Radio Dreyeckland || Freiburg || Deutschland ||align="center" | 0 || || http://85.214.49.179:8000/rdl<br />
|- style="background-color:#ffffff;"<br />
| Radio Eviva || Brunnen || Schweiz ||align="center" | 0 || || http://dms-cl-022.skypro-media.net/radioeviva-128<br />
|- style="background-color:#ddeeaa;"<br />
| Radio F.R.E.I. || Erfurt || Deutschland ||align="center" | 96 || 09.10.16 || http://streaming.fueralle.org:8000/Radio-F.R.E.I<br />
|- style="background-color:#ffffff;"<br />
| Radio Fantasy 93.4 FM || Augsburg || Deutschland ||align="center" | 0 || || http://stream.fantasy.de:8000/radiofantasy.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio Flensburg || Flensburg || Deutschland ||align="center" | 0 || || http://server4.digital-webstream.de:10885<br />
|- style="background-color:#ffee99;"<br />
| Radio Flora || Hannover || Deutschland ||align="center" | 128 || 09.10.16 || http://radioflora.de/stream/live.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio Free FM || Ulm || Deutschland ||align="center" | 0 || || http://stream.lauschangriff.org:8100<br />
|- style="background-color:#ffffff;"<br />
| Radio FreeQuenns || Liezen || Österreich ||align="center" | 0 || || http://www.freequenns.at:8000/rfhigh<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Freirad || Innsbruck || Österreich ||align="center" | 96 || 09.10.16 || http://stream.freirad.at:8002/live.ogg<br />
|- style="background-color:#ffffff;"<br />
| Radio fresh80s || Hamburg || Deutschland ||align="center" | 0 || || http://89.149.217.93:8010<br />
|- style="background-color:#ffffff;"<br />
| Radio FRO || Linz || Österreich ||align="center" | 0 || || http://www.fro.at:8008/fro-56<br />
|- style="background-color:#ffffff;"<br />
| Radio Gong 96.3 || München || Deutschland ||align="center" | 0 || || http://radiator.nci.de:8000/high_q<br />
|- style="background-color:#ffee99;"<br />
| Radio Gütersloh || Gütersloh || Deutschland ||align="center" | 128 || 21.05.17 || http://edge.live.mp3.mdn.newmedia.nacamar.net/radioguetersloh/livestream.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio Hazzard of Darkness || Bochum || Deutschland ||align="center" | 0 || || http://radio.hazzardofdarkness.com:8000<br />
|- style="background-color:#ffffbb;"<br />
| Radio Helsinki || Graz || Österreich ||align="center" | 160 || 09.10.16 || http://live.helsinki.at:8088/live160.ogg<br />
|- style="background-color:#ffffff;"<br />
| Radio Hitwelle Landkreis Erding || Erding || Deutschland ||align="center" | 0 || || mms://stream.hitwelle.de/hitwelle<br />
|- style="background-color:#ffffff;"<br />
| Radio im Internet || Ober-Mörlen || Deutschland ||align="center" | 0 || || http://radioiminternet.ham-radio-op.net:8602<br />
|- style="background-color:#ffffbb;"<br />
| Radio Jade || Hameln || Deutschland ||align="center" | 192 || 09.10.16 || http://streaming.radiojade.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Radio Lausitz || Görlitz || Deutschland ||align="center" | 0 || || http://stream.green.ch/RadioLausitz<br />
|- style="background-color:#ffffff;"<br />
| Radio Leipzig || Leipzig || Deutschland ||align="center" | 0 || || mms://stream.green.ch/RadioLeipzig<br />
|- style="background-color:#ffffff;"<br />
| Radio Lora || Zürich || Schweiz ||align="center" | 0 || || http://193.192.228.134:8000<br />
|- style="background-color:#ffffff;"<br />
| Radio LoTTe || Weimar || Deutschland ||align="center" | 0 || || http://fra.radiostream.de:36315<br />
|- style="background-color:#ffffff;"<br />
| Radio Moonlight || Wien || Österreich ||align="center" | 0 || || http://streamplus9.ameus.de:17806<br />
|- style="background-color:#ffffff;"<br />
| Radio Mundus || Hannover || Deutschland ||align="center" | 0 || || http://stream.radiomundus.de:7000<br />
|- style="background-color:#ffffff;"<br />
| Radio Oberkrain || Wangen || Deutschland ||align="center" | 0 || || http://89.149.226.229<br />
|- style="background-color:#ffffff;"<br />
| Radio Okerwelle || Braunschweig || Deutschland ||align="center" | 0 || || http://streamplus25.leonex.de<br />
|- style="background-color:#ffffff;"<br />
| Radio Paloma || Berlin || Deutschland ||align="center" | 0 || || http://sc1.netstreamer.net:8140<br />
|- style="background-color:#ffffff;"<br />
| Radio RaBe || Bern || Schweiz ||align="center" | 0 || || http://wma.rabe.ch<br />
|- style="background-color:#ffffff;"<br />
| Radio Rüsselsheim || Rüsselsheim || Deutschland ||align="center" | 0 || || http://stream.mpango.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Radio Salü || Saarbrücken || Deutschland ||align="center" | 0 || || http://62.27.44.59/radiosalue/livestream96s.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW || Magdeburg || Deutschland ||align="center" | 0 || || mms://62.27.87.43/radiosaw$livestream.wma<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW 70er || Magdeburg || Deutschland ||align="center" | 0 || || http://stream.saw-musikwelt.de:8000/saw70er<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW 80er || Magdeburg || Deutschland ||align="center" | 0 || || http://stream.saw-musikwelt.de:8000/saw80er<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW 90er || Magdeburg || Deutschland ||align="center" | 0 || || http://stream.saw-musikwelt.de:8000/saw90er<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW Neuheiten || Magdeburg || Deutschland ||align="center" | 0 || || http://stream.saw-musikwelt.de:8000/sawneuheiten<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW Rock || Magdeburg || Deutschland ||align="center" | 0 || || http://stream.saw-musikwelt.de:8000/sawrock<br />
|- style="background-color:#ffffff;"<br />
| Radio SAW Schlager || Magdeburg || Deutschland ||align="center" | 0 || || http://stream.saw-musikwelt.de:8000/sawschlager<br />
|- style="background-color:#ffffff;"<br />
| Radio Schwarze Welle || Gelsenkirchen || Deutschland ||align="center" | 0 || || http://85.25.120.73:7500<br />
|- style="background-color:#ffee99;"<br />
| Radio Seefunk || Konstanz || Deutschland ||align="center" | 128 || 09.10.16 || http://webradio.radio-seefunk.de:8000<br />
|- style="background-color:#ddeeaa;"<br />
| Radio St(H)örfunk || Schwäbisch Hall || Deutschland ||align="center" | 112 || 09.10.16 || http://stream.sthoerfunk.de:7000/sthoerfunk.ogg<br />
|- style="background-color:#ffffff;"<br />
| Radio Stephansdom || Wien || Österreich ||align="center" | 0 || || http://srvhost24.serverhosting.apa.net:8000/rsdstream128<br />
|- style="background-color:#ffee99;"<br />
| Radio Swiss Classic || Bern || Schweiz ||align="center" | 128 || 09.10.16 || http://stream-3.ssatr.ch:80/rsc/mp3<br />
|- style="background-color:#ffee99;"<br />
| Radio Swiss Jazz || Bern || Schweiz ||align="center" | 128 || 09.10.16 || http://stream-1.ssatr.ch:80/rsj/mp3<br />
|- style="background-color:#ffee99;"<br />
| Radio Swiss Pop || Bern || Schweiz ||align="center" | 128 || 09.10.16 || http://stream-2.ssatr.ch/rsp/mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio T || Chemnitz || Deutschland ||align="center" | 0 || || http://streaming.fueralle.org:8000/radiot.ogg<br />
|- style="background-color:#ffffff;"<br />
| Radio TEDDY 106.8 || Potsdam || Deutschland ||align="center" | 0 || || http://c1.netstreamer.net:9000<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Ton Region Main-Tauber || Aalen || Deutschland ||align="center" | 64 || 09.10.16 || http://live.radio-ton.de/live-mgh<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Ton Baden Württemberg || Aalen || Deutschland ||align="center" | 64 || 09.10.16 || http://live.radio-ton.de/live-na<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Ton Ostwürttemberg || Aalen || Deutschland ||align="center" | 64 || 09.10.16 || http://live.radio-ton.de/live-owb<br />
|- style="background-color:#ddeeaa;"<br />
| Radio Tonkuhle || Hildesheim || Deutschland ||align="center" | 96 || 09.10.16 || http://stream.tonkuhle.de:8000/hifi.ogg<br />
|- style="background-color:#ffffff;"<br />
| Radio UnArt || Dortmund || Deutschland ||align="center" | 0 || || http://steven-dark.com:8000<br />
|- style="background-color:#ffee99;"<br />
| Radio Unerhört Marburg || Marburg || Deutschland ||align="center" | 128 || 09.10.16 || http://stream.radio-rum.de:8000/rum.mp3<br />
|- style="background-color:#ffffff;"<br />
| Radio X || Frankfurt / Main || Deutschland ||align="center" | 0 || || http://radiox.mapsolute.com:8000<br />
|- style="background-color:#ffee99;"<br />
| RADIO ZÜRISEE || Rapperswil || Schweiz ||align="center" | 128 || 09.10.16 || http://www.radio.ch/media/stream/radiozuerisee128k.m3u<br />
|- style="background-color:#ffffff;"<br />
| Radio ZuSa || Uelzen || Deutschland ||align="center" | 0 || || http://stream.radio-zusa.net:8000/zusa-hifi.ogg<br />
|- style="background-color:#ffffff;"<br />
| Radio-Z || Nürnberg || Deutschland ||align="center" | 0 || || http://www.radio-z.net:8000/Radio-Z<br />
|- style="background-color:#ffffff;"<br />
| Radio4Humans || Romanshorn || Schweiz ||align="center" | 0 || || http://s2.global-streaming.net:6470<br />
|- style="background-color:#ffee99;"<br />
| RadioCrazy Classical || Küsnacht || Schweiz ||align="center" | 128 || 09.10.16 || http://stream2137.init7.net<br />
|- style="background-color:#ffee99;"<br />
| RadioCrazy Jazz || Küsnacht || Schweiz ||align="center" | 128 || 09.10.16 || http://stream2138.init7.net:80<br />
|- style="background-color:#ffffff;"<br />
| RadioCrazy Modern Jazz || Küsnacht || Schweiz ||align="center" | 0 || || http://stream2140.init7.net:80<br />
|- style="background-color:#ffffff;"<br />
| RadioCrazy Opera || Küsnacht || Schweiz ||align="center" | 0 || || http://stream2139.init7.net:80<br />
|- style="background-color:#ffffff;"<br />
| Radiofabrik || Salzburg || Österreich ||align="center" | 0 || || http://master.radiofabrik.at:8000/rf_high.mp3<br />
|- style="background-color:#ffffff;"<br />
| Ramasuri || Weiden || Deutschland ||align="center" | 0 || || http://ramasuri.blm.netlantic.net:80/live_ramasuri.mp3<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.HOUSE || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://House-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.TECHHOUSE || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://Progressive-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.HARDER || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://HardeR-high.RauteMusik.FM<br />
|- style="background-color:#ffffff;"<br />
| RauteMusik #MUSIK.SCHLAGER || Aachen || Deutschland ||align="center" | 0 || || http://www.SchlagerRadio.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.BIGCITYBEATS || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://BCB-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.DRUMSTEP || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://DrumStep-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.TRANCE || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://Trance-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #ChartHits-Top40 || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://Christmas-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #MUSIK.ORIENTAL || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://Oriental-high.RauteMusik.FM<br />
|- style="background-color:#ffffbb;"<br />
| RauteMusik #Musik.DeutschRap || Aachen || Deutschland ||align="center" | 192 || 09.10.16 || http://Deutschrap-high.RauteMusik.FM<br />
|- style="background-color:#ffee99;"<br />
| RBB Kulturradio || Berlin / Potsdam || Deutschland ||align="center" | 128 || 09.10.16 || http://rbb-mp3-kulturradio-m.akacast.akamaistream.net/7/935/292095/v1/gnl.akacast.akamaistream.net/rbb_mp3_kulturradio_m<br />
|- style="background-color:#ccffaa;"<br />
| RBB Kulturradio LowQuality || Berlin / Potsdam || Deutschland ||align="center" | 48 || 09.10.16 || http://rbb-mp3-kulturradio-s.akacast.akamaistream.net/7/921/292095/v1/gnl.akacast.akamaistream.net/rbb_mp3_kulturradio_s<br />
|- style="background-color:#ffee99;"<br />
| RBB radioeins || Berlin / Potsdam || Deutschland ||align="center" | 128 || 09.10.16 || http://rbb-mp3-radioeins-m.akacast.akamaistream.net/7/854/292097/v1/gnl.akacast.akamaistream.net/rbb_mp3_radioeins_m<br />
|- style="background-color:#ccffaa;"<br />
| RBB radioeins || Berlin / Potsdam || Deutschland ||align="center" | 48 || 09.10.16 || http://rbb-mp3-radioeins-s.akacast.akamaistream.net/7/832/292097/v1/gnl.akacast.akamaistream.net/rbb_mp3_radioeins_s<br />
|- style="background-color:#ffee99;"<br />
| RBB Fritz || Berlin / Potsdam || Deutschland ||align="center" | 128 || 09.10.16 || http://rbb-mp3-fritz-m.akacast.akamaistream.net/7/799/292093/v1/gnl.akacast.akamaistream.net/rbb_mp3_fritz_m<br />
|- style="background-color:#ccffaa;"<br />
| RBB Fritz LowQuality || Berlin / Potsdam || Deutschland ||align="center" | 48 || 09.10.16 || http://rbb-mp3-fritz-s.akacast.akamaistream.net/7/817/292093/v1/gnl.akacast.akamaistream.net/rbb_mp3_fritz_s<br />
|- style="background-color:#ffee99;"<br />
| RBB Antenne Brandenburg || Berlin / Potsdam || Deutschland ||align="center" | 128 || 09.10.16 || http://rbb-mp3-antenneb-m.akacast.akamaistream.net/7/516/292092/v1/gnl.akacast.akamaistream.net/rbb_mp3_antenneb_m<br />
|- style="background-color:#ccffaa;"<br />
| RBB Antenne Brandenburg LowQuality || Berlin / Potsdam || Deutschland ||align="center" | 48 || 09.10.16 || http://rbb-mp3-antenneb-s.akacast.akamaistream.net/7/534/292092/v1/gnl.akacast.akamaistream.net/rbb_mp3_antenneb_s<br />
|- style="background-color:#ffee99;"<br />
| RBB radioBERLIN || Berlin / Potsdam || Deutschland ||align="center" | 128 || 09.10.16 || http://rbb-mp3-radioberlin-m.akacast.akamaistream.net/7/70/292096/v1/gnl.akacast.akamaistream.net/rbb_mp3_radioberlin_m<br />
|- style="background-color:#ccffaa;"<br />
| RBB radioBERLIN || Berlin / Potsdam || Deutschland ||align="center" | 48 || 09.10.16 || http://rbb-mp3-radioberlin-s.akacast.akamaistream.net/7/52/292096/v1/gnl.akacast.akamaistream.net/rbb_mp3_radioberlin_s<br />
|- style="background-color:#ffee99;"<br />
| Rheinwelle || Wiesbaden || Deutschland ||align="center" | 128 || 09.10.16 || http://s2.onlinestream.de:6640<br />
|- style="background-color:#ffffbb;"<br />
| RMN powerstream || Kleinblittersdorf || Deutschland ||align="center" | 192 || 09.10.16 || http://server.powerstream.de:30846<br />
|- style="background-color:#ffffbb;"<br />
| RMN radio || Kleinblittersdorf || Deutschland ||align="center" | 160 || 09.10.16 || http://streamserver1.radiomelodienet.de:8022<br />
|- style="background-color:#ffffff;"<br />
| RMN relax || Kleinblittersdorf || Deutschland ||align="center" | 0 || || http://91.121.176.177:8023<br />
|- style="background-color:#ffee99;"<br />
| RMN schlagerhoelle || Kleinblittersdorf || Deutschland ||align="center" | 128 || 09.10.16 || http://server1.schlagerhoelle.de:30842<br />
|- style="background-color:#ffffff;"<br />
| RMN soulstar || Kleinblittersdorf || Deutschland ||align="center" | 0 || || http://server1.rmnsoulstar.de:8010<br />
|- style="background-color:#ffffff;"<br />
| Rock || Hamburg || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/rock<br />
|- style="background-color:#ffee99;"<br />
| Rockantenne || München || Deutschland ||align="center" | 128 || 09.10.16 || http://mp3.webradio.rockantenne.de:80<br />
|- style="background-color:#ffffbb;"<br />
| Rockland Radio || Pirmasens/Mainz || Deutschland ||align="center" | 192 || 09.10.16 || http://188.94.97.90/rockland.mp3<br />
|- style="background-color:#ffee99;"<br />
| rockradio.de || Berlin || Deutschland ||align="center" | 128 || 09.10.16 || http://rockradio.de:8090<br />
|- style="background-color:#ffee99;"<br />
| Rocky.FM || Berlin || Deutschland ||align="center" | 128 || 09.10.16 || http://sc1.netstreamer.net:8020<br />
|- style="background-color:#ffee99;"<br />
| RPR1 || Ludwigshafen || Deutschland ||align="center" | 128 || 09.10.16 || http://rpr1.fmstreams.de/stream1<br />
|- style="background-color:#ffee99;"<br />
| RPR1.80er || Ludwigshafen || Deutschland ||align="center" | 128 || 09.10.16 || http://rpr1.fmstreams.de/stream4<br />
|- style="background-color:#ffee99;"<br />
| RPR1.Rock || Ludwigshafen || Deutschland ||align="center" | 128 || 09.10.16 || http://rpr1.fmstreams.de/stream3<br />
|- style="background-color:#ffee99;"<br />
| RPR1.Top40 || Ludwigshafen || Deutschland ||align="center" | 128 || 09.10.16 || http://rpr1.fmstreams.de/stream5<br />
|- style="background-color:#ffee99;"<br />
| RPR1.Best of 80s || Ludwigshafen || Deutschland ||align="center" | 128 || 09.10.16 || http://rpr1.fmstreams.de/stream2<br />
|- style="background-color:#ffee99;"<br />
| RundFunk Meissner || Eschwege || Deutschland ||align="center" | 128 || 09.10.16 || http://s8.pop-stream.de:8650<br />
|- style="background-color:#ffee99;"<br />
| Russian Radio || Cuxhaven || Deutschland ||align="center" | 128 || 09.10.16 || http://play.russian-radio.de:8000<br />
|- style="background-color:#ffee99;"<br />
| Schwarzwaldradio || Offenburg || Deutschland ||align="center" | 128 || 09.10.16 || http://str31.creacast.com/hitradio_ohr_thema1<br />
|- style="background-color:#ffffff;"<br />
| Sound-Generation.FM Club || Thale || Deutschland ||align="center" | 0 || || http://78.159.104.157<br />
|- style="background-color:#ffffff;"<br />
| Sound-Generation.FM Extreme || Thale || Deutschland ||align="center" | 0 || || http://extremestream.sound-generation.fm<br />
|- style="background-color:#ffffff;"<br />
| Sound-Generation.FM House || Thale || Deutschland ||align="center" | 0 || || http://housestream.sound-generation.fm<br />
|- style="background-color:#ffffff;"<br />
| Sound-Generation.FM Main || Thale || Deutschland ||align="center" | 0 || || http://217.20.115.91:8000<br />
|- style="background-color:#ffffff;"<br />
| Soundportal || Graz || Österreich ||align="center" | 0 || || http://netradio01.soundportal.at:8100/live160<br />
|- style="background-color:#ffffff;"<br />
| soundstylez.fm Club || Erftstadt || Deutschland ||align="center" | 0 || || http://server2.blitz-stream.de:40060<br />
|- style="background-color:#ffffff;"<br />
| soundstylez.fm Main || Erftstadt || Deutschland ||align="center" | 0 || || http://server2.blitz-stream.de:40040<br />
|- style="background-color:#ffee99;"<br />
| SR 1 Live || Saarbrücken || Deutschland ||align="center" | 128 || 09.10.16 || http://sr1m.akacast.akamaistream.net/7/725/142685/v1/gnl.akacast.akamaistream.net/sr1m<br />
|- style="background-color:#ddeeaa;"<br />
| SR 1 Live LowQuality || Saarbrücken || Deutschland ||align="center" | 56 || 09.10.16 || http://sr1s.akacast.akamaistream.net/7/747/142685/v1/gnl.akacast.akamaistream.net/sr1s<br />
|- style="background-color:#ffee99;"<br />
| SR 2 Kulturradio || Saarbrücken || Deutschland ||align="center" | 128 || 09.10.16 || http://sr2m.akacast.akamaistream.net/7/375/142686/v1/gnl.akacast.akamaistream.net/sr2m<br />
|- style="background-color:#ddeeaa;"<br />
| SR 2 Kulturradio LowQuality || Saarbrücken || Deutschland ||align="center" | 56 || 09.10.16 || http://sr2s.akacast.akamaistream.net/7/349/142686/v1/gnl.akacast.akamaistream.net/sr2s<br />
|- style="background-color:#ffee99;"<br />
| SR 3 Saarlandwelle || Saarbrücken || Deutschland ||align="center" | 128 || 09.10.16 || http://sr3m.akacast.akamaistream.net/7/722/142687/v1/gnl.akacast.akamaistream.net/sr3m<br />
|- style="background-color:#ddeeaa;"<br />
| SR 3 Saarlandwelle LowQuality || Saarbrücken || Deutschland ||align="center" | 56 || 09.10.16 || http://sr3s.akacast.akamaistream.net/7/724/142687/v1/gnl.akacast.akamaistream.net/sr3s<br />
|- style="background-color:#ffee99;"<br />
| Antenne Saar || Saarbrücken || Deutschland ||align="center" | 128 || 09.10.16 || http://asm.akacast.akamaistream.net/7/495/305516/v1/gnl.akacast.akamaistream.net/asm<br />
|- style="background-color:#ddeeaa;"<br />
| Antenne Saar LowQuality || Saarbrücken || Deutschland ||align="center" | 56 || 09.10.16 || http://ass.akacast.akamaistream.net/7/513/305516/v1/gnl.akacast.akamaistream.net/ass<br />
|- style="background-color:#ffee99;"<br />
| SR 103.7 Unserding || Saarbrücken || Deutschland ||align="center" | 128 || 09.10.16 || http://udm.akacast.akamaistream.net/7/384/142688/v1/gnl.akacast.akamaistream.net/udm<br />
|- style="background-color:#ddeeaa;"<br />
| SR 103.7 Unserding LowQuality || Saarbrücken || Deutschland ||align="center" | 56 || 09.10.16 || http://uds.akacast.akamaistream.net/7/410/142688/v1/gnl.akacast.akamaistream.net/uds<br />
|- style="background-color:#ffee99;"<br />
| StadtRadio Goettingen || Göttingen || Deutschland ||align="center" | 128 || 09.10.16 || http://stream.stadtradio-goettingen.de:8000/stadtradio.mp3<br />
|- style="background-color:#ffffff;"<br />
| Suedstars-Radio.de || Bad Waldsee || Deutschland ||align="center" | 0 || || http://stream1.suedstars-radio.de:8000<br />
|- style="background-color:#ffffff;"<br />
| Sunray FM || Chemnitz || Deutschland ||align="center" | 0 || || http://sunray-fm.de:8000<br />
|- style="background-color:#ffffff;"<br />
| SwissGroove || Altstätten || Schweiz ||align="center" | 0 || || http://swiss1.impek.tv<br />
|- style="background-color:#ffee99;"<br />
| SWR info || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-info.akacast.akamaistream.net/7/40/137140/v1/gnl.akacast.akamaistream.net/swr-mp3-m-info<br />
|- style="background-color:#ddeeaa;"<br />
| SWR info || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-info.akacast.akamaistream.net/7/577/137140/v1/gnl.akacast.akamaistream.net/swr-mp3-s-info<br />
|- style="background-color:#ffee99;"<br />
| SWR DasDing || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-dasding.akacast.akamaistream.net/7/588/137139/v1/gnl.akacast.akamaistream.net/swr-mp3-m-dasding<br />
|- style="background-color:#ddeeaa;"<br />
| SWR DasDing || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-dasding.akacast.akamaistream.net/7/207/137139/v1/gnl.akacast.akamaistream.net/swr-mp3-s-dasding<br />
|- style="background-color:#ffee99;"<br />
| SWR1 Baden-Württemberg || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-swr1bw.akacast.akamaistream.net/7/245/137133/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr1bw<br />
|- style="background-color:#ddeeaa;"<br />
| SWR1 Baden-Württemberg || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-swr1bw.akacast.akamaistream.net/7/395/137133/v1/gnl.akacast.akamaistream.net/swr-mp3-s-swr1bw<br />
|- style="background-color:#ffee99;"<br />
| SWR1 Rheinland-Pfalz || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-swr1rp.akacast.akamaistream.net/7/467/137134/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr1rp<br />
|- style="background-color:#ddeeaa;"<br />
| SWR1 Rheinland-Pfalz || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-swr1rp.akacast.akamaistream.net/7/352/137134/v1/gnl.akacast.akamaistream.net/swr-mp3-s-swr1rp<br />
|- style="background-color:#ffee99;"<br />
| SWR2 || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-swr2.akacast.akamaistream.net/7/721/137135/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr2<br />
|- style="background-color:#ddeeaa;"<br />
| SWR2 || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-swr2.akacast.akamaistream.net/7/204/137135/v1/gnl.akacast.akamaistream.net/swr-mp3-s-swr2<br />
|- style="background-color:#ffee99;"<br />
| SWR3 || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-swr3.akacast.akamaistream.net/7/720/137136/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr3<br />
|- style="background-color:#ddeeaa;"<br />
| SWR3 || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-swr3.akacast.akamaistream.net/7/203/137136/v1/gnl.akacast.akamaistream.net/swr-mp3-s-swr3<br />
|- style="background-color:#ffee99;"<br />
| SWR4 Baden-Württemberg || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-swr4bw.akacast.akamaistream.net/7/426/137137/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr4bw<br />
|- style="background-color:#ddeeaa;"<br />
| SWR4 Baden-Württemberg || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-swr4bw.akacast.akamaistream.net/7/638/137137/v1/gnl.akacast.akamaistream.net/swr-mp3-s-swr4bw<br />
|- style="background-color:#ffee99;"<br />
| SWR4 Rheinland-Pfalz || Stuttgart || Deutschland ||align="center" | 128 || 09.10.16 || http://swr-mp3-m-swr4rp.akacast.akamaistream.net/7/906/137138/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr4rp<br />
|- style="background-color:#ddeeaa;"<br />
| SWR4 Rheinland-Pfalz || Stuttgart || Deutschland ||align="center" | 64 || 09.10.16 || http://swr-mp3-s-swr4rp.akacast.akamaistream.net/7/597/137138/v1/gnl.akacast.akamaistream.net/swr-mp3-s-swr4rp<br />
|- style="background-color:#ffffff;"<br />
| Techno4ever || Norderstedt || Deutschland ||align="center" | 0 || || http://listen.to.techno4ever.net<br />
|- style="background-color:#ffffff;"<br />
| TechnoBase.FM || Moers || Deutschland ||align="center" | 0 || || http://dsl.tb-stream.net:80<br />
|- style="background-color:#ffffff;"<br />
| Tiger-Radio! || Westerroenfeld || Deutschland ||align="center" | 0 || || http://85.25.150.17:8000<br />
|- style="background-color:#ffffff;"<br />
| TIMM House || Berlin || Deutschland ||align="center" | 0 || || http://dude.mp3streams.net/timmhouse<br />
|- style="background-color:#ffffff;"<br />
| Top 100 Single Chart || Thurnau || Deutschland ||align="center" | 0 || || http://87.118.78.7:8030<br />
|- style="background-color:#ffffff;"<br />
| top 100 station || Berlin || Deutschland ||align="center" | 0 || || http://housestream.sound-generation.fm<br />
|- style="background-color:#ffffff;"<br />
| TOP FM || Fürstenfeldbruck || Deutschland ||align="center" | 0 || || http://85.214.91.242:8000/stream_hq.mp3<br />
|- style="background-color:#ffffff;"<br />
| Top-128 || - || Schweiz ||align="center" | 0 || || mms://dms-cl-022.skypro-media.net/top-128<br />
|- style="background-color:#ffffbb;"<br />
| TranceBase.FM || Mönchengladbach || Deutschland ||align="center" | 192 || 09.10.16 || http://mp3.trb-stream.net<br />
|- style="background-color:#ffffff;"<br />
| TrueHipHop.FM || Gengenbach || Deutschland ||align="center" | 0 || || http://truehiphop.dyndns.org:9020<br />
|- style="background-color:#ffee99;"<br />
| UZIC - Techno Minimal || Lausanne || Schweiz ||align="center" | 128 || 09.10.16 || http://stream.uzic.ch:9010<br />
|- style="background-color:#ffffff;"<br />
| Vox Noctem || Nürnberg || Deutschland ||align="center" | 0 || || http://91.121.11.196:13030<br />
|- style="background-color:#ffee99;"<br />
| WDR 1 Live || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://1live.akacast.akamaistream.net/7/706/119434/v1/gnl.akacast.akamaistream.net/1live<br />
|- style="background-color:#ffee99;"<br />
| WDR 2 || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://wdr-mp3-m-wdr2-koeln.akacast.akamaistream.net/7/812/119456/v1/gnl.akacast.akamaistream.net/wdr-mp3-m-wdr2-koeln<br />
|- style="background-color:#ffee99;"<br />
| WDR 3 || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://wdr-3.akacast.akamaistream.net/7/47/119437/v1/gnl.akacast.akamaistream.net/wdr-3<br />
|- style="background-color:#ffee99;"<br />
| WDR 4 || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://wdr-4.akacast.akamaistream.net/7/42/119438/v1/gnl.akacast.akamaistream.net/wdr-4<br />
|- style="background-color:#ffee99;"<br />
| WDR 5 || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://wdr-5.akacast.akamaistream.net/7/41/119439/v1/gnl.akacast.akamaistream.net/wdr-5<br />
|- style="background-color:#ffee99;"<br />
| WDR Kiraka || Köln || Deutschland ||align="center" | 128 || 03.10.16 || http://kiraka.akacast.akamaistream.net/7/285/119443/v1/gnl.akacast.akamaistream.net/kiraka<br />
|- style="background-color:#ffffbb;"<br />
| WE LOVE HOUSE FM || Wiesbaden || Deutschland ||align="center" | 192 || 09.10.16 || http://we-love-house.fm:8000/stream<br />
|- style="background-color:#ffffff;"<br />
| WebRadio Troisdorf || Troisdorf || Deutschland ||align="center" | 0 || || http://80.237.152.110:9000<br />
|- style="background-color:#ffffbb;"<br />
| WoED.fm || Datteln || Deutschland ||align="center" | 192 || 09.10.16 || http://stream1-1.woed.de:80<br />
|- style="background-color:#ffffff;"<br />
| Wunschradio.fm || Hückelhoven || Deutschland ||align="center" | 0 || || http://stream.wunschradio.de/wunschradio/livestream.mp3<br />
|- style="background-color:#ffffff;"<br />
| Wüste Welle || Tübingen || Deutschland ||align="center" | 0 || || http://188.40.63.198:8000/stream<br />
|- style="background-color:#ffee99;"<br />
| YOU fm || Frankfurt || Deutschland ||align="center" | 128 || 09.10.16 || http://hr-mp3-m-youfm.akacast.akamaistream.net/7/246/142136/v1/gnl.akacast.akamaistream.net/hr-mp3-m-youfm<br />
|- style="background-color:#ccffaa;"<br />
| YOU fm LowQuality || Frankfurt || Deutschland ||align="center" | 48 || 09.10.16 || http://hr-mp3-s-youfm.akacast.akamaistream.net/7/454/142136/v1/gnl.akacast.akamaistream.net/hr-mp3-s-youfm<br />
|- style="background-color:#ffee99;"<br />
| YOU FM Just Music || Frankfurt || Deutschland ||align="center" | 128 || 09.10.16 || http://hr-mp3-m-youfm-justmusic.akacast.akamaistream.net/7/529/142137/v1/gnl.akacast.akamaistream.net/hr-mp3-m-youfm-justmusic<br />
|- style="background-color:#ffee99;"<br />
| YOU FM Sounds || Frankfurt || Deutschland ||align="center" | 128 || 09.10.16 || http://hr-mp3-m-youfm-sounds.akacast.akamaistream.net/7/360/142137/v1/gnl.akacast.akamaistream.net/hr-mp3-m-youfm-sounds<br />
|- style="background-color:#ffee99;"<br />
| YOU FM Club || Frankfurt || Deutschland ||align="center" | 128 || 09.10.16 || http://hr-mp3-m-youfm-club.akacast.akamaistream.net/7/910/142137/v1/gnl.akacast.akamaistream.net/hr-mp3-m-youfm_club<br />
|}<br />
<br />
<br />
----<br />
<br />
[[Multimedia|Zurück zur Multimedia-Übersicht]]<br />
[[Kategorie:Multimedia]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:SSH-X-Forwarding&diff=32843Diskussion:SSH-X-Forwarding2016-06-10T20:07:11Z<p>Robi: Warum Verweis auf Xming komplett zu entfernen?</p>
<hr />
<div>==ist es besser, unter Windows VcXsrv zu verwenden ? ==<br />
<br />
Betrifft Änderung vom 11:44, 9. Jun. 2016 <br />
<br />
Bitte prüfen ob und warum es hier sinnvoll erscheint bzw notwendig ist den Verweis auf Xming komplett zu entfernen. Ich persönlich arbeite gerne damit. <br />
[[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:07, 10. Jun. 2016 (CEST)</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Firefox&diff=32704Firefox2015-10-05T01:13:07Z<p>Robi: Anmerkung zu Installieren der SearchPlugIns</p>
<hr />
<div>{{Infobox_Software|<br />
Name= '''Firefox'''<br />[[Bild:Firefox.png]]<br />
|Screenshot= [[Bild:Firefox.jpg|240px]]<br />
|Beschreibung= Firefox 2.0 mit KDE 3.5.5 auf openSUSE 10.2<br />
|Hersteller= [http://www.mozilla.com Mozilla]<br />
|AktuelleVersion= 20.0<br />
|AktuelleVersionFreigabeDatum= 02.04.2013<br />
|Betriebssystem= Linux, OS X, Windows,<br />
|Kategorie= [[Webbrowser]]<br />
|Lizenz= [http://de.wikipedia.org/wiki/Mozilla_Public_License MLP]/[http://de.wikipedia.org/wikiGNU_General_Public_License GPL]/[http://de.wikipedia.org/wiki/GNU_Lesser_General_Public_License LGPL]<br />
|Deutsch= ja<br />
|Website= http://www.mozilla.com<br />
}}<br />
<br />
{{Box Test||<br />
* [[openSUSE]] 12.3<br />
* [[openSUSE]] 12.2<br />
* [[Fedora]] 18<br />
* [[Ubuntu]] 12.04<br />
* [[Ubuntu]] 12.10<br />
* [[Ubuntu]] 13.04<br />
* [[Arch Linux]]<br />
}}<br />
<br />
== Installation ==<br />
Firefox wird von den meisten Linux Distributionen mitgeliefert.<br />
<br />
'''openSUSE'''<br />
<br />
zypper in MozillaFirefox<br />
<br />
'''Fedora'''<br />
yum install firefox<br />
<br />
'''Ubuntu'''<br />
sudo apt-get install firefox<br />
<br />
'''Arch Linux'''<br />
pacman -S firefox<br />
<br />
<br />
Die aktuellen Versionen von Firefox werden unter openSUSE, Fedora und Ubuntu bei unterstützten Versionen immer kurz nach dem offiziellen Release über die Update-Repos installiert. Arch Linux, als Rolling Release Distro, hat sowieso immer den aktuellen Firefox in den Repos.<br />
<br />
== Zusätzliche Repositories ==<br />
openSUSE bietet ein Repo an wo aktuellere und getestete Pakete von Firefox enthalten sind. Sie werden aber nicht offiziell unterstützt. Das Repo befindet sich hier:<br />
[http://download.opensuse.org/repositories/mozilla/]<br />
<br />
Zum Hinzufügen des Repos geht man folgendermaßen vor (am Beispiel von openSUSE 12.3).<br />
zypper ar -f http://download.opensuse.org/repositories/mozilla/openSUSE_12.3/ Firefox-latest<br />
zypper ref<br />
<br />
== Linux-Club Forum als PlugIn für Firefox==<br />
<br />
SearchPlugin für den Linux-Club. folgendes hier kopieren und als Datei '''linux-club.xml''' abspeichern<br />
<br />
<br />
<pre><SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"><br />
<ShortName>Linux-Club</ShortName><br />
<Description>Linux-Club Search</Description><br />
<InputEncoding>utf-8</InputEncoding><br />
<Image width="16" height="16">data:image/x-icon;base64,<br />
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABwlBMVEX////3+Pbo6Ojj4+Pl5eX+/v7z9/HB3Knd5M7h5Mv5+vmi0qunq6ews6z9/f2+1LeFrHumu5+exZNMmT5dhE9dfEXE1bb3+vX8/fyKwHo9hyg0bSZphmF/s3E7jCY8gCVboypksyym04b9/v3M58M/jig6hSZCbzbd4dswZSEzbCIwTSAyUB9xiWHu9OvQ58ifyJS3069/emgyGhePNC7Ky8DQ1Mz7+/r8/PutzKHW4ND6+vrI08NJVkYnIhaqSEWBq1Tj8drl6eOQvoM0bSKYw4W63qn2+vL//v/f6dtviGBWYFIyWSBzaylvlkGYqoyAin16oXBQdEY/azJGczff5d7z8/P09fSfw5BSijQyXyAyVB9QcCiDpjaCvFny+O3c4Nv8/Pz2+PXG0cOFpH1UnzpZritVmShMhiZLYiVrei9ZnSio2oaGwm9QnClBfStmqzZSXEdpa2QvThyKsm1wpVpZpTFqjmA3WCPb5dO60bQlPx2irpvt8urP28p4o2Q2aSd6iXDf6dpehFQqRhxalTFroEPo6uTB17xKmSpXnitlqzijvYrFz8KyvqvLz8n+/v3L4MaxvqiwvavQ0875+fggVVQjAAAAAWJLR0QAiAUdSAAAAMhJREFUGNNjYAABRiZmFlYGJMDGzsGJIsDFzcMLF+DjFxAUEhYRFROH8CUkpaRlZOXkFRSVIALKKqpq6hqaWto6ulAtevoGhkbGJqZm5haWViCDWFmtbWzt7B0cnZxdXN3cgSIenl7ePr5+/gGBQcEhoQysYeERkVHRMbFx8aysFgmJDEnJKalp6RmZWdk5MIew5ublFxQWFZfABUrLyisqq6praqGOZa2rb2hsam5pbWuHKeno7Oru6e3rT4RpmjBx0uQpUyEaAPgZLId7zyewAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA1VDAxOjU4OjExKzAyOjAwUQy4zQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOC0xMVQxMzoyMzoyOCswMjowMCifWQ8AAAAASUVORK5CYII=</Image><br />
<Url type="text/html" method="GET" template="http://linux-club.de/forum/search.php"><br />
<Param name="keywords" value="{searchTerms}"/><br />
<Param name="terms" value="all"/><br />
<Param name="sc" value="1"/><br />
<Param name="sf" value="all"/><br />
<Param name="sr" value="posts"/><br />
<Param name="sk" value="t"/><br />
<Param name="sd" value="d"/><br />
<Param name="st" value="0"/><br />
<Param name="ch" value="600"/><br />
<Param name="submit" value="Suche"/><br />
</Url><br />
</SearchPlugin><br />
</pre><br />
<br />
== Linux-Club Wiki als PlugIn für Firefox==<br />
<br />
SearchPlugin für das Linupedia. folgendes hier kopieren und als '''linupedia.xml''' abspeichern<br />
<br />
<br />
<pre><SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"><br />
<ShortName>LC-Wiki</ShortName><br />
<Description>Linux-Club-Wiki Search</Description><br />
<InputEncoding>utf-8</InputEncoding><br />
<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACBFBMVEX////u+unO7sH6/Pn9/fj5+fn+/v77/frJ8bqH2mnF5bb8/frc68fY4M/j5939/f35/fit65ZyyleEu2nS6cqMrH2aqofR2MT7/fu576WB2WOKunlxs2FKkC5trzaUyGHU4c31+e/V7LSLy2nQ3siFqWlWjC5bmCpfqimkxY3y+PD5+/f9/vm80rOdurGHsbWYknSpXTaNVCV9VCGCn2mzyaKGsm6Xt4P1+PP+/v21zOKgw+mat+NqlnKPWx6hWj6LZTGYtX+gwoJ1skZurkHI3rff6PSqxuh/p8BSgGBNcSeSTh6WcyuGt2u22J6t2Yeb1W7L57X4/PfT58bn8N3u8+rJ3clwrF9LkiNWmyp1mx97lRlypEGSznjL57rs9eb8/vzX6s6by4OCwGdpwFJWvjxpsi9Ofh1FXwdhexZVjjKd0YKF4GHD5a37/fn1+/Td89fO88V3zWRgrC5Pby13f2aKyHhXpkO2zqaD2WaUzXno89z3/vdttGBUgjnU28zt+emP43tql1bs8Oq94q7l8N/9/vz9/v3J5MFclz+2w6rv/+uK5HNllj3V5MP9/fzo8OGmz5B7ulVtojzl7dz+//6+9q1vwER8rU3S4rP+/vr///3T2aOHrVZ5oURxoELU4cT3/vXX9s3S5bfm8cn8/fb+/vz19Obq7dLP1rnR3qnv8eVhDjjCAAAAAWJLR0QAiAUdSAAAAOFJREFUGNNjYAACRiZmBhZWNgYYYOfg5OLm4eXjhwkICAoJi4iKicNVSEhKScvIyskrwAQUlZRVVNXUNTS1tMF8HV09fQNDI2MTUzNzC5CApZW1ja2dvYOjk7OLKwMD0DI3dw9PL28fXz//gEA2hqDgkNCw8IjIqOiY2Lj4BDYGy8Sk5JTUtPSMzKzsnNw8kBn5BYVFxSWlZeUVlVXVEHtrauvqGxqbmlta28D89o7OLobunt6+foj8hImTJk9hmDpt+oyZs0D82XPmzpu/gIFh4aLFS5aCBJYtX7Fy1Wq4xwDfUDm+CDprggAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMC0wNFQyMTo1NzowNCswMjowMHGTmUUAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTAtMDRUMjE6NTc6MDQrMDI6MDAAziH5AAAAAElFTkSuQmCC </Image><br />
<Url type="text/html" method="GET" template="http://linux-club.de/wiki/mediawiki/index.php?title=Spezial:Suche"><br />
<Raram name="fulltext" value="Suche"/><br />
<Param name="profile" value="default"/><br />
<Param name="search" value="{searchTerms}"/><br />
</Url><br />
<Url type="application/x-suggestions+json" template="http://linux-club.de/wiki/mediawiki/api.php?action=opensearch&amp;search={searchTerms}"/><br />
</SearchPlugin></pre><br />
<br />
== Anmerkung zu Installieren der SearchPlugIns ==<br />
<br />
Zum Installieren der SearchPlugins für den Linux-Club und/oder das Linupedia-Wiki wird ein kleiner Webserver benötigt. (leider können haben wir hier auf den Servern nicht die vollen Administrationsrechte, um das hier auf dieser Plattform gleich mit anzubieten)<br />
<br />
Es reicht irgend ein kleiner Webserver, zB. '''lighttpd''' oder ihr könnt auch irgend einen nehmen der sowieso schon bei euch läuft.<br />
<br />
Kopiert die beiden xml Dateien von den Abschnitten oben in das "document-root" des Webservers.<br><br />
Zusätzlich wird noch eine kleine HTML Datei benötigt. Diese als '''index.html''' abspeichern, (eventuell anderer Name wenn der Webserver schon eine Index-Datei hat.)<br />
Wenn der Webserver nicht local auf eurer Maschiene läuft, oder ihr von einem anderem Rechner auch noch zugreifen wollt, dann müsst ihr das "localhost" in der Datei durch den Namen oder der IP des Rechners mit dem Webserver austauschen.<br />
<pre><br />
<html><br />
<H2>Searchplugins fuer Linux-Club und vom Linupedia</H2><br />
<br />
Mit den folgenden Links koennen die Suchprovider fuer Linux-Club und das Linupedia-Wiki <br><br />
zum eurem Webbrowser hinzugefuegt werden.<br><br />
<br><br />
<a href="javascript:window.external.AddSearchProvider('http://localhost/linux-club.xml');" <br />
title="Linux-Club-Search" <br />
name="Linux-Club Search">SearchPlugin Linux-Club<br />
</a><br />
<br><br />
<br><br />
<a href="javascript:window.external.AddSearchProvider('http://localhost/linupedia.xml');" <br />
title="LC-Wiki Search" <br />
name="LC-Wiki Search">SearchPlugin Linux-Club-Wiki<br />
</a><br />
</html></pre><br />
<br />
jetzt noch darauf achten, dass Leserechte für "ALLE" auf den 3 Dateien sind.<br><br />
Dann könnt ihr den Webserver kurz starten und von euren Browsern aufrufen. Dort findet ihr 2 Links mit denen mit 2 Klicks die SearchPlugins zu installieren gehen. Danach könnt ihr den Webserver wieder stoppen und die 3 Dateien löschen, wenn ihr wollt, für die Suchfunktion werden sie nicht benötigt.<br />
<br />
Getestet sind die Plugins derzeit nur mit Firefox 37.0.2, sollte aber mit anderen Versionen genau so funktionieren. Welche anderen Browser das so auch akzeptieren ist im Moment noch nicht getestet, sollte dort aber auch gehen.<br />
<br />
== Erweiterungen ==<br />
<br />
'''Adblock'''<br /><br />
Blockt die nervige Werbung<br />
* https://addons.mozilla.org/firefox/10/<br />
<br />
'''All-In-One Sidebar'''<br /><br />
Wie beim Internet Explorer gibt es eine Seitenschublade, in der dann Erweiterungen, Bockmarks etc. gespeichert werden.<br />
* https://addons.mozilla.org/firefox/1027/<br />
<br />
'''Bandwidth Tester'''<br /><br />
Zur Prüfung der Geschwindigkeit der Internetverbindung. Ist leider noch nicht für FF1.5 upgedatet. Aber für Mozilla. * https://addons.mozilla.org/firefox/178/<br />
<br />
'''Bookmarks Synchronizer 3'''<br /><br />
über den Apache oder ftp Server lassen sich die Bookmarks auf einem Server lagern<br />
* https://addons.mozilla.org/firefox/2367/<br />
<br />
'''Bookmark Sync and Sort'''<br /><br />
Noch etwas kompfortabler: <br />
* https://addons.mozilla.org/firefox/2367/<br />
<br />
'''BrowseAtWork'''<br /><br />
Bei einem rechten Mausklick auf einem Link, befindet sich dann eine zusätzliche Option "BrowseAtWork", womit dann eine Seite anonym geöffnet wird. Dies eignet sich besonders beim Öffnen aus den Google Suchergebnissen.<br />
* https://addons.mozilla.org/firefox/2059/<br />
<br />
'''Clear Private Data'''<br /><br />
Über "Extras - Private Daten löschen - Private Daten jetzt löschen" lässt sich nun durch ein neues icon welches über "Ansicht - symbolleisten - Anpassen" eingefügt werden kann mit einem Handgriff erledigen. Es ist das icon mit dem Schloss.<br />
* https://addons.mozilla.org/firefox/1280/<br />
<br />
'''ConQuery'''<br /><br />
Suche nach markiertem Wort mit rechtem Mausklick - auch für Mozilla, und Thunderbird.<br />
* https://addons.mozilla.org/firefox/231/<br />
<br />
'''CookieCuller'''<br /><br />
Ein Cookie-Manager, um wichtige Cookies zu schützen, und andere zu löschen. - Auch für Mozilla<br />
* https://addons.mozilla.org/firefox/82/<br />
<br />
'''DictonarySearch'''<br />
<br />
'''DOM Inspector'''<br />
<br />
'''DownThemAll'''<br /><br />
Leicht bedienbarer Massen-Download-Manager.<br />
* https://addons.mozilla.org/firefox/201/<br />
<br />
'''Fasterfox'''<br /><br />
Macht den Firefox durch Optimierungen schneller.<br />
* https://addons.mozilla.org/firefox/1269/<br />
<br />
'''FireFTP'''<br /><br />
integrierter FTP-Client<br />
* https://addons.mozilla.org/firefox/684/<br />
<br />
'''FlashGot'''<br /><br />
Um Flashplayer abspielen zu könen wie z.B. * http://www.yehudi.de/Musik.htm MP3 abgespielt werden muss folgendes PlugIn installiert sein:<br />
* https://addons.mozilla.org/firefox/220/<br />
Auch für Mozilla<br />
<br />
'''Forecastfox'''<br /><br />
Nette kleine'''Wetteranzeige''' in Firefox unten rechts, mit der man sich das örtliche Wetter für heute und die nächsten Tage anzeigen lassen kann. Auch für Mozilla. * https://addons.mozilla.org/firefox/398/ (=> Link mit Infos und Screenshots)<br />
<br />
'''FoXWiki'''<br />
* https://addons.mozilla.org/firefox/2358/<br />
<br />
'''[[Google Toolbar]]'''<br />
* http://www.google.com/tools/firefox/toolbar/FT2/intl/de/index.html?utm_campaign=de&utm_source=de-ha-ww-google&utm_medium=ha&utm_term=google%20toolbar<br />
<br />
'''gTranslate'''<br /><br />
Übersetzen von ausgesuchten Wörtern innerhalb einer Webseite über das Kontextmenü, nutzt die Übersetzungsdienste von Google.<br />
* https://addons.mozilla.org/firefox/918/<br />
<br />
'''html Validator'''<br /><br />
Überprüft den Quellcodet mit der Hilfe von HTML Tidy.<br />
* https://addons.mozilla.org/firefox/249/<br />
<br />
'''HTML Validator (based on CSE HTML Validator) 1.2.2'''<br />
* https://addons.mozilla.org/firefox/887/<br />
<br />
'''Niche Watch Tool'''<br />
* https://addons.mozilla.org/firefox/2279/<br />
<br />
'''Session Saver'''<br /><br />
Sichert alle Tabs einer Session. Nachteil: Muss deaktiviert werden, um neue Erweiterungen zu installieren. Beim Updaten gibt es diese Problematik nicht.<br />
* https://addons.mozilla.org/firefox/436/<br />
<br />
'''Snapper'''<br />
* https://addons.mozilla.org/firefox/2703/<br />
<br />
'''Sort Bookmarks'''<br />
Hier bestehen weitere Sortiermöglichkeiten der Bookmarks. <br />
* https://addons.mozilla.org/firefox/51/<br />
<br />
'''Tabbrowser Preferences'''<br />
erweiterte Kontrollmöglichkeit beim Tabbed-Browsing. Konfiguration für diese Erweiterung befinden sich unter Extras -> Einstellungen -> Tabbed-Browsing.<br />
* https://addons.mozilla.org/firefox/158/<br />
<br />
'''Total Validator 2.3'''<br />
* https://addons.mozilla.org/firefox/2318/<br />
<br />
<br />
==== Derzeit fehlende Erweiterungen ====<br />
<br />
* About:Config<br />
* All-In-One-Sidebar<br />
* Bookmarksynchronizer - umsteigen auf Bookmarksynchronizer3<br />
* ConQuery<br />
* SessionSaver<br />
<br />
Dies sind nur diejenigen, von denen ich es weiß.<br />
<br />
Eine Liste möglicher Erweiterungen für Firefox findet sich hier oder auf [https://addons.mozilla.org/firefox/extensions/ dieser Internetseite (Firefox Add-ons)].<br />
<br />
==== Quellenangabe ====<br />
Der Tipp stammt von '''Don Pedro''' aus diesem Thread des Linux-Club: http://www.linux-club.de/ftopic71142.html<br />
<br />
== Persönliche Daten ==<br />
<br />
Deine persönliche Daten (z.B. Lesezeichen von FF) liegen alle in versteckten Ordnern in deinem Home Verzeichnis.<br />
Konqueror => Ansicht => Versteckte Dateien anzeigen<br />
Die gesamten Einstellungen von Firefox liegen z.B. im versteckten Verzeichnis <br />
/home/Username/.mozilla<br />
insbesondere:<br />
/home/Username/.mozilla/firefox<br />
<br />
=== Migration ===<br />
<br />
Beim Firefox können die Einstellungen bequem in ein anderes OS getauscht werden. Unter Linux befinden sich wie oben unter persönliche Daten beschrieben die Profile.<br />
<br />
Unter OS X sind diese unter<br />
/Users/Username/Libary/Application Support/Firefox<br />
zu finden.<br />
<br />
Die Profile werden mit einer Codierungskennung.default in einem Ordner angelegt. Bei Linux liegt dieser direkt in dem Ordner "firefox" bei OS X liegt dieser unter dem Ordner "Firefox" in "Profiles". Dafür muss dann in der Datei "profiles.ini" der Pfad zu den Profilordnern mit der Zu oder Hinwegname von einem "/" angepasst werden. Unter Linux nimmt man zum editieren dieser Datei [[Kat]] oder [[Kwrite]], unter OS X SubEthaEdit. <br />
<br />
Der Austausch mit Windows wäre vielleicht auch interssant, der dann gerne von jemand anderem, der dieses OS nutzt beschrieben werden kann.<br />
<br />
Vorteil dieser Methode ist, seine gesamten Bookmarks und sonstigen Zugänge immer auf einem USB Stick dabei zu haben. <br />
<br />
Probleme könnte es jedoch nur mit den Extensions geben. Hier hilft dann die Extensions aus dem Ordner zu entfernen, und dann anschließend neu zu installieren.<br />
<br />
== Schriftgröße ==<br />
<br />
<br />
=== kurzfristig ===<br />
<br />
Strg + Mausrad (nach oben größer, nach unten kleiner)<br />
<br />
<br />
=== Grundsätzlich ===<br />
<br />
Bearbeien > Einstellungen > Inhalt > Schriften & Farben > Erweitert<br />
<br />
== Quellen und weiterführende Links ==<br />
<br />
=== Wiki für den FireFox ===<br />
<br />
* https://wiki.mozilla.org/Firefox<br />
<br />
=== Anleitungen für Firefox ===<br />
* [http://plugindoc.mozdev.org/de-DE/faqs/firefox-linux.html Plugins und Mozilla Firefox unter Linux]<br />
<br />
=== Erweiterungen ===<br />
<br />
* https://addons.mozilla.org/de/firefox/<br />
* http://extensionroom.mozdev.org<br />
* http://www.extensionsmirror.nl<br />
<br />
== Editorentabelle ==<br />
<br />
<div style="border: 1px solid #6EBA26; background-color:#6EBA26; font-size:1px; height:8px; border-bottom:1px solid #6EBA26;"><br />
</div><br />
<div style="border: 1px solid #6EBA26; background-color:#FCFCE8; padding:7px;">'''<u>Editorentabelle</u>''' <br />
----<br />
'''Autor:'''<br />
----<br />
'''Ergänzungsautor:'''oc2pus, robi, Yehudi und andere<br />
----<br />
'''Lektor:'''<br />
----<br />
<!--'''Designer:'''<br />
----<br />
'''Bilder:'''<br />
----<br />
'''Dank an:'''<br />
----<br />
'''Artikel ins Wiki eingefügt von:'''<br />
---- --><br />
<small>''Wenn Du möchtest, dass Deine Arbeit wie die des Ursprungsautoren gewürdigt wird, trage Dich in dieser Tabelle entsprechend ein.''</small><br />
</div><br />
----<br />
<br />
[[Webbrowser | Zurück zu Webbrowser]][[Category:Webbrowser]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Firefox&diff=32703Firefox2015-10-05T00:48:25Z<p>Robi: neu Linupedia Wiki SearchPlugIn für Firefox</p>
<hr />
<div>{{Infobox_Software|<br />
Name= '''Firefox'''<br />[[Bild:Firefox.png]]<br />
|Screenshot= [[Bild:Firefox.jpg|240px]]<br />
|Beschreibung= Firefox 2.0 mit KDE 3.5.5 auf openSUSE 10.2<br />
|Hersteller= [http://www.mozilla.com Mozilla]<br />
|AktuelleVersion= 20.0<br />
|AktuelleVersionFreigabeDatum= 02.04.2013<br />
|Betriebssystem= Linux, OS X, Windows,<br />
|Kategorie= [[Webbrowser]]<br />
|Lizenz= [http://de.wikipedia.org/wiki/Mozilla_Public_License MLP]/[http://de.wikipedia.org/wikiGNU_General_Public_License GPL]/[http://de.wikipedia.org/wiki/GNU_Lesser_General_Public_License LGPL]<br />
|Deutsch= ja<br />
|Website= http://www.mozilla.com<br />
}}<br />
<br />
{{Box Test||<br />
* [[openSUSE]] 12.3<br />
* [[openSUSE]] 12.2<br />
* [[Fedora]] 18<br />
* [[Ubuntu]] 12.04<br />
* [[Ubuntu]] 12.10<br />
* [[Ubuntu]] 13.04<br />
* [[Arch Linux]]<br />
}}<br />
<br />
== Installation ==<br />
Firefox wird von den meisten Linux Distributionen mitgeliefert.<br />
<br />
'''openSUSE'''<br />
<br />
zypper in MozillaFirefox<br />
<br />
'''Fedora'''<br />
yum install firefox<br />
<br />
'''Ubuntu'''<br />
sudo apt-get install firefox<br />
<br />
'''Arch Linux'''<br />
pacman -S firefox<br />
<br />
<br />
Die aktuellen Versionen von Firefox werden unter openSUSE, Fedora und Ubuntu bei unterstützten Versionen immer kurz nach dem offiziellen Release über die Update-Repos installiert. Arch Linux, als Rolling Release Distro, hat sowieso immer den aktuellen Firefox in den Repos.<br />
<br />
== Zusätzliche Repositories ==<br />
openSUSE bietet ein Repo an wo aktuellere und getestete Pakete von Firefox enthalten sind. Sie werden aber nicht offiziell unterstützt. Das Repo befindet sich hier:<br />
[http://download.opensuse.org/repositories/mozilla/]<br />
<br />
Zum Hinzufügen des Repos geht man folgendermaßen vor (am Beispiel von openSUSE 12.3).<br />
zypper ar -f http://download.opensuse.org/repositories/mozilla/openSUSE_12.3/ Firefox-latest<br />
zypper ref<br />
<br />
== Linux-Club Forum als PlugIn für Firefox==<br />
<br />
SearchPlugin für den Linux-Club. folgendes hier kopieren und als Datei '''linux-club.xml''' abspeichern<br />
<br />
<br />
<pre><SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"><br />
<ShortName>Linux-Club</ShortName><br />
<Description>Linux-Club Search</Description><br />
<InputEncoding>utf-8</InputEncoding><br />
<Image width="16" height="16">data:image/x-icon;base64,<br />
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABwlBMVEX////3+Pbo6Ojj4+Pl5eX+/v7z9/HB3Knd5M7h5Mv5+vmi0qunq6ews6z9/f2+1LeFrHumu5+exZNMmT5dhE9dfEXE1bb3+vX8/fyKwHo9hyg0bSZphmF/s3E7jCY8gCVboypksyym04b9/v3M58M/jig6hSZCbzbd4dswZSEzbCIwTSAyUB9xiWHu9OvQ58ifyJS3069/emgyGhePNC7Ky8DQ1Mz7+/r8/PutzKHW4ND6+vrI08NJVkYnIhaqSEWBq1Tj8drl6eOQvoM0bSKYw4W63qn2+vL//v/f6dtviGBWYFIyWSBzaylvlkGYqoyAin16oXBQdEY/azJGczff5d7z8/P09fSfw5BSijQyXyAyVB9QcCiDpjaCvFny+O3c4Nv8/Pz2+PXG0cOFpH1UnzpZritVmShMhiZLYiVrei9ZnSio2oaGwm9QnClBfStmqzZSXEdpa2QvThyKsm1wpVpZpTFqjmA3WCPb5dO60bQlPx2irpvt8urP28p4o2Q2aSd6iXDf6dpehFQqRhxalTFroEPo6uTB17xKmSpXnitlqzijvYrFz8KyvqvLz8n+/v3L4MaxvqiwvavQ0875+fggVVQjAAAAAWJLR0QAiAUdSAAAAMhJREFUGNNjYAABRiZmFlYGJMDGzsGJIsDFzcMLF+DjFxAUEhYRFROH8CUkpaRlZOXkFRSVIALKKqpq6hqaWto6ulAtevoGhkbGJqZm5haWViCDWFmtbWzt7B0cnZxdXN3cgSIenl7ePr5+/gGBQcEhoQysYeERkVHRMbFx8aysFgmJDEnJKalp6RmZWdk5MIew5ublFxQWFZfABUrLyisqq6praqGOZa2rb2hsam5pbWuHKeno7Oru6e3rT4RpmjBx0uQpUyEaAPgZLId7zyewAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA1VDAxOjU4OjExKzAyOjAwUQy4zQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOC0xMVQxMzoyMzoyOCswMjowMCifWQ8AAAAASUVORK5CYII=</Image><br />
<Url type="text/html" method="GET" template="http://linux-club.de/forum/search.php"><br />
<Param name="keywords" value="{searchTerms}"/><br />
<Param name="terms" value="all"/><br />
<Param name="sc" value="1"/><br />
<Param name="sf" value="all"/><br />
<Param name="sr" value="posts"/><br />
<Param name="sk" value="t"/><br />
<Param name="sd" value="d"/><br />
<Param name="st" value="0"/><br />
<Param name="ch" value="600"/><br />
<Param name="submit" value="Suche"/><br />
</Url><br />
</SearchPlugin><br />
</pre><br />
<br />
== Linux-Club Wiki als PlugIn für Firefox==<br />
<br />
SearchPlugin für das Linupedia. folgendes hier kopieren und als '''linupedia.xml''' abspeichern<br />
<br />
<br />
<pre><SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"><br />
<ShortName>LC-Wiki</ShortName><br />
<Description>Linux-Club-Wiki Search</Description><br />
<InputEncoding>utf-8</InputEncoding><br />
<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACBFBMVEX////u+unO7sH6/Pn9/fj5+fn+/v77/frJ8bqH2mnF5bb8/frc68fY4M/j5939/f35/fit65ZyyleEu2nS6cqMrH2aqofR2MT7/fu576WB2WOKunlxs2FKkC5trzaUyGHU4c31+e/V7LSLy2nQ3siFqWlWjC5bmCpfqimkxY3y+PD5+/f9/vm80rOdurGHsbWYknSpXTaNVCV9VCGCn2mzyaKGsm6Xt4P1+PP+/v21zOKgw+mat+NqlnKPWx6hWj6LZTGYtX+gwoJ1skZurkHI3rff6PSqxuh/p8BSgGBNcSeSTh6WcyuGt2u22J6t2Yeb1W7L57X4/PfT58bn8N3u8+rJ3clwrF9LkiNWmyp1mx97lRlypEGSznjL57rs9eb8/vzX6s6by4OCwGdpwFJWvjxpsi9Ofh1FXwdhexZVjjKd0YKF4GHD5a37/fn1+/Td89fO88V3zWRgrC5Pby13f2aKyHhXpkO2zqaD2WaUzXno89z3/vdttGBUgjnU28zt+emP43tql1bs8Oq94q7l8N/9/vz9/v3J5MFclz+2w6rv/+uK5HNllj3V5MP9/fzo8OGmz5B7ulVtojzl7dz+//6+9q1vwER8rU3S4rP+/vr///3T2aOHrVZ5oURxoELU4cT3/vXX9s3S5bfm8cn8/fb+/vz19Obq7dLP1rnR3qnv8eVhDjjCAAAAAWJLR0QAiAUdSAAAAOFJREFUGNNjYAACRiZmBhZWNgYYYOfg5OLm4eXjhwkICAoJi4iKicNVSEhKScvIyskrwAQUlZRVVNXUNTS1tMF8HV09fQNDI2MTUzNzC5CApZW1ja2dvYOjk7OLKwMD0DI3dw9PL28fXz//gEA2hqDgkNCw8IjIqOiY2Lj4BDYGy8Sk5JTUtPSMzKzsnNw8kBn5BYVFxSWlZeUVlVXVEHtrauvqGxqbmlta28D89o7OLobunt6+foj8hImTJk9hmDpt+oyZs0D82XPmzpu/gIFh4aLFS5aCBJYtX7Fy1Wq4xwDfUDm+CDprggAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMC0wNFQyMTo1NzowNCswMjowMHGTmUUAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTAtMDRUMjE6NTc6MDQrMDI6MDAAziH5AAAAAElFTkSuQmCC </Image><br />
<Url type="text/html" method="GET" template="http://linux-club.de/wiki/mediawiki/index.php?title=Spezial:Suche"><br />
<Raram name="fulltext" value="Suche"/><br />
<Param name="profile" value="default"/><br />
<Param name="search" value="{searchTerms}"/><br />
</Url><br />
<Url type="application/x-suggestions+json" template="http://linux-club.de/wiki/mediawiki/api.php?action=opensearch&amp;search={searchTerms}"/><br />
</SearchPlugin></pre><br />
<br />
== Anmerkung zu Firefox SearchPlugIns ==<br />
<br />
Per Default liegen die Searchplugins unter /usr/lib/firefox/searchplugins, wenn man aber die Rechte auf 666 setzt, was ich angesichts der Tatsache, der Zahl des Großen Tieres gerne bereit bin zu tun, funktioniert das ganze nicht mehr. Erst mit der göttlichen Zahl 777 funktioniert das ganze auch. Was auch logisch ist, denn man greift ja als User auf die SPs zu, nicht als root.<br />
Man kann das ganze auch hierher legen:<br />
/home/yehudi/.mozilla/firefox/tqg3mrpg.default/searchplugins<br />
<br />
yehudi natürlich durch den eigenen Benutzer ersetzen.<br />
<br />
== Erweiterungen ==<br />
<br />
'''Adblock'''<br /><br />
Blockt die nervige Werbung<br />
* https://addons.mozilla.org/firefox/10/<br />
<br />
'''All-In-One Sidebar'''<br /><br />
Wie beim Internet Explorer gibt es eine Seitenschublade, in der dann Erweiterungen, Bockmarks etc. gespeichert werden.<br />
* https://addons.mozilla.org/firefox/1027/<br />
<br />
'''Bandwidth Tester'''<br /><br />
Zur Prüfung der Geschwindigkeit der Internetverbindung. Ist leider noch nicht für FF1.5 upgedatet. Aber für Mozilla. * https://addons.mozilla.org/firefox/178/<br />
<br />
'''Bookmarks Synchronizer 3'''<br /><br />
über den Apache oder ftp Server lassen sich die Bookmarks auf einem Server lagern<br />
* https://addons.mozilla.org/firefox/2367/<br />
<br />
'''Bookmark Sync and Sort'''<br /><br />
Noch etwas kompfortabler: <br />
* https://addons.mozilla.org/firefox/2367/<br />
<br />
'''BrowseAtWork'''<br /><br />
Bei einem rechten Mausklick auf einem Link, befindet sich dann eine zusätzliche Option "BrowseAtWork", womit dann eine Seite anonym geöffnet wird. Dies eignet sich besonders beim Öffnen aus den Google Suchergebnissen.<br />
* https://addons.mozilla.org/firefox/2059/<br />
<br />
'''Clear Private Data'''<br /><br />
Über "Extras - Private Daten löschen - Private Daten jetzt löschen" lässt sich nun durch ein neues icon welches über "Ansicht - symbolleisten - Anpassen" eingefügt werden kann mit einem Handgriff erledigen. Es ist das icon mit dem Schloss.<br />
* https://addons.mozilla.org/firefox/1280/<br />
<br />
'''ConQuery'''<br /><br />
Suche nach markiertem Wort mit rechtem Mausklick - auch für Mozilla, und Thunderbird.<br />
* https://addons.mozilla.org/firefox/231/<br />
<br />
'''CookieCuller'''<br /><br />
Ein Cookie-Manager, um wichtige Cookies zu schützen, und andere zu löschen. - Auch für Mozilla<br />
* https://addons.mozilla.org/firefox/82/<br />
<br />
'''DictonarySearch'''<br />
<br />
'''DOM Inspector'''<br />
<br />
'''DownThemAll'''<br /><br />
Leicht bedienbarer Massen-Download-Manager.<br />
* https://addons.mozilla.org/firefox/201/<br />
<br />
'''Fasterfox'''<br /><br />
Macht den Firefox durch Optimierungen schneller.<br />
* https://addons.mozilla.org/firefox/1269/<br />
<br />
'''FireFTP'''<br /><br />
integrierter FTP-Client<br />
* https://addons.mozilla.org/firefox/684/<br />
<br />
'''FlashGot'''<br /><br />
Um Flashplayer abspielen zu könen wie z.B. * http://www.yehudi.de/Musik.htm MP3 abgespielt werden muss folgendes PlugIn installiert sein:<br />
* https://addons.mozilla.org/firefox/220/<br />
Auch für Mozilla<br />
<br />
'''Forecastfox'''<br /><br />
Nette kleine'''Wetteranzeige''' in Firefox unten rechts, mit der man sich das örtliche Wetter für heute und die nächsten Tage anzeigen lassen kann. Auch für Mozilla. * https://addons.mozilla.org/firefox/398/ (=> Link mit Infos und Screenshots)<br />
<br />
'''FoXWiki'''<br />
* https://addons.mozilla.org/firefox/2358/<br />
<br />
'''[[Google Toolbar]]'''<br />
* http://www.google.com/tools/firefox/toolbar/FT2/intl/de/index.html?utm_campaign=de&utm_source=de-ha-ww-google&utm_medium=ha&utm_term=google%20toolbar<br />
<br />
'''gTranslate'''<br /><br />
Übersetzen von ausgesuchten Wörtern innerhalb einer Webseite über das Kontextmenü, nutzt die Übersetzungsdienste von Google.<br />
* https://addons.mozilla.org/firefox/918/<br />
<br />
'''html Validator'''<br /><br />
Überprüft den Quellcodet mit der Hilfe von HTML Tidy.<br />
* https://addons.mozilla.org/firefox/249/<br />
<br />
'''HTML Validator (based on CSE HTML Validator) 1.2.2'''<br />
* https://addons.mozilla.org/firefox/887/<br />
<br />
'''Niche Watch Tool'''<br />
* https://addons.mozilla.org/firefox/2279/<br />
<br />
'''Session Saver'''<br /><br />
Sichert alle Tabs einer Session. Nachteil: Muss deaktiviert werden, um neue Erweiterungen zu installieren. Beim Updaten gibt es diese Problematik nicht.<br />
* https://addons.mozilla.org/firefox/436/<br />
<br />
'''Snapper'''<br />
* https://addons.mozilla.org/firefox/2703/<br />
<br />
'''Sort Bookmarks'''<br />
Hier bestehen weitere Sortiermöglichkeiten der Bookmarks. <br />
* https://addons.mozilla.org/firefox/51/<br />
<br />
'''Tabbrowser Preferences'''<br />
erweiterte Kontrollmöglichkeit beim Tabbed-Browsing. Konfiguration für diese Erweiterung befinden sich unter Extras -> Einstellungen -> Tabbed-Browsing.<br />
* https://addons.mozilla.org/firefox/158/<br />
<br />
'''Total Validator 2.3'''<br />
* https://addons.mozilla.org/firefox/2318/<br />
<br />
<br />
==== Derzeit fehlende Erweiterungen ====<br />
<br />
* About:Config<br />
* All-In-One-Sidebar<br />
* Bookmarksynchronizer - umsteigen auf Bookmarksynchronizer3<br />
* ConQuery<br />
* SessionSaver<br />
<br />
Dies sind nur diejenigen, von denen ich es weiß.<br />
<br />
Eine Liste möglicher Erweiterungen für Firefox findet sich hier oder auf [https://addons.mozilla.org/firefox/extensions/ dieser Internetseite (Firefox Add-ons)].<br />
<br />
==== Quellenangabe ====<br />
Der Tipp stammt von '''Don Pedro''' aus diesem Thread des Linux-Club: http://www.linux-club.de/ftopic71142.html<br />
<br />
== Persönliche Daten ==<br />
<br />
Deine persönliche Daten (z.B. Lesezeichen von FF) liegen alle in versteckten Ordnern in deinem Home Verzeichnis.<br />
Konqueror => Ansicht => Versteckte Dateien anzeigen<br />
Die gesamten Einstellungen von Firefox liegen z.B. im versteckten Verzeichnis <br />
/home/Username/.mozilla<br />
insbesondere:<br />
/home/Username/.mozilla/firefox<br />
<br />
=== Migration ===<br />
<br />
Beim Firefox können die Einstellungen bequem in ein anderes OS getauscht werden. Unter Linux befinden sich wie oben unter persönliche Daten beschrieben die Profile.<br />
<br />
Unter OS X sind diese unter<br />
/Users/Username/Libary/Application Support/Firefox<br />
zu finden.<br />
<br />
Die Profile werden mit einer Codierungskennung.default in einem Ordner angelegt. Bei Linux liegt dieser direkt in dem Ordner "firefox" bei OS X liegt dieser unter dem Ordner "Firefox" in "Profiles". Dafür muss dann in der Datei "profiles.ini" der Pfad zu den Profilordnern mit der Zu oder Hinwegname von einem "/" angepasst werden. Unter Linux nimmt man zum editieren dieser Datei [[Kat]] oder [[Kwrite]], unter OS X SubEthaEdit. <br />
<br />
Der Austausch mit Windows wäre vielleicht auch interssant, der dann gerne von jemand anderem, der dieses OS nutzt beschrieben werden kann.<br />
<br />
Vorteil dieser Methode ist, seine gesamten Bookmarks und sonstigen Zugänge immer auf einem USB Stick dabei zu haben. <br />
<br />
Probleme könnte es jedoch nur mit den Extensions geben. Hier hilft dann die Extensions aus dem Ordner zu entfernen, und dann anschließend neu zu installieren.<br />
<br />
== Schriftgröße ==<br />
<br />
<br />
=== kurzfristig ===<br />
<br />
Strg + Mausrad (nach oben größer, nach unten kleiner)<br />
<br />
<br />
=== Grundsätzlich ===<br />
<br />
Bearbeien > Einstellungen > Inhalt > Schriften & Farben > Erweitert<br />
<br />
== Quellen und weiterführende Links ==<br />
<br />
=== Wiki für den FireFox ===<br />
<br />
* https://wiki.mozilla.org/Firefox<br />
<br />
=== Anleitungen für Firefox ===<br />
* [http://plugindoc.mozdev.org/de-DE/faqs/firefox-linux.html Plugins und Mozilla Firefox unter Linux]<br />
<br />
=== Erweiterungen ===<br />
<br />
* https://addons.mozilla.org/de/firefox/<br />
* http://extensionroom.mozdev.org<br />
* http://www.extensionsmirror.nl<br />
<br />
== Editorentabelle ==<br />
<br />
<div style="border: 1px solid #6EBA26; background-color:#6EBA26; font-size:1px; height:8px; border-bottom:1px solid #6EBA26;"><br />
</div><br />
<div style="border: 1px solid #6EBA26; background-color:#FCFCE8; padding:7px;">'''<u>Editorentabelle</u>''' <br />
----<br />
'''Autor:'''<br />
----<br />
'''Ergänzungsautor:'''oc2pus, robi, Yehudi und andere<br />
----<br />
'''Lektor:'''<br />
----<br />
<!--'''Designer:'''<br />
----<br />
'''Bilder:'''<br />
----<br />
'''Dank an:'''<br />
----<br />
'''Artikel ins Wiki eingefügt von:'''<br />
---- --><br />
<small>''Wenn Du möchtest, dass Deine Arbeit wie die des Ursprungsautoren gewürdigt wird, trage Dich in dieser Tabelle entsprechend ein.''</small><br />
</div><br />
----<br />
<br />
[[Webbrowser | Zurück zu Webbrowser]][[Category:Webbrowser]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Firefox&diff=32702Firefox2015-10-05T00:45:23Z<p>Robi: neues Linux-Club SearchPlugIn für Firefox</p>
<hr />
<div>{{Infobox_Software|<br />
Name= '''Firefox'''<br />[[Bild:Firefox.png]]<br />
|Screenshot= [[Bild:Firefox.jpg|240px]]<br />
|Beschreibung= Firefox 2.0 mit KDE 3.5.5 auf openSUSE 10.2<br />
|Hersteller= [http://www.mozilla.com Mozilla]<br />
|AktuelleVersion= 20.0<br />
|AktuelleVersionFreigabeDatum= 02.04.2013<br />
|Betriebssystem= Linux, OS X, Windows,<br />
|Kategorie= [[Webbrowser]]<br />
|Lizenz= [http://de.wikipedia.org/wiki/Mozilla_Public_License MLP]/[http://de.wikipedia.org/wikiGNU_General_Public_License GPL]/[http://de.wikipedia.org/wiki/GNU_Lesser_General_Public_License LGPL]<br />
|Deutsch= ja<br />
|Website= http://www.mozilla.com<br />
}}<br />
<br />
{{Box Test||<br />
* [[openSUSE]] 12.3<br />
* [[openSUSE]] 12.2<br />
* [[Fedora]] 18<br />
* [[Ubuntu]] 12.04<br />
* [[Ubuntu]] 12.10<br />
* [[Ubuntu]] 13.04<br />
* [[Arch Linux]]<br />
}}<br />
<br />
== Installation ==<br />
Firefox wird von den meisten Linux Distributionen mitgeliefert.<br />
<br />
'''openSUSE'''<br />
<br />
zypper in MozillaFirefox<br />
<br />
'''Fedora'''<br />
yum install firefox<br />
<br />
'''Ubuntu'''<br />
sudo apt-get install firefox<br />
<br />
'''Arch Linux'''<br />
pacman -S firefox<br />
<br />
<br />
Die aktuellen Versionen von Firefox werden unter openSUSE, Fedora und Ubuntu bei unterstützten Versionen immer kurz nach dem offiziellen Release über die Update-Repos installiert. Arch Linux, als Rolling Release Distro, hat sowieso immer den aktuellen Firefox in den Repos.<br />
<br />
== Zusätzliche Repositories ==<br />
openSUSE bietet ein Repo an wo aktuellere und getestete Pakete von Firefox enthalten sind. Sie werden aber nicht offiziell unterstützt. Das Repo befindet sich hier:<br />
[http://download.opensuse.org/repositories/mozilla/]<br />
<br />
Zum Hinzufügen des Repos geht man folgendermaßen vor (am Beispiel von openSUSE 12.3).<br />
zypper ar -f http://download.opensuse.org/repositories/mozilla/openSUSE_12.3/ Firefox-latest<br />
zypper ref<br />
<br />
== Linux-Club Forum als PlugIn für Firefox==<br />
<br />
SearchPlugin für den Linux-Club. folgendes hier kopieren und als Datei '''linux-club.xml''' abspeichern<br />
<br />
<br />
<pre><SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"><br />
<ShortName>Linux-Club</ShortName><br />
<Description>Linux-Club Search</Description><br />
<InputEncoding>utf-8</InputEncoding><br />
<Image width="16" height="16">data:image/x-icon;base64,<br />
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABwlBMVEX////3+Pbo6Ojj4+Pl5eX+/v7z9/HB3Knd5M7h5Mv5+vmi0qunq6ews6z9/f2+1LeFrHumu5+exZNMmT5dhE9dfEXE1bb3+vX8/fyKwHo9hyg0bSZphmF/s3E7jCY8gCVboypksyym04b9/v3M58M/jig6hSZCbzbd4dswZSEzbCIwTSAyUB9xiWHu9OvQ58ifyJS3069/emgyGhePNC7Ky8DQ1Mz7+/r8/PutzKHW4ND6+vrI08NJVkYnIhaqSEWBq1Tj8drl6eOQvoM0bSKYw4W63qn2+vL//v/f6dtviGBWYFIyWSBzaylvlkGYqoyAin16oXBQdEY/azJGczff5d7z8/P09fSfw5BSijQyXyAyVB9QcCiDpjaCvFny+O3c4Nv8/Pz2+PXG0cOFpH1UnzpZritVmShMhiZLYiVrei9ZnSio2oaGwm9QnClBfStmqzZSXEdpa2QvThyKsm1wpVpZpTFqjmA3WCPb5dO60bQlPx2irpvt8urP28p4o2Q2aSd6iXDf6dpehFQqRhxalTFroEPo6uTB17xKmSpXnitlqzijvYrFz8KyvqvLz8n+/v3L4MaxvqiwvavQ0875+fggVVQjAAAAAWJLR0QAiAUdSAAAAMhJREFUGNNjYAABRiZmFlYGJMDGzsGJIsDFzcMLF+DjFxAUEhYRFROH8CUkpaRlZOXkFRSVIALKKqpq6hqaWto6ulAtevoGhkbGJqZm5haWViCDWFmtbWzt7B0cnZxdXN3cgSIenl7ePr5+/gGBQcEhoQysYeERkVHRMbFx8aysFgmJDEnJKalp6RmZWdk5MIew5ublFxQWFZfABUrLyisqq6praqGOZa2rb2hsam5pbWuHKeno7Oru6e3rT4RpmjBx0uQpUyEaAPgZLId7zyewAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA1VDAxOjU4OjExKzAyOjAwUQy4zQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOC0xMVQxMzoyMzoyOCswMjowMCifWQ8AAAAASUVORK5CYII=</Image><br />
<Url type="text/html" method="GET" template="http://linux-club.de/forum/search.php"><br />
<Param name="keywords" value="{searchTerms}"/><br />
<Param name="terms" value="all"/><br />
<Param name="sc" value="1"/><br />
<Param name="sf" value="all"/><br />
<Param name="sr" value="posts"/><br />
<Param name="sk" value="t"/><br />
<Param name="sd" value="d"/><br />
<Param name="st" value="0"/><br />
<Param name="ch" value="600"/><br />
<Param name="submit" value="Suche"/><br />
</Url><br />
</SearchPlugin><br />
</pre><br />
<br />
== Linux-Club Wiki als PlugIn für Firefox==<br />
<br />
Ich hab mal das Script von oc2pus abgekupfert fürs LC-Wiki. Bei mir funktionieren jetzt beide auf verschiedenen Rechnern prima (FF 1.5.0.6/1.5.0.7) Je nach Installation muss es entweder unter<br />
/usr/lib/firefox/searchplugins oder /opt/MozillaFirefox/lib/searchplugins Rechte auf 666 und Firefox neu starten.<br />
<br />
<br />
Code:<br />
----------------------------------------------------------------------<br />
# Author: robi <robi@linux-club.de><br />
# Version: 1, Last updated: Di Okt 3 2006<br />
#----------------------------------------------------------------------<br />
<search<br />
version="1.0"<br />
name="linux-club-wiki.de"<br />
description="linux-club-wiki.de searchplugin"<br />
method="get"<br />
action="http://www.linux-club.de/faq/Spezial:Search"<br />
searchForm="http://www.linux-club.de/faq/Spezial:Search"<br />
queryEncoding='ISO-8859-1'<br />
queryCharset='ISO-8859-1'<br />
><br />
<br />
<input name="ns0" value="1"><br />
<input name="search" user><br />
<input name="searchx" value="Suche"><br />
<br />
</search><br />
<br />
<br />
== Anmerkung zu Firefox SearchPlugIns ==<br />
<br />
Per Default liegen die Searchplugins unter /usr/lib/firefox/searchplugins, wenn man aber die Rechte auf 666 setzt, was ich angesichts der Tatsache, der Zahl des Großen Tieres gerne bereit bin zu tun, funktioniert das ganze nicht mehr. Erst mit der göttlichen Zahl 777 funktioniert das ganze auch. Was auch logisch ist, denn man greift ja als User auf die SPs zu, nicht als root.<br />
Man kann das ganze auch hierher legen:<br />
/home/yehudi/.mozilla/firefox/tqg3mrpg.default/searchplugins<br />
<br />
yehudi natürlich durch den eigenen Benutzer ersetzen.<br />
<br />
== Erweiterungen ==<br />
<br />
'''Adblock'''<br /><br />
Blockt die nervige Werbung<br />
* https://addons.mozilla.org/firefox/10/<br />
<br />
'''All-In-One Sidebar'''<br /><br />
Wie beim Internet Explorer gibt es eine Seitenschublade, in der dann Erweiterungen, Bockmarks etc. gespeichert werden.<br />
* https://addons.mozilla.org/firefox/1027/<br />
<br />
'''Bandwidth Tester'''<br /><br />
Zur Prüfung der Geschwindigkeit der Internetverbindung. Ist leider noch nicht für FF1.5 upgedatet. Aber für Mozilla. * https://addons.mozilla.org/firefox/178/<br />
<br />
'''Bookmarks Synchronizer 3'''<br /><br />
über den Apache oder ftp Server lassen sich die Bookmarks auf einem Server lagern<br />
* https://addons.mozilla.org/firefox/2367/<br />
<br />
'''Bookmark Sync and Sort'''<br /><br />
Noch etwas kompfortabler: <br />
* https://addons.mozilla.org/firefox/2367/<br />
<br />
'''BrowseAtWork'''<br /><br />
Bei einem rechten Mausklick auf einem Link, befindet sich dann eine zusätzliche Option "BrowseAtWork", womit dann eine Seite anonym geöffnet wird. Dies eignet sich besonders beim Öffnen aus den Google Suchergebnissen.<br />
* https://addons.mozilla.org/firefox/2059/<br />
<br />
'''Clear Private Data'''<br /><br />
Über "Extras - Private Daten löschen - Private Daten jetzt löschen" lässt sich nun durch ein neues icon welches über "Ansicht - symbolleisten - Anpassen" eingefügt werden kann mit einem Handgriff erledigen. Es ist das icon mit dem Schloss.<br />
* https://addons.mozilla.org/firefox/1280/<br />
<br />
'''ConQuery'''<br /><br />
Suche nach markiertem Wort mit rechtem Mausklick - auch für Mozilla, und Thunderbird.<br />
* https://addons.mozilla.org/firefox/231/<br />
<br />
'''CookieCuller'''<br /><br />
Ein Cookie-Manager, um wichtige Cookies zu schützen, und andere zu löschen. - Auch für Mozilla<br />
* https://addons.mozilla.org/firefox/82/<br />
<br />
'''DictonarySearch'''<br />
<br />
'''DOM Inspector'''<br />
<br />
'''DownThemAll'''<br /><br />
Leicht bedienbarer Massen-Download-Manager.<br />
* https://addons.mozilla.org/firefox/201/<br />
<br />
'''Fasterfox'''<br /><br />
Macht den Firefox durch Optimierungen schneller.<br />
* https://addons.mozilla.org/firefox/1269/<br />
<br />
'''FireFTP'''<br /><br />
integrierter FTP-Client<br />
* https://addons.mozilla.org/firefox/684/<br />
<br />
'''FlashGot'''<br /><br />
Um Flashplayer abspielen zu könen wie z.B. * http://www.yehudi.de/Musik.htm MP3 abgespielt werden muss folgendes PlugIn installiert sein:<br />
* https://addons.mozilla.org/firefox/220/<br />
Auch für Mozilla<br />
<br />
'''Forecastfox'''<br /><br />
Nette kleine'''Wetteranzeige''' in Firefox unten rechts, mit der man sich das örtliche Wetter für heute und die nächsten Tage anzeigen lassen kann. Auch für Mozilla. * https://addons.mozilla.org/firefox/398/ (=> Link mit Infos und Screenshots)<br />
<br />
'''FoXWiki'''<br />
* https://addons.mozilla.org/firefox/2358/<br />
<br />
'''[[Google Toolbar]]'''<br />
* http://www.google.com/tools/firefox/toolbar/FT2/intl/de/index.html?utm_campaign=de&utm_source=de-ha-ww-google&utm_medium=ha&utm_term=google%20toolbar<br />
<br />
'''gTranslate'''<br /><br />
Übersetzen von ausgesuchten Wörtern innerhalb einer Webseite über das Kontextmenü, nutzt die Übersetzungsdienste von Google.<br />
* https://addons.mozilla.org/firefox/918/<br />
<br />
'''html Validator'''<br /><br />
Überprüft den Quellcodet mit der Hilfe von HTML Tidy.<br />
* https://addons.mozilla.org/firefox/249/<br />
<br />
'''HTML Validator (based on CSE HTML Validator) 1.2.2'''<br />
* https://addons.mozilla.org/firefox/887/<br />
<br />
'''Niche Watch Tool'''<br />
* https://addons.mozilla.org/firefox/2279/<br />
<br />
'''Session Saver'''<br /><br />
Sichert alle Tabs einer Session. Nachteil: Muss deaktiviert werden, um neue Erweiterungen zu installieren. Beim Updaten gibt es diese Problematik nicht.<br />
* https://addons.mozilla.org/firefox/436/<br />
<br />
'''Snapper'''<br />
* https://addons.mozilla.org/firefox/2703/<br />
<br />
'''Sort Bookmarks'''<br />
Hier bestehen weitere Sortiermöglichkeiten der Bookmarks. <br />
* https://addons.mozilla.org/firefox/51/<br />
<br />
'''Tabbrowser Preferences'''<br />
erweiterte Kontrollmöglichkeit beim Tabbed-Browsing. Konfiguration für diese Erweiterung befinden sich unter Extras -> Einstellungen -> Tabbed-Browsing.<br />
* https://addons.mozilla.org/firefox/158/<br />
<br />
'''Total Validator 2.3'''<br />
* https://addons.mozilla.org/firefox/2318/<br />
<br />
<br />
==== Derzeit fehlende Erweiterungen ====<br />
<br />
* About:Config<br />
* All-In-One-Sidebar<br />
* Bookmarksynchronizer - umsteigen auf Bookmarksynchronizer3<br />
* ConQuery<br />
* SessionSaver<br />
<br />
Dies sind nur diejenigen, von denen ich es weiß.<br />
<br />
Eine Liste möglicher Erweiterungen für Firefox findet sich hier oder auf [https://addons.mozilla.org/firefox/extensions/ dieser Internetseite (Firefox Add-ons)].<br />
<br />
==== Quellenangabe ====<br />
Der Tipp stammt von '''Don Pedro''' aus diesem Thread des Linux-Club: http://www.linux-club.de/ftopic71142.html<br />
<br />
== Persönliche Daten ==<br />
<br />
Deine persönliche Daten (z.B. Lesezeichen von FF) liegen alle in versteckten Ordnern in deinem Home Verzeichnis.<br />
Konqueror => Ansicht => Versteckte Dateien anzeigen<br />
Die gesamten Einstellungen von Firefox liegen z.B. im versteckten Verzeichnis <br />
/home/Username/.mozilla<br />
insbesondere:<br />
/home/Username/.mozilla/firefox<br />
<br />
=== Migration ===<br />
<br />
Beim Firefox können die Einstellungen bequem in ein anderes OS getauscht werden. Unter Linux befinden sich wie oben unter persönliche Daten beschrieben die Profile.<br />
<br />
Unter OS X sind diese unter<br />
/Users/Username/Libary/Application Support/Firefox<br />
zu finden.<br />
<br />
Die Profile werden mit einer Codierungskennung.default in einem Ordner angelegt. Bei Linux liegt dieser direkt in dem Ordner "firefox" bei OS X liegt dieser unter dem Ordner "Firefox" in "Profiles". Dafür muss dann in der Datei "profiles.ini" der Pfad zu den Profilordnern mit der Zu oder Hinwegname von einem "/" angepasst werden. Unter Linux nimmt man zum editieren dieser Datei [[Kat]] oder [[Kwrite]], unter OS X SubEthaEdit. <br />
<br />
Der Austausch mit Windows wäre vielleicht auch interssant, der dann gerne von jemand anderem, der dieses OS nutzt beschrieben werden kann.<br />
<br />
Vorteil dieser Methode ist, seine gesamten Bookmarks und sonstigen Zugänge immer auf einem USB Stick dabei zu haben. <br />
<br />
Probleme könnte es jedoch nur mit den Extensions geben. Hier hilft dann die Extensions aus dem Ordner zu entfernen, und dann anschließend neu zu installieren.<br />
<br />
== Schriftgröße ==<br />
<br />
<br />
=== kurzfristig ===<br />
<br />
Strg + Mausrad (nach oben größer, nach unten kleiner)<br />
<br />
<br />
=== Grundsätzlich ===<br />
<br />
Bearbeien > Einstellungen > Inhalt > Schriften & Farben > Erweitert<br />
<br />
== Quellen und weiterführende Links ==<br />
<br />
=== Wiki für den FireFox ===<br />
<br />
* https://wiki.mozilla.org/Firefox<br />
<br />
=== Anleitungen für Firefox ===<br />
* [http://plugindoc.mozdev.org/de-DE/faqs/firefox-linux.html Plugins und Mozilla Firefox unter Linux]<br />
<br />
=== Erweiterungen ===<br />
<br />
* https://addons.mozilla.org/de/firefox/<br />
* http://extensionroom.mozdev.org<br />
* http://www.extensionsmirror.nl<br />
<br />
== Editorentabelle ==<br />
<br />
<div style="border: 1px solid #6EBA26; background-color:#6EBA26; font-size:1px; height:8px; border-bottom:1px solid #6EBA26;"><br />
</div><br />
<div style="border: 1px solid #6EBA26; background-color:#FCFCE8; padding:7px;">'''<u>Editorentabelle</u>''' <br />
----<br />
'''Autor:'''<br />
----<br />
'''Ergänzungsautor:'''oc2pus, robi, Yehudi und andere<br />
----<br />
'''Lektor:'''<br />
----<br />
<!--'''Designer:'''<br />
----<br />
'''Bilder:'''<br />
----<br />
'''Dank an:'''<br />
----<br />
'''Artikel ins Wiki eingefügt von:'''<br />
---- --><br />
<small>''Wenn Du möchtest, dass Deine Arbeit wie die des Ursprungsautoren gewürdigt wird, trage Dich in dieser Tabelle entsprechend ein.''</small><br />
</div><br />
----<br />
<br />
[[Webbrowser | Zurück zu Webbrowser]][[Category:Webbrowser]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Hauptseite/Willkommen&diff=32700Hauptseite/Willkommen2015-09-29T12:31:29Z<p>Robi: direkter Link ins Forim</p>
<hr />
<div><table border="0" cellpadding="10" cellspacing="0" class="box"><br />
<tr><br />
<td valign="top" ><dl>[[Bild:konqui.png|180px]]<p><strong>[http://linux-club.de/forum/index.php Linux-Club.de] - Jetzt mit Wiki, für noch mehr Informationen rund um Linux.</strong><br /><br />
<td width="80%"><br />
<span class="titel">'''Willkommen in der Linupedia, dem Wiki des Linux Club'''</span><br /><span class="untertitel">Support-Wiki für (nicht nur) openSUSE Linux®</span><br /><br /><br />
Hier handelt es sich um eine Wissensbank (hauptsächlich) rund um [[openSUSE]]. Jeder, der mithelfen möchte, ist herzlich eingeladen. Dazu bedarf es lediglich einer Registrierung <!--welche Du auf der [[:Spezial:Anmelden|Anmelden Seite]] vornehmen kannst--> zu welcher du [[Anmelden_im_Wiki|hier]] mehr erfährst.<br /><br />
<br />
<br />
<br /><br />
Solltest Du dich nicht mehr einloggen können, schicke bitte eine E-Mail an den [mailto:webmaster@linupedia.org webmaster] damit dieser dein Passwort zurück setzen kann.<br /><br />
<br /><br />
Wer mehr Informationen braucht, um im Wiki mitzuarbeiten, findet [[Hilfe:Hilfe|hier]] Informationen.<br />
<br /><br />
<br /><br />
Hier findet ihr eine Übersicht des Wikis sortiert nach Themengebieten. Neben der Suchfunktion stehen die [[:Kategorie:Linupedia|Kategorien]] zum Suchen im Wiki zur Verfügung. Nutzt für Fragen bitte das [http://linux-club.de/forum/index.php Forum des Linux Clubs] oder besucht uns im IRC: [irc://irc.freenode.org/lc-wikiteam #lc-wikiteam (irc.freenode.org)].<br /><br />
<br />
<br />
Seit 13. August 2006 wurden '''[[LinuxClubWiki:Meilensteine|{{NUMBEROFARTICLES}}]]''' Artikel im Linux-Club Wiki veröffentlicht.<br />
<br /></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=UEFI_Boot_Konfiguration&diff=32694UEFI Boot Konfiguration2015-09-21T20:21:07Z<p>Robi: Überarbeitung Windows-Abschnitt und Freigabe</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
<br />
==UEFI Boot Konfiguration==<br />
<br />
===UEFI Variablen allgemein===<br />
<br />
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.<br><br />
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.<br />
<br />
Beispiel, Ausgabe einer UEFI Variable aus der [[EFI-Shell]]: <br />
<pre><br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8<br />
00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.*<br />
00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...*<br />
00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................*<br />
00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y*<br />
00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.*<br />
00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.*<br />
00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.*<br />
00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......*<br />
00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.*<br />
00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.*<br />
000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.*<br />
000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*<br />
</pre><br />
<br />
* '''NV+RT+BS''' entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS" <br><br />
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden<br />
<br />
* '''8BE4DF61-93CA-11D2-AA0D-00E098032B8C''' diese ist eine EFI-GUID und bedeutet in diesem Fall <br><br />
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.<br />
<br />
* '''Boot000A''' dieses ist der Name der Variable <br />
<br />
* '''DataSize = 0xB8''' dieses ist die hexadezimale Längenangabe für die Daten der Variable<br />
<br />
* der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "'''hexdump -C''' " in Linux liefern würde.<br />
<br />
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit [http://de.wikipedia.org/wiki/UTF-16 UTF-16] abgelegt sind.<br />
<br />
In diesem Fall handelst es sich um den Booteintrag (Label) "'''neuerkern'''" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "'''\EFI\opensuse\bzImage.efi'''" mit den Optionen "'''initrd=\efi\opensuse\initrd'''" starten soll.<br><br />
<br />
<br />
<br />
===UEFI Boot Variablen===<br />
<br />
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.<br />
<br />
<br />
====Bootxxxx====<br />
<br />
'''xxxx''' ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen '''Boot0001''' von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit '''Boot0000'''.<br><br />
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix "'''.efi'''". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.<br />
<br />
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.<br />
<br />
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:<br />
<pre><br />
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
</pre><br />
<br />
<br />
<br />
====BootOrder====<br />
<br />
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem '''xxxx''' aus den '''Bootxxxx''' Variablen entsprechen.<br />
<br />
BootOrder: 0004,0001,0002,0000,0003<br />
<br />
Hier im Beispiel wird die Bootvariable '''Boot0004''' die erste sein mit deren Hilfe UEFI versucht das System zu booten.<br />
<br />
<br />
====weitere Bootvariablen====<br />
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.<br />
<br />
* '''BootCurrent''' : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs<br />
* '''BootNext''' : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.<br />
* '''Timeout''' : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis '''BootOrder''' oder '''BootNext''' verwendet wird um einen Bootloader zu starten<br />
* '''SecureBoot''' zeigt an ob derzeit bzw. für den nächsten Reboot [[Secure Boot]] aktiv ist.<br />
* und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden <br />
<br />
<br />
<br />
<br />
<br />
===Bootkonfiguration aus dem Setup Menü===<br />
<br />
<!-- hier brauchen wir evtl. ein paar Bilder, da sich das wahrscheinlich auf jedem Rechner etwas anders darstellt.--><br />
<br />
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der [[ESP]] einen Bootloader '''\EFI\boot\bootx64.efi''' dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen. <br />
<br />
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte. <br><br />
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.<br />
<br />
<!--Müssen wir etwas allgemein abhandeln und mit Beispielbildern unterlegen--><br />
[[Datei:UEFI-CustomMode.jpg|200px|thumb|left|Umschalten Standard Mode / Custom Mode]]<br />
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot) <br><br />
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.<br />
* SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen<br />
* CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem [[MBR]] nach der legacy Methode<br />
* und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll. <br />
* eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei [[Secure Boot#Secure Boot verstehen|Secureboot]] hier im Wiki . <br />
<br />
<br />
<br />
<br />
<br />
===Konfiguration aus Linux===<br />
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool [[efibootmgr]] gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool '''efibootmgr''' wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.<br />
<br />
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration. <br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM<br />
Boot0001* EFI DVD/CDROM 1<br />
Boot0002* EFI Floppy<br />
Boot0003* EFI Floppy 1<br />
Boot0004* EFI Hard Drive<br />
Boot0005* Shim boot<br />
Boot0006* EFI Internal Shell<br />
Boot0007* opensuse<br />
Boot0008* opensuse-secureboot<br />
Boot0009* kernel<br />
Boot000A* neuerkern<br />
Boot000B* grublegacy<br />
Boot000C* SUSE Linux Enterprise<br />
Boot000D* rEFInd Boot Manager<br />
Boot000E* Linux Boot Manager<br />
Boot000F* grub1 boot<br />
Boot0010* EFI Network<br />
Boot0011* EFI Network 1<br />
Boot0012* EFI Network 2<br />
</pre><br />
<br />
zusätzlich die Option "'''-v'''" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.<br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0)<br />
Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0)<br />
Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0)<br />
Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1)<br />
Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)<br />
Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0006* EFI Internal Shell MM(b,900000,10fffff)<br />
Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\<br />
.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d...<br />
Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.<br />
r.d...<br />
Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi)<br />
Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi)<br />
Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi)<br />
Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi)<br />
Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)<br />
Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0<br />
Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000<br />
00000000000000000000000000000<br />
</pre><br />
<br />
Hilfe bekommt man mit der Option "'''-h'''" oder auch über die [http://linux.die.net/man/8/efibootmgr Manpage]<br />
<pre> <br />
usage: efibootmgr [options]<br />
-a | --active sets bootnum active<br />
-A | --inactive sets bootnum inactive<br />
-b | --bootnum XXXX modify BootXXXX (hex)<br />
-B | --delete-bootnum delete bootnum (hex)<br />
-c | --create create new variable bootnum and add to bootorder<br />
-d | --disk disk (defaults to /dev/sda) containing loader<br />
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess<br />
-E | --device num EDD 1.0 device number (defaults to 0x80)<br />
-g | --gpt force disk with invalid PMBR to be treated as GPT<br />
-H | --acpi_hid XXXX set the ACPI HID (used with -i)<br />
-i | --iface name create a netboot entry for the named interface<br />
-l | --loader name (defaults to \elilo.efi)<br />
-L | --label label Boot manager display label (defaults to "Linux")<br />
-n | --bootnext XXXX set BootNext to XXXX (hex)<br />
-N | --delete-bootnext delete BootNext<br />
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)<br />
-O | --delete-bootorder delete BootOrder<br />
-p | --part part (defaults to 1) containing loader<br />
-q | --quiet be quiet<br />
| --test filename don't write to NVRAM, write to filename.<br />
-t | --timeout seconds set boot manager timeout waiting for user input.<br />
-T | --delete-timeout delete Timeout.<br />
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)<br />
-U | --acpi_uid XXXX set the ACPI UID (used with -i)<br />
-v | --verbose print additional information<br />
-V | --version return version and exit<br />
-w | --write-signature write unique sig to MBR if needed<br />
-@ | --append-binary-args file append extra args from file (use "-" for stdin)<br />
</pre><br />
einfache Beispiele:<br />
efibootmgr -n 5 <br />
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable '''Boot0005''' (in diesem Beispiel "shim boot") durchgeführt wird.<br />
<br />
efibootmgr -o 5,6,9,0<br />
würde die '''Bootorder''' dauerhaft umstellen auf "'''0005,0006,0009,0000'''"<br />
<br />
efibootmgr -b 3 -B<br />
würde den Eintrag '''Boot0003''' löschen und wenn vorhanden aus der '''Bootorder''' entfernen<br />
<br />
<br />
etwas schwieriger ist das anlegen eines neuen Eintrages<br><br />
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen<br />
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi<br />
<br />
* '''-c''' - neu anlegen<br />
* '''-d''' - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet<br />
* '''-p 1''' - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default) <br />
* '''-L''' - der Name des Booteintrages<br />
* '''-l''' - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.<br />
<br />
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.<br />
<br />
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem [[ESP]] direkt von UEFI gestartet wird.<br />
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd<br />
<br />
* '''-u''' - setzt hier [http://de.wikipedia.org/wiki/UTF-16 UNICODE] Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE<br />
<br />
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.<br />
<br />
<br />
<br />
===Konfiguration aus der EFI-SHELL===<br />
<br />
Die Konfiguration der Bootvariablen mittels der [[EFI-Shell]] ist sicherlich für den Normaluser die allerletzte Möglichkeit die überhaupt in Betracht gezogen werden sollte. Dazu ist auch hier die Hindernislatte ziemlich hoch gehängt und wahrscheinlich muss da vorher auch eine ganze Menge an Fehlern und Ungereimtheiten passieren, bevor dieses einmal notwendig werden würde und die EFI-Shell als der einzige noch gangbare Weg übrig bleibt.<br />
<br />
Zuerst müsste der User wahrscheinlich eine EFI-Shell Version 2.x downloaden, die dann auch noch auf seinem Rechner funktioniert. Dann müsste er diese Shell irgendwohin abspeichern, dass sie mittels UEFI-Setup oder Default-Booteinträge gestartet werden kann. Und nicht zuletzt, müsste der User auch noch einige Grundkenntnisse über die EFI-Shell mitbringen oder zu mindestens schonmal einiges darüber gelesen haben, damit er diese überhaupt einigermaßen bedienen kann. In diesem Beitrag werden wir auf die meisten Grundlagen der EFI-Shell nicht eingehen, sondern uns nur um die reine Bootkonfigurationsmöglichkeiten beschränken.<br><br />
<br />
Prinzipiell einmal auf der EFI-Shell angekommen, ist es ein leichtes von dort aus einen der hoffentlich noch vorhanden Bootloader zu starten und damit wieder ein Betriebssystem zu haben von dem man dann mit einfacheren Mitteln die Bootkonfiguration wieder richten könnte. <br />
<br />
Darauf gehen wir hier aber nicht ein, wir wollen uns gezielt auf der EFI-Shell anschauen wie die Bootkonfiguration dort aussieht und wie wir sie dort ändern könnten. Wir würden für einige der weiteren Befehle hier eine EFI-Shell Version 2.x benötigen, diese ist üblicherweise Weise erst ab UEFI-2.3.1 lauffähig.<br />
<br />
Die Bootvariablen anschauen geht mit dem Befehl "'''dumpstore'''"<br />
<br />
<pre>Shell> dmpstore Boot*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0002' DataSize = 0xA2<br />
00000000: 01 00 00 00 7A 00 47 00-72 00 75 00 62 00 20 00 *....z.G.r.u.b. .*<br />
00000010: 53 00 65 00 63 00 75 00-72 00 65 00 20 00 42 00 *S.e.c.u.r.e. .B.*<br />
00000020: 6F 00 6F 00 74 00 00 00-02 01 0C 00 D0 41 03 0A *o.o.t........A..*<br />
00000030: 00 00 00 00 01 01 06 00-01 01 03 01 08 00 00 01 *................*<br />
00000040: 00 00 04 01 2A 00 02 00-00 00 00 68 09 00 00 00 *....*......h....*<br />
00000050: 00 00 00 18 03 00 00 00-00 00 0A 22 3A 66 4E 5B *...........":fN[*<br />
00000060: 4D 47 83 2F A9 69 D8 33-4C B4 02 02 04 04 32 00 *MG./.i.3L.....2.*<br />
00000070: 5C 00 45 00 46 00 49 00-5C 00 6F 00 70 00 65 00 *\.E.F.I.\.o.p.e.*<br />
00000080: 6E 00 73 00 75 00 73 00-65 00 5C 00 73 00 68 00 *n.s.u.s.e.\.s.h.*<br />
00000090: 69 00 6D 00 2E 00 65 00-66 00 69 00 00 00 7F FF *i.m...e.f.i.....*<br />
000000A0: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000C' DataSize = 0x42<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 20 00 31 00 00 00 *l.o.p.p.y. .1...*<br />
00000020: 02 01 0C 00 D0 41 03 0A-00 00 00 00 01 01 06 00 *.....A..........*<br />
00000030: 00 01 02 01 0C 00 D0 41-04 06 01 00 00 00 7F FF *.......A........*<br />
00000040: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000B' DataSize = 0x3E<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 00 00 02 01 0C 00 *l.o.p.p.y.......*<br />
00000020: D0 41 03 0A 00 00 00 00-01 01 06 00 00 01 02 01 *.A..............*<br />
00000030: 0C 00 D0 41 04 06 00 00-00 00 7F FF 04 00 *...A..........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0x12C<br />
00000000: 01 00 00 00 74 00 57 00-69 00 6E 00 64 00 6F 00 *....t.W.i.n.d.o.*<br />
00000010: 77 00 73 00 20 00 42 00-6F 00 6F 00 74 00 20 00 *w.s. .B.o.o.t. .*<br />
00000020: 4D 00 61 00 6E 00 61 00-67 00 65 00 72 00 00 00 *M.a.n.a.g.e.r...*<br />
00000030: 04 01 2A 00 02 00 00 00-00 68 09 00 00 00 00 00 *..*......h......*<br />
00000040: 00 18 03 00 00 00 00 00-0A 22 3A 66 4E 5B 4D 47 *.........":fN[MG*<br />
00000050: 83 2F A9 69 D8 33 4C B4-02 02 04 04 46 00 5C 00 *./.i.3L.....F.\.*<br />
00000060: 45 00 46 00 49 00 5C 00-4D 00 69 00 63 00 72 00 *E.F.I.\.M.i.c.r.*<br />
00000070: 6F 00 73 00 6F 00 66 00-74 00 5C 00 42 00 6F 00 *o.s.o.f.t.\.B.o.*<br />
00000080: 6F 00 74 00 5C 00 62 00-6F 00 6F 00 74 00 6D 00 *o.t.\.b.o.o.t.m.*<br />
00000090: 67 00 66 00 77 00 2E 00-65 00 66 00 69 00 00 00 *g.f.w...e.f.i...*<br />
000000A0: 7F FF 04 00 57 49 4E 44-4F 57 53 00 01 00 00 00 *....WINDOWS.....*<br />
000000B0: 88 00 00 00 78 00 00 00-42 00 43 00 44 00 4F 00 *....x...B.C.D.O.* <br />
000000C0: 42 00 4A 00 45 00 43 00-54 00 3D 00 7B 00 39 00 *B.J.E.C.T.=...9.* <br />
000000D0: 64 00 65 00 61 00 38 00-36 00 32 00 63 00 2D 00 *d.e.a.8.6.2.c.-.* <br />
000000E0: 35 00 63 00 64 00 64 00-2D 00 34 00 65 00 37 00 *5.c.d.d.-.4.e.7.* <br />
000000F0: 30 00 2D 00 61 00 63 00-63 00 31 00 2D 00 66 00 *0.-.a.c.c.1.-.f.* <br />
00000100: 33 00 32 00 62 00 33 00-34 00 34 00 64 00 34 00 *3.2.b.3.4.4.d.4.* <br />
00000110: 37 00 39 00 35 00 7D 00-00 00 00 00 01 00 00 00 *7.9.5...........* <br />
00000120: 10 00 00 00 04 00 00 00-7F FF 04 00 *............* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0001' DataSize = 0x44 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 20 00 31 00 00 00 02 01-0C 00 D0 41 03 0A 00 00 * .1........A....* <br />
00000030: 00 00 01 01 06 00 01 01-03 01 08 00 00 00 00 00 *................* <br />
00000040: 7F FF 04 00 *....* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0004' DataSize = 0x40 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 00 00 02 01 0C 00 D0 41-03 0A 00 00 00 00 01 01 *.......A........* <br />
00000030: 06 00 01 01 03 01 08 00-01 00 00 00 7F FF 04 00 *................* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0000' DataSize = 0x42 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 48 00 *......E.F.I. .H.* <br />
00000010: 61 00 72 00 64 00 20 00-44 00 72 00 69 00 76 00 *a.r.d. .D.r.i.v.* <br />
00000020: 65 00 00 00 02 01 0C 00-D0 41 03 0A 00 00 00 00 *e........A......* <br />
00000030: 01 01 06 00 01 01 03 01-08 00 00 01 00 00 7F FF *................* <br />
00000040: 04 00 *..* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0005' DataSize = 0x5C <br />
00000000: 01 00 00 00 30 00 45 00-46 00 49 00 20 00 49 00 *....0.E.F.I. .I.*<br />
00000010: 6E 00 74 00 65 00 72 00-6E 00 61 00 6C 00 20 00 *n.t.e.r.n.a.l. .*<br />
00000020: 53 00 68 00 65 00 6C 00-6C 00 00 00 01 03 18 00 *S.h.e.l.l.......*<br />
00000030: 0B 00 00 00 00 00 90 00-00 00 00 00 FF FF 0F 01 *................*<br />
00000040: 00 00 00 00 04 06 14 00-83 A5 04 7C 3E 9E 1C 4F *............>..O*<br />
00000050: AD 65 E0 52 68 D0 B4 D1-7F FF 04 00 *.e.Rh.......*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent' DataSize = 0x02<br />
00000000: 05 00 *..*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOptionSupport' DataSize = 0x04<br />
00000000: 03 03 00 00 *....*</pre><br />
zu sehen hier die komplette Ausgabe der mit "'''Boot'''" beginnenden NVRAM Variablen im RAW-Format. Die Bootvariablen. '''Bootxxxx''' sind die Booteinträge in der die Konfiguration der einzelnen Bootloader hinterlegt ist. (Dieses können durchaus auch mal mehr sein, als in der Bootreihenfolge berücksichtigt ist, und die einzelnen Hexadezimal-Nummern müssen nicht aufeinander folgend sein. UEFI verwaltet diese Variablen selbst, und vergibt auch die Nummern selbständig)<br><br />
In der Efi Variable '''BootOrder''' ist die Reihenfolge hinterlegt.<br />
<pre>Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*</pre><br />
Weitere NVRAM Variablen die hier angezeigt werden sind zB. '''BootCurrent BootNext''' ....<br />
<br />
<br />
<br />
die eigentliche Bootkonfiguration und die aktuelle Reihenfolge sehen wir mit <br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 01. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N</pre><br />
Wir sehen hier bei Optionen die Startreihenfolge von 0 bis 3 (hinter Option) und dahinter die entsprechenden Bootvariable auf die dabei zugegriffen wird. Darunter wird dann jeweils noch ausgegeben der Name der für diese Bootoption gewählt wurde, und der Devicepath aus der Bootvariablen, der auf einen Bootloader oder eine andere UEFI-Applikation zeigen sollte. Die Ausgabe hier ist ein Kombination aus der '''BootOrder''' und den '''Bootxxxx''' Variablen und entspricht auch der Reihenfolge die im Bootmenü des UEFI-Setups angezeigt wird. <br />
<br />
Soweit die Bootxxxx Variablen noch vorhanden sind und auch entsprechend auf die richtigen Bootloader Dateien verweisen, reicht es eventuell aus nur die Bootreihenfolge zu ändern, damit das System wieder booten kann.<br />
<br />
<pre>Shell> bcfg boot mv 1 0</pre><br />
vertauscht in unserem Fall den 2.Eintrag, (shim) und setzt ihn an erste Stelle, also vor Windows, Dieses sollten wir selbstverständlich anschließend auch kontrollieren.<br />
<br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
</pre> <br />
<br />
<br />
Mit dem Löschen eines Booteintrages hier sollten wir sehr sehr vorsichtig sein, (bei den Tests hierzu wurde zwar die Bootvariable gelöscht, aber nicht aus der BootOrder entfernt, was dann dazu geführt hatte das die Bootreihenfolge nur noch bis zu der Stelle angezeigt werden konnte, an der sich der gelöschte Booteintrag befunden hatte. Anschließend wurde dann ein Fehler ausgegeben, dass dieser Booteintrag nicht gefunden werden konnte) Am besten wenn ein Booteintrag gar nicht funktioniert, dann hier nur ganz an das Ende der Liste verschieben, dort stört es nicht und erst später vom Betriebssystem aus diesen Eintrag dann löschen.<br />
<br />
Löschen eines Eintrages mit der EFI-Shell würde hier wie folgt funktionieren (zB eine hier nicht vorhandenen) Bootoption 06 löschen <br />
<pre>Shell> bcfg boot rm 6</pre><br />
<br />
Bei unseren Tests ist mit diesem Löschen dann der oben beschriebene Fehler aufgetreten. Die Bootreihenfolge wurde dann nachträglich mittels der '''BootOrder''' Variable selbst wieder korrigiert, ( auch hier Warnung, am besten die Finger davon lassen.)<br />
<br />
Beispiel:<br />
<pre>Shell> dmpstore BootOrder<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00-</pre><br />
und auch setvar <br />
<pre>Shell> 8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 05 00 01 00 </pre><br />
zeigen uns die Reihenfolge 02 0A 05 01 (wobei die Hexdumpwerte hierbei Hexwerte der Boot'''xxxx''' Variablen bedeutet),<br><br />
wir verändern diese jetzt auf 02 0A 01 05<br />
<pre>Shell> setvar BootOrder =02000A0001000500</pre><br />
und erhalten danach<br />
<pre>Shell> setvar BootOrder<br />
8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 01 00 05 00</pre> <br />
und auch "bcfg boot dump" sollte jetzt und die geänderte Boot-Reihenfolge anzeigen.<br />
<br />
<br />
Einzelne nicht mehr benötigte Bootvariablen könnte wir auch mit "setvar" Löschen, (Auch hier die Warnung, am Besten die Finger davon lassen)<br />
<br />
<pre>Shell> setvar Boot0012 =</pre><br />
würde die Variabel "Boot0012" löschen.<br />
<br />
<br />
<br />
<br />
Wenn wir jetzt hier gar keinen brauchbaren Booteintrag finden der sich zum Booten eignet würde und den wir an erste Stelle schieben könnten, oder sonst warum ein neuen Booteintrag anlegen wollen, geht auch dieses mit "bcfg". Dazu wechseln wir zuerst einmal in das Dateisystem in dem sich Bootloader befindet, den wir konfigurieren wollen. <br />
<br />
<pre>Shell> f0:<br />
FS0:\> </pre><br />
dort dann mittels "'''cd'''" und "'''ls'''" dann das Dateisystem untersuchen, bis wir den Bootloader sehen, den wir als Booteintrag anlegen möchten. Den Path bis zu dieser Datei benötigen wir ebenfalls, und wir sollten uns derzeit in mit der EFI-Shell auf diesem Dateisystem befinden.<br />
<br />
<pre>FS0:\> ls \efi\opensuse\<br />
Directory of: FS1:\efi\opensuse\<br />
03/21/2015 01:14 <DIR> 1,024 .<br />
03/21/2015 01:14 <DIR> 1,024 ..<br />
05/06/2015 21:14 1,380,424 shim.efi<br />
05/06/2015 21:14 1,257,800 MokManager.efi<br />
05/06/2015 21:14 887,416 grub.efi<br />
05/06/2015 21:14 125 grub.cfg<br />
03/21/2015 01:19 121,344 grubx64.efi<br />
5 File(s) 3,647,109 bytes<br />
2 Dir(s)</pre><br />
Zu erkennen dort '''grubx64.efi''', dieses ist der normale Grub2 Bootloader, der bei ausgeschalteten [[Secure Boot]] starten sollte. Diesen tragen wir jetzt hier als weiteren Bootloader unten (als Option 04) in der Liste ein. Der Name dieser Bootoption so sein, "Grub2 (kein Secureboot)"<br />
<br />
<pre>FS0:\> bcfg boot add 4 \efi\opensuse\grubx64.efi "Grub2 (kein Secureboot)"</pre><br />
wir sehen dabei auch eine Erfolgsmeldung, in diesem Fall wurde '''Boot0000''' erzeugt und wie beabsichtigt an die letzte Stelle (04) gesetzt (welche Bootxxxx Variable dabei angelegt wird, darauf haben wir hier keinen Einfluss. Bei genauer Betrachtung der Logausgaben hier würde man sogar erkennen, hier wurde die Boot0000 Variable (oben bei dmpstore noch zu sehen als Bootoption "EFI HardDriv") überschrieben, diese Variable war zwar angelegt und auch Korrekt, aber keiner der Werte in "BootOrder" hat darauf verwiesen.)<br />
<br />
Ergebnis:<br />
<pre>FS0:\> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 03. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 04. Variable: Boot0000 <br />
Desc - Grub2 (kein Secureboot)<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
</pre><br />
<br />
Damit wollen wir unsere kleine Exkursion in die EFI-Shell auch schon wieder beenden, Verlassen mit "'''exit'''" oder mit "'''reset'''" .<br><br />
<br />
'''Nochmal zur Warnung:''' Die EFI-Shell ist nicht unbedingt für Otto-den-Normal-User gedacht. Ziel sollte es im Bedarfsfall maximal sein, hier einen funktionierenden Bootloader im Dateisystem zu finden und zu starten, maximal noch die Bootreihenfolge ändern und gegebenenfalls auch wenn notwendig mal einen neuen Booteintrag anzulegen. Man kann in der EFI-Shell durchaus auch die Unterstützung von Geräten im UEFI unterbinden oder anderweitig das Booten komplett abschalten wenn man hier leichtsinnig irgendwelche Dinge umbiegt oder löscht, das Ding ist sehr mächtig, aber auch sehr gewöhnungsbedürftig. Also sicherheitshalber ist hier Weniger oftmals Mehr.<br />
<br />
<br />
<br />
<br />
<br />
===UEFI Konfiguration aus Windows===<br />
<br />
Um an der UEFI Bootkonfiguration von Windows aus heranzugehen kann es nicht schaden, sich erst einmal ein wenig über das Bootkonzept von Windows zu informieren. Ein wenig Wissen darüber wird sich schnell auszahlen, wenn man mit diesen Erkenntnissen anschließend nicht versuchen muss tagelang mit den falschen Tools gewünschte Änderungen vorzunehmen.<br><br />
<br />
<br />
<br />
====Zugriff auf die EFI-Partition====<br />
<br />
[[ESP]] ist zwar ein Windowsdateisystem, doch als solches normalerweise von Windows aus nicht sichtbar. Das Dateisystem ist versteckt. Um dennoch von Windows aus die Dateien auf diesem Dateisystem zu sichten, und gegebenen falls Änderungen dort vorzunehmen muss es erst eingehängt werden. Dazu am Besten mittels "Eingabeaufforderung(als Administrator)" ein entsprechendes Commandline Eingabefenster öffnen. Wenn denn wirklich notwendig, kann man sich hier auch noch über die im System befindlichen Platten einen Überblick verschaffen.<br><br />
Befehl: '''diskpart''' dort dann '''list disk''', verlassen mit '''exit''' (doch vorsichtig mit dem Befehl "diskpart", damit kann man auch die Platten neu partitionieren und damit mehr kaputt machen wie einem lieb ist.)<br />
<pre> <br />
ISKPART> list disk<br />
<br />
Datenträger ### Status Größe Frei Dyn GPT<br />
--------------- ------------ ------- ------- --- ---<br />
Datenträger 0 Online 64 GB 0B *<br />
<br />
DISKPART> exit<br />
</pre><br />
<br />
Das einbinden des ESB als Laufwerk ähnelt dann der Vorgehensweise des mounten in Linux<br><br />
Einhängen der ESP Partition als Laufwerk '''Z:'''<br />
<pre> mountvol Z: /s </pre> <br />
Nach dem die Arbeiten dorr abgeschlossen sind, dann das Laufwerk '''Z:''' wieder aushängen<br />
<pre> mountvol Z: /d </pre><br />
Wenn das Laufwerk '''Z:''' eingehängt ist, kann man mit dem Dateibrowser oder mittels DOS Kommandos dort ganz normal arbeiten, um zB Dateien anzulegen, zu löschen, umzubenennen, verschieben usw. Hier ein kleines Beispiellog, welches dieses verdeutlicht.<br />
<pre><br />
C:\WINDOWS\system32>mountvol Z: /s<br />
<br />
C:\WINDOWS\system32>Z:<br />
<br />
Z:\>dir<br />
Volume in Laufwerk Z: hat keine Bezeichnung.<br />
Volumeseriennummer: 4250-0537<br />
<br />
Verzeichnis von Z:\<br />
<br />
21.03.2015 01:14 <DIR> EFI<br />
16.09.2015 16:54 12.193 NvVars<br />
20.03.2015 02:51 <DIR> KEY<br />
20.03.2015 02:52 <DIR> tools<br />
10.09.2015 23:13 8.969 log.txt<br />
2 Datei(en), 21.162 Bytes<br />
3 Verzeichnis(se), 67.798.016 Bytes frei<br />
<br />
<br />
Z:\>cd efi\opensuse<br />
<br />
Z:\EFI\opensuse>dir<br />
Volume in Laufwerk Z: hat keine Bezeichnung.<br />
Volumeseriennummer: 4250-0537<br />
<br />
Verzeichnis von Z:\EFI\opensuse<br />
<br />
21.03.2015 01:14 <DIR> .<br />
21.03.2015 01:14 <DIR> ..<br />
06.05.2015 21:14 1.380.424 shim.efi<br />
06.05.2015 21:14 1.257.800 MokManager.efi<br />
06.05.2015 21:14 887.416 grub.efi<br />
06.05.2015 21:14 125 grub.cfg<br />
21.03.2015 01:19 121.344 grubx64.efi<br />
06.05.2015 21:14 1.380.424 myshim.efi<br />
6 Datei(en), 5.027.533 Bytes<br />
2 Verzeichnis(se), 67.798.016 Bytes frei<br />
<br />
Z:\EFI\opensuse>c:<br />
<br />
C:\Windows\System32>mountvol Z: /d<br />
<br />
C:\Windows\System32>Z:<br />
Das System kann das angegebene Laufwerk nicht finden.<br />
</pre><br />
Damit sollte es jetzt zB auch möglich sein, sich einen Linuxbootloader oder eine EFI-Shell von Windows aus auf die ESP zu kopieren, oder um nachzuschauen ob die betreffende Datei oder Verzeichnis dort überhaupt vorhanden ist. So etwas kann zB schon helfen bei einem weit verbreiteten BUG in der UEFI-FW [http://mjg59.livejournal.com/138188.html], der auf einer Reihe von Systemboards zu finden ist. Es wird nicht die im EFI konfigurierte Bootreihenfolge zu booten herangezogen, sondern immer nur der Default Bootloader "\EFI\boot\bootx64.efi" zum Booten verwendet. Wenn man dort seinen "Shim" oder "Grub2" als "\EFI\boot\bootx64.efi" für einen funktionierenden Multiboot abgelegt hat, wird diese Datei eventuell bei jedem größerem Windowsupdate/Upgrade wieder mit dem Bootmanager von Windows überschrieben. Das hat dann zur Folge, das dann wieder nur noch Windows startet und default nicht mehr wie in den meisten MultibootSystemen gewünst, Grub2 gestartet. Mit ein paar wenigen DOS Kommandos könnte von Windows aus ziemlich einfach "Shim.efi" oder "Grubx64.efi" wieder als "bootx64.efi" dort hin kopieren werden. <br />
<br />
<br />
<br />
====BCD====<br />
<br />
Das aktuelle Bootsystem von Windows basiert auf [https://de.wikipedia.org/wiki/Boot_Configuration_Data BCD] und wird seit Windows Vista benutzt.<br />
Als es entwickelt wurde war an eine allumfassende Einführung von EFI oder UEFI noch nicht zu denken. Dieser Umstand führt wahrscheinlich dazu, dass man heute beim Gebrauch der Boardmitteln der Bootkonfiguration von Windows und deren Doku schnell feststellen wird, UEFI ist da irgendwo nachträglich davor geklemmt und in der eigentlichen Windows Bootkonfiguration auch nur teilweise konfigurierbar.<br />
Das Tool für die Windows Boot Konfiguration ist "bcdedit"<br />
<br />
<br />
=====bcdedit===== <br />
<br />
'''bcdedit''' ist das Commandlinetool für die komplette Bootkonfiguration von Windows. Das Tool ist sehr mächtig und die vorhandene Dokumentation obwohl sehr umfangreich, irgendwo zwischen schaurig schlecht und extrem schwer verständlich. Im Vorfeld der Entstehung der UEFI Artikel in diesem Wiki wurde sich ausführlich mit diesem Tool und seinen Möglichkeiten in Bezug auf die UEFI Boot Konfiguration beschäftigt. Dieses Tool ist hauptsächlich und einzig und allein für die Windowsbootkonfiguration bestimmt, dafür ist es entwickelt und dort ist es durchaus hilfreich. Für die Konfiguration der reinen UEFI-Bootkonfiguration ist es nur sehr bedingt brauchbar. Windows geht in seiner Philosophie im Bootprozess davon aus, dass die Welt nur aus Windows besteht, und der Bootprozess von Windows hat ähnliche Aufgaben und Konfigurationsmöglichkeiten die auch "grub2" und zT. auch "systemd" im Linuxbootprozess haben. All diese sind mittels "bcdedit" konfigurierbar. Zum Teil sind die Kommandos hier nicht leicht zu erstellen, da oftmals hier die [https://de.wikipedia.org/wiki/Globally_Unique_Identifier GUID] oder schlecht dokumentierte vordefinierte Bezeichner verwendet werden müssen. UEFI spielt dabei nur am Rande eine Art Neben Rolle. Es sind einige Möglichkeiten vorhanden auch die UEFI-Bootkonfiguration zu ändern und anzupassen, aber Hauptaufgabe ist das nicht, das sollte uns bewusst sein.<br><br />
<br />
Ein paar wenige Befehle die in einer Multibootkonfiguration Windows/Linux hin und wieder mal benötigt werden sollen hier dennoch vorgestellt werden, aber tiefer wollen wir hier in bcdedit nicht einsteigen. Voraussetzung auch hier, es werden ebenfalls Administrator Rechte benötigt.<br />
<br />
Das Sichern des kompletten BCD-Store, also der gesamten Bootkonfiguration die Windows derzeit kennt. Dieses sollten wir zB vor dem Installieren von Linux als das 2. Betriebssystem ausführen, und auch danach noch einmal mit einem anderem Datei Namen, nachdem die Bootkonfiguration dann für Multiboot sauber funktioniert. Mit einer solchen Sicherung ist es dann möglich im Bedarfsfall mit bcdedit die ursprünglich funktionierende Bootkonfiguration gezielt wieder herzustellen. <br />
<br />
<pre>bcdedit /export "C:\Data\sysdefault.uefi"</pre><br />
Ein zurückholen einer solchen Sicherung dann analog<br />
<pre>bcdedit /import "C:\Data\sysdefault.uefi"</pre><br />
<br />
Gut geeignet ist bcdedit auch zum auslesen der aktuellen Konfiguration, einschließlich der UEFI-Bootkonfiguration. Dieses könnte zB hilfreich sein, um bei gravierenden Problemen die Konfiguration in ein Forum zwecks Hilfe zu posten. Diese macht aber nur Sinn wenn auch die Auflistung der Dateinamen der Linux-Bootloader aus der EFI-Partition auch mit dazu geliefert wird.<br />
<br />
<pre><br />
C:\WINDOWS\system32>bcdedit /enum all<br />
<br />
Start-Manager für Firmware<br />
--------------------------<br />
Bezeichner {fwbootmgr}<br />
displayorder {94e4b67b-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{bootmgr}<br />
{94e4b67a-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b67e-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b67c-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{0a50b585-ce9d-11e4-ab31-00163e1c698d}<br />
{2ce453f3-06c3-11e5-b220-806e6f6e6963}<br />
{2ce453f4-06c3-11e5-b220-806e6f6e6963}<br />
timeout 0<br />
<br />
Windows-Start-Manager<br />
---------------------<br />
Bezeichner {bootmgr}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\Microsoft\Boot\bootmgfw.efi<br />
description Windows Boot Manager<br />
locale de-DE<br />
inherit {globalsettings}<br />
default {default}<br />
resumeobject {94e4b691-ce8b-11e4-9e2b-b59e390c8fcd}<br />
displayorder {current}<br />
toolsdisplayorder {memdiag}<br />
timeout 30<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {0a50b585-ce9d-11e4-ab31-00163e1c698d}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\opensuse\shim.efi<br />
description EFI Floppy<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {2ce453f3-06c3-11e5-b220-806e6f6e6963}<br />
description EFI Floppy 1<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {2ce453f4-06c3-11e5-b220-806e6f6e6963}<br />
description EFI Hard Drive<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {4198755e-0700-11e5-b690-806e6f6e6963}<br />
description EFI Floppy<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {4198755f-0700-11e5-b690-806e6f6e6963}<br />
description EFI Floppy 1<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\opensuse\grubx64.efi<br />
description Grub2 (kein Secureboot)<br />
<br />
...... <br />
</pre> <br />
Die Ausgabe hier ist gekürzt, dort unten können noch jede Menge Windowseinträge (oftmals Duplikate) kommen, insbesondere wenn das Windowssystem schon mehrfach Upgrade hinter sich hat, sind dort eventuell viele OS-Loader, Recovery- und Hiperfil- Einträge. Diese sind für eine Multibootkonfiguration mit Linux meist nicht von Belang. Im UEFI Umfeld sind folgende Bereiche von Bedeutung.<br />
<br />
* '''Start-Manager für Firmware''' : hier befindet sich die UEFI-Startreihenfolge, Die Reihenfolge hier entspricht der '''BootOrder''' Variable, allerdings sind hier nicht direkt die Hexadezimalwerte der Bootxxxx Variablen, sondern bei den meisten Einträge ist hier nur die GUID der Bootxxxx Variablen angegeben.<br />
* '''Windows-Start-Manager''' : dieses ist '''{bootmgr}''', das ist der Windows Boot Manager, der auch eine der Bootxxxx Variablen ist.<br />
* '''Firmwareanwendung (101fffff)''': dieses sind alle anderen (also alle außer dem "Windows-Boot-Manager") '''Bootxxxx''' Variablen die in der '''BootOrder''' stehen, bzw. derzeit im UEFI bekannt sind.<br />
<br />
Damit ließe sich mit etwas Aufwand in der Kombination der GUIDs die aktuellen UEFI-Bootloader Konfiguration auslesen. Zu beachten hier, die UEFI-Bootloader von Linux und alle anderen vom UEFI selbst angelegte Bootxxxx sind als Firmwareanwendung zu erkennen. Windows kennt nur einen einzigen Bootmanager, (den eigenen) und OS_loader sind Loader die aus dem Menu des WindowsBootmanager heraus aufgerufen werden können.<br />
<br />
Auf Befehle die hier aktiv eingreifen und etwas ändern, möchten wir ausdrücklich verzichten und auch dringend davor warnen hier etwas mit '''bcdedit''' im UEFI-Umfeld zu machen, (obwohl das eine oder andere durchaus möglich ist). Besser dieses wenn notwendig mit einem Grafischen Tool unter Windows machen. Dafür gibt es einige.<br />
<br />
<br />
<br />
=====Links zur Doku von BCD und bcdedit=====<br />
<br />
Wer sich näher mit BCD oder bcdedit beschäftigen will, oder irgendwie an der Windowsbootloaderkonfiguration etwas ändern oder reparieren muss, hier sind ein paar Links zu Doku dazu.<br />
* [https://msdn.microsoft.com/en-us/library/windows/hardware/ff542268%28v=vs.85%29.aspx Boot Options Windows Doku]<br />
<br />
* [http://www.uefi.org/sites/default/files/resources/UEFI-Plugfest-WindowsBootEnvironment.pdf Übersicht über den Windows Bootprozess]<br />
* [http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/windows-nt-6-boot-process.html Bootprozess Dokumentation]<br />
<br />
* [http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/BCDedit_reff.docx BCDedit Referenz Manual]<br />
* [http://diddy.boot-land.net/bcdedit/files/commands.htm BCD Kommando Referenz]<br />
* [https://technet.microsoft.com/en-us/library/cc731662.aspx bcdedit Schnellübersicht]<br />
<br />
<br />
<br />
=====Grafische Tools zur Windows Bootkonfiguration=====<br />
<br />
[[Datei:VisualBCD-0.png|200px|thumb|left|VisualBCD GUI zur Bearbeitung der WindowsBootkonfiguration]]<br />
Beispielgebend für eine GUI zu BCD soll hier [http://www.boyans.net/ Visual BCD Editor] vorgestellt werden, Ein (aber keinesfalls der Einzige) GUI-Editor für das Bearbeiten der BCD Daten. Dieses Tool kann wahrscheinlich alles was man mit bcdedit auch machen könnte. Auffällig hier, in der Gruppe '''Loaders''' sind die OS-Loader,(also die Loader die innerhalb des Windowsbootmanager alle auswählbar sind) mit den Firmwareloadern (also die UEFI-Bootvariablen) gemischt. <br> <br />
Mit diesem (oder ähnlichen) BCD GUI Tools hätte der NormalUser zu mindestens eine gute Chance das eine oder andere an der Bootkonfiguration "richtig" zu korregieren. Aber auch hier sei gewarnt, dieses ist nur ein Frontend für BCD und BCD hat nicht wirklich die richtigen Mittel und Methoden um die UEFI-Variablen alle zielgerecht zu bearbeiten. Zum Beispiel wird man feststellen, es lassen sich keine Firmwareanwendungen(101fffff) erzeugen. (also keine Bootxxxx Variablen) und die die existieren, lassen sich nicht immer wirklich ändern, auch wenn bcdedit oder die GUI sagt, es habe die Änderung erfolgreich geschrieben. ( Dieses liegt uA daran, dass die UEFI-Variablen innerhalb des BCD-Store noch einmal als Kopie vorliegen) Auch hier die Warnung, das Tool ist für die Windowsbootkonfiguration und nicht in erster Linie für die UEFI-Bootkonfiguration, (auch wenn natürlich auch hier einiges möglich ist)<br />
<br />
<br />
<br />
====UEFI Bootvariable bearbeiten====<br />
<br />
[[Datei:EasyUEFI-0.png|200px|thumb|left|EasyUEFI GUI zum Konfigurieren der UEFI Bootvariablen]]<br />
Nach dem wir feststellen durften, dass mit der normalen Bootkonfiguration von Windows die UEFI-Variablen nicht wirklich gut bis gar nicht zu ändern sind, hier jetzt ein Tool mit dem dieses unter Windows erledigt werden kann. Nach einem Commandline Tool haben wir gar nicht erst gesucht, sondern gleich nach einer GUI und wurden fündig mit [http://www.easyuefi.com/index-us.html EasyUEFI].<br><br />
Mit dieser GUI ist es auch für einen Linuxuser ohne Windowskenntnisse möglich unter Windows relativ unkompliziert Bootvariablen neu anzulegen, zu sortieren und überflüssige zu deaktivieren oder zu löschen. Es ist möglich eine Bootvariable für den nächsten Bootvorgang festzulegen und einiges mehr. Auch ist es möglich hier gleich aus der GUI den Rechner zu rebooten. Dieses Tool scheint nach unseren Tests eine gute Ergänzung in einem Multibootsystem mit Linux zu sein. Es ist übersichtlicher, universeller und einfacher zu bedienen als so maches UEFI-BIOS-SETUP. Man kann hiermit ohne große Kenntnisse von UEFI die default Bootreihenfolge nach seinen Bedürfnissen einstellen, oder zB auch auswählen, das beim nächsten Reboot nicht Windows sondern Linux gestartet werden kann. <br />
<br />
<br />
<br />
<br />
<br />
<br />
==LINKS==<br />
<br />
* sehr guter [https://forums.opensuse.org/showthread.php/487837-How-to-Dual-boot-%28preinstalled%29-Windows-8-and-Linux-UEFI-etc umfassender Beitrag] über das Einrichten von Windows8-Linux-Dualboot</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=UEFI_Boot_Konfiguration&diff=32659UEFI Boot Konfiguration2015-09-19T00:17:51Z<p>Robi: Bilder eingefügt</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
{{UnderConstruction}}<br />
<br />
==UEFI Boot Konfiguration==<br />
<br />
===UEFI Variablen allgemein===<br />
<br />
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.<br><br />
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.<br />
<br />
Beispiel, Ausgabe einer UEFI Variable aus der [[EFI-Shell]]: <br />
<pre><br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8<br />
00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.*<br />
00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...*<br />
00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................*<br />
00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y*<br />
00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.*<br />
00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.*<br />
00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.*<br />
00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......*<br />
00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.*<br />
00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.*<br />
000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.*<br />
000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*<br />
</pre><br />
<br />
* '''NV+RT+BS''' entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS" <br><br />
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden<br />
<br />
* '''8BE4DF61-93CA-11D2-AA0D-00E098032B8C''' diese ist eine EFI-GUID und bedeutet in diesem Fall <br><br />
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.<br />
<br />
* '''Boot000A''' dieses ist der Name der Variable <br />
<br />
* '''DataSize = 0xB8''' dieses ist die hexadezimale Längenangabe für die Daten der Variable<br />
<br />
* der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "'''hexdump -C''' " in Linux liefern würde.<br />
<br />
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit [http://de.wikipedia.org/wiki/UTF-16 UTF-16] abgelegt sind.<br />
<br />
In diesem Fall handelst es sich um den Booteintrag (Label) "'''neuerkern'''" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "'''\EFI\opensuse\bzImage.efi'''" mit den Optionen "'''initrd=\efi\opensuse\initrd'''" starten soll.<br><br />
<br />
<br />
<br />
===UEFI Boot Variablen===<br />
<br />
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.<br />
<br />
<br />
====Bootxxxx====<br />
<br />
'''xxxx''' ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen '''Boot0001''' von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit '''Boot0000'''.<br><br />
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix "'''.efi'''". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.<br />
<br />
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.<br />
<br />
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:<br />
<pre><br />
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
</pre><br />
<br />
<br />
<br />
====BootOrder====<br />
<br />
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem '''xxxx''' aus den '''Bootxxxx''' Variablen entsprechen.<br />
<br />
BootOrder: 0004,0001,0002,0000,0003<br />
<br />
Hier im Beispiel wird die Bootvariable '''Boot0004''' die erste sein mit deren Hilfe UEFI versucht das System zu booten.<br />
<br />
<br />
====weitere Bootvariablen====<br />
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.<br />
<br />
* '''BootCurrent''' : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs<br />
* '''BootNext''' : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.<br />
* '''Timeout''' : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis '''BootOrder''' oder '''BootNext''' verwendet wird um einen Bootloader zu starten<br />
* '''SecureBoot''' zeigt an ob derzeit bzw. für den nächsten Reboot [[Secure Boot]] aktiv ist.<br />
* und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden <br />
<br />
<br />
<br />
<br />
<br />
===Bootkonfiguration aus dem Setup Menü===<br />
<br />
<!-- hier brauchen wir evtl. ein paar Bilder, da sich das wahrscheinlich auf jedem Rechner etwas anders darstellt.--><br />
<br />
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der [[ESP]] einen Bootloader '''\EFI\boot\bootx64.efi''' dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen. <br />
<br />
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte. <br><br />
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.<br />
<br />
<!--Müssen wir etwas allgemein abhandeln und mit Beispielbildern unterlegen--><br />
[[Datei:UEFI-CustomMode.jpg|200px|thumb|left|Umschalten Standard Mode / Custom Mode]]<br />
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot) <br><br />
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.<br />
* SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen<br />
* CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem [[MBR]] nach der legacy Methode<br />
* und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll. <br />
* eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei [[Secure Boot#Secure Boot verstehen|Secureboot]] hier im Wiki . <br />
<br />
<br />
<br />
<br />
<br />
===Konfiguration aus Linux===<br />
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool [[efibootmgr]] gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool '''efibootmgr''' wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.<br />
<br />
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration. <br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM<br />
Boot0001* EFI DVD/CDROM 1<br />
Boot0002* EFI Floppy<br />
Boot0003* EFI Floppy 1<br />
Boot0004* EFI Hard Drive<br />
Boot0005* Shim boot<br />
Boot0006* EFI Internal Shell<br />
Boot0007* opensuse<br />
Boot0008* opensuse-secureboot<br />
Boot0009* kernel<br />
Boot000A* neuerkern<br />
Boot000B* grublegacy<br />
Boot000C* SUSE Linux Enterprise<br />
Boot000D* rEFInd Boot Manager<br />
Boot000E* Linux Boot Manager<br />
Boot000F* grub1 boot<br />
Boot0010* EFI Network<br />
Boot0011* EFI Network 1<br />
Boot0012* EFI Network 2<br />
</pre><br />
<br />
zusätzlich die Option "'''-v'''" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.<br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0)<br />
Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0)<br />
Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0)<br />
Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1)<br />
Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)<br />
Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0006* EFI Internal Shell MM(b,900000,10fffff)<br />
Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\<br />
.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d...<br />
Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.<br />
r.d...<br />
Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi)<br />
Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi)<br />
Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi)<br />
Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi)<br />
Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)<br />
Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0<br />
Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000<br />
00000000000000000000000000000<br />
</pre><br />
<br />
Hilfe bekommt man mit der Option "'''-h'''" oder auch über die [http://linux.die.net/man/8/efibootmgr Manpage]<br />
<pre> <br />
usage: efibootmgr [options]<br />
-a | --active sets bootnum active<br />
-A | --inactive sets bootnum inactive<br />
-b | --bootnum XXXX modify BootXXXX (hex)<br />
-B | --delete-bootnum delete bootnum (hex)<br />
-c | --create create new variable bootnum and add to bootorder<br />
-d | --disk disk (defaults to /dev/sda) containing loader<br />
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess<br />
-E | --device num EDD 1.0 device number (defaults to 0x80)<br />
-g | --gpt force disk with invalid PMBR to be treated as GPT<br />
-H | --acpi_hid XXXX set the ACPI HID (used with -i)<br />
-i | --iface name create a netboot entry for the named interface<br />
-l | --loader name (defaults to \elilo.efi)<br />
-L | --label label Boot manager display label (defaults to "Linux")<br />
-n | --bootnext XXXX set BootNext to XXXX (hex)<br />
-N | --delete-bootnext delete BootNext<br />
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)<br />
-O | --delete-bootorder delete BootOrder<br />
-p | --part part (defaults to 1) containing loader<br />
-q | --quiet be quiet<br />
| --test filename don't write to NVRAM, write to filename.<br />
-t | --timeout seconds set boot manager timeout waiting for user input.<br />
-T | --delete-timeout delete Timeout.<br />
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)<br />
-U | --acpi_uid XXXX set the ACPI UID (used with -i)<br />
-v | --verbose print additional information<br />
-V | --version return version and exit<br />
-w | --write-signature write unique sig to MBR if needed<br />
-@ | --append-binary-args file append extra args from file (use "-" for stdin)<br />
</pre><br />
einfache Beispiele:<br />
efibootmgr -n 5 <br />
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable '''Boot0005''' (in diesem Beispiel "shim boot") durchgeführt wird.<br />
<br />
efibootmgr -o 5,6,9,0<br />
würde die '''Bootorder''' dauerhaft umstellen auf "'''0005,0006,0009,0000'''"<br />
<br />
efibootmgr -b 3 -B<br />
würde den Eintrag '''Boot0003''' löschen und wenn vorhanden aus der '''Bootorder''' entfernen<br />
<br />
<br />
etwas schwieriger ist das anlegen eines neuen Eintrages<br><br />
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen<br />
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi<br />
<br />
* '''-c''' - neu anlegen<br />
* '''-d''' - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet<br />
* '''-p 1''' - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default) <br />
* '''-L''' - der Name des Booteintrages<br />
* '''-l''' - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.<br />
<br />
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.<br />
<br />
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem [[ESP]] direkt von UEFI gestartet wird.<br />
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd<br />
<br />
* '''-u''' - setzt hier [http://de.wikipedia.org/wiki/UTF-16 UNICODE] Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE<br />
<br />
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.<br />
<br />
<br />
<br />
===Konfiguration aus der EFI-SHELL===<br />
<br />
Die Konfiguration der Bootvariablen mittels der [[EFI-Shell]] ist sicherlich für den Normaluser die allerletzte Möglichkeit die überhaupt in Betracht gezogen werden sollte. Dazu ist auch hier die Hindernislatte ziemlich hoch gehängt und wahrscheinlich muss da vorher auch eine ganze Menge an Fehlern und Ungereimtheiten passieren, bevor dieses einmal notwendig werden würde und die EFI-Shell als der einzige noch gangbare Weg übrig bleibt.<br />
<br />
Zuerst müsste der User wahrscheinlich eine EFI-Shell Version 2.x downloaden, die dann auch noch auf seinem Rechner funktioniert. Dann müsste er diese Shell irgendwohin abspeichern, dass sie mittels UEFI-Setup oder Default-Booteinträge gestartet werden kann. Und nicht zuletzt, müsste der User auch noch einige Grundkenntnisse über die EFI-Shell mitbringen oder zu mindestens schonmal einiges darüber gelesen haben, damit er diese überhaupt einigermaßen bedienen kann. In diesem Beitrag werden wir auf die meisten Grundlagen der EFI-Shell nicht eingehen, sondern uns nur um die reine Bootkonfigurationsmöglichkeiten beschränken.<br><br />
<br />
Prinzipiell einmal auf der EFI-Shell angekommen, ist es ein leichtes von dort aus einen der hoffentlich noch vorhanden Bootloader zu starten und damit wieder ein Betriebssystem zu haben von dem man dann mit einfacheren Mitteln die Bootkonfiguration wieder richten könnte. <br />
<br />
Darauf gehen wir hier aber nicht ein, wir wollen uns gezielt auf der EFI-Shell anschauen wie die Bootkonfiguration dort aussieht und wie wir sie dort ändern könnten. Wir würden für einige der weiteren Befehle hier eine EFI-Shell Version 2.x benötigen, diese ist üblicherweise Weise erst ab UEFI-2.3.1 lauffähig.<br />
<br />
Die Bootvariablen anschauen geht mit dem Befehl "'''dumpstore'''"<br />
<br />
<pre>Shell> dmpstore Boot*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0002' DataSize = 0xA2<br />
00000000: 01 00 00 00 7A 00 47 00-72 00 75 00 62 00 20 00 *....z.G.r.u.b. .*<br />
00000010: 53 00 65 00 63 00 75 00-72 00 65 00 20 00 42 00 *S.e.c.u.r.e. .B.*<br />
00000020: 6F 00 6F 00 74 00 00 00-02 01 0C 00 D0 41 03 0A *o.o.t........A..*<br />
00000030: 00 00 00 00 01 01 06 00-01 01 03 01 08 00 00 01 *................*<br />
00000040: 00 00 04 01 2A 00 02 00-00 00 00 68 09 00 00 00 *....*......h....*<br />
00000050: 00 00 00 18 03 00 00 00-00 00 0A 22 3A 66 4E 5B *...........":fN[*<br />
00000060: 4D 47 83 2F A9 69 D8 33-4C B4 02 02 04 04 32 00 *MG./.i.3L.....2.*<br />
00000070: 5C 00 45 00 46 00 49 00-5C 00 6F 00 70 00 65 00 *\.E.F.I.\.o.p.e.*<br />
00000080: 6E 00 73 00 75 00 73 00-65 00 5C 00 73 00 68 00 *n.s.u.s.e.\.s.h.*<br />
00000090: 69 00 6D 00 2E 00 65 00-66 00 69 00 00 00 7F FF *i.m...e.f.i.....*<br />
000000A0: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000C' DataSize = 0x42<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 20 00 31 00 00 00 *l.o.p.p.y. .1...*<br />
00000020: 02 01 0C 00 D0 41 03 0A-00 00 00 00 01 01 06 00 *.....A..........*<br />
00000030: 00 01 02 01 0C 00 D0 41-04 06 01 00 00 00 7F FF *.......A........*<br />
00000040: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000B' DataSize = 0x3E<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 00 00 02 01 0C 00 *l.o.p.p.y.......*<br />
00000020: D0 41 03 0A 00 00 00 00-01 01 06 00 00 01 02 01 *.A..............*<br />
00000030: 0C 00 D0 41 04 06 00 00-00 00 7F FF 04 00 *...A..........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0x12C<br />
00000000: 01 00 00 00 74 00 57 00-69 00 6E 00 64 00 6F 00 *....t.W.i.n.d.o.*<br />
00000010: 77 00 73 00 20 00 42 00-6F 00 6F 00 74 00 20 00 *w.s. .B.o.o.t. .*<br />
00000020: 4D 00 61 00 6E 00 61 00-67 00 65 00 72 00 00 00 *M.a.n.a.g.e.r...*<br />
00000030: 04 01 2A 00 02 00 00 00-00 68 09 00 00 00 00 00 *..*......h......*<br />
00000040: 00 18 03 00 00 00 00 00-0A 22 3A 66 4E 5B 4D 47 *.........":fN[MG*<br />
00000050: 83 2F A9 69 D8 33 4C B4-02 02 04 04 46 00 5C 00 *./.i.3L.....F.\.*<br />
00000060: 45 00 46 00 49 00 5C 00-4D 00 69 00 63 00 72 00 *E.F.I.\.M.i.c.r.*<br />
00000070: 6F 00 73 00 6F 00 66 00-74 00 5C 00 42 00 6F 00 *o.s.o.f.t.\.B.o.*<br />
00000080: 6F 00 74 00 5C 00 62 00-6F 00 6F 00 74 00 6D 00 *o.t.\.b.o.o.t.m.*<br />
00000090: 67 00 66 00 77 00 2E 00-65 00 66 00 69 00 00 00 *g.f.w...e.f.i...*<br />
000000A0: 7F FF 04 00 57 49 4E 44-4F 57 53 00 01 00 00 00 *....WINDOWS.....*<br />
000000B0: 88 00 00 00 78 00 00 00-42 00 43 00 44 00 4F 00 *....x...B.C.D.O.* <br />
000000C0: 42 00 4A 00 45 00 43 00-54 00 3D 00 7B 00 39 00 *B.J.E.C.T.=...9.* <br />
000000D0: 64 00 65 00 61 00 38 00-36 00 32 00 63 00 2D 00 *d.e.a.8.6.2.c.-.* <br />
000000E0: 35 00 63 00 64 00 64 00-2D 00 34 00 65 00 37 00 *5.c.d.d.-.4.e.7.* <br />
000000F0: 30 00 2D 00 61 00 63 00-63 00 31 00 2D 00 66 00 *0.-.a.c.c.1.-.f.* <br />
00000100: 33 00 32 00 62 00 33 00-34 00 34 00 64 00 34 00 *3.2.b.3.4.4.d.4.* <br />
00000110: 37 00 39 00 35 00 7D 00-00 00 00 00 01 00 00 00 *7.9.5...........* <br />
00000120: 10 00 00 00 04 00 00 00-7F FF 04 00 *............* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0001' DataSize = 0x44 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 20 00 31 00 00 00 02 01-0C 00 D0 41 03 0A 00 00 * .1........A....* <br />
00000030: 00 00 01 01 06 00 01 01-03 01 08 00 00 00 00 00 *................* <br />
00000040: 7F FF 04 00 *....* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0004' DataSize = 0x40 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 00 00 02 01 0C 00 D0 41-03 0A 00 00 00 00 01 01 *.......A........* <br />
00000030: 06 00 01 01 03 01 08 00-01 00 00 00 7F FF 04 00 *................* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0000' DataSize = 0x42 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 48 00 *......E.F.I. .H.* <br />
00000010: 61 00 72 00 64 00 20 00-44 00 72 00 69 00 76 00 *a.r.d. .D.r.i.v.* <br />
00000020: 65 00 00 00 02 01 0C 00-D0 41 03 0A 00 00 00 00 *e........A......* <br />
00000030: 01 01 06 00 01 01 03 01-08 00 00 01 00 00 7F FF *................* <br />
00000040: 04 00 *..* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0005' DataSize = 0x5C <br />
00000000: 01 00 00 00 30 00 45 00-46 00 49 00 20 00 49 00 *....0.E.F.I. .I.*<br />
00000010: 6E 00 74 00 65 00 72 00-6E 00 61 00 6C 00 20 00 *n.t.e.r.n.a.l. .*<br />
00000020: 53 00 68 00 65 00 6C 00-6C 00 00 00 01 03 18 00 *S.h.e.l.l.......*<br />
00000030: 0B 00 00 00 00 00 90 00-00 00 00 00 FF FF 0F 01 *................*<br />
00000040: 00 00 00 00 04 06 14 00-83 A5 04 7C 3E 9E 1C 4F *............>..O*<br />
00000050: AD 65 E0 52 68 D0 B4 D1-7F FF 04 00 *.e.Rh.......*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent' DataSize = 0x02<br />
00000000: 05 00 *..*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOptionSupport' DataSize = 0x04<br />
00000000: 03 03 00 00 *....*</pre><br />
zu sehen hier die komplette Ausgabe der mit "'''Boot'''" beginnenden NVRAM Variablen im RAW-Format. Die Bootvariablen. '''Bootxxxx''' sind die Booteinträge in der die Konfiguration der einzelnen Bootloader hinterlegt ist. (Dieses können durchaus auch mal mehr sein, als in der Bootreihenfolge berücksichtigt ist, und die einzelnen Hexadezimal-Nummern müssen nicht aufeinander folgend sein. UEFI verwaltet diese Variablen selbst, und vergibt auch die Nummern selbständig)<br><br />
In der Efi Variable '''BootOrder''' ist die Reihenfolge hinterlegt.<br />
<pre>Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*</pre><br />
Weitere NVRAM Variablen die hier angezeigt werden sind zB. '''BootCurrent BootNext''' ....<br />
<br />
<br />
<br />
die eigentliche Bootkonfiguration und die aktuelle Reihenfolge sehen wir mit <br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 01. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N</pre><br />
Wir sehen hier bei Optionen die Startreihenfolge von 0 bis 3 (hinter Option) und dahinter die entsprechenden Bootvariable auf die dabei zugegriffen wird. Darunter wird dann jeweils noch ausgegeben der Name der für diese Bootoption gewählt wurde, und der Devicepath aus der Bootvariablen, der auf einen Bootloader oder eine andere UEFI-Applikation zeigen sollte. Die Ausgabe hier ist ein Kombination aus der '''BootOrder''' und den '''Bootxxxx''' Variablen und entspricht auch der Reihenfolge die im Bootmenü des UEFI-Setups angezeigt wird. <br />
<br />
Soweit die Bootxxxx Variablen noch vorhanden sind und auch entsprechend auf die richtigen Bootloader Dateien verweisen, reicht es eventuell aus nur die Bootreihenfolge zu ändern, damit das System wieder booten kann.<br />
<br />
<pre>Shell> bcfg boot mv 1 0</pre><br />
vertauscht in unserem Fall den 2.Eintrag, (shim) und setzt ihn an erste Stelle, also vor Windows, Dieses sollten wir selbstverständlich anschließend auch kontrollieren.<br />
<br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
</pre> <br />
<br />
<br />
Mit dem Löschen eines Booteintrages hier sollten wir sehr sehr vorsichtig sein, (bei den Tests hierzu wurde zwar die Bootvariable gelöscht, aber nicht aus der BootOrder entfernt, was dann dazu geführt hatte das die Bootreihenfolge nur noch bis zu der Stelle angezeigt werden konnte, an der sich der gelöschte Booteintrag befunden hatte. Anschließend wurde dann ein Fehler ausgegeben, dass dieser Booteintrag nicht gefunden werden konnte) Am besten wenn ein Booteintrag gar nicht funktioniert, dann hier nur ganz an das Ende der Liste verschieben, dort stört es nicht und erst später vom Betriebssystem aus diesen Eintrag dann löschen.<br />
<br />
Löschen eines Eintrages mit der EFI-Shell würde hier wie folgt funktionieren (zB eine hier nicht vorhandenen) Bootoption 06 löschen <br />
<pre>Shell> bcfg boot rm 6</pre><br />
<br />
Bei unseren Tests ist mit diesem Löschen dann der oben beschriebene Fehler aufgetreten. Die Bootreihenfolge wurde dann nachträglich mittels der '''BootOrder''' Variable selbst wieder korrigiert, ( auch hier Warnung, am besten die Finger davon lassen.)<br />
<br />
Beispiel:<br />
<pre>Shell> dmpstore BootOrder<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00-</pre><br />
und auch setvar <br />
<pre>Shell> 8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 05 00 01 00 </pre><br />
zeigen uns die Reihenfolge 02 0A 05 01 (wobei die Hexdumpwerte hierbei Hexwerte der Boot'''xxxx''' Variablen bedeutet),<br><br />
wir verändern diese jetzt auf 02 0A 01 05<br />
<pre>Shell> setvar BootOrder =02000A0001000500</pre><br />
und erhalten danach<br />
<pre>Shell> setvar BootOrder<br />
8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 01 00 05 00</pre> <br />
und auch "bcfg boot dump" sollte jetzt und die geänderte Boot-Reihenfolge anzeigen.<br />
<br />
<br />
Einzelne nicht mehr benötigte Bootvariablen könnte wir auch mit "setvar" Löschen, (Auch hier die Warnung, am Besten die Finger davon lassen)<br />
<br />
<pre>Shell> setvar Boot0012 =</pre><br />
würde die Variabel "Boot0012" löschen.<br />
<br />
<br />
<br />
<br />
Wenn wir jetzt hier gar keinen brauchbaren Booteintrag finden der sich zum Booten eignet würde und den wir an erste Stelle schieben könnten, oder sonst warum ein neuen Booteintrag anlegen wollen, geht auch dieses mit "bcfg". Dazu wechseln wir zuerst einmal in das Dateisystem in dem sich Bootloader befindet, den wir konfigurieren wollen. <br />
<br />
<pre>Shell> f0:<br />
FS0:\> </pre><br />
dort dann mittels "'''cd'''" und "'''ls'''" dann das Dateisystem untersuchen, bis wir den Bootloader sehen, den wir als Booteintrag anlegen möchten. Den Path bis zu dieser Datei benötigen wir ebenfalls, und wir sollten uns derzeit in mit der EFI-Shell auf diesem Dateisystem befinden.<br />
<br />
<pre>FS0:\> ls \efi\opensuse\<br />
Directory of: FS1:\efi\opensuse\<br />
03/21/2015 01:14 <DIR> 1,024 .<br />
03/21/2015 01:14 <DIR> 1,024 ..<br />
05/06/2015 21:14 1,380,424 shim.efi<br />
05/06/2015 21:14 1,257,800 MokManager.efi<br />
05/06/2015 21:14 887,416 grub.efi<br />
05/06/2015 21:14 125 grub.cfg<br />
03/21/2015 01:19 121,344 grubx64.efi<br />
5 File(s) 3,647,109 bytes<br />
2 Dir(s)</pre><br />
Zu erkennen dort '''grubx64.efi''', dieses ist der normale Grub2 Bootloader, der bei ausgeschalteten [[Secure Boot]] starten sollte. Diesen tragen wir jetzt hier als weiteren Bootloader unten (als Option 04) in der Liste ein. Der Name dieser Bootoption so sein, "Grub2 (kein Secureboot)"<br />
<br />
<pre>FS0:\> bcfg boot add 4 \efi\opensuse\grubx64.efi "Grub2 (kein Secureboot)"</pre><br />
wir sehen dabei auch eine Erfolgsmeldung, in diesem Fall wurde '''Boot0000''' erzeugt und wie beabsichtigt an die letzte Stelle (04) gesetzt (welche Bootxxxx Variable dabei angelegt wird, darauf haben wir hier keinen Einfluss. Bei genauer Betrachtung der Logausgaben hier würde man sogar erkennen, hier wurde die Boot0000 Variable (oben bei dmpstore noch zu sehen als Bootoption "EFI HardDriv") überschrieben, diese Variable war zwar angelegt und auch Korrekt, aber keiner der Werte in "BootOrder" hat darauf verwiesen.)<br />
<br />
Ergebnis:<br />
<pre>FS0:\> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 03. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 04. Variable: Boot0000 <br />
Desc - Grub2 (kein Secureboot)<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
</pre><br />
<br />
Damit wollen wir unsere kleine Exkursion in die EFI-Shell auch schon wieder beenden, Verlassen mit "'''exit'''" oder mit "'''reset'''" .<br><br />
<br />
'''Nochmal zur Warnung:''' Die EFI-Shell ist nicht unbedingt für Otto-den-Normal-User gedacht. Ziel sollte es im Bedarfsfall maximal sein, hier einen funktionierenden Bootloader im Dateisystem zu finden und zu starten, maximal noch die Bootreihenfolge ändern und gegebenenfalls auch wenn notwendig mal einen neuen Booteintrag anzulegen. Man kann in der EFI-Shell durchaus auch die Unterstützung von Geräten im UEFI unterbinden oder anderweitig das Booten komplett abschalten wenn man hier leichtsinnig irgendwelche Dinge umbiegt oder löscht, das Ding ist sehr mächtig, aber auch sehr gewöhnungsbedürftig. Also sicherheitshalber ist hier Weniger oftmals Mehr.<br />
<br />
<br />
<br />
<br />
<br />
===UEFI Konfiguration aus Windows===<br />
<br />
Um an der UEFI Bootkonfiguration von Windows aus heranzugehen kann es nicht schaden, sich erst einmal ein wenig über das Bootkonzept von Windows zu informieren. Ein wenig Wissen darüber wird sich schnell auszahlen, wenn man mit diesen Erkenntnissen anschließend nicht versuchten muss tagelang mit den falschen Tools gewünschte Änderungen vorzunehmen.<br><br />
<br />
<br />
<br />
====die EFI-Partition====<br />
<br />
[[ESP]] ist zwar ein Windowsdateisystem, doch als solches normalerweise von Windows aus nicht sichtbar. Das Dateisystem ist versteckt. Um dennoch von Windows aus die Dateien auf diesem Dateisystem zu sichten, und gegebenen falls Änderungen dort vorzunehmen muss es erst eingehängt werden. Dazu am Besten mittels "Eingabeaufforderung(als Administrator)" ein entsprechendes Commandline Eingabefenster öffnen. Wenn denn wirklich notwendig, kann man sich hier auch noch über die im System befindlichen Platten einen Überblick verschaffen.<br><br />
Befehl: '''diskpart''' dort dann '''list disk''', verlassen mit '''exit''' (doch vorsichtig mit dem Befehl "diskpart", damit kann man auch die Platten neu partitionieren und damit mehr kaputt machen wie einem lieb ist.)<br />
<pre> <br />
ISKPART> list disk<br />
<br />
Datenträger ### Status Größe Frei Dyn GPT<br />
--------------- ------------ ------- ------- --- ---<br />
Datenträger 0 Online 64 GB 0B *<br />
<br />
DISKPART> exit<br />
</pre><br />
<br />
Das einbinden des ESB als Laufwerk ähnelt dann der Vorgehensweise des mounten in Linux<br><br />
Einhängen der ESP Partition als Laufwerk '''Z:'''<br />
<pre> mountvol z: /s </pre> <br />
Nach dem die Arbeiten dor abgeschlossen sind dann das Laufwerk '''Z:''' wieder aushängen<br />
<pre> mountvol z: /d </pre><br />
Wenn das Laufwerk '''Z:''' eingehängt ist, kann man entsprechen mit dem Dateibrowser oder mittels DOS Kommandos sich dort ganz normal arbeiten, um zB Dateien anzulegen, zu löschen, umzubenennen, verschieben usw. Hier ein kleines Beispiellog das dieses verdeutlicht.<br />
<pre><br />
C:\WINDOWS\system32>mountvol Z: /s<br />
<br />
C:\WINDOWS\system32>Z:<br />
<br />
Z:\>dir<br />
Volume in Laufwerk Z: hat keine Bezeichnung.<br />
Volumeseriennummer: 4250-0537<br />
<br />
Verzeichnis von Z:\<br />
<br />
21.03.2015 01:14 <DIR> EFI<br />
16.09.2015 16:54 12.193 NvVars<br />
20.03.2015 02:51 <DIR> KEY<br />
20.03.2015 02:52 <DIR> tools<br />
10.09.2015 23:13 8.969 log.txt<br />
2 Datei(en), 21.162 Bytes<br />
3 Verzeichnis(se), 67.798.016 Bytes frei<br />
<br />
<br />
Z:\>cd efi\opensuse<br />
<br />
Z:\EFI\opensuse>dir<br />
Volume in Laufwerk Z: hat keine Bezeichnung.<br />
Volumeseriennummer: 4250-0537<br />
<br />
Verzeichnis von Z:\EFI\opensuse<br />
<br />
21.03.2015 01:14 <DIR> .<br />
21.03.2015 01:14 <DIR> ..<br />
06.05.2015 21:14 1.380.424 shim.efi<br />
06.05.2015 21:14 1.257.800 MokManager.efi<br />
06.05.2015 21:14 887.416 grub.efi<br />
06.05.2015 21:14 125 grub.cfg<br />
21.03.2015 01:19 121.344 grubx64.efi<br />
06.05.2015 21:14 1.380.424 myshim.efi<br />
6 Datei(en), 5.027.533 Bytes<br />
2 Verzeichnis(se), 67.798.016 Bytes frei<br />
<br />
Z:\EFI\opensuse>c:<br />
<br />
C:\Windows\System32>mountvol Z: /d<br />
<br />
C:\Windows\System32>Z:<br />
Das System kann das angegebene Laufwerk nicht finden.<br />
</pre><br />
Damit sollte es jetzt zB auch möglich sein, sich einen Linuxbootloader oder eine EFI-Shell von Windows aus auf die ESP zu kopieren, oder um nachzuschauen ob die betreffende Datei oder Verzeichnis dort überhaupt vorhanden ist. So etwas kann zB schon helfen bei einem weit verbreiteten in der UEFI-FW, die auf einer Reihe von Systemboards zu finden ist. Es wird nicht die im EFI konfigurierte Bootreihenfolge zu booten herangezogen, sonder immer nur der Default Bootloader "\EFI\boot\bootx64.efi" zum Booten verwendet. Wenn man dort seinen "Shim" oder "Grub2" als "bootx64.efi" für einen funktionierenden Multiboot abgelegt hat, wird diese Datei bei jedem größerem Windowsupdate mit dem Bootmanager von Windows überschrieben. Das hat dann zur Folge, das dann nur noch Windows startet und default nicht mehr Grub2 gestartet. Mit ein paar wenigen DOS Kommandos könnte von Windows aus ziemlich einfach "Shim.efi" oder "Grubx64.efi" wieder als "bootx64.efi" dort hin kopieren.<br />
<br />
<br />
<br />
====BCD====<br />
<br />
Das aktuelle Bootsystem von Windows basiert auf [https://de.wikipedia.org/wiki/Boot_Configuration_Data BCD] und wird seit Windows Vista benutzt.<br />
Als es entwickelt wurde war an eine allumfassende Einführung von EFI oder UEFI noch nicht zu denken. Dieser Umstand führt wahrscheinlich dazu, dass wenn man sich heute mit den Boardmitteln der Bootkonfiguration von Windows und deren Doku beschäftigt, man eventuell schnell feststellen wird, UEFI ist da irgendwo nachträglich davor geklemmt und in der eigentlichen Windows Bootkonfiguration auch nur teilweise konfigurierbar.<br />
Das Tool das hierfür für die Konfiguration zuständig ist ist "bcdedit"<br />
<br />
<br />
=====bcdedit===== <br />
<br />
'''bcdedit''' ist das Commandlinetool für die komplette Bootkonfiguration von Windows. Das Tool ist sehr mächtig und die vorhandene Dokumentation obwohl sehr umfangreich ist irgendwo zwischen schaurig und extrem schwer verständlich. Im Vorfeld der Entstehung der UEFI Artikel in diesem Wiki wurde sich ausführlich mit diesem Tool und seinen Möglichkeiten in Bezug auf die UEFI Boot Konfiguration beschäftigt. Dieses Tool ist hauptsächlich und einzig und allein für die Windowsbootkonfiguration bestimmt, dafür ist es entwickelt und dort ist es durchaus hilfreich. Für die Konfiguration der reinen UEFI-Bootkonfiguration ist es nur sehr bedingt brauchbar. Windows geht in seiner Philosophie im Bootprozess davon aus, dass die Welt nur aus Windows besteht, und der Bootprozess von Windows hat ähnliche Aufgaben und Konfigurationsmöglichkeiten die auch "grub2" und zT. auch "systemd" im Linuxbootprozess haben. All diese sind mittels "bcdedit" konfigurierbar. Zum Teil sind die Kommandos hier nicht leicht zu erstellen, da oftmals hier die [https://de.wikipedia.org/wiki/Globally_Unique_Identifier GUID] oder schlecht dokumentierte vordefinierte Bezeichner verwendet werden müssen. UEFI spielt dabei nur am Rande eine Art Neben Rolle. Es sind einige Möglichkeiten vorhanden auch die UEFI-Bootkonfiguration zu ändern und anzupassen, aber Hauptaufgabe ist das nicht, das sollte uns bewusst sein.<br><br />
<br />
Ein paar wenige Befehle die in einer Multibootkonfiguration Windows/Linux hin und wieder mal benötigt werden sollen hier vorgestellt werden, aber tiefer wollen wir hier nicht einsteigen. Voraussetzung auch hier, es werden ebenfalls Administrator Rechte benötigt.<br />
<br />
Das Sichern des kompletten BCD-Store, also der gesamten Bootkonfiguration die Windows derzeit kennt. Dieses sollten wir zB vor dem Installieren von Linux als das 2. Betriebssystem ausführen, und auch danach mit einem anderem Datei Namen, wenn die Bootkonfiguration dann für Multiboot sauber funktioniert. Mit einer solchen Sicherung ist es dann möglich im Bedarfsfall die ursprüngliche Bootkonfiguration gezielt wieder herzustellen. <br />
<br />
<pre>bcdedit /export "C:\Data\sysdefault.uefi"</pre><br />
Ein zurückholen einer solchen Sicherung dann analog<br />
<pre>bcdedit /import "C:\Data\sysdefault.uefi"</pre><br />
<br />
Geeignet ist bcdedit auch zum auslesen der aktuellen Konfiguration, einschließlich der UEFI-Bootkonfiguration. Dieses könnte zB hilfreich sein um es bei gravierenden Problemen in Foren zu posten, macht aber nur Sinn wenn auch die Auflistung der Dateinamen der Linux-Bootloader aus der EFI-Partition mit dazu geliefert wird.<br />
<br />
<pre><br />
C:\WINDOWS\system32>bcdedit /enum all<br />
<br />
Start-Manager für Firmware<br />
--------------------------<br />
Bezeichner {fwbootmgr}<br />
displayorder {94e4b67b-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{bootmgr}<br />
{94e4b67a-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b67e-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b67c-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{0a50b585-ce9d-11e4-ab31-00163e1c698d}<br />
{2ce453f3-06c3-11e5-b220-806e6f6e6963}<br />
{2ce453f4-06c3-11e5-b220-806e6f6e6963}<br />
timeout 0<br />
<br />
Windows-Start-Manager<br />
---------------------<br />
Bezeichner {bootmgr}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\Microsoft\Boot\bootmgfw.efi<br />
description Windows Boot Manager<br />
locale de-DE<br />
inherit {globalsettings}<br />
default {default}<br />
resumeobject {94e4b691-ce8b-11e4-9e2b-b59e390c8fcd}<br />
displayorder {current}<br />
toolsdisplayorder {memdiag}<br />
timeout 30<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {0a50b585-ce9d-11e4-ab31-00163e1c698d}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\opensuse\shim.efi<br />
description EFI Floppy<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {2ce453f3-06c3-11e5-b220-806e6f6e6963}<br />
description EFI Floppy 1<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {2ce453f4-06c3-11e5-b220-806e6f6e6963}<br />
description EFI Hard Drive<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {4198755e-0700-11e5-b690-806e6f6e6963}<br />
description EFI Floppy<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {4198755f-0700-11e5-b690-806e6f6e6963}<br />
description EFI Floppy 1<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\opensuse\grubx64.efi<br />
description Grub2 (kein Secureboot)<br />
<br />
...... <br />
</pre> <br />
Die Ausgabe hier ist gekürzt, dort unten können noch jede Menge Windowseinträge (oftmals Duplikate) kommen, insbesondere wenn das Windowssystem schon mehrfach Upgrade hinter sich hat, sind dort eventuell viele OS-Loader, Recovery- und Hiperfil- Einträge. Diese sind für eine Multibootkonfiguration mit Linux meist nicht von Belang. Im UEFI Umfeld sind folgende Bereiche von Bedeutung.<br />
<br />
* '''Start-Manager für Firmware''' : hier befindet sich die UEFI-Startreihenfolge, allerdings sind die meisten Einträge nur mit der GUID dort angegeben.<br />
* '''Windows-Start-Manager''' : dieses ist '''{bootmgr}''', das ist der Windows Boot Manager<br />
* '''Firmwareanwendung (101fffff)''': dieses sind alle anderen (also außer dem "Windows-Boot-Manager") '''Bootxxxx''' Variablen die in der '''BootOrder''' stehen.<br />
<br />
Damit ließe sich also in der Kombination der GUIDs die aktuellen UEFI-Bootloader Variablen auslesen. Zu beachten hier, die UEFI-Bootloader von Linux und alle anderen vom UEFI selbst angelegte sind als Firmwareanwendung zu erkennen. Windows akzeptiert wird diese nicht als OS_loader oder Bootmanager führen.<br />
<br />
Auf Befehle die hier aktiv eingreifen und etwas ändern, möchten wir ausdrücklich verzichten und auch dringend davor warnen hier etwas mit '''bcdedit''' im UEFI-Umfeld zu machen, (obwohl das eine oder andere durchaus möglich ist). Besser dieses mit einem Grafischen Tool unter Windows machen. Dafür gibt es einige.<br />
<br />
<br />
<br />
=====Links zur Doku von BCD und bcdedit=====<br />
<br />
* [https://msdn.microsoft.com/en-us/library/windows/hardware/ff542268%28v=vs.85%29.aspx Boot Options Windows Doku]<br />
<br />
* [http://www.uefi.org/sites/default/files/resources/UEFI-Plugfest-WindowsBootEnvironment.pdf Übersicht über den Windows Bootprozess]<br />
* [http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/windows-nt-6-boot-process.html Bootprozess Dokumentation]<br />
<br />
* [http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/BCDedit_reff.docx BCDedit Referenz Manual]<br />
* [http://diddy.boot-land.net/bcdedit/files/commands.htm BCD Kommando Referenz]<br />
* [https://technet.microsoft.com/en-us/library/cc731662.aspx bcdedit Schnellübersicht]<br />
<br />
<br />
<br />
=====Grafische Tools zur Windows Bootkonfiguration=====<br />
<br />
[[Datei:VisualBCD-0.png|200px|thumb|left|VisualBCD GUI zur Bearbeitung der WindowsBootkonfiguration]]<br />
Beispielgebend soll hier [http://www.boyans.net/ Visual BCD Editor] vorgestellt werden, Ein (aber keinesfalls der Einzige) GUI-Editor für das Bearbeiten der BCD Daten. Dieses Tool kann wahrscheinlich alles was man mit bcdedit auch machen könnte. Auffällig hier, in der Gruppe '''Loaders''' sind die OS-Loader,(also die Loader die im Windowsbootmanager alle auswählbar sind) mit den Firmwareloadern (also die UEFI-Bootvariablen) gemischt.<br />
Hiermit hätte der NormalUser zu mindestens eine gute Chance das eine oder andere an der Bootkonfiguration "richtig" zu korregieren. Aber auch hier sei gewarnt, dieses ist nur ein Frontend für BCD und BCD hat nicht wirklich die richtigen Mittel und Methoden um die UEFI-Variablen alle zielgerecht zu bearbeiten. Zum Beispiel wird man feststellen, es lassen sich keine Firmwareanwendungen(101fffff) erzeugen. (also keine Bootxxxx Variablen) und die die existieren lassen sich nicht wirklich ändern. Auch hier die Warnung, das ist für die Windowsbootkonfiguration und nicht in erster Linie für die UEFI-Bootkonfiguration, (auch wenn natürlich hier einiges möglich ist)<br />
<br />
<br />
<br />
====UEFI Bootvariable bearbeiten====<br />
<br />
[[Datei:EasyUEFI-0.png|200px|thumb|left|EasyUEFI GUI zum Konfigurieren der UEFI Bootvariablen]]<br />
Nach dem wir feststellen durften, dass mit der normalen Bootkonfiguration von Windows die UEFI-Variablen nicht wirklich gut bis gar nicht zu ändern sind, hier jetzt ein Beispiel wie dieses unter Windows erledigt werden kann. Nach einem Commandline Tool haben wir gar nicht erst gesucht, sondern gleich nach einer GUI und wurden fündig mit [http://www.easyuefi.com/index-us.html EasyUEFI].<br><br />
Mit dieser GUI ist es auch für einen Linuxuser ohne Windowskenntnisse möglich unter Windows relativ unkompliziert Bootvariablen neu anzulegen, zu sortieren und überflüssige zu deaktivieren oder zu löschen. Es ist möglich eine Bootvariable für den nächsten Bootvorgang festzulegen und einiges mehr. Auch ist es möglich hier gleich aus der GUI den Rechner zu rebooten. <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==LINKS==<br />
<br />
* sehr guter [https://forums.opensuse.org/showthread.php/487837-How-to-Dual-boot-%28preinstalled%29-Windows-8-and-Linux-UEFI-etc umfassender Beitrag] über das Einrichten von Windows8 Linux Dualboot</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Datei:VisualBCD-0.png&diff=32658Datei:VisualBCD-0.png2015-09-19T00:07:52Z<p>Robi: VisualBCD eine Windows-GUI zur Konfiguration des WindowBootsystems (eigener Screenshot)</p>
<hr />
<div>VisualBCD eine Windows-GUI zur Konfiguration des WindowBootsystems (eigener Screenshot)</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Datei:EasyUEFI-0.png&diff=32657Datei:EasyUEFI-0.png2015-09-19T00:04:04Z<p>Robi: EasyUEFI ein Windowsprogramm zur Bearbeitung der UEFI Bootvariablen. (eigener Screenshot)</p>
<hr />
<div>EasyUEFI ein Windowsprogramm zur Bearbeitung der UEFI Bootvariablen. (eigener Screenshot)</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=UEFI_Boot_Konfiguration&diff=32656UEFI Boot Konfiguration2015-09-18T23:59:00Z<p>Robi: Konfiguration aus Windows</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
{{UnderConstruction}}<br />
<br />
==UEFI Boot Konfiguration==<br />
<br />
===UEFI Variablen allgemein===<br />
<br />
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.<br><br />
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.<br />
<br />
Beispiel, Ausgabe einer UEFI Variable aus der [[EFI-Shell]]: <br />
<pre><br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8<br />
00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.*<br />
00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...*<br />
00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................*<br />
00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y*<br />
00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.*<br />
00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.*<br />
00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.*<br />
00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......*<br />
00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.*<br />
00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.*<br />
000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.*<br />
000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*<br />
</pre><br />
<br />
* '''NV+RT+BS''' entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS" <br><br />
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden<br />
<br />
* '''8BE4DF61-93CA-11D2-AA0D-00E098032B8C''' diese ist eine EFI-GUID und bedeutet in diesem Fall <br><br />
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.<br />
<br />
* '''Boot000A''' dieses ist der Name der Variable <br />
<br />
* '''DataSize = 0xB8''' dieses ist die hexadezimale Längenangabe für die Daten der Variable<br />
<br />
* der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "'''hexdump -C''' " in Linux liefern würde.<br />
<br />
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit [http://de.wikipedia.org/wiki/UTF-16 UTF-16] abgelegt sind.<br />
<br />
In diesem Fall handelst es sich um den Booteintrag (Label) "'''neuerkern'''" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "'''\EFI\opensuse\bzImage.efi'''" mit den Optionen "'''initrd=\efi\opensuse\initrd'''" starten soll.<br><br />
<br />
<br />
<br />
===UEFI Boot Variablen===<br />
<br />
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.<br />
<br />
<br />
====Bootxxxx====<br />
<br />
'''xxxx''' ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen '''Boot0001''' von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit '''Boot0000'''.<br><br />
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix "'''.efi'''". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.<br />
<br />
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.<br />
<br />
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:<br />
<pre><br />
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
</pre><br />
<br />
<br />
<br />
====BootOrder====<br />
<br />
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem '''xxxx''' aus den '''Bootxxxx''' Variablen entsprechen.<br />
<br />
BootOrder: 0004,0001,0002,0000,0003<br />
<br />
Hier im Beispiel wird die Bootvariable '''Boot0004''' die erste sein mit deren Hilfe UEFI versucht das System zu booten.<br />
<br />
<br />
====weitere Bootvariablen====<br />
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.<br />
<br />
* '''BootCurrent''' : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs<br />
* '''BootNext''' : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.<br />
* '''Timeout''' : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis '''BootOrder''' oder '''BootNext''' verwendet wird um einen Bootloader zu starten<br />
* '''SecureBoot''' zeigt an ob derzeit bzw. für den nächsten Reboot [[Secure Boot]] aktiv ist.<br />
* und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden <br />
<br />
<br />
<br />
<br />
<br />
===Bootkonfiguration aus dem Setup Menü===<br />
<br />
<!-- hier brauchen wir evtl. ein paar Bilder, da sich das wahrscheinlich auf jedem Rechner etwas anders darstellt.--><br />
<br />
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der [[ESP]] einen Bootloader '''\EFI\boot\bootx64.efi''' dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen. <br />
<br />
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte. <br><br />
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.<br />
<br />
<!--Müssen wir etwas allgemein abhandeln und mit Beispielbildern unterlegen--><br />
[[Datei:UEFI-CustomMode.jpg|200px|thumb|left|Umschalten Standard Mode / Custom Mode]]<br />
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot) <br><br />
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.<br />
* SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen<br />
* CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem [[MBR]] nach der legacy Methode<br />
* und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll. <br />
* eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei [[Secure Boot#Secure Boot verstehen|Secureboot]] hier im Wiki . <br />
<br />
<br />
<br />
<br />
<br />
===Konfiguration aus Linux===<br />
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool [[efibootmgr]] gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool '''efibootmgr''' wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.<br />
<br />
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration. <br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM<br />
Boot0001* EFI DVD/CDROM 1<br />
Boot0002* EFI Floppy<br />
Boot0003* EFI Floppy 1<br />
Boot0004* EFI Hard Drive<br />
Boot0005* Shim boot<br />
Boot0006* EFI Internal Shell<br />
Boot0007* opensuse<br />
Boot0008* opensuse-secureboot<br />
Boot0009* kernel<br />
Boot000A* neuerkern<br />
Boot000B* grublegacy<br />
Boot000C* SUSE Linux Enterprise<br />
Boot000D* rEFInd Boot Manager<br />
Boot000E* Linux Boot Manager<br />
Boot000F* grub1 boot<br />
Boot0010* EFI Network<br />
Boot0011* EFI Network 1<br />
Boot0012* EFI Network 2<br />
</pre><br />
<br />
zusätzlich die Option "'''-v'''" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.<br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0)<br />
Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0)<br />
Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0)<br />
Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1)<br />
Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)<br />
Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0006* EFI Internal Shell MM(b,900000,10fffff)<br />
Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\<br />
.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d...<br />
Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.<br />
r.d...<br />
Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi)<br />
Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi)<br />
Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi)<br />
Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi)<br />
Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)<br />
Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0<br />
Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000<br />
00000000000000000000000000000<br />
</pre><br />
<br />
Hilfe bekommt man mit der Option "'''-h'''" oder auch über die [http://linux.die.net/man/8/efibootmgr Manpage]<br />
<pre> <br />
usage: efibootmgr [options]<br />
-a | --active sets bootnum active<br />
-A | --inactive sets bootnum inactive<br />
-b | --bootnum XXXX modify BootXXXX (hex)<br />
-B | --delete-bootnum delete bootnum (hex)<br />
-c | --create create new variable bootnum and add to bootorder<br />
-d | --disk disk (defaults to /dev/sda) containing loader<br />
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess<br />
-E | --device num EDD 1.0 device number (defaults to 0x80)<br />
-g | --gpt force disk with invalid PMBR to be treated as GPT<br />
-H | --acpi_hid XXXX set the ACPI HID (used with -i)<br />
-i | --iface name create a netboot entry for the named interface<br />
-l | --loader name (defaults to \elilo.efi)<br />
-L | --label label Boot manager display label (defaults to "Linux")<br />
-n | --bootnext XXXX set BootNext to XXXX (hex)<br />
-N | --delete-bootnext delete BootNext<br />
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)<br />
-O | --delete-bootorder delete BootOrder<br />
-p | --part part (defaults to 1) containing loader<br />
-q | --quiet be quiet<br />
| --test filename don't write to NVRAM, write to filename.<br />
-t | --timeout seconds set boot manager timeout waiting for user input.<br />
-T | --delete-timeout delete Timeout.<br />
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)<br />
-U | --acpi_uid XXXX set the ACPI UID (used with -i)<br />
-v | --verbose print additional information<br />
-V | --version return version and exit<br />
-w | --write-signature write unique sig to MBR if needed<br />
-@ | --append-binary-args file append extra args from file (use "-" for stdin)<br />
</pre><br />
einfache Beispiele:<br />
efibootmgr -n 5 <br />
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable '''Boot0005''' (in diesem Beispiel "shim boot") durchgeführt wird.<br />
<br />
efibootmgr -o 5,6,9,0<br />
würde die '''Bootorder''' dauerhaft umstellen auf "'''0005,0006,0009,0000'''"<br />
<br />
efibootmgr -b 3 -B<br />
würde den Eintrag '''Boot0003''' löschen und wenn vorhanden aus der '''Bootorder''' entfernen<br />
<br />
<br />
etwas schwieriger ist das anlegen eines neuen Eintrages<br><br />
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen<br />
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi<br />
<br />
* '''-c''' - neu anlegen<br />
* '''-d''' - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet<br />
* '''-p 1''' - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default) <br />
* '''-L''' - der Name des Booteintrages<br />
* '''-l''' - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.<br />
<br />
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.<br />
<br />
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem [[ESP]] direkt von UEFI gestartet wird.<br />
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd<br />
<br />
* '''-u''' - setzt hier [http://de.wikipedia.org/wiki/UTF-16 UNICODE] Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE<br />
<br />
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.<br />
<br />
<br />
<br />
===Konfiguration aus der EFI-SHELL===<br />
<br />
Die Konfiguration der Bootvariablen mittels der [[EFI-Shell]] ist sicherlich für den Normaluser die allerletzte Möglichkeit die überhaupt in Betracht gezogen werden sollte. Dazu ist auch hier die Hindernislatte ziemlich hoch gehängt und wahrscheinlich muss da vorher auch eine ganze Menge an Fehlern und Ungereimtheiten passieren, bevor dieses einmal notwendig werden würde und die EFI-Shell als der einzige noch gangbare Weg übrig bleibt.<br />
<br />
Zuerst müsste der User wahrscheinlich eine EFI-Shell Version 2.x downloaden, die dann auch noch auf seinem Rechner funktioniert. Dann müsste er diese Shell irgendwohin abspeichern, dass sie mittels UEFI-Setup oder Default-Booteinträge gestartet werden kann. Und nicht zuletzt, müsste der User auch noch einige Grundkenntnisse über die EFI-Shell mitbringen oder zu mindestens schonmal einiges darüber gelesen haben, damit er diese überhaupt einigermaßen bedienen kann. In diesem Beitrag werden wir auf die meisten Grundlagen der EFI-Shell nicht eingehen, sondern uns nur um die reine Bootkonfigurationsmöglichkeiten beschränken.<br><br />
<br />
Prinzipiell einmal auf der EFI-Shell angekommen, ist es ein leichtes von dort aus einen der hoffentlich noch vorhanden Bootloader zu starten und damit wieder ein Betriebssystem zu haben von dem man dann mit einfacheren Mitteln die Bootkonfiguration wieder richten könnte. <br />
<br />
Darauf gehen wir hier aber nicht ein, wir wollen uns gezielt auf der EFI-Shell anschauen wie die Bootkonfiguration dort aussieht und wie wir sie dort ändern könnten. Wir würden für einige der weiteren Befehle hier eine EFI-Shell Version 2.x benötigen, diese ist üblicherweise Weise erst ab UEFI-2.3.1 lauffähig.<br />
<br />
Die Bootvariablen anschauen geht mit dem Befehl "'''dumpstore'''"<br />
<br />
<pre>Shell> dmpstore Boot*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0002' DataSize = 0xA2<br />
00000000: 01 00 00 00 7A 00 47 00-72 00 75 00 62 00 20 00 *....z.G.r.u.b. .*<br />
00000010: 53 00 65 00 63 00 75 00-72 00 65 00 20 00 42 00 *S.e.c.u.r.e. .B.*<br />
00000020: 6F 00 6F 00 74 00 00 00-02 01 0C 00 D0 41 03 0A *o.o.t........A..*<br />
00000030: 00 00 00 00 01 01 06 00-01 01 03 01 08 00 00 01 *................*<br />
00000040: 00 00 04 01 2A 00 02 00-00 00 00 68 09 00 00 00 *....*......h....*<br />
00000050: 00 00 00 18 03 00 00 00-00 00 0A 22 3A 66 4E 5B *...........":fN[*<br />
00000060: 4D 47 83 2F A9 69 D8 33-4C B4 02 02 04 04 32 00 *MG./.i.3L.....2.*<br />
00000070: 5C 00 45 00 46 00 49 00-5C 00 6F 00 70 00 65 00 *\.E.F.I.\.o.p.e.*<br />
00000080: 6E 00 73 00 75 00 73 00-65 00 5C 00 73 00 68 00 *n.s.u.s.e.\.s.h.*<br />
00000090: 69 00 6D 00 2E 00 65 00-66 00 69 00 00 00 7F FF *i.m...e.f.i.....*<br />
000000A0: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000C' DataSize = 0x42<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 20 00 31 00 00 00 *l.o.p.p.y. .1...*<br />
00000020: 02 01 0C 00 D0 41 03 0A-00 00 00 00 01 01 06 00 *.....A..........*<br />
00000030: 00 01 02 01 0C 00 D0 41-04 06 01 00 00 00 7F FF *.......A........*<br />
00000040: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000B' DataSize = 0x3E<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 00 00 02 01 0C 00 *l.o.p.p.y.......*<br />
00000020: D0 41 03 0A 00 00 00 00-01 01 06 00 00 01 02 01 *.A..............*<br />
00000030: 0C 00 D0 41 04 06 00 00-00 00 7F FF 04 00 *...A..........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0x12C<br />
00000000: 01 00 00 00 74 00 57 00-69 00 6E 00 64 00 6F 00 *....t.W.i.n.d.o.*<br />
00000010: 77 00 73 00 20 00 42 00-6F 00 6F 00 74 00 20 00 *w.s. .B.o.o.t. .*<br />
00000020: 4D 00 61 00 6E 00 61 00-67 00 65 00 72 00 00 00 *M.a.n.a.g.e.r...*<br />
00000030: 04 01 2A 00 02 00 00 00-00 68 09 00 00 00 00 00 *..*......h......*<br />
00000040: 00 18 03 00 00 00 00 00-0A 22 3A 66 4E 5B 4D 47 *.........":fN[MG*<br />
00000050: 83 2F A9 69 D8 33 4C B4-02 02 04 04 46 00 5C 00 *./.i.3L.....F.\.*<br />
00000060: 45 00 46 00 49 00 5C 00-4D 00 69 00 63 00 72 00 *E.F.I.\.M.i.c.r.*<br />
00000070: 6F 00 73 00 6F 00 66 00-74 00 5C 00 42 00 6F 00 *o.s.o.f.t.\.B.o.*<br />
00000080: 6F 00 74 00 5C 00 62 00-6F 00 6F 00 74 00 6D 00 *o.t.\.b.o.o.t.m.*<br />
00000090: 67 00 66 00 77 00 2E 00-65 00 66 00 69 00 00 00 *g.f.w...e.f.i...*<br />
000000A0: 7F FF 04 00 57 49 4E 44-4F 57 53 00 01 00 00 00 *....WINDOWS.....*<br />
000000B0: 88 00 00 00 78 00 00 00-42 00 43 00 44 00 4F 00 *....x...B.C.D.O.* <br />
000000C0: 42 00 4A 00 45 00 43 00-54 00 3D 00 7B 00 39 00 *B.J.E.C.T.=...9.* <br />
000000D0: 64 00 65 00 61 00 38 00-36 00 32 00 63 00 2D 00 *d.e.a.8.6.2.c.-.* <br />
000000E0: 35 00 63 00 64 00 64 00-2D 00 34 00 65 00 37 00 *5.c.d.d.-.4.e.7.* <br />
000000F0: 30 00 2D 00 61 00 63 00-63 00 31 00 2D 00 66 00 *0.-.a.c.c.1.-.f.* <br />
00000100: 33 00 32 00 62 00 33 00-34 00 34 00 64 00 34 00 *3.2.b.3.4.4.d.4.* <br />
00000110: 37 00 39 00 35 00 7D 00-00 00 00 00 01 00 00 00 *7.9.5...........* <br />
00000120: 10 00 00 00 04 00 00 00-7F FF 04 00 *............* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0001' DataSize = 0x44 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 20 00 31 00 00 00 02 01-0C 00 D0 41 03 0A 00 00 * .1........A....* <br />
00000030: 00 00 01 01 06 00 01 01-03 01 08 00 00 00 00 00 *................* <br />
00000040: 7F FF 04 00 *....* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0004' DataSize = 0x40 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 00 00 02 01 0C 00 D0 41-03 0A 00 00 00 00 01 01 *.......A........* <br />
00000030: 06 00 01 01 03 01 08 00-01 00 00 00 7F FF 04 00 *................* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0000' DataSize = 0x42 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 48 00 *......E.F.I. .H.* <br />
00000010: 61 00 72 00 64 00 20 00-44 00 72 00 69 00 76 00 *a.r.d. .D.r.i.v.* <br />
00000020: 65 00 00 00 02 01 0C 00-D0 41 03 0A 00 00 00 00 *e........A......* <br />
00000030: 01 01 06 00 01 01 03 01-08 00 00 01 00 00 7F FF *................* <br />
00000040: 04 00 *..* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0005' DataSize = 0x5C <br />
00000000: 01 00 00 00 30 00 45 00-46 00 49 00 20 00 49 00 *....0.E.F.I. .I.*<br />
00000010: 6E 00 74 00 65 00 72 00-6E 00 61 00 6C 00 20 00 *n.t.e.r.n.a.l. .*<br />
00000020: 53 00 68 00 65 00 6C 00-6C 00 00 00 01 03 18 00 *S.h.e.l.l.......*<br />
00000030: 0B 00 00 00 00 00 90 00-00 00 00 00 FF FF 0F 01 *................*<br />
00000040: 00 00 00 00 04 06 14 00-83 A5 04 7C 3E 9E 1C 4F *............>..O*<br />
00000050: AD 65 E0 52 68 D0 B4 D1-7F FF 04 00 *.e.Rh.......*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent' DataSize = 0x02<br />
00000000: 05 00 *..*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOptionSupport' DataSize = 0x04<br />
00000000: 03 03 00 00 *....*</pre><br />
zu sehen hier die komplette Ausgabe der mit "'''Boot'''" beginnenden NVRAM Variablen im RAW-Format. Die Bootvariablen. '''Bootxxxx''' sind die Booteinträge in der die Konfiguration der einzelnen Bootloader hinterlegt ist. (Dieses können durchaus auch mal mehr sein, als in der Bootreihenfolge berücksichtigt ist, und die einzelnen Hexadezimal-Nummern müssen nicht aufeinander folgend sein. UEFI verwaltet diese Variablen selbst, und vergibt auch die Nummern selbständig)<br><br />
In der Efi Variable '''BootOrder''' ist die Reihenfolge hinterlegt.<br />
<pre>Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*</pre><br />
Weitere NVRAM Variablen die hier angezeigt werden sind zB. '''BootCurrent BootNext''' ....<br />
<br />
<br />
<br />
die eigentliche Bootkonfiguration und die aktuelle Reihenfolge sehen wir mit <br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 01. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N</pre><br />
Wir sehen hier bei Optionen die Startreihenfolge von 0 bis 3 (hinter Option) und dahinter die entsprechenden Bootvariable auf die dabei zugegriffen wird. Darunter wird dann jeweils noch ausgegeben der Name der für diese Bootoption gewählt wurde, und der Devicepath aus der Bootvariablen, der auf einen Bootloader oder eine andere UEFI-Applikation zeigen sollte. Die Ausgabe hier ist ein Kombination aus der '''BootOrder''' und den '''Bootxxxx''' Variablen und entspricht auch der Reihenfolge die im Bootmenü des UEFI-Setups angezeigt wird. <br />
<br />
Soweit die Bootxxxx Variablen noch vorhanden sind und auch entsprechend auf die richtigen Bootloader Dateien verweisen, reicht es eventuell aus nur die Bootreihenfolge zu ändern, damit das System wieder booten kann.<br />
<br />
<pre>Shell> bcfg boot mv 1 0</pre><br />
vertauscht in unserem Fall den 2.Eintrag, (shim) und setzt ihn an erste Stelle, also vor Windows, Dieses sollten wir selbstverständlich anschließend auch kontrollieren.<br />
<br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
</pre> <br />
<br />
<br />
Mit dem Löschen eines Booteintrages hier sollten wir sehr sehr vorsichtig sein, (bei den Tests hierzu wurde zwar die Bootvariable gelöscht, aber nicht aus der BootOrder entfernt, was dann dazu geführt hatte das die Bootreihenfolge nur noch bis zu der Stelle angezeigt werden konnte, an der sich der gelöschte Booteintrag befunden hatte. Anschließend wurde dann ein Fehler ausgegeben, dass dieser Booteintrag nicht gefunden werden konnte) Am besten wenn ein Booteintrag gar nicht funktioniert, dann hier nur ganz an das Ende der Liste verschieben, dort stört es nicht und erst später vom Betriebssystem aus diesen Eintrag dann löschen.<br />
<br />
Löschen eines Eintrages mit der EFI-Shell würde hier wie folgt funktionieren (zB eine hier nicht vorhandenen) Bootoption 06 löschen <br />
<pre>Shell> bcfg boot rm 6</pre><br />
<br />
Bei unseren Tests ist mit diesem Löschen dann der oben beschriebene Fehler aufgetreten. Die Bootreihenfolge wurde dann nachträglich mittels der '''BootOrder''' Variable selbst wieder korrigiert, ( auch hier Warnung, am besten die Finger davon lassen.)<br />
<br />
Beispiel:<br />
<pre>Shell> dmpstore BootOrder<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00-</pre><br />
und auch setvar <br />
<pre>Shell> 8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 05 00 01 00 </pre><br />
zeigen uns die Reihenfolge 02 0A 05 01 (wobei die Hexdumpwerte hierbei Hexwerte der Boot'''xxxx''' Variablen bedeutet),<br><br />
wir verändern diese jetzt auf 02 0A 01 05<br />
<pre>Shell> setvar BootOrder =02000A0001000500</pre><br />
und erhalten danach<br />
<pre>Shell> setvar BootOrder<br />
8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 01 00 05 00</pre> <br />
und auch "bcfg boot dump" sollte jetzt und die geänderte Boot-Reihenfolge anzeigen.<br />
<br />
<br />
Einzelne nicht mehr benötigte Bootvariablen könnte wir auch mit "setvar" Löschen, (Auch hier die Warnung, am Besten die Finger davon lassen)<br />
<br />
<pre>Shell> setvar Boot0012 =</pre><br />
würde die Variabel "Boot0012" löschen.<br />
<br />
<br />
<br />
<br />
Wenn wir jetzt hier gar keinen brauchbaren Booteintrag finden der sich zum Booten eignet würde und den wir an erste Stelle schieben könnten, oder sonst warum ein neuen Booteintrag anlegen wollen, geht auch dieses mit "bcfg". Dazu wechseln wir zuerst einmal in das Dateisystem in dem sich Bootloader befindet, den wir konfigurieren wollen. <br />
<br />
<pre>Shell> f0:<br />
FS0:\> </pre><br />
dort dann mittels "'''cd'''" und "'''ls'''" dann das Dateisystem untersuchen, bis wir den Bootloader sehen, den wir als Booteintrag anlegen möchten. Den Path bis zu dieser Datei benötigen wir ebenfalls, und wir sollten uns derzeit in mit der EFI-Shell auf diesem Dateisystem befinden.<br />
<br />
<pre>FS0:\> ls \efi\opensuse\<br />
Directory of: FS1:\efi\opensuse\<br />
03/21/2015 01:14 <DIR> 1,024 .<br />
03/21/2015 01:14 <DIR> 1,024 ..<br />
05/06/2015 21:14 1,380,424 shim.efi<br />
05/06/2015 21:14 1,257,800 MokManager.efi<br />
05/06/2015 21:14 887,416 grub.efi<br />
05/06/2015 21:14 125 grub.cfg<br />
03/21/2015 01:19 121,344 grubx64.efi<br />
5 File(s) 3,647,109 bytes<br />
2 Dir(s)</pre><br />
Zu erkennen dort '''grubx64.efi''', dieses ist der normale Grub2 Bootloader, der bei ausgeschalteten [[Secure Boot]] starten sollte. Diesen tragen wir jetzt hier als weiteren Bootloader unten (als Option 04) in der Liste ein. Der Name dieser Bootoption so sein, "Grub2 (kein Secureboot)"<br />
<br />
<pre>FS0:\> bcfg boot add 4 \efi\opensuse\grubx64.efi "Grub2 (kein Secureboot)"</pre><br />
wir sehen dabei auch eine Erfolgsmeldung, in diesem Fall wurde '''Boot0000''' erzeugt und wie beabsichtigt an die letzte Stelle (04) gesetzt (welche Bootxxxx Variable dabei angelegt wird, darauf haben wir hier keinen Einfluss. Bei genauer Betrachtung der Logausgaben hier würde man sogar erkennen, hier wurde die Boot0000 Variable (oben bei dmpstore noch zu sehen als Bootoption "EFI HardDriv") überschrieben, diese Variable war zwar angelegt und auch Korrekt, aber keiner der Werte in "BootOrder" hat darauf verwiesen.)<br />
<br />
Ergebnis:<br />
<pre>FS0:\> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 03. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 04. Variable: Boot0000 <br />
Desc - Grub2 (kein Secureboot)<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
</pre><br />
<br />
Damit wollen wir unsere kleine Exkursion in die EFI-Shell auch schon wieder beenden, Verlassen mit "'''exit'''" oder mit "'''reset'''" .<br><br />
<br />
'''Nochmal zur Warnung:''' Die EFI-Shell ist nicht unbedingt für Otto-den-Normal-User gedacht. Ziel sollte es im Bedarfsfall maximal sein, hier einen funktionierenden Bootloader im Dateisystem zu finden und zu starten, maximal noch die Bootreihenfolge ändern und gegebenenfalls auch wenn notwendig mal einen neuen Booteintrag anzulegen. Man kann in der EFI-Shell durchaus auch die Unterstützung von Geräten im UEFI unterbinden oder anderweitig das Booten komplett abschalten wenn man hier leichtsinnig irgendwelche Dinge umbiegt oder löscht, das Ding ist sehr mächtig, aber auch sehr gewöhnungsbedürftig. Also sicherheitshalber ist hier Weniger oftmals Mehr.<br />
<br />
===UEFI Konfiguration aus Windows===<br />
<br />
Um an der UEFI Bootkonfiguration von Windows aus heranzugehen kann es nicht schaden, sich erst einmal ein wenig über das Bootkonzept von Windows zu informieren. Ein wenig Wissen darüber wird sich schnell auszahlen, wenn man mit diesen Erkenntnissen anschließend nicht versuchten muss tagelang mit den falschen Tools gewünschte Änderungen vorzunehmen.<br><br />
<br />
<br />
<br />
====die EFI-Partition====<br />
<br />
[[ESP]] ist zwar ein Windowsdateisystem, doch als solches normalerweise von Windows aus nicht sichtbar. Das Dateisystem ist versteckt. Um dennoch von Windows aus die Dateien auf diesem Dateisystem zu sichten, und gegebenen falls Änderungen dort vorzunehmen muss es erst eingehängt werden. Dazu am Besten mittels "Eingabeaufforderung(als Administrator)" ein entsprechendes Commandline Eingabefenster öffnen. Wenn denn wirklich notwendig, kann man sich hier auch noch über die im System befindlichen Platten einen Überblick verschaffen.<br><br />
Befehl: '''diskpart''' dort dann '''list disk''', verlassen mit '''exit''' (doch vorsichtig mit dem Befehl "diskpart", damit kann man auch die Platten neu partitionieren und damit mehr kaputt machen wie einem lieb ist.)<br />
<pre> <br />
ISKPART> list disk<br />
<br />
Datenträger ### Status Größe Frei Dyn GPT<br />
--------------- ------------ ------- ------- --- ---<br />
Datenträger 0 Online 64 GB 0B *<br />
<br />
DISKPART> exit<br />
</pre><br />
<br />
Das einbinden des ESB als Laufwerk ähnelt dann der Vorgehensweise des mounten in Linux<pre><br />
Einhängen der ESP Partition als Laufwerk '''Z:'''<br />
<pre> mountvol z: /s </pre> <br />
Nach dem die Arbeiten dor abgeschlossen sind dann das Laufwerk '''Z:''' wieder aushängen<br />
<pre> mountvol z: /d </pre><br />
Wenn das Laufwerk '''Z:''' eingehängt ist, kann man entsprechen mit dem Dateibrowser oder mittels DOS Kommandos sich dort ganz normal arbeiten, um zB Dateien anzulegen, zu löschen, umzubenennen, verschieben usw. Hier ein kleines Beispiellog das dieses verdeutlicht.<br />
<pre><br />
C:\WINDOWS\system32>mountvol Z: /s<br />
<br />
C:\WINDOWS\system32>Z:<br />
<br />
Z:\>dir<br />
Volume in Laufwerk Z: hat keine Bezeichnung.<br />
Volumeseriennummer: 4250-0537<br />
<br />
Verzeichnis von Z:\<br />
<br />
21.03.2015 01:14 <DIR> EFI<br />
16.09.2015 16:54 12.193 NvVars<br />
20.03.2015 02:51 <DIR> KEY<br />
20.03.2015 02:52 <DIR> tools<br />
10.09.2015 23:13 8.969 log.txt<br />
2 Datei(en), 21.162 Bytes<br />
3 Verzeichnis(se), 67.798.016 Bytes frei<br />
<br />
<br />
Z:\>cd efi\opensuse<br />
<br />
Z:\EFI\opensuse>dir<br />
Volume in Laufwerk Z: hat keine Bezeichnung.<br />
Volumeseriennummer: 4250-0537<br />
<br />
Verzeichnis von Z:\EFI\opensuse<br />
<br />
21.03.2015 01:14 <DIR> .<br />
21.03.2015 01:14 <DIR> ..<br />
06.05.2015 21:14 1.380.424 shim.efi<br />
06.05.2015 21:14 1.257.800 MokManager.efi<br />
06.05.2015 21:14 887.416 grub.efi<br />
06.05.2015 21:14 125 grub.cfg<br />
21.03.2015 01:19 121.344 grubx64.efi<br />
06.05.2015 21:14 1.380.424 myshim.efi<br />
6 Datei(en), 5.027.533 Bytes<br />
2 Verzeichnis(se), 67.798.016 Bytes frei<br />
<br />
Z:\EFI\opensuse>c:<br />
<br />
C:\Windows\System32>mountvol Z: /d<br />
<br />
C:\Windows\System32>Z:<br />
Das System kann das angegebene Laufwerk nicht finden.<br />
</pre><br />
Damit sollte es jetzt zB auch möglich sein, sich einen Linuxbootloader oder eine EFI-Shell von Windows aus auf die ESP zu kopieren, oder um nachzuschauen ob die betreffende Datei oder Verzeichnis dort überhaupt vorhanden ist. So etwas kann zB schon helfen bei einem weit verbreiteten in der UEFI-FW, die auf einer Reihe von Systemboards zu finden ist. Es wird nicht die im EFI konfigurierte Bootreihenfolge zu booten herangezogen, sonder immer nur der Default Bootloader "\EFI\boot\bootx64.efi" zum Booten verwendet. Wenn man dort seinen "Shim" oder "Grub2" als "bootx64.efi" für einen funktionierenden Multiboot abgelegt hat, wird diese Datei bei jedem größerem Windowsupdate mit dem Bootmanager von Windows überschrieben. Das hat dann zur Folge, das dann nur noch Windows startet und default nicht mehr Grub2 gestartet. Mit ein paar wenigen DOS Kommandos könnte von Windows aus ziemlich einfach "Shim.efi" oder "Grubx64.efi" wieder als "bootx64.efi" dort hin kopieren.<br />
<br />
<br />
<br />
====BCD====<br />
<br />
Das aktuelle Bootsystem von Windows basiert auf [https://de.wikipedia.org/wiki/Boot_Configuration_Data BCD] und wird seit Windows Vista benutzt.<br />
Als es entwickelt wurde war an eine allumfassende Einführung von EFI oder UEFI noch nicht zu denken. Dieser Umstand führt wahrscheinlich dazu, dass wenn man sich heute mit den Boardmitteln der Bootkonfiguration von Windows und deren Doku beschäftigt, man eventuell schnell feststellen wird, UEFI ist da irgendwo nachträglich davor geklemmt und in der eigentlichen Windows Bootkonfiguration auch nur teilweise konfigurierbar.<br />
Das Tool das hierfür für die Konfiguration zuständig ist ist "bcdedit"<br />
<br />
<br />
=====bcdedit===== <br />
<br />
'''bcdedit''' ist das Commandlinetool für die komplette Bootkonfiguration von Windows. Das Tool ist sehr mächtig und die vorhandene Dokumentation obwohl sehr umfangreich ist irgendwo zwischen schaurig und extrem schwer verständlich. Im Vorfeld der Entstehung der UEFI Artikel in diesem Wiki wurde sich ausführlich mit diesem Tool und seinen Möglichkeiten in Bezug auf die UEFI Boot Konfiguration beschäftigt. Dieses Tool ist hauptsächlich und einzig und allein für die Windowsbootkonfiguration bestimmt, dafür ist es entwickelt und dort ist es durchaus hilfreich. Für die Konfiguration der reinen UEFI-Bootkonfiguration ist es nur sehr bedingt brauchbar. Windows geht in seiner Philosophie im Bootprozess davon aus, dass die Welt nur aus Windows besteht, und der Bootprozess von Windows hat ähnliche Aufgaben und Konfigurationsmöglichkeiten die auch "grub2" und zT. auch "systemd" im Linuxbootprozess haben. All diese sind mittels "bcdedit" konfigurierbar. Zum Teil sind die Kommandos hier nicht leicht zu erstellen, da oftmals hier die [https://de.wikipedia.org/wiki/Globally_Unique_Identifier GUID] oder schlecht dokumentierte vordefinierte Bezeichner verwendet werden müssen. UEFI spielt dabei nur am Rande eine Art Neben Rolle. Es sind einige Möglichkeiten vorhanden auch die UEFI-Bootkonfiguration zu ändern und anzupassen, aber Hauptaufgabe ist das nicht, das sollte uns bewusst sein.<br><br />
<br />
Ein paar wenige Befehle die in einer Multibootkonfiguration Windows/Linux hin und wieder mal benötigt werden sollen hier vorgestellt werden, aber tiefer wollen wir hier nicht einsteigen. Voraussetzung auch hier, es werden ebenfalls Administrator Rechte benötigt.<br />
<br />
Das Sichern des kompletten BCD-Store, also der gesamten Bootkonfiguration die Windows derzeit kennt. Dieses sollten wir zB vor dem Installieren von Linux als das 2. Betriebssystem ausführen, und auch danach mit einem anderem Datei Namen, wenn die Bootkonfiguration dann für Multiboot sauber funktioniert. Mit einer solchen Sicherung ist es dann möglich im Bedarfsfall die ursprüngliche Bootkonfiguration gezielt wieder herzustellen. <br />
<br />
<pre>bcdedit /export "C:\Data\sysdefault.uefi"</pre><br />
Ein zurückholen einer solchen Sicherung dann analog<br />
<pre>bcdedit /import "C:\Data\sysdefault.uefi"</pre><br />
<br />
Geeignet ist bcdedit auch zum auslesen der aktuellen Konfiguration, einschließlich der UEFI-Bootkonfiguration. Dieses könnte zB hilfreich sein um es bei gravierenden Problemen in Foren zu posten, macht aber nur Sinn wenn auch die Auflistung der Dateinamen der Linux-Bootloader aus der EFI-Partition mit dazu geliefert wird.<br />
<br />
<pre><br />
C:\WINDOWS\system32>bcdedit /enum all<br />
<br />
Start-Manager für Firmware<br />
--------------------------<br />
Bezeichner {fwbootmgr}<br />
displayorder {94e4b67b-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{bootmgr}<br />
{94e4b67a-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b67e-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{94e4b67c-ce8b-11e4-9e2b-b59e390c8fcd}<br />
{0a50b585-ce9d-11e4-ab31-00163e1c698d}<br />
{2ce453f3-06c3-11e5-b220-806e6f6e6963}<br />
{2ce453f4-06c3-11e5-b220-806e6f6e6963}<br />
timeout 0<br />
<br />
Windows-Start-Manager<br />
---------------------<br />
Bezeichner {bootmgr}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\Microsoft\Boot\bootmgfw.efi<br />
description Windows Boot Manager<br />
locale de-DE<br />
inherit {globalsettings}<br />
default {default}<br />
resumeobject {94e4b691-ce8b-11e4-9e2b-b59e390c8fcd}<br />
displayorder {current}<br />
toolsdisplayorder {memdiag}<br />
timeout 30<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {0a50b585-ce9d-11e4-ab31-00163e1c698d}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\opensuse\shim.efi<br />
description EFI Floppy<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {2ce453f3-06c3-11e5-b220-806e6f6e6963}<br />
description EFI Floppy 1<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {2ce453f4-06c3-11e5-b220-806e6f6e6963}<br />
description EFI Hard Drive<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {4198755e-0700-11e5-b690-806e6f6e6963}<br />
description EFI Floppy<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {4198755f-0700-11e5-b690-806e6f6e6963}<br />
description EFI Floppy 1<br />
<br />
Firmwareanwendung (101fffff)<br />
----------------------------<br />
Bezeichner {94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}<br />
device partition=\Device\HarddiskVolume2<br />
path \EFI\opensuse\grubx64.efi<br />
description Grub2 (kein Secureboot)<br />
<br />
...... <br />
</pre> <br />
Die Ausgabe hier ist gekürzt, dort unten können noch jede Menge Windowseinträge (oftmals Duplikate) kommen, insbesondere wenn das Windowssystem schon mehrfach Upgrade hinter sich hat, sind dort eventuell viele OS-Loader, Recovery- und Hiperfil- Einträge. Diese sind für eine Multibootkonfiguration mit Linux meist nicht von Belang. Im UEFI Umfeld sind folgende Bereiche von Bedeutung.<br />
<br />
* '''Start-Manager für Firmware''' : hier befindet sich die UEFI-Startreihenfolge, allerdings sind die meisten Einträge nur mit der GUID dort angegeben.<br />
* '''Windows-Start-Manager''' : dieses ist '''{bootmgr}''', das ist der Windows Boot Manager<br />
* '''Firmwareanwendung (101fffff)''': dieses sind alle anderen (also außer dem "Windows-Boot-Manager") '''Bootxxxx''' Variablen die in der '''BootOrder''' stehen.<br />
<br />
Damit ließe sich also in der Kombination der GUIDs die aktuellen UEFI-Bootloader Variablen auslesen. Zu beachten hier, die UEFI-Bootloader von Linux und alle anderen vom UEFI selbst angelegte sind als Firmwareanwendung zu erkennen. Windows akzeptiert wird diese nicht als OS_loader oder Bootmanager führen.<br />
<br />
Auf Befehle die hier aktiv eingreifen und etwas ändern, möchten wir ausdrücklich verzichten und auch dringend davor warnen hier etwas mit '''bcdedit''' im UEFI-Umfeld zu machen, (obwohl das eine oder andere durchaus möglich ist). Besser dieses mit einem Grafischen Tool unter Windows machen. Dafür gibt es einige.<br />
<br />
<br />
<br />
=====Links zur Doku von BCD und bcdedit=====<br />
<br />
* [https://msdn.microsoft.com/en-us/library/windows/hardware/ff542268%28v=vs.85%29.aspx Boot Options Windows Doku]<br />
<br />
* [http://www.uefi.org/sites/default/files/resources/UEFI-Plugfest-WindowsBootEnvironment.pdf Übersicht über den Windows Bootprozess]<br />
* [http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/windows-nt-6-boot-process.html Bootprozess Dokumentation]<br />
<br />
* [http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/BCDedit_reff.docx BCDedit Referenz Manual]<br />
* [http://diddy.boot-land.net/bcdedit/files/commands.htm BCD Kommando Referenz]<br />
* [https://technet.microsoft.com/en-us/library/cc731662.aspx bcdedit Schnellübersicht]<br />
<br />
<br />
<br />
=====Grafische Tools zur Windows Bootkonfiguration=====<br />
<br />
Beispielgebend soll hier [http://www.boyans.net/ Visual BCD Editor] vorgestellt werden, Ein (aber keinesfalls der Einzige) GUI-Editor für das Bearbeiten der BCD Daten. Dieses Tool kann wahrscheinlich alles was man mit bcdedit auch machen könnte. Auffällig hier, in der Gruppe '''Loaders''' sind die OS-Loader,(also die Loader die im Windowsbootmanager alle auswählbar sind) mit den Firmwareloadern (also die UEFI-Bootvariablen) gemischt.<br />
Hiermit hätte der NormalUser zu mindestens eine gute Chance das eine oder andere an der Bootkonfiguration "richtig" zu korregieren. Aber auch hier sei gewarnt, dieses ist nur ein Frontend für BCD und BCD hat nicht wirklich die richtigen Mittel und Methoden um die UEFI-Variablen alle zielgerecht zu bearbeiten. Zum Beispiel wird man feststellen, es lassen sich keine Firmwareanwendungen(101fffff) erzeugen. (also keine Bootxxxx Variablen) und die die existieren lassen sich nicht wirklich ändern. Auch hier die Warnung, das ist für die Windowsbootkonfiguration und nicht in erster Linie für die UEFI-Bootkonfiguration, (auch wenn natürlich hier einiges möglich ist)<br />
<br />
<br />
<br />
====UEFI Bootvariable bearbeiten====<br />
<br />
Nach dem wir feststellen durften, dass mit der normalen Bootkonfiguration von Windows die UEFI-Variablen nicht wirklich gut bis gar nicht zu ändern sind, hier jetzt ein Beispiel wie dieses unter Windows erledigt werden kann. Nach einem Commandline Tool haben wir gar nicht erst gesucht, sondern gleich nach einer GUI und wurden fündig mit [http://www.easyuefi.com/index-us.html EasyUEFI].<br><br />
Mit dieser GUI ist es auch für einen Linuxuser ohne Windowskenntnisse möglich unter Windows relativ unkompliziert Bootvariablen neu anzulegen, zu sortieren und überflüssige zu deaktivieren oder zu löschen. Es ist möglich eine Bootvariable für den nächsten boot festzulegen und mehr. Auch ist es möglich hier gleich aus der GUI den Rechner zu rebooten. <br />
<br />
<br />
<br />
==LINKS==<br />
<br />
* sehr guter [https://forums.opensuse.org/showthread.php/487837-How-to-Dual-boot-%28preinstalled%29-Windows-8-and-Linux-UEFI-etc umfassender Beitrag] über das Einrichten von Windows8 Linux Dualboot</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=UEFI_Boot_Konfiguration&diff=32280UEFI Boot Konfiguration2015-09-13T20:38:12Z<p>Robi: Überarbeitung</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
{{UnderConstruction}}<br />
<br />
==UEFI Boot Konfiguration==<br />
<br />
===UEFI Variablen allgemein===<br />
<br />
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.<br><br />
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.<br />
<br />
Beispiel, Ausgabe einer UEFI Variable aus der [[EFI-Shell]]: <br />
<pre><br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8<br />
00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.*<br />
00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...*<br />
00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................*<br />
00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y*<br />
00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.*<br />
00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.*<br />
00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.*<br />
00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......*<br />
00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.*<br />
00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.*<br />
000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.*<br />
000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*<br />
</pre><br />
<br />
* '''NV+RT+BS''' entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS" <br><br />
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden<br />
<br />
* '''8BE4DF61-93CA-11D2-AA0D-00E098032B8C''' diese ist eine EFI-GUID und bedeutet in diesem Fall <br><br />
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.<br />
<br />
* '''Boot000A''' dieses ist der Name der Variable <br />
<br />
* '''DataSize = 0xB8''' dieses ist die hexadezimale Längenangabe für die Daten der Variable<br />
<br />
* der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "'''hexdump -C''' " in Linux liefern würde.<br />
<br />
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit [http://de.wikipedia.org/wiki/UTF-16 UTF-16] abgelegt sind.<br />
<br />
In diesem Fall handelst es sich um den Booteintrag (Label) "'''neuerkern'''" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "'''\EFI\opensuse\bzImage.efi'''" mit den Optionen "'''initrd=\efi\opensuse\initrd'''" starten soll.<br><br />
<br />
<br />
<br />
===UEFI Boot Variablen===<br />
<br />
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.<br />
<br />
<br />
====Bootxxxx====<br />
<br />
'''xxxx''' ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen '''Boot0001''' von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit '''Boot0000'''.<br><br />
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix "'''.efi'''". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.<br />
<br />
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.<br />
<br />
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:<br />
<pre><br />
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
</pre><br />
<br />
<br />
<br />
====BootOrder====<br />
<br />
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem '''xxxx''' aus den '''Bootxxxx''' Variablen entsprechen.<br />
<br />
BootOrder: 0004,0001,0002,0000,0003<br />
<br />
Hier im Beispiel wird die Bootvariable '''Boot0004''' die erste sein mit deren Hilfe UEFI versucht das System zu booten.<br />
<br />
<br />
====weitere Bootvariablen====<br />
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.<br />
<br />
* '''BootCurrent''' : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs<br />
* '''BootNext''' : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.<br />
* '''Timeout''' : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis '''BootOrder''' oder '''BootNext''' verwendet wird um einen Bootloader zu starten<br />
* '''SecureBoot''' zeigt an ob derzeit bzw. für den nächsten Reboot [[Secure Boot]] aktiv ist.<br />
* und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden <br />
<br />
<br />
<br />
<br />
<br />
===Bootkonfiguration aus dem Setup Menü===<br />
<br />
<!-- hier brauchen wir evtl. ein paar Bilder, da sich das wahrscheinlich auf jedem Rechner etwas anders darstellt.--><br />
<br />
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der [[ESP]] einen Bootloader '''\EFI\boot\bootx64.efi''' dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen. <br />
<br />
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte. <br><br />
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.<br />
<br />
<!--Müssen wir etwas allgemein abhandeln und mit Beispielbildern unterlegen--><br />
[[Datei:UEFI-CustomMode.jpg|200px|thumb|left|Umschalten Standard Mode / Custom Mode]]<br />
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot) <br><br />
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.<br />
* SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen<br />
* CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem [[MBR]] nach der legacy Methode<br />
* und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll. <br />
* eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei [[Secure Boot#Secure Boot verstehen|Secureboot]] hier im Wiki . <br />
<br />
<br />
<br />
<br />
<br />
===Konfiguration aus Linux===<br />
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool [[efibootmgr]] gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool '''efibootmgr''' wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.<br />
<br />
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration. <br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM<br />
Boot0001* EFI DVD/CDROM 1<br />
Boot0002* EFI Floppy<br />
Boot0003* EFI Floppy 1<br />
Boot0004* EFI Hard Drive<br />
Boot0005* Shim boot<br />
Boot0006* EFI Internal Shell<br />
Boot0007* opensuse<br />
Boot0008* opensuse-secureboot<br />
Boot0009* kernel<br />
Boot000A* neuerkern<br />
Boot000B* grublegacy<br />
Boot000C* SUSE Linux Enterprise<br />
Boot000D* rEFInd Boot Manager<br />
Boot000E* Linux Boot Manager<br />
Boot000F* grub1 boot<br />
Boot0010* EFI Network<br />
Boot0011* EFI Network 1<br />
Boot0012* EFI Network 2<br />
</pre><br />
<br />
zusätzlich die Option "'''-v'''" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.<br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0)<br />
Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0)<br />
Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0)<br />
Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1)<br />
Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)<br />
Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0006* EFI Internal Shell MM(b,900000,10fffff)<br />
Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\<br />
.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d...<br />
Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.<br />
r.d...<br />
Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi)<br />
Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi)<br />
Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi)<br />
Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi)<br />
Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)<br />
Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0<br />
Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000<br />
00000000000000000000000000000<br />
</pre><br />
<br />
Hilfe bekommt man mit der Option "'''-h'''" oder auch über die [http://linux.die.net/man/8/efibootmgr Manpage]<br />
<pre> <br />
usage: efibootmgr [options]<br />
-a | --active sets bootnum active<br />
-A | --inactive sets bootnum inactive<br />
-b | --bootnum XXXX modify BootXXXX (hex)<br />
-B | --delete-bootnum delete bootnum (hex)<br />
-c | --create create new variable bootnum and add to bootorder<br />
-d | --disk disk (defaults to /dev/sda) containing loader<br />
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess<br />
-E | --device num EDD 1.0 device number (defaults to 0x80)<br />
-g | --gpt force disk with invalid PMBR to be treated as GPT<br />
-H | --acpi_hid XXXX set the ACPI HID (used with -i)<br />
-i | --iface name create a netboot entry for the named interface<br />
-l | --loader name (defaults to \elilo.efi)<br />
-L | --label label Boot manager display label (defaults to "Linux")<br />
-n | --bootnext XXXX set BootNext to XXXX (hex)<br />
-N | --delete-bootnext delete BootNext<br />
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)<br />
-O | --delete-bootorder delete BootOrder<br />
-p | --part part (defaults to 1) containing loader<br />
-q | --quiet be quiet<br />
| --test filename don't write to NVRAM, write to filename.<br />
-t | --timeout seconds set boot manager timeout waiting for user input.<br />
-T | --delete-timeout delete Timeout.<br />
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)<br />
-U | --acpi_uid XXXX set the ACPI UID (used with -i)<br />
-v | --verbose print additional information<br />
-V | --version return version and exit<br />
-w | --write-signature write unique sig to MBR if needed<br />
-@ | --append-binary-args file append extra args from file (use "-" for stdin)<br />
</pre><br />
einfache Beispiele:<br />
efibootmgr -n 5 <br />
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable '''Boot0005''' (in diesem Beispiel "shim boot") durchgeführt wird.<br />
<br />
efibootmgr -o 5,6,9,0<br />
würde die '''Bootorder''' dauerhaft umstellen auf "'''0005,0006,0009,0000'''"<br />
<br />
efibootmgr -b 3 -B<br />
würde den Eintrag '''Boot0003''' löschen und wenn vorhanden aus der '''Bootorder''' entfernen<br />
<br />
<br />
etwas schwieriger ist das anlegen eines neuen Eintrages<br><br />
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen<br />
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi<br />
<br />
* '''-c''' - neu anlegen<br />
* '''-d''' - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet<br />
* '''-p 1''' - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default) <br />
* '''-L''' - der Name des Booteintrages<br />
* '''-l''' - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.<br />
<br />
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.<br />
<br />
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem [[ESP]] direkt von UEFI gestartet wird.<br />
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd<br />
<br />
* '''-u''' - setzt hier [http://de.wikipedia.org/wiki/UTF-16 UNICODE] Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE<br />
<br />
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.<br />
<br />
<br />
<br />
===Konfiguration aus der EFI-SHELL===<br />
<br />
Die Konfiguration der Bootvariablen mittels der [[EFI-Shell]] ist sicherlich für den Normaluser die allerletzte Möglichkeit die überhaupt in Betracht gezogen werden sollte. Dazu ist auch hier die Hindernislatte ziemlich hoch gehängt und wahrscheinlich muss da vorher auch eine ganze Menge an Fehlern und Ungereimtheiten passieren, bevor dieses einmal notwendig werden würde und die EFI-Shell als der einzige noch gangbare Weg übrig bleibt.<br />
<br />
Zuerst müsste der User wahrscheinlich eine EFI-Shell Version 2.x downloaden, die dann auch noch auf seinem Rechner funktioniert. Dann müsste er diese Shell irgendwohin abspeichern, dass sie mittels UEFI-Setup oder Default-Booteinträge gestartet werden kann. Und nicht zuletzt, müsste der User auch noch einige Grundkenntnisse über die EFI-Shell mitbringen oder zu mindestens schonmal einiges darüber gelesen haben, damit er diese überhaupt einigermaßen bedienen kann. In diesem Beitrag werden wir auf die meisten Grundlagen der EFI-Shell nicht eingehen, sondern uns nur um die reine Bootkonfigurationsmöglichkeiten beschränken.<br><br />
<br />
Prinzipiell einmal auf der EFI-Shell angekommen, ist es ein leichtes von dort aus einen der hoffentlich noch vorhanden Bootloader zu starten und damit wieder ein Betriebssystem zu haben von dem man dann mit einfacheren Mitteln die Bootkonfiguration wieder richten könnte. <br />
<br />
Darauf gehen wir hier aber nicht ein, wir wollen uns gezielt auf der EFI-Shell anschauen wie die Bootkonfiguration dort aussieht und wie wir sie dort ändern könnten. Wir würden für einige der weiteren Befehle hier eine EFI-Shell Version 2.x benötigen, diese ist üblicherweise Weise erst ab UEFI-2.3.1 lauffähig.<br />
<br />
Die Bootvariablen anschauen geht mit dem Befehl "'''dumpstore'''"<br />
<br />
<pre>Shell> dmpstore Boot*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0002' DataSize = 0xA2<br />
00000000: 01 00 00 00 7A 00 47 00-72 00 75 00 62 00 20 00 *....z.G.r.u.b. .*<br />
00000010: 53 00 65 00 63 00 75 00-72 00 65 00 20 00 42 00 *S.e.c.u.r.e. .B.*<br />
00000020: 6F 00 6F 00 74 00 00 00-02 01 0C 00 D0 41 03 0A *o.o.t........A..*<br />
00000030: 00 00 00 00 01 01 06 00-01 01 03 01 08 00 00 01 *................*<br />
00000040: 00 00 04 01 2A 00 02 00-00 00 00 68 09 00 00 00 *....*......h....*<br />
00000050: 00 00 00 18 03 00 00 00-00 00 0A 22 3A 66 4E 5B *...........":fN[*<br />
00000060: 4D 47 83 2F A9 69 D8 33-4C B4 02 02 04 04 32 00 *MG./.i.3L.....2.*<br />
00000070: 5C 00 45 00 46 00 49 00-5C 00 6F 00 70 00 65 00 *\.E.F.I.\.o.p.e.*<br />
00000080: 6E 00 73 00 75 00 73 00-65 00 5C 00 73 00 68 00 *n.s.u.s.e.\.s.h.*<br />
00000090: 69 00 6D 00 2E 00 65 00-66 00 69 00 00 00 7F FF *i.m...e.f.i.....*<br />
000000A0: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000C' DataSize = 0x42<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 20 00 31 00 00 00 *l.o.p.p.y. .1...*<br />
00000020: 02 01 0C 00 D0 41 03 0A-00 00 00 00 01 01 06 00 *.....A..........*<br />
00000030: 00 01 02 01 0C 00 D0 41-04 06 01 00 00 00 7F FF *.......A........*<br />
00000040: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000B' DataSize = 0x3E<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 00 00 02 01 0C 00 *l.o.p.p.y.......*<br />
00000020: D0 41 03 0A 00 00 00 00-01 01 06 00 00 01 02 01 *.A..............*<br />
00000030: 0C 00 D0 41 04 06 00 00-00 00 7F FF 04 00 *...A..........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0x12C<br />
00000000: 01 00 00 00 74 00 57 00-69 00 6E 00 64 00 6F 00 *....t.W.i.n.d.o.*<br />
00000010: 77 00 73 00 20 00 42 00-6F 00 6F 00 74 00 20 00 *w.s. .B.o.o.t. .*<br />
00000020: 4D 00 61 00 6E 00 61 00-67 00 65 00 72 00 00 00 *M.a.n.a.g.e.r...*<br />
00000030: 04 01 2A 00 02 00 00 00-00 68 09 00 00 00 00 00 *..*......h......*<br />
00000040: 00 18 03 00 00 00 00 00-0A 22 3A 66 4E 5B 4D 47 *.........":fN[MG*<br />
00000050: 83 2F A9 69 D8 33 4C B4-02 02 04 04 46 00 5C 00 *./.i.3L.....F.\.*<br />
00000060: 45 00 46 00 49 00 5C 00-4D 00 69 00 63 00 72 00 *E.F.I.\.M.i.c.r.*<br />
00000070: 6F 00 73 00 6F 00 66 00-74 00 5C 00 42 00 6F 00 *o.s.o.f.t.\.B.o.*<br />
00000080: 6F 00 74 00 5C 00 62 00-6F 00 6F 00 74 00 6D 00 *o.t.\.b.o.o.t.m.*<br />
00000090: 67 00 66 00 77 00 2E 00-65 00 66 00 69 00 00 00 *g.f.w...e.f.i...*<br />
000000A0: 7F FF 04 00 57 49 4E 44-4F 57 53 00 01 00 00 00 *....WINDOWS.....*<br />
000000B0: 88 00 00 00 78 00 00 00-42 00 43 00 44 00 4F 00 *....x...B.C.D.O.* <br />
000000C0: 42 00 4A 00 45 00 43 00-54 00 3D 00 7B 00 39 00 *B.J.E.C.T.=...9.* <br />
000000D0: 64 00 65 00 61 00 38 00-36 00 32 00 63 00 2D 00 *d.e.a.8.6.2.c.-.* <br />
000000E0: 35 00 63 00 64 00 64 00-2D 00 34 00 65 00 37 00 *5.c.d.d.-.4.e.7.* <br />
000000F0: 30 00 2D 00 61 00 63 00-63 00 31 00 2D 00 66 00 *0.-.a.c.c.1.-.f.* <br />
00000100: 33 00 32 00 62 00 33 00-34 00 34 00 64 00 34 00 *3.2.b.3.4.4.d.4.* <br />
00000110: 37 00 39 00 35 00 7D 00-00 00 00 00 01 00 00 00 *7.9.5...........* <br />
00000120: 10 00 00 00 04 00 00 00-7F FF 04 00 *............* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0001' DataSize = 0x44 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 20 00 31 00 00 00 02 01-0C 00 D0 41 03 0A 00 00 * .1........A....* <br />
00000030: 00 00 01 01 06 00 01 01-03 01 08 00 00 00 00 00 *................* <br />
00000040: 7F FF 04 00 *....* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0004' DataSize = 0x40 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 00 00 02 01 0C 00 D0 41-03 0A 00 00 00 00 01 01 *.......A........* <br />
00000030: 06 00 01 01 03 01 08 00-01 00 00 00 7F FF 04 00 *................* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0000' DataSize = 0x42 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 48 00 *......E.F.I. .H.* <br />
00000010: 61 00 72 00 64 00 20 00-44 00 72 00 69 00 76 00 *a.r.d. .D.r.i.v.* <br />
00000020: 65 00 00 00 02 01 0C 00-D0 41 03 0A 00 00 00 00 *e........A......* <br />
00000030: 01 01 06 00 01 01 03 01-08 00 00 01 00 00 7F FF *................* <br />
00000040: 04 00 *..* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0005' DataSize = 0x5C <br />
00000000: 01 00 00 00 30 00 45 00-46 00 49 00 20 00 49 00 *....0.E.F.I. .I.*<br />
00000010: 6E 00 74 00 65 00 72 00-6E 00 61 00 6C 00 20 00 *n.t.e.r.n.a.l. .*<br />
00000020: 53 00 68 00 65 00 6C 00-6C 00 00 00 01 03 18 00 *S.h.e.l.l.......*<br />
00000030: 0B 00 00 00 00 00 90 00-00 00 00 00 FF FF 0F 01 *................*<br />
00000040: 00 00 00 00 04 06 14 00-83 A5 04 7C 3E 9E 1C 4F *............>..O*<br />
00000050: AD 65 E0 52 68 D0 B4 D1-7F FF 04 00 *.e.Rh.......*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent' DataSize = 0x02<br />
00000000: 05 00 *..*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOptionSupport' DataSize = 0x04<br />
00000000: 03 03 00 00 *....*</pre><br />
zu sehen hier die komplette Ausgabe der mit "'''Boot'''" beginnenden NVRAM Variablen im RAW-Format. Die Bootvariablen. '''Bootxxxx''' sind die Booteinträge in der die Konfiguration der einzelnen Bootloader hinterlegt ist. (Dieses können durchaus auch mal mehr sein, als in der Bootreihenfolge berücksichtigt ist, und die einzelnen Hexadezimal-Nummern müssen nicht aufeinander folgend sein. UEFI verwaltet diese Variablen selbst, und vergibt auch die Nummern selbständig)<br><br />
In der Efi Variable '''BootOrder''' ist die Reihenfolge hinterlegt.<br />
<pre>Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*</pre><br />
Weitere NVRAM Variablen die hier angezeigt werden sind zB. '''BootCurrent BootNext''' ....<br />
<br />
<br />
<br />
die eigentliche Bootkonfiguration und die aktuelle Reihenfolge sehen wir mit <br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 01. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N</pre><br />
Wir sehen hier bei Optionen die Startreihenfolge von 0 bis 3 (hinter Option) und dahinter die entsprechenden Bootvariable auf die dabei zugegriffen wird. Darunter wird dann jeweils noch ausgegeben der Name der für diese Bootoption gewählt wurde, und der Devicepath aus der Bootvariablen, der auf einen Bootloader oder eine andere UEFI-Applikation zeigen sollte. Die Ausgabe hier ist ein Kombination aus der '''BootOrder''' und den '''Bootxxxx''' Variablen und entspricht auch der Reihenfolge die im Bootmenü des UEFI-Setups angezeigt wird. <br />
<br />
Soweit die Bootxxxx Variablen noch vorhanden sind und auch entsprechend auf die richtigen Bootloader Dateien verweisen, reicht es eventuell aus nur die Bootreihenfolge zu ändern, damit das System wieder booten kann.<br />
<br />
<pre>Shell> bcfg boot mv 1 0</pre><br />
vertauscht in unserem Fall den 2.Eintrag, (shim) und setzt ihn an erste Stelle, also vor Windows, Dieses sollten wir selbstverständlich anschließend auch kontrollieren.<br />
<br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
</pre> <br />
<br />
<br />
Mit dem Löschen eines Booteintrages hier sollten wir sehr sehr vorsichtig sein, (bei den Tests hierzu wurde zwar die Bootvariable gelöscht, aber nicht aus der BootOrder entfernt, was dann dazu geführt hatte das die Bootreihenfolge nur noch bis zu der Stelle angezeigt werden konnte, an der sich der gelöschte Booteintrag befunden hatte. Anschließend wurde dann ein Fehler ausgegeben, dass dieser Booteintrag nicht gefunden werden konnte) Am besten wenn ein Booteintrag gar nicht funktioniert, dann hier nur ganz an das Ende der Liste verschieben, dort stört es nicht und erst später vom Betriebssystem aus diesen Eintrag dann löschen.<br />
<br />
Löschen eines Eintrages mit der EFI-Shell würde hier wie folgt funktionieren (zB eine hier nicht vorhandenen) Bootoption 06 löschen <br />
<pre>Shell> bcfg boot rm 6</pre><br />
<br />
Bei unseren Tests ist mit diesem Löschen dann der oben beschriebene Fehler aufgetreten. Die Bootreihenfolge wurde dann nachträglich mittels der '''BootOrder''' Variable selbst wieder korrigiert, ( auch hier Warnung, am besten die Finger davon lassen.)<br />
<br />
Beispiel:<br />
<pre>Shell> dmpstore BootOrder<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00-</pre><br />
und auch setvar <br />
<pre>Shell> 8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 05 00 01 00 </pre><br />
zeigen uns die Reihenfolge 02 0A 05 01 (wobei die Hexdumpwerte hierbei Hexwerte der Boot'''xxxx''' Variablen bedeutet),<br><br />
wir verändern diese jetzt auf 02 0A 01 05<br />
<pre>Shell> setvar BootOrder =02000A0001000500</pre><br />
und erhalten danach<br />
<pre>Shell> setvar BootOrder<br />
8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 01 00 05 00</pre> <br />
und auch "bcfg boot dump" sollte jetzt und die geänderte Boot-Reihenfolge anzeigen.<br />
<br />
<br />
Einzelne nicht mehr benötigte Bootvariablen könnte wir auch mit "setvar" Löschen, (Auch hier die Warnung, am Besten die Finger davon lassen)<br />
<br />
<pre>Shell> setvar Boot0012 =</pre><br />
würde die Variabel "Boot0012" löschen.<br />
<br />
<br />
<br />
<br />
Wenn wir jetzt hier gar keinen brauchbaren Booteintrag finden der sich zum Booten eignet würde und den wir an erste Stelle schieben könnten, oder sonst warum ein neuen Booteintrag anlegen wollen, geht auch dieses mit "bcfg". Dazu wechseln wir zuerst einmal in das Dateisystem in dem sich Bootloader befindet, den wir konfigurieren wollen. <br />
<br />
<pre>Shell> f0:<br />
FS0:\> </pre><br />
dort dann mittels "'''cd'''" und "'''ls'''" dann das Dateisystem untersuchen, bis wir den Bootloader sehen, den wir als Booteintrag anlegen möchten. Den Path bis zu dieser Datei benötigen wir ebenfalls, und wir sollten uns derzeit in mit der EFI-Shell auf diesem Dateisystem befinden.<br />
<br />
<pre>FS0:\> ls \efi\opensuse\<br />
Directory of: FS1:\efi\opensuse\<br />
03/21/2015 01:14 <DIR> 1,024 .<br />
03/21/2015 01:14 <DIR> 1,024 ..<br />
05/06/2015 21:14 1,380,424 shim.efi<br />
05/06/2015 21:14 1,257,800 MokManager.efi<br />
05/06/2015 21:14 887,416 grub.efi<br />
05/06/2015 21:14 125 grub.cfg<br />
03/21/2015 01:19 121,344 grubx64.efi<br />
5 File(s) 3,647,109 bytes<br />
2 Dir(s)</pre><br />
Zu erkennen dort '''grubx64.efi''', dieses ist der normale Grub2 Bootloader, der bei ausgeschalteten [[Secure Boot]] starten sollte. Diesen tragen wir jetzt hier als weiteren Bootloader unten (als Option 04) in der Liste ein. Der Name dieser Bootoption so sein, "Grub2 (kein Secureboot)"<br />
<br />
<pre>FS0:\> bcfg boot add 4 \efi\opensuse\grubx64.efi "Grub2 (kein Secureboot)"</pre><br />
wir sehen dabei auch eine Erfolgsmeldung, in diesem Fall wurde '''Boot0000''' erzeugt und wie beabsichtigt an die letzte Stelle (04) gesetzt (welche Bootxxxx Variable dabei angelegt wird, darauf haben wir hier keinen Einfluss. Bei genauer Betrachtung der Logausgaben hier würde man sogar erkennen, hier wurde die Boot0000 Variable (oben bei dmpstore noch zu sehen als Bootoption "EFI HardDriv") überschrieben, diese Variable war zwar angelegt und auch Korrekt, aber keiner der Werte in "BootOrder" hat darauf verwiesen.)<br />
<br />
Ergebnis:<br />
<pre>FS0:\> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 03. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 04. Variable: Boot0000 <br />
Desc - Grub2 (kein Secureboot)<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
</pre><br />
<br />
Damit wollen wir unsere kleine Exkursion in die EFI-Shell auch schon wieder beenden, Verlassen mit "'''exit'''" oder mit "'''reset'''" .<br><br />
<br />
'''Nochmal zur Warnung:''' Die EFI-Shell ist nicht unbedingt für Otto-den-Normal-User gedacht. Ziel sollte es im Bedarfsfall maximal sein, hier einen funktionierenden Bootloader im Dateisystem zu finden und zu starten, maximal noch die Bootreihenfolge ändern und gegebenenfalls auch wenn notwendig mal einen neuen Booteintrag anzulegen. Man kann in der EFI-Shell durchaus auch die Unterstützung von Geräten im UEFI unterbinden oder anderweitig das Booten komplett abschalten wenn man hier leichtsinnig irgendwelche Dinge umbiegt oder löscht, das Ding ist sehr mächtig, aber auch sehr gewöhnungsbedürftig. Also sicherheitshalber ist hier Weniger oftmals Mehr.<br />
<br />
===Konfiguration aus Windows===<br />
<br />
<!--<br />
https://msdn.microsoft.com/en-us/library/windows/hardware/ff542268%28v=vs.85%29.aspx<br />
<br />
--></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Grafikkarten_und_Monitore&diff=32266Grafikkarten und Monitore2015-09-13T17:51:48Z<p>Robi: "FGLRX Treiberupdate automatisieren" Link entfernt wegen Löschung Artikel</p>
<hr />
<div>== Grafikkarten ==<br />
<br />
* [[ATI]] - ATI-Grafikkarten unter Linux hier als übersichtliches Wikibook<br />
* [[NVIDIA|Das NVIDIA Grafikkarten Wikibook]]<br />
* [[Einfache_Nvidia-Installation|Kurzanleitung zur Installation des NVIDIA-Treibers mit Yast]]<br />
* [[Treiberinstallation unichrome]] <br />
* [[Hinweise zu Matrox]]<br />
* [[Intel Grafikchips]]<br />
<!--* [[Intel GMA 500 Grafikchips (Poulsbo)]]--><br />
* [[Hinweise zu SIS/XGI-Chipsätzen]]<br />
* [[Hinweise zu VIA-Chipsaetzen|Hinweise zu VIA-Chipsätzen]]<br />
<br />
== Hilfen ==<br />
<br />
* [http://en.opensuse.org/Multiple_Screens_Using_XRandR opensuse.org Wiki Dual Head]<br />
<br />
== XGL ==<br />
<br />
* [[3D Spiele/Anwendungen unter Beryl/XGL verwenden]]<br />
* [[Xgl DRI]]<br />
* [[Metisse]]<br />
<br />
== Hilfe nach Kernel-Updates und anderen Schwierigkeiten ==<br />
<br />
* [http://forum.linux-club.de/viewforum.php?f=92 Linux-Club Forum für Hardware,somit auch für Grafikkarten und Monitore]<br />
* [[Xgl DRI|Xgl DRI XGL & 3D-Spiele (DRI)]]<br />
* [[X-Server Musterkonfigurationen]]<br />
<br />
== Sonstiges ==<br />
* [[MicrosoftFonts|Unscharfe Schriften beseitigen]] - Hier wird erklärt, wie man eine unscharfe Schriftendarstellung unter Suse in den Griff bekommt.<br />
* [[Kaufberatung Grafikkarten]] - Hier werden Grafikkarten aufgelistet, die unter Linux laufen.<br />
<br />
[[Category:Grafikkarten und Monitore]][[Kategorie:Übersicht]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=GRUB_Legacy&diff=32223GRUB Legacy2015-09-13T15:22:15Z<p>Robi: Ref scheint aktuell nicht zu gehen, dann eben verlinkt</p>
<hr />
<div><br />
{{Infobox_Software|<br />
Name= GRUB<br />
|Screenshot= <br />
|Beschreibung= Grub Legacy<br />
|Hersteller= Das GRUB-Team<br />
|AktuelleVersion= 0.97<br />
|AktuelleVersionFreigabeDatum= 5/2006<br />
|Betriebssystem= Unix-Derivate, [[Linux]]<br />
|Kategorie= [[Bootmanager]]<br />
|Lizenz= [[GNU General Public License|GPL]]<br />
|Deutsch= nein<br />
|Website= http://www.gnu.org/software/grub/manual/legacy/index.html<br />
}}<br />
<br />
<br />
== Was ist GRUB Legacy ==<br />
<br />
<br />
GRUB (Grand Unified Bootloader) ist ein Boot-Manager, der heutzutage bei vielen Linux-Distributionen, wie z.B. Red Hat, [[Mandrake]] und auch [[openSUSE]] per default installiert wird.<br />
GRUB in seiner heutigen Form wird vom GNU Projekt gepflegt und weiterentwickelt. <br />
Aktuell ist [[GRUB 2]] eine komplette Neuentwicklung aus dem selben Team, aber nicht kompatibel zu [http://www.gnu.org/software/grub/manual/legacy/index.html Grub Legacy].<br />
<br />
GRUB Legacy kann verschiedene UNIX-Derivate wie [[Linux]], FreeBSD, NetBSD oder OpenBSD starten und auch das Booten von Windows ist kein Problem.<br />
<br />
<br />
<br />
<br />
== Der [[Bootvorgang]] mit GRUB (Legacy)==<br />
<br />
''Der Bootloader GRUB startet in 2 Stufen:''<br />
<br />
'''Stage1''' befindet sich entweder im Master Boot Record (MBR) der Festplatte oder im Boot-Sektor einer Partition. Die einzige Aufgabe dieser Stufe ist es, '''Stage2''' zu laden.<br />
Stage2 stellt die eigentlichen Funktionen des Bootloaders bereit. Diese befindet sich unter /boot/grub/stage2.<br />
<br />
Bei der Installation wird in der Stufe 1 festgeschrieben, an welchem physikalischen Ort sich die Stufe 2 befindet. Befindet sich /boot/grub in bestimmten Dateisystemen, dann wird eine 3. Stufe zwischen Stage1 und Stage2 benötigt, mit deren Hilfe das Dateisystem und somit die GRUB-Dateien gelesen werden können. Hier lädt stage1 die stage1_5, welche Zusatzcode für den Zugriff auf das verwendete Dateisystem enthält, und diese lädt dann stage2.<br />
<br />
Stage2 kann dann den Linux-Kernel laden und booten, oder auch andere Betriebssysteme oder andere Bootloader starten.<br />
<br />
<br />
<br />
<br />
== Festplattenbezeichnung unter GRUB ==<br />
<br />
Die Besonderheit von GRUB ist die Bezeichnung der Festplatten und Partitionen. <br />
Sie unterscheidet sich von der gewohnten Linux-Bezeichnug der Devices.<br />
<br />
hd0 = erste Festplatte<br />
hd1 = zweite Festlatte ...<br />
<br />
hd0,0 = 1. Partition der ersten Festplatte <br />
hd1,2 = 3. Partition der zweiten Festplatte ...<br />
<br />
Für UFS oder UFS2 benutzende Systeme wie Solaris oder BSD-Derivate:<br />
hd0,1,a= 1. Slice in der 2. Partition der 1. Platte<br />
<br />
Die Festplattenreihenfolge wird vom [[BIOS]] festgelegt, wobei die im BIOS festgelegte Boot-Platte immer 0x80 (hexadezimal 80, dezimal 128, bei GRUB im allgemeinen als hd0 bezeichnet) erhält und die übrigen Platten danach fortlaufend nummeriert werden.<br />
<br />
<br />
<br />
== Wichtige Konfigurationsdateien von GRUB Legacy==<br />
<br />
Die wichtigsten Konfigurations-Dateien von GRUB sind die '''/boot/grub/menu.lst''' und die '''/boot/grub/device.map'''. <br />
<br />
Die Datei '''/boot/grub/menu.lst''' ist die Menüdatei und enthält Informationen zu allen Partitionen und Betriebssystemen, welche mit GRUB gebootet werden sollen/können.<br />
'''<br />
Beispiel /boot/grub/menu.lst:'''<br />
<br />
color white/blue black/light-gray<br />
default 0<br />
timeout 8<br />
gfxmenu (hd1,1)/boot/message<br />
<br />
title Linux<br />
kernel (hd1,1)/boot/vmlinuz root=/dev/sdc2 vga=0x317 splash=silent acpi=off desktop resume=/dev/sdc1 showopts<br />
initrd (hd1,1)/boot/initrd<br />
<br />
title Windows<br />
root (hd0,0)<br />
chainloader +1<br />
<br />
title Diskette<br />
root (fd0)<br />
chainloader +1<br />
<br />
title Failsafe<br />
kernel (hd1,1)/boot/vmlinuz root=/dev/sdc2 showopts ide=nodma apm=off acpi=off vga=normal noresume nosmp noapic maxcpus=0 3<br />
initrd (hd1,1)/boot/initrd<br />
<br />
title Speichertest<br />
kernel (hd1,1)/boot/memtest.bin<br />
<br />
Wichtig für den „Anfangsgebrauch“ sind die Werte für "default" und "timeout": "timeout" gibt an, nach wie vielen Sekunden ohne Eingabe das unter "default" eingestellte Booteintrag ausgeführt werden soll.<br />
<br />
Etwas tiefere Einblick in die menu.lst bieten eine Vielzahl Von Artikeln und User Tips <ref>http://www.pro-linux.de/artikel/2/119/der-bootloader-grub.html</ref><br />
<br />
<br />
Beim Boot-Vorgang wird die Datei '''/boot/grub/device.map''' nicht verwendet, hier muss mit den Werten gelebt werden, die das BIOS gerade benutzt. Wenn im laufenden Linux-System GRUB-Aktivitäten ausgeführt werden, dient die Datei als Übersetzungtabelle zwischen GRUB- und Linux-Bezeichnung. Es ist zu beachten, dass die GRUB-Bezeichnung in diesem Fall formal nichts mit der BIOS-ID zu tun hat; um Mißverständnisse zu vermeiden, sollte daher dafür gesorgt werden, dass die Werte zusammenpassen (dazu können die Informationen aus dem als ''root'' ausgeführten Befehl<br />
hwinfo --disk | egrep "Device Files:|BIOS id:"<br />
verwendet werden). Wenn die Datei nicht vorhanden ist, wird sie bei der nächsten Ausführung des Programms ''grub'' (das sofort wieder mit "quit" verlassen werden kann) mit vermuteten Werten neu angelegt, die zwar in einfachen Fällen meist mit der jeweiligen BIOS-ID korrespondieren, dies aber nicht tun müssen.<br />
<br />
Beispiel /boot/grub/device.map:<br />
(fd0) /dev/fd0<br />
(hd0) /dev/sdc<br />
(hd1) /dev/sdd<br />
(hd2) /dev/sda<br />
(hd3) /dev/sdb<br />
<br />
<br />
<br />
Zur Konfiguration des Bootloader GRUB auf OpenSuse empfielt es sich, ein wenig in der Doku zu blättern. <ref>http://old-de.opensuse.org/SDB:Der_Bootmanager_GRUB</ref><br />
<br />
<br />
<br />
== Quellen und weiterführende Links ==<br />
<br />
* http://www.gnu.org/software/grub/manual/legacy/index.html<br />
* http://www.pl-berichte.de/t_system/grub-howto.html<br />
* http://old-de.opensuse.org/SDB:Der_Bootmanager_GRUB<br />
* http://tldp.org/HOWTO/Multiboot-with-GRUB.html<br />
* http://de.wikipedia.org/wiki/GRUB<br />
<br />
<br />
<br />
----<br />
*[[Bootmanager]]<br />
*[[GRUB]], [[GRUB 2]]<br />
<br />
[[Category:Bootmanager]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Scripte_und_Quellcodes&diff=32207Diskussion:Scripte und Quellcodes2015-09-13T09:21:48Z<p>Robi: Re</p>
<hr />
<div>Macht dieser Abschnitt eigentlich Sinn, wenn er seit gefühlten Jahrhunderten nicht genutzt wird?<br />
--[[Benutzer:Escho|Escho]] ([[Benutzer Diskussion:Escho|Diskussion]]) 19:59, 9. Jun. 2014 (CEST)<br />
<br />
: Ich nehm alles zurück. Steht ja doch was drin, wunderbar versteckt<br />
--[[Benutzer:Escho|Escho]] ([[Benutzer Diskussion:Escho|Diskussion]]) 20:03, 9. Jun. 2014 (CEST)<br />
<br />
:: Naja, man könnte die verlinkten Unterseiten ja im Grunde auch includen ;) --[[Benutzer:Tomcatmj|Tomcatmj]] ([[Benutzer Diskussion:Tomcatmj|Diskussion]]) 17:54, 11. Jun. 2014 (CEST) (mit dem Fallback-Account aktiv)<br />
------<br />
:Hallo.<br><br />
:Könnte man diese Sektionen eventuell verschmelzen? <br />
:* http://linux-club.de/wiki/opensuse/Shellscripte<br />
:Gruß,<br />
:--[[Benutzer:revealed|revealed]] ([[Benutzer Diskussion:revealed|Diskussion]]) 02:08, 13. Sept. 2015 (CEST)<br />
<br />
::Ich frage mich schon längere Zeit, ob es überhaupt richtig ist, so etwas wie Scripte hier im Wiki unterzubringen. Wäre anno 2015 für so etwas nicht eine Plattform wie beispielsweise GitHub sinnvoller? Nur so eine Idee... --[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 08:42, 13. Sep. 2015 (CEST)<br />
<br />
::: Scripte hier im Wiki macht durchaus Sinn, was soll ich mit einem 20 Zeilen Script das die nächsten 10 Jahre sowieso nicht mehr gewartet werden soll/will/braucht zwischen ein 500000 Projekten bei GitHub, das ist hier übersichtlicher und Erklärung Hilfe und Beschreibung ist hoffentlich gleich mit auf der Wikiseite.<br />
<br />
::: Diese Seite hier stammt noch aus einer Anfangszeit als hier bis zu 20 aktive User gleichzeitig wie die Wilden am Wiki gearbeitet haben. Die Seite hat durchaus ihren Sinn aber so wie sie jetzt hier steht, stiftet sie nur Verwirrung. Die Seite gehört verschoben auf eine Diskussionsseite von [[Benutzer:TomcatMJ|TomcatMJ]]. Es sind aber ein paar Links und Kategorien zu beachten die aber wiederum entweder nur im Kreis herum führen oder nur auf Tote Seiten und kaum benutzte Kategorien verweisen. Beim Durchschauen bin ich dann gleich noch auf ein paar mehr schlecht/unpassend gesetzte Verlinkungen in und auf Script-Seiten gestoßen die man sich mal alle anschauen müsste, ob sie so überhaupt noch auf aktuellen Systemen brauchbar sind, oder ob wir die als obsolet markieren müssten. Die Frage lautet, wer kümmert sich da mal darum? oder darf ich das alles ganz alleine machen? [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 11:21, 13. Sep. 2015 (CEST)</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=UEFI_Boot_Konfiguration&diff=32147UEFI Boot Konfiguration2015-09-11T00:05:32Z<p>Robi: Entwurf: Konfiguration aus der EFI-SHELL</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
{{UnderConstruction}}<br />
<br />
==UEFI Boot Konfiguration==<br />
<br />
===UEFI Variablen allgemein===<br />
<br />
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.<br><br />
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.<br />
<br />
Beispiel, Ausgabe einer UEFI Variable aus der [[EFI-Shell]]: <br />
<pre><br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8<br />
00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.*<br />
00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...*<br />
00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................*<br />
00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y*<br />
00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.*<br />
00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.*<br />
00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.*<br />
00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......*<br />
00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.*<br />
00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.*<br />
000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.*<br />
000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*<br />
</pre><br />
<br />
* '''NV+RT+BS''' entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS" <br><br />
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden<br />
<br />
* '''8BE4DF61-93CA-11D2-AA0D-00E098032B8C''' diese ist eine EFI-GUID und bedeutet in diesem Fall <br><br />
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.<br />
<br />
* '''Boot000A''' dieses ist der Name der Variable <br />
<br />
* '''DataSize = 0xB8''' dieses ist die hexadezimale Längenangabe für die Daten der Variable<br />
<br />
* der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "'''hexdump -C''' " in Linux liefern würde.<br />
<br />
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit [http://de.wikipedia.org/wiki/UTF-16 UTF-16] abgelegt sind.<br />
<br />
In diesem Fall handelst es sich um den Booteintrag (Label) "'''neuerkern'''" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "'''\EFI\opensuse\bzImage.efi'''" mit den Optionen "'''initrd=\efi\opensuse\initrd'''" starten soll.<br><br />
<br />
<br />
<br />
===UEFI Boot Variablen===<br />
<br />
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.<br />
<br />
<br />
====Bootxxxx====<br />
<br />
'''xxxx''' ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen '''Boot0001''' von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit '''Boot0000'''.<br><br />
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix "'''.efi'''". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.<br />
<br />
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.<br />
<br />
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:<br />
<pre><br />
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
</pre><br />
<br />
<br />
<br />
====BootOrder====<br />
<br />
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem '''xxxx''' aus den '''Bootxxxx''' Variablen entsprechen.<br />
<br />
BootOrder: 0004,0001,0002,0000,0003<br />
<br />
Hier im Beispiel wird die Bootvariable '''Boot0004''' die erste sein mit deren Hilfe UEFI versucht das System zu booten.<br />
<br />
<br />
====weitere Bootvariablen====<br />
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.<br />
<br />
* '''BootCurrent''' : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs<br />
* '''BootNext''' : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.<br />
* '''Timeout''' : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis '''BootOrder''' oder '''BootNext''' verwendet wird um einen Bootloader zu starten<br />
* '''SecureBoot''' zeigt an ob derzeit bzw. für den nächsten Reboot [[Secure Boot]] aktiv ist.<br />
* und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden <br />
<br />
<br />
<br />
<br />
<br />
===Bootkonfiguration aus dem Setup Menü===<br />
<br />
<!-- hier brauchen wir evtl. ein paar Bilder, da sich das wahrscheinlich auf jedem Rechner etwas anders darstellt.--><br />
<br />
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der [[ESP]] einen Bootloader '''\EFI\boot\bootx64.efi''' dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen. <br />
<br />
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte. <br><br />
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.<br />
<br />
<!--Müssen wir etwas allgemein abhandeln und mit Beispielbildern unterlegen--><br />
[[Datei:UEFI-CustomMode.jpg|200px|thumb|left|Umschalten Standard Mode / Custom Mode]]<br />
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot) <br><br />
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.<br />
* SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen<br />
* CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem [[MBR]] nach der legacy Methode<br />
* und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll. <br />
* eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei [[Secure Boot#Secure Boot verstehen|Secureboot]] hier im Wiki . <br />
<br />
<br />
<br />
<br />
<br />
===Konfiguration aus Linux===<br />
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool [[efibootmgr]] gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool '''efibootmgr''' wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.<br />
<br />
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration. <br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM<br />
Boot0001* EFI DVD/CDROM 1<br />
Boot0002* EFI Floppy<br />
Boot0003* EFI Floppy 1<br />
Boot0004* EFI Hard Drive<br />
Boot0005* Shim boot<br />
Boot0006* EFI Internal Shell<br />
Boot0007* opensuse<br />
Boot0008* opensuse-secureboot<br />
Boot0009* kernel<br />
Boot000A* neuerkern<br />
Boot000B* grublegacy<br />
Boot000C* SUSE Linux Enterprise<br />
Boot000D* rEFInd Boot Manager<br />
Boot000E* Linux Boot Manager<br />
Boot000F* grub1 boot<br />
Boot0010* EFI Network<br />
Boot0011* EFI Network 1<br />
Boot0012* EFI Network 2<br />
</pre><br />
<br />
zusätzlich die Option "'''-v'''" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.<br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0)<br />
Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0)<br />
Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0)<br />
Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1)<br />
Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)<br />
Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0006* EFI Internal Shell MM(b,900000,10fffff)<br />
Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\<br />
.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d...<br />
Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.<br />
r.d...<br />
Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi)<br />
Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi)<br />
Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi)<br />
Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi)<br />
Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)<br />
Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0<br />
Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000<br />
00000000000000000000000000000<br />
</pre><br />
<br />
Hilfe bekommt man mit der Option "'''-h'''" oder auch über die [http://linux.die.net/man/8/efibootmgr Manpage]<br />
<pre> <br />
usage: efibootmgr [options]<br />
-a | --active sets bootnum active<br />
-A | --inactive sets bootnum inactive<br />
-b | --bootnum XXXX modify BootXXXX (hex)<br />
-B | --delete-bootnum delete bootnum (hex)<br />
-c | --create create new variable bootnum and add to bootorder<br />
-d | --disk disk (defaults to /dev/sda) containing loader<br />
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess<br />
-E | --device num EDD 1.0 device number (defaults to 0x80)<br />
-g | --gpt force disk with invalid PMBR to be treated as GPT<br />
-H | --acpi_hid XXXX set the ACPI HID (used with -i)<br />
-i | --iface name create a netboot entry for the named interface<br />
-l | --loader name (defaults to \elilo.efi)<br />
-L | --label label Boot manager display label (defaults to "Linux")<br />
-n | --bootnext XXXX set BootNext to XXXX (hex)<br />
-N | --delete-bootnext delete BootNext<br />
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)<br />
-O | --delete-bootorder delete BootOrder<br />
-p | --part part (defaults to 1) containing loader<br />
-q | --quiet be quiet<br />
| --test filename don't write to NVRAM, write to filename.<br />
-t | --timeout seconds set boot manager timeout waiting for user input.<br />
-T | --delete-timeout delete Timeout.<br />
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)<br />
-U | --acpi_uid XXXX set the ACPI UID (used with -i)<br />
-v | --verbose print additional information<br />
-V | --version return version and exit<br />
-w | --write-signature write unique sig to MBR if needed<br />
-@ | --append-binary-args file append extra args from file (use "-" for stdin)<br />
</pre><br />
einfache Beispiele:<br />
efibootmgr -n 5 <br />
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable '''Boot0005''' (in diesem Beispiel "shim boot") durchgeführt wird.<br />
<br />
efibootmgr -o 5,6,9,0<br />
würde die '''Bootorder''' dauerhaft umstellen auf "'''0005,0006,0009,0000'''"<br />
<br />
efibootmgr -b 3 -B<br />
würde den Eintrag '''Boot0003''' löschen und wenn vorhanden aus der '''Bootorder''' entfernen<br />
<br />
<br />
etwas schwieriger ist das anlegen eines neuen Eintrages<br><br />
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen<br />
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi<br />
<br />
* '''-c''' - neu anlegen<br />
* '''-d''' - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet<br />
* '''-p 1''' - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default) <br />
* '''-L''' - der Name des Booteintrages<br />
* '''-l''' - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.<br />
<br />
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.<br />
<br />
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem [[ESP]] direkt von UEFI gestartet wird.<br />
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd<br />
<br />
* '''-u''' - setzt hier [http://de.wikipedia.org/wiki/UTF-16 UNICODE] Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE<br />
<br />
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.<br />
<br />
<br />
<br />
===Konfiguration aus der EFI-SHELL===<br />
<br />
Die Konfiguration der Bootvariablen mittels der [[EFI-Shell]] ist sicherlich für den Normaluser die allerletzte Möglichkeit die überhaupt in Betracht gezogen werden sollte. Dazu ist auch hier die Hindernislatte ziemlich hoch gehängt und wahrscheinlich muss da vorher auch eine ganze Menge passieren, das dieses einmal notwendig werden würde und die EFI-Shell als der einzige noch gangbare Weg übrig bleibt.<br />
<br />
Zuerst müsste der User wahrscheinlich eine EFI-Shell Version 2.x downloaden, die auch noch auf seinem Rechner läuft, dann müsste er diese Shell irgendwohin abspeichern, dass er mittels UEFI-Setup oder Default-Booteinträge diese starten kann, und dann müsste der User auch noch einige Grundkenntnisse über die EFI-Shell gelesen haben, damit er diese überhaupt einigemaßen bedienen kann. In diesem Beitrag werden wir auf die meisten Grundlagen der EFI-Shell nicht eingehen, sondern uns nur um die reine Bootkonfigurationsmöglichkeiten beschränken.<br><br />
<br />
Prinzipiell einmal auf der EFI-Shell angekommen, ist es ein leichtes von dort aus einen der hoffentlich noch vorhanden Bootloader zu starten und damit wieder ein Betriebssystem zu haben von dem man dann mit einfacheren Mitteln die Bootkonfiguration wieder richten könnte. <br />
<br />
Aber wir wollen uns das dennoch mal auf der EFI-Shell anschauen. Wir würden für einige der weiteren Befehle hier eine Version 2.x benötigen.<br />
<br />
Die Bootvariablen anschauen geht mit dem Befehl "dumpstore"<br />
<br />
<pre>Shell> dmpstore Boot*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0002' DataSize = 0xA2<br />
00000000: 01 00 00 00 7A 00 47 00-72 00 75 00 62 00 20 00 *....z.G.r.u.b. .*<br />
00000010: 53 00 65 00 63 00 75 00-72 00 65 00 20 00 42 00 *S.e.c.u.r.e. .B.*<br />
00000020: 6F 00 6F 00 74 00 00 00-02 01 0C 00 D0 41 03 0A *o.o.t........A..*<br />
00000030: 00 00 00 00 01 01 06 00-01 01 03 01 08 00 00 01 *................*<br />
00000040: 00 00 04 01 2A 00 02 00-00 00 00 68 09 00 00 00 *....*......h....*<br />
00000050: 00 00 00 18 03 00 00 00-00 00 0A 22 3A 66 4E 5B *...........":fN[*<br />
00000060: 4D 47 83 2F A9 69 D8 33-4C B4 02 02 04 04 32 00 *MG./.i.3L.....2.*<br />
00000070: 5C 00 45 00 46 00 49 00-5C 00 6F 00 70 00 65 00 *\.E.F.I.\.o.p.e.*<br />
00000080: 6E 00 73 00 75 00 73 00-65 00 5C 00 73 00 68 00 *n.s.u.s.e.\.s.h.*<br />
00000090: 69 00 6D 00 2E 00 65 00-66 00 69 00 00 00 7F FF *i.m...e.f.i.....*<br />
000000A0: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000C' DataSize = 0x42<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 20 00 31 00 00 00 *l.o.p.p.y. .1...*<br />
00000020: 02 01 0C 00 D0 41 03 0A-00 00 00 00 01 01 06 00 *.....A..........*<br />
00000030: 00 01 02 01 0C 00 D0 41-04 06 01 00 00 00 7F FF *.......A........*<br />
00000040: 04 00 *..*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000B' DataSize = 0x3E<br />
00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00 *....".E.F.I. .F.*<br />
00000010: 6C 00 6F 00 70 00 70 00-79 00 00 00 02 01 0C 00 *l.o.p.p.y.......*<br />
00000020: D0 41 03 0A 00 00 00 00-01 01 06 00 00 01 02 01 *.A..............*<br />
00000030: 0C 00 D0 41 04 06 00 00-00 00 7F FF 04 00 *...A..........*<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0x12C<br />
00000000: 01 00 00 00 74 00 57 00-69 00 6E 00 64 00 6F 00 *....t.W.i.n.d.o.*<br />
00000010: 77 00 73 00 20 00 42 00-6F 00 6F 00 74 00 20 00 *w.s. .B.o.o.t. .*<br />
00000020: 4D 00 61 00 6E 00 61 00-67 00 65 00 72 00 00 00 *M.a.n.a.g.e.r...*<br />
00000030: 04 01 2A 00 02 00 00 00-00 68 09 00 00 00 00 00 *..*......h......*<br />
00000040: 00 18 03 00 00 00 00 00-0A 22 3A 66 4E 5B 4D 47 *.........":fN[MG*<br />
00000050: 83 2F A9 69 D8 33 4C B4-02 02 04 04 46 00 5C 00 *./.i.3L.....F.\.*<br />
00000060: 45 00 46 00 49 00 5C 00-4D 00 69 00 63 00 72 00 *E.F.I.\.M.i.c.r.*<br />
00000070: 6F 00 73 00 6F 00 66 00-74 00 5C 00 42 00 6F 00 *o.s.o.f.t.\.B.o.*<br />
00000080: 6F 00 74 00 5C 00 62 00-6F 00 6F 00 74 00 6D 00 *o.t.\.b.o.o.t.m.*<br />
00000090: 67 00 66 00 77 00 2E 00-65 00 66 00 69 00 00 00 *g.f.w...e.f.i...*<br />
000000A0: 7F FF 04 00 57 49 4E 44-4F 57 53 00 01 00 00 00 *....WINDOWS.....*<br />
000000B0: 88 00 00 00 78 00 00 00-42 00 43 00 44 00 4F 00 *....x...B.C.D.O.* <br />
000000C0: 42 00 4A 00 45 00 43 00-54 00 3D 00 7B 00 39 00 *B.J.E.C.T.=...9.* <br />
000000D0: 64 00 65 00 61 00 38 00-36 00 32 00 63 00 2D 00 *d.e.a.8.6.2.c.-.* <br />
000000E0: 35 00 63 00 64 00 64 00-2D 00 34 00 65 00 37 00 *5.c.d.d.-.4.e.7.* <br />
000000F0: 30 00 2D 00 61 00 63 00-63 00 31 00 2D 00 66 00 *0.-.a.c.c.1.-.f.* <br />
00000100: 33 00 32 00 62 00 33 00-34 00 34 00 64 00 34 00 *3.2.b.3.4.4.d.4.* <br />
00000110: 37 00 39 00 35 00 7D 00-00 00 00 00 01 00 00 00 *7.9.5...........* <br />
00000120: 10 00 00 00 04 00 00 00-7F FF 04 00 *............* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0001' DataSize = 0x44 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 20 00 31 00 00 00 02 01-0C 00 D0 41 03 0A 00 00 * .1........A....* <br />
00000030: 00 00 01 01 06 00 01 01-03 01 08 00 00 00 00 00 *................* <br />
00000040: 7F FF 04 00 *....* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0004' DataSize = 0x40 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00 *......E.F.I. .D.* <br />
00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00 *V.D./.C.D.R.O.M.* <br />
00000020: 00 00 02 01 0C 00 D0 41-03 0A 00 00 00 00 01 01 *.......A........* <br />
00000030: 06 00 01 01 03 01 08 00-01 00 00 00 7F FF 04 00 *................* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0000' DataSize = 0x42 <br />
00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 48 00 *......E.F.I. .H.* <br />
00000010: 61 00 72 00 64 00 20 00-44 00 72 00 69 00 76 00 *a.r.d. .D.r.i.v.* <br />
00000020: 65 00 00 00 02 01 0C 00-D0 41 03 0A 00 00 00 00 *e........A......* <br />
00000030: 01 01 06 00 01 01 03 01-08 00 00 01 00 00 7F FF *................* <br />
00000040: 04 00 *..* <br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0005' DataSize = 0x5C <br />
00000000: 01 00 00 00 30 00 45 00-46 00 49 00 20 00 49 00 *....0.E.F.I. .I.*<br />
00000010: 6E 00 74 00 65 00 72 00-6E 00 61 00 6C 00 20 00 *n.t.e.r.n.a.l. .*<br />
00000020: 53 00 68 00 65 00 6C 00-6C 00 00 00 01 03 18 00 *S.h.e.l.l.......*<br />
00000030: 0B 00 00 00 00 00 90 00-00 00 00 00 FF FF 0F 01 *................*<br />
00000040: 00 00 00 00 04 06 14 00-83 A5 04 7C 3E 9E 1C 4F *............>..O*<br />
00000050: AD 65 E0 52 68 D0 B4 D1-7F FF 04 00 *.e.Rh.......*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent' DataSize = 0x02<br />
00000000: 05 00 *..*<br />
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOptionSupport' DataSize = 0x04<br />
00000000: 03 03 00 00 *....*</pre><br />
zu sehen hier im RAW-Format die meisten Bootvariablen. '''Bootxxxx''' als die Booteinträge in der die Konfiguration der einzelnen bootloader steht, (Dieses können durchaus mehr sein, als in der Bootreihenfolge berücksichtig ist, und die einzelnen Nummern müssen nicht aufeinanderfolgend sein. UEFI verwaltet diese Variablen selbst.) '''BootOrder''' als die Reihenfolge,<br />
<pre>Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00- *........*</pre><br />
und weitere wie '''BootCurrent BootNext''' ....<br />
<br />
<br />
<br />
die eigentliche Bootkonfiguration und die aktuelle Reihenfolge sehen wir dann aber mit <br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 01. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N</pre><br />
Wir sehen hier bei Optionen die Startreihenfolge von 0 bis 3 und dahinter die entsprechenden Bootvariablen auf die dabei zugegriffen wird. Darunter wird dann jeweils ausgegeben der Name den diese Bootoption erhalten hat, und der Devicepath aus der Bootvariablen, der auf einen Bootloader oder eine andere UEFI-Applikation zeigen sollte.<br />
<br />
Soweit die Bootxxxx Dateien noch vorhanden sind und auch auf die richtigen Bootloader verweisen reicht es eventuell aus nur die Bootreihenfolge zu ändern<br />
<br />
<pre>Shell> bcfg boot mv 1 0</pre><br />
vertauscht in unserem Fall den 2.Eintrag, (shim) und setzt ihn an erste Stelle, also vor Windows, was wir mit selbstverständlich kontrollieren sollten.<br />
<br />
<pre>Shell> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 03. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
</pre> <br />
<br />
<br />
mit dem Löschen eines Booteintrages hier sollten wir sehr sehr vorsichtig sein, (bei den Tests hierzu wurde zwar die Bootvariable gelöscht, aber nicht aus der BootOrder entfernt, was dann dazu geführt hatte das die Bootreihenfolge nur noch bis zu der Stelle angezeigt wurde, an der sich der gelöschte Booteintrag befunden hatte, dann kam ein Fehler das dieser nicht gefunden werden konnte) Am besten wenn ein Booteintrag gar nicht funktioniert, dann hier ganz ans Ende verschieben, dort stört es nicht und erst später vom Betriebssystem aus diesen Eintrag dann löschen.<br />
<br />
Löschen mit der Shell geht hier zB (eine hier nicht vorhandenen) Bootoption 06 löschen <br />
<pre>Shell> bcfg boot rm 6</pre><br />
<br />
Bei unseren Tests ist mit dem Löschen dann der oben beschriebene Fehler aufgetreten. Die Bootreihenfolge wurde dann mittels der BootOrder Variable selbst wieder korrigiert, ( auch hier Warnung, am besten die Finger davon lassen.)<br />
<br />
Beispiel:<br />
<pre>Shell> dmpstore BootOrder<br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08<br />
00000000: 0A 00 02 00 05 00 01 00-</pre><br />
und auch setvar BootOder<br />
<pre>Shell> 8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 05 00 01 00 </pre><br />
zeigen uns die Reihenfolge 02 0A 05 01 (wobei die Hexdumpwerte auf die Bootxxxx Variablen bedeuten),<br><br />
wir verändern diese jetzt auf 02 0A 01 05<br />
<pre>Shell> setvar BootOrder =02000A0001000500</pre><br />
und erhalten danach<br />
<pre>Shell> setvar BootOrder<br />
8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes<br />
02 00 0A 00 01 00 05 00</pre> <br />
und auch "bcfg boot dump" sollte und die geänderte Reihenfolge anzeigen.<br />
<br />
<br />
einzelne nicht mehr benötigte Bootvariablen könnte wir auch mit "setvar" Löschen, ( wie immer die Warnung, am Besten die Finger davon lassen)<br />
<br />
<pre>Shell> setvar Boot0012 =</pre><br />
würde die Variabel "Boot0012" löschen.<br />
<br />
<br />
<br />
<br />
Wenn wir jetzt hier gar keinen Booteintrag finden der sich zum Booten eignet und den wir an erste Stelle schieben könnten, oder sonst warum ein neuen Booteintrag anlegen wollen, geht auch dieses mit "bcfg". Dazu wechseln wir zuerst einmal in das Dateisystem <br />
<br />
<pre>Shell> f0:<br />
FS0:\> </pre><br />
dort dann mittels "cd" und "ls" vorhangeln, bis wir den Bootloader sehen, den wir als Booteintrag anlegen möchten, Den Path bis zu dieser Datei benötigen wir, und wir sollten uns in mit der EFI-Shell in diesem Dateisystem befinden.<br />
<br />
<pre>FS0:\> ls \efi\opensuse\<br />
Directory of: FS1:\efi\opensuse\<br />
03/21/2015 01:14 <DIR> 1,024 .<br />
03/21/2015 01:14 <DIR> 1,024 ..<br />
05/06/2015 21:14 1,380,424 shim.efi<br />
05/06/2015 21:14 1,257,800 MokManager.efi<br />
05/06/2015 21:14 887,416 grub.efi<br />
05/06/2015 21:14 125 grub.cfg<br />
03/21/2015 01:19 121,344 grubx64.efi<br />
5 File(s) 3,647,109 bytes<br />
2 Dir(s)</pre><br />
Zu erkennen dort grubx64.efi, das ist der normale Grub2 Bootloader, der bei ausgeschalteten [[Secure Boot]] starten sollte. Diesen tragen wir jetzt als weiteren Bootloader unten (als 04) in der Liste ein.<br />
<br />
<pre>FS0:\> bcfg boot add 4 \efi\opensuse\grubx64.efi "Grub2 (kein Secureboot)"</pre><br />
wir sehen dabei eine Erfolgsmeldung in diesem Fall wurde '''Boot0000''' erzeugt und wie beabsichtig an die letzte Stelle (04) gesetzt (welche Bootxxxx Variable dabei angelegt wird, darauf haben wir hier keinen Einfluss)<br />
<br />
Ergebnis:<br />
<pre>FS0:\> bcfg boot dump<br />
Option: 00. Variable: Boot0002 <br />
Desc - Grub Secure Boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000A <br />
Desc - Windows Boot Manager<br />
DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi<br />
Optional- N<br />
Option: 02. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 03. Variable: Boot0005 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 04. Variable: Boot0000 <br />
Desc - Grub2 (kein Secureboot)<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
</pre><br />
<br />
Damit wollen wir unsere kleine Exkursion in die EFI-Shell auch schon beenden, Verlassen mit "exit" oder mit "reset" . Nochmal zur Warung, Ziel sollte es maximal sein hier einen funktionierenden Bootloader zu finden und zu starten, maximal noch die Bootreihenfolge ändern und gegebenenfalls auch einen neuen Booteintrag anlegen. Man kann in der EFI-Shell auch durchaus mehr Schaden anrichten, das Ding ist sehr mächtig, aber auch sehr gewöhnungsbedürftig. Also sicherheitshalber ist hier weniger oftmals mehr.<br />
<br />
===Konfiguration aus Windows===<br />
<br />
<!--<br />
https://msdn.microsoft.com/en-us/library/windows/hardware/ff542268%28v=vs.85%29.aspx<br />
<br />
--></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:UEFI_Boot_Konfiguration&diff=32146Diskussion:UEFI Boot Konfiguration2015-09-07T15:52:30Z<p>Robi: re</p>
<hr />
<div>=Konfiguration aus Linux=<br />
Nur ein Hinweis zum Zwischenstand, Du bist ja noch dran: Die Beschreibung ist wie immer gut, aber wir haben speziell hierzu auch eine eigene Seite [[efibootmgr]]. Hier sollten wir abwägen, was wo dokumentiert wird und gegebenenfalls noch umverteilen. --[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 12:22, 7. Sep. 2015 (CEST)<br />
<br />
:: Ist mir bewusst, habe es deshalb nicht übermäßig ausgeschachtet. Eine Seite in der alle Möglichkeiten erst mal aufgezeigt werden, damit der User einen Überblick und ein Feingefühl bekommt, was für ihn das Richtige ist, und dann die 2. Seite mit etwas mehr Praxisnähe und Beispielen. Müssen wir nur gegenseitig intelligent miteinander verlinken, dann sollt der User das Optimalste vorfinden. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 17:52, 7. Sep. 2015 (CEST)</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Online_Passw%C3%B6rter&diff=32142Online Passwörter2015-09-06T17:36:21Z<p>Robi: link korrigiert</p>
<hr />
<div>{{Lesenswert}}<br />
<br />
Dieser Beitrag dreht sich um die vielen Passworte die wir für die unzähligen Onlinedienste benötigen.<br />
<br />
Firefox (steht aber hier nur stellvertretend für alle anderen Web-Browser) kann Benutzernamen und Kennwörter die ihr für Online-Dienste verwendet auch speichern und wenn ihr die jeweilige Seite später wieder ansteuert, dort eure gespeicherten Anmeldedaten automatisch wieder eingeben oder euch automatisch anmelden. Das ist bequem, spart Zeit und man braucht sich nicht mehr ganz so viele Passwörter zu merken. Eine gute Idee, wenn man bedenkt bei wie vielen Internetseiten man sich heute anmelden muss. Dieser Artikel soll auch für den Laien etwas Licht in diesen Vorgänge und der damit in Zusammenhang stehenden "große Blackbox" mit Namen Verschlüsselung bringen. Es soll aufgezeigt werden, das "Gut verschlüsselt" nicht unbedingt auch "Sicher" bedeutet. die Beschreibung "verschlüsselt übertragen" nicht gleichzusetzen ist mit "verschlüsselt gespeichert", und dieses wiederum nicht, das "verschlüsselt gespeichert" nicht gleichzusetzen mit "von niemanden lesbar", und das eine "anonyme Auswertung" nicht unbedingt nur das ist, was ihr euch darunter vorstellen könnt. Es ist das Ziel hier etwas Aufklärung zu leisten und mit diesem Artikel einen normalen Anwender ein klein wenig Hintergrundwissen rund um den dem Umgang solcher Internetpasswörter zu vermitteln.<br><br />
Nebenbei soll versucht werden bei wenigstens den Lesern dieses Artikels ein klein wenig mehr Interesse und Verantwortungsbewusstsein zu erzeugen welche Daten von den großen und kleine Datenkraken von euren Geräten abgegriffen werden können und auch werden, spätestens nachdem ihr ihr sorglos die Nutzungs- und Datenschutzbestimmungen der vielen kleinen und großen "hilfreichen" Tools bei der Installation einfach akzeptiert habt. <br />
<br />
Grundlage für die Recherchen und Beispiele hier ist Firefox, aber eigentlich ist das in jedem Webbrowser gleich oder zu mindestens sehr ähnlich.<br />
<br />
<br />
== Passwörter und Browser ==<br />
<br />
Passwörter sind heute unser täglicher Begleiter. Sie begegnen uns überall und besonders oft, wenn wir mit dem Webbrowser im Internet unterwegs sind.<br />
Die Beschreibungen, Erklärungen und Hilfen in den [https://support.mozilla.org/de/kb/Einstellungen-Fenster%20-%20Sicherheits-Abschnitt#w_passwairter Browserdokus] sind leider oft sehr dürftig und selbst einfache aber sehr wichtige Dinge im Umgang mit Passwörtern werden von vielen einfach aus Unkenntnis oder Sorglosigkeit ignoriert, zB das setzen von [https://support.mozilla.org/de/kb/Gespeicherte-Passwoerter-mit-einem-Master-Passwort-schuetzen Masterpasswörtern].<br><br />
<br />
<br />
<br />
== Passwortspeicherung auf dem Ziel-Server ==<br />
<br />
Beschäftigen wir uns erstem damit wie die vielen Passwörter auf den Servern im Internet gespeichert werden.<br><br />
Damit der Server euch eindeutig erkennen kann und auch eure Daten für euch verwalten kann benötigt man meistens einen Account dort auf dem Server. Zu diesem gehört ein Passwort mit dem ihr euch anmelden müsst. Dieses muss auf dem Server irgendwie gespeichert sein. Schauen wir uns mal an wie.<br />
<br />
=== Passwort Hash ===<br />
Meistens werden die Passwörter nur für die Authentifizierung benötigt, bedeutet das verschlüsselte Passwort das gespeichert wird, muss nicht wieder entschlüsselt werden. Es ist also nur eine Einwegfunktion erforderlich. Zur Überprüfung wird das vom User eingegebene Passwort nach der selben Methode verschlüsselt und das Ergebnis mit dem gespeicherten Wert verglichen. Zum Einsatz kommen hier meistens [https://de.wikipedia.org/wiki/Kryptologische_Hashfunktion Hashfunktionen] und das verschlüsselte Passwort ist dann der Hash.<br><br />
In der Praxis werden dazu fertige Passwort-Hash-Funktionen verwendet, hier soll mal mit einfachen Bash Kommandos die prinzipielle Funktion demonstriert werden. <br />
Stark vereinfacht und nur zur Demo. wir verwenden [http://linux.die.net/man/1/md5sum md5sum] danach wird das noch in ein [https://de.wikipedia.org/wiki/Base64 base64 Format] umgewandelt, unser Passwort lautet "Test" <br />
# echo -n "Test" | md5sum | cut -f1 -d " "| base64<br />
MGNiYzY2MTFmNTU0MGJkMDgwOWEzODhkYzk1YTYxNWIK<br />
<br />
Das Ergebnis ist jetzt der Passworthash der wird in einer Passwortdatenbank oder ähnlichem gespeichert. Wollen wir uns wieder anmelden, geben wir "Test" als Passwort ein, und es entsteht dort wieder der selbe Hash in der Hashfunktion, das wird mit dem gespeicherten vergleichen und damit haben wird uns ausreichend autorisiert und erhalten Zugang.<br><br />
Der Nachteil, das Ganze ist leicht angreifbar. Wenn wir zB in die Passwortdatenbank schauen würden könnten wir sofort erkennen wenn 2 User das selbe Passwort benutzen würden. Und was noch viel schlimmer ist, nur mit die Kenntnis der verwendeten Hashfunktion könnten wir noch bevor wir überhaupt in die Datenbank schauen uns von ein paar tausend Wörtern schon einen Hashwert erzeugen, und würden nur noch nachschauen, ob von den von uns erzeugten Hashwerten zufällig welche in der Passwortdatenbank sind. Das wäre dann ein [https://de.wikipedia.org/wiki/W%C3%B6rterbuchangriff Wörterbuchangriff] wenn wir der Reihe nach alle möglichen Kombinationen der Buchstaben ausprobieren würden, hatten wir dann einen [https://de.wikipedia.org/wiki/Brute-Force-Methode Brute Force Angriff] und für solche ganz einfachen Funktionen wie '''md5''' gäbe es sogar komplette Tabellen mit Hashwerten [https://de.wikipedia.org/wiki/Rainbow_Table Regenbogen Tabelle]<br> <br />
<br />
==== SALT ====<br />
Um das etwas sicher zu machen, kann der Hash [https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29#Salt versalzen] werden. Dazu wird jedes mal wenn ein Passwort abgespeichert werden soll, erst eine zufällige Zeichenfolge gebildet der sogenannte SALT. Diese SALT wird jetzt zB dem Userpasswort vorangestellt und dann mit diesem zusammen verarbeitet und damit der Hashwert gebildet. Da aber genau der selbe zufällige SALT wieder benötigt wird bei der Passwort Überprüfung, muss dieser SALT auch jeweils mit dem entsprechendem Passwort zusammen gespeichert werden.<br><br />
Auch dazu ein vereinfachtes mit einfachen Befehlen nachgestelltes Beispiel zum spielen. SALT wird hierbei mit der Random-Funktion der Bash erzeugt und dann mit einem Punkt getrennt vor dem Hashwert gesetzt und mit diesem abgelegt.<br />
# SALT="$(printf "%04X" $RANDOM)";echo ${SALT}.$(echo -n "${SALT}Test"|md5sum|cut -f1 -d " "|base64)<br />
5A11.NWE5MDk5MzEzMTIwODczNzZjYmMzMjEyYmQ0N2JlYTYK<br />
Das "'''5A11'''" ist der von uns zufällig erzeugte SALT und nach dem Punkt kommt der Hash der vom SALT+Passwort erzeugt wurde.<br><br />
Diese erzeugt jetzt selbst bei gleichem Passwort immer einen anderen Hash, und wenn so etwas jemand knacken wollte, musste er als erstes den kompletten gespeicherten Hash+Salt in die Hand bekommen, die verwendete Hashfunktion wissen, und wissen wo und wie SALT und Passwort vermischt wurden. Dann allerdings könnte er aber immer noch mittels Wörterbuch oder Brute-Force angreifen. Aber er müsste für jeden einzelnen Eintrag in der Datenbank neu rechnen und könnte durch die unterschiedlichen SALT-Werte ein Ergebnis nicht mit allen anderen Werten in der Datenbank vergleichen. Aber wenn er die Datenbank angreifen und knacken kann, könnte er immer noch auch die Hashwerte in der Datenbank gegen selbst erstellte austauschen und sich so Zugang zu den Userkonten verschaffen. Die richtigen User wären dann aber mit ihren dann nicht mehr funktionierenden Passwörtern ausgesperrt, dass fällt also schnell auf.<br />
<br />
==== PEPPER ==== <br />
Um das jetzt noch komplizierter und vor allem sicherer zu machen, könnte man das noch [https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29#Pepper pfeffern]. Der PEPPER wäre noch eine zusätzliche Zeichenfolge mit der Passwort und der SALT vermischt wird, zB hinten angehängt. Der PEPPER ist jedoch jetzt für alle Passworte gleich und wird NICHT mit dem Passworthash zusammen abgespeichert sondern liegt gut geschützt irgendwo auf dem Rechner. Spätestens jetzt würden rein mathematisch alle normalen Angriffsmethoden ohne Kenntnis des PEPPER hier irgendwelche Passworte zu knacken zur Jahrhundertaufgabe für ganze Rechenzentren.<br />
<br />
==== Ausnahmen ====<br />
Die oben aufgezeigten Methoden der Speicherung mit dem Passwort Hash sind typisch, und diese werden wir oft mit verschiedenen Algorithmen und Ausprägungen auch im Internet vorfinden wenn wir uns dort anmelden und einen User anlegen. Dennoch kann es gelegentlich vorkommen, das uns ein solcher Anbieter bei dem wir ein Passwort angegeben haben, im Falle wir hätten das Passwort vergessen uns unser eigenes Passwort per Mail zuschicken. Nicht etwa ein temporäres Neues, nein das Passwort das wir vorher irgendwann mal eingegeben haben. In diesem Fall sollten sofort die Alarmglocken klingen. Entweder die Passwörter dort sind überhaupt nicht gesichert und der Betreiber hat wenig Ahnung und Verständnis von Sicherheit, oder sie sind verschlüsselt dort auf dem Server gespeichert und können dort aber unkompliziert vom Betreiber und scheinbar sogar automatisch vom Server entschlüsselt werden. Alle Infos die man benötigen würde um die gesamte Passwortdatenbank zu entschlüsseln liegen dann mit auf diesem Server und sind diesem im Onlinemode bekannt. Würde solch ein Server ernsthaft professionell und bösartig angegriffen werden, erlangt der Angreifer eventuell an alle dort gespeicherten Informationen.<br><br />
Sollte euch so ein Server im Internet auffallen, dann ist es empfehlenswert schon vorzeitig alle eventuell gleichen Passwörter auf anderen Seiten umzustellen und das Passwort das ihr dort verwendet habt, nirgends anders zu verwenden. Man sollte sich gut überlegen was man auf solchen Plattformen für Informationen angibt und was man dort macht. <br />
<br />
=== Wie sicher sind die Passwörter auf dem Server ===<br />
Damit können wir eigentlich sicher sein, dass unser Passwörter im Internet auf den Servern gut verschlüsselt gespeichert sind, ja besser, eigentlich sind sie gar nicht dort gespeichert, sondern nur der Hash davon, und aus dem Hash lässt sich mit mathematischen oder anderen Funktionen kein Passwort errechnen, man müsste schon verschiedene/viele/unzählige Passwörter ausprobieren, um zufällig das richtige zu erwischen.<br><br />
Aber die Speicherung ist nicht alles. Bevor ein Passworthash erstellt werden kann, muss das Passwort erst einmal irgendwie in den Server hinein kommen und ist dort bis zur Verhashung auch irgendwo wirklich in Form von Bits und Bytes da. Es ist also möglich es in dieser Zeit aus dem Speicher zu lesen, bzw. noch besser es mit Tracing- oder Debug-Methoden abzufangen und in Logs zu schreiben. Gehen wir mal davon aus, die Serverbetreiber sind alles zuverlässige und sicherheitsbewusste Leute, dann werden sie solche Indiskretionen auf ihren Servern nicht dulden, und auch mit genügend Sicherheitsmaßnahmen dafür sorgen, dass niemand anders es auf ihren Servern heimlich machen kann.<br><br />
Im Gegensatz zu anderen Verschlüsselten Daten die auf den Servern abgelegt sein können, sind also die reinen Passwörter verhältnismäßig gut geschützt. Zwar hört man hin und wieder mal das bei Hackerangriffen auch Passwörter im großen Stiel dort abgezapft worden sind, doch beim näheren Hinschauen würde man feststellen es handelt sich meist nur um die Datenbank mit den gespeicherten Passworthash. <br />
<br />
<br />
<br />
<br />
== Passwort Transport zum Server ==<br />
<br />
Irgendwie muss aber das Passwort das ihr eingebt ja erst mal bis zum dem Server im Internet kommen bei dem ihr euch anmelden wollt.<br />
Im Browser habt ihr mehr oder weniger schön eine Anmeldeseite, diese enthält ein [https://de.wikipedia.org/wiki/Base64 Formular]. Dort setzt ihr Username und Passwort rein, und dann schickt ihr das los. Euer Passwort wird dabei entweder ganz unverschlüsselt im Klartext oder relativ leicht entschlüsselbar (ehr zu bezeichnen als nicht direkt lesbar) einfach mit den anderen Formulardaten an den Server geschickt.<br />
<br />
=== Transport über HTTP ===<br />
<br />
HTTP ist das normale unverschlüsselte Transport Protokoll für [https://de.wikipedia.org/wiki/Hypertext_Markup_Language HTML] und ähnliches das ihr im Browser anschaut. Ihr könnt es an der URL erkennen, dort steht "'''http://irgendwas.....'''". Zu erkennen ist das auch im Browser in der Adressenleiste, dort steht auch am Anfang "'''http://'''" oder neuerdings gar nichts mit "://" am Anfang. In diesem Fall würdet ihr euer Passwort also wirklich mehr oder weniger im Klartext bis zum Server schicken. Es geht dabei über viele Zwischenstationen (zB. Router) im Netz, und überall könnte das Passwort ausgelesen werden.<br><br />
Zugegeben den Postboten zu überfallen in der Hoffnung in irgend einem der vielen Briefe die er gerade ausliefert, steht etwas spannendes drin, ist eine schlechte Strategie. Aber im Internet ist vieles möglich und denkbar. Dort können irgendwo auf dem Weg bestimmte Protokolle ausgefiltert, Transportpakete dupliziert, ausgewertet und umgeleitet oder mit Debuging- oder Tracingfunktionen der Inhalt der Transport-Paketen absichtlich oder zufällig in Dateien abgespeichert werden. In einem solchem Transportpaket steht dann auch eure IP und die Adresse des Zielservers, mit etwas Aufwand ist das euch und die Funktion und Aufgabe die es auf dem Server erfüllen soll, eindeutig zuzuordnen. Euer Account auf dem Server also eigentlich nicht schwer zu knacken. Das die Transportpakete nicht nur gelegentlich mal im Netz in eine solche Falle laufen, sondern es eigentlich schon Standard ist, zeigen die Enthüllungsskandale rund um die Geheimdienste in letzter Zeit mehr als eindeutig.<br><br />
<br />
Wann ist jetzt der Transport von Passwörtern über HTTP denn dann überhaupt für einen User noch akzeptabel. Solange es sich nur um unbedeutende Userkennungen zB bei irgendwelchen allgemeinen Balaber-Foren geht, solange außer der Mailadresse alle anderen Angaben nicht gemacht werden müssen, und von euch auch nicht gemacht werden, kann man das noch akzeptieren. Sobald aber weitere persönliche Daten ins Spiel kommen, wie zB Tel., Adresse, Anschrift, Kontoverbindungen usw., Finger weg von HTML. Geht es gar um Online-Shops, Banken, .... sofort STOP.<br />
<br />
=== Transport über HTTPS === <br />
<br />
HTTPS ist jetzt das Sichere Transport Protokoll dazu. Dabei werden jetzt die einzelnen Pakete vom Server zu euch und wieder zurück verschlüsselt übermittelt. Ihr könnt auch das in der URL am "'''https://'''" im Browser eindeutig erkennen. Oft werden auch noch zusätzliche Sicherheitssymbole dort in der Browser Adressleiste zu erkennen sein. Beim Verbindungsaufbau von eurem Rechner zu einem solchem Dienst auf dem Server wird zwischen eurem Rechner und dem Server ausgehandelt mit welchem Verschlüsselungsalgorithmus und mit welchem zufälligem Schlüssel sich die beiden unterhalten. Wie das aushandeln genau funktioniert, ist etwas kompliziert aber man muss es auch gar nicht wissen. Es spielt sich dort eine ganze Menge Kryptographie ab, und es geht ein paar Mal hin und her, aber am Ende sind sich beide einig. Jemand der dieses Aushandeln beobachten würde, könnte nicht erkennen auf welchem geheimen Schlüssel sich die beiden jetzt geeinigt haben und somit kann er auch die nachfolgenden Pakete nicht entschlüsseln. So gesendete Daten und Passwörter werden also sicher und von anderen nicht auslesbar an den Server übertragen.<br><br />
<br />
Wenn auch das genaue Aushandeln der Verschlüsselung zwischen eurem Rechner und den Server unwichtig ist, wichtig dabei ist jedoch: Es geht hier unter anderem hierbei um ein Zertifikat vom Server, und das genau in dem Moment wenn ihr das erste mal mit HTTPS diesen speziellen Server ansprecht. Euer Browser (bzw ihr) müsst ein Zertifikat vom Server akzeptieren. In diesem Zertifikat steht unter anderem der public Key des Servers, und eine Menge Kryptografischer Kleinkram, wie die zugehörige URL, Gültigkeitszeitraum, Aussteller usw. Und, dieses Zertifikat muss von einem anderem Zertifikat mit dessen privaten Key signiert sein. Auch dieses Zertifikat wird von eurem Rechner benötigt. Der Sinn dahinter ist, das Zertifikat vom Server muss zwingend von einer Zertifizierungsstelle zertifiziert sein. Dabei wird von der Zertifizierungsstelle genau geprüft ob die Angaben im Zertifikat des Servers auch wirklich alle korrekt und richtig sind und auch zutreffen, und nicht das ein Zertifikat mit der URL von deutsche.dank.de mit einer Mailadresse und Aussteller von Max.Mustermann.gmail.com stammt. Der Betreiber des Servers müsste also ein paar Euro in die Hand nehmen und sich bei einer offiziellen Zertifizierungsstelle ein Zertifikat ausstellen lassen. In diesem Fall würdet ihr dieses gar nicht merken. Euer Browser kennt eine ganze Menge von Zertifikaten von offiziellen Zertifizierungsstellen und wenn mit diesen ein Serverzertifikat signiert ist wird er es automatisch akzeptieren wenn die Angaben im Zertifikat mit der aufgerufenen Seite übereinstimmen.<br><br />
<br />
Aber es gibt auch die Möglichkeit das sich der Betreiber eines Servers sich sein Serverzertifikat selbst signiert, das er also selbst für die Richtigkeit der Daten im Serverzertifikat bürgen will. Auch das geht, allerdings wird jetzt euer Browser eine Warnung bringen und euch fragen ob ihr das zulassen wollt. Voreinstellung dafür ist ablehnen, aber dann wird zu diesem HTTPS Server keine Verbindung aufgebaut. Wichtig hier nicht wahllos alles akzeptieren was dort rein kommt, und erst mal die Details des Zertifikates anschauen und euch gründlich überlegen ob ihr dieses wirklich akzeptieren wollt, eh ihr ein solches Zertifikat importiert. Einmal importiert ist es nicht ganz einfach dieses wieder loszuwerden. <br />
<br />
Auch sonst wird Eurer Browser die Daten in den Zertifikaten überprüfen und zB Alarm schlagen wenn dort was nicht stimmt, zB das der Server eine andere URL benutzt als die die in dem Zertifikat steht, oder die Gültigkeitsdauer überschritten ist. solche Warungen nicht einfach weg drücken sondern erst mal genauer anschauen, ob das denn eventuell eine mögliche und akzeptable Erklärung dafür gibt. Wenn zB bei einer Bankverbindung plötzlich so ein Zertifikat akzeptiert werden soll, STOP, eine Bank sollte durchaus genügend Geld haben um sich so etwas offiziell signieren zu lassen und auch genügend IT-Sicherheitsspezialisten die dieses richtig installieren und konfigurieren können.<br />
<br />
Warum hier wachsam sein? Es gibt da die Möglichkeit des [https://de.wikipedia.org/wiki/Man-in-the-Middle-Angriff Man-in-the-Middle-Angriff]. Der geht auch bei HTTPS. Dabei gibt sich jemand anders als der von euch gewünschte Zielserver aus. Ihr wollt den Zielserver ansprechen, landet aber erstmal unbemerkt nur auf einer gefakten Seite und diese baut eine verschlüsselte Verbindung zu Euch auf. Auf der anderen Seite baut dieser Rechner mit der gefakten Seite gleichzeitig dann eine eigene verschlüsselte Verbindung zu eurem Zielserver auf. Es wird von diesem Rechner in der Mitte dann einfach alles eins zu eins von einer Seite auf die andere übertragen, allerdings innerhalb dieses Angriffsrechners in der Mitte der sonst verschlüsselten Verbindung ist alles unverschlüsselt und somit von Angreifer alles mitlesbar. Weder ihr noch euer Zielrechner wird das bemerken.<br />
Ein solcher Angriff auf HTTPS ist nicht ganz einfach und in der Regel Profiarbeit da meist auch andere Internetprokolle mit angegriffen werden müssen, damit die Verbindung umgeleitet werden kann, aber das ist theoretisch und auch praktisch möglich. Dieses kann mit den default Sicherheitseinstellungen die für HTTPS im Internet genutzt werden, nicht vollkommen ausgeschlossen werden, da sich nur der Zielserver und nicht auch euer Rechner eindeutig identifizieren muss. (Wie soll auch ein öffentlicher Server im Internet jeden anderen Rechner der irgendwann mal ihn sprechen will, schon vorher eindeutig identifizieren können). Einen solchen Angriff wird dadurch begünstigen, in dem ihr zB ein nicht korrektes Zertifikat leichtsinnigerweise importiert.<br />
<br />
=== Wie sicher sind die Passworte beim Transport ===<br />
Zusammenfassend können wir also sagen, solange wir nur mit HTML arbeiten, sind die Passwörter komplett ungeschützt. Bei HTTPS haben wir wesentlich mehr Sicherheit, aber auch da gibt es durchaus von unserer Seite ein paar Dinge die wir nicht leichtsinnig übergehen sollten. Die eigentliche Sicherheit im Netz ist damit nur die "relative" Anonymität inmitten und zwischen Milliarden von Datenpaketen die dort ständig kursieren. Angriffe dort sind kompliziert da irgendwo direkter Zugriff auf die Hardware von großen Netzen benötigt wird, oder Netzwerk Protokolle angegriffen werden müssen. Wir wollen mal davon aus gehen, dass Mitarbeiter die irgendwo Administrativ an großen Netzwerknoten arbeiten auch ausreichend Sicherheitstechnisch geschult sind, dass sie unbeabsichtig und zufällig in Logdateien eingefangene Informationen nicht nach außen tragen oder verkaufen. Größeres Risiko ist dort zu erwarten, wo die Datendichte nicht all zuhoch und schon spezifisch auf entweder EUCH oder dem Server ausgefiltert ist, also zB unmittelbar vor eurem Zielserver oder unmittelbar hinter eurem Router bis zum ersten größerem Netzwerkknoten. Aber leider gibt es staatlich geförderte und allumfassende Überwachung mitten im Herzen der Netze und außerdem wissen wir auch nicht immer was unsere Internetprovider so alles machen. <br />
<br />
<br />
<br />
<br />
<br />
== Gespeicherten Passwörter im Firefox ==<br />
<br />
Wenn sich Firefox ( natürlich jeder andere Browser auch) ein Passwort für eine Anmeldung im Internet gemerkt hat, dann muss/kann es von Firefox beim nächsten Anmelden an dieser Seite automatisch richig in das Anmeldeformular eingetragen werden. Aber im Klartext, genau so, als wenn ihr es selbst eingeben würdet. Es muss das Passwort also so verschlüsselt gespeichert sein, dass daraus von Firefox wieder das Passwort entschlüsseln werden kann. Es kann also nicht wie oben gezeigt als Hash gespeichert sein. Das schauen wir uns jetzt mal beim Firefox an.<br />
<br />
Auf Linux befindet sich im Home Verzeichnis des Users ein verstecktes Verzeichnis "'''.mozilla'''". In einem Unterverzeichnis dann "'''firefox/.....default'''" (die Punkte sehen für eine zufälligen Wert, der bei jedem anders ist). Dort befinden sich jetzt die ganzen Profil und Einstellungsdaten von Firefox. Dort liegt auch die Datei mit den verschlüsselten Passwörten. Bis Firefox V31 war das eine [https://de.wikipedia.org/wiki/SQLite SQLITE Datenbank] namens '''signons.sqlite''' und ab V32 ist es ein [https://de.wikipedia.org/wiki/JavaScript_Object_Notation JSON-Dokument] und die Datei '''logins.json''' . Bei dem einem oder anderem ist es nach Updates auch möglich, das es beide Dateien gibt. Das Format von beiden ist unterschiedlich. Aber in beiden steht mindestens für jede gespeicherte Anmeldung die URL der Server im Klartext und jeweils dazu der verwendete Username und Passwort in verschlüsselter Form.<br><br />
Schauen wir uns mal so ein verschlüsseltes Passwort an:<br />
"encryptedPassword":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECOuP+FR+vfyGBBCeJ/HBWkYc5bbcKS3LvrLC"<br />
Ist natürlich wieder verpackt und wir können das noch etwas auspacken, um genauer zu sehen aus was das Passwort besteht.<br />
<pre><br />
0:d=0 hl=2 l= 58 cons: SEQUENCE <br />
2:d=1 hl=2 l= 16 prim: OCTET STRING [HEX DUMP]:F8000000000000000000000000000001<br />
20:d=1 hl=2 l= 20 cons: SEQUENCE <br />
22:d=2 hl=2 l= 8 prim: OBJECT :des-ede3-cbc<br />
32:d=2 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:EB8FF8547EBDFC86<br />
42:d=1 hl=2 l= 16 prim: OCTET STRING [HEX DUMP]:9E27F1C15A461CE5B6DC292DCBBEB2C2<br />
</pre><br />
Als ersteres sehen wir einen Hex Dump beginnend mit F800 und endet mit 0001. Das ist die SchlüsselID für den Key mit dem das zu entschlüsseln ist. (diese ist von Mozilla festgelegt und immer die gleiche ID)<br><br />
Weiter sehen wird "des-ede3-cbc" das ist das Verschlüsselungsverfahren.<br />
Dann kommt ein etwas kürzerer Hexdump dieses ist der Initialisierungsvektor (eine Art Voreinstellung des Verschlüsselungs-Algorithmus die für jedes Passwort immer anders ist)<br><br />
Und das untere ist jetzt letztlich das verschlüsselte Passwort.<br />
<br />
Das ist jetzt mehr als nur ausreichend gut verschlüsselt, denn ohne den Key von dem wir nur eine nichtssagende und immer gleiche ID haben, geht gar nichts. Das ist aber genau die Ausgangssituation wenn wir Firefox frisch gestartet haben. Auch Firefox kennt dann diesen Schlüssel noch nicht, und der steht auch nirgends auf dem Rechner. Erst wenn wir versucht haben uns irgendwo anzumelden oder einen neuen Passwort Eintrag irgendwo im auf einer Seite machen wollten, oder uns mit Firefoxmitteln die Passwörter anschauen wollten, wird der Schlüssel von Firefox gebildet und dazu werden wir eventuell vorher nach dem Masterpasswort gefragt. Denn wenn ein Masterpasswort gesetzt ist, kann Firefox von sich aus den richtigen Schlüssel gar nicht finden, dazu braucht er das Masterpasswort, und dieses ist nicht gespeichert, es muss also über Tastatur jedes mal neu eingegeben werden<br><br />
<br />
Hat Firefox jetzt aber einmal den Key erzeugt, dann bleibt diese im HauptSpeicher und Firefox kann mit dem Key dann beliebig oft Passworte entschlüsseln und braucht nicht noch einmal nach dem MasterPasswort zu fragen. Bis Firefox neu gestartet wird. Aber nicht nur Firefox kann jetzt auf den Key im Haupspeicher zugreifen, wahrscheinlich könnten alle Plugins die wir jetzt in Firefox gestartet haben auch darauf zugreifen. Also auch hier Vorsicht beim Installieren von Plugins für Firefox, auch hiermit könnte jemand ungewollt und von euch unbemerkt an die unverschlüsselten Passworte kommen und das obwohl ihr ein Masterpasswort gesetzt habt.<br />
<br />
<br />
=== Der privat Key zum Entschlüsseln ===<br />
<br />
Firefox muss den Schlüssel zum entschlüsseln des Passwort also nach dem Start immer erst einmal wieder neu erstellen, und zwar aus einem privat Key. Dieser privat Key wird erstellt wenn wir das erste mal ein Passwort speichern und befindet sich in einer Datei "key3.db" im selben Verzeichnis. <br><br />
Der private Key ist 143 Zeichen lang, und auch wieder ein bisschen verpackt, also packen wir mal einen aus, um zu schauen was da drin ist.<br />
<pre><br />
0:d=0 hl=3 l= 140 cons: SEQUENCE <br />
3:d=1 hl=2 l= 40 cons: SEQUENCE <br />
5:d=2 hl=2 l= 11 prim: OBJECT :1.2.840.113549.1.12.5.1.3<br />
18:d=2 hl=2 l= 25 cons: SEQUENCE <br />
20:d=3 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:47AD0F306E90E8BD83E37B2C96F2D06246794918<br />
42:d=3 hl=2 l= 1 prim: INTEGER :01<br />
45:d=1 hl=2 l= 96 prim: OCTET STRING [HEX DUMP]:7327975D5375063597378DB34DB2DBD9C7B8DB2FA440528E8E3A46B0981F44BC952A0A188F5079C31F34875AFFADC8D5BF57A....<br />
</pre><br />
Dieser besteht jetzt erst mal aus 2 wichtigen Bestandteilen, der kleinere Hexdump ist ein SALT und das größere (hier abgeschnitten) ist etwas verschlüsseltes. Wenn wir das entschlüsseln können, dann würden wir dort wiederum eine Verpackung finden in der ist dann die Key-ID und letztlich auch der richtige Key enthalten, mit dem wir die Passwörter wirklich entschlüsseln könnten. <br />
<br />
Allerdings soweit sind wir noch nicht, noch ist dieses nicht entschlüsselt. Wir haben einen SALT (funktionell den Entry Salt) und in der Datei "key3.db" gibt es an einer anderer Stelle auch noch "Pfeffer" (funktionell den Global Salt). Aus Salz+Pfeffer+Masterpasswort kann man über mehrere Schritte und verschiedenen Hasch Funktionen einen "Key" und einen "Initialisierungsvektor" errechnen, und damit ließe sich der größe Brocken im Private Key entschlüsseln. Das Ergebnis müsste man dann noch auspacken und der darin enthaltene Key ist dann der Key mit dem das Passwort entschlüsselt werden kann. Zum Entschlüsseln bräuchten wird dann neben diesem Key noch den Initialisierungsvektor aus dem jeweiligem verschlüsselten Passwort, und das Verschlüsselte Passwort selbst.<br><br />
Ganz schöner Schlüsselbund, schon beim ungefähren Beschreiben des Vorganges wird einem schwindelig vor lauter Keys ;-) .<br />
<br />
<br />
=== Wie sicher ist das Passwort denn jetzt verschlüsselt ===<br />
<br />
Ersteinmal als Zusammenfassung, da davon ausgegangen werden kann, nicht jeder hat das Kryptografische Wirrwarr aus den vorherigen Abschnitten wirklich aufmerksam gelesen und richtig verstanden. Sowohl die im Firefox gespeicherten Online-Passwörter und Usernamen, als auch der Key mit dem diese entschlüsselt werden können, sind wirklich gut verschlüsselt.<br />
<br />
Das bedeutet aber nicht das sie auch sicher sind. Im Gegenteil. Der Private-Key zu Entschlüsselung ist einzig von einem Masterpasswort abhängig, und das ist im Rechner nirgends gespeichert, das ist gut so, aber die default Einstellung des Firefoxes ist: "kein Masterpasswort"<br><br />
Damit wird der Key nur mit Hilfe von "Salz und Pfeffer" verschlüsselt und Salz und Pfeffer steht auch noch in der selben Datei (key3.db) wie der private-key. Was noch erschwerend dazu kommt, aber hier nicht näher erklärt wird, diese Datei ist auch noch hervorragend geeignet für einen Wörterbuch- oder Brute-Force-Angriff auf das Masterpasswort. <br><br />
In den Firefox Default-Einstellungen sind damit quasi die gespeicherten Online-Passwörter nur durch die Dateizugriffsrechte auf das Verzeichnis der Profildaten von Firefox gesichert, und natürlich dem Wissen oder Nichtwissen des verwendeten Verschlüsselungsalgorithmus. Zugegeben, wir befinden uns mitten in einem Volks-Webbrowser und nicht in einem Hochsicherheits-Rechenzentrum, wo man für jeden Schritt eine andere Genehmigung vorlegen muss und sich alle 2 Meter mit Geburtsurkunde, Fingerabdruck und Irisscan immer wieder neu identifizieren muss. Damit ist klar, wir müssen größere Abstriche in Punkto Sicherheit in Kauf nehmen, und irgendwo müssen schließlich auch die Daten zur Ver- und Entschlüsselung für den Webbrowser greifbar sein. <br> <br />
Wenn also in der Doku von Mozilla steht: "'''Wichtig: Ohne Master-Passwort kann jeder, der Zugriff auf Ihren Rechner hat, auch auf Ihre in Firefox gespeicherten Passwörter zugreifen.'''", ist das also wirklich keinesfalls übertrieben.<br />
<br />
<br />
=== wie kompliziert ist jetzt die Entschlüsselung ===<br />
<br />
Das genaue Ver- und Entschlüsselungsverfahren an sich ist wie die gesamte Kryptografie ein für Otto-den-Normverbraucher niemals wirklich zu durchschauendes Verfahren. Aber braucht ja niemand wirklich zu wissen. Eigentlich muss man nur das Verzeichnis mit den Einstellungen in ein anderes Profil kopieren, eventuell die Eigentumsrechte der Dateien anpassen und dann Firefox starten, und man kann die Passwörter mit Firefox auslesen. Aber auch nur einmal kurz im Internet nach den richtigen Worten gesucht, und man findet sofort dutzende fertige Programme um die Firefox Passwörter zu entschlüsseln, auszulesen, zu sichern, wiederherzustellen, das Profil zu speichern und zu übertragen, die Passwörter und andere Einstellungen übers Internet mit all seinen anderen Geräten zu synchronisieren, usw.<br />
Es gibt darüber hinaus eine Vielzahl Projekten in den verschiedensten Programmiersprachen und fix und fertigen Quellcode die sich mit diesem Thema beschäftigen. Es gibt entsprechende Doku und [https://www.youtube.com/watch?v=MMdTfHP3ZGI Videos] die das alles haar-genau erklären und nicht zuletzt insbesondere für Programmierer interessant, auch die Librarys von Firefox selbst, die ja bei der Installation von Firefox sowieso auf jeden Rechner installiert werden. Dort ist das alles schon als Bausteine drin, man braucht also gar nicht mehr viel eigenes an Programmierarbeit dazu zu leisten.<br><br />
Das einzige was auf Anhieb mal nicht zu finden war, der Nachweis das man all diese Programme und Tools die mehr oder weniger schwierig zu installieren sind, bei Linux eigentlich auch gar nicht wirklich braucht. Bei Linux ist alles was man benötigen würde um mit Hilfe der Konsole oder eines Script die Passwörter zu entschlüsseln per default schon installiert. Der Beweis wurde im Zusammenhang mit dem Schreiben diesem Artikel aber in Form eines Scriptes erbracht, (Zur Abschreckung findet ihr das Script auf der Diskussionsseite dieses Artikels) <br />
Es ist damit für jeden, und damit muss man die 98 jährige Oma die ein wenig Computer- und Internetbegeistert ist, bewusst einschließen, also wirklich für jeden ist es problemlos möglich die Passworte auszulesen wenn kein Masterpasswort gesetzt ist. Ist eines gesetzt, nun gut, dann sollte man das schon kennen, sonst wird's schwierig. <br />
<br />
<br />
=== Wer ist den nun "Jeder" der Zugriff darauf hat === <br />
<br />
Wer nun der Meinung ist: "Na-ja eigentlich bin ich ja alleine auf meinem Rechner, wer soll da schon Zugriff auf meine Passwörter haben. Und selbst wenn meine Frau oder mein Sohn theoretisch die Möglichkeit hat meine Passwörter auszulesen, zugegeben nicht schön, aber was soll's....."<br><br />
dem muss man leider arg enttäuschen. Jeder bedeutet nicht nur jeder User der sich am Computer anmelden kann, sondern bedeutet auch jeder Prozess und jedes Programm das der User unter seiner Kennung am laufen hat. Nicht jedes Programm, Tool oder App wird davon Gebrauch machen sich für solche Dateien zu interessieren, aber es hätte trotzdem die Dateizugriffsrechte um auf jede Datei des Users lesend zuzugreifen. Und mehr wird nicht benötigt als auf bestimmte Dateien des Users im Profile Verzeichnis vom Firefox Leserechte zu haben. <br><br />
Was bei einer Linux Erstinstallation installiert wird, ist wohl diesbezüglich absolut harmlos, aber einiges was wir insbesondere aus dem Internet nachinstallieren, könnte sich dafür interessieren, kostenlose Spiele und Apps, Firefoxplugins, Tools rund um Suchmaschinen oder Cloud Dienste oder Soziale Netze dürften wohl ganz oben auf die Liste der Verdächtigen vermutet werden. Bei den Browserplugins kommt noch erschwerend hinzu, hier würde eventuell nicht einmal das Masterpasswort ausreichend Schutz bieten, das sie die Möglichkeit hatten auf den Key im Firefox zuzugreifen, nachdem wir nach dem Start von Firefox das Masterpasswort eingegeben haben. Die meisten dieser Tools oder Programme werden daraus nicht einmal ein Hehl machen, es steht nur nicht im Klartext in den Nutzungsbedingungen, das auch ausdrücklich die Passwörter gemeint und inbegriffen sind, wenn es um allgemeine Einstellungen und User-Profildaten geht, die regelmäßig eingesammelt, ausgewertet und "nach Hause" gesendet werden. <br />
<br />
<br />
== Was können "die" denn mit meinen oder unseren Passworten anfangen ==<br />
<br />
Wenn eine einzelne Person oder Gruppe die Passwörter einer anderen Person oder Personen Gruppe auslesen würde, hätte sie natürlich damit dann theoretisch wahrscheinlich den Zugang zu allen Onlinediensten und den dort eventuell gespeicherten Daten. Streng genommen sind dann alle Internetkonten von denen die Passwörter so ausgelesen wurden, als gehackt zu bezeichnen.<br><br />
Des weiteren, aus einer etwas größeren Liste von verwendeten Passwörtern eines Users lässt sich oftmals etwas mehr herauslesen. Da könnten zB auffallen das bestimmte Passwörter oft oder immer wieder genutzt werden, oder das Passwörter nach einer bestimmten Regel erzeugt werden, ZB immer mit einer Zahl oder Sonderzeichen an einer bestimmten Stelle, oder Auffälligkeiten bei der Groß-Kleinschreibung. Zwar ist jeder einzelne wohl etwas mehr oder weniger kreativ bei der "Generierung" seiner Passwörter, aber irgendwie will oder muss er sich das auch alles merken können. Da kann man bestimmt bei vielen wiederkehrende Besonderheiten aus einer Liste von Passwörtern herauslesen. Damit hätte man dann eine viel größere Chance auch Passwörter dieses Users zu knacken, die gar nicht auf der Liste zu finden waren, und dieses könnten dann auch dienstlich oder für Internet-Geschäfte verwendete Passwörter sein, denn der User wird mit einiger Wahrscheinlichkeit auch dort Passwörter nach ähnlichen "Macken" generieren.<br />
<br />
Und was die großen und kleinen Internet-Datenkraken mit solchen Daten anstellen wissen wir nicht wirklich, werden es auch wohl nie erfahren. Auf jeden Fall dürfte es außerhalb unseres Vorstellungsvermögens liegen. Vielleicht sammeln sie es nur ein, um statistisch nachzuweisen das das Passwort 123456 wohl eines der häufigsten benutzten ist. Vielleicht sammeln sie es auch nur erstmal ein und wissen selbst noch nicht was sie damit anfangen können. Zumindest dürfte klar sein, sie werden es nicht nutzen um sich selbst als User irgendwo mit unseren Passwörtern anzumelden.<br><br />
Bei einigen kleineren Firmen muss man sich aber schon fragen wo sich denn nun wirklich die Geschäftsidee verbirgt, wenn sie zB. Dienste wie zB das Synchronisieren von Passwörtern und Lesezeichen als Browserplugin kostenlos über das Internet anbieten. Alleine die Betriebskosten der Server, Administration, Entwicklungskosten, Büro usw. werden wohl 6 Stellige Beträge jährlich verschlingen, dazu kommen dann noch Lizenzen für Software die sind auch nicht gerade billig, und und und.... Und sie müssen auch noch Werbung machen, damit überhaupt jemand ein solches Plugin im Internet findet und haben will. Was bitte verkaufen die, oder wo sind dort Einnahmen? <br />
<br />
Nur mal so ein nicht ganz unwahrscheinliches Gedankenspiel, und dabei wird dann auch gleich noch ein Begriff beleuchtet der im Zusammenhang mit den <br />
Datenschutzbestimmungen immer wieder auftritt, "'''anonymisierte Verarbeitung/Speicherung/Weitergabe'''"<br><br />
Eine Firma sammelt von ein paar Millionen Usern weltweit die gespeicherten Online Zugangsdaten aus dem Webbrowsern. Die Passwörter werden jetzt von den Usernamen, den URLs und IPs getrennt, also anonymisiert. Ein paar ganz grobe Eigenschaften bleiben aber weiterhin an den Passwörtern haften. zB welche Passwörter von ein und dem selben anonymen User stammen, welche Ländereinstellung der Browser hat, das Land das zur IP passt. und eventuell einiges mehr (Interessen oder sowas) was man zB aus den Lesezeichen im Browser ableiten könnte. Das wird jetzt verarbeitet. Heraus kommt dann für jedes Land ein Passwort-Wörterbuch erstellt aus der anonymen Auswertung der eingesammelten Passwörter. Sowas lässt sich dann schon verkaufen, und ist bestens geeignet um sehr gezielte Wörterbuchangriffe gegen irgendwelche Internet- oder Firmenserver durchzuführen. Eine Internetmafia aus dem kyrillischem Sprachraum wird sich kaum vorstellen können wie Deutsche, Franzosen, Polen oder Finnen gerne ihr Passwort zusammenbauen. Ein solches aus realen Passwörtern erstellte Wörterbuch hätte auf deutschen Servern auch bestimmt mehr Erfolg als eines erstellt aus den gesammelten Werken von Goethe und Schiller oder dem Duden. <br><br />
Der, der sich regelmäßig mühsam und raffiniert seine Passwörter hoch-kompliziert erstellt und erdenkt, und sich diese Passwörter von dieser Firma einsammeln lässt, hat eventuell öfters bei solchen Passwortattacken Pech, da genau seine so schwer zu erraten Passwörter immer wieder genau in den für die Angriffe verwendeten Wörterbüchern drin stehen. Das dieses aus anonymisierter Verarbeitung stammt, hilft diesem User hinterher aber wenig.<br />
<br />
<br />
<br />
<br />
== Was sollten wir daraus lernen ==<br />
<br />
Unsere Passwörter auf den Internetservern sind sicher, eigentlich liegen sie dort gar nicht herum. Wenn ein solcher Server dennoch mal angegriffen wird und dort Passwörter abgefangen werden, hat die Sicherheit auf diesem Server komplett versagt, das können wir nicht beeinflussen.<br><br />
Vorsicht jedoch, dort wo es möglich ist sich seine eigenen Passwörter per Mail zuschicken zu lassen. Die Administration und Sicherheit auf einem solchem Server ist wahrscheinlich keinen Pfifferling wert. <br />
<br />
Wenn wir Passwörter oder anderes über Http Verbindungen versenden, können sie unterwegs abgefangen werden. Die Wahrscheinlichkeit das dieses bewusst ausgenutzt und ausgewertet wird, ist nicht sonderlich hoch aber permanent vorhanden. Spätestens sobald ihr oder die von euch genutzten Internetdienste durch einen dummen Zufall mal ins Fadenkreuz von Geheimdiensten und Sicherheitsbehörden rutschen ist bei Http der letzte Mantel der Verschwiegenheit eurer Internetprovider gefallen. Dennoch sollten wir darauf achten. Http nur dort wo sowie alles offen ist, und wo keine wichtigen, schützenswerten oder persönlichen Daten abgelegt sind. Sobald ihr (außer einer Email-Adresse) aufgefordert werdet irgend etwas ein- oder anzugeben, dass ihr nicht auch auf eurem T-Shirt geschrieben herumtragen würdet, ist dringend Https angesagt. Viele Dienste bieten sowohl http als auch https an, hier darauf achten, wenn ihr etwas eingebt, zB das Passwort, dass diese Seite https ist.<br><br />
Bei Https ist noch zu bedenken und zu beachten, nicht alle Warnungen die euer Browser bringt einfach ignorieren. Das kann leicht dazu führen, dass euch vorsätzlich falsche Zertifikate unter geschoben werden. Mit bösartigen falschen Zertifikaten fühlt ihr euch zwar mit https immer noch sicher, und bekommt eventuell überhaupt nicht mit, dass ihr schon lange mitten auf dem Leim der Internet-Mafia sitzt.<br />
<br />
Am gefährlichsten leben die Passwörter auf unseren eigenen Rechnern. Zwar werden sie vom Browser gut verschlüsselt abgelegt, doch das nützt nichts denn alles was man zum entschlüsseln braucht liegt gleich daneben. Und Programme, Tools und Anleitungen wie das geht, gibt es zu Hauf. Das einzige was die Passwörter schützt ist das Masterpasswort, und dieses hat wahrscheinlich nur ein ganz geringer Anteil der User überhaupt gesetzt.<br />
Selbst ein Masterpasswort "123" das einer Attake keine 10 Sekunden standhalten würde, ist dabei zig-Millionenmal sicherer als gar keines. Wer wird sich schon die Mühe machen überhaupt ein Masterpasswort anzugreifen, wenn Millionenmal nur einen Klick weiter die Passwörter ohne Masterpasswort mitten auf dem Präsentierteller rumliegen.<br />
<br />
Wir sollten bewusst nicht unbedingt jedes Passwort im Browser speichern, auch wenn es bequem ist. Es gibt neben der Möglichkeit einfach '''NICHT''' immer auf "Speichern" zu drücken, auch die Möglichkeit das speichern der Passwörter prinzipiell in den Einstellungen auszuschalten und den "Privaten Modus", dort werden auch keine Passwörter gespeichert.<br />
<br />
Bei dem was wir auf Rechner installieren, sollten wir wenigstens hin und wieder mal die Nutzungs- und Datenschutzrichtlinien aufmerksam und kritisch durchlesen, die wir dabei ganz bewusst akzeptieren müssen. Mag sein, die sind umfangreich, englisch und kompliziert geschrieben, mag sein kein normaler Mensch kann sowas jemals wirklich verstehen, aber der Wille das zu verstehen ist 100 Mal sicherer als dort gar nicht rein zu schauen. Wir sollten bedenken, wir erlauben mit diesen Bedingungen hier "Fremden" zT. ziemlich gravierende Dinge und wissen es gar nicht, weil das was wir akzeptieren uns überhaupt nicht angeschaut haben. Rein rechtlich gesehen, haben wir damit später wahrscheinlich keinerlei Handhabe mehr dagegen vorzugehen. Eventuell (zugegeben sehr selten) hilft manchmal sogar dieses einfach abzulehnen wenn es einen solchen Button gibt, dann kommt die Aufforderung zwar das nächste mal beim Start des Programms wieder, aber in der Zwischenzeit werden vom Programm keine Sicherheitsrelevanten Dinge eingesammelt und "Nach-Hause" geschickt.<br />
<br />
Bei der Erstellung unserer Passwörter sollten wir durchaus einen Unterschied zwischen Wichtig, Privat, Allgemein, Dienstlich, Onlineshop, Bank usw machen. Dabei ist nicht nur gemeint nicht die gleichen Passwörter überall zu verwenden, sondern auch die Passwörter für jeden Bereich nach anderen Richtlinien zu erstellen. Gelegentlich mal im Browser nachschauen, was jetzt wirklich alles für Passwörter gespeichert sind, und dann eventuell auch mal das eine oder andere dort aus der Liste wieder löschen, ist bestimmt auch keine schlechte Idee. <br><br />
Ob es praktisch ist überall wirklich "Random-Passwörter" zu verwenden, die wir zwingend immer entweder aufschreiben oder irgendwo im Browser oder in einem Passwort-Safe aufbewahren müssen? Sowas ist für einen Menschen extrem schwierig zu merken. Wenn man bedenkt wie sicher ein Spickzettel ist, meist ist er weg wenn man ihn braucht, und in welcher Hosentasche er verschwunden ist wird sich meist niemals klären. Wie sicher der Browser ist, haben wir hier eindeutig im Artikel bewiesen. Passwort-Safe ist aber schließlich und letztendlich auch nur ein Stück Software. Das einzige das ein Computer so schnell nicht knacken kann, ist das was nur bei uns im Kopf steht. Und was nur bei uns im Kopf gespeichert ist, kann man aber vielleicht auch schon mit nur einer "Bratwurst" als Belohnung wieder herauspressen, kommt ganz auf den Druck und die Argumente an, die ein anderer dafür einsetzt. <br><br />
<br />
Einfach mal drüber nachdenken, das ist schon Aller Anfang von Sicherheit.</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=LinuxClubWiki:Spielwiese&diff=32141LinuxClubWiki:Spielwiese2015-09-06T16:35:40Z<p>Robi: Änderungen von Robi (Diskussion) wurden auf die letzte Version von Escho zurückgesetzt</p>
<hr />
<div>'''Die Spielwiese dient zum Ausprobieren für Wiki-Newbies''' --[[Benutzer:Yehudi|Yehudi]] 15:11, 18. Okt 2006 (CEST)<br />
[[Category:LinuxClubWiki]]<br />
* http://de.wikipedia.org/wiki/Vorlage:Bitte_erst_NACH_dieser_Zeile_schreiben%21_%28Begr%C3%BC%C3%9Fungskasten%29 wäre eine Vorlage.<br />
<br />
<br />
== Tabellenspiele ==<br />
=== Tabelle 1 erstellt mit Openoffice ===<br />
(Table-of-Content mal rechts erwzungen eingefügt){{TOC-BOX-Rechts|30%}}<br />
{| class="prettytable"<br />
| ee<br />
| ff<br />
|-<br />
| gg<br />
| hh<br />
<br />
|}<br />
''Tabelle 1: class="prettytable"''<br />
<br />
<br />
=== Tabelle 2 = Tabelle 1 editiert ===<br />
{| border=1<br />
| ee<br />
| ff<br />
|-<br />
| gg<br />
| hh<br />
<br />
|}<br />
''Tabelle 2: border=1"''<br />
<br />
=== Tabelle 3: Testtabelle, die noch nicht so funktioniert, wie sie soll ===<br />
{| class="prettytable"<br />
|-class="hintergrundfarbe5"<br />
! Name || Regierungszeit || Abstammung<br />
|-<br />
| [[Stephan II. (Bayern)|Stephan&nbsp;II.]] || <tt>1347–1375</tt>Herzog von Bayern || Sohn Kaiser Ludwigs&nbsp;IV.<br />
|-<br />
| [[Friedrich der Weise (Bayern)|Friedrich]] || <tt>1375–1393</tt> Herzog von Bayern-Landshut || Sohn Stephans&nbsp;II.<br />
|-<br />
| [[Heinrich XVI. (Bayern)|Heinrich&nbsp;XVI.]] || <tt>1393–1450</tt> Herzog von Bayern-Landshut || Sohn Friedrichs<br />
|-<br />
| [[Ludwig IX. (Bayern)|Ludwig&nbsp;IX.]] || <tt>1450–1479</tt> Herzog von Bayern-Landshut || Sohn Heinrichs&nbsp;XVI.<br />
|-<br />
| [[Georg (Bayern)|Georg]] || <tt>1479–1503</tt> Herzog von Bayern-Landshut || Sohn Ludwigs&nbsp;IX.<br />
|}<br />
''Tabelle 3: Testtabelle von hier: http://de.wikipedia.org/wiki/Hilfe:Tabellen<br />
<br />
=== Tabelle 4: Veränderte Tabelle 3 ===<br />
{|border=1| class="prettytable"<br />
|-style="background-color:#FF8080;"<br />
! Name || Regierungszeit || Abstammung<br />
|-<br />
| [[Stephan II. (Bayern)|Stephan&nbsp;II.]] || <tt>1347–1375</tt>Herzog von Bayern || Sohn Kaiser Ludwigs&nbsp;IV.<br />
|-<br />
| [[Friedrich der Weise (Bayern)|Friedrich]] || <tt>1375–1393</tt> Herzog von Bayern-Landshut || Sohn Stephans&nbsp;II.<br />
|-<br />
| [[Heinrich XVI. (Bayern)|Heinrich&nbsp;XVI.]] || <tt>1393–1450</tt> Herzog von Bayern-Landshut || Sohn Friedrichs<br />
|-<br />
| [[Ludwig IX. (Bayern)|Ludwig&nbsp;IX.]] || <tt>1450–1479</tt> Herzog von Bayern-Landshut || Sohn Heinrichs&nbsp;XVI.<br />
|-<br />
| [[Georg (Bayern)|Georg]] || <tt>1479–1503</tt> Herzog von Bayern-Landshut || Sohn Ludwigs&nbsp;IX.<br />
|}<br />
''Tabelle 4: Testtabelle von hier: http://de.wikipedia.org/wiki/Hilfe:Tabellen mit Änderungen<br />
<br />
<br />
<br />
=== Ubuntu Tabelle ===<br />
Hier nochmal eine farbige Tabelle als Vorlage und Spielwiese:<br />
<br />
{|border=1 |class="prettytable"<br />
|+ '''Versionen von Ubuntu im Überblick'''<br />
|-----<br />
!- style="background-color:#ececec;" | Version <br />
!- style="background-color:#ececec;" | Codename <br />
!- style="background-color:#ececec;" | Veröffentlichung <br />
!- style="background-color:#ececec;" | Bemerkung<br />
|-<br />
|style="background-color:#FF8080;"| 4.10 ||style="background-color:#FF8080;"| Warty Warthog ||style="background-color:#FF8080;"| 20.10.2004 ||style="background-color:#FF8080;"| Nicht mehr unterstützt!<br />
|-<br />
|style="background-color:#FF8080;"| 5.04 ||style="background-color:#FF8080;"| Hoary Hedgehog ||style="background-color:#FF8080;"| 08.04.2005 ||style="background-color:#FF8080;"| Nicht mehr unterstützt!<br />
|-<br />
|style="background-color:#FF8080;"| 5.10 ||style="background-color:#FF8080;"| Breezy Badger ||style="background-color:#FF8080;"|13.10.2005 ||style="background-color:#FF8080;"| Nicht mehr unterstützt!<br />
|-<br />
|style="background-color:#B3B7FF;"| 6.06 ||style="background-color:#B3B7FF;"| Dapper Drake ||style="background-color:#B3B7FF;"| 01.06.2006 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#B3B7FF;"| 6.06.1 ||style="background-color:#B3B7FF;"| Dapper Drake Point One ||style="background-color:#B3B7FF;"| 10.08.2006 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#B3B7FF;"| 6.10 ||style="background-color:#B3B7FF;"| Edgy Eft ||style="background-color:#B3B7FF;"| 26.10.2006 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#B3B7FF;"| 7.04 ||style="background-color:#B3B7FF;"| Feisty Fawn ||style="background-color:#B3B7FF;"| 19.04.2007 ||style="background-color:#B3B7FF;"| Wird noch unterstützt<br />
|-<br />
|style="background-color:#A0DDA0;"| '''7.10''' ||style="background-color:#A0DDA0;"| '''Gutsy Gibbon''' ||style="background-color:#A0DDA0;"| '''18.10.2007''' ||style="background-color:#A0DDA0;"| '''Derzeit aktuelle Version!'''<br />
|-<br />
|style="background-color:#FFFF80;"| 8.04 ||style="background-color:#FFFF80;"| Hardy Heron ||style="background-color:#FFFF80;"| April 2008 (geplant) ||style="background-color:#FFFF80;"| Geplante Version<br />
|}<br />
<br />
Das Ding stammt aus dem [[Ubuntu]] Artikel. Wenn man selbst nicht weiß, wie man sowas bastelt, klaut man es sich halt zusammen und passt es an seine Bedürfnisse an. ;-) So haben wir wohl alle anfangs gearbeitet. :-)<br />
<br />
<br />
== Überschrift2 ==<br />
Das neue Jahr hat begonnen<br />
<br />
=== <font color="gray"> Überschrift3 </font> ===<br />
Die heiligen drei Könige waren schon hier<br />
<br />
==== <font color="silver"> Überschrift4 </font> ====<br />
Viel Arbeit<br />
<br />
== <font color="maroon"> Überschrift2 </font> ==<br />
Das neue Jahr hat begonnen<br />
<br />
=== <font color="black"> Überschrift3 </font> ===<br />
Die heiligen drei Könige waren schon hier<br />
<br />
==== <font color="gray"> Überschrift4 </font> ====<br />
Viel Arbeit<br />
<br />
<br />
<br />
<br />
== Farben ==<br />
<br />
=== <font color="black"> black </font> ===<br />
=== <font color="maroon"> maroon </font> ===<br />
=== <font color="green"> green </font> ===<br />
=== <font color="olive"> olive </font> ===<br />
=== <font color="navy"> navy </font> ===<br />
=== <font color="purple"> purple </font> ===<br />
=== <font color="teal"> teal </font> ===<br />
=== <font color="gray"> gray </font> ===<br />
=== <font color="silver"> silver </font> ===<br />
=== <font color="red"> red </font> ===<br />
=== <font color="lime"> lime </font> ===<br />
=== <font color="yellow"> yellow </font> ===<br />
=== <font color="blue"> blue </font> ===<br />
=== <font color="fuchsia"> fuchsia </font> ===<br />
=== <font color="aqua"> aqua </font> ===</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Online_Passw%C3%B6rter&diff=32140Diskussion:Online Passwörter2015-09-06T16:34:36Z<p>Robi: Demoscript</p>
<hr />
<div>== Demo Script zum Beitrag ==<br />
<br />
<br />
'''Achtung:''' <br />
:::Wer an diesem Script aus welchen Gründen auch immer rumspielen will, viel Spaß ;-)<br />
::: Es steht dort einer Kommentarzeile etwas an das man sich dann erinnern sollte.<br />
# PLEASE DO NOT EDIT : the script includes modifying protection<br />
<br />
<br />
'''Einschränkungen:''' <br />
:::* Es ist nur möglich die Passwörtern anzuzeigen wenn man selbst der Besitze des entsprechenden Firefox-Profiles ist, root kann also nicht einfach so sich die Passwörter von allen Usern auf dem System anschauen.<br />
:::* Das Script läuft nur unter der '''bash''', "'''sh scriptname'''" wird eventuell nicht ausreichen. Entweder "'''bash scriptname'''" oder Ausführungsrechte auf das Script und dann "'''./scriptname'''"<br />
:::* Für Firefox kleiner als Version 32 ist eventuell das kleine Paket '''sqlite3''' zu installieren, manchmal ist es nicht installiert, da dieses bei den aktuellen Versionen aber sowieso nicht mehr benötigt wird, wurde darauf verzichtet die Daten auch ohne sqlite3 aus der Datei zu holen.<br />
<br />
<br />
<br />
<pre><br />
#!/bin/bash<br />
# Firefox can store usernames and passwords that you used to access online services<br />
# This script can decrypt and displays this data<br />
# Autor : robi@linux-club.de V 1.6 (26.08.2015)<br />
<br />
# Usage : bash scriptname [ directory ] <br />
<br />
# PLEASE DO NOT EDIT : the script includes modifying protection<br />
<br />
function h2x(){ echo -n "$1" | sed 's/\(..\)/\\x\1/g'; };<br />
function a2h(){ echo -n "$1" | xxd -p -c 256 - ;};<br />
function h2b(){ H=$(h2x $1) ; echo -en "$H"; };<br />
function sha1(){ h2b "$1$2" | sha1sum | sed 's/\(.\{40\}\).*$/\1/'; };<br />
function hmac(){ h2b "$1$2" | openssl dgst -sha1 -hmac "$(h2b $3)" 2>/dev/null | sed 's/.*= //'; };<br />
function asn1(){ h2b "$2" |openssl asn1parse -inform $1 ${3:+ -strparse $3} 2>/dev/null;}; <br />
function des3(){ h2b "$1" | openssl des3 -K "$2" -d -iv "$3" 2> /dev/null ; };<br />
function check(){ sed 's/[ \t]//g;/^$/d' $1|sha1sum |awk '{printf("%c",strtonum("0x" substr($1,4,8))%26+97)}';};<br />
function signon_sql(){ sqlite3 "$1" "SELECT hostname,encryptedUsername,encryptedPassword FROM moz_logins;"; };<br />
function logins_json(){ sed 's/\({"id"\)/\n\1/g' "$1" | awk -F'"' 'NR==1{next;};{print $6, $24, $28}'; };<br />
function asn1_b64(){ echo -n $1 | base64 -d | openssl asn1parse -inform DER 2>/dev/null; };<br />
function parse(){ asn1_b64 $1 |awk -F':' '$3~/OBJECT/{D=$4};$3~/HEX DUMP/{if($4~/^F80*1$/)next;(!IV)?IV=$4:P=$4;if(P){print P,IV,D;exit; };}' ;};<br />
function moz_decode(){ read P IV D < <(parse $2);echo -n $P |xxd -r -p |openssl $D -K "$1" -d -iv "$IV" 2>/dev/null; };<br />
<br />
if ! which sqlite3 >& /dev/null <br />
then<br />
echo "Package \"sqlite3\" is required up to Firefox version 31" ;<br />
echo "but is not mandatory with newer Firefox versions" ;<br />
NOSQLITE=1 ;<br />
fi ; <br />
<br />
if [ $# -ge 1 ]<br />
then<br />
DIR="$1" ;<br />
else<br />
DIR="$HOME/.mozilla/firefox" ;<br />
if [ -r "$DIR/profiles.ini" ]<br />
then<br />
DIR=${DIR}/$(awk -F '=' '/Name=default/{F=1;};<br />
($1=="Path"&&F==1){print $2;exit;}' "$DIR/profiles.ini") ; <br />
fi<br />
fi<br />
if [ -d "$DIR" -a -r "$DIR" ]<br />
then <br />
if [ -O "$DIR/key3.db" ]<br />
then<br />
KEY3="$DIR/key3.db" ;<br />
LOGINS="$DIR/logins.json" ;<br />
SIGNONS="$DIR/signons.sqlite" ;<br />
if [ ! -r "$LOGINS" ]; then LOGINS=""; fi<br />
if [ ! -r "$SIGNONS" ]; then SIGNONS=""; fi<br />
fi<br />
fi<br />
if [ -z "$SIGNONS" -a -z "$LOGINS" ]<br />
then <br />
echo "Error: Can not find or read Firefox profile data at \"$DIR\" for userID= \"$UID\""; <br />
echo -e "\nUsage: bash $0 /home/USERNAME/.mozilla/firefox/DIR.default \n" ;<br />
echo "\"DIR.default\" should be your user profile directory of Firefox" ;<br />
exit ; <br />
fi<br />
<br />
echo -e "\n" ;<br />
read gs ES PW CS priv_key < <(xxd -p -c 256 "$KEY3" |awk --re-interval '$0 ~/^f*$/{next};<br />
$0 ~/^0*$/{next};<br />
$0~/76c6f62616c2d73616c74/{match($0,"676c6f62616c2d73616c74");<br />
gs=substr($0,RSTART-40,40);<br />
h=strtonum("0x" substr($0,RSTART+24,2));<br />
ES=substr($0,RSTART+28,2*h);<br />
match($0,"70617373776f72642d636865636b");<br />
CS=substr($0,RSTART,26);<br />
PW=substr($0,RSTART-32,32)};<br />
$0 ~/f80{29}1/{match($0,"f80{29}1");<br />
priv=substr($0,(RSTART-286),286)};<br />
END{print gs,ES,PW,CS,priv} ;<br />
')<br />
if [ -z $priv_key ] ; then echo "This key3.db does not have encrypted passwords"; exit; fi;<br />
read -s -e -p "Enter your Firefox Master Password: " A ; <br />
echo -e "\n" ; <br />
MP=$(a2h "$A") ; unset A ;<br />
HP=$(sha1 $gs $MP) ;<br />
for ((L=0;L<2;L++))<br />
do<br />
PES="${ES}00000000" ;<br />
PES=${PES::40} ;<br />
CHP=$(sha1 $HP $ES) ;<br />
k1=$(hmac $PES $ES $CHP) ;<br />
tk=$(hmac $PES "" $CHP) ;<br />
k2=$(hmac $tk $ES $CHP) ;<br />
k=$k1$k2 ;<br />
key=${k::48} ;<br />
iv=${k:64:16} ;<br />
if [ $L -eq 0 ] && [ "$(h2b $CS$(check $0))" != "$(des3 $PW $key $iv)" ] <br />
then <br />
echo "Error: The original script has be manipulated or Master Password is incorrect" ;<br />
exit ;<br />
fi<br />
if [ $L -eq 1 ]<br />
then<br />
OUTPUT=$(des3 $PW $key $iv | xxd -p -c256 - ) ;<br />
OFFSET=$(asn1 DER $OUTPUT | awk -F ':' '$3 ~ /HEX DUMP/{print $1+0; exit}') ;<br />
KEY=$(asn1 DER $OUTPUT $OFFSET |awk -F ':' 'length($4)>=48{P=substr($4,length($4)-48);print P;exit}') ;<br />
continue ;<br />
fi<br />
read ES PW < <(asn1 DER $priv_key | awk -F':' '$3 ~ /HEX DUMP/{printf("%s ",$4)};END{;};')<br />
done<br />
if [ -z "$NOSQLITE" -a -n "$SIGNONS" ]<br />
then<br />
echo {-,-,-}{-,-,-}- signons.sqlite --- Firefox \< V.32 {-,-,-}{-,-,-}- <br />
IFS='|';<br />
signon_sql "$SIGNONS" | while read URL USERN PASSWD <br />
do <br />
unset IFS;<br />
printf "%-50s%-50s%-15s\n" $URL $(moz_decode $KEY $USERN) $(moz_decode $KEY $PASSWD); <br />
IFS='|';<br />
done<br />
unset IFS;<br />
echo<br />
fi <br />
if [ -n "$LOGINS" ]<br />
then<br />
echo {-,-,-}{-,-,-}- logins.json ----- Firefox \>= V.32 {-,-,-}{-,-,-}- <br />
logins_json "$LOGINS" | while read URL USERN PASSWD<br />
do<br />
printf "%-50s%-50s%-15s\n" $URL $(moz_decode $KEY $USERN) $(moz_decode $KEY $PASSWD); <br />
done;<br />
fi<br />
echo <br />
exit<br />
</pre></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Online_Passw%C3%B6rter&diff=32139Online Passwörter2015-09-06T16:02:53Z<p>Robi: Freigabe mit Empfehlung es auch mal zu lesen</p>
<hr />
<div>{{Lesenswert}}<br />
<br />
Dieser Beitrag dreht sich um die vielen Passworte die wir für die unzähligen Onlinedienste benötigen.<br />
<br />
Firefox (steht aber hier nur stellvertretend für alle anderen Web-Browser) kann Benutzernamen und Kennwörter die ihr für Online-Dienste verwendet auch speichern und wenn ihr die jeweilige Seite später wieder ansteuert, dort eure gespeicherten Anmeldedaten automatisch wieder eingeben oder euch automatisch anmelden. Das ist bequem, spart Zeit und man braucht sich nicht mehr ganz so viele Passwörter zu merken. Eine gute Idee, wenn man bedenkt bei wie vielen Internetseiten man sich heute anmelden muss. Dieser Artikel soll auch für den Laien etwas Licht in diesen Vorgänge und der damit in Zusammenhang stehenden "große Blackbox" mit Namen Verschlüsselung bringen. Es soll aufgezeigt werden, das "Gut verschlüsselt" nicht unbedingt auch "Sicher" bedeutet. die Beschreibung "verschlüsselt übertragen" nicht gleichzusetzen ist mit "verschlüsselt gespeichert", und dieses wiederum nicht, das "verschlüsselt gespeichert" nicht gleichzusetzen mit "von niemanden lesbar", und das eine "anonyme Auswertung" nicht unbedingt nur das ist, was ihr euch darunter vorstellen könnt. Es ist das Ziel hier etwas Aufklärung zu leisten und mit diesem Artikel einen normalen Anwender ein klein wenig Hintergrundwissen rund um den dem Umgang solcher Internetpasswörter zu vermitteln.<br><br />
Nebenbei soll versucht werden bei wenigstens den Lesern dieses Artikels ein klein wenig mehr Interesse und Verantwortungsbewusstsein zu erzeugen welche Daten von den großen und kleine Datenkraken von euren Geräten abgegriffen werden können und auch werden, spätestens nachdem ihr ihr sorglos die Nutzungs- und Datenschutzbestimmungen der vielen kleinen und großen "hilfreichen" Tools bei der Installation einfach akzeptiert habt. <br />
<br />
Grundlage für die Recherchen und Beispiele hier ist Firefox, aber eigentlich ist das in jedem Webbrowser gleich oder zu mindestens sehr ähnlich.<br />
<br />
<br />
== Passwörter und Browser ==<br />
<br />
Passwörter sind heute unser täglicher Begleiter. Sie begegnen uns überall und besonders oft, wenn wir mit dem Webbrowser im Internet unterwegs sind.<br />
Die Beschreibungen, Erklärungen und Hilfen in den [https://support.mozilla.org/de/kb/Einstellungen-Fenster%20-%20Sicherheits-Abschnitt#w_passwairter Browserdokus] sind leider oft sehr dürftig und selbst einfache aber sehr wichtige Dinge im Umgang mit Passwörtern werden von vielen einfach aus Unkenntnis oder Sorglosigkeit ignoriert, zB das setzen von [https://support.mozilla.org/de/kb/Gespeicherte-Passwoerter-mit-einem-Master-Passwort-schuetzen Masterpasswörtern].<br><br />
<br />
<br />
<br />
== Passwortspeicherung auf dem Ziel-Server ==<br />
<br />
Beschäftigen wir uns erstem damit wie die vielen Passwörter auf den Servern im Internet gespeichert werden.<br><br />
Damit der Server euch eindeutig erkennen kann und auch eure Daten für euch verwalten kann benötigt man meistens einen Account dort auf dem Server. Zu diesem gehört ein Passwort mit dem ihr euch anmelden müsst. Dieses muss auf dem Server irgendwie gespeichert sein. Schauen wir uns mal an wie.<br />
<br />
=== Passwort Hash ===<br />
Meistens werden die Passwörter nur für die Authentifizierung benötigt, bedeutet das verschlüsselte Passwort das gespeichert wird, muss nicht wieder entschlüsselt werden. Es ist also nur eine Einwegfunktion erforderlich. Zur Überprüfung wird das vom User eingegebene Passwort nach der selben Methode verschlüsselt und das Ergebnis mit dem gespeicherten Wert verglichen. Zum Einsatz kommen hier meistens [https://de.wikipedia.org/wiki/Kryptologische_Hashfunktion Hashfunktionen] und das verschlüsselte Passwort ist dann der Hash.<br><br />
In der Praxis werden dazu fertige Passwort-Hash-Funktionen verwendet, hier soll mal mit einfachen Bash Kommandos die prinzipielle Funktion demonstriert werden. <br />
Stark vereinfacht und nur zur Demo. wir verwenden [http://linux.die.net/man/1/md5sum md5sum] danach wird das noch in ein [https://de.wikipedia.org/wiki/Base64 base64 Format] umgewandelt, unser Passwort lautet "Test" <br />
# echo -n "Test" | md5sum | cut -f1 -d " "| base64<br />
MGNiYzY2MTFmNTU0MGJkMDgwOWEzODhkYzk1YTYxNWIK<br />
<br />
Das Ergebnis ist jetzt der Passworthash der wird in einer Passwortdatenbank oder ähnlichem gespeichert. Wollen wir uns wieder anmelden, geben wir "Test" als Passwort ein, und es entsteht dort wieder der selbe Hash in der Hashfunktion, das wird mit dem gespeicherten vergleichen und damit haben wird uns ausreichend autorisiert und erhalten Zugang.<br><br />
Der Nachteil, das Ganze ist leicht angreifbar. Wenn wir zB in die Passwortdatenbank schauen würden könnten wir sofort erkennen wenn 2 User das selbe Passwort benutzen würden. Und was noch viel schlimmer ist, nur mit die Kenntnis der verwendeten Hashfunktion könnten wir noch bevor wir überhaupt in die Datenbank schauen uns von ein paar tausend Wörtern schon einen Hashwert erzeugen, und würden nur noch nachschauen, ob von den von uns erzeugten Hashwerten zufällig welche in der Passwortdatenbank sind. Das wäre dann ein [https://de.wikipedia.org/wiki/W%C3%B6rterbuchangriff Wörterbuchangriff] wenn wir der Reihe nach alle möglichen Kombinationen der Buchstaben ausprobieren würden, hatten wir dann einen [https://de.wikipedia.org/wiki/Brute-Force-Methode Brute Force Angriff] und für solche ganz einfachen Funktionen wie '''md5''' gäbe es sogar komplette Tabellen mit Hashwerten [https://de.wikipedia.org/wiki/Rainbow_Table Regenbogen Tabelle]<br> <br />
<br />
==== SALT ====<br />
Um das etwas sicher zu machen, kann der Hash [https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29#Salt versalzen] werden. Dazu wird jedes mal wenn ein Passwort abgespeichert werden soll, erst eine zufällige Zeichenfolge gebildet der sogenannte SALT. Diese SALT wird jetzt zB dem Userpasswort vorangestellt und dann mit diesem zusammen verarbeitet und damit der Hashwert gebildet. Da aber genau der selbe zufällige SALT wieder benötigt wird bei der Passwort Überprüfung, muss dieser SALT auch jeweils mit dem entsprechendem Passwort zusammen gespeichert werden.<br><br />
Auch dazu ein vereinfachtes mit einfachen Befehlen nachgestelltes Beispiel zum spielen. SALT wird hierbei mit der Random-Funktion der Bash erzeugt und dann mit einem Punkt getrennt vor dem Hashwert gesetzt und mit diesem abgelegt.<br />
# SALT="$(printf "%04X" $RANDOM)";echo ${SALT}.$(echo -n "${SALT}Test"|md5sum|cut -f1 -d " "|base64)<br />
5A11.NWE5MDk5MzEzMTIwODczNzZjYmMzMjEyYmQ0N2JlYTYK<br />
Das "'''5A11'''" ist der von uns zufällig erzeugte SALT und nach dem Punkt kommt der Hash der vom SALT+Passwort erzeugt wurde.<br><br />
Diese erzeugt jetzt selbst bei gleichem Passwort immer einen anderen Hash, und wenn so etwas jemand knacken wollte, musste er als erstes den kompletten gespeicherten Hash+Salt in die Hand bekommen, die verwendete Hashfunktion wissen, und wissen wo und wie SALT und Passwort vermischt wurden. Dann allerdings könnte er aber immer noch mittels Wörterbuch oder Brute-Force angreifen. Aber er müsste für jeden einzelnen Eintrag in der Datenbank neu rechnen und könnte durch die unterschiedlichen SALT-Werte ein Ergebnis nicht mit allen anderen Werten in der Datenbank vergleichen. Aber wenn er die Datenbank angreifen und knacken kann, könnte er immer noch auch die Hashwerte in der Datenbank gegen selbst erstellte austauschen und sich so Zugang zu den Userkonten verschaffen. Die richtigen User wären dann aber mit ihren dann nicht mehr funktionierenden Passwörtern ausgesperrt, dass fällt also schnell auf.<br />
<br />
==== PEPPER ==== <br />
Um das jetzt noch komplizierter und vor allem sicherer zu machen, könnte man das noch [https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29#Pepper pfeffern]. Der PEPPER wäre noch eine zusätzliche Zeichenfolge mit der Passwort und der SALT vermischt wird, zB hinten angehängt. Der PEPPER ist jedoch jetzt für alle Passworte gleich und wird NICHT mit dem Passworthash zusammen abgespeichert sondern liegt gut geschützt irgendwo auf dem Rechner. Spätestens jetzt würden rein mathematisch alle normalen Angriffsmethoden ohne Kenntnis des PEPPER hier irgendwelche Passworte zu knacken zur Jahrhundertaufgabe für ganze Rechenzentren.<br />
<br />
==== Ausnahmen ====<br />
Die oben aufgezeigten Methoden der Speicherung mit dem Passwort Hash sind typisch, und diese werden wir oft mit verschiedenen Algorithmen und Ausprägungen auch im Internet vorfinden wenn wir uns dort anmelden und einen User anlegen. Dennoch kann es gelegentlich vorkommen, das uns ein solcher Anbieter bei dem wir ein Passwort angegeben haben, im Falle wir hätten das Passwort vergessen uns unser eigenes Passwort per Mail zuschicken. Nicht etwa ein temporäres Neues, nein das Passwort das wir vorher irgendwann mal eingegeben haben. In diesem Fall sollten sofort die Alarmglocken klingen. Entweder die Passwörter dort sind überhaupt nicht gesichert und der Betreiber hat wenig Ahnung und Verständnis von Sicherheit, oder sie sind verschlüsselt dort auf dem Server gespeichert und können dort aber unkompliziert vom Betreiber und scheinbar sogar automatisch vom Server entschlüsselt werden. Alle Infos die man benötigen würde um die gesamte Passwortdatenbank zu entschlüsseln liegen dann mit auf diesem Server und sind diesem im Onlinemode bekannt. Würde solch ein Server ernsthaft professionell und bösartig angegriffen werden, erlangt der Angreifer eventuell an alle dort gespeicherten Informationen.<br><br />
Sollte euch so ein Server im Internet auffallen, dann ist es empfehlenswert schon vorzeitig alle eventuell gleichen Passwörter auf anderen Seiten umzustellen und das Passwort das ihr dort verwendet habt, nirgends anders zu verwenden. Man sollte sich gut überlegen was man auf solchen Plattformen für Informationen angibt und was man dort macht. <br />
<br />
=== Wie sicher sind die Passwörter auf dem Server ===<br />
Damit können wir eigentlich sicher sein, dass unser Passwörter im Internet auf den Servern gut verschlüsselt gespeichert sind, ja besser, eigentlich sind sie gar nicht dort gespeichert, sondern nur der Hash davon, und aus dem Hash lässt sich mit mathematischen oder anderen Funktionen kein Passwort errechnen, man müsste schon verschiedene/viele/unzählige Passwörter ausprobieren, um zufällig das richtige zu erwischen.<br><br />
Aber die Speicherung ist nicht alles. Bevor ein Passworthash erstellt werden kann, muss das Passwort erst einmal irgendwie in den Server hinein kommen und ist dort bis zur Verhashung auch irgendwo wirklich in Form von Bits und Bytes da. Es ist also möglich es in dieser Zeit aus dem Speicher zu lesen, bzw. noch besser es mit Tracing- oder Debug-Methoden abzufangen und in Logs zu schreiben. Gehen wir mal davon aus, die Serverbetreiber sind alles zuverlässige und sicherheitsbewusste Leute, dann werden sie solche Indiskretionen auf ihren Servern nicht dulden, und auch mit genügend Sicherheitsmaßnahmen dafür sorgen, dass niemand anders es auf ihren Servern heimlich machen kann.<br><br />
Im Gegensatz zu anderen Verschlüsselten Daten die auf den Servern abgelegt sein können, sind also die reinen Passwörter verhältnismäßig gut geschützt. Zwar hört man hin und wieder mal das bei Hackerangriffen auch Passwörter im großen Stiel dort abgezapft worden sind, doch beim näheren Hinschauen würde man feststellen es handelt sich meist nur um die Datenbank mit den gespeicherten Passworthash. <br />
<br />
<br />
<br />
<br />
== Passwort Transport zum Server ==<br />
<br />
Irgendwie muss aber das Passwort das ihr eingebt ja erst mal bis zum dem Server im Internet kommen bei dem ihr euch anmelden wollt.<br />
Im Browser habt ihr mehr oder weniger schön eine Anmeldeseite, diese enthält ein [https://de.wikipedia.org/wiki/Base64 Formular]. Dort setzt ihr Username und Passwort rein, und dann schickt ihr das los. Euer Passwort wird dabei entweder ganz unverschlüsselt im Klartext oder relativ leicht entschlüsselbar (ehr zu bezeichnen als nicht direkt lesbar) einfach mit den anderen Formulardaten an den Server geschickt.<br />
<br />
=== Transport über HTTP ===<br />
<br />
HTTP ist das normale unverschlüsselte Transport Protokoll für [https://de.wikipedia.org/wiki/Hypertext_Markup_Language HTML] und ähnliches das ihr im Browser anschaut. Ihr könnt es an der URL erkennen, dort steht "'''http://irgendwas.....'''". Zu erkennen ist das auch im Browser in der Adressenleiste, dort steht auch am Anfang "'''http://'''" oder neuerdings gar nichts mit "://" am Anfang. In diesem Fall würdet ihr euer Passwort also wirklich mehr oder weniger im Klartext bis zum Server schicken. Es geht dabei über viele Zwischenstationen (zB. Router) im Netz, und überall könnte das Passwort ausgelesen werden.<br><br />
Zugegeben den Postboten zu überfallen in der Hoffnung in irgend einem der vielen Briefe die er gerade ausliefert, steht etwas spannendes drin, ist eine schlechte Strategie. Aber im Internet ist vieles möglich und denkbar. Dort können irgendwo auf dem Weg bestimmte Protokolle ausgefiltert, Transportpakete dupliziert, ausgewertet und umgeleitet oder mit Debuging- oder Tracingfunktionen der Inhalt der Transport-Paketen absichtlich oder zufällig in Dateien abgespeichert werden. In einem solchem Transportpaket steht dann auch eure IP und die Adresse des Zielservers, mit etwas Aufwand ist das euch und die Funktion und Aufgabe die es auf dem Server erfüllen soll, eindeutig zuzuordnen. Euer Account auf dem Server also eigentlich nicht schwer zu knacken. Das die Transportpakete nicht nur gelegentlich mal im Netz in eine solche Falle laufen, sondern es eigentlich schon Standard ist, zeigen die Enthüllungsskandale rund um die Geheimdienste in letzter Zeit mehr als eindeutig.<br><br />
<br />
Wann ist jetzt der Transport von Passwörtern über HTTP denn dann überhaupt für einen User noch akzeptabel. Solange es sich nur um unbedeutende Userkennungen zB bei irgendwelchen allgemeinen Balaber-Foren geht, solange außer der Mailadresse alle anderen Angaben nicht gemacht werden müssen, und von euch auch nicht gemacht werden, kann man das noch akzeptieren. Sobald aber weitere persönliche Daten ins Spiel kommen, wie zB Tel., Adresse, Anschrift, Kontoverbindungen usw., Finger weg von HTML. Geht es gar um Online-Shops, Banken, .... sofort STOP.<br />
<br />
=== Transport über HTTPS === <br />
<br />
HTTPS ist jetzt das Sichere Transport Protokoll dazu. Dabei werden jetzt die einzelnen Pakete vom Server zu euch und wieder zurück verschlüsselt übermittelt. Ihr könnt auch das in der URL am "'''https://'''" im Browser eindeutig erkennen. Oft werden auch noch zusätzliche Sicherheitssymbole dort in der Browser Adressleiste zu erkennen sein. Beim Verbindungsaufbau von eurem Rechner zu einem solchem Dienst auf dem Server wird zwischen eurem Rechner und dem Server ausgehandelt mit welchem Verschlüsselungsalgorithmus und mit welchem zufälligem Schlüssel sich die beiden unterhalten. Wie das aushandeln genau funktioniert, ist etwas kompliziert aber man muss es auch gar nicht wissen. Es spielt sich dort eine ganze Menge Kryptographie ab, und es geht ein paar Mal hin und her, aber am Ende sind sich beide einig. Jemand der dieses Aushandeln beobachten würde, könnte nicht erkennen auf welchem geheimen Schlüssel sich die beiden jetzt geeinigt haben und somit kann er auch die nachfolgenden Pakete nicht entschlüsseln. So gesendete Daten und Passwörter werden also sicher und von anderen nicht auslesbar an den Server übertragen.<br><br />
<br />
Wenn auch das genaue Aushandeln der Verschlüsselung zwischen eurem Rechner und den Server unwichtig ist, wichtig dabei ist jedoch: Es geht hier unter anderem hierbei um ein Zertifikat vom Server, und das genau in dem Moment wenn ihr das erste mal mit HTTPS diesen speziellen Server ansprecht. Euer Browser (bzw ihr) müsst ein Zertifikat vom Server akzeptieren. In diesem Zertifikat steht unter anderem der public Key des Servers, und eine Menge Kryptografischer Kleinkram, wie die zugehörige URL, Gültigkeitszeitraum, Aussteller usw. Und, dieses Zertifikat muss von einem anderem Zertifikat mit dessen privaten Key signiert sein. Auch dieses Zertifikat wird von eurem Rechner benötigt. Der Sinn dahinter ist, das Zertifikat vom Server muss zwingend von einer Zertifizierungsstelle zertifiziert sein. Dabei wird von der Zertifizierungsstelle genau geprüft ob die Angaben im Zertifikat des Servers auch wirklich alle korrekt und richtig sind und auch zutreffen, und nicht das ein Zertifikat mit der URL von deutsche.dank.de mit einer Mailadresse und Aussteller von Max.Mustermann.gmail.com stammt. Der Betreiber des Servers müsste also ein paar Euro in die Hand nehmen und sich bei einer offiziellen Zertifizierungsstelle ein Zertifikat ausstellen lassen. In diesem Fall würdet ihr dieses gar nicht merken. Euer Browser kennt eine ganze Menge von Zertifikaten von offiziellen Zertifizierungsstellen und wenn mit diesen ein Serverzertifikat signiert ist wird er es automatisch akzeptieren wenn die Angaben im Zertifikat mit der aufgerufenen Seite übereinstimmen.<br><br />
<br />
Aber es gibt auch die Möglichkeit das sich der Betreiber eines Servers sich sein Serverzertifikat selbst signiert, das er also selbst für die Richtigkeit der Daten im Serverzertifikat bürgen will. Auch das geht, allerdings wird jetzt euer Browser eine Warnung bringen und euch fragen ob ihr das zulassen wollt. Voreinstellung dafür ist ablehnen, aber dann wird zu diesem HTTPS Server keine Verbindung aufgebaut. Wichtig hier nicht wahllos alles akzeptieren was dort rein kommt, und erst mal die Details des Zertifikates anschauen und euch gründlich überlegen ob ihr dieses wirklich akzeptieren wollt, eh ihr ein solches Zertifikat importiert. Einmal importiert ist es nicht ganz einfach dieses wieder loszuwerden. <br />
<br />
Auch sonst wird Eurer Browser die Daten in den Zertifikaten überprüfen und zB Alarm schlagen wenn dort was nicht stimmt, zB das der Server eine andere URL benutzt als die die in dem Zertifikat steht, oder die Gültigkeitsdauer überschritten ist. solche Warungen nicht einfach weg drücken sondern erst mal genauer anschauen, ob das denn eventuell eine mögliche und akzeptable Erklärung dafür gibt. Wenn zB bei einer Bankverbindung plötzlich so ein Zertifikat akzeptiert werden soll, STOP, eine Bank sollte durchaus genügend Geld haben um sich so etwas offiziell signieren zu lassen und auch genügend IT-Sicherheitsspezialisten die dieses richtig installieren und konfigurieren können.<br />
<br />
Warum hier wachsam sein? Es gibt da die Möglichkeit des [https://de.wikipedia.org/wiki/Man-in-the-Middle-Angriff]. Der geht auch bei HTTPS. Dabei gibt sich jemand anders als der von euch gewünschte Zielserver aus. Ihr wollt den Zielserver ansprechen, landet aber erstmal unbemerkt nur auf einer gefakten Seite und diese baut eine verschlüsselte Verbindung zu Euch auf. Auf der anderen Seite baut dieser Rechner mit der gefakten Seite gleichzeitig dann eine eigene verschlüsselte Verbindung zu eurem Zielserver auf. Es wird von diesem Rechner in der Mitte dann einfach alles eins zu eins von einer Seite auf die andere übertragen, allerdings innerhalb dieses Angriffsrechners in der Mitte der sonst verschlüsselten Verbindung ist alles unverschlüsselt und somit von Angreifer alles mitlesbar. Weder ihr noch euer Zielrechner wird das bemerken.<br />
Ein solcher Angriff auf HTTPS ist nicht ganz einfach und in der Regel Profiarbeit da meist auch andere Internetprokolle mit angegriffen werden müssen, damit die Verbindung umgeleitet werden kann, aber das ist theoretisch und auch praktisch möglich. Dieses kann mit den default Sicherheitseinstellungen die für HTTPS im Internet genutzt werden, nicht vollkommen ausgeschlossen werden, da sich nur der Zielserver und nicht auch euer Rechner eindeutig identifizieren muss. (Wie soll auch ein öffentlicher Server im Internet jeden anderen Rechner der irgendwann mal ihn sprechen will, schon vorher eindeutig identifizieren können). Einen solchen Angriff wird dadurch begünstigen, in dem ihr zB ein nicht korrektes Zertifikat leichtsinnigerweise importiert.<br />
<br />
=== Wie sicher sind die Passworte beim Transport ===<br />
Zusammenfassend können wir also sagen, solange wir nur mit HTML arbeiten, sind die Passwörter komplett ungeschützt. Bei HTTPS haben wir wesentlich mehr Sicherheit, aber auch da gibt es durchaus von unserer Seite ein paar Dinge die wir nicht leichtsinnig übergehen sollten. Die eigentliche Sicherheit im Netz ist damit nur die "relative" Anonymität inmitten und zwischen Milliarden von Datenpaketen die dort ständig kursieren. Angriffe dort sind kompliziert da irgendwo direkter Zugriff auf die Hardware von großen Netzen benötigt wird, oder Netzwerk Protokolle angegriffen werden müssen. Wir wollen mal davon aus gehen, dass Mitarbeiter die irgendwo Administrativ an großen Netzwerknoten arbeiten auch ausreichend Sicherheitstechnisch geschult sind, dass sie unbeabsichtig und zufällig in Logdateien eingefangene Informationen nicht nach außen tragen oder verkaufen. Größeres Risiko ist dort zu erwarten, wo die Datendichte nicht all zuhoch und schon spezifisch auf entweder EUCH oder dem Server ausgefiltert ist, also zB unmittelbar vor eurem Zielserver oder unmittelbar hinter eurem Router bis zum ersten größerem Netzwerkknoten. Aber leider gibt es staatlich geförderte und allumfassende Überwachung mitten im Herzen der Netze und außerdem wissen wir auch nicht immer was unsere Internetprovider so alles machen. <br />
<br />
<br />
<br />
<br />
<br />
== Gespeicherten Passwörter im Firefox ==<br />
<br />
Wenn sich Firefox ( natürlich jeder andere Browser auch) ein Passwort für eine Anmeldung im Internet gemerkt hat, dann muss/kann es von Firefox beim nächsten Anmelden an dieser Seite automatisch richig in das Anmeldeformular eingetragen werden. Aber im Klartext, genau so, als wenn ihr es selbst eingeben würdet. Es muss das Passwort also so verschlüsselt gespeichert sein, dass daraus von Firefox wieder das Passwort entschlüsseln werden kann. Es kann also nicht wie oben gezeigt als Hash gespeichert sein. Das schauen wir uns jetzt mal beim Firefox an.<br />
<br />
Auf Linux befindet sich im Home Verzeichnis des Users ein verstecktes Verzeichnis "'''.mozilla'''". In einem Unterverzeichnis dann "'''firefox/.....default'''" (die Punkte sehen für eine zufälligen Wert, der bei jedem anders ist). Dort befinden sich jetzt die ganzen Profil und Einstellungsdaten von Firefox. Dort liegt auch die Datei mit den verschlüsselten Passwörten. Bis Firefox V31 war das eine [https://de.wikipedia.org/wiki/SQLite SQLITE Datenbank] namens '''signons.sqlite''' und ab V32 ist es ein [https://de.wikipedia.org/wiki/JavaScript_Object_Notation JSON-Dokument] und die Datei '''logins.json''' . Bei dem einem oder anderem ist es nach Updates auch möglich, das es beide Dateien gibt. Das Format von beiden ist unterschiedlich. Aber in beiden steht mindestens für jede gespeicherte Anmeldung die URL der Server im Klartext und jeweils dazu der verwendete Username und Passwort in verschlüsselter Form.<br><br />
Schauen wir uns mal so ein verschlüsseltes Passwort an:<br />
"encryptedPassword":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECOuP+FR+vfyGBBCeJ/HBWkYc5bbcKS3LvrLC"<br />
Ist natürlich wieder verpackt und wir können das noch etwas auspacken, um genauer zu sehen aus was das Passwort besteht.<br />
<pre><br />
0:d=0 hl=2 l= 58 cons: SEQUENCE <br />
2:d=1 hl=2 l= 16 prim: OCTET STRING [HEX DUMP]:F8000000000000000000000000000001<br />
20:d=1 hl=2 l= 20 cons: SEQUENCE <br />
22:d=2 hl=2 l= 8 prim: OBJECT :des-ede3-cbc<br />
32:d=2 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:EB8FF8547EBDFC86<br />
42:d=1 hl=2 l= 16 prim: OCTET STRING [HEX DUMP]:9E27F1C15A461CE5B6DC292DCBBEB2C2<br />
</pre><br />
Als ersteres sehen wir einen Hex Dump beginnend mit F800 und endet mit 0001. Das ist die SchlüsselID für den Key mit dem das zu entschlüsseln ist. (diese ist von Mozilla festgelegt und immer die gleiche ID)<br><br />
Weiter sehen wird "des-ede3-cbc" das ist das Verschlüsselungsverfahren.<br />
Dann kommt ein etwas kürzerer Hexdump dieses ist der Initialisierungsvektor (eine Art Voreinstellung des Verschlüsselungs-Algorithmus die für jedes Passwort immer anders ist)<br><br />
Und das untere ist jetzt letztlich das verschlüsselte Passwort.<br />
<br />
Das ist jetzt mehr als nur ausreichend gut verschlüsselt, denn ohne den Key von dem wir nur eine nichtssagende und immer gleiche ID haben, geht gar nichts. Das ist aber genau die Ausgangssituation wenn wir Firefox frisch gestartet haben. Auch Firefox kennt dann diesen Schlüssel noch nicht, und der steht auch nirgends auf dem Rechner. Erst wenn wir versucht haben uns irgendwo anzumelden oder einen neuen Passwort Eintrag irgendwo im auf einer Seite machen wollten, oder uns mit Firefoxmitteln die Passwörter anschauen wollten, wird der Schlüssel von Firefox gebildet und dazu werden wir eventuell vorher nach dem Masterpasswort gefragt. Denn wenn ein Masterpasswort gesetzt ist, kann Firefox von sich aus den richtigen Schlüssel gar nicht finden, dazu braucht er das Masterpasswort, und dieses ist nicht gespeichert, es muss also über Tastatur jedes mal neu eingegeben werden<br><br />
<br />
Hat Firefox jetzt aber einmal den Key erzeugt, dann bleibt diese im HauptSpeicher und Firefox kann mit dem Key dann beliebig oft Passworte entschlüsseln und braucht nicht noch einmal nach dem MasterPasswort zu fragen. Bis Firefox neu gestartet wird. Aber nicht nur Firefox kann jetzt auf den Key im Haupspeicher zugreifen, wahrscheinlich könnten alle Plugins die wir jetzt in Firefox gestartet haben auch darauf zugreifen. Also auch hier Vorsicht beim Installieren von Plugins für Firefox, auch hiermit könnte jemand ungewollt und von euch unbemerkt an die unverschlüsselten Passworte kommen und das obwohl ihr ein Masterpasswort gesetzt habt.<br />
<br />
<br />
=== Der privat Key zum Entschlüsseln ===<br />
<br />
Firefox muss den Schlüssel zum entschlüsseln des Passwort also nach dem Start immer erst einmal wieder neu erstellen, und zwar aus einem privat Key. Dieser privat Key wird erstellt wenn wir das erste mal ein Passwort speichern und befindet sich in einer Datei "key3.db" im selben Verzeichnis. <br><br />
Der private Key ist 143 Zeichen lang, und auch wieder ein bisschen verpackt, also packen wir mal einen aus, um zu schauen was da drin ist.<br />
<pre><br />
0:d=0 hl=3 l= 140 cons: SEQUENCE <br />
3:d=1 hl=2 l= 40 cons: SEQUENCE <br />
5:d=2 hl=2 l= 11 prim: OBJECT :1.2.840.113549.1.12.5.1.3<br />
18:d=2 hl=2 l= 25 cons: SEQUENCE <br />
20:d=3 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:47AD0F306E90E8BD83E37B2C96F2D06246794918<br />
42:d=3 hl=2 l= 1 prim: INTEGER :01<br />
45:d=1 hl=2 l= 96 prim: OCTET STRING [HEX DUMP]:7327975D5375063597378DB34DB2DBD9C7B8DB2FA440528E8E3A46B0981F44BC952A0A188F5079C31F34875AFFADC8D5BF57A....<br />
</pre><br />
Dieser besteht jetzt erst mal aus 2 wichtigen Bestandteilen, der kleinere Hexdump ist ein SALT und das größere (hier abgeschnitten) ist etwas verschlüsseltes. Wenn wir das entschlüsseln können, dann würden wir dort wiederum eine Verpackung finden in der ist dann die Key-ID und letztlich auch der richtige Key enthalten, mit dem wir die Passwörter wirklich entschlüsseln könnten. <br />
<br />
Allerdings soweit sind wir noch nicht, noch ist dieses nicht entschlüsselt. Wir haben einen SALT (funktionell den Entry Salt) und in der Datei "key3.db" gibt es an einer anderer Stelle auch noch "Pfeffer" (funktionell den Global Salt). Aus Salz+Pfeffer+Masterpasswort kann man über mehrere Schritte und verschiedenen Hasch Funktionen einen "Key" und einen "Initialisierungsvektor" errechnen, und damit ließe sich der größe Brocken im Private Key entschlüsseln. Das Ergebnis müsste man dann noch auspacken und der darin enthaltene Key ist dann der Key mit dem das Passwort entschlüsselt werden kann. Zum Entschlüsseln bräuchten wird dann neben diesem Key noch den Initialisierungsvektor aus dem jeweiligem verschlüsselten Passwort, und das Verschlüsselte Passwort selbst.<br><br />
Ganz schöner Schlüsselbund, schon beim ungefähren Beschreiben des Vorganges wird einem schwindelig vor lauter Keys ;-) .<br />
<br />
<br />
=== Wie sicher ist das Passwort denn jetzt verschlüsselt ===<br />
<br />
Ersteinmal als Zusammenfassung, da davon ausgegangen werden kann, nicht jeder hat das Kryptografische Wirrwarr aus den vorherigen Abschnitten wirklich aufmerksam gelesen und richtig verstanden. Sowohl die im Firefox gespeicherten Online-Passwörter und Usernamen, als auch der Key mit dem diese entschlüsselt werden können, sind wirklich gut verschlüsselt.<br />
<br />
Das bedeutet aber nicht das sie auch sicher sind. Im Gegenteil. Der Private-Key zu Entschlüsselung ist einzig von einem Masterpasswort abhängig, und das ist im Rechner nirgends gespeichert, das ist gut so, aber die default Einstellung des Firefoxes ist: "kein Masterpasswort"<br><br />
Damit wird der Key nur mit Hilfe von "Salz und Pfeffer" verschlüsselt und Salz und Pfeffer steht auch noch in der selben Datei (key3.db) wie der private-key. Was noch erschwerend dazu kommt, aber hier nicht näher erklärt wird, diese Datei ist auch noch hervorragend geeignet für einen Wörterbuch- oder Brute-Force-Angriff auf das Masterpasswort. <br><br />
In den Firefox Default-Einstellungen sind damit quasi die gespeicherten Online-Passwörter nur durch die Dateizugriffsrechte auf das Verzeichnis der Profildaten von Firefox gesichert, und natürlich dem Wissen oder Nichtwissen des verwendeten Verschlüsselungsalgorithmus. Zugegeben, wir befinden uns mitten in einem Volks-Webbrowser und nicht in einem Hochsicherheits-Rechenzentrum, wo man für jeden Schritt eine andere Genehmigung vorlegen muss und sich alle 2 Meter mit Geburtsurkunde, Fingerabdruck und Irisscan immer wieder neu identifizieren muss. Damit ist klar, wir müssen größere Abstriche in Punkto Sicherheit in Kauf nehmen, und irgendwo müssen schließlich auch die Daten zur Ver- und Entschlüsselung für den Webbrowser greifbar sein. <br> <br />
Wenn also in der Doku von Mozilla steht: "'''Wichtig: Ohne Master-Passwort kann jeder, der Zugriff auf Ihren Rechner hat, auch auf Ihre in Firefox gespeicherten Passwörter zugreifen.'''", ist das also wirklich keinesfalls übertrieben.<br />
<br />
<br />
=== wie kompliziert ist jetzt die Entschlüsselung ===<br />
<br />
Das genaue Ver- und Entschlüsselungsverfahren an sich ist wie die gesamte Kryptografie ein für Otto-den-Normverbraucher niemals wirklich zu durchschauendes Verfahren. Aber braucht ja niemand wirklich zu wissen. Eigentlich muss man nur das Verzeichnis mit den Einstellungen in ein anderes Profil kopieren, eventuell die Eigentumsrechte der Dateien anpassen und dann Firefox starten, und man kann die Passwörter mit Firefox auslesen. Aber auch nur einmal kurz im Internet nach den richtigen Worten gesucht, und man findet sofort dutzende fertige Programme um die Firefox Passwörter zu entschlüsseln, auszulesen, zu sichern, wiederherzustellen, das Profil zu speichern und zu übertragen, die Passwörter und andere Einstellungen übers Internet mit all seinen anderen Geräten zu synchronisieren, usw.<br />
Es gibt darüber hinaus eine Vielzahl Projekten in den verschiedensten Programmiersprachen und fix und fertigen Quellcode die sich mit diesem Thema beschäftigen. Es gibt entsprechende Doku und [https://www.youtube.com/watch?v=MMdTfHP3ZGI Videos] die das alles haar-genau erklären und nicht zuletzt insbesondere für Programmierer interessant, auch die Librarys von Firefox selbst, die ja bei der Installation von Firefox sowieso auf jeden Rechner installiert werden. Dort ist das alles schon als Bausteine drin, man braucht also gar nicht mehr viel eigenes an Programmierarbeit dazu zu leisten.<br><br />
Das einzige was auf Anhieb mal nicht zu finden war, der Nachweis das man all diese Programme und Tools die mehr oder weniger schwierig zu installieren sind, bei Linux eigentlich auch gar nicht wirklich braucht. Bei Linux ist alles was man benötigen würde um mit Hilfe der Konsole oder eines Script die Passwörter zu entschlüsseln per default schon installiert. Der Beweis wurde im Zusammenhang mit dem Schreiben diesem Artikel aber in Form eines Scriptes erbracht, (Zur Abschreckung findet ihr das Script auf der Diskussionsseite dieses Artikels) <br />
Es ist damit für jeden, und damit muss man die 98 jährige Oma die ein wenig Computer- und Internetbegeistert ist, bewusst einschließen, also wirklich für jeden ist es problemlos möglich die Passworte auszulesen wenn kein Masterpasswort gesetzt ist. Ist eines gesetzt, nun gut, dann sollte man das schon kennen, sonst wird's schwierig. <br />
<br />
<br />
=== Wer ist den nun "Jeder" der Zugriff darauf hat === <br />
<br />
Wer nun der Meinung ist: "Na-ja eigentlich bin ich ja alleine auf meinem Rechner, wer soll da schon Zugriff auf meine Passwörter haben. Und selbst wenn meine Frau oder mein Sohn theoretisch die Möglichkeit hat meine Passwörter auszulesen, zugegeben nicht schön, aber was soll's....."<br><br />
dem muss man leider arg enttäuschen. Jeder bedeutet nicht nur jeder User der sich am Computer anmelden kann, sondern bedeutet auch jeder Prozess und jedes Programm das der User unter seiner Kennung am laufen hat. Nicht jedes Programm, Tool oder App wird davon Gebrauch machen sich für solche Dateien zu interessieren, aber es hätte trotzdem die Dateizugriffsrechte um auf jede Datei des Users lesend zuzugreifen. Und mehr wird nicht benötigt als auf bestimmte Dateien des Users im Profile Verzeichnis vom Firefox Leserechte zu haben. <br><br />
Was bei einer Linux Erstinstallation installiert wird, ist wohl diesbezüglich absolut harmlos, aber einiges was wir insbesondere aus dem Internet nachinstallieren, könnte sich dafür interessieren, kostenlose Spiele und Apps, Firefoxplugins, Tools rund um Suchmaschinen oder Cloud Dienste oder Soziale Netze dürften wohl ganz oben auf die Liste der Verdächtigen vermutet werden. Bei den Browserplugins kommt noch erschwerend hinzu, hier würde eventuell nicht einmal das Masterpasswort ausreichend Schutz bieten, das sie die Möglichkeit hatten auf den Key im Firefox zuzugreifen, nachdem wir nach dem Start von Firefox das Masterpasswort eingegeben haben. Die meisten dieser Tools oder Programme werden daraus nicht einmal ein Hehl machen, es steht nur nicht im Klartext in den Nutzungsbedingungen, das auch ausdrücklich die Passwörter gemeint und inbegriffen sind, wenn es um allgemeine Einstellungen und User-Profildaten geht, die regelmäßig eingesammelt, ausgewertet und "nach Hause" gesendet werden. <br />
<br />
<br />
== Was können "die" denn mit meinen oder unseren Passworten anfangen ==<br />
<br />
Wenn eine einzelne Person oder Gruppe die Passwörter einer anderen Person oder Personen Gruppe auslesen würde, hätte sie natürlich damit dann theoretisch wahrscheinlich den Zugang zu allen Onlinediensten und den dort eventuell gespeicherten Daten. Streng genommen sind dann alle Internetkonten von denen die Passwörter so ausgelesen wurden, als gehackt zu bezeichnen.<br><br />
Des weiteren, aus einer etwas größeren Liste von verwendeten Passwörtern eines Users lässt sich oftmals etwas mehr herauslesen. Da könnten zB auffallen das bestimmte Passwörter oft oder immer wieder genutzt werden, oder das Passwörter nach einer bestimmten Regel erzeugt werden, ZB immer mit einer Zahl oder Sonderzeichen an einer bestimmten Stelle, oder Auffälligkeiten bei der Groß-Kleinschreibung. Zwar ist jeder einzelne wohl etwas mehr oder weniger kreativ bei der "Generierung" seiner Passwörter, aber irgendwie will oder muss er sich das auch alles merken können. Da kann man bestimmt bei vielen wiederkehrende Besonderheiten aus einer Liste von Passwörtern herauslesen. Damit hätte man dann eine viel größere Chance auch Passwörter dieses Users zu knacken, die gar nicht auf der Liste zu finden waren, und dieses könnten dann auch dienstlich oder für Internet-Geschäfte verwendete Passwörter sein, denn der User wird mit einiger Wahrscheinlichkeit auch dort Passwörter nach ähnlichen "Macken" generieren.<br />
<br />
Und was die großen und kleinen Internet-Datenkraken mit solchen Daten anstellen wissen wir nicht wirklich, werden es auch wohl nie erfahren. Auf jeden Fall dürfte es außerhalb unseres Vorstellungsvermögens liegen. Vielleicht sammeln sie es nur ein, um statistisch nachzuweisen das das Passwort 123456 wohl eines der häufigsten benutzten ist. Vielleicht sammeln sie es auch nur erstmal ein und wissen selbst noch nicht was sie damit anfangen können. Zumindest dürfte klar sein, sie werden es nicht nutzen um sich selbst als User irgendwo mit unseren Passwörtern anzumelden.<br><br />
Bei einigen kleineren Firmen muss man sich aber schon fragen wo sich denn nun wirklich die Geschäftsidee verbirgt, wenn sie zB. Dienste wie zB das Synchronisieren von Passwörtern und Lesezeichen als Browserplugin kostenlos über das Internet anbieten. Alleine die Betriebskosten der Server, Administration, Entwicklungskosten, Büro usw. werden wohl 6 Stellige Beträge jährlich verschlingen, dazu kommen dann noch Lizenzen für Software die sind auch nicht gerade billig, und und und.... Und sie müssen auch noch Werbung machen, damit überhaupt jemand ein solches Plugin im Internet findet und haben will. Was bitte verkaufen die, oder wo sind dort Einnahmen? <br />
<br />
Nur mal so ein nicht ganz unwahrscheinliches Gedankenspiel, und dabei wird dann auch gleich noch ein Begriff beleuchtet der im Zusammenhang mit den <br />
Datenschutzbestimmungen immer wieder auftritt, "'''anonymisierte Verarbeitung/Speicherung/Weitergabe'''"<br><br />
Eine Firma sammelt von ein paar Millionen Usern weltweit die gespeicherten Online Zugangsdaten aus dem Webbrowsern. Die Passwörter werden jetzt von den Usernamen, den URLs und IPs getrennt, also anonymisiert. Ein paar ganz grobe Eigenschaften bleiben aber weiterhin an den Passwörtern haften. zB welche Passwörter von ein und dem selben anonymen User stammen, welche Ländereinstellung der Browser hat, das Land das zur IP passt. und eventuell einiges mehr (Interessen oder sowas) was man zB aus den Lesezeichen im Browser ableiten könnte. Das wird jetzt verarbeitet. Heraus kommt dann für jedes Land ein Passwort-Wörterbuch erstellt aus der anonymen Auswertung der eingesammelten Passwörter. Sowas lässt sich dann schon verkaufen, und ist bestens geeignet um sehr gezielte Wörterbuchangriffe gegen irgendwelche Internet- oder Firmenserver durchzuführen. Eine Internetmafia aus dem kyrillischem Sprachraum wird sich kaum vorstellen können wie Deutsche, Franzosen, Polen oder Finnen gerne ihr Passwort zusammenbauen. Ein solches aus realen Passwörtern erstellte Wörterbuch hätte auf deutschen Servern auch bestimmt mehr Erfolg als eines erstellt aus den gesammelten Werken von Goethe und Schiller oder dem Duden. <br><br />
Der, der sich regelmäßig mühsam und raffiniert seine Passwörter hoch-kompliziert erstellt und erdenkt, und sich diese Passwörter von dieser Firma einsammeln lässt, hat eventuell öfters bei solchen Passwortattacken Pech, da genau seine so schwer zu erraten Passwörter immer wieder genau in den für die Angriffe verwendeten Wörterbüchern drin stehen. Das dieses aus anonymisierter Verarbeitung stammt, hilft diesem User hinterher aber wenig.<br />
<br />
<br />
<br />
<br />
== Was sollten wir daraus lernen ==<br />
<br />
Unsere Passwörter auf den Internetservern sind sicher, eigentlich liegen sie dort gar nicht herum. Wenn ein solcher Server dennoch mal angegriffen wird und dort Passwörter abgefangen werden, hat die Sicherheit auf diesem Server komplett versagt, das können wir nicht beeinflussen.<br><br />
Vorsicht jedoch, dort wo es möglich ist sich seine eigenen Passwörter per Mail zuschicken zu lassen. Die Administration und Sicherheit auf einem solchem Server ist wahrscheinlich keinen Pfifferling wert. <br />
<br />
Wenn wir Passwörter oder anderes über Http Verbindungen versenden, können sie unterwegs abgefangen werden. Die Wahrscheinlichkeit das dieses bewusst ausgenutzt und ausgewertet wird, ist nicht sonderlich hoch aber permanent vorhanden. Spätestens sobald ihr oder die von euch genutzten Internetdienste durch einen dummen Zufall mal ins Fadenkreuz von Geheimdiensten und Sicherheitsbehörden rutschen ist bei Http der letzte Mantel der Verschwiegenheit eurer Internetprovider gefallen. Dennoch sollten wir darauf achten. Http nur dort wo sowie alles offen ist, und wo keine wichtigen, schützenswerten oder persönlichen Daten abgelegt sind. Sobald ihr (außer einer Email-Adresse) aufgefordert werdet irgend etwas ein- oder anzugeben, dass ihr nicht auch auf eurem T-Shirt geschrieben herumtragen würdet, ist dringend Https angesagt. Viele Dienste bieten sowohl http als auch https an, hier darauf achten, wenn ihr etwas eingebt, zB das Passwort, dass diese Seite https ist.<br><br />
Bei Https ist noch zu bedenken und zu beachten, nicht alle Warnungen die euer Browser bringt einfach ignorieren. Das kann leicht dazu führen, dass euch vorsätzlich falsche Zertifikate unter geschoben werden. Mit bösartigen falschen Zertifikaten fühlt ihr euch zwar mit https immer noch sicher, und bekommt eventuell überhaupt nicht mit, dass ihr schon lange mitten auf dem Leim der Internet-Mafia sitzt.<br />
<br />
Am gefährlichsten leben die Passwörter auf unseren eigenen Rechnern. Zwar werden sie vom Browser gut verschlüsselt abgelegt, doch das nützt nichts denn alles was man zum entschlüsseln braucht liegt gleich daneben. Und Programme, Tools und Anleitungen wie das geht, gibt es zu Hauf. Das einzige was die Passwörter schützt ist das Masterpasswort, und dieses hat wahrscheinlich nur ein ganz geringer Anteil der User überhaupt gesetzt.<br />
Selbst ein Masterpasswort "123" das einer Attake keine 10 Sekunden standhalten würde, ist dabei zig-Millionenmal sicherer als gar keines. Wer wird sich schon die Mühe machen überhaupt ein Masterpasswort anzugreifen, wenn Millionenmal nur einen Klick weiter die Passwörter ohne Masterpasswort mitten auf dem Präsentierteller rumliegen.<br />
<br />
Wir sollten bewusst nicht unbedingt jedes Passwort im Browser speichern, auch wenn es bequem ist. Es gibt neben der Möglichkeit einfach '''NICHT''' immer auf "Speichern" zu drücken, auch die Möglichkeit das speichern der Passwörter prinzipiell in den Einstellungen auszuschalten und den "Privaten Modus", dort werden auch keine Passwörter gespeichert.<br />
<br />
Bei dem was wir auf Rechner installieren, sollten wir wenigstens hin und wieder mal die Nutzungs- und Datenschutzrichtlinien aufmerksam und kritisch durchlesen, die wir dabei ganz bewusst akzeptieren müssen. Mag sein, die sind umfangreich, englisch und kompliziert geschrieben, mag sein kein normaler Mensch kann sowas jemals wirklich verstehen, aber der Wille das zu verstehen ist 100 Mal sicherer als dort gar nicht rein zu schauen. Wir sollten bedenken, wir erlauben mit diesen Bedingungen hier "Fremden" zT. ziemlich gravierende Dinge und wissen es gar nicht, weil das was wir akzeptieren uns überhaupt nicht angeschaut haben. Rein rechtlich gesehen, haben wir damit später wahrscheinlich keinerlei Handhabe mehr dagegen vorzugehen. Eventuell (zugegeben sehr selten) hilft manchmal sogar dieses einfach abzulehnen wenn es einen solchen Button gibt, dann kommt die Aufforderung zwar das nächste mal beim Start des Programms wieder, aber in der Zwischenzeit werden vom Programm keine Sicherheitsrelevanten Dinge eingesammelt und "Nach-Hause" geschickt.<br />
<br />
Bei der Erstellung unserer Passwörter sollten wir durchaus einen Unterschied zwischen Wichtig, Privat, Allgemein, Dienstlich, Onlineshop, Bank usw machen. Dabei ist nicht nur gemeint nicht die gleichen Passwörter überall zu verwenden, sondern auch die Passwörter für jeden Bereich nach anderen Richtlinien zu erstellen. Gelegentlich mal im Browser nachschauen, was jetzt wirklich alles für Passwörter gespeichert sind, und dann eventuell auch mal das eine oder andere dort aus der Liste wieder löschen, ist bestimmt auch keine schlechte Idee. <br><br />
Ob es praktisch ist überall wirklich "Random-Passwörter" zu verwenden, die wir zwingend immer entweder aufschreiben oder irgendwo im Browser oder in einem Passwort-Safe aufbewahren müssen? Sowas ist für einen Menschen extrem schwierig zu merken. Wenn man bedenkt wie sicher ein Spickzettel ist, meist ist er weg wenn man ihn braucht, und in welcher Hosentasche er verschwunden ist wird sich meist niemals klären. Wie sicher der Browser ist, haben wir hier eindeutig im Artikel bewiesen. Passwort-Safe ist aber schließlich und letztendlich auch nur ein Stück Software. Das einzige das ein Computer so schnell nicht knacken kann, ist das was nur bei uns im Kopf steht. Und was nur bei uns im Kopf gespeichert ist, kann man aber vielleicht auch schon mit nur einer "Bratwurst" als Belohnung wieder herauspressen, kommt ganz auf den Druck und die Argumente an, die ein anderer dafür einsetzt. <br><br />
<br />
Einfach mal drüber nachdenken, das ist schon Aller Anfang von Sicherheit.</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=UEFI_Boot_Konfiguration&diff=32138UEFI Boot Konfiguration2015-09-05T23:05:52Z<p>Robi: ein bisschen mehr Text</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
{{UnderConstruction}}<br />
<br />
==UEFI Boot Konfiguration==<br />
<br />
===UEFI Variablen allgemein===<br />
<br />
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.<br><br />
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.<br />
<br />
Beispiel, Ausgabe einer UEFI Variable aus der [[EFI-Shell]]: <br />
<pre><br />
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8<br />
00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.*<br />
00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...*<br />
00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................*<br />
00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y*<br />
00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.*<br />
00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.*<br />
00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.*<br />
00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......*<br />
00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.*<br />
00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.*<br />
000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.*<br />
000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*<br />
</pre><br />
<br />
* '''NV+RT+BS''' entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS" <br><br />
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden<br />
<br />
* '''8BE4DF61-93CA-11D2-AA0D-00E098032B8C''' diese ist eine EFI-GUID und bedeutet in diesem Fall <br><br />
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.<br />
<br />
* '''Boot000A''' dieses ist der Name der Variable <br />
<br />
* '''DataSize = 0xB8''' dieses ist die hexadezimale Längenangabe für die Daten der Variable<br />
<br />
* der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "'''hexdump -C''' " in Linux liefern würde.<br />
<br />
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit [http://de.wikipedia.org/wiki/UTF-16 UTF-16] abgelegt sind.<br />
<br />
In diesem Fall handelst es sich um den Booteintrag (Label) "'''neuerkern'''" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "'''\EFI\opensuse\bzImage.efi'''" mit den Optionen "'''initrd=\efi\opensuse\initrd'''" starten soll.<br><br />
<br />
<br />
<br />
===UEFI Boot Variablen===<br />
<br />
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.<br />
<br />
<br />
====Bootxxxx====<br />
<br />
'''xxxx''' ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen '''Boot0001''' von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit '''Boot0000'''.<br><br />
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix "'''.efi'''". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.<br />
<br />
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.<br />
<br />
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:<br />
<pre><br />
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)<br />
ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)<br />
</pre><br />
<br />
<br />
<br />
====BootOrder====<br />
<br />
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem '''xxxx''' aus den '''Bootxxxx''' Variablen entsprechen.<br />
<br />
BootOrder: 0004,0001,0002,0000,0003<br />
<br />
Hier im Beispiel wird die Bootvariable '''Boot0004''' die erste sein mit deren Hilfe UEFI versucht das System zu booten.<br />
<br />
<br />
====weitere Bootvariablen====<br />
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.<br />
<br />
* '''BootCurrent''' : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs<br />
* '''BootNext''' : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.<br />
* '''Timeout''' : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis '''BootOrder''' oder '''BootNext''' verwendet wird um einen Bootloader zu starten<br />
* '''SecureBoot''' zeigt an ob derzeit bzw. für den nächsten Reboot [[Secure Boot]] aktiv ist.<br />
* und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden <br />
<br />
<br />
<br />
<br />
<br />
===Bootkonfiguration aus dem Setup Menü===<br />
<br />
<!-- hier brauchen wir evtl. ein paar Bilder, da sich das wahrscheinlich auf jedem Rechner etwas anders darstellt.--><br />
<br />
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der [[ESP]] einen Bootloader '''\EFI\boot\bootx64.efi''' dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen. <br />
<br />
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte. <br><br />
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.<br />
<br />
<!--Müssen wir etwas allgemein abhandeln und mit Beispielbildern unterlegen--><br />
[[Datei:UEFI-CustomMode.jpg|200px|thumb|left|Umschalten Standard Mode / Custom Mode]]<br />
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot) <br><br />
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.<br />
* SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen<br />
* CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem [[MBR]] nach der legacy Methode<br />
* und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll. <br />
* eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei [[Secure Boot#Secure Boot verstehen|Secureboot]] hier im Wiki . <br />
<br />
<br />
<br />
<br />
<br />
===Konfiguration aus Linux===<br />
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool [[efibootmgr]] gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool '''efibootmgr''' wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.<br />
<br />
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration. <br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM<br />
Boot0001* EFI DVD/CDROM 1<br />
Boot0002* EFI Floppy<br />
Boot0003* EFI Floppy 1<br />
Boot0004* EFI Hard Drive<br />
Boot0005* Shim boot<br />
Boot0006* EFI Internal Shell<br />
Boot0007* opensuse<br />
Boot0008* opensuse-secureboot<br />
Boot0009* kernel<br />
Boot000A* neuerkern<br />
Boot000B* grublegacy<br />
Boot000C* SUSE Linux Enterprise<br />
Boot000D* rEFInd Boot Manager<br />
Boot000E* Linux Boot Manager<br />
Boot000F* grub1 boot<br />
Boot0010* EFI Network<br />
Boot0011* EFI Network 1<br />
Boot0012* EFI Network 2<br />
</pre><br />
<br />
zusätzlich die Option "'''-v'''" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.<br />
<pre><br />
BootNext: 0006<br />
BootCurrent: 0006<br />
Timeout: 0 seconds<br />
BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012<br />
Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0)<br />
Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0)<br />
Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0)<br />
Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1)<br />
Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)<br />
Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0006* EFI Internal Shell MM(b,900000,10fffff)<br />
Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi)<br />
Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\<br />
.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d...<br />
Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.<br />
r.d...<br />
Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi)<br />
Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi)<br />
Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi)<br />
Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi)<br />
Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi)<br />
Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)<br />
Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0<br />
Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000<br />
00000000000000000000000000000<br />
</pre><br />
<br />
Hilfe bekommt man mit der Option "'''-h'''" oder auch über die [http://linux.die.net/man/8/efibootmgr Manpage]<br />
<pre> <br />
usage: efibootmgr [options]<br />
-a | --active sets bootnum active<br />
-A | --inactive sets bootnum inactive<br />
-b | --bootnum XXXX modify BootXXXX (hex)<br />
-B | --delete-bootnum delete bootnum (hex)<br />
-c | --create create new variable bootnum and add to bootorder<br />
-d | --disk disk (defaults to /dev/sda) containing loader<br />
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess<br />
-E | --device num EDD 1.0 device number (defaults to 0x80)<br />
-g | --gpt force disk with invalid PMBR to be treated as GPT<br />
-H | --acpi_hid XXXX set the ACPI HID (used with -i)<br />
-i | --iface name create a netboot entry for the named interface<br />
-l | --loader name (defaults to \elilo.efi)<br />
-L | --label label Boot manager display label (defaults to "Linux")<br />
-n | --bootnext XXXX set BootNext to XXXX (hex)<br />
-N | --delete-bootnext delete BootNext<br />
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)<br />
-O | --delete-bootorder delete BootOrder<br />
-p | --part part (defaults to 1) containing loader<br />
-q | --quiet be quiet<br />
| --test filename don't write to NVRAM, write to filename.<br />
-t | --timeout seconds set boot manager timeout waiting for user input.<br />
-T | --delete-timeout delete Timeout.<br />
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)<br />
-U | --acpi_uid XXXX set the ACPI UID (used with -i)<br />
-v | --verbose print additional information<br />
-V | --version return version and exit<br />
-w | --write-signature write unique sig to MBR if needed<br />
-@ | --append-binary-args file append extra args from file (use "-" for stdin)<br />
</pre><br />
einfache Beispiele:<br />
efibootmgr -n 5 <br />
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable '''Boot0005''' (in diesem Beispiel "shim boot") durchgeführt wird.<br />
<br />
efibootmgr -o 5,6,9,0<br />
würde die '''Bootorder''' dauerhaft umstellen auf "'''0005,0006,0009,0000'''"<br />
<br />
efibootmgr -b 3 -B<br />
würde den Eintrag '''Boot0003''' löschen und wenn vorhanden aus der '''Bootorder''' entfernen<br />
<br />
<br />
etwas schwieriger ist das anlegen eines neuen Eintrages<br><br />
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen<br />
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi<br />
<br />
* '''-c''' - neu anlegen<br />
* '''-d''' - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet<br />
* '''-p 1''' - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default) <br />
* '''-L''' - der Name des Booteintrages<br />
* '''-l''' - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.<br />
<br />
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.<br />
<br />
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem [[ESP]] direkt von UEFI gestartet wird.<br />
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd<br />
<br />
* '''-u''' - setzt hier [http://de.wikipedia.org/wiki/UTF-16 UNICODE] Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE<br />
<br />
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.<br />
<br />
<br />
<br />
===Konfiguration aus der EFI-SHELL===<br />
<br />
<!--<br />
Option: 00. Variable: Boot0008 <br />
Desc - opensuse-secureboot<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 01. Variable: Boot000F <br />
Desc - grub1 boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
Option: 02. Variable: Boot000D <br />
Desc - rEFInd Boot Manager<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\refind\refind_x64.efi<br />
Optional- N<br />
Option: 03. Variable: Boot000C <br />
Desc - SUSE Linux Enterprise<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\efi\SuSE\elilo.efi<br />
Optional- N<br />
Option: 04. Variable: Boot000B <br />
Desc - grublegacy<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\redhat\grub.efi<br />
Optional- N<br />
Option: 05. Variable: Boot000A <br />
Desc - neuerkern<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\opensuse\bzImage.efi<br />
Optional- N<br />
Option: 06. Variable: Boot0007 <br />
Desc - opensuse<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\opensuse\grubx64.efi<br />
Optional- N<br />
Option: 07. Variable: Boot0000 <br />
Desc - EFI DVD/CDROM<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 08. Variable: Boot0001 <br />
Desc - EFI DVD/CDROM 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 09. Variable: Boot000E <br />
Desc - Linux Boot Manager<br />
DevPath - HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\gummiboot\gummibootx64.efi<br />
Optional- N<br />
Option: 0A. Variable: Boot0002 <br />
Desc - EFI Floppy<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x0)<br />
Optional- N<br />
Option: 0B. Variable: Boot0003 <br />
Desc - EFI Floppy 1<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x1)<br />
Optional- N<br />
Option: 0C. Variable: Boot0006 <br />
Desc - EFI Internal Shell<br />
DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)<br />
Optional- N<br />
Option: 0D. Variable: Boot0009 <br />
Desc - kernel<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\opensuse\bzImage.efi<br />
Optional- N<br />
Option: 0E. Variable: Boot0005 <br />
Desc - Shim boot<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000)/\EFI\opensuse\shim.efi<br />
Optional- N<br />
Option: 0F. Variable: Boot0004 <br />
Desc - EFI Hard Drive<br />
DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)<br />
Optional- N<br />
Option: 10. Variable: Boot0010 <br />
Desc - EFI Network<br />
DevPath - PciRoot(0x0)/Pci(0x3,0x0)/MAC(00163E345786,0x1)<br />
Optional- N<br />
Option: 11. Variable: Boot0011 <br />
Desc - EFI Network 1<br />
DevPath - PciRoot(0x0)/Pci(0x3,0x0)/MAC(00163E345786,0x1)/IPv4(0.0.0.0)<br />
Optional- N<br />
Option: 12. Variable: Boot0012 <br />
Desc - EFI Network 2<br />
DevPath - PciRoot(0x0)/Pci(0x3,0x0)/MAC(00163E345786,0x1)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)<br />
Optional- N<br />
<br />
--><br />
<br />
<br />
===Konfiguration aus Windows===<br />
<br />
<!--<br />
https://msdn.microsoft.com/en-us/library/windows/hardware/ff542268%28v=vs.85%29.aspx<br />
<br />
--></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=ESP&diff=32137ESP2015-09-05T20:31:09Z<p>Robi: intern verlinkt</p>
<hr />
<div>[[Kategorie:UEFI]]<br />
{{Review|Kompletter Artikel}}--[[Benutzer:Gehrke|Gehrke]] 11:37, 1. Mai 2015 (CEST)<br />
<br />
Eine '' 'EFI system partition (ESP)' '' ist eine Festplatten-Partion, welche die von [[UEFI]] ladbaren Bootloader enthält. Sie bietet einen von der Spezifikation definierten Bereich, welchen die Firmware nach Bootloadern durchsuchen kann.<br />
<br />
Die Spezifikation legt dabei fest, dass:<br />
*dieser Speicherbereich ein bestimmtes Dateisystem hat (die FAT-Varianten FAT12, FAT16 und FAT32).<br />
:: <br />
<br />
<br />
*Die Partition ist anhand eines speziellen GPT-Partitionstyp ''''EF00''' (EFI system partition)' eindeutig markiert<br />
:: gefunden wird sie von UEFI anhand des Partition GUID code: '''C12A7328-F81F-11D2-BA4B-00A0C93EC93B''' (EFI System)<br />
:: typisch ist eine kleine Partitionsnummer, zB part 1 wenn wir zuerst Linux installieren, oder part 2 nach einer initialen Windowsinstallation.<br />
<br />
<br />
*Das Dateisystem hat unter UEFI analoge Eigenschaften wie unter DOS,<br />
:: Groß und Kleinschreibung wird ignoriert<br />
:: SysLinks und ähnliches gibt es nicht <br />
:: Dateiattribute : '''Archive''' [A]; '''System''' [S]; '''Hidden''' [H]; '''Read only''' [R]; '''Directory''' [D]<br />
:: komplette Path zur Datei unter UEFI zB. '''FS0:\EFI\BOOT\BOOTX64.EFI''' (Laufwerk:\Path\Datei.Extension) <br />
:: Unter Linux gemountet werden die Eigenschaften und Zugriffsrechte entsprechend Linux tauglich simuliert <br />
<br />
<br />
*Ausführbare Programme, also UEFI-Treiber, [[UEFI/Bootloader|Bootloader]] oder UEFI-Applikationen müssen ein bestimmtes <br />
:: ausführbares Format besitzen und zwingend die Endung '''.efi''' besitzen. <br />
:: (mit dem Linuxbefehl "file" werden wir meistens folgendes Format für diese Dateien dort vorfinden.<br />
::: '''PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows'''<br />
::: selten auch nur '''MS-DOS executable'''<br />
<br />
<br />
*Weitere Dateitypen sind dort noch definiert, zB Dateien mit der Endung "'''.nsh'''" sind "Batch Scripte" <br />
:: also Scripte die von der EFI-Shell ausführbar sind.<br />
<br />
<br />
*Einige Verzeichnisse und Dateien sind definiert.<br />
:: "'''\EFI\BOOT/BOOTX64.EFI'''" ist zB der Name des Defaultbootloaders dieses Laufwerkes, <br />
::: (sind zB keine Bootvariablen für dieses Laufwerk bekannt, oder nach FW-Reset gelöscht, wird falls vorhanden von <br />
::: diesem Bootloader gebootet)<br />
::: Unter \EFI sind eine Reihe von Subdirectories für Firmen und Distributionen [http://www.uefi.org/registry registriert].<br />
<br />
<br />
*In einem laufenden Linux wird diese Partition im Dateisystem unter '''/boot/efi''' eingehängt (mount).<br />
<br />
=Links=<br />
*[https://www.happyassassin.net/2014/01/25/uefi-boot-how-does-that-actually-work-then/ UEFI boot: how does that actually work, then? (AdamW)] {{englisch}}<br />
*[https://en.wikipedia.org/wiki/EFI_System_partition EFI System partition (wikipedia)] {{englisch}}<br />
<br />
[[Kategorie:Partitionen]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Bootvorgang&diff=32136Bootvorgang2015-09-05T20:29:32Z<p>Robi: intern verlinkt</p>
<hr />
<div>{{Achtung|'''Hinweis:''' <br />
Diese Seite enthält Informationen über den klassischen Start eines PC und des Bootvorganges von Linux wie er etwa in der Zeit von 2002 bis 2010 typisch war. Der ganze Prozess hat sich so aus den Anfängen der 80 Jahre des vorigen Jahrhunderts bis dort hin linear entwickelt und wurde immer wieder an die neuen Anforderungen angepasst. Letztlich haben einige unüberwindliche Grenzen diese lineare Entwicklung jedoch gestoppt, und derzeitig ist hier gleich an mehreren Fronten sehr viel Bewegung. Derzeit ist noch nicht abzusehen ob und wann sich die vielen Neuentwicklungen und Veränderungen zu einem stabilen und einheitlichen neuen Standard zusammenfinden werden.<br />
Es ist also möglich und wahrscheinlich, das auf ihrem Rechner schon derzeit vieles anders abläuft, als hier beschrieben.<br />
<br />
Einige der derzeit in der Entwicklung und Einführungsphase befindlichen Neuerungen die hier überhaupt noch nicht berücksichtigt sind:<br />
* [[UEFI]] ersetzt das [[BIOS|klassische BIOS]]. Hier könnte sich in den nächsten Jahren noch sehr viel ändern. Derzeit starten die meisten mit UEFI ausgestatteten Rechner noch mit einer "Legacy-Boot-Optionen" die ähnlich dem BIOS ist. Jedoch wird von verschiedenen Seiten angestrebt in Zukunft auf den "echten" UEFI-Boot zu setzen, und diesen eventuell auch mit der "Secure Boot" Erweiterung per default abzusichern. Dieses würde sehr große Änderungen und Restriktionen des Linux Bootvorganges mit sich bringen.<br />
<br />
* [[GRUB 2|Grub2]] wird auf vielen Systemen derzeit als default Bootloader benutzt. Grub2 ist eine komplette Neuentwicklung und hat mit dem hier beschriebenen Grub (legacy) sogut wie nichts gemeinsam.<br />
<br />
* [[systemd]] wird derzeit auf vielen Systemen benutzt und soll das alt bewährte [http://de.wikipedia.org/wiki/SysVinit Sys-V-Init] ersetzen. Hieraus resultieren derzeit sehr vielen Änderungen an vielen Ecken im halben Betriebssystem.<br />
<br />
<br />
Nichts desto trotz, werden wir diesen Text hier weiterhin anbieten, einiges ändert sich halt nie ;-)<br><br />
Auf einigen Rechnern ist noch nach wie vor alles oder vieles so von Bedeutung wie hier beschrieben, - Andere können sich hier einige Teile herauspicken, die auch noch heute, morgen und übermorgen genau so gehandhabt werden. }}<br />
<br />
<br />
<br />
Linux ist ja nun leider so stabil, dass es nie komplett abstürzt, und man kommt natürlich auch niemals in den Versuchung den Rechner einmal komplett auszuschalten, weil gar nichts mehr geht, bleibt jedoch immer noch das Risiko, die Mutter bleibt mit dem Staubsauger im Kabelgewirr hängen, der kleine Bruder drückt die Resettaste oder das Kraftwerk in Nachbarschaft hat mal wieder einen Störfall. Egal, Ergebnis ist jedenfalls, der Rechner ist aus, und beim booten bleibt der Rechner mit einer Fehlermeldung hängen.<br />
: '''oder'''<br />
Nachdem man sich monatelang an seinem Linux erfreut hat, und nach und nach immer mehr von Linux versteht, wird man irgendwann einmal etwas mutiger werden. Festplatten, der Bootloader, der [[Kernel]], die [[Partitionierung und Verzeichnisstruktur|Filesysteme]], die Startscripte, nichts ist dann mehr heilig. Die logische Konsequenz, irgendwas war im Howto natürlich wieder nicht richtig beschrieben, man konnte die Warnung also gar nicht beachtet oder übersehen. Wenn man also mal kein Glück hat und das Pech auch gleich noch dazu kommt. Das Ergebnis jedenfalls, der Rechner fährt nicht mehr hoch, die automatische SuSE Reparatur hilft auch nicht weiter und das letzte Backup ist selbstverständlich auch noch unbrauchbar. <br />
<br />
Jetzt ist es wichtig zu wissen, wie so ein Bootvorgang von Linux überhaupt abläuft, damit man erst einmal eine grobe Idee bekommt, wo und warum der Bootvorgang hängen könnte.<br />
<br />
<br />
<br />
<br />
== Der Bootvorgang von Linux ==<br />
<br />
=== BIOS ===<br />
<br />
Beim Einschalten, erfolgt ein Reset, die [http://de.wikipedia.org/wiki/Hauptprozessor CPU] wird in den [http://de.wikipedia.org/wiki/X86-Prozessor#Real_Mode Real Modus] geschalten und beginnt den Code in einem [http://de.wikipedia.org/wiki/Flash-Speicher Flash-][http://de.wikipedia.org/wiki/EEPROM EEPROM] dem so genannten [http://de.wikipedia.org/wiki/BIOS BIOS] ab der Speicheradresse 000F:FFF0 abzuarbeiten. Es folgt ein Peripheriecheck bei dem unter anderem die Grafikkarte gesucht wird. Anschließend erfolgt der [http://de.wikipedia.org/wiki/POST POST] ('''P'''ower '''O'''n '''S'''elf'''T'''est). Hierbei werden die sich auf dem [http://de.wikipedia.org/wiki/Motherboard Motherboard] befindlichen Controller, sowie CPU und Speicher, auf Funktionstauglichkeit überprüft und nach [http://de.wikipedia.org/wiki/Controller_%28Hardware%29 Erweiterungssteckkarten] gesucht, und diese entsprechend der BIOS Einstellungen zu konfigurieren. Diese gefundenen Controller werden meist noch mit ihren Einstellungen kurz angezeigt.<br />
<br />
<br />
* '''Fehlermeldungen des BIOS'''<br><br />
Sollte hier schon etwas nicht in Ordnung sein, zB fehlender oder defekter Grafikcontroller oder irgendwas anderes noch bevor der Grafikcontroller gefunden und in Betrieb genommen werden konnte, dann meldet das der BIOS über den internen Lautsprecher in Form von definierten [http://www.hardware-bastelkiste.de/index.html?bios_beepcodes.html Beep Tönen], spätere Fehlermeldungen werden über die Grafikkarte ausgegeben. Weiter Informationen über Funktionen und Fehler während dem POST können im [http://www.bios-kompendium.de BIOS Kompendium] nachgelesen werden. <br />
<br />
Nachdem der POST abgearbeitet ist, werden eventuell weitere BIOSe die sich auf eingesetzten Controllern zB. [http://de.wikipedia.org/wiki/SCSI-Hostadapter SCSI-Controllern] befinden können, gestartet. So ein BIOS ist dafür zuständig, dass über die Geräte die an diesen Controllern angeschlossen sind, auch gebootet werden kann. (Der BIOS der Hauptplatine kann nicht selbst auf solche Geräte zugreifen)<br />
<br />
Alles in Ordnung, dann muss jetzt das Betriebssystem irgendwie her<br />
<br />
<br />
<br />
<br />
=== Bootloader ===<br />
<br />
Entsprechend der im BIOS hinterlegten Boot-Reihenfolge durchsucht jetzt der BIOS die Wechselmedien und Festplatten nach einem [http://de.wikipedia.org/wiki/Bootloader Bootloader]. Dabei wird der [http://de.wikipedia.org/wiki/Master_Boot_Record MBR] (die ersten 512 Byte der Festplatte oder des Mediums) durchsucht. In diese 512 Byte kann ein winziges (bis 440 Byte großes) Programm als Bootloader hinterlegt werden. Ebenfalls in diesem MBR befindet sich die Partitionstabelle für die Partitionen 1 bis 4 und eine MBR-Signatur (0xAA55) die die Partitionstabelle und den Bootloader als gültigen MBR definiert. <br />
<br />
die wichtigsten Bootloader die Linux mitbringt sind<br />
* [[LILO]] <br />
* [[GRUB_Legacy|GRUB]] (mittlerweile als Grub Legacy bezeichnet)<br />
* [[GRUB_2]] <br />
* [http://de.wikipedia.org/wiki/Loadlin Loadlin]<br />
<br />
Heute wird vor allem GRUB verwendet und ist dabei LILO in modernen Linux-Systemen zu verdrängen, Loadlin wird heute nur noch in einigen wenigen Spezialfällen eingesetzt. <br />
<br />
Die wenigen Byte die dort im MBR Platz sind, können natürlich nicht der Kernel selbst sein. Auch ist es hier kaum möglich in diese paar Byte eine Unterstützung für Filesysteme und ähnliches einzubauen, um den Kernel von hier aus direkt zu laden.<br><br />
Bei Grub nennt sich dieses kleine Programm im MBR '''stage1'''. Seine einzige Funktion besteht darin '''stage2''' zu laden. Stage2 befindet sich innerhalb des Linuxsystems im [[Directory|Verzeichnis]] '''/boot/grub'''. Daneben befinden sich dort noch weiter Dateien ''' e2fs_stage1_5 ffs_stage1_5 minix_stage1_5 vstafs_stage1_5 fat_stage1_5 jfs_stage1_5 reiserfs_stage1_5 xfs_stage1_5 ''' diese beinhalten die Unterstützung für die unterschiedlichen Filesysteme auf denen sich das Verzeichnis /boot befinden kann. Bei der Installation von stage1 im MBR durch [[GRUB_Legacy|GRUB]] wird dort eine feste Adresse in der Form "Controller, Gerät, Partition, Block" hinterlegt, wo sich stage1_5 und stage2 befinden. <br />
<br />
<br />
* Es wird also vom BIOS stage1 aus dem MBR in den Speicher geladen und gestartet<br />
* stage1 läd jetzt die erforderliche Filesystemunterstützung stage1_5 und startet sie <br />
* stage1_5 lad dann stage2 und startet damit Grub<br />
<br />
<br />
Die Bedeutung der [[Grub ERROR|Fehlermeldungen]] in diesem Abschnitt.<br><br />
Ab hier kann Grub auf dem Verzeichnis in dem sich /boot befindet, den Kernel und die Konfigurationsdateien über ihren Namen ansprechen. Grub wertet hier die Datei '''/boot/grub/menu.lst''' aus. In dieser Datei befinden sich Menüeinträge für das starten von verschiedenen Betriebssysteme oder verschiedenen Konfigurationen. Hilfe zur Konfiguration und als Einsprungspunkt für alles Geheimnisse gibt es nach wie vor in der [http://www.gnu.org/software/grub/manual/legacy/index.html#Top Doku]<br />
<br />
<br />
<br />
=== Starten des Kernel === <br />
<br />
Ist jetzt in Grub die Entscheidung gefallen welcher Kernel mit welchen Optionen geladen werden soll, dann sucht Grub diesen über seinen Namen und läd ihn in den Speicher, dort wird der Kernel dann gestartet und durchläuft folgende Schritte.<br />
* Umschalten auf [http://de.wikipedia.org/wiki/X86-Prozessor#Protected_und_Enhanced_Mode Protected Mode]<br />
* Sprung in den Code der Datei '''head.S''' ( im Kernelquellcode /usr/src/linux/arch/i368/kernel/head.S )<br />
: dort werden jetzt Dinge initialisiert die man schon richtig zur Arbeit mit Linux braucht<br />
:* Initialisieren der Interrupt Beschreibungstabelle (IDT)<br />
:* Sichern der Bootparameter (werden später als Parameter für die Funktion main.c benötigt)<br />
:* Prüfung auf Prozessortype<br />
:* Initialisieren der Speicherbeschreibungstabelle<br />
Nachdem die Initialisierung durchgeführt wurde kann jetzt die Vorbereitung für den Kernel angegangen werden<br />
* dazu werden Funktionen der Datei ( /usr/src/linux/init/main.c ) gestartet. unter anderem<br />
:* Speicher initialisiert<br />
:* Einstellungen fpr Interrupts, Scheduler und Zeitgeber<br />
:* verarbeiten eventueller Kommandozeilenargumente<br />
:* dynamischen Speicherbereich des Kernels initialisieren<br />
<br />
Es soll hier auch nicht näher in die einzelnen Vorgänge vorgedrungen werden, wer sich damit auseinander setzten will oder muss, dem sei auf den Quelltext und auf die Howtos zum Kernel verwiesen. Die einzelnen Module des Kernels die initialisiert werden erzeugen Ausgaben auf der Bootkonsole, die man im Fehlerfall genau nach Fehlern durchsuchen muss.<br />
<br />
<br />
<br />
<br />
=== Starten der initrd ===<br />
<br />
Da im Kernel meist nicht alle Module integriert sind, die der Kernel jetzt zum Boot wirklich benötigen würden, wird in der Grubkonfiguration oftmals noch eine '''initrd''' ('''Init'''ial '''R'''am '''D'''isk ) mit angegeben. Diese wird nach dem starten des Kernels geladen und abgearbeitet.<br />
<br />
Eine initrd besteht entweder aus einem [http://man.splitbrain.org/cpio cpio]-Archiv oder aus einem mittels [http://man.splitbrain.org/gzip gzip] komprimierten ext2 Filesystems in einer Datei. Je nach Type der initrd wird diese entweder in einem loopdevide aus dem cpio-Archiv ausgepackt oder die nach dem entkomprimieren der initrd entstandene Datei als loop device gemountet. Diese RAM-Disk stellt somit ein Abbild eines Dateisystems im Speicher dar.<br />
<br />
In der Initrd sind jetzt Treibermodule enthalten, die nicht im Kernel enthalten sind, jedoch vor dem Einhängen des Root filesystems benötigt werden. Also ZB. Unterstützung für [[RAID allgemein ]], wenn das Root filesystem ein RAID Device ist, Unterstützung und Programme (zB. fsck, mount, umount) zum Umgang von Reiserfs, wenn das Root filesystem ein reiserfs ist. Unterstützung für einen SCSI-Controller soweit dieser nicht im Kernel enthalten ist, das Root filesystem sich aber auf einer Platte an diesem Controller befindet. Module für die Unterstützung der Netzwerkkarte, wenn das Root Filesystem über das Netz gebootet werden muss usw. <br />
<br />
Die Initial Ramdisk kann entweder ein mit [http://linux.die.net/man/1/gzip gzip] komprimiertes Abbild eines ext2-Dateisystems sein, oder aber auch ein mit [http://linux.die.net/man/1/gzip gzip] komprimiertes [http://www.gnu.org/software/cpio/manual/cpio.html cpio]-Archiv. Der Kernel erkennt im Normalfall beides an. In älteren Versionen von Suse war ehr das Dateisystemabbild zu finden, in den neuen Versionen wird das cpio-Achiv bevorzugt. Gelegentlich muss man bei Bootfehlern einmal in dieses initrd hinein, um dort etwas nachzuschauen oder selbst per Hand kleine Änderungen vornehmen. ( '''Vorsicht''': ändern an dieser Stelle ist nur was für wirklich erfahrene User) <br />
<br />
<br />
<br />
<br />
==== initrd ist ext2-Abbild ====<br />
<br />
Folgender Konsolauszug zeigt, wie man eine initrd (ext2 Abbild) öffnen kann: <br> <br />
''Das wieder Zusammensetzen eines hier geänderten Filesystems geht dann entsprechend wieder rückwärts zum Auspacken.''<br />
<br />
<pre><br />
LINUX:/tmp # cp /boot/initrd /tmp<br />
LINUX:/tmp # file initrd<br />
initrd: gzip compressed data, was "initrd_small", from Unix, max compression<br />
LINUX:/tmp # mv initrd initrd.gz<br />
LINUX:/tmp # gunzip initrd.gz<br />
<br />
gunzip: initrd.gz: decompression OK, trailing garbage ignored<br />
LINUX:/tmp # file initrd<br />
initrd: Linux rev 1.0 ext2 filesystem data<br />
LINUX:/tmp # mount -t ext2 -o loop /tmp/initrd /mnt<br />
LINUX:/tmp # cd /mnt<br />
LINUX:/mnt # ls -l<br />
total 17<br />
drwxr-xr-x 10 root root 1024 Jul 16 00:36 .<br />
drwxr-xr-x 24 root root 560 Nov 5 12:04 ..<br />
drwxr-xr-x 2 root root 1024 Jul 16 00:36 bin<br />
drwxr-xr-x 3 root root 1024 Jul 16 00:36 dev<br />
drwxr-xr-x 3 root root 1024 Jul 16 00:36 etc<br />
drwxr-xr-x 4 root root 1024 Oct 31 2004 lib<br />
-rwxr-xr-x 1 root root 6159 Jul 16 00:36 linuxrc<br />
drwxr-xr-x 2 root root 1024 Jul 16 00:36 mnt<br />
drwxr-xr-x 2 root root 1024 Jul 16 00:36 proc<br />
drwxr-xr-x 2 root root 1024 Jul 16 00:36 sbin<br />
drwxr-xr-x 2 root root 1024 Jul 16 00:36 sys<br />
LINUX:/mnt # </pre><br />
<br />
Abgearbeitet wird innerhalb dieser etwas älteren initrd die Datei '''linuxrc''' welche dann mit folgender Zeile endet. <br />
"'''die 0'''"<br />
<br />
<br />
<br />
==== initrd ist cpio-Archiv ====<br />
<br />
<pre><br />
LINUX:/boot # ls -l initrd*<br />
lrwxrwxrwx 1 root root 27 Feb 13 23:24 initrd -> initrd-2.6.18.8-0.9-default<br />
-rw-r--r-- 1 root root 3267755 Feb 13 23:24 initrd-2.6.18.8-0.9-default<br />
LINUX:/boot # cp initrd-2.6.18.8-0.9-default /tmp<br />
LINUX:/boot # cd /tmp<br />
LINUX:/tmp # file initrd-2.6.18.8-0.9-default<br />
initrd-2.6.18.8-0.9-default: gzip compressed data, from Unix, last modified: Wed Feb 13 23:23:59 2008, max compression<br />
LINUX:/tmp # mv initrd-2.6.18.8-0.9-default initrd.gz<br />
LINUX:/tmp # gunzip initrd.gz<br />
LINUX:/tmp # file initrd*<br />
initrd: ASCII cpio archive (SVR4 with no CRC)<br />
LINUX:/tmp # mkdir initrd-root<br />
LINUX:/tmp # cd initrd-root<br />
LINUX:/tmp/initrd-root # cpio -idum < ../initrd<br />
14440 blocks<br />
LINUX:/tmp/initrd-root # ls -l<br />
total 224<br />
drwxr-xr-x 2 root root 4096 May 23 20:15 bin<br />
-rw-r--r-- 1 root root 167125 May 23 20:15 bootsplash<br />
drwxr-xr-x 2 root root 4096 May 23 20:15 dev<br />
drwxr-xr-x 4 root root 4096 May 23 20:15 etc<br />
-rwxr-xr-x 1 root root 15105 May 23 20:15 init<br />
drwxr-xr-x 5 root root 4096 May 23 20:15 lib<br />
drwxr-xr-x 2 root root 4096 May 23 20:15 proc<br />
drwxr-xr-x 2 root root 4096 May 23 20:15 root<br />
drwxr-xr-x 2 root root 4096 May 23 20:15 sbin<br />
drwxr-xr-x 2 root root 4096 May 23 20:15 sys<br />
drwsrwxrwx 2 root root 4096 May 23 20:15 tmp<br />
drwxr-xr-x 3 root root 4096 May 23 20:15 var<br />
</pre><br />
Zusammengesetzt wird wieder in umgekehrter Reihenfolge.<br />
Abgearbeitet wird in dieser initrd die Datei '''init''' welche wiederum mit "'''die 0'''" endet<br />
<br />
Achtung: da es zur Zeit hier sehr viele Veränderungen bei der prinzipellen Hardware-Handhabung gibt, gibt es auch sehr viele Änderungen an den Scripten von mkinitrd und selbstverständich dem inneren Aufbau und deren Funktion der initrd selbst. Distributionsabhängig sollte man sich desshalb unbedingt vor manuellen Änderungen vorher noch einmal mit den Manpages und eventuell den mit der aktuellen Distribution installierten Dokumenten befassen. <br />
<br />
Sollten Fehler innerhalb der Abarbeitung der initrd auftreten, dann sind diese an der Bootkonsolausgabe ersichtlich. Meist sind es fehlende oder falsche Module, fehlende oder veraltete Konfigurationsinformationen oder die falsche initrd zu diesem Kernel. Ist das System über eine Boot- oder Install-CD komplett startbar, dann dort mittels des Befehls<br />
mkinitrd<br />
die initrd neu erzeugen. Sollte es nicht möglich sein, das System mittels einer solchen CD zu booten, so kann statt dessen ein System von CD gebootet werden und die initrd innerhalb einer [http://linux.die.net/man/2/chroot chroot]-Umgebung neu erstellt werden. Dazu ist es jedoch erforderlich entweder eine ganze Menge Optionen an den Befehl mkinitrd zu übergeben, oder was sehr viel einfach und fehlerfreier läuft, der chroot-Umgebung die Informationen zur Verfügung zu stellen, die sie zum erkennen aller Gegebenheiten benötigt.<br />
<br />
<pre><br />
mount /dev/...... /mnt #Rootfilesystem<br />
mount /dev/...... /mnt/..... #falls /boot /usr /var eigene Verzeichnisse darstellen diese unterhalb von /mnt einhängen<br />
chroot /mnt<br />
mount /proc<br />
mount /sys<br />
mkinitrd<br />
</pre><br />
<br />
<br />
<br />
=== Einhängen des Rootfilesystems ===<br />
<br />
Nachdem die initrd abgearbeitet ist, erfolgt das Laden des Rootfilesystems entsprechend den Angaben in der Grubkonfiguration. Das Filesystem wird per default erst einmal "readonly" gemountet.<br />
Hier werden die meisten Fehler jetzt aufschlagen, und sich bemerkbar machen mit Fehlern wie '''"kein Rootdevice gefunden"''' oder '''"Filesystem nicht bekannt"''' die schon zu einem früheren Zeitpunkt des Bootprozesses ihre Ursache haben, und jetzt hier dazu führen das das Rootfilesytem nicht gefunden und gemountet werden kann.<br />
<br />
'''mögliche Ursachen:'''<br />
* falsche Konfiguration oder Eingabe über das Rootdevice bei [[Grub]]<br />
* defekte Partitionstabelle, oder komplett zerschossenes Filesystem<br />
* fehlender Treiber für Filesystemunterstützung, oder Kontroller<br />
* fehlender Treiber oder Konfigurationen für [[RAID]] oder [[LVM]] <br />
* veralte Signaturen oder IDs für Logische oder physikalische Partitionen, zb nach Hardwareaustausch<br />
<br />
Sollte der Fehler hier auftreten, hilft nur Studium der Bootlogausgaben. Gefahndet hier wird nicht nur nach Fehlermeldungen sondern auch nach schlichtweg fehlenden Meldungen.<br />
<br />
Ist die Hardwareunterstützung der initrd geladen und das Rootfilesystem eingehängt, ist deren Aufgabe erledigt und die initrd stirbt und gibt den Staffelstab des bootens jetzt weiter an das Rootfilesystem. Die von der initrd geladenen Treibermodule und Konfigurationseinstellungen befinden jetzt im Systemspeicher oder sind jetzt Bestandteil des Kernels. Die wenigen Programme und [[Library]] die in der initrd enthalten waren und zur Abarbeitung in der initrd notwendig waren, befinden sich ja alle auch im Rootfilesystem, und darauf kann nun zugegriffen werden.<br />
<br />
<br />
<br />
<br />
=== Starten des init-Prozesses ===<br />
<br />
wenn das Root filesystem eingehängt ist wird das Programm [http://linux.die.net/man/8/init /sbin/init] gestartet. Dieser Prozess hat eine Konfigurationsdatei,<br />
die Datei '''/etc/inittab'''. Solange das System läuft, hat dieser Prozess immer die ID 1 und ist der Urahn aller anderen Prozesse im System. Prozesse die ihre Vorfahren verlieren aber selbst nicht beendet werden oder werden können, werden dann von diesem init-Prozess adoptiert. Befehle wie [http://linux.die.net/man/8/shutdown shutdown] oder '''/sbin/init''' selbst können den laufenden init-Prozess beinflussen und somit zB das System herunterfahren. Innerhalb der /etc/inittab können aber auch Tastenkombinationen und Signale konfiguriert werden, die init beeinflussen. So kann sich das System zB herunterfahren wenn von der Überwachung der Stromversorgung ein entsprechendes Signal an den init-Prozess gesendet wird, oder das System mit "ctrl-alt-del- Tastenkombination" heruntergefahren werden.<br />
Init durch /etc/initab konfiguriert startet dabei nur wenige Scripte oder Programme selbst sondern bediehnt sich zum Hochfahren des Systems den Scripten '''/etc/init.d/boot''' und '''/etc/init.d/rc'''. Was init nicht aus der Hand gibt, ist allerdings das Starten und Restarten der Anmeldekonsolen, welche auch innerhalb der inittab konfiguriert werden. Genaueres kann man in den Manpages von [http://linux.die.net/man/5/inittab inittab] und [http://linux.die.net/man/8/init init]<br />
nachlesen.<br />
<br />
<br />
<br />
<br />
==== die Bootscripte ====<br />
<br />
Das erste Script das innerhalb der inittab gestartet wird, ist bei SuSE normalerweise '''/etc/init.d/boot''' . Dieses Script startet dann die Startscripte unterhalb von '''/etc/init.d/boot.d''' Diese Prozedur läuft immer ab, egal welcher Runlevel dann letztendlich gestartet werden wird.<br />
<br />
Dort kommt es besonders nach Systemcrash öfter einmal zu einem Bootabbruch innerhalb des Scripte '''S03boot.rootfsck'''.<br />
Das Root filesystem ist so defekt, dass eine automatisierte Reparatur mit [http://man.splitbrain.org/fsck '''fsck'''] nicht funktioniert hat und dieses Programm interaktiv vom User gestartet werden soll. Hier hilft schon ein genaues lesen der Fehlermeldung, die schon fast genau sagt, was gemacht werden muss. Etwas knifflig kann es mit Reiserfs werden, hier hilft [[ReiserFS#Reiser-Dateisystem_reparieren|Reiser-Dateisystem reparieren]] eventuell weiter.<br />
<br />
Mit weiteren Abbrüchen innerhalb dieser ersten Boot-Scripte ist zu rechnen wenn die Daten innerhalb der [http://linux.die.net/man/5/fstab /etc/fstab] nicht korrekt sind, oder nicht den aktuellen Gegebenheiten entsprechen und damit Filesysteme nicht gemountet werden können, oder Filesysteme beschädigt sind, und somit nicht automatisch eingebunden werden können. <br />
<br />
Innerhalb dieser Boot-Scripte die jetzt hier gestartet werden, werden die Filesysteme geprüft und gemountet, dazu werden eventuelle weitere Module zur Ünterstützung von zB Raid oder Verschlüsselung geladen, es werden die Daten von wichtigen Systemresourcen überprüft oder gegebenenfalls neu erstellt, wie zB den Cache für den Library-Loader, Netzwerktechnisch wird vorerst nur einiges an Grundeinstellungen vorgenommen und das Loopback Interface konfiguriert.<br />
<br />
<br />
<br />
<br />
==== Starten der Runlevel ====<br />
<br />
sind die Bootscripte durchlaufen, wird aus der inittab heraus mittels des Scriptes /etc/init.d/rc der entsprechnede Runlevel durch Starten der Runlevelscripte gestartet. Hier erfolgt jetzt die weitere Konfiguration aller im System vorhandener Hardware, die eventuelle Konfiguration der Netzwerkschnittstellen und der Netzwerkdienste, sowie dem Start aller automatisch zu startenden Software. Viele der Scripte hier werden von den jeweiligen Programmpaketen bei der Installation schon mitgebracht. Die eventuelle Konfiguration für diese Dienste befinden sich nicht innerhalb der Scripte sondern oft unterhalb von '''/etc''' oder relativ '''../etc/''' der Binärdateien solcher Software <br><br />
<br />
Die Fehler, die hier auftreten können sind sehr vielfältig, wirklich tödliche Fehler hier aber eher selten, da das System als solches ansonsten voll funktionsfähig bleibt. Es läßt sich jedoch in aller Regel sehr schnell feststellen, in welchem Script ein solcher tödlicher Fehler aufgetreten ist. Entweder die Bootausgaben auswerten, in schwierigen Fällen hilft hier auch ein Starten des Runlevel 1 und das anschließende manuelle Starten der einzelnen Scripte, die zum Runlevel gehören, um das Entstehen eines tötlichen Fehlers näher eingrenzen zu können. Nicht funktionierende Dienste, obwohl scheinbar sauber gestartet, können zB dadurch ausgelöst werden, dass die Scripte nicht in der richtigen notwendigen Reihenfolge gestartet werden.<br><br />
Prinzipiell sollten Runlevelscripte nicht mehr, wie in früheren Zeiten, selbst per Handverlinkung in die Reihenfolge eingefügt werden. Neue Suse-Systeme werden solche Scripte gar nicht erst starten. Die Reihenfolge der Abarbeitung der Scripte, die in neuen Systemen auch [http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/8/startpar-man-page.html parallel abgearbeitet] werden, wird im wesentlichen durch die Konfiguration innerhalb von 3 Dateien im Verzeichnis '''/etc/rc.d/ ''' bestimmt.<br />
/etc/rc.d/.depend.boot <br />
/etc/rc.d/.depend.start <br />
/etc/rc.d/.depend.stop<br />
Entsprechend dem Header in dem Startscripten <br />
<pre><br />
<br />
### BEGIN INIT INFO<br />
# Provides: boot_facility_1 [ boot_facility_2 ...]<br />
# Required-Start: boot_facility_1 [ boot_facility_2 ...]<br />
# Required-Stop: boot_facility_1 [ boot_facility_2 ...]<br />
# Should-Start: boot_facility_1 [ boot_facility_2 ...]<br />
# Should-Stop: boot_facility_1 [ boot_facility_2 ...]<br />
# Default-Start: run_level_1 [ run_level_2 ...]<br />
# Default-Stop: run_level_1 [ run_level_2 ...]<br />
# Description: multiline_description<br />
### END INIT INFO<br />
</pre> <br />
werden beim Hinzufügen eines Scriptes durch den Befehl [http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/8/insserv-man-page.html insserv] diese Dateien entsprechend der Abhängigkeiten der einzelnen Scripte und Dienste untereinander, erstellt und bei der default eingestellten parallelen Abarbeitung der Scripte verwendet. <br />
<br />
<br />
Häufiges Problem bei Runlevel 5 ist [[Schwarzer Bildschirm - Grafische Oberfläche startet nicht|das Problem mit dem nichtstarten der Grafischen Oberfläche]], meist ausgelöst durch fehlerhafte Konfiguration des Xservers.<br />
<br />
<br />
<br />
<br />
==== Starten der Konsolen ====<br />
<br />
Nachdem /etc/init.d/rc seine Arbeit beendet hat, oft noch während einige Startscript im Hintergrund weiter arbeiten, werden von init die in der inittab konfigurierten Anmeldekonsolen gestartet. Diese Konsolen werden in aller Regel mit dem Schlüsselwort '''respawn''' in der inittab versehen und werden dann nach der Abmeldung neu gestartet, um auf einen neue Anmeldung zu warten. Hier sind die wenigsten Fehler zu erwarten, wenn man in die inittab keine groben Schnitzer einbaut.<br />
<br />
<br />
<br />
<br />
=== Die Meldungen des Bootprozesses ===<br />
<br />
Im Prinzip haben wir 3 Möglichkeiten die Ausgaben oder Logs die beim Booten entstehen, nachzulesen. Alle diese Ausgaben fallen in ihrem Format Aussehen und Inhalt etwas anders aus.<br />
; Die Ausgaben auf der Konsole:<br />
: hier werden wir alle Meldungen vom Start des Rechners, Bios. Bootloader, Kernelstart usw verfolgen können. Die Ausgabe der Linuxbootmeldungen auf der Konsole kann im Bootloader deaktiviert sein, ist aber durch einen Tastendruck (manchmal ESC oder F2) dennoch zu verfolgen. Allerdings ist die Ausgabe oftmals sehr schnell und läßt sich später nicht immer zurückscrollen. Bisweilen sind bei den Ausgaben auch einmal einiges durcheinander, da hier die Ausgaben von normalen Meldungen und Fehlermedungen bisweilen auch von mehren Prozessen gleichzeitig, ausgegeben werden. Bei den Runlevelscipten sehen wir hier oftmals nur derbe Fehler und ansonsten den Rückgabestatus des Startscriptes. Beim Hängen des Systems sieht man jedenfalls die letzten oft entscheidenten Zeilen.<br />
; Die Logs des Kernels:<br />
: die Kernellogs befinden sich in einem Ringpuffer innerhalb des Kernels und lassen sich jederzeit mit dem Befehl [http://linux.die.net/man/8/dmesg dmesg] auslesen, allerdings wird der Ringpuffer bei sehr vielen Meldungen irgendwann voll werden und vom Anfang an alte Meldungen überschreiben. Einige Systeme sichern deshalb die Ausgabe von dmesg nach dem Booten in einer Datei zB '''boot.log''' unterhalb von /var/log. Diese Meldungen beginnen mit dem Start des Kernels, Grubmeldungen werden wir hier also vergebens suchen.<br />
; Die Logs des Systemlogging:<br />
: Diese Meldungen werden per default in der Datei '''/var/log/messages''' abgelegt, und sind besser strukturiert als die anderen beiden Ausgaben, so dass man hier besser Filter auf die Meldungen ansetzen kann. Auch hat man hier oftmals die Logs von mehreren Bootvorgängen, so dass man diese unmittelbar vergleichen kann. Allerdings beginnen diese Meldungen erst wenn das Systemlogging aktiviert ist, frühe Meldungen des Kernels und der Initrd bzw Meldungen der ersten Bootscripte sind hier nicht zu finden.<br />
<br />
<br />
<br />
<br />
== Weitere Links zum Thema booten von Linux ==<br />
<br />
* [http://de.wikipedia.org/wiki/Booten Booten] (Wikipedia)<br />
* [http://www.linux-magazin.de/heft_abo/ausgaben/2007/02/auf_die_plaetze_fertig Schnelles Booten mit Upstart, einem Ersatz für das betagte Sys-V-Init] (Artikel Linux Magazin)<br />
* [http://vsr.informatik.tu-chemnitz.de/backup2/bsys_boot.htm PXE Bootablauf] (schematische Darstellung) <br />
* [http://www.gnu.org/software/grub/manual/legacy/index.html Grub Doku Version 0.97]<br />
* [[Bootmanager]]<br />
* [[BIOS]]<br />
* [[MBR]]<br />
* [[systemd]]<br />
<br />
[[Category:Linux-intern]] [[Category:Bootmanager]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Bootloader_wiederherstellen&diff=32135Bootloader wiederherstellen2015-09-05T20:26:51Z<p>Robi: intern verlinkt</p>
<hr />
<div>{{Review|Kompletter Artikel}}--[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 21:45, 7. Feb. 2014 (CET)<br />
<br />
Im Falle eines nicht mehr funktionierenden Boot-Prozesses ist es manchmal notwendig, den [[Bootmanager]] neu zu installieren. In solchen Fällen erscheint möglicherweise nach dem Start des Rechners nur die lapidare Anzeige:<br />
<pre><br />
GRUB<br />
</pre><br />
<br />
<br />
Der Vorgang kann prinzipiell mit einem beliebigen bootbaren Linux von USB-Stick oder CD geschehen, allerdings ist es wichtig, dass die Systemarchitektur passt (i386 vs. x86_64). <br />
<br />
Im folgenden Beispiel erfolgt die Reparatur von [[GRUB 2]] eines installierten [[OpenSUSE]] 13.1 mit einer KDE-Live-Version der selben Release. Analog dazu sollte die Vorgehensweise aber auch für andere Systeme und andere Bootloader funktionieren.<br />
<br />
=System mit Live-Version booten=<br />
Zuerst wird das System über den USB-Stick gebootet. Je nach [[BIOS|BIOS-Einstellungen]] muss man hierfür noch eine Tastenkombination (oft F2) drücken, um den Stick als Boot-Medium auswählen zu können. Nach dem Start öffnet man eine Shell und wird root-User:<br />
<pre><br />
linux@linux:~> su -<br />
</pre><br />
Oftmals starten Live-Systeme mit einem amerikanischen [[Tastaturlayout]]. Hier ist es für deutschsprachige Anwender hilfreich, eine passende Tastaturbelegung einzustellen. Dies kann beispielsweise so erreicht werden:<br />
<pre><br />
linux@linux:~ #loadkeys de-latin1.map<br />
</pre><br />
<br />
=Partitionierungslayout=<br />
Für die folgenden Schritte ist es wichtig, das Partitionierungslayout des Zielsystems verstanden zu haben. Eine übersichtliche Darstellung erreicht man über den Befehl ''lsblk'':<br />
<pre><br />
linux:~ # lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 1.8T 0 disk <br />
├─sda1 8:1 0 156M 0 part <br />
└─sda2 8:2 0 1.8T 0 part <br />
sdb 8:16 1 1.9G 0 disk <br />
├─sdb1 8:17 1 4M 0 part <br />
├─sdb2 8:18 1 936M 0 part /livecd<br />
└─sdb3 8:19 1 970M 0 part /read-write<br />
loop7 7:7 0 826.1M 1 loop /read-only<br />
</pre><br />
In diesem Beispiel steht 'sda' für die Festplatte und 'sdb' für den USB-Stick. Die Partition '/boot' liegt unverschlüsselt in 'sda1', der ersten primären Partition.<br />
<br />
Die anderen Teile des Dateisystems liegen in einem mit [[dm-crypt]] verschlüsselten Bereich auf 'sda2', welches die Bezeichnung der zweiten primären Partition ist. Darin befindet sich ein auf [[LVM]] basierendes Partitionierungsschema. Zuerst müssen alle Bereiche nacheinander zugreifbar gemacht werden.<br />
<br />
''Hinweis:'' Nicht alle Systeme sind so konfiguriert wie in diesem Beispiel. Oftmals findet man weder Verschlüsselung noch LVM vor, sondern nur primäre oder erweiterte Partitionen. Insofern sind die folgenden Abschnitte als '''optional''' anzusehen und werden bei Nicht-Verwendung ausgelassen:<br />
*[[#Cryptbereich entschlüsseln|Cryptbereich entschlüsseln]]<br />
*[[#LVM-Partitionierung einlesen|LVM-Partitionierung einlesen]]<br />
<br />
=Cryptbereich entschlüsseln=<br />
Zuerst muss der [[dm-crypt]]-Container entschlüsselt werden:<br />
<pre><br />
linux:~ # cryptsetup luksOpen /dev/sda2 crypted<br />
Enter passphrase for /dev/sda2: <br />
<br />
linux:~ # lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 1.8T 0 disk <br />
├─sda1 8:1 0 156M 0 part <br />
└─sda2 8:2 0 1.8T 0 part <br />
└─crypted 253:0 0 1.8T 0 crypt <br />
sdb 8:16 1 1.9G 0 disk <br />
├─sdb1 8:17 1 4M 0 part <br />
├─sdb2 8:18 1 936M 0 part /livecd<br />
└─sdb3 8:19 1 970M 0 part /read-write<br />
loop7 7:7 0 826.1M 1 loop /read-only<br />
</pre><br />
Man beachte das neu erzeugte Device 'crypted'.<br />
<br />
=LVM-Partitionierung einlesen=<br />
Die LVM-Partitionierung wird wie folgt eingelesen und verfügbar gemacht:<br />
<pre><br />
linux:~ # lvs<br />
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert<br />
home system -wi------ 1.66t <br />
os2 system -wi------ 10.00g <br />
root system -wi------ 10.00g <br />
swap system -wi------ 2.00g <br />
<br />
linux:~ # vgchange -a y<br />
<br />
linux:~ # lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 1.8T 0 disk <br />
├─sda1 8:1 0 156M 0 part <br />
└─sda2 8:2 0 1.8T 0 part <br />
└─crypted 253:0 0 1.8T 0 crypt <br />
├─system-home 253:1 0 1.7T 0 lvm <br />
├─system-root 253:2 0 10G 0 lvm <br />
├─system-swap 253:3 0 2G 0 lvm <br />
└─system-os2 253:4 0 10G 0 lvm <br />
sdb 8:16 1 1.9G 0 disk <br />
├─sdb1 8:17 1 4M 0 part <br />
├─sdb2 8:18 1 936M 0 part /livecd<br />
└─sdb3 8:19 1 970M 0 part /read-write<br />
loop7 7:7 0 826.1M 1 loop /read-only<br />
</pre><br />
Im vorliegenden Beispiel liegt die 'root'-Partition in der Volume Group (VG) 'system' in der Logical Volume (LV) 'root'. Diese wird unter /dev/system/root bereitgestellt.<br />
<br />
=chroot=<br />
Nun stehen alle notwendigen Bereiche zur Verfügung. Im Folgenden werden sie im Dateisystem zu einer Struktur verbunden, um dann via 'chroot' temporär in diese Systemumgebung zu wechseln.<br />
<br />
Zuerst die echten Dateisysteme '/' und '/boot':<br />
<pre><br />
linux:~ # mount /dev/system/root /mnt/<br />
linux:~ # mount /dev/sda1 /mnt/boot/<br />
</pre><br />
Anschließend die virtuellen Dateisysteme:<br />
<pre><br />
<br />
linux:~ # mount -o bind /dev /mnt/dev<br />
linux:~ # mount -o bind /sys /mnt/sys<br />
linux:~ # mount -t proc /proc /mnt/proc<br />
</pre><br />
Abschließend wird das 'chroot' durchgeführt:<br />
<pre><br />
linux:~ # chroot /mnt/ /bin/bash<br />
</pre><br />
Hinweis: Wenn hierbei ein Fehler auftritt wie der folgende, dann stimmen möglicherweise die Systemarchitekturen der Live-Version einerseits und des Zielsystems anderseits nicht überein (i386 vs. x86_64):<br />
<pre><br />
chroot: failed to run command ‘/bin/bash’: Exec format error<br />
<br />
linux:/ # uname -i<br />
x86_64<br />
</pre><br />
<br />
=Bootloader neu installieren=<br />
Nachdem nun die gewünschte Systemumgebung vollständig aktiv ist, kann der Bootloader neu geschrieben werden. Im Falle von [[GRUB 2]] wird diese erneute Installation so durchgeführt:<br />
<pre><br />
linux:/ # grub2-install /dev/sda<br />
Installation finished. No error reported.<br />
</pre><br />
Dabei wird der [[MBR]] der Festplatte 'sda' als Ziel verwendet.<br />
<br />
=Systemressourcen freigeben=<br />
Um den sauberen Neustart vorzubereiten, sollten alle Schritte in umgekehrter Reihenfolge wieder aufgelöst werden.<br />
<br />
chroot beenden:<br />
<pre><br />
linux:/ # exit<br />
exit<br />
</pre><br />
<br />
Dateisysteme lösen (umount):<br />
<pre><br />
linux:~ # umount /mnt/proc<br />
linux:~ # umount /mnt/sys<br />
linux:~ # umount /mnt/dev<br />
linux:~ # umount /mnt/boot<br />
linux:~ # umount /mnt/<br />
</pre><br />
<br />
Die LVM-Struktur auflösen:<br />
<pre><br />
linux:~ # vgchange -a n<br />
</pre><br />
<br />
Das Crypt-Device schliessen:<br />
<pre><br />
linux:~ # cryptsetup luksClose crypted<br />
</pre><br />
Abschliessend sollte die Block-Struktur wieder wie zu Anfang aussehen.<br />
<pre><br />
linux:~ # lsblk<br />
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT<br />
sda 8:0 0 1.8T 0 disk <br />
├─sda1 8:1 0 156M 0 part <br />
└─sda2 8:2 0 1.8T 0 part <br />
sdb 8:16 1 1.9G 0 disk <br />
├─sdb1 8:17 1 4M 0 part <br />
├─sdb2 8:18 1 936M 0 part /livecd<br />
└─sdb3 8:19 1 970M 0 part /read-write<br />
loop7 7:7 0 826.1M 1 loop /read-only<br />
</pre><br />
Nun sollte nach einem Reboot der Bootmanager wieder funktionieren:<br />
<pre><br />
linux:~ # reboot<br />
</pre><br />
<br />
=Links=<br />
*[http://www.rootz.de/2012/05/grub2-bootloader-mittels-linux-boot-cd-reparieren/ Grub2-Bootloader mittels Linux-Boot-CD reparieren (rootz)]<br />
*[https://de.wikipedia.org/wiki/Chroot chroot (Wikipedia)]<br />
*[[Bootmanager]]<br />
*[[GRUB 2]]<br />
<br />
[[Kategorie:Bootmanager]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=GRUB_Legacy&diff=32134GRUB Legacy2015-09-05T20:25:28Z<p>Robi: i</p>
<hr />
<div><br />
{{Infobox_Software|<br />
Name= GRUB<br />
|Screenshot= <br />
|Beschreibung= Grub Legacy<br />
|Hersteller= Das GRUB-Team<br />
|AktuelleVersion= 0.97<br />
|AktuelleVersionFreigabeDatum= 5/2006<br />
|Betriebssystem= Unix-Derivate, [[Linux]]<br />
|Kategorie= [[Bootmanager]]<br />
|Lizenz= [[GNU General Public License|GPL]]<br />
|Deutsch= nein<br />
|Website= http://www.gnu.org/software/grub/manual/legacy/index.html<br />
}}<br />
<br />
<br />
== Was ist GRUB Legacy ==<br />
<br />
<br />
GRUB (Grand Unified Bootloader) ist ein Boot-Manager, der heutzutage bei vielen Linux-Distributionen, wie z.B. Red Hat, [[Mandrake]] und auch [[openSUSE]] per default installiert wird.<br />
GRUB in seiner heutigen Form wird vom GNU Projekt gepflegt und weiterentwickelt. <br />
Aktuell ist [[GRUB 2]] eine komplette Neuentwicklung aus dem selben Team, aber nicht kompatibel zu Grub Legacy.<ref>http://www.gnu.org/software/grub/manual/legacy/index.html</ref><br />
<br />
GRUB Legacy kann verschiedene UNIX-Derivate wie [[Linux]], FreeBSD, NetBSD oder OpenBSD starten und auch das Booten von Windows ist kein Problem.<br />
<br />
<br />
<br />
<br />
== Der [[Bootvorgang]] mit GRUB (Legacy)==<br />
<br />
''Der Bootloader GRUB startet in 2 Stufen:''<br />
<br />
'''Stage1''' befindet sich entweder im Master Boot Record (MBR) der Festplatte oder im Boot-Sektor einer Partition. Die einzige Aufgabe dieser Stufe ist es, '''Stage2''' zu laden.<br />
Stage2 stellt die eigentlichen Funktionen des Bootloaders bereit. Diese befindet sich unter /boot/grub/stage2.<br />
<br />
Bei der Installation wird in der Stufe 1 festgeschrieben, an welchem physikalischen Ort sich die Stufe 2 befindet. Befindet sich /boot/grub in bestimmten Dateisystemen, dann wird eine 3. Stufe zwischen Stage1 und Stage2 benötigt, mit deren Hilfe das Dateisystem und somit die GRUB-Dateien gelesen werden können. Hier lädt stage1 die stage1_5, welche Zusatzcode für den Zugriff auf das verwendete Dateisystem enthält, und diese lädt dann stage2.<br />
<br />
Stage2 kann dann den Linux-Kernel laden und booten, oder auch andere Betriebssysteme oder andere Bootloader starten.<br />
<br />
<br />
<br />
<br />
== Festplattenbezeichnung unter GRUB ==<br />
<br />
Die Besonderheit von GRUB ist die Bezeichnung der Festplatten und Partitionen. <br />
Sie unterscheidet sich von der gewohnten Linux-Bezeichnug der Devices.<br />
<br />
hd0 = erste Festplatte<br />
hd1 = zweite Festlatte ...<br />
<br />
hd0,0 = 1. Partition der ersten Festplatte <br />
hd1,2 = 3. Partition der zweiten Festplatte ...<br />
<br />
Für UFS oder UFS2 benutzende Systeme wie Solaris oder BSD-Derivate:<br />
hd0,1,a= 1. Slice in der 2. Partition der 1. Platte<br />
<br />
Die Festplattenreihenfolge wird vom [[BIOS]] festgelegt, wobei die im BIOS festgelegte Boot-Platte immer 0x80 (hexadezimal 80, dezimal 128, bei GRUB im allgemeinen als hd0 bezeichnet) erhält und die übrigen Platten danach fortlaufend nummeriert werden.<br />
<br />
<br />
<br />
== Wichtige Konfigurationsdateien von GRUB Legacy==<br />
<br />
Die wichtigsten Konfigurations-Dateien von GRUB sind die '''/boot/grub/menu.lst''' und die '''/boot/grub/device.map'''. <br />
<br />
Die Datei '''/boot/grub/menu.lst''' ist die Menüdatei und enthält Informationen zu allen Partitionen und Betriebssystemen, welche mit GRUB gebootet werden sollen/können.<br />
'''<br />
Beispiel /boot/grub/menu.lst:'''<br />
<br />
color white/blue black/light-gray<br />
default 0<br />
timeout 8<br />
gfxmenu (hd1,1)/boot/message<br />
<br />
title Linux<br />
kernel (hd1,1)/boot/vmlinuz root=/dev/sdc2 vga=0x317 splash=silent acpi=off desktop resume=/dev/sdc1 showopts<br />
initrd (hd1,1)/boot/initrd<br />
<br />
title Windows<br />
root (hd0,0)<br />
chainloader +1<br />
<br />
title Diskette<br />
root (fd0)<br />
chainloader +1<br />
<br />
title Failsafe<br />
kernel (hd1,1)/boot/vmlinuz root=/dev/sdc2 showopts ide=nodma apm=off acpi=off vga=normal noresume nosmp noapic maxcpus=0 3<br />
initrd (hd1,1)/boot/initrd<br />
<br />
title Speichertest<br />
kernel (hd1,1)/boot/memtest.bin<br />
<br />
Wichtig für den „Anfangsgebrauch“ sind die Werte für "default" und "timeout": "timeout" gibt an, nach wie vielen Sekunden ohne Eingabe das unter "default" eingestellte Booteintrag ausgeführt werden soll.<br />
<br />
Etwas tiefere Einblick in die menu.lst bieten eine Vielzahl Von Artikeln und User Tips <ref>http://www.pro-linux.de/artikel/2/119/der-bootloader-grub.html</ref><br />
<br />
<br />
Beim Boot-Vorgang wird die Datei '''/boot/grub/device.map''' nicht verwendet, hier muss mit den Werten gelebt werden, die das BIOS gerade benutzt. Wenn im laufenden Linux-System GRUB-Aktivitäten ausgeführt werden, dient die Datei als Übersetzungtabelle zwischen GRUB- und Linux-Bezeichnung. Es ist zu beachten, dass die GRUB-Bezeichnung in diesem Fall formal nichts mit der BIOS-ID zu tun hat; um Mißverständnisse zu vermeiden, sollte daher dafür gesorgt werden, dass die Werte zusammenpassen (dazu können die Informationen aus dem als ''root'' ausgeführten Befehl<br />
hwinfo --disk | egrep "Device Files:|BIOS id:"<br />
verwendet werden). Wenn die Datei nicht vorhanden ist, wird sie bei der nächsten Ausführung des Programms ''grub'' (das sofort wieder mit "quit" verlassen werden kann) mit vermuteten Werten neu angelegt, die zwar in einfachen Fällen meist mit der jeweiligen BIOS-ID korrespondieren, dies aber nicht tun müssen.<br />
<br />
Beispiel /boot/grub/device.map:<br />
(fd0) /dev/fd0<br />
(hd0) /dev/sdc<br />
(hd1) /dev/sdd<br />
(hd2) /dev/sda<br />
(hd3) /dev/sdb<br />
<br />
<br />
<br />
Zur Konfiguration des Bootloader GRUB auf OpenSuse empfielt es sich, ein wenig in der Doku zu blättern. <ref>http://old-de.opensuse.org/SDB:Der_Bootmanager_GRUB</ref><br />
<br />
<br />
<br />
== Quellen und weiterführende Links ==<br />
<br />
* http://www.gnu.org/software/grub/manual/legacy/index.html<br />
* http://www.pl-berichte.de/t_system/grub-howto.html<br />
* http://old-de.opensuse.org/SDB:Der_Bootmanager_GRUB<br />
* http://tldp.org/HOWTO/Multiboot-with-GRUB.html<br />
* http://de.wikipedia.org/wiki/GRUB<br />
<br />
<br />
-----<br />
Fußnoten:<br />
{|class=wikitable<br />
|<br />
<references/><br />
|}<br />
<br />
<br />
<br />
----<br />
*[[Bootmanager]]<br />
*[[GRUB]], [[GRUB 2]]<br />
<br />
[[Category:Bootmanager]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Logitech_diNovo_Edge&diff=32133Logitech diNovo Edge2015-09-05T20:24:37Z<p>Robi: intern verlinkt</p>
<hr />
<div>{{Box Test||<br />
* [[openSUSE]] 11.1<br />
}}<br />
<br />
In einem HIDD Modus ist der Bluetoothdongle ist so eingestellt, dass die Tastatur ihre Funktionalität und Verbindung auch im [[BIOS]] und Bootloader, also bevor irgendein Betriebssystem hochgefahren wurde, behält. Dieser HIDD Modus ist als Default vom Hersteller aus eingestellt und ermöglicht nur die Verbindung mit einer Bluetooth Tastatur aufzubauen, also keine Datenübertragung oder Verbindungsaufbau mit einem Audiogerät oder Handy.<br />
<br />
Als Ergänzung: Der zweite mögliche Modus ist HCI. Dieser Modus erlaubt das Versenden bzw. Empfangen von Dateien mit z.B. einem Handy, aber auch den Verbindungsaufbau mit einer Bluetooth Tastatur, allerdings bietet dieser Modus keine Funktionalität abseits eines Betriebssystems (d.h. für den HCI Modus muss das Betriebssystem hochgefahren sein)<br />
<br />
Seit openSUSE 11.1 und Ubuntu 8.10 erweist sich der HIDD Modus "out of the box" als eine Hürde.<br />
<br />
== Konfiguration ==<br />
Zuerst muss man die Datei /etc/default/bluetooth editieren. Diese sollte folgendermaßen aussehen:<br />
# Bluetooth configuraton file<br />
<br />
# Run hid2hci (allowed values are "true" and "false")<br />
HID2HCI_ENABLE=false<br />
HIDD_ENABLED=1<br />
Als nächstes muss man die Datei /etc/init.d/bluetooth editieren. Man sucht zuerst diese Einträge<br />
DAEMON_EXEC=/usr/sbin/bluetoothd<br />
HID2HCI_EXEC=/usr/sbin/hid2hci<br />
RFCOMM_EXEC=/usr/bin/rfcomm<br />
PAND_EXEC=/usr/sbin/pand<br />
DUND_EXEC=/usr/sbin/dund<br />
DAEMON_ENABLE=true<br />
HID2HCI_ENABLE=false<br />
RFCOMM_ENABLE=true<br />
PAND_ENABLE=false<br />
DUND_ENABLE=false<br />
und fügt dazu diese Zeile ein<br />
HIDD_ENABLED=true<br />
Als nächstes Aktiviert man den Dienst "bluetooth" in Systemdienste(Runlevel) (bei Yast unter System zu finden), sodass dieser von Nein* auf Ja umspring und speichert dies anschließend.<br />
<br />
Als letztes baut man die Verbindung zwischen dem Dongle und der Tastatur auf indem man unter Gnome auf das in der Taskleiste befindliche Bluetooth Icon klickt und auf "Setup new device..." geht bzw. unter KDE (bitte hier den Vorgang für KDE einfügen).<br />
<br />
== Tipp ==<br />
Wenn man beim Pairing aufgefordert wird eine vorgegebene vierstellige Nummer einzugeben, dann tippt man diese auf der Tastatur ein und drückt anschließend auf die Taste "Enter".<br />
<br />
-----<br />
[[Hardware|Zurück zu Hardware]]<br />
<br />
[[Category:Hardware]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Hilfe_zu_Antworten_aus_dem_Forum&diff=32132Hilfe zu Antworten aus dem Forum2015-09-05T20:23:59Z<p>Robi: intern verlinkt</p>
<hr />
<div>Du hast Linux das erste Mal installiert, irgend etwas funktioniert nicht, also hast du eine Frage ins Forum gesetzt. Mit der Antwort kannst du jedoch überhaupt nichts anfangen. Ein Antwortender im Forum kann nicht immer einschätzen, welche Vorkenntnisse du mitbringst, und da kann es schon mal passieren, dass du eine kurze und knappe Antwort bekommst. Deshalb hier mal einige häufige Probleme mit den Antworten aus dem Forum.<br />
<br />
<br />
<br />
== gib mal folgendes ein ==<br />
<br />
'''Der Anworter möchte, dass du in einer der Konsolen einen Befehl eingibst, hat aber übersehen, dass du dich gar nicht anmelden kannst, und du noch nie etwas von einer Konsole gehört hast. Wo sollst du denn jetzt den Befehl oder die Zeile eingeben ?????<br />
'''<br />
<br />
<br />
Linux ist voll über die [http://www.bin-bash.de/index.php Komandozeile steuer- und bedienbar], die grafische Oberfläche ist quasi nur oben draufgelegt. Dort hin kannst du dich deshalb auch jederzeit bei Problemen hinretten. Es gibt verschiedene Möglichkeiten um dort hin zu gelangen. Erwarten tut dich dort eine Konsole, die ähnlich funktioniert wie die DOS-Kommandozeile innherhalb von Windows. Dort arbeitet eine Shell, die deine Eingaben entgegennimmt und ausführt. Ganz am Anfang wirst du wahrscheinlich ein paar Fragen haben wie zb [http://www.bin-bash.de/kommando.php Grundkommandos und Einführung] sowie [http://www.bin-bash.de/dateisystem.php Einführung in das Dateisystem] und [http://www.bin-bash.de/editor.php Editoren für die Konsole], dich aber schon nach kurzer Zeit einigermaßen zurechtfinden. <br />
<br />
Viele Linuxdistributionen starten beim Booten mehrere unabhängige Terminals oder Konsolen. Du erreichst sie mit den Tastenkombinationen '''STRG+ALT+F1''' bei Suse zB bis '''STRG+ALT+F6''' und kannst mit diesen Tastenkombinationen jederzeit dort hin und her wechseln. Auf der ersten Konsole sind auch die letzten Bootausgaben wahrscheinlich noch sichtbar. Mit der Tastenkombination '''STRG+ALT+F7''' würdest du die erste Grafische Oberfläche finden, bei '''STRG+ALT+F8''' eine eventuell zusätzlich gestartete 2 Grafische Oberfläche. Bei einigen Distributionen findest du auch noch einen Systemlog, bei Suse zB auf '''STRG+ALT+F10'''.<br />
<br />
An den Konsolen musst du dich mit einem Usernamen und einem Passwort anmelden. '''Achtung: das Passwort muss dort blind eingegeben werden. es erscheinen also keine ****** und der Cursor bewegt sich dabei auch nicht.''' Bestätigen natürlich mit ENTER :-)<br />
<br />
Innerhalb der Grafischen Oberflächen gibt es mehrere Programme, die auch Terminals und Konsolen als Fenster innerhalb der Grafischen Oberfläche bereitstellen, Dort brauchst du dich nicht anzumelden, da sie eindeutig dem Benutzer der grafischen Oberfläche zugeordnet werden, und der hat sich zu diesem Zeitpunkt schon angemeldet.<br />
Diese Programme findest du zB unter Menüpunkten wie '''System -> Terminals''' und könnten '''xterm''' oder einfach nur '''terminal''' heißen.<br />
<br />
<br />
<br />
=== Die Konsolausgabe ins Forum posten ===<br />
<br />
Dazu ist es am besten, wenn ihr ein X-Terminal, also ein Konsolfenster innerhalb der Grafischen Oberfläche öffnen könnt. Dort dann den Befehl ausführen und die Ausgabe markieren. Entweder könnt ihr das markierte dann direkt im Webbrowser in eure Antwort einfügen (oft mittlere Maustaste) oder über '''copy''' beim xterminal und '''paste''' im Browser einfügen. Bitte nicht vergessen, das ganze in [code] [/code] einzuschließen, damit es im Forum vernünftig aussieht und leichter lesbar ist.<br />
<br />
<br />
<br />
=== Konsolausgabe ins Forum posten, wenn Grafisch nichts geht ===<br />
<br />
Wenn keine grafische Oberfläche startbar ist und ihr deshalb auch keinen Browser auf diesem Rechner habt, mit dem ihr direkt posten könnt, auch kein zweiter Rechner da ist, mit dem [[Mit putty und ssh key auf einen sicheren Linux Server zugreifen|remote auf diesen Rechner zugreifen]] kann, wird es etwas komplizierter. <br />
Solange Linux ansonsten voll einsatz- und funktionstüchtig ist, sollte es in den meisten Fällen möglich sein, einen USB-Stick oder eine SD-Karte oä. an das System anzuschließen. Einfach einmal anschließen und 10 Sekunden warten. Anschließend (bei Suse) auf der Konsole mal mit '''cd''' in das Verzeichnis '''/media''' wechseln und dort mit '''ls''' etwas umsehen.<br />
Die Schritte im einzelnen:<br />
Konsole wie oben beschrieben öffen und anmelden. ZB einen USB-Sick anschließen<br />
cd /media<br />
ls<br />
Als Ergebniss erhaltet ihr wahrscheinlich bei Erfolg irgend so was hier.<br />
.hal-mtab .hal-mtab-lock disk<br />
Von interesse ist hier im Beispiel das Verzeichnis '''disk''', das kann aber bei euch auch ganz anders heißen, könnte zB den Namen eures USB-Sticks haben und es könnten sich auch noch mehrere dort befinden. In dieses Verzeichnis wechseln und dort umschauen, was es für Dateien dort schon gibt.<br />
cd disk<br />
ls<br />
'''Bei aktuellen Distributionen''' ist das Einhängen von Wechseldatenträgern eine Dienstleistung der jeweiligen grafischen Oberfläche, daher ist das Verzeichnis '''/media''' üblicherweise leer. Das Einhängen ist '''manuell''' vorzunehmen. Mit dem als root ausgeführten Befehl<br />
ls -l /dev/disk/by-id/usb*<br />
kann der USB-Stick identifiziert werden, die rechts stehende ''device'' /dev/sdXY der Partition wird zum Einhängen verwendet:<br />
mount /dev/sdXY /media<br />
(X und Y sind der Ausgabe des ls-Befehls zu entnehmen).<br />
<br />
Jetzt könnt ihr euren Befehl eingeben, dessen Ausgabe hier gewünscht wird. Die Ausgabe erhaltet ihr erstmal auf der Konsole, das nützt noch wenig.<br />
Den Befehl noch einmal eingeben und hinter den Befehl '''> Dateinam.txt''' schreiben. Wobei '''Dateinam.txt''' ein von euch frei wählbarer Dateiname ist, der natürlich nicht schon vorhanden Dateien auf dem USB-Stick überschreiben sollte, also aufpassen, welchen Dateinamen ihr wählt.<br />
befehl > Dateinam.txt<br />
eine eventuelle Fehlermeldung würde dabei nicht mit in die Datei geschrieben, sondern würde weiterhin auf der Konsole landen. Oftmals ist auch diese Fehlermeldung noch von Interesse. Sowohl die normale Befehlsausgabe als auch die Fehlerausgabe in eine Datei umleiten geht zB wie folgt.<br />
befehl > Dateiname.txt 2>&1<br />
Den Erfolg könnt ihr euch schon mal anschauen, indem ihr eure angelegte Datei mal probehalber auslest. <br />
cat Dateinam.txt<br />
sollte das selbe anzeigen wie vorhin der Befehl ohne die Umleitung in die Datei.<br><br />
sollte der geforderte Befehl in einem bestimmten Verzeichnis des Rechner abgegeben werden müssen, dann einfach beim Dateinamen den vollen Verzeichnispfad zu der Datei auf dem USB-Stick angeben zB<br />
befehl > /media/disk/Dateinam.txt<br />
ausleseen dann analog, (Das ist dann auch der Befehl, um das auf einem anderen Linuxrechner wieder von konsole auszulesen. Bei längeren Dateien ist jedoch '''more''' besser, da man dann im Text besser navigieren kann.)<br />
cat /media/disk/Dateinam.txt<br />
Werden Informationen von mehreren Befehlen benötigt ist es natürlich sehr mühselig die Ausgaben alle einzeln in Dateien umzuleiten. Auf vielen Linuxsystemen sollte es den Befehl [http://linux.die.net/man/1/script script] geben. Damit lassen sich ganz automatisch alle Ausgaben von der Konsole parallel auch in eine Datei schreiben. Aufruf zB.<br />
script dateiname.log<br />
Jetzt werden alle Ausgaben automatisch auch in die Datei '''dateiname.log''' geschrieben. Wenn es auf den USB-Stick soll, müsst ihr natürlich den kompletten Verzeichnisbaum zur Datei auf dem USB-Stick mit angeben. Beendet wird das ganze mit dem Schließen der aktuellen Shell also zB durch '''exit''' oder '''STRG + D'''<br />
<br />
An dieser Stelle jetzt aber nicht einfach den USB-Stick entfernen. Für den absolut unerfahrenen Anfänger hier am besten den Rechner herunterfahren, ihr werdet den Rechner wahrscheinlich sowieso mit einem anderen Betriebssystem benötigen. Runterfahren geht nur als User root<br />
Befehle dazu in absteigender Reihenfolge ausprobieren.<br />
shutdown -h now<br />
init 0<br />
halt<br />
<br />
eventuell auch STRG+ALT+ENTF. Irgendetwas davon sollte funktionieren und den Rechner ausschalten.<br />
<br />
Wenn das Einhängen wie oben beschrieben '''manuell''' erfolgt ist, kann der USB-Stick nach Durchführung der Befehle<br />
sync<br />
umount /media<br />
entfernt werden.<br />
<br />
Jetzt könnt ihr euren Rechner zB mit Windows starten und die Datei auf dem USB-Stick auslesen und hier her posten. Die Datei bitte mit WordPad offnen, da sonst eventuell das Format nicht als Unix erkannt wird und alles in einer Zeile steht.<br />
<br />
<br />
<br />
=== Konsolausgabe ins Forum posten wenn der Rechner beim booten hängen bleibt ===<br />
<br />
Wenn der Rechner früh hängen bleibt und somit die Dienste noch nicht laufen die zB automatisch USB einbinden. Ist eventuell das Rootfilesystem "'''/'''" schon zum schreiben geöffnet. Ihr müsst euch hier wahrscheinlich sowieso erstmal als Root anmelden.<br />
Testen ob das Root-Verzeichnis schreibbar ist geht mit dem Befehl '''mount'''<br />
Kommt als Ergebnis unter anderen folgende Zeile<br />
/dev/sda2 on / type ext3 (rw,acl,user_xattr)<br />
Die Zeile wird bei euch etwas anders aussehen. Wichtig ist das '''"/"''' hinter '''on''' das ist das Rootfilesystem und die Option '''"rw"''' in der Klammer, die sowie bedeutet wie Read-Write also Lesen und Schreiben. Das Gegenteil davon währe '''"ro"''' (Readonly) also nur Lesbar <br />
<br />
Ist dieses Dateisystem zum Schreiben geöffnet, so kann auch eine Datei darin angelegt werden, in der ihr die Ausgabe des Befehles umleiten könnt, wie steht etwas weiter oben. Als Ablageort empfiehlt sich das Verzeichnis /tmp , also zB nach '''> /tmp/Dateinam.txt''' als Umleitung für die Ausgaben nutzen, dann sollte es auf den meisten Rechnern im Rootfilesystem im Verzeichnis /tmp ankommen.<br />
Den Inhalt dieser Datei könntest ihr zB dann aus einem Livesystem heraus ins Forum posten.<br />
<br />
Ist das Rootfilesystem nur zum Lesen eingebunden, (dann wird wohl erstmal ein [[Hilfe zu Antworten aus dem Forum#mach mal fsck irgendwas|Filesystemcheck]] angebracht sein.)<br />
<br />
<br />
<br />
=== Konsolausgabe ins Forum posten wenn gar nichts mehr geht ===<br />
<br />
Im frühen oder sehr frühem Bootstatus sind vor allem die Meldungen und Fehlerausgaben des Rechner von interesse.<br />
Zwar wird es in den meisten Fällen durchaus möglich sein, sich diese Ausgaben über ein Null-Modem-Kabel in eine Terminalemulation eines anderen Rechners einzulesen, aber das ist eine Option ehr für die Profis und solche die schon wissen was ein Null-Modem-Kabel überhaupt ist. ;-) <br />
<br />
In den meisten Fällen müßte hier also die Ausgabe des Rechners oder die Fehlermeldung wirklich abgeschrieben werden und dann von einem anderem Rechner gepostet werden. Aber bitte in solchen Fällen möglichst genau abschreiben und nicht "Error irgendwas Parition" damit kann niemand wirklich was anfangen.<br />
Hin und wieder war es auch recht nützlich einfach den Bildschirm zu fotografieren und den Link auf das Foto ins Forum zu posten. Wenn wirklich die relevante Fehler-Meldung <br />
dabei rüberkommt, ist es immerhin noch eine Alternative, wenn auch nicht die Schönste.<br />
<br />
<br />
<br />
<br />
== als root folgendes eingeben ==<br />
<br />
'''Der Antwortende möchte, das du auf einer Konsole, siehe oben, eine Eingabe unter einer bestimmten User-Kennung vornimmst, und zwar die des Systemadministrators.'''<br />
<br />
Der System-Administrator und Linux und anderen Unix-Betriebssytemen heißt immer '''root'''. Diese Userkennung hat so gut wie keinerlei Beschränkungen, bzw. könnte sich mit eventuellen weiteren Befehlen über jede Beschränkung innerhalb des Betriebssystems hinweg setzten, so das dieser User alles mit dem Rechner machen könnte. Viele Systemverwalter Befehle können nur mit dieser Userkennung ausgeführt werden, und auch an einige wichtige Logdateien kommt man ohne diese Userkennung gar nicht heran. [[Permanent root sein|Ein permanentes Arbeiten unter Linux unter dieser Kennung ist allerdings sehr gefährlich]]. Ein Root-Passwort wird schon während der Installation abgefragt und vergeben, und wird natürlich für die Anmeldung oder eines Userwechsels benötigt. <br />
<br />
Also entweder man meldet sich auf einer Konsole in der Anmeldung als User root an, oder wechselt mit dem Befehl<br />
su - <br />
innerhalb einer Userkonsolsitzung den User. Abmelden dann nicht vergessen. also entweder '''exit''' oder '''STRG+D''' beendet eine so geöffnete Shell, und man kann als normaler User weiterarbeiten. Weitere Möglichkeiten als root Befehle oder Progamme auszuführen gibt es ebenfalls [[Permanent root sein|hier]]<br />
<br />
<br />
<br />
<br />
== man irgendwas ==<br />
<br />
'''Der Antworter möchte dich darauf aufmerksam machen, dass die Antwort auf deinen Frage in der Dokumentation leicht zu finden ist'''<br />
<br />
Auch Hinweise wie '''[http://lug-s.org/dokumentation/kurse/linux/extra/rtfm.html RTFM]''' oder Schlagworte wie '''Manpage''' gehen genau in diese Richtung. Linux bringt anders als Windows ein sehr umfangreiches Hilfesystem und Beschreibung für die meisten Befehle gleich mit. Bei den meisten Distributionen werden umfangreichte Dokumentationen und Hilfen schon bei der Installation angelegt bzw. sie werden mit den einzelnen Programmpaketen mit installiert. Es gibt die '''Manpages''', die '''Infoseiten''' einprogramierte '''Help-Option''' in sehr vielen Befehlen und zusätzlich noch Dokumentationen und Howtos die oft schon auf deinem Rechner mit installiert sind. <br />
<br />
Eine Einführung in die [[Man pages|Nutzung der Online Hilfe]] weiter [[Einfuehrung in SuSE-Linux für Newbies| hilfreiche Links für Neulinge]] und die [[OpenSUSE Handbücher| Links zu den Handbüchern]] gibts hier im Wiki<br />
<br />
<br />
<br />
<br />
== was sagt denn irgendwas ==<br />
<br />
'''Es gibt eine ganze Reihe sehr häufig im Forum für eine Hilfe erforderliche Dateiinhalte oder Ausgaben von Befehlen, oftmals wird vom Antworter vorausgesetzt das beim Schlagwort bekannt ist, ob es sich um einen Befehl oder eine Datei handelt und das auch die genaue Position innerhalb des Dateisystems bekannt ist, sowie der Befehl zur Ausgabe des Dateiinhaltes'''<br />
<br />
<br />
<br />
Das Problem hierbei, es ist für einen absoluten Neuling manchmal überhaupt nicht ersichtlich, handelt es sich nun um eine Datei oder einen Befehl, oder um irgend ein Programm, hier mal einige häufige Schlagworte in Tabellenübersicht, eine solche Tabelle kann aber nie vollständig werden, deshalb im Zweifelsfall mal nach diesem Schlagwort innerhalb des Forums mit der Suchfunktion suchen. <br />
<br />
<br />
{| Border=1<br />
|+ '''Schagworte und was damit anfangen'''<br />
! Schlagwort !! Type !! was tun !! Bedeutung des Inhaltes der Ausgabe<br />
<br />
|-<br />
! df <br />
||Befehl||als normaler User in einer Konsole ausführen <br />
|| zeigt die Größe und die belegte und verfügbare Kapazität der Filesysteme an<br />
<br />
|-<br />
! ls <br />
||Befehl||als normaler User in einer Konsole ausführen, eventuell muss vorher mit dem Befehl [http://www.bin-bash.de/kommando.php cd] erst in das betreffende Verzeichnis gewechselt werden <ref name="Option ls"> wird oft mit der Option "-l" benutzt, es handelt sich dabei um ein kleines "L" nicht um eine "1" oder um ein Großes "i" </ref> <br />
|| listet die Dateien des aktuellen Verzeichnisses auf <br />
<br />
|-<br />
! mount <br />
||Befehl||als normaler User in einer Konsole ausführen <br />
|| zeigt wenn keine weiteren Optionen verwendet werden die aktuelle ins System integrierten Dateisysteme, (sind weiter Optionen dort angegeben siehe [[#mounte oder umounte mal irgendwas|hier]])<br />
<br />
|-<br />
! fstab <br />
||Datei||"'''cat /etc/fstab'''" in Konsole ausführen <br />
|| enthält die Konfiguration der Dateisysteme<br />
<br />
|-<br />
! menu.lst<br />
|| Datei || "'''cat /boot/grub/menu.lst'''" als Root in Konsole auführen<br />
|| enthält die Konfiguration des Bootloaders [[GRUB Legacy]]<br />
<br />
|-<br />
! device.map<br />
|| Datei || "'''cat /boot/grub/device.map'''" als Root in Konsole ausführen<br />
|| enthält eine Zuordnung der vom [[BIOS]] gemeldeten Plattenreihenfolge für den Bootloader Grub<br />
<br />
|-<br />
! grub.conf<br />
|| Datei || "'''cat /etc/grub.conf'''" als Root in Konsole ausführen<br />
|| enthält eine Suse-Yast-typische Konfigurationsdatei für den Bootloader, deren Inhalt hin und wieder für bestimmte Bootprobleme bei [[GRUB Legacy]] verantwortlich ist. <br />
<br />
|-<br />
! dmesg<br />
||Befehl||als user in Konsole ausführen <ref name="lange Datei">Die Ausgabe wird sehr umfangreich, ohne spezielle Kenntnisse wird es oft schwer wirklich die relevanten Informationen da herauszufinden, sind keine speziellen Fehler, keine anderen Auswahlkriterien oder der Dateianfang oder -ende gemeint, dann bitte keine Monsterpostings sondern erst mal [http://www.linux-club.de/viewtopic.php?f=48&t=67358 hier] lesen </ref> <br />
||enthält die Meldungen des Linuxkernels seit dem booten<br />
<br />
|-<br />
! messages <br />
||Datei||"'''cat /var/log/messages'''" als root in Konsole ausführen <ref name="lange Datei"> </ref> <br />
|| enthält den Großteil der gesammelten Logs des Systems<br />
<br />
|-<br />
! fdisk <br />
||Befehl||"'''fdisk -l'''" in Konsole als root ausführen <ref name="Option ls"> </ref> <br />
|| gibt die Partitionstabellen aller im System befindlicher Festplatten aus<br />
<br />
|-<br />
! lspci<br />
|| Befehl|| "'''lspci'''" in Konsole als root ausführen <ref name="Optionen"> wird manchmal auch mit weiteren Optionen benötigt </ref><br />
|| listet die sich im Rechner befindenden PCI-Geräte und Kontroller auf, die Ausgabe ist stark abhängig eventueller weiter Optionen<br />
<br />
|-<br />
! lsusb<br />
|| Befehl|| "'''lsusb'''" in Konsole als root ausführen <ref name="Optionen"> </ref><br />
|| listet die sich am Rechner befindenden USB-Geräte auf<br />
|}<br />
<br />
<br />
Benötigt wird in den allermeisten Fällen eine wirklich genaue Ausgabe solcher Befehle und Dateien bzw. Teilen davon. Die Ausgaben also möglichst nicht abschreiben sondern kopieren und einfügen und hier als Code-markiert (in Ausnahmen auch also Quote-markiert) ins Forum posten. Es kommt besonders bei Konfigurationen und Fehlermeldungen gelegentlich auf winzige Kleinigkeiten an. In vielen Fällen werden die Ausgaben so lang, dass sie nicht auf eine Bildschirm-Seite passen. Für das direkte posten ins Forum sind sie dann meist sowieso zu lang <ref name="lange Datei"> </ref> , aber ihr habt bestimmt von Antworter einen Hinweis erhalten nach was ihr in der Ausgabe Ausschau halten sollt. Im Zweifelsfall sind es Zeilen mit '''ERROR''' oder ähnlichen Auffälligkeiten oder sich ständig wiederholende Zeileninhalte. Es gibt dafür 2 prinzipielle Lösungen, entweder ihr schreibt die Ausgabe des Befehles nicht auf den Bildschirm sondern in eine Datei, und schaut euch diese dann anschließend an. Dazu auf der Konsole an das Ende des Befehles ein Umleitungssymbol "''' > '''" und den gewünschten Dateinamen also zB. um die Kernelmeldungen seit dem booten des Rechners in die Datei '''/tmp/boot.log''' zu schreiben, um sie später anzuschauen.<br />
dmesg > /tmp/boot.log<br />
<br />
die andere Möglichkeit, einen Pager verwenden, der euch einen seitenweise Anzeige ermöglicht. Häufig wird unter Linux [http://linux.die.net/man/1/more more] verwendet. Bei Dateien einfach die Datei mit '''more''' öffnen.<br />
more Datei<br />
bei Konsolausgaben die Ausgabe eines Befehles durch einen Pipe "''' |''' " an '''more''' übergeben <br />
dmesg | more<br />
Zeilenweise nach vorne geht es dann mit '''Enter''', Seitenweise mit der Leertaste oder mit '''z''' und Beenden mit '''q''' (wie Quit). Hilfe gibt es mit '''h''' . Weitere Grundlagen zu Ausgabeumleitung findet ihr auch [http://www.bin-bash.de/komfort.php hier]<br />
<br />
== mach mal init 3 ==<br />
<br />
'''Oftmals in Verbindung mit Grafikartenproblemen, der Antworter will dir damit sagen, du sollst mal den Runlevel ändern.'''<br />
<br />
Es gibt im Linux verschiedene Systemzustände ([http://de.wikipedia.org/wiki/Runlevel Runlevel]). Nach der Installation von Linux auf Desktop-Rechnern wird im Normalfall automatisch Runlevel 5 gestartet, der die grafische Oberfläche startet. Gibt es hier direkt nach der Installation zB Problem mit der Grafikkarte, ist es oftmals erforderlich zur Diagnose und Behebung des Fehlers den Runlevel zu ändern. Runlevel 3 würde bedeuten, volle Funktion des Rechners aber grafische Oberfläche nicht automatisch starten. Zum ändern des Runlevels eines laufenden Rechners dann zuerst einmal auf eine [[ #gib mal folgendes ein|Konsole wechseln]] also zB '''STRG+ALT+F2''' und dort als root anmelden. Dann dort in der Konsole folgenden Befehl abgeben<br />
init 3<br />
eine andere Möglichkeit den Rechner beim booten anweisen in den Runlevel 3 zu starten. Wenn nach dem einschalten des Rechners sich der Bootloader mit dem Menü meldet, dann in die Zeile für Bootoptionen nur eine <br />
3 <br />
am Ende zusätzlich reinschreiben und mit Enter das System starten. Der Rechner wird jetzt den Runlevel 3 starten und euch auf einer Konsole mit einer Loginaufforderung begrüßen. Von hier könnt ihr jetzt nach der Anmeldung die Befehle ausführen die der Antworter euch vorgeschlagen hat.<br />
<br />
Nach erfolgreicher Reparatur oder Umkonfiguration der Grafikarte könnte ihr von dort aus direkt mit <br />
init 5 <br />
wieder den normalen Runlevel und damit die grafische Oberfläche starten.<br />
<br />
<br />
<br />
<br />
== mounte oder umounte mal irgendwas ==<br />
<br />
'''Der Antworter möchte dir damit sagen, du sollst mal am Dateibaum von Linux ein Filesystem zusätzlich einhängen oder aushängen, um zB eine Datei auf einem anderem derzeit nicht zugänglichen Filesystem auslesen zu können'''<br />
<br />
Es ist ein etwas komplexes Thema und eine etwas umfangreichere Einführung gibt es [http://www.bin-bash.de/dateisystem.php hier]. An dieser Stelle nur ein Universal-Konzentrat ohne Tiefgang.<br />
<br />
Linux verwendet einen verzweigten [http://www.selflinux.org/selflinux/html/verzeichnisse_unter_linux01.html Dateibaum], in dem alle Filesysteme integriert sind, und der beliebig erweiterbar ist. Normalerweise erledigt das Linux automatisch über eine Konfigurationsdatei ('''/etc/fstab''') oder über Funktionen des Plug & Play Systems. Manchmal sollen jedoch auch mal auf die Schnelle unkonfigurierte Filesysteme aus irgend einen Grund kurzzeitig eingehängt werden. Das Filesystem ist dann das '''irgendwas''' in der obrigen Aufforderung, und befindet sich in der Regel auf einer Partition eines Datenträgers, und dieser Name wird gebraucht, oder ist euch genannt worden.<br />
Auf neueren Susesystemen sind folgende Namen für Datenträger zu erwarten (zB : '''sda''' ist die erste Platte '''sdb''' die zweite usw. und Partitionsbezeichnungen wird als Zahl dahinter gesetzt. ('''sdd3''' ist also die 4 Platte die dritte Partition)<br />
<br />
Der Name allein reicht nicht, wir brauchen den Geräteknoten von Linux dazu. Das ist eine spezielle Datei selbigen Namens die sich im Verzeichnis '''/dev''' befindet. <br />
Für das Filesystem auf der 4. Platte in der 3. Partition ergibt sich also der komplette Name '''"/dev/sdd3'''" als das komplette ''irgendwas'' was wir benötigen.<br />
<br />
Wir benötigen noch eine leeres Verzeichnis als den Einhängepunkt unseres Filesystems. Linux hat für den temporären Gebrauch dafür schon eines vorgesehen '''/mnt'''<br />
<br />
Der Befehl dazu lautet '''mount''' und ist in diesem Fall als '''root''' auszuführen. Meist reicht er so.<br />
mount /dev/sdd3 /mnt<br />
Also Filesystem 4.Platte 3.Partition in /mnt einhängen. Die Dateien in dem Filesystem sind dann unter ihrem Namen mit vorgestelltem /mnt zu erreichen. also die Datei '''bild1''' im Verzeichnis '''bilder''' in diesem Dateisystem als '''/mnt/bilder/bild1'''. Oder man wechselt das Verzeichnis mit '''cd''' in das entsprechende Verzeichnis.<br />
cd /mnt/bilder <br />
<br />
<br />
Aushängen geht dann ähnlich, wir benötigen dafür allerdings nur entweder unser komplettes irgendwas oder das Verzeichnis in das das Filesystem eingehängt ist. Der Befehl dazu lautet '''umount'''<br />
umount /mnt<br />
würde das oben eingehängte Filesystem also wieder aushängen. ( Voraussetzung dafür das das funktioniet ist jedoch, das derzeit niemand mehr auf eine Datei dieses Filesystems zugreift und wir auch nicht selbst uns noch mit dem aktuellem Dateisystemabschnitt aufhalten ) Im Zweifelsfall oder bei Problemen mit dem aushängen, lassen wie es ist, beim nächsten Reboot des Rechners regelt sich das von selbst.<br />
<br />
<br />
<br />
<br />
<br />
== mach mal fsck irgendwas ==<br />
<br />
'''Der Antworter will dir hier verständlich machen, dass das Fehlerbild eventuell auch auf einen Filesystem-Error hindeuten könnte, und möchte dir raten mal das Filesystem zu überprüfen und reparieren zu lassen.'''<br />
<br />
Dieses ist ein etwas komplexeres Thema, da es dabei verschieden Szenarien geben kann, hier einige Ausführungen die dem Linuxneuling in den meisten Fällen weiterhelfen soll. ''(Wir beschränken uns hier im Speziellen auf den Defaultfall bei Suse und die ext2/ext3 Filesysteme, eventuelle anderen Linuxfilesysteme (Ausnahmen bestätigen die Regel) würden mit den vorgestellten Befehlen auch automatisch repariert, bei einigen Filesystemen gibt es auch speziellen Optionen auf die hier nicht eingegangen wird.) <br />
''<br />
<br />
Zuerst aber einmal. '''Wir prüfen und reparieren Filesysteme immer in dem Betriebssystem zu dem das Filesystemtypen passen.''' Also '''ext2, ext2, reiserfs''' usw von Linux aus und '''ntfs, vfat''' usw von Windows aus. Mit einem BMW fährt man bei bestimmten Problemen auch nicht in einen VW Werkstatt und alleine die Tatsache das man ein Filesystem lesen und beschreiben kann, bedeutet noch nicht, das man es auch wirklich richtig reparieren kann.<br />
<br />
Linuxfilesysteme werden beim booten überprüft, aber nicht immer und jedes mal wirklich vollständig. das dauert sonst je nach Größe manchmal viele Minuten bis Stunden. Und nur ganz selten ist es wirklich notwendig, da andere Mechnismen das recht gut abfedern. Es ist also dennoch jederzeit auch mal möglich, das im Filesystem kleinere oder größere Strukturfehler enthalten sind, die recht seltsame Fehler produzieren können. <br />
<br />
<br />
<br />
<br />
===Die einfachste Möglichkeit: alle beim booten automatisch prüfen lassen ===<br />
<br />
als Root an einer Konsole anmelden, und folgenden Befehl eingeben.<br />
touch /forcefsck<br />
Danach den Rechner rebooten. Der Befehl legt eine leere Datei an, die den Rechner dazu bringt, beim nächten Booten alle Linuxfilesysteme die er automatisch prüfen soll, wirklich komplett zu überprüfen und automatisch zu reparieren. Das kann je nach Größe und Anzahl der Platten eine ganze Zeit dauern, den Fortschritt könnt ihr auf der Bootkonsole verfolgen.<br />
<br />
<br />
<br />
<br />
===Alternativ:die Filesysteme von einem anderem Linux aus prüfen===<br />
<br />
Dazu muss man die Platten,Partitionen und deren genaue Namen kennen die ein Linuxfilesystem beherrbergen und zu diesem System gehören.<br />
mount | grep ext<br />
zeigt zum Beispiel in aktuellem System alle derzeit aktiven ext2/ext3 Filesysteme, in der Ausgabe<br />
/dev/sda2 on / type ext3 (rw,acl,user_xattr)<br />
/dev/sda3 on /home type ext3 (rw,acl,user_xattr)<br />
die beiden Partitionen /dev/sda2 und /dev/sda3 währe in diesem Beispeil das, was wir uns merken müssten.<br />
Danach zB von einer Live-CD oder ein anderes Linux auf diesem Rechner booten. Sicher stellen das diese Partitionen nicht gemountet sind. Dazu den Befehl '''mount''' absetzen und nachschauen, das diese "gemerkten" Partitionen nicht dabei sind. Sollten sie dennoch hier in der Ausgabe enthalten sein, müssten wir sie aushängen.<br><br />
Als root am System anmelden.<br />
umount /dev/sda2<br />
umount /dev/sda3<br />
Beide Befehle sollten ohne irgendwelche Ausgaben durchlaufen. und die Partitionen hinterher mit mount nicht mehr sichtbar sein <br><br />
Danach können (ebenfalls nur als Root) die Filesysteme überprüft und repariert werden.<br />
fsck -f -y /dev/sda2<br />
fsck -f -y /dev/sda3<br />
Die Ausgaben hier können insbesondere wenn Fehler im Filesystem repariert werden, recht lang werden. Diese Befehle bitte nicht vorzeitig abbrechen auch wenn sie etwas länger dauern. Ist etwas größeres zu reparieren sorgt die mitgegebenen Option '''-y''' dafür, das wir immer dafür sind und alle Reparaturvorschläge von '''fsck''' akzeptieren. (Alle andere Entscheidungen könnten eh nur absolute Spezialisten richtig treffen) Sind die Befehle durchgelaufen, kann dieses Linux beendet werden und das nomale Linux wieder gestartet werden.<br />
<br />
<br />
<br />
<br />
===Der Ernstfall, Linux bleibt beim booten beim fsck stehen===<br />
<br />
Nicht alle Fehler werden beim automatischen Prüfen der Filesysteme auch automatisch behoben. Bei schwerwiegenden Fehlern wird der Bootvorgang an dieser Stelle abgebrochen und der User aufgefordert den Filesystemcheck per Hand selbst anzustoßen. Nicht das Linux das nicht reparieren könnte, aber man wird eben aufgefordert hier bestimmte Aktionen abzunicken, das hinterher niemand sagen kann, Linux und der fsck ist schuld das jetzt meine Daten im Eimer sind ;-)<br />
Diese Situation kann sowohl beim forcierten fsck (wie wir es oben vorgestellt haben), als auch bei irgend einem automatisch in regelmäßigen Abständen gestarteten kompletten Filesystemcheck einmal auftreten.<br />
<br />
<br />
Wir müssen hier 2 Szenarien unterscheiden, entweder es ist das Rootfilesystem oder es ist ein anderes Filesystem als das Rootfilesystem, das man dazu naturlich das Passwort von root benötigt, sollte jetzt jedem klar sein.<br />
<br />
<br />
<br />
==== fsck Fehler im Rootfilesystem==== <br />
<br />
Beim scheitern von fsck im Rootfilesystem erscheint kurz vor der Aufforderung der Anmeldung folgender Absatz <br />
<pre>fsck failed. Please repair manually and reboot. The root<br />
file system is currently mounted read-only. To remount it<br />
read-write do:<br />
<br />
bash# mount -n -o remount,rw /<br />
<br />
Attention: Only CONTROL-D will reboot the system in this<br />
maintanance mode. shutdown or reboot will not work.</pre><br />
<br />
Hier ist das Rootfilesystem noch readonly eingehängt. Bestimmte Befehle werden deshalb auch nicht oder nicht richtig funktionieren, desshalb auch der Hinweis auf den wichtigen Befehl zum eventuellen umhängen des Rootfilesystems zum "Read-Write". Aber wir brauchen eigentlich nur einen einzigen Befehl hier.<br />
/sbin/fsck -f -y /<br />
* die Option '''-f''' bedeutet wirklich kompletten filesystemcheck<br />
* die Option '''-y''' bedeutet alle eventuellen Fragen automatisch mit "JA" beantworten<br />
* die Option '''/''' : das ist das Rootfilesystem, (braucht hier nicht als /dev/... angegeben zu werden.)<br />
Da das Filesystem hier an dieser Stelle jedoch schon readonly gemountet ist, erhalten wir eine Fehlermeldung wegen genau diesem Umstand. Das ist hier in diesem Fall relativ ungefährlich da ja sonst noch nichts weiter läuft, und wir müssen hier an dieser Stelle jetzt da durch, also soll er fsck auch durchführen, obwohl das Filesystem gemountet ist, anders geht es an dieser Stelle nicht.<br />
<br />
Ist der Befehl durchgelaufen, dann mit '''"CONTROL-D"''' den Rechner rebooten. (''Achtung die Tastatur wird hier auf Englisch stehen, und viele andere Befehle nicht funktionieren, bzw müssen mit kopletten Path angegeben werden, damit sie überhaupt erst einmal gefunden werden.''<br />
<br />
<br />
<br />
==== fsck Fehler jedoch nicht Rootfilesystem==== <br />
<br />
Wenn ein anders Filesystem als das Rootfilesystem betroffen ist, steht kurz vor der Anmeldeaufforderung folgender Text.<br />
<pre>fsck failed for at least one filesystem (not /).<br />
Please repair manually and reboot.<br />
The root file system is is already mounted read-write.<br />
<br />
Attention: Only CONTROL-D will reboot the system in this<br />
maintanance mode. shutdown or reboot will not work.</pre><br />
<br />
Prinzipell gehen wir hier genauso vor, nur ist nicht immer sofort erkennbar welches andere Filesystem denn nun betroffen ist. Das gilt es erst zu ermitteln. Wenn außer Rootfilesystem nur noch /home zum System gehört, muss es dieses sein, sind jedoch mehrere da, dann müssen wird das ermitteln. Der Befehl mount hilft uns einen Überblick zu verschaffen was schon alles da ist. bzw was fehlt<br />
/bin/mount<br />
ist jetzt und mit dem Vergleich zur Datei '''/etc/fstab''' immer noch nicht klar, welches Filesystem nun das betreffende ist, versuchen wir einfach mal alle Filesysteme automatisch einzuhängen.<br />
/bin/mount -a<br />
Jetzt müsste eine Fehlermeldung kommen welches Filesystem sich nicht einhängen läßt, weil es einen fsck benötigt. Auf dieses Filesystem starten wir jetzt fsck. zB<br />
/sbin/fsck -f -y /home<br />
Das Filesystem kann entweder mit seinem Deviceknoten also zB '''/dev/sda4''' oder seinem Einhängepunkt zB '''/home''' angesprochen werden, eine Zuordnung nimmt Linux automatisch an Hand der Datei '''/etc/fstab''' vor.<br><br />
Prinzipell ist es auch möglich das hier mehrere Filesysteme betroffen sind oder nicht eingehängt werden können, weil das darunterliegende betroffen ist. Wir können mit '''/bin/mount -a''' jedoch solange probieren bis hier alle Filesysteme eingehängt sind und eventuell auch noch weitere noch reparieren. Danach wieder mit '''"CONTROL-D"''' den Rechner rebooten.<br />
<br />
<br />
<br />
<br />
{{Achtung|'''Hinweis:''' Dieser Abschnitt des Artikels handelt explizit von ''sax2'' das ab opensuse Version 11.3 nicht mehr verfügbar ist. Das Programm ist in den neueren Versionen von OpenSuse nicht mehr vorhanden und wird dort auch nicht mehr wirklich benötigt, da Xorg hier eine sehr viel intelligentere automatische Konfiguration ausführt, die zu bedeutend weniger Problemen führt. In älteren Distributionen oder Enterprise Versionen ist es eventuell noch immer enthalten. Für die wenigen verbleibenden Grafikprobleme werdet ihr heute für OpenSuse andere Hinweise aus dem Forum heraus bekommen. }}<br />
<br />
<br />
<br />
== mach mal sax2 -(Zeichen) ==<br />
<br />
'''Nach der Installation, nach einem Hardwareumbau, nach bestimmten Updates oder einfach nachdem ihr zuviel an der Konfiguration herumgespielt habt, kann es sein, das eure Grafische Oberfläche nicht mehr startet. '''[http://manpages.unixforum.co.uk/man-pages/linux/opensuse-10.2/1/SaX2-man-page.html sax2]''' ist das Programm mit dem Grafikkarte, Bildschirm, Maus und Tastatur für den X-Server bei Suse grundkonfiguriert wird.'''<br />
<br />
Der X-Server ist das Programm das erst einmal überhaupt eine leere grafische Oberfläche zur Verfügung stellt, mit der zB dann der Windowsmanager seine Fenster auch anzeigen kann.<br><br />
Das Programm '''sax2''', wird euch sicherlich schon bei der Installation beim Einrichten der Grafikkarte begegnet sein. Auch aus der Grafischen Oberfläche ist es erreichbar "'''Yast -> Hardware > Grafikkarte und Monitor'''" das nützt aber nichts, wenn die Grafische Oberfläche gar nicht erst starten will. Also muss das auch aus der Konsole heraus gehen. Dazu benötigen wir also eine Konsole wie [[Hilfe zu Antworten aus dem Forum#gib mal folgendes ein|oben]] beschrieben. Des weiteren brauchen wird dort ein [[Hilfe zu Antworten aus dem Forum#als root folgendes eingeben|Login als root]] und nicht zuletzt müssen wir sicher sein das kein X-Server mehr aktiv ist, am besten also noch in den [[Hilfe zu Antworten aus dem Forum#mach mal init 3 |Runlevel 3]] wechseln<br />
<br />
Damit ist der Rechner jetzt vorbereitet um den '''sax2''' Befehl erfolgreich ausführen zu können. Der Aufruf ist einfach<br />
sax2<br />
in vielen Fällen werdet ihr vom Antworter jedoch noch zusätzlichen Optionen bekommen haben, dann diese einfach so eingeben wie sie dort stehen. zB<br />
sax2 -r -i -l<br />
Was jetzt passiert ist von den Optionen abhängig, in den meisten Fällen wird sich ein grafisches Fenster öffnen das dem der Grafikkartenkonfiguration beim Installieren nicht ganz unähnlich ist. Dann dort eventuell noch Einstellungen tätigen und erst speichern und beenden , wenn der Funktionstest wirklich richtig funktioniert hat. Es ist aber auch möglich, das beim sax2 Befehl nur eine neue Konfigurationsdatei geschrieben wird, und sonst nichts aufregendes passiert.<br />
<br />
Ist das vollbracht, dann kann die Grafische Oberfläche jetzt wieder getestet werden. Dazu einfach wieder mit <br />
init 5<br />
in den Runlevel 5 wechseln oder den Rechner mit <br />
init 6<br />
rebooten und damit mit der hoffentlich jetzt funktionieren Konfiguration die Grafik wieder normal zu starten.<br />
<br />
<br />
<br />
==Notes==<br />
<references /><br />
<br />
<br />
[[Linupedia:Hilfe|Zurück zur Hilfe Übersicht]]<br />
[[Kategorie:LinuxClubWiki Hilfe]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=SuSE_und_Grub&diff=32131SuSE und Grub2015-09-05T20:22:13Z<p>Robi: intern verlinkt</p>
<hr />
<div>{{Achtung|'''Hinweis:''' Dieser Artikel handelt explizit von der Version ''GRUB Legacy''. Das Programm wurde weiterentwickelt. Die Weiterentwicklung wird aufgrund von Inkompatibilitäten auf einer eigenen Seite behandelt: [[GRUB 2]]}}<br />
<br />
<br />
== SuSE und Grub ==<br />
<br />
Der [[Bootmanager]] [[GRUB]] der ab SuSE Linux Version 8.1 der Standard Bootmanager geworden ist, ist ein äußerst flexibler und vielseitiger Bootmanager mit unzähligen Möglichkeiten, und deshalb sicherlich auch so oft eingesetzt und beliebt. Im Forum gut nachzuvollziehen scheinen sich hin und wieder Probleme mit Grub allerdings etwas häufen, was mich bewogen hat einmal näher hinzuschauen.<br />
Hier jetzt mal ein paar allgemeine Weisheiten und Erkenntnisse als "Gute Nacht Lektüre" niedergeschrieben. Unter dem Motto: "man sollte es mal gelesen haben".<br />
<br />
<br />
<br />
=== Grub und YaST2 ===<br />
<br />
Unter SuSE wird [[YaST]] zur Systemkonfiguration verwendet. Dazu wurden eine ganze Reihe von Verwaltungs- und Konfigurationsmodulen erstellt, die das Leben unter SuSE übersichtlich, bequem und unkompliziert auch für weniger Erfahrene macht. Auch für den Bootmanager gibt es so ein Modul. Es ist zu erreichen über das YaST-Kontrollzentrum -> System -> Konfiguration des Bootloaders, oder als Root aus einer Konsole mittels der Befehle '''yast bootloader''' und das grafische Äquivalent dazu '''yast2 bootloader''' <br />
<br />
YaST ändert Einstellungen am System nicht selbst, sondern bedient sich dabei der Konfigurationsbefehle der einzelnen installierten Softwarekomponenten oder ändert dazu die Konfigurationsdateien dieser Pakete um danach durch neu- oder restarten der entsprechenden Programme die Änderungen am System auszuführen. Auch bei der Konfiguration von GRUB benutzt man diese Strategie.<br />
<br />
Stellt sich als nächstes die Frage welche Konfigurationsdateien und Konfigurationsbefehle bringt Grub mit.<br />
<br />
<br />
<br />
==== die Dateien von GRUB ====<br />
<br />
Ein Blick in das Paket von Grub zeigt etwa 40 Dateien. Zieht man einmal die ganzen Manpages, Infoseiten und Dokumentationen ab, dann bleiben im wesentlichen 2 Dateigruppen übrig.<br />
; Imagedateien :<br />
hier handelt es ich um die Dateien die während des Startens des Rechners geladen werden.<br />
* '''stage1''' das ist Bootloader für den Start<br />
* '''irgendwas_stage1_5''' das sind kleine Unterstützungsimages die helfen direkt aus jeweils einem Filesystem zu lesen. <br />
* '''stage2''' und einige seiner Abkömmlinge für spezielle Bootaufgaben, das ist der eigentliche Grub in Form einer universellen Shell.<br />
<br />
Der größte Teil dieser Images wird bei der Installation von Grub zusätzlich nach '''/boot/grub''' kopiert. <br />
<br />
<br />
; Ausführbare Dateien:<br />
* das Programm '''/usr/sbin/grub''' das ist eine Emulation der eigentliche Grub-Shell<br />
* das Script '''/usr/sbin/grub-install''' ein Hilfsscript zu Konfiguration und Installation<br />
* 2 oder 3 kleine Hilfstools für spezielle Aufgaben<br />
<br />
Das Programm '''[http://linux.die.net/man/8/grub /usr/sbin/grub]''' ist bei näherer Betrachtung wirklich nur eine anders kompilierte Form von '''stage2''', es arbeitet nicht über die [[BIOS|BIOS-Zugriffe]] sondern über Linuxfunktionen hat aber den gleichen Funktionsumfang wie '''stage2'''. Die meisten Installationen eines Bootloaders, (Ausnahme zB bootbare Floppy oder CDs) können gar nicht anders als mit Hilfe der Grubshell oder deren Emulation dem Programm '''/usr/sbin/grub''' installiert werden. Das liegt daran das in den Images (Stage-Dateien) die dabei auf den Festplatten zB im MBR positioniert werden, kleine Änderungen an internen Variablen innerhalb der so installierten Images vorgenommen werden müssen. Sonst funktioniert das Ganze dann nicht, weil die Dateien über die BIOS-Zugriffe nicht gefunden werden. <br><br />
Solche Anpassungen kann nur Grub selbst zuverlässig erledigen. Das ist auch die Ursache dafür, dass man einen Bootloader nicht einfach von einem System auf ein anders System kopieren kann. Dieser würde nicht mehr funktionieren, sobald sich die '''stage1_5''' und '''stage2''' Dateien nicht mehr innerhalb des in '''stage1''' konfigurierten Datenblockes befinden. Auch bei einem Filesytemwechsel des Filestems auf dem sich diese Dateien befinden (/boot/grub)funktioniert der alte Grub nicht mehr, da auf ein anderes '''Stage1_5''' Image verlinkt werden muss. <br />
<br />
Das Script '''[http://linux.die.net/man/8/grub-install /usr/sbin/grub-install]''' ist eine Konfigurationshilfe die notwendige Optionen entweder aus übergebenen Argumenten oder aus dem derzeitig aktuellen System heraussucht und damit über das Programm '''/usr/sbin/grub''' die einzelnen Komponenten des Bootloaders neu konfiguriert und installiert. <br />
{{Box Achtung||das Script '''/usr/sbin/grub-install''' ist Bestandteil des Orginalprogrammes GRUB. In den SuSE-Versionen ab 10.3 heißt dieses Script '''/usr/sbin/grub-install.unsupported''', ein Script Namens '''/usr/sbin/grub-install''' gibt es aber auch dort, das macht jedoch intern etwas anderes, ''siehe weiter unten''}}<br />
<br />
<br />
; Konfigurationsdateien:<br />
Der größte Teil der Imagedateien wird per default in das Verzeichnis '''/boot/grub/''' kopiert. Ebenso werden dort für Grub 2 wichtige Konfigurationsdateien bei der Installation angelegt.<br />
* '''/boot/grub/device.map''' Diese Datei wird von der Grubshell selbst erzeugt und spiegelt die vom BIOS gegebene Reihenfolge der Platten wieder.<br />
* '''/boot/grub/menu.lst''' Das ist die Konfigurationsdatei in der festgelegt wird, was wie zu booten ist. Sie wird bei der Paketinstallation erst einmal auf eine einfache aber ziemlich universelle Grundkonfiguration gesetzt.<br />
<br />
Die '''device.map''' sollte man überhaupt nicht verändern, sondern als das behandeln was es ist, eine vom System-BIOS vorgegebene Konfiguration. Bei einigen Operationen wird diese Datei neu von '''/usr/sbin/grub''' erzeugt, das ist aber im Normalfall auf einem Rechner sehr selten, so dass es uA. nach Plattenerweiterungen oder Kontrollerumbauten an einem Rechner dazu kommt, dass nicht alle vorhanden Platten hier in dieser Datei eingetragen sind oder ihre Reihenfolge falsch ist. Muss aus diesen oder ähnlichen Gründen einmal diese Datei entsprechend den aktuellen Gegebenheiten angepasst werden, so reicht es aus, die alte Datei umzubenennen oder zu löschen. Danach nur einmal die Grub-shell durch das Kommando "'''''grub'''''" aufzurufen und wieder mit "'''''quit'''''" zu verlassen. Dabei wird dann automatisch eine Neue und jetzt wieder aktuelle '''device.map''' erzeugt.<br />
<br />
<br />
Die '''menu.lst''' kann universell und zu jeder Zeit nach Herzenswünschen angepasst und geändert werden, solange dabei die Syntax und die Logik ok sind, funktioniert's oder manchmal auch nicht. Die Änderungen an dieser Datei werden sofort beim nächsten Boot wirksam, da diese Datei beim booten über ihren Namen gesucht und ausgelesen wird.<br />
<br />
<br />
<br />
<br />
==== Dateien von YaST ====<br />
<br />
Das Bootkonfigurationsmodul von YaST kann also auch nur über das Programm '''/usr/sbin/grub''' einen Bootloader schreiben, und es kann nach Herzenslust die '''/boot/grub/menu.lst''' ändern. An der '''device.map''' ändert Yast ohne ausdrückliche Aufforderung dazu nichts, benötigt diese Datei aber natürlich zur Zuordnung der Platten zur Erstellung der SYNTAX für grub. In den Konfigurationsdateien von Grub ist nirgends einen Eintrag enthalten, wo denn nun der aktuelle Bootloader hingeschrieben worden ist. YaST benötigt jedoch diese Information, desshalb wurde eine zusätzliche Datei benötigt, in der vermerkt ist, wo der aktuelle Bootloader mit welchen Optionen hingeschrieben wurde. Dazu hat man die Datei '''/etc/grub.conf''' erfunden. (unterhalb /etc/sysconfig gibt es zwar auch einen Konfigurationseintrag wo der Bootloader hingeschrieben werden soll, wird aber zumindestens bei Grub scheinbar nicht benutzt.)<br />
<br />
<br />
<br />
<br />
===== Die /etc/grub.conf =====<br />
<br />
Im strengen Sinne ist diese keine Konfigurationsdatei sondern ein Script das in der Grub-Shell ausgeführt wird. Es gibt auch keine Manpage dazu und nur in ganz wenigen offiziellen Dokumenten ist diese Datei auch nur ansatzweise erklärt. Die Datei könnte folgendermaßen aussehen.<br />
<pre><br />
setup --stage2=/boot/grub/stage2 (hd1) (hd1,1)<br />
quit</pre><br />
Das ist die Syntax der Grub-Shell und wird wie folgt ausgeführt<br />
grub --batch < /etc/grub.conf<br />
Das bedeutet hier im Beispiel im Klartext "installiere den Grub im MBR der 2. Festplatte und die Konfigdateien und stage2 liegen auf der 2. Festplatte innerhalb der 2. Partition." ( Die Option '''--stage2=....''' ist eine eventuell unbedeutende oder zusätzliche Option, die in der Dokumentation von Grub als notwendig unter bestimmten Bedingungen beschrieben ist, jedenfalls hat sie auf die Konfiguration keinen direkten Einfluss.) <br />
<br />
Die Datei ist seit Urzeiten in allen SuSE Rechnern vorhanden und kaum jemand hat sie je zur Kenntnis genommen, sie wurde bisher auch nur von YaST benutzt.</br><br />
<br />
Bis -- Version OpenSuse 10.3 dort wurde von SuSE das Script '''/usr/sbin/grub-install''' in '''/usr/sbin/grub-install.unsupported''' umbenannt und statt dessen ein Script mitgeliefert.<br />
<pre> cat /usr/sbin/grub-install<br />
#!/bin/sh<br />
<br />
# Instead of the unsupported guessing method of the original grub-install<br />
# script, use the grub installation scriptlet generated by YaST.<br />
<br />
# Sanity check<br />
test -x /usr/sbin/grub && \<br />
grep -q quit /etc/grub.conf 2>/dev/null && \<br />
grub --batch < /etc/grub.conf && exit 0<br />
<br />
# Sanity check failed -- call YaST2<br />
/sbin/yast2 bootloader<br />
<br />
# Try again. This time it must succeed, otherwise return the error.<br />
grub --batch < /etc/grub.conf </pre><br />
Diese Script macht also weiter nichts, als diese '''/etc/grub.conf''' in der grub-shell auszuführen oder wenn sie nicht vorhanden ist, dann die Bootloaderkonfiguration von YaST2 aufzurufen.<br />
<br />
Da in vielen Howtos '''/usr/sbin/grub-install''' verwendet wurde, um zB. gezielt den Bootloader an eine bestimmte Position zu positionieren, und das Script jedoch stillschweigend etwas ganz anderes tut, gab es prompt auch eine [https://bugzilla.novell.com/show_bug.cgi?id=339995 Bug-Meldung]<br />
<br />
=== YaST und sein Verständnis von GRUB ===<br />
<br />
GRUB ist in seinem Umfang so gewaltig, das YaST nur einen winzigen Bruchteil davon überhaupt unterstützen kann. Nun ist es ja so, auf vielen Rechnern wird man GRUB nur einmal bei der Installation konfigurieren und installieren (meistens überlässt man das sogar der Installationsroutine, auch YaST) und nie wieder anfassen müssen und die Bootkonfiguration ist auf den meisten Rechnern auch so einfach, dass YaST das problemlos beherrscht und somit auch ein Kernelupdate oder ein ganzes Betriebssystemupdate problemlos durchläuft, aber eben nur auf den meisten Rechnern.<br />
<br />
<br />
<br />
==== Was YaST nicht versteht wird gnadenlos umkonfiguriert ====<br />
<br />
Nun ist es ja so, dass YaST in der /boot/grub/menu.lst seine Menueinträge mit der Zeile<br />
###Don't change this comment - YaST2 identifier: Original name: irgendwas ###<br />
kennzeichnet. Jetzt ist man geneigt, anzunehmen, dass YaST Menueinträge ohne diese oder mit einer stark geänderten Kommentarzeile nicht anfasst. Das stimmt aber nur zum Teil und man sollte sich keineswegs darauf verlassen. <br />
Bei Versuchen unter 10.3 konnte mit einer Dualbootkonfiguration nachgewiesen werden, dass es dem YaST Bootkonfigurator vollkommen wurscht ist, was dort steht, "Was ich nicht verstehe wird so umkonfiguriert, dass ich es verstehe". YaST war nicht einmal in der Lage innerhalb des Bootloadermodules die orginalen Konfigurationsdateien anzuzeigen. Angezeigt wurden immer nur die schon von YaST umgeänderten Konfigurationen, auch ein manuelles Ändern an den Konfigurationsdateien innerhalb von YaST brachte keinen Erfolg. <br />
Die von YaST vorgenommenen Änderungen betrafen dabei nicht die Kernel-Optionen oder ähnliches, sondern in erster Linie nur die Parameter mit denen die Platten und Partitionen benannt werden. Auch mehrere in Grub gültige Syntax für die eindeutige Benennung von Platte und Partitionen wurden permanent geändert. <br />
Nach betätigen mit "OK" wurden von YaST ohne irgend eine Warnung stillschweigend eine solche manuelle Änderungen verworfen und auf etwas "normales" Yast-verträgliches geändert.<br />
<br />
Wenn man also eine per Hand erstellte Grubkonfiguration hat, die Elemente enthält die Yast nicht unterstützt, Kann uU ein Aufrufen des Bootloadermoduls und anschließen "Beenden" ausreichen, um seine Grubkonfiguration zu verschrotten und auf einen quasi YaST verträglichen Standard zurück zu konfigurieren. Man braucht innerhalb des Bootloaders nicht mal irgendwas angefasst/angeklickt zu haben, das öffnen und anschließende bestätigen reicht aus. Nur ein "Abbrechen" mit anschließendem Bestätigen des Abbruchs schützt vor ungewollter Veränderung durch den YaST Bootloader. Dabei was es vollkommen egal wie die Menüpunkte Kommentiert waren, und ob sich original YaST Einträge in der Datei befunden haben oder nicht. Knackpunkt bei den gemachten Versuchen und Tests, YaST konnte überhaupt nicht begreifen, dass es auf dem System auch 2 mal die /boot/grub/Dateien geben kann, eben auf jeder gespiegelten Rootplatte ein mal. Auch eine entsprechende Änderung an der /etc/grub.conf wurde von YaST auf ein für ihn verständliches Niveau umkonfiguriert. <br />
<br />
Andere Fehler in dieser Datei, wie etwa Verweise auf nicht mehr existierende Kernelversionen und der gleichen, in original Yasteinträgen, hat YaST dann mal großzügiger Weise überhaupt nicht bemerkt. <br />
<br />
Getestet wurde das mit 10.3 und der menu.lst von diesem [[Diskussion:NonRaid_zu_(software)Raid1_SuSE_10_1#die_für_die_Rootspiegelung_geänderte_menu.lst|Howto]]<br />
<br />
Desweiteren konnte damit nachgewiesen werden, dass hier YaST viel öfter den Bootloader neu installiert als man sich das denken kann. Man braucht sich nur dort im YaST-Bootloader ein wenig umzusehen, zB die Konfigurationsdateien und anschließend ohne das man irgendwas geändert hat, auf "Beenden" und schon wird die /etc/grub.conf durch /usr/sbin/grub geschickt. Das die /etc/grub.conf vorher automatisch und unbemerkt von YaST geändert wurde, und das System hinter nicht mehr von allen Booteinträgen bootbar war, war YaST dabei egal. <br />
<br />
Bei einem anderem Test mit gleicher Datei und einem Kernelupdate über YaST waren die Fehler nicht gar so drastisch, aber das Ergebnis keinesfalls perfekt. Da keine YaST-Menueinträge vorhanden waren, wurden eben 2 neue erzeugt und an den Anfang der Datei gesetzt. Der Default-Boot-Eintrag wurde allerdings nicht angepasst, so dass anschließend ein ganz andere Menueintrag als default gebootet wurde. Daneben wurde noch an das Ende der Datei ein nicht existierender Booteintrag für das Floppylaufwerk hinzugefügt. Ansich gesehen, keine großartige Geschichte, allerdings hat YaST dazu 2 Mal die menu.lst geändert, so dass anschließend keine Sicherheitskopie der vorher vorhandenen Datei mehr vorhanden war.<br />
<br />
<br />
Was mir auf mehreren Rechner aufgefallen ist, an denen noch nie händisch das YaST Bootmenu aufgerufen worden ist, gebootet wird definitiv vom MBR der Platte während die /etc/grub.conf auf die erste Partition gesetzt ist, also im Zweifelsfall würden bestimmte Änderungen gar nicht aktiv, weil der aktive Bootloader im MBR davor sitzt und nicht überschrieben werden würde.<br />
<br />
<br />
<br />
==== Wann ist damit zu rechnen das Komponenten von SuSE oder von Yast in die Bootkonfiguration eingreifen ====<br />
<br />
Ein eingreifen von SuSe in die Bootkonfiguration ist äußerst selten. In folgenden Fällen ist damit zu rechnen das die menu.lst bzw die gesamte Bootkonfiguration unbemerkt geändert, anpasst, neuerstellt oder nur erneuert wird.<br />
<br />
* Bei einer Neuistallation, (ist aber ehr erwünscht, wenn er damit nicht eine speziell gewünschte Konfiguration einfach verwirft). <br />
* Beim "Beenden" des Modules Bootloader. Wer hier nur mal aus Neugier vorbeigeschaut hat oder sonst wie dort gelandet ist, auch wenn man bewußt überhaupt nichts geändert hat, dort immer "Abbrechen" als den sicheren Ausgang auswählen. Sonst kann es durchaus passieren das er morgen im Forum behauptet, überhaupt nichts verändert zu haben. ;-)<br />
* Beim Ausführen des Scriptes grub-install. Hier wird in neuen SuSE-Versionen die /etc/grub.conf ausgeführt. Wer Howtos ausführt, in denen dieser Befehl drin steht, sollte sich vergewissern das er das Originale grub-install ausführt, in den derzeigtigen SuSe-Versionen ist es grub-install-unsupported. <br />
* Beim installieren bestimmter Pakete, ua. beim Kernelupdate, installieren/deinstallieren von zusätzlichen Kernel, oder bestimmten Programmen die einen speziell konfigurierten Kernel mitbringen, bei ehr seltenen Updates von grub oder initrd, Bei einem kompletten Systemupdate, Im Zweifelsfall immer, wenn zur Aktivierung ein Reboot notwendig ist.<br />
* bei Funktionen des [http://de.opensuse.org/SDB:YaST-System-Repair Yast-System-Repair}<br />
<br />
<br />
<br />
<br />
==== auf welchen Rechnern könnte es Probleme geben ====<br />
<br />
Bei Otto den Nomallinuxer wird es kaum bis gar keine Probleme geben, einzig das bei dem Einem oder Anderen mal der Windowseintrag verschwunden sein könnte oder nicht mehr bootbar ist. ZB nach automatischer Systemwiederherstellung nach anderen Problemen. <br />
Wer schon mal größer händische Änderungen an der menu.lst vorgenommen hat zB nach Änderungen im Platten und Partitionsbereich, weitere Betriebssysteme per Hand in Grub eingetragen hat, oder Spezialkonfigurationen wie gespielgeltes Rootfilesystem oÄ hat, könnte schon ehr vor einer unbemerkter Veränderung durch YaST betroffen sein. Meist bleibt SuSE dabei jedoch erst einmal weiterhin bootfähig, uU funktionieren einige andere Booteinträge nicht mehr, oder starten etwas falsches. <br />
<br />
<br />
<br />
<br />
==== Welche Konsequenzen ergeben sich aus diesem Verhalten ====<br />
<br />
Das Bootloadermodul von Yast scheint für individuelle Änderungen an der Grubkonfiguration, die ein gewisses allgemein einfaches Niveau und eine bestimmte Syntax überschreiten nicht geeignet zu sein. Auch entsprechende manuelle Änderungen an den Konfigdateien innerhalb dieses Moduls führt nicht zum Erfolg, da erstens nicht die orginalen Dateien angezeigt werden, sondern schon yastverträglich gemacht werden bevor sie angezeigt werden, und auch manuelle Änderungen im Anschluss erst einmal über einen solchen Filter laufen und dann wiederum yastverträglich geschrieben wird. Yast ist nicht in der Lage komplexe Konfiguration in bestimmten Einzelheiten und in der Gesamtheit zu verstehen bzw zu überprüfen. <br><br />
Wer solche manuell erstellt oder geänderte Konfigurationen benötigt oder schon auf dem Rechner hat, sollte eine spätere Benutzung dieses Moduls möglichst vermeiden, da dadurch sehr leicht ungewollt Veränderungen am sensiblem Umfeld der Bootkonfiguration vorgenommen werden könnten. Für den Fall von unvermeidbaren Eingriffen von Yast zB bei einem komplettem Systemupdate sollte man Sicherungen seiner manuellen Bootkonfiguration bereit haben. <br />
<br />
<br />
<br />
<br />
==== wie kann man sich schützen ====<br />
<br />
Direkten Schutz benötigt man hier wahrscheinlich in den aller seltensten Fällen. Wenn man im Gefühl hat, wann sich da etwas verändern könnte, und man einschätzen kann ob ein System dafür anfällig ist oder nicht, reicht das meistens aus, um wachsam zu sein. Dann kann man hin und wieder mal nach dem Rechten zu sehen. Beachten sollte man, das nach Änderungen an der /etc/grub.conf oder /boot/grub/menu.lst man sich sicherheitshalber eine Kopie der dann fertigen und funktionieren Dateien macht. Im Zeifelsfall ist dann bei Veränderungen der alte richtige Zustand durch eine solche Reverenz wieder schnell hergestellt. <br />
<br />
(ungetestet und ausdrücklich nicht empfohlen : Absoluten Schutz könnte zB das [[Zugriffsrechte#Erweiterte Dateiattribute im ext2-Dateisystem|Immutable-Flag]] auf die beiden Konfigurationsdateien und das Entfernen des Ausführungsrechts bei /usr/sbin/grub sein, allerdings ist nicht sicher, wie Yast denn in automatischen Abläufen mit den damit entstehenden Fehlern umgeht, und ob man sich dadurch nicht schlimmere Fehler einfängt.) <br />
<br />
Wer öfter Bootprobleme hat, der kann sich auch mal mit der Grub-Shell befassen. Eine gute Dokumentation sind die mit installierten Info-Seiten oder auch online oder download von [http://www.gnu.org/software/grub/manual/ hier] Mit nur wenigen einfachen Befehlen wie zB '''find''' und '''cat''' und ein wenig Linuxgrundwissen findet man sich auf seinem System dann auch von der Grub-Shell aus schnell zurecht, und kann von dort aus Alles nur erdenkliche per Hand booten, (es wird sogar behauptet, man könne mit Grub Bierdeckel mit der Aufschrift Betriebssystem, booten ;-) von mir ungetestet ;-) )<br />
<br />
<br />
----<br />
<br />
[[Bootmanager|zurück zur Bootmanager]]<br />
<br />
[[Category:Bootmanager]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=ThinkPad_X20&diff=32130ThinkPad X202015-09-05T20:20:49Z<p>Robi: intern verlinkt</p>
<hr />
<div>== Einführung ==<br />
<br />
Das IBM ThinkPad X20 ist vor allem für die Anwender interessant, die gerne auf Reisen ein kleines Notebook (sog. Subnotebook) mitnehmen, aber auf hohes Gewicht verzichten wollen und auf nicht so oft genutzte Funktionalitäten (z.B. zusätzliche Laufwerke wie CD oder DVD, etc.) verzichten können.<br />
<br />
IBM und nachfolgend Lenovo boten/bieten mit der ThinkPad X-Serie interessante Geräte an, die mit ca. 1,5 kg "Reisegewicht" einen vollwertigen Rechner bieten. Gerade die ersten Modelle der X2*-Serie (X20, X21, X22, X23, X24) sind gebraucht zu einem vernünftigen Preis erhältlich und durch den vorbildlichen Ersatzteilservice von IBM/Lenovo auch jetzt noch zu empfehlen. Als Zubehör ist die sog. Ultrabase erhältlich, in der sich zusätzliche Schnittstellen und ein optisches Laufwerk befindet.<br />
<br />
Nachfolgend wird auf die Installation von openSUSE 10.3 auf dem X20 ohne CD-Laufwerk eingegangen.<br />
<br />
<br />
== Installation ohne CD-Laufwerk ==<br />
openSUSE 10.3 kann durchaus auf einem ThinkPad X20 installiert werden, welches ohne CD-Laufwerk betrieben wird. Natürlich geht es nicht ohne Hilfsmittel - diese sind nachfolgend beschrieben.<br />
<br />
Installationsmöglichkeiten:<br />
<br />
- via USB Stick<br />
<br />
- via Netzwerk<br />
<br />
- via internem Laufwerk<br />
<br />
- via ISO-Image<br />
<br />
<br />
<br />
=== Installation via ISO-Image ===<br />
==== ISO-Image herunterladen ====<br />
<br />
Voraussetzungen:<br />
<br />
- Internetzugang<br />
<br />
- Rechner mit CD-Brenner (durchaus anderer Computer mit anderem Betriebssystem)<br />
<br />
Die notwendige Installationsdatei kann direkt auf einem Server von SuSE [http://software.opensuse.org/ Download openSUSE 10.3] oder einem seiner Spiegelserver bezogen werden. Es gibt hierzu ein ISO-Image für KDE und eines für Gnome. Das ISO-Image für KDE (welches hier verwendet wurde) heisst "openSUSE-10.3-GM-KDE-i386.iso".<br />
<br />
Nach erfolgtem Download kann die CD gebrannt werden.<br />
<br />
==== Installation durchführen ====<br />
Parallel nun das Laufwerk aus dem X20 ausbauen und in einen Rechner einbauen, der mit CD booten kann. Ggf. muß im [[BIOS]] dieses "Hilfsrechners" das Starten von CD speziell aktiviert werden. Wenn der Rechner hochfährt die Auswahl im Menü "Installation" bestätigen. Es ist empfehlenswert, die Festplatte des X20 neu zu formatieren, auch die Partitionsvorschläge bei openSUSE 10.3 sind empfehlenswert.<br />
<br />
Sollte der Rechner, in dem die Installations-CD verwendet wird über Internet-Zugang verfügen, kann gleich bei der Installation auf zusätzliche Installations-Optionen (andere Sprachen, Software, etc.) zugegriffen werden.<br />
<br />
Die Menüpunkte bei der Installation sind selbsterklärend und führen zuverlässig durch die Installationsprozedur.<br />
<br />
'''Hinweis:'''<br />
<br />
Das o.g. ISO-Image installiert openSUSE 10.3 (KDE) in Englisch, auch wenn bei der Installation die Sprache abgefragt und Deutsch angegeben wird. Es kann durchaus passieren, dass die KDE-Oberfläche in Englisch ist und die Details in YaST dann in Deutsch erscheinen. Dies kann aber später behoben werden.<br />
<br />
<br />
==== Basiskonfiguration durchführen ====<br />
Beim ersten Start von openSUSE 10.3 (KDE) wird eine Basiskonfiguration durchgeführt - was vollkommen ausreichend ist. Es genügt die Standardangaben zu machen (root user, etc.) danach kann openSUSE 10.3 wieder heruntergefahren werden.<br />
<br />
Wurden Konfigurationen hinsichtlich Netzwerkgeräte, Grafikkarte und Monitor gemacht, so ist zu beachten, dass diese sich zum X20 hin unterscheiden. Dies wird später korrigiert.<br />
<br />
==== ThinkPad X20 Konfiguration ====<br />
Nun wieder die Festplatte in das ThinkPad X20 einsetzen und booten. Sollte der "Hilfsrechner" mit einer anderen Auflösung bzw. einem anderen Monitor betrieben worden sein (wovon auszugehen ist), dann kann keine X-Session gestartet werden, d.h. es wird '''keine''' grafische Oberfläche gestartet und openSUSE 10.3 bleibt im Konsolen-Modus und verlangt ein Login. Bei der Anmeldung als "root" einloggen. Nach erfolgreichem Einloggen auf der Konsole "yast" und Return eingeben. Danach "Hardware" auswählen, mit der Tabulatortaste in die rechte Spalte wechseln und "Grafikkarte und Monitor" auswählen. yast in openSUSE 10.3 hilft bei der Konfiguration der Grafikkarte und des Monitors (autmatisch erkennen). Den Vorschlag bestätigen und "yast" beenden. Nun kann auf der Konsole versucht werden eine X-Session zu starten. Hierzu "startx" eingeben. Nun sollte ein Login-Bildschirm präsentiert werden. Auch hier empfiehlt es sich als "root" anzumelden - somit kann die weitere Konfiguration durchgeführt werden.<br />
<br />
Nachdem die grafische Oberfläche läuft, kann wiederum Yast gestarten werden und die weitere Konfiguration durchgeführt werden.<br />
<br />
-Hardware<br />
<br />
Bei Hardware sollten die Netzwerkgeräte konfiguriert werden, die noch existierenden Geräte von dem "Hilfsrechner" können aus der Konfiguration gelöscht werden.<br />
<br />
- Software<br />
<br />
Bei Software bitte die gewünschten Softwarepakete angeben und installieren.<br />
<br />
- Bootloader<br />
<br />
Im Bootloader ("System -> Konfiguration des Bootloaders") noch als Option "acpi=force" angeben. Somit funktioniert Kpowersave so wie man es erwartet. Hierzu in der Abschnittsverwaltung den Standardabschnitt auswählen (das mit dem Häkchen) und auf "Bearbeiten" klicken. Jetzt in "Optionaler Parameter für Kernel-Befehlszeile" an das Ende den Eintrag "acpi=force" eintragen. Auf "OK" klicken. Fertig.<br />
<br />
- Sprache<br />
<br />
Wie schon erwähnt wird die Erstinstallation nicht komplett in Deutsch durchgeführt. Damit die KDE-Oberfläche und alles andere (Mailprogramm, Browser, etc.) auch schön in Deutsch benutzt werden kann, hilft folgender Trick: in YaST auf "System - Sprache wählen" und als primäre Sprache "Englisch" wählen. Das Tastaturlayout bitte auf Deutsch lassen! Nun werden die notwendigen Sprachdateien installiert. Jetzt den Rechner durchstarten und wieder in die Sprachauswahl gehen. Jetzt die primäre Sprache auf "Deutsch" setzen. Jetzt werden auf für KDE (und auch die anderen installierten Programme) die deutschen Dateien installiert.<br />
<br />
==== openSUSE updater ====<br />
Der "openSUSE updater" sorgt dafür, dass die notwendigen Updates von den entsprechenden Servern geladen und eingespielt werden. Standardmäßig ist noch der Eintrag der Installation - das CD-Laufwerk - vorhanden und nutzt nun ziemlich wenig, da ja kein CD-Laufwerk mehr vorhanden ist. Es ist zu empfehlen, hier nachfolgende Einträge zu machen, damit zur Distribution und der verwendeten Software die korrekten Updates geholt werden können.<br />
Der openSUSE updater befindet sich in der Kontrollleiste rechts. Sofern nicht gestartet bitte auf "K-Menü" gehen (der Gecko) und dann in der Suchleiste "opensuse update" eingeben. Als Ergebnis kommt dann u.a. das "openSUSE update Applet", dieses ist zu starten. Mit einem Rechts-Klick auf den openSUSE update den Punkt "Update-Quellen hinzufügen/entfernen" auswählen. Den Eintrag mit dem CD-Laufwerk anwählen und das Häkchen bei "Aktiviert" entfernen.<br />
<br />
Bei dem Klick auf "Hinzufügen" die nachfolgenden Informationen eingeben. Es gibt noch mehr Repositories als die aufgeführten, es können noch andere hinzugefügt werden. Diese Liste ist nur als Anregung und Basisversorgung zu verstehen.<br />
<br />
[10.3-oss]<br />
type = yast2<br />
name = Opensuse 10.3 OSS Repository<br />
disabled = no<br />
baseurl = http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/oss/<br />
<br />
[10.3-non-oss]<br />
type = yast2<br />
name = Opensuse 10.3 NON-OSS Repository<br />
disabled = no<br />
baseurl = http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss/<br />
<br />
[openoffice-stable]<br />
type = rpm-md<br />
name = Opensuse 10.3 OpenOffice Repository<br />
disabled = yes<br />
baseurl = http://ftp5.gwdg.de/pub/opensuse/repositories/OpenOffice.org:/STABLE/openSUSE_10.3/<br />
<br />
[kde3]<br />
type = rpm-md<br />
name = Opensuse 10.3 KDE3 Repository<br />
baseurl =<br />
http://ftp5.gwdg.de/pub/opensuse/repositories/KDE:/KDE3/openSUSE_10.3/<br />
<br />
Nach erfolgter Eingabe beim openSUSE updater wieder ein Rechts-Klick und "Jetzt überprüfen" auswählen. Es wird nun auf die neuesten Updates bei den o.g. Repositories geprüft. Dies kann einige Zeit in Anspruch nehmen.<br />
<br />
<br />
== Quellen ==<br />
=== Externe Quellen ===<br />
<br />
[http://software.opensuse.org/ Download openSUSE 10.3]<br />
<br />
[http://www.thinkwiki.org/wiki/Installation_on_ThinkPads_without_CD-ROM_drive Installation on ThinkPads without CD-ROM drive]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Kaufberatung_Mainboards&diff=32129Kaufberatung Mainboards2015-09-05T20:20:15Z<p>Robi: intern verlinkt</p>
<hr />
<div>Nachfolgend entsteht eine Liste mit Mainboards und Mainboardherstellern, deren Mainboards unter Linux laufen. Alle User sind herzlich eingeladen, die Liste zu erweitern. Auf diese Weise entsteht eine Liste mit Kaufempfehlungen und Entscheidungshilfen für User, die den Kauf eines Linux-kompatiblen Mainboards planen.<br />
<br />
Die Installation konkreter Modelle soll bitte in eigenen Artikeln abgehandelt werden, die wiederum hier verlinkt werden können.<br />
<br />
Hier sollte bitte nur eine kurze Nennung von Modellen, Herstellern und evtl. verwendeten und angebotenen Linux Treibern erfolgen. Die vorhandenen Einträge dieses Artikels mögen hierbei als Beispiel dienen.<br />
<br />
Die Liste soll somit dem kaufinteressierten Anwender einen Überblick darüber verschaffen, welche Geräte welcher Hersteller problemlos unter Linux laufen.<br />
<br />
= ASRock =<br />
<br />
== Generelle Linux Unterstützung ==<br />
Asrock-Mainboards werden unter Linux generell unterstützt(Ausnahmen vorhanden).<br />
<br />
== Treiber ==<br />
Treiber müssen nur selten nachinstalliert werden. Allerdings beitet Asrock auf seiner Website keine Linux-Treiber an. Diese müssen seperat heruntergeladen werden.<br />
<br />
== Liste unter Linux laufender Geräte ==<br />
<br />
* '''K7VT6C''': Mainboard für Athlon / Athlon XP (Sockel A) bis 3200 MHz<br />
* '''ConRoeXFire-eSATA2'''': Dieses Mainboard läuft sehr gut Linux(openSuSE 10.3, Mandriva 2007/2007.1, Ubuntu 7.04, PCLinuxOS 2007). Es müssen keine Treiber nachinstalliert werden. Alle Komponenten können sofort nach der Installaltion genutzt werden. Auch wenn diesen Mainboard laut Hersteller 4GB unterstützt, werden nur 3.2GB adressiert. Dieses ist kein Hardwaredefekt, auch kein Fehler von Linux, sondern ein Problem der Adressierung.<br />
<br />
'''M3A785GMH/128M''' :Installation und arbeiten mit OpenSUSE 11.2 ohne Probleme.Board läuft bei mir mit einem AMD Phenom II X4 Processor(4x3,2GHz).Die OnBoard Grafik mit 512Mb ist schon gut >Agp,DVI + HDMI. In Zusammenarbeit mit einer GraKa ATI7570 aber ein unschlagbares Team in den Flugsimulationen. Tv am PC mit 5.1 Sound! Super Kaufempfehlung!!!! Viel Spaß damit, Barnies109<br />
<br />
= ASUS =<br />
<br />
== Generelle Linux Unterstützung ==<br />
<br />
<br />
== Treiber ==<br />
<br />
<br />
== Liste unter Linux laufender Geräte ==<br />
<br />
* '''A8N32 SLI Deluxe''': Mainboard für AMD 64 / AMD X2 (Sockel 939), der Onboardsoundchip ist ein Realtek Soundchip, genutzt wird dazu das Intel HighDefinition Audio Modul snd_intel8x0, um die Digitalports nutzen zu können muss der Regler für den Digitalout paradoxerweise ganz auf 0 runtergeschaltet (nicht stummgeschaltet!) werden.<br />
<br />
== Installationsanleitungen ==<br />
<br />
<br />
<br />
= Gigabyte =<br />
<br />
== Generelle Linux Unterstützung ==<br />
Gigabyte-Mainboards werden generell sehr gut unterstützt. Falls man doch mal Hilfe braucht, findet man im [http://forum.gigabyte.de/cgi-bin/sbb/sbb.cgi/ deutschen Gigabyteforum] Hilfe, auch von Linux-Usern.<br />
<br />
== Treiber ==<br />
Treiber werden nur selten benötigt. Gigabyte stellt keine Treiber für Linux auf der eigenen Website, falls diese einmal benötigt werden, zur Verfügung. Diese müssen seperat heruntergeladen werden.<br />
<br />
== Liste unter Linux laufender Geräte ==<br />
* '''Gigabyte P35-DS3''': Dieses Mainboard läuft einwahnfrei unter Linux(openSuSE 10.3/Mandriva 2007.1/2008). Es werden alle auf dem Board verbauten Komponenten einwahnfrei erkannt und können sofort nach der Intallation ohne nachträglich Treiber Installation genutzt werden. Allerdings empfiehlt es sich, im [[Bios]] bei '''SATA AHCI MODE''' den Wert auf ''Disable'' zu stellen, d.h. ohne AHCI zu installieren. Bei mir traten nämlich bei der Instalation mit AHCI unregelmäßig probleme auf(openSuSE 10.3). Wenn man mit diesem Board Windows und openSuSE nutzen will muss man unter Windows bei der Netzwerkarte noch gewisse Einstellungen tätigen, damit openSuSE in der Lage ist, die Netzwerkkarte zu aktivieren''([http://62.109.81.232/cgi-bin/sbb/sbb.cgi?&a=show&forum=1&show=3882&start=0#1 Link zum HoTow in deutschen Gigabyteforum)]''. <br />
* '''Gigabyte P35-DS3R ''': Dieses Mainboard läuft einwahnfrei unter Linux. Allerdings muss man hier, auch wie bei dem Modell P35-DS3, Einstellungen bei der Netzwerkkarte unter Windows XP tätigen, damit openSuSE in der Lage ist, die Netzwerkkarte zu aktivieren ''([http://62.109.81.232/cgi-bin/sbb/sbb.cgi?&a=show&forum=1&show=3882&start=0#1 Link zum HoTow in deutschen Gigabyteforum])''.<br />
<br />
'''GIGABYTE GA-M56S-S3''':Läuft unter SUSE 11.0,11.1+11.2 ohne Probleme.Es wird alles erkannt,alle Prepheriegeräte laufen ohne Fehler.Installation von Open SUSE ohne Probleme.Eine Kaufempfehlung!!! Viel Spaß damit wünscht allen Usern Barnies109.<br />
<br />
== Installationsanleitungen ==<br />
<br />
<br />
<br />
= MSI =<br />
<br />
== Generelle Linux Unterstützung ==<br />
<br />
<br />
== Treiber ==<br />
<br />
<br />
== Liste unter Linux laufender Geräte ==<br />
<br />
* '''K8N Diamond / K8N Diamond 54G''': Mainboard für AMD 64 /AMD X2 (Sockel 939), die 54G Version liefert eine WLAN / Bluetooth Kombikarte mit, die mit den RT2500 Treibern äuft, Bluetooth wird ebenso out of the Box erkannt, das benötigte Soundchipmodul für die SB Live! 24 Bit 7.1 ist ca0106.<br />
<br />
== Installationsanleitungen ==<br />
<br />
<br />
<br />
<br />
----<br />
[[Hardware|Zurück zu Hardware]]<br />
<br />
[[Tipps zum Hardwarekauf|Zurück zur Übersicht der Hardwarelisten]]<br />
<br />
[[Category:Hardware]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Anleitung_openSUSE_10_3_Troubleshooting&diff=32128Anleitung openSUSE 10 3 Troubleshooting2015-09-05T20:19:37Z<p>Robi: intern verlinkt</p>
<hr />
<div><noinclude>{{Anleitung openSUSE 10 3 Wikibook Titel}}</noinclude><br />
<br/><br/>{{UnderConstruction}}<br />
<br />
<br />
== USB-Tastatur reagiert nicht im Bootmenü ==<br />
<br />
Wenn die USB-Tastatur im Bootmenü der openSUSE-CD/DVD nicht reagiert, sollte zuerst sicher gestellt werden, dass im '''[[BIOS]]''' die Option<br/><br />
USB legacy Support<br />
aktiviert ist.<br/><br />
<br/><br />
Falls diese Option fehlt und auch keine alternative Tastatur (z.B. mit PS/2-Anschluss) angeschlossen werden kann (beides ist bei einigen DELL-PCs der Fall) kann die Installation auch ohne das graphische Bootmenü gestartet werden:<br />
Beim Booten von der CD/DVD die '''linke Shift-Taste''' gedrückt halten und die Meldung: "''Load boot graphics?''" mit '''n''' verneinen.<br/><br />
Anschließend kann die Installation ducrh die Eingabe von<br/><br />
linux<br />
am '''Boot'''-Prompt gestartet werden.<br/><br />
<br/><br />
<br />
== Alternative Installationsquellen ==<br />
<br />
<br/><br />
<br />
=== Netwerkinstallation ===<br />
<br />
Für eine Online-Installation (Mini-ISO) mit '''<F4>''' "'''HTTP'''" als [[YaST-Installationsquellen für openSUSE#SuSE_Linux_Installationsquelle | Installationsquelle]] wählen und im folgenden Dialog den Installationsserver-Server sowie den Pfad zur Installationsquelle auf dem Server eingeben.<br />
{{Box Beispiel|Netzwerkinstallation|<pre>Server: ftp.tu-chemnitz.de<br />
Pfad: pub/linux/opensuse/distribution/10.3/repo/oss</pre><br />
:Anschließend mit '''<Return>''' bestätigen.<br />
}}<br />
Alternativ kann der Pfad zur Installationsquelle auch direkt als Bootoption eingegeben werden:<br/><br />
<pre>netdevice=eth0 install=http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/oss</pre><br />
<br/><br />
Anschließend kann die Installation [[Anleitung_openSUSE_10_3_Installation | geststartet werden]].<br/><br />
<br/><br />
<br />
=== Auf Festplatte gespeichertes ISO ===<br />
<br />
<pre>netdevice=eth0 install=hd:/openSUSE-10.3-GM-DVD-i386.iso?device=sda1</pre><br />
<br />
<br/><br />
Anschließend kann die Installation [[Anleitung_openSUSE_10_3_Installation | geststartet werden]].<br/><br />
<br/><br />
<br />
== Windows-Partition lässt sich nicht verkleinern ==<br />
[[Bild:Installguide-os103_os-failure-ntfs.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Systemfehlercode]]<br />
<br/><br />
Wenn die Installation beim Verkleinern der NTFS-Partition (Vorbereiten der Festplatte) mit einem Systemfehlercode abbricht, sollte die Größenänderung der Windows-Partition manuell mit dem Programm '''parted''' vorgenommen werden.<br/><br />
Da Änderungen an Partitionen nicht im laufenden Betrieb erfolgen sollten, kann dazu die GParted-Live-CD benutzt werden.<br/><br />
<br/><br />
:Anleitung: [[GParted LiveCD]]<br/><br />
<br/><br />
Anschließend kann die Installation erneut [[Anleitung_openSUSE_10_3_Installation | geststartet werden]].<br/><br />
In dem unpartitionierte Bereich werden nun vom Setup ([[YaST]]) automatisch die benötigten Partitionen angelegt.<br/><br />
<br clear="all" /><br />
<br />
== Manuelle Partitionierung (Experten) ==<br />
<br />
<br />
<br />
== "Schwarzer Bildschirm" beim ersten Start ==<br />
<br />
<br />
<br />
== YaST/zypper übernimmt Proxy-Authentifierungs-Einstellungen nicht ==<br />
<br />
<br />
== Fehler beim Einrichten der Installationsquelle(n) ==<br />
<br />
<br />
<!-- Folgende Quellen sollten '''unbedingt''' eingerichet werden:<br/><br/><br />
<br />
<u>Basisinstallationsquelle:</u> (<u>Einen</u> '''Mirror''' auswählen)<pre><br />
http://suse.inode.at/opensuse/distribution/10.3/repo/oss<br />
http://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/oss<br />
http://klid.dk/ftp/opensuse/distribution/10.3/repo/oss<br />
http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/oss<br />
http://ftp.uni-erlangen.de/pub/mirrors/opensuse/distribution/10.3/repo/oss<br />
http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/oss<br />
http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/oss<br />
http://ftp.stw-bonn.de/pub/opensuse/distribution/10.3/repo/oss</pre><br />
<br />
<u>Extra-Repository:</u> (<u>Einen</u> '''Mirror''' auswählen)<pre><br />
http://suse.inode.at/opensuse/distribution/10.3/repo/non-oss<br />
http://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss<br />
http://klid.dk/ftp/opensuse/distribution/10.3/repo/non-oss<br />
http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss<br />
http://ftp.uni-erlangen.de/pub/mirrors/opensuse/distribution/10.3/repo/non-oss<br />
http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss<br />
http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/non-oss<br />
http://ftp.stw-bonn.de/pub/opensuse/distribution/10.3/repo/non-oss</pre><br />
<br />
<u>Update-Repository:</u> (<u>Einen</u> '''Mirror''' auswählen)<pre><br />
http://ftp5.gwdg.de/pub/suse/update/10.3<br />
http://suse.inode.at/pub/update/10.3<br />
http://ftp.tu-chemnitz.de/pub/linux/suse/ftp.suse.com/suse/update/10.3<br />
http://ftp.leo.org/pub/comp/os/unix/linux/suse/suse/update/10.3<br />
http://fr.rpmfind.net/linux/SuSE-Linux/update/10.3<br />
http://you.novell.hu/update/10.3<br />
http://ftp.isr.ist.utl.pt/pub/suse/update/10.3<br />
http://ftp.lug.ro/suse/suse/update/10.3<br />
http://ftp.chg.ru/pub/Linux/SuSE/suse/update/10.3</pre><br />
<br />
<u>Packman:</u> (<u>Einen</u> '''Mirror''' auswählen)<pre><br />
http://packman.mirrors.skynet.be/pub/packman/suse/10.3<br />
http://ftp5.gwdg.de/pub/linux/misc/packman/suse/10.3<br />
http://ftp.uni-erlangen.de/pub/mirrors/packman/suse/10.3<br />
http://packman.iu-bremen.de/suse/10.3<br />
http://packman.inode.at/suse/10.3<br />
http://mirror.geht-schon.de/packman.links2linux.de/suse/10.3<br />
http://ftp.halifax.rwth-aachen.de/packman/suse/10.3<br />
http://ftp.gts.lug.ro/packman/suse/10.3</pre><br />
//--><br />
<br />
<br/><br/><br />
<noinclude>{{Anleitung openSUSE 10 3 Wikibook Footer}}</noinclude></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Anleitung_openSUSE_10_3_Installation&diff=32127Anleitung openSUSE 10 3 Installation2015-09-05T20:19:03Z<p>Robi: intern verlinkt</p>
<hr />
<div><noinclude>{{Anleitung openSUSE 10 3 Wikibook Titel}}</noinclude><br />
<br/><br/><br />
<br />
<br />
Wenn alle vorbereitungen abgeschlossen sind, erfolgt nun die eigentliche Linux-Installation.<br/><br />
<br clear="all" /><br />
<br />
== Installationssystem booten ==<br />
<br />
Zuerst sollte sichergestellt werden, dass der Rechner auch vom CD/DVD-Laufwerk bootet (bzw. überhaupt booten kann).<br/><br />
Dazu im [[BIOS]] die bootreihenfolge umstellen.<br/><br />
Neuere boards bieten auch die Möglichkeit zu Beginn des Bootvorgangs mit den Tasten '''<F8>''' oder '''<F12>''' ein Bootmenü aufzurufen in welchem das Boot-Device ausgewählt werden kann ohne dafür extra ins BIOS wechseln zu müssen.<br/><br />
Bei Problemen bitte das Handbuch des jeweiligen Mainboard-Herstellers zu rate ziehen.<br/><br />
<br clear="all" /><br />
<br />
== Bootmenü ==<br />
[[Bild:Installguide-os103_os-grub.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Bootmenü]]<br />
<br/><br />
Wenn der rechner dann vom CD/DVD-laufwerk bootet erscheint das suse-bootmenü.<br/><br />
* mit den pfeiltasten hier "'''installation'''" auswählen.<br />
* mit '''<f2>''' die bevorzugte sprache auswählen.<br />
* mit '''<f3>''' die gewünschte auflösung wählen.<br />
{{Hinweis|Breite=75%|Da das Installationssystem nur einen Standard VGA-Treiber verwendet, kann eine zu hoch gewählte Auflösung dazu führen, dass der Monitor kein Bild zeigt und die Meldung "''Out of Range''" bzw. "''Auflösung wird nicht Unterstützt''" ausgibt.<br/><br />
In diesem Fall eine niedrigere Auflösung wählen.<br />
}}<br />
*Falls eine andere [[YaST-Installationsquellen für openSUSE#SuSE_Linux_Installationsquelle | Installationsquelle]] als das Bootmedium verwendet werden soll - z.B. ein Server im Netzwerk (lokales Netz oder Internet) oder ein ISO, das auf der Festplatte gespeichert wurde - kann diese mit '''<F4>''' bzw. über die entsprechende Bootoption angegeben werden.<br />
:Siehe [[Anleitung openSUSE 10 3 Troubleshooting#Alternative Installationsquellen | Troubleshooting]]<br/><br />
* Mit '''<Return>''' die Auswahl bestätigen und die Installation starten.<br />
<br clear="all" /><br />
<br />
== Sprachauswahl ==<br />
[[Bild:Installguide-os103_os-lang.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Sprachauswahl]]<br />
<br/><br />
Die gewüschte Sprache auswählen.<br/><br />
<br clear="all" /><br />
<br />
== Lizenzvereinbarungen ==<br />
[[Bild:Installguide-os103_os-license.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Lizenzvereinbarungen]]<br />
<br/><br />
Die Lizenzvereinbarungen sollten <u>gelesen</u> und akzeptiert werden.<br/><br />
<br clear="all" /><br />
<br />
== Installationsmodus ==<br />
[[Bild:Installguide-os103_os-mode.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Installationsmodus]]<br />
<br/><br />
*"'''Neuinstallation'''" als Installationsmodus auswählen<br />
*"'''Add-on Produkte aus separaten Medien einschließen'''" <u>nicht</u> auswählen<br />
*"'''Hinzufügen von Online-Repositories vor der Installation'''" <u>nicht</u> auswählen<br />
<br clear="all" /><br />
<br />
== Uhrzeit und Zeitzone ==<br />
[[Bild:Installguide-os103_os-timezone.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Uhrzeit und Zeitzone]]<br />
<br/><br />
Nach dem Einlesen der Paketquellen erfolgt die Festlegung von '''Uhrzeit und Zeitzone'''.<br/><br />
{{Hinweis|Breite=75%|Da Microsoft Windows immer die lokale Zeit verwendet und Probleme bekommt, falls die Systemzeit auf '''UTC''' ('''U'''niversal '''T'''ime '''C'''oordinated) gesetzt ist, sollte auf Rechnern mit Dualboot (Linux und Windows) die lokale Zeit eingestellt werden.<br/><br />
Für ''Linux-only''-Maschinen - also Rechner mit ausschließlich Linux-Installationen - empfiehlt es sich die Systemzeit auf '''UTC''' zu setzen.<br />
}}<br />
<br clear="all" /><br />
<br />
== Auswahl des Desktops ==<br />
[[Bild:Installguide-os103_os-desktop.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Auswahl des Desktops]]<br />
<br/><br />
Bei der Wahl des Desktop-Environment (kurz: DE) bitte frei wählen.<br/><br />
Einsteiger/Linux-Anfäger sollten sich - einen entsprechend Leistungsstarken Rechner vorausgesetzt (mindestens 512MB RAM) - für eins der großen DEs ('''Gnome''' oder '''KDE''') entscheiden.<br/><br />
Für ältere Rechner empfiehlt es sich zuerst ein X-Windows Grundsystem (Menüpunkt: Andere) auszuwählen und anschließend bei der Softwareauswahl ein schlankeres DE (wie '''XFCE''') oder einen Resourcenschonenden Windowmanager (wie z.B. '''Fluxbox''' oder '''Windowmaker''') zusätzlich auszuwählen.<br/><br />
<br/><br />
Bezüglich der Vor- und Nachteile gibt es zwischen Gnome und KDE kaum Unterschiede - mit beiden Desktop-Environments lässt sich als Anfänger komfortabel arbeiten.<br/><br />
*[[GNOME]]: [http://de.wikipedia.org/wiki/GNOME]<br />
*[[KDE]]: [http://de.wikipedia.org/wiki/Kde]<br />
*[[Xfce]]: [http://de.wikipedia.org/wiki/Xfce]<br />
<br clear="all" /><br />
<br />
== Installationseinstellungen ==<br />
[[Bild:Installguide-os103_os-install-settings.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Installationseinstellungen]]<br />
<br/><br />
An dieser Stelle bitte auf den (Kartei-)Reiter "'''Experten'''" wechseln.<br/><br />
<br/><br />
<br />
=== System ===<br />
Hier sollte der Prozessor sowie der Arbeitsspeicher (RAM) des eingesetzten Rechners auflelistet sein.<br/><br />
An dieser Stelle kann die Hardware-Erkennung nocheinmal wiederholt werden.<br/><br />
''Empfohlen:'' Diese Einstellung unverändert lassen.<br/><br />
<br/><br />
<br />
=== Tastaturbelegung ===<br />
Sollte nicht die gewünschte Tastaturbelegung ausgewählt sein, kann diese Einstellung hier geändert werden.<br/><br />
<br/><br />
<br />
=== Partitionierung ===<br />
YaST (das openSUSE-Setup Werkzeug) sollte hier automatisch die vorhandene Windows-Partition erkennen und anbieten diese zu verkleinern (rote Schrift).<br/><br />
In dem Freien Platz wird nun eine Erweiterte Partition erstellt in der wiederum '''drei''' logische Laufwerke angelegt werden:<br/><br />
*Eine '''Swap'''-Partition, die Linux als Auslagerungsspeicher dient und auch als Speicherort für die Option '''Suspend-to-Disk''' dient.<br />
*Eine '''Root'''-Partition - also die Systempartition von SUSE-Linux.<br />
*Eine '''Home'''-Partition. Hier werden die jeweiligen User-Verzeichnisse angelegt - '''/home''' entspricht also in etwa den '''Eigenen Dateien''' unter Windows.<br />
(Der Vorteil einer separaten '''Home'''-Partition ist, dass im Falle einer Neuinstallation oder eines Updates die jeweiligen User-Einstellungen erhalten bleiben bzw. durch die pysikalische Trennung von restlichen System leichter zu sichern sind.)<br/><br />
<br/><br />
{{Box Hinweis||An dieser Stelle bitte '''<u>sorgfältig</u>''' darauf achten, dass hier nicht unerwünscht Partitionen gelöscht oder formatiert werden!<br />
}}<br />
:Zur manuellen Partitionierung siehe: [[Anleitung openSUSE 10 3 Troubleshooting#Manuelle Partitionierung (Experten) | Troubleshooting]]<br/><br />
<br/><br />
<br />
=== Software ===<br />
Auswahl der Software für die Installation.<br/><br />
Hier kann zusätzliche Software zur Installation ausgewählt bzw. abgewählt werden.<br/><br />
Sofern nicht unbedingt nötig (z.B. wegen mangelndem Speicherplatz) sollte die vorgegebene Softwareauswahl übernommen werden.<br/><br />
<br/><br />
<br />
=== Systemstart ===<br />
Einrichtung des Bootloaders (Grub).<br/><br />
Hier ist normalerweise auch kein manueller Eingriff notwendig.<br/><br />
YaST erkennt die vorhandene Windows-Installation und fügt automatisch einen Startmenü-Eintrag für Windows hinzu.<br/><br />
Der Bootloader wird in den MBR ('''M'''aster '''B'''oot '''R'''ecord) der ersten Festplatte geschrieben.<br/><br />
<br/><br />
<br />
=== Zeitzone ===<br />
Hier bitte die gewählte Zeitzone überprüfen und bei gegebenenfalls ändern.<br/><br />
<br/><br />
<br />
=== Sprache ===<br />
Sollte nicht die gewünschte (zuvor gewählte) Sprache eingestellt sein, kann dies hier geändert werden.<br/><br />
<br/><br />
<br />
=== Standard-Runlevel ===<br />
Als Standard-Runlevel sollte: '''5: Voller Mehrbenutzerbetrieb mit Netzwerk und Display-Manager''' ausgewählt sein.<br/><br />
Dies ist die Standardeinstellung für Desktop-Systeme mit einer graphischen Oberfläche und sollte also nicht verändert werden.<br/><br />
<br/><br />
<br />
== Installation bestätigen ==<br />
[[Bild:Installguide-os103_os-confirm.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Installation bestätigen]]<br />
<br/><br />
Mit dem Klicken auf die Schaltfläche '''Installieren''' wird die eigentliche Installation gestartet.<br/><br />
Alle zuvor getätigten Einstellungen werden jetzt auf das existierenden System angewendet.<br/><br />
Bitte nur Fortfahren, wenn man sicher ist, die "''richtigen''" Einstellungen gewählt zu haben.<br/><br />
<br/><br />
:Abbruch der Verkleinerung der Windows-Partition mit einem '''Systemfehlercode''': [[Anleitung openSUSE 10 3 Troubleshooting#Windows-Partition lässt sich nicht verkleinern | Troubleshooting]]<br/><br />
{{Box Hinweis||Bis zu diesem Punkt ist ein Abbruch der Installation jederzeit - '''ohne Folgen''' - möglich.<br />
}}<br />
<br clear="all" /><br />
<br />
== Festplatte vorbereiten / Paketinstallation / Abschluß der Installation ==<br />
[[Bild:Installguide-os103_os-install-packages.png|right|thumb|140px|Installation [[openSUSE]] 10.3 - Paketinstallation]]<br />
<br/><br />
Nachdem alle Einstellungen zur Installation getätigt und die Installation bestätigt wurde, werden nun drei Partitionen erstellt:<br/><br />
*Die '''Root'''-Partition, auf der das eigentlich System installiert wird.<br />
*Eine '''Swap'''-Partition, die als Auslagerungspeicher dient und für "Suspend to Disk" genutzt wird.<br />
*Die '''Home'''-Partition, die alle Daten und Einstellungen der Benutzer enthält.<br />
<br/><br />
Nachdem diese Partitionen mit ihren jeweiligen Dateisystem angelegt wurden, erfolgt die eigentliche Installation des System - d.h. das Einspielen der Pakete.<br/><br />
<br/><br />
Nach dem Kopieren der Pakete wird der Bootloader ([[Grub]]) installiert und das System auf den ersten Bootvorgang vorbereitet.<br/><br />
Anschließend erfolgt der erste Neusstart.<br/><br />
{{Hinweis|<br />
Dabei sollte unbingt das Bootmedium (die CD/DVD) aus dem Laufwerk entfernt werden bzw. die Bootreihenfolge wieder zurückgestellt werden um von der Festplatte zu booten.<br/><br />
Sollte die Bootreihenfolge nicht umgestellt worden sein sein und der Rechner erneut von dem Installationsmedium booten, kann im Bootmenü die Option "'''Boot from Harddisk'''" ausgewählt werden um von der Festplatte zu booten.<br/><br />
Anschließend erscheint dann das Bootmenü des MBR (der Festplatte) in dem natürlich das neue openSUSE System zum Booten ausgewählt werden sollte.<br />
}}<br />
<br clear="all" /><br />
<br />
<br/><br/><br/>[[Anleitung openSUSE 10 3 Grundkonfiguration | Weiter]] geht es mit der [[Anleitung openSUSE 10 3 Grundkonfiguration | Grundkonfiguration des Systems]] ...<br />
<br/><br/><br />
<noinclude>{{Anleitung openSUSE 10 3 Wikibook Footer}}</noinclude></div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=GParted_LiveCD&diff=32126GParted LiveCD2015-09-05T20:18:28Z<p>Robi: intern verlinkt</p>
<hr />
<div>'''[[Allgemeines]]'''<br />
<br />
<br />
<br />
== Allgemein ==<br />
<br />
Diese Anleitung beschreibt die Verkleinerung einer bestehenden NTFS-Partition mit Hilfe der GParted-LiveCD um Platz für eine Linux-Installation zu schaffen.<br/><br />
<br/><br />
<br />
== Vorbereitungen ==<br />
<br/><br />
<br />
=== GParted herunterladen ===<br />
<br />
Zuerst muss von [http://gparted.sourceforge.net/download.php hier] das ISO-Image für die LiveCD heruntergeladen werden.<br/><br />
<br/><br />
{{Box Hinweis||<br />
Das ISO bitte via Bittorrent herunterladen, um die FTP-Server zu entlasten.<br />
}}<br />
<br clear="all" /><br />
<br />
=== MD5SUM prüfen ===<br />
<!-- [[Bild:Installguide-os103_win-md5sum.png|right|thumb|140px|[[MD5SUM - Downloads Überprüfen | MD5SUM]] prüfen]]<br />
<br/> //--><br />
Nach dem Herunterladen des ISOs sollte unbedingt die MD5Sum des Images überprüft werden, um festzustellen, ob die Datei fehlerfrei heruntergeladen wurde.<br/><br />
Für Windows benötigt man dazu ein externes Programm wie z.B. [http://www.nullriver.com/index/products/winmd5sum winMd5Sum]<br/><br />
<br/><br />
Zuerst muss das heruntergeladene ISO-Image ausgewählt und mit "'''Calculate'''" die Prüfsumme für die Datei berechnet werden.<br/><br />
Anschließend die Prüfsumme aus der MD5SUMS-Datei auf dem FTP-Server in das Feld Compare kopieren und die beiden Summen mit "'''Compare'''" vergleichen lassen.<br/><br />
Nur wenn beide Prüfsummen überein stimmen, sollte das Image gebrannt werden.<br/><br />
<br/><br />
:[[MD5SUM - Downloads Überprüfen | MD5SUM prüfen]]<br/><br />
<br clear="all" /><br />
<br />
=== Auf CD brennen ===<br />
<!-- [[Bild:Installguide-os103_os-.png|right|thumb|140px|[[openSUSE]] [[Open SuSE auf DVD brennen | auf DVD brennen]]]]<br />
<br/> //--><br />
Beim Brennen auf CD/DVD die Option "Image brennen" auswählen - alle gängigen Brennprogramme sollten diese (oder eine ähnliche) Option mitbringen - und die heruntergeladene ISO-Datei auswählen.<br/><br />
Einige Packprogramme (z.B. WinRAR) unter Windows zeigen diese Image-Datei als Archiv an - das ISO sollte aber '''auf keinen Fall''' entpackt werden.<br/><br />
<br/><br />
:[[Open SuSE auf DVD brennen | Anleitung zum Brennen]]<br/><br />
<br clear="all" /><br />
<br />
=== Windows-Partition defragmentieren ===<br />
<!-- [[Bild:Installguide-os103_os-.png|right|thumb|140px|NTFS-Partition defragmentieren]]<br />
<br/> //--><br />
Bevor nun die Windows-Partition verkleinert wird um Platz für Linux zu schaffen sollte diese auf jeden Fall Defragmentiert werden.<br/><br />
Da Windows XP unbedingt die erste Primäre Partition auf der Festplatte belegen will, wird die Festplatte von hinten beginnend verkleinert um Platz für Linux zu schaffen.<br/><br />
Durch das Defragmentieren der Partition werden die Daten geordnet und physikalisch (soweit wie möglich) nach Vorne verschoben.<br/><br />
Dadurch wird das Risiko des Datenverlustes beim Verkleinern deutlich reduziert.<br/><br />
<br/><br />
Das Windowseigene Werkzeug zum Defragmentieren findet man im '''Startmenü''' unter '''Systemsteuerung''' > '''Verwaltung''' > '''Computerverwaltung''' unterhalb von '''Datenspeicher'''.<br/><br />
<br/><br />
Empfehlenswert ist außerdem ein Drittprogramm für die Defragmentierung zu verwenden und die Defragmentierung mehrmals durchlaufen zu lassen.<br/><br />
Defragmentierprogramme wären z.B. [http://www.withopf.com/tools/hdiskdefrag/ HDiskDefrag] oder [http://www.oo-software.com/home/en/products/oodefrag/ O&O Defrag] (Kostenpflichtig - eine Testversion ist Kostenlos erhältlich).<br/><br />
<br clear="all" /><br />
<br />
== Windows-Partition verkleinern ==<br />
<br />
Wichtig dabei ist ebenfalls, dass das Windows-System vor dem Verkleinern '''<u>ordnungsgemäß</u>''' heruntergefahren wurden.<br/><br />
Andernfalls kommt es beim Verkleinern der NTFS-Partition zu einem Fehler, da gparted das Journal des NTFS-Dateisystems nicht korrekt lesen kann.<br/><br />
<br clear="all" /><br />
<br />
=== Live-CD booten ===<br />
<br />
Zuerst sollte sichergestellt werden, dass der Rechner auch vom CD/DVD-Laufwerk bootet (bzw. überhaupt booten kann).<br/><br />
Dazu im [[BIOS]] die bootreihenfolge umstellen.<br/><br />
Neuere boards bieten auch die Möglichkeit zu Beginn des Bootvorgangs mit den Tasten '''<F8>''' oder '''<F12>''' ein Bootmenü aufzurufen in welchem das Boot-Device ausgewählt werden kann ohne dafür extra ins BIOS wechseln zu müssen.<br/><br />
Bei Problemen bitte das Handbuch des jeweiligen Mainboard-Herstellers zu rate ziehen.<br/><br />
<br clear="all" /><br />
<br />
==== Bootmenü ====<br />
[[Bild:Guide-gparted_grub.png|right|thumb|140px|GParted LiveCD - Bootmenü]]<br />
<br/><br />
Im Bootmenü der LiveCD die Standardeinstellung ('''auto-configuration''') auswählen und mit '''Return''' bestätigen.<br/><br />
<br clear="all" /><br />
<br />
==== Tastaturlayout ====<br />
[[Bild:Guide-gparted_keymap.png|right|thumb|140px|GParted LiveCD - Bootmenü]]<br />
<br/><br />
Das gewünschte Tastaturlayout ('''keymap''') mit dem entsprechendem Kürzel auswählen.<br/><br />
10<br />
bzw.<br />
de<br />
steht dabei für ein deutsches Layout.<br/><br />
<br clear="all" /><br />
<br />
==== Sprache ====<br />
[[Bild:Guide-gparted_keymap.png|right|thumb|140px|GParted LiveCD - Bootmenü]]<br />
<br/><br />
Die gewünschte Sprache ('''language settings''') ebenfalls mit dem jeweiligen Kürzel auswählen.<br/><br />
10<br />
stellt Deutsch als Sprache ein.<br/><br />
{{Hinweis|Breite=75%|Offensichtlich ist die deutsche Übersetzung der LiveCD noch nicht ganz vollständig.<br/><br />
Daher sind einige Schaltflächen - trotzdem Deutsch als Sprache gewählt wurde - immer noch in Englisch gehalten.<br />
}}<br />
<br clear="all" /><br />
<br />
=== GParted ===<br />
[[Bild:Guide-gparted_main.png|right|thumb|140px|GParted LiveCD - Bootmenü]]<br />
<br/><br />
Nach dem Start des X-Servers wird das Partitionierungsprogramm (gparted) automatisch mit dem [[Windowmanager]] ([[Fluxbox]]) gestartet.<br/><br />
<br/><br />
Verkleinern der NTFS-Partition:<br />
*Entsprechende Partition auswählen (Linksklick)<br />
*Kontextmenü öffenen (Rechtsklick auf die jeweilige Partition) > Größe ändern/Verschieben (Resize/Move)<br />
:Alternative: <u>Menü</u> > Partition > Größe ändern/Verschieben (Resize/Move)<br />
*Neue Größe der NTFS-Partition festlegen:<br />
:Dazu einfach in das Feld '''Free Space Following''' die Größe der zuküftigen Linux-Installation eintragen.<br/><br />
:Die Windows-Partition wird dann automatisch <u>um</u> diesen Wert verkleinert.<br />
:'''Wichtig:''' Der freie Platz muss <u>hinter</u> der NTFS-Partition geschaffen werden, damit sich Windows weiterhin auf der ersten Primären Partition wiederfindet.<br/><br />
{{Hinweis|<br />
Die '''Root'''-Partition (Systempartition) einer aktuellen Linux-Distribution sollte mindestens 6GB - besser 8GB bis 12GB - groß sein.<br/><br />
Für die '''Swap'''-Partition (Auslagerungsspeicher) werden zwischen 512MB und 1GB Speicherplatz benötigt (je nach Arbeitsspeicher) - evtl. auch mehr sollte "Suspend to Disk" genutzt werden.<br/><br />
Dazu kommt noch der Speicherbedarf für die '''Home'''-Partition (zum speichern der Benutzer-Daten und -Einstellungen).<br/><br />
Insgesamt sollten für die Installation einer aktuellen Mainstream-Distribution ([[Fedora]], [[Mandriva]], [[OpenSUSE | openSUSE]], [[Ubuntu]]) <u>wenigstens</u> 10GB (ohne '''Home'''-Partition) zur Verfügung stehen.<br/><br />
Eine schlankere Distribution (Damm-Small-Linux, Vector-Linux) für Rechner mit älterer Hardware kommt allerding mit weit Speicherplatz zurecht.<br />
}}<br />
*Mit '''Anwenden''' (Apply) bestätigen<br />
<br/>{{Box Hinweis||Die Änderungen werden nicht sofort angewendet.<br/>Ein Abbruch ist bis zu diesem Punkt immer noch - '''ohne Folgen''' - möglich.<br />
}}<br />
*Im Hauptfenster des Partitionierungsprogramms auf '''Anwenden''' (Apply) klicken um die Änderungen auf die Partitionstabelle anzuwenden.<br />
*Erst nach der Bestätigung im Dialog "'''Operationen auf Festplatte anwenden'''" wird die NTFS-Partition verkleinert.<br />
*Nach der erfolgreichen Größenänderung den Zusammenfassungs-Dialog schließen (Close)<br />
<br />
<br/><br />
<br />
<gallery caption="Größenänderung der NTFS-Partition" perrow="5"><br />
Bild:Guide-gparted_resize-1.png|Kontextmenü<br />
Bild:Guide-gparted_resize-2.png|Größe ändern/Verschieben<br />
Bild:Guide-gparted_resize-3.png|Anwenden<br />
Bild:Guide-gparted_resize-4.png|Operationen anwenden<br />
Bild:Guide-gparted_resize-5.png|Zusammenfassung<br />
</gallery><br />
<br />
<br/><br />
<br />
{{Hinweis|<br />
Der frei gewordene Platz braucht nicht weiter partitioniert werden.<br/><br />
Das Setup-Programm der jeweiligen Linux-Distribution kann in diesem unpartitionierten Bereich automatisch die benötigten Partitionen anlegen.<br />
}}<br />
<br clear="all" /><br />
<br />
=== Beenden ===<br />
<br />
Nachdem die NTFS-Partition erfolgreich verkleinert wurde, kann die LiveCD heruntergefahren werden.<br/><br />
*Doppelklick auf den Exit-Button<br />
*Im Exit-Dialog "'''Exit'''" auswählen<br />
*Mit "'''OK'''" bestätigen <br />
<br clear="all" /><br />
<br />
== Troubleshooting ==<br />
<br />
<br/><br />
<br clear="all" /><br />
<br />
== Links ==<br />
<br />
*[http://gparted.sourceforge.net GParted Projekt]<br />
*[http://www.nullriver.com/index/products/winmd5sum winMd5Sum]<br />
*[http://www.withopf.com/tools/hdiskdefrag/ HDiskDefrag]<br />
*[http://www.oo-software.com/home/en/products/oodefrag/ O&O Defrag]<br />
*[http://gparted.org/livecd.php Gnome Partition Editor]{{englisch}}<br />
*[[Partitionen vergrößern (GParted)]]<br />
<br />
<br />
----<br />
<br />
[[Allgemeines | Zurück zu Allgemeines]]<br />
<br />
[[Kategorie:Allgemeines]][[Kategorie:Partitionen]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Wake_On_LAN&diff=32125Wake On LAN2015-09-05T20:16:38Z<p>Robi: intern verlinkt</p>
<hr />
<div>== Einleitung ==<br />
<br />
Hat man ein en Server (z.B. Fileserver) der rund um die Uhr läuft aber tatsächlich nur wenige Stunden benötigt wird, kann man seine Lebenserwartung steigern und Strom sparen.<br><br />
Im folgendem Howto wird beschrieben wie ein Server automatisch um 23:59 Uhr ausgeschaltet und durch einen Client wieder aktiviert wird.<br><br />
<br />
== Vorbereitung Server ==<br />
<br />
Die Einstellungen sind durch die unterschiedlichen [[BIOS]]e leider nicht leicht. Es muss auf jeden Fall eingestellt werden das der PC durch die Netzkarte aktiviert werden kann.<br><br />
Bei ASROCK muss man „PCI Devices Power On“ auf „Enable“ setzen. Das war es aber auch schon.<br><br />
Welche Einstellung für andere BIOS-Varianten gelten muss durch probieren in Erfahrung gebracht werden.<br><br />
Unter „[[YaST]]“ - „System“ - „Konfiguration des Bootloaders“ - wählt man den Standardeintrag (meist der erste), geht auf „Bearbeiten“ und ergänzt die Zeile „Optional kernel command line parameter“ um „acpi=force“.<br><br />
Ist dieser Eintrag vorhanden, bitte nur entsprechend ändern.<br />
<br />
Nun muss auf dem Server noch „ethtool“ installiert werden. Auch hier hilft „Yast“.<br />
<br />
Folgendes kommt zum großen Teil von hier: http://www.brueck-computer.de/index2.php?modul=1404&link=1<br />
<br />
Test der korrekten Konfiguration:<br><br />
Als "root" in der Console `<code>/sbin/ip addr</code>` ausführen.<br><br />
Der zweite Eintrag verrät uns die Bezeichnung der Netzkarte (in meinem Fall „eth0“) und die Hardware-Adresse (MAC) in Form von "<code>link/ether xx:xx:xx:xx:xx:xx</code>.<br><br />
Auch hier können je nach Board und Netzwerkkarte Unterschiede in der Bezeichnung sein.<br><br />
Nun folgt in der Console „ethtool eth0“. Als Ergebnis sollte sowas kommen:<br />
<br />
<nowiki>Settings for eth0:<br />
Supported ports: [ TP MII ]<br />
Supported link modes: 10baseT/Half 10baseT/Full<br />
100baseT/Half 100baseT/Full<br />
Supports auto-negotiation: Yes<br />
Advertised link modes: 10baseT/Half 10baseT/Full<br />
100baseT/Half 100baseT/Full<br />
Advertised auto-negotiation: Yes<br />
Speed: 100Mb/s<br />
Duplex: Full<br />
Port: MII<br />
PHYAD: 1<br />
Transceiver: internal<br />
Auto-negotiation: on<br />
Supports Wake-on: pumbg<br />
Wake-on: d<br />
Current message level: 0x00000001 (1)<br />
Link detected: yes<br />
</nowiki><br />
Unter „Supports Wake-on“ finden wir was die Netzwerkkarte kann und unter „Wake-on“ worauf sie z.Z. reagiert.<br><br />
In diesem Fall auf nichts. „d“ steht für „Deaktiviert“.<br><br />
<br><br />
Folgende Werte sind möglich:<br><br />
<table border="0"><br />
<tr><td>p&nbsp;&nbsp;</td><td>Wake on physikalischer Aktivität</td></tr><br />
<tr><td>u&nbsp;&nbsp;</td><td>Wake on Unicast-Nachricht</td></tr><br />
<tr><td>m&nbsp;&nbsp;</td><td>Wake on Multicast-Nachricht</td></tr><br />
<tr><td>b&nbsp;&nbsp;</td><td>Wake on Broadcast-Nachricht</td></tr><br />
<tr><td>a&nbsp;&nbsp;</td><td>Wake on ARP</td></tr><br />
<tr><td>g&nbsp;&nbsp;</td><td>Wake on MagicPacket(tm)</td></tr><br />
<tr><td>s&nbsp;&nbsp;</td><td>Aktivere SecureOn(tm) Passwort frür MagicPacket(tm)</td></tr><br />
<tr><td>d&nbsp;&nbsp;</td><td>Deaktiviert (wake on nichts). Diese Option löscht alle vorherigen Optionen</td></tr><br />
</table><br />
<br><br />
Um den Server vom Client aus zu aktivieren benötigen wir unter „Wake-on“ mindestens ein „g“.<br><br />
Dazu folgenden Befehl eingeben:<br />
<br />
"ethtool -s eth0 wol g"<br />
<br />
Danach den Server einmal neu starten und anschließend wieder als „root“ „ethtool eth0“ aufrufen.<br><br />
Steht da nun immer noch ein „g“ hinter „Wake-on“ ist die Konfiguration korrekt.<br><br />
Vermutlich steht da aber ein „d“ und die Karte wurde wieder deaktiviert.<br />
<br />
Um zu erreichen das die Karte bei jedem Start neu aktiviert wird, kann folgendes Script verwendet werden.<br><br />
<br />
<nowiki>### BEGIN INIT INFO<br />
# Provides: named<br />
# Required-Start: $network<br />
# Required-Stop:<br />
# Default-Start: 3 5<br />
# Default-Stop:<br />
# Description: WOL Karteneinstellung<br />
### END INIT INFO<br />
<br />
/sbin/ip link set dev eth0 up<br />
/usr/sbin/ethtool -s eth0 wol pg<br />
/usr/sbin/ethtool eth0</nowiki><br />
<br />
Mehr Informationen zu diesem thema http://www.linux-club.de/faq/Runlevel_scripte_-_Scripts_selbst_erstellen.<br><br />
<br><br />
Die Funktion nochmals mit „reboot“ und „ethtool eth0“ testen.<br><br />
<br />
<br />
'''Hinweis:'''<br>{{Box Hinweis||<br />
Bei einigen Netzwerkkarten (z.B. der Onboard-'''Netzwerkkarte Marvell 88E8001''' mit Yukon-Chipsatz) kann mit dem von Suse automatisch ausgewählten Treiber sk98lin die WoL-Funktion nicht aktiviert werden, obwohl die Karte diese Funktionalität aufweist. Außerdem wird die WoL-Funktion bei jedem Herunterfahren des Systems automatisch ausgeschaltet und dadurch das Starten des Systems mit dem MagicPacket(tm) verhindert.<br />
}}<br />
<br />
Um die WoL-Funktionalität der Netzwerkkarte zu ermöglichen, muss man den Treiber skge auswählen. Dieser ist bei der aktuellen Suse 10.2 bereits dabei und kann in yast wie folgt einfach ausgewählt werden: Öffne yast > Netzwerkgeräte > Netzwerkkarte > Networkmanager oder ifup > Bearbeiten > Adresse > Erweitert... > Hardwaredetails > in Modulname skge anstelle von sk98lin eintragen > OK > Weiter > Beenden<br><br />
Nun kann man in einer Shell die WoL-Funktion wie o.g. aktivieren. Möchte man den Rechner per MagicPacket(tm) starten, dann setzt man mit dem Befehl "ethtool -s ethX wol g" (an X richtige Zahl eintragen) die Funktion "Wake on" auf g.<br />
<br />
Nun muss man das Problem beheben, dass Suse die Netzwerkkarte bei jedem Herunterfahren des Systems komplett ausschaltet und ein Wake on Lan dadurch nicht möglich ist. Es kann sein, dass dieses Problem nur mit dem Network Manager und nicht bei Verwendung von ifup besteht.<br><br />
Ich habe dieses Problem folgendermaßen gelöst, womit man auch den NetworkManager weiterhin wie gewohnt nutzen kann:<br><br />
In die /etc/init.d/halt.local trägt man zwei Zeilen ein:<br />
ifup ethX<br><br />
ethtool -s ethX wol g<br />
(anstelle des X die richtige Zahl eintragen)<br />
<br />
Damit wird beim Shutdown noch kurz ifup gestartet und direkt im Anschluss "Wake on" auf "g" gesetzt. Die Netzwerkkarte wird nicht komplett ausgeschaltet und bleibt über das Lan erreichbar.<br />
<br />
Trägt man in die /etc/init.d/boot.local die Zeile "ethtool -s ethX wol g" (ohne Anführungszeichen und anstelle von X die richtige Zahl) ein, dann ist "Wake on" auch nach dem Bootvorgang auf "g" gesetzt, was ansonsten nicht der Fall wäre. Fehlt dieser Eintrag in der boot.local wird der Rechner zwar per WoL gestartet, er verfügt danach jedoch über keine Internetverbindung, selbst dann nicht, wenn in yast/NetworkManager Geräte-Aktivierung "Beim Systemstart" ausgewählt wurde.<br />
<br />
== Linux Client ==<br />
<br />
Über „Yast“ muss „wol“ bzw. „WorkOnLan“ oder was gleichwertiges installiert werden.<br><br />
Dieses Programm muss in der Lage sein der Netzkarte ein „Wake on MagicPacket(tm)“ zu senden.<br />
<br />
Zum testen kann der Server nun mit z.B. "init 0" runtergefahren und dann (z.B. beim WOL) in der Console ein „wol xx:xx:xx:xx:xx:xx“ (MAC) wieder aktiviert werden.<br />
<br />
Damit der Server aber auch dann gestartet wird, wenn irgendein Linux-Client im Netz startet, wird wieder ein Script benötigt:<br><br />
<br />
<nowiki>### BEGIN INIT INFO<br />
# Provides: named<br />
# Required-Start: $network<br />
# Required-Stop:<br />
# Default-Start: 3 5<br />
# Default-Stop:<br />
# Description: Erweckt den Server aus dem Schlaf<br />
### END INIT INFO<br />
<br />
/usr/bin/wol xx:xx:xx:xx:xx:xx</nowiki><br />
<br />
Beim testen bitte beachten das erst der Client und dann der Server runter gefahren wird. Sonst wird der Server durch den runter fahrenden Client gestartet.<br><br />
<br />
== Windows Client ==<br />
<br />
* http://www.gammadyne.com/cmdline.htm<br />
* http://www.depicus.com/wake-on-lan/<br />
<br />
== Server ausschalten ==<br />
<br />
Dazu bedarf es den Befehl „crontab -e“ und Kenntnisse im Gebrauch vom Editor „VI“ (x, i, :wq sollten aber reichen).<br><br />
Auch hier wieder ein Script erstellt (muss aber nicht sein, der Befehl kann auch direkt in die Crontab eingetragen werden).<br><br />
Diesmal aber nur:<br />
<br />
#!/bin/sh<br />
/sbin/shutdown -h now<br />
<br />
Der Beispieleintrag für die Crontab „59 23 * * * /pfad/zum/script/script“ fährt den Rechner um 23:59 runter.<br />
<br />
Wenn der Server trotzdem nicht endgültig runterfährt, evtl. alle Mountbefehle (Netz) in der fstab auf "noauto" setzen.<br />
<br />
== Quellen und weiterführende Links ==<br />
<br />
* http://www.fibel.org/linux/lfo-0.6.0/node322.html<br><br />
<br />
In Zusammenarbeit: roemi und framp<br />
<br />
----<br />
[[Netzwerk|zurück ins Netzwerk]]<br />
[[Kategorie:Netzwerkgrundlagen]]<br />
[[Category:TCP/IP]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=Dd&diff=32124Dd2015-09-05T20:15:48Z<p>Robi: intern verlinkt</p>
<hr />
<div>{{Box Achtung||<br />
viele der auf dieser Seite vorgestellten Befehle werden nur unter Rootkennung funktionieren und die Befehle müssen auf die Gegebenheiten des eigenen Rechners abgestimmt werden. Nur kleine Schreib- oder Denkfehler können schon zu ernsten Datenverlusten führen, deshalb '''vor dem Betätigen der Enter-Taste den Befehl genau anschauen'''<br />
}}<br />
<br />
= das Kommando dd = <br />
<br />
== allgemeines zum Kommando dd ==<br />
<br />
dd ist ein Kommando das noch aus der Urzeit von [http://de.wikipedia.org/wiki/Unix Unix] stammt. Der Name sollte früher ''Copy and Convert'' bedeuten, das Programmkürzel '''"cc"''' ('''C'''ompiler '''C'''ollection) war jedoch schon an den [http://de.wikipedia.org/wiki/C_%28Programmiersprache%29 C-][http://de.wikipedia.org/wiki/Compiler Compiler] vergeben. Daher kam es wohl kurzerhand zu "'''dd'''". Heute wird dieses Kürzel oftmals als '''disk dump''' oder ähnlich übersetzt, ursprünglich sollte es wohl doch mehr an das [http://de.wikipedia.org/wiki/Job_Control_Language JCL]-Kommando "Data Definition" erinnern, auch die für UNIX-Befehle doch sonderbaren Optionensschreibweisen erinnern noch sehr stark an diese Abstammung.<br />
<br />
Das UNIX-Kommando '''dd''' dient dem Umleiten von [http://de.wikipedia.org/wiki/Datenstrom Datenstömen]. Dabei kann es diese Datenströme [http://de.wikipedia.org/wiki/Byte Byteweise] bearbeiten und universell blocken. Als Quelle und Ziel der Datenströme können sowohl normale Dateien, die normalen Ein- und Ausgabekanäle der Prozesse und auch Geräteknoten verwendet werden. In früherer Zeit benötigte man das Programm dd , um inkompatible Formate und Zeichensätze zwischen unterschiedlichen Betriebssystemen und Geräten zu kopieren, und um Daten auf externen [http://de.wikipedia.org/wiki/Peripherieger%C3%A4t Peripheriegeräten] (oftmals [http://de.wikipedia.org/wiki/Bandlaufwerk Bandgeräte]) lesen und schreiben zu können.<br />
<br />
Typischen Beispielaufgaben aus dieser Zeit könnten heute auf Linux etwa so ausgesehen:<br />
* Auslesen eines [http://de.wikipedia.org/wiki/EBCDIC EBCDIC]-Bandes (80 Zeichen pro Record, 10 Records pro Block, Dichte 1600 bpi) Ausgabe als [http://de.wikipedia.org/wiki/ASCII Ascii]-Datei:<br />
dd if=/dev/nst1 of=/datei ibs=800 cbs=80 conv=ascii,lcase<br />
<br />
Für Konvertierungsaufgaben benötigt man heute '''dd''' nur noch wenig. Dort wo noch mit solchen inkompatiblen Daten gearbeitet wird, benutzt man heute meist Programme die schon die entsprechende Ein- und Ausgabefilter mitbringen. Wohl aber benötigt man auch heute noch die universellen Bockungsmöglichkeiten von '''dd''' in Bezug auf Datenströme und [http://de.wikipedia.org/wiki/Ger%C3%A4tedatei#Blockorientierte_Ger.C3.A4te Geräteknoten], sowie die Möglichkeit im Datenstrom gezielt zu positionieren. Besondere "Berühmtheit" hat heutzutage jedoch die Möglichkeit erlangt, Partitionen und ganze Festplatten bytegenau zu kopieren, was fälschlicher Weise dazu verleitet mag '''dd''' auch noch in den Rang eines [[Backupprogramme|Backuptools]] zu erheben.<br />
<br />
== die Optionen von dd ==<br />
<br />
Die Optionen von '''dd''' unterscheiden sich grundlegend von denen der meisten UNIX/Linux Kommandos. Eine Übersicht erhaltet ihr mit der Option '''--help''' oder der<br />
[http://usr-share-man.org/man1/dd.html Manpage von dd] ''( Achtung: evtl. sind nicht alle Optionen in eurer installierten Version vorhanden)''. Auch eine Infoseite "'''info:/coreutils/dd invocation'''" sollte bei vielen installiert sein.<br />
<br />
Die genaue '''SYNOPSIS''' ''(ältere Version)''<br><br />
dd [--help] [--version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks]<br />
[seek=blocks] [count=blocks] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]<br />
<br />
{| border="0"<br />
|+ ''' Die wichtigsten Optionen im Überblick '''<br />
<br />
!''if=Datei''<br />
||<br />
Der Datenstrom, der umgeleitet werden soll. Das kann eine Datei oder Gerätedatei, also auch eine Festplatte oder ein anderes Gerät sein. Wird ''if'' weggelassen liest '''dd''' von der Standardeingabe.<br />
|-<br />
!''of=Datei''<br />
||<br />
Die Datei, auf die geschrieben werden soll. Dies kann wieder eine Datei oder ein Gerät sein. Wird ''of'' weggelassen schreibt '''dd''' auf die Standardausgabe.<br />
|-<br />
!''ibs=Bytes'' <br />
||<br />
Eingabe-Blockgröße (''input block size''), gibt an, wie viele Bytes auf ein Mal gelesen werden sollen. <br />
|-<br />
!''obs=Bytes'' <br />
||<br />
Ausgabe-Blockgröße (''output block size''), gibt an, wie viele Bytes auf ein Mal geschrieben werden sollen.<br />
|-<br />
!''bs=bytes''<br />
||<br />
Kurzschreibweise für ''ibs=bytes obs=bytes''. Der Standardwert bei Nichtangabe ist 512 Bytes. <br />
|-<br />
!''count=Blocks'' <br />
||<br />
Angabe, um nur eine begrenzte Menge Blöcke zu kopieren.<br />
|-<br />
!''skip=Blocks'' <br />
||<br />
Angabe, um eine Anzahl Blocks beim lesen am Anfang zu überspringen.<br />
|-<br />
!''seek=blocks'' <br />
||<br />
Überspringt diese Anzahl Blöcke beim schreiben auf die Ausgabe.<br />
|-<br />
!''conv=Schlüsselwörter '' <br />
||<br />
Wandelt den Datenstrom entsprechend einer Kommagetrennten Liste von Schlüsselwörtern.<br />
|-<br />
!''cbs=Bytes'' <br />
||<br />
Umwandlungs-Blockgröße (convert block size): Größe der Blöcke zum Umwandeln auf ein Mal.<br />
|}<br />
<br />
<br />
<br />
=== die Ein- und Ausgabefile ===<br />
<br />
Beide Filenamen werden in den Optionen angegeben nach folgendem Prinzip<br />
if=/PATH/EINGABEDATEI #die Datei oder Gerät aus dem gelesen wird<br />
of=/PATH/AUSGABEDATEI #die Datei oder Gerät auf das geschrieben wird<br />
sollte einer oder beide nicht explizit so angegeben werden, dann wird von '''dd''' automatisch mit dem entsprechenden Standard-Ein/Ausgabe-Kanal gearbeitet. Man kann immer jeweils nur einen Dateinamen angeben, es geht also weder eine Space- noch eine Kommaseparierte Liste und auch die Shell übernimmt hier keine Path- oder Filenamensexpansionen. Nur relative und absolute Dateiadressierung sowie die '''tilde expansion''' sind zulässig, ansonsten sind immer komplette absolute oder relative Path und kompletter Dateinamen anzugeben. Auf den Inhalt von Variablen für die Dateinamen kann zugegriffen werden. Soweit im Dateinamen Sonderzeichen enthalten sind, muß das aber im dd-Kommando unbedingt berücksichtigt werden.<br><br />
Beispiel:<br />
NULL=/dev/null <br />
INFILE="/home/user/datei orginal"<br />
dd if="$INFILE" of=$NULL <br />
<br />
{{Box Achtung||<br />
Beim Zugriff auf Geräteknoten, also zB Festplatten, Partitionen, Bandgeräte usw. immer einmal mehr prüfen ob nicht doch '''if''' und '''of''' verwechselt wurden. Es droht hier bei Verwechslungen unter Userkennung root Datenverlust. <br />
}}<br />
<br />
<br />
<br />
=== die Blockgröße ===<br />
<br />
Die Blockgröße gibt an, wieviele Byte bei einem read- oder write-Kommando gleichzeitig verarbeitet werden. Im Normalfall ist man unter Linux ja gewohnt, dass man sich darum überhaupt nicht kümmern muss, das macht Linux im Hintergrund für uns immer richtig. Da wird zB von der Tastatur jedes einzelne Zeichen gelesen, Eingaben werden zeilenweise nach Bestätigung der ENTER-Taste verarbeitet, auf die Festplatte wird mittels des Caches mit 4KB Blockgröße lesend und schreibend zugegriffen, über Internet werden Pakete mit maximaler Größe von 1500 Byte gesendet usw. Alles Dinge von denen wir gar nichts mitbekommen, und von denen wir auch die meisten überhaupt nicht beeinflussen könnten, selbst wenn wir das wollten.<br />
<br />
Anders jedoch beim Befehl dd. Hier arbeitet der Befehl, sollten wir nichts anderes angeben, immer mit 512 Byte lesend und schreibend und hier können wir das sowohl beim lesenden- wie auch den schreibenden-Zugriff und sogar getrennt beeinflussen.<br> <br />
<br />
'''Zu was soll das gut sein, werden sich die meisten fragen'''.<br><br />
Eine Regentonne voll mit Wasser kann man sowohl mit einem Eimer, mit einer Suppenkelle aber auch mit einem Kaffeelöffelchen "leerschaufeln", was ist wohl die schnellste und rückenschonendste Methode? Ähnlich verhalten sich viele Geräte wenn wir direkt zB über '''dd''' auf sie zugreifen.<br />
<br />
Im folgende Beispiel wird eine kleine Partition einer SCSI-Platte mit "NULLEN" überschrieben, wobei mit der Blockgröße von '''dd''' gespielt wird. <br><br />
time dd if=/dev/zero of=/dev/sdb1 bs=512<br />
(wobei bei bs= die Werte 16 64 512 2K 8K 32K und 128K zum Einsatz kamen)<br />
<br />
{| border="1"<br />
! width="20%" | Blockgröße <br />
! width="20%" | real time <br />
! width="20%" | user time <br />
! width="20%" | sys time<br />
|-<br />
!16 Byte <br />
|| 2m26.593s|| 0m7.898s || 1m2.839s<br />
|-<br />
!64 Byte <br />
|| 1m39.600s ||0m2.734s || 0m23.812s<br />
|-<br />
!512 Byte <br />
|| 1m18.710s||0m0.465s || 0m6.942s<br />
|-<br />
! 2 KByte <br />
||1m16.131s ||0m0.100s || 0m3.552s<br />
|-<br />
! 8 KByte <br />
|| 0m29.137s || 0m0.016s || 0m1.299s<br />
|-<br />
! 32 KByte <br />
|| 0m29.159s || 0m0.012s || 0m1.507s<br />
|-<br />
! 128 KByte <br />
|| 0m29.115s || 0m0.003s || 0m1.474s<br />
|}<br />
Wir erkennen, die default Einstellung von '''dd''' (512 Byte) ist zwar auf dieser Platte nicht die Allerschlechteste, aber es geht durchaus noch 3 Mal schneller. Da moderne Festplatten in der Regel heute einen Cache haben, der zu mindestens beim Lesen auch genutzt wird, ergeben sich beim Lesen von Partitionen oder ganzen Festplatten oftmals ganz andere (weniger unterschiedliche) Werte. <br />
<br />
Wesentlich gravierender sind die Unterschiede jedoch bei Bandlaufwerken, es gibt verschiedene Möglichkeiten wie das Laufwerk die ihm übertragene Blockgröße interpretieren soll, man muss prinzipiell jeden Block mit der selben Blocksize lesen, mit der der Block auch geschrieben wurde, eine ungünstige Blockgröße kostet nicht nur Zeit sondern bedeutet auch erhöhten Verschleiß an Bandmaterial und Laufwerk und nicht zuletzt auch noch ein höheres Fehlerrisiko. Wer sich näher damit befassen will oder muss kann unter [[Bandlaufwerke_und_LINUX|Bandlaufwerke und Linux]] und speziell über die [[Bandlaufwerke_und_LINUX#Die_richtige_Blockgröße|richtige Blockgröße bei Bandlaufwerken]] im Wiki näher infomieren.<br />
<br />
<br />
Es gibt im Internet die abenteuerlichsten Berechnungsmodelle für die "richtige Blockgröße" von '''dd''' für den Zugriff auf Festplatten. Man geht dabei von der Ausgabe des [http://www.die.net/doc/linux/man/man8/fdisk.8.html fdisk-Befehles] aus, und errechnet aus den dort ausgegebenen Werten der Köpfen, Sektoren, Zylinder und Units irgendwie eine "optimale Blockgröße" und kommt dann auf solche Werte wie zB. 16065 Byte.[http://linuxwiki.de/dd ] <br> <br />
Abgesehen, dass solche Werte dann manchmal nicht einmal durch 512 (die kleinste Speichereinheit auf einer Festplatte) teilbar sind, schon eine einfache Überlegung müsste den völligen Unsinn eines solchen Unterfangens aufzeigen. <br><br />
<pre><br />
LINUX:~ # fdisk -l /dev/sdb<br />
<br />
Disk /dev/sdb: 18.2 GB, 18275768320 bytes<br />
255 heads, 63 sectors/track, 2221 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br />
.......<br />
</pre><br />
Diese Festplatte, die laut Hersteller 5 Scheiben mit je 2 Köpfen hat, sollte jetzt plötzlich 255 Köpfe haben. Damit müsste sie nach heutiger Bauweise in etwa 30 bis 35 cm dick sein und hätte ein stattliches Gewicht von einigen kg. '''Also absolute Vorsicht mit solchen Berechnungen.''' Die heutigen Platten verwalten intern ihre eigene [http://de.wikipedia.org/wiki/Festplattengeometrie Geometrie] und werden von außen nur über [http://de.wikipedia.org/wiki/Logical_Block_Addressing LBA]-Verfahren angesprochen. Die Geometrie die uns zB ''fdisk'' nach außen zeigt, ist eine reine logische die mit der tatsächlichen nur eines gemein hat, die ungefähre (etwas kleiner) Gesamtgröße, und kann mit Befehlen wie zB. ''fdisk'' bei Bedarf auch angepasst oder geändert werden. <br />
<br />
Die optimalsten Werte sind von eine Vielzahl von vor allem baulichen Faktoren abhängig und werden heute in vielen Geräten obendrein noch über Cache in den Geräten gepuffert, womit man mit größeren Werten nie falsch liegen kann.<br><br />
Prinzipiell, (wenn keine anderen Faktoren dagegen sprechen- siehe Positionierung im Datenstrom) nur Werte die durch 512 teilbar sind, für Disketten, kleine Speicherkarten und kleine Sticks und ganz alte oder schon teilweise defekte Platten 512 Byte, für die restlichen Platten 4 oder 8 KByte, bei CD-ROM und DVD 1 oder 2 KByte und für [http://de.wikipedia.org/wiki/Magneto_Optical_Disk MO-Disk] [http://de.wikipedia.org/wiki/Ultra_Density_Optical UDO] und andere [http://de.wikipedia.org/wiki/WORM WORM], nur die vom Hersteller und der jeweiligen Technologie vorgeschriebenen Blockgröße, und man sollte auf der richtigen Spur sein.<br />
<br />
<br />
<br />
=== Positionierung innerhalb des Datenstrom === <br />
<br />
Als Datenstrom bezeichnen wir hier mal alles, womit dd arbeiten kann, also zB. Pipe, Datei, Gerät,... <br><br />
DD kennt als Bezugspunkt immer nur den Anfang von Eingangsstrom und Anfang vom Ausgangsstrom. Da man aber nicht immer den kompletten Eingangsstrom bis zum Ende auf Ausgangsstrom von Anfang an kopieren will, muss man innerhalb dieser beide Datenströme auch positionieren können. Das geht mit den Optionen '''skip= seek=''' und '''count=''' und diese sind jeweils von den gesetzten Blockgrössen abhängig.<br />
<br />
Wenn wir dd ohne solche Positionierungs-Optionen starten, dann kopiert dd den Eingangsdatenstrom von Anfang bis ein EOF ('''E'''nd '''O'''f '''F'''ile) kommt, komplett auf den Ausgangsdatenstrom. Bei Lese- oder Schreibfehlern wird an dieser Stelle dd abgebrochen. Ein EOF kann das Ende einer normalen File sein, aber auch zB der Abbruch eines am Eingang über Pipe verbundenen Befehles. Auch der Versuch zB. über eine Gerätegrenze (zB Partition zu Ende) zu lesen oder schreiben, führt zu einen EOF Fehler.<br />
<br />
Die Gesamtanzahl der zu kopierenden Blöcke kann mit der Option '''count=''' begrenzt werden. <br><br />
count=100 <br />
kopiert genau 100 Blöcke ( Eingangsblockgröße ) <br />
<br />
Es können am Eingangsstrom anfänglich Blöcke (Eingangsblockgröße) übersprungen werden, die dann nicht mit kopiert werden, und die auch nicht von einem eventuell gesetzen count-Wert abgezogen werden. Die Option dazu ist '''skip='''<br><br />
skip=100 count=50 <br />
kopiert genau 50 Blöcke (Eingangsblockgröße) wobei am Anfang 100 (Eingangsblockgröße) übersprungen werden, bevor mit dem Kopieren begonnen wird.<br />
<br />
Es können am Ausgangsstrom anfänglich Blöcke (Ausgangsblockgröße) übersprungen werden, bevor der erste Block dorthin kopiert wird. Diese Option ist '''seek='''.<br><br />
seek=100 count=50 <br />
kopiert die ersten 50 Blöcke (Eingangsblockgröße) vom Eingangstrom ab dem 101 Block (Ausgangsblockgröße) in den Ausgangsstrom. (''Die ersten 100 Blocke der Größe obs= bleiben also im Ausgangsstrom unberührt, erst danach kommt der erste kopierte Block'') Diese Option macht nicht mit allen Ausgangsdatenströmen Sinn und führt zB. in Verbindung mit der Standardausgabe zum "hängenbleiben" des Befehls, da ja erst mal auf Daten gewartet werden muss, die gar nicht kommen können. Beim Anwenden auf normale Dateien führt ein zu großer seek-Wert (größer als Ausgangsdatei) zum Weiterschreiben der Datei am Ende.<br />
<br />
<br />
Soweit zur Theorie und zu den wichtigsten Optionen.<br />
<br />
== die Ausgaben von dd ==<br />
<br />
Wir untersuchen dazu einmal exemplarisch eine Ausgabe eines dd-Befehls, hier wurde von der Partition /dev/sda2 mit einer Blockgröße von 8KByte gelesen und auf ein Tape /dev/nst0 mit 256 KByte Blockgröße geschrieben.<br />
<pre><br />
LINUX:~ # dd if=/dev/sda2 of=/dev/nst0 ibs=8K obs=256K<br />
262256+0 records in<br />
8195+1 records out<br />
2148401152 bytes (2.1 GB) copied, 74.8721 seconds, 28.7 MB/s<br />
</pre><br />
; 262256+0 records in :<br />
es wurden '''262256''' Blöcke a. 8K gelesen, die '''+0''' bedeuten, es gab am Ende keinen Rest, also der letzte Block hatte wirklich auch 8K Größe.<br />
<br />
<br />
; 8195+1 records out :<br />
es wurden '''8195''' Blöcke a. 256K geschrieben, die '''+1''' bedeutet, es wurde zusätzlich noch ein Restbock beschrieben, der nicht die volle Größe von 256K hatte. Wenn mit der Option "bs=" gearbeitet wird, oder die Blockgrößen sonst wie für Ein/Ausgabe gleich sind, dann sollten bei einem ordnungsgemäßen Ablauf des Befehls beide Werte immer gleich ausfallen. (''Diese Ausgaben werden dann besonders interessant, wenn wie weiter unten beschreiben mit der Option '''conv=noerror,sync''' auf defekte Platten oder Medien zugegriffen wird, und defekte Blöcke gefunden werden.'')<br />
<br />
<br />
;2148401152 bytes (2.1 GB) copied, 74.8721 seconds, 28.7 MB/s :<br />
die Schlußzeile erhalten wir nur in neueren Versionen von '''dd'''. Sie beinhaltet hier die Gesamtanzahl der übertragenen Byte die Zeit und die durchschnittliche Geschwindigkeit.<br />
<br />
<br />
Solange der Befehl '''dd''' läuft, erhalten wir ansonsten von ihm keinerlei Ausgaben. Wir können uns aber den Status der aktuell übertragenen Daten in der oben beschriebenen Form anzeigen lassen, indem wir dem dd-Prozess mit [http://www.phpman.info/index.php?parameter=kill&mode=man kill] ein Signal 10 '''(SIGUSR1)''' senden. Alle diese Ausgaben kommen über den Standardfehlerausgabekanal des Prozesses '''dd'''.<br />
<br />
Eine einfache Fortschrittsanzeige kann dementsprechend mittels einer Kombination von obigem Verfahren und dem Programm [[watch]] sehr schnell umgesetzt werden:<br />
<pre><br />
watch --interval 60 "killall -USR1 dd"<br />
</pre><br />
In diesem Beispiel wird der Prozess 'dd' veranlasst, alle 60 Sekunden den Status auszugeben.<br />
<br />
== Anwendungsgebiete und Beispiele ==<br />
<br />
=== mit dd Dateien erzeugen ===<br />
<br />
Hin und wieder benötigt man spezielle Dateien in bestimmter Größe und mit typischen oder speziellen Inhalt. Das können einfach Dateien sein, die man zum testen benötigt oder auch Dateien um darin zB Filesysteme anzulegen oder oder oder.<br><br />
Das geht mit '''dd''' sehr einfach. Wir benötigen nur einen Quelldatenstrom dazu. Auf die Blockgrößen brauchen wir hier meistens gar nicht zu achten (eventuell/selten könnte aber der gewünschte Quelldatenstrom eine Blockgröße fordern), da das Filesystem in das wir unsere Datei schreiben sowieso gepuffert ist, also können wir mit '''bs=''' und '''count=''' unsere gewünschte eindeutige Dateigröße sehr schön festlegen. <br />
Blockgröße x Count = Dateigröße<br />
<br />
<br />
<br />
==== Erzeugen einer mit Nullen gefüllten Datei ====<br />
<br />
Als Quelldatenstrom nutzen wir dazu '''/dev/zero''' ( nicht /dev/null , da beim lesen von /dev/null nur ein EOF zurückgeliefert wird und dadurch eine Datei mit Länge Null erzeugt würde.)<br />
<pre><br />
robi@LINUX:~/test> dd if=/dev/zero of=file.leer bs=1M count=1024<br />
1024+0 Datensätze ein<br />
1024+0 Datensätze aus<br />
</pre><br />
erzeugt eine 1GB große (ergibt sich aus 1MByte x 1024) Datei voller Nullen <br />
<br />
<br />
<br />
==== Erzeugen von Sparse Dateien ====<br />
<pre><br />
robi@LINUX:~/test> dd if=/dev/zero of=file.sparse count=0 obs=1 seek=1G<br />
0+0 Datensätze ein<br />
0+0 Datensätze aus<br />
robi@LINUX:~/test> ls -l file.*<br />
-rw-r--r-- 1 robi users 1073741824 2007-06-29 23:37 file.leer<br />
-rw-r--r-- 1 robi users 1073741824 2007-06-30 01:24 file.sparse<br />
-rw-r--r-- 1 robi users 1073741824 2007-06-30 00:12 file.zufall<br />
robi@LINUX:~/test> stat file.sparse<br />
File: ,,file.sparse"<br />
Size: 1073741824 Blocks: 0 IO Block: 4096 reguläre Datei<br />
Device: 802h/2050d Inode: 1038268 Links: 1<br />
Access: (0644/-rw-r--r--) Uid: ( 1001/ robi) Gid: ( 100/ users)<br />
Access: 2007-06-30 01:24:39.168204352 +0200<br />
Modify: 2007-06-30 01:24:39.168204352 +0200<br />
Change: 2007-06-30 01:24:39.168204352 +0200<br />
</pre><br />
Schreibt 0 Mal 1 Byte (also nichts) ab der Position 1073741824 und erzeugt somit ein 1GB große [http://de.wikipedia.org/wiki/Sparse-Datei Sparse Datei] ohne jeglichen Inhalt.<br />
Man erkennt es eindeutig an der scheinbaren Differenz zwischen '''Size''' und der Anzahl der benutzen '''Blocks''' mit [http://www.die.net/doc/linux/man/man1/stat.1.html stat]<br />
<br />
{{Box Achtung||<br />
An solchen sparse Dateien ist schon mancher Admin zB bei Backups verzweifelt, man kann ein solches File oft schon durch umkopieren mit cp in ein normales Files umwandeln, ansonsten werden viele Backuptools eine solche File auf die volle Länge extrahieren, wodurch das Datenvolumen des Backup entsprechend groß wird, und beim zurückspielen des Backups eventuell gar nicht mehr ins Filesystem passt.<br />
}}<br />
<br />
<br />
<br />
==== Erzeugen einer Datei gefüllt mit Zufallszahlen ====<br />
<br />
Als Quelldatenstrom nutzen wir dazu unter Linux '''/dev/urandom''' (nicht /dev/random , das dauert sonst viel viel zu lange und bringt auch nur das gleiche Ergebnis) <br />
<pre><br />
robi@LINUX:~/test> dd if=/dev/urandom of=file.zufall bs=1M count=1024<br />
1024+0 Datensätze ein<br />
1024+0 Datensätze aus<br />
robi@LINUX:~/test> hexdump -C file.zufall | more<br />
00000000 60 b2 03 a4 f5 13 46 d0 25 a4 f2 09 1c 31 9f 3f |`².€õ.FÐ%€ò..1.?|<br />
00000010 17 b0 8e 32 af a0 87 67 cf 87 2c 4f 6d 92 de 4d |.°.2¯ .gÏ.,Om.ÞM|<br />
00000020 38 3c a2 29 58 09 fd b7 ........<br />
.......<br />
</pre><br />
Als Größe wurde hier wieder wie schon oben 1GByte festgelegt. Mit [http://bashcurescancer.com/man/cmd/hexdump hexdump] haben wir gleich mal hineingeschaut, ob auch alles schön zufällig ist. ;-)<br />
<br />
Bei wirklich großen Datenmengen kann dieser Prozess sehr lange dauern (mehrere Tage bei Terabyte-Festplatten). In solchen Fällen kann es hilfreich sein, den Prozess der Generierung von Zufallszahlen unter Verwendung von 'dd' und 'ssh' auf mehrere Computer zu verteilen (s. [[Verteilte Generierung von Zufallszahlen]]).<br />
<br />
==== Erzeugen einer Datei mit typischen Eigenschaften und genau definierter Länge ====<br />
<br />
Die unterschiedlichen Dateien haben unterschiedliche Eigenschaften zB beim Komprimieren. Zufallsdateien lassen sich überhaupt nicht, oder sogar nur negativ komprimieren, Dateien mit lauter Nullen dagegen extrem, Logdateien meist sehr gut, Fließtextdateien auch noch gut, dagegen Binärdateien nicht besonders gut. Wenn wir jetzt so eine Datei mit solchen typischen Komprimierungseigenschaften zu Testzwecken benötigen, dann können wir und mit '''dd''' eine solche mit genaue definierter Länge aus einer oder mehreren solcher typischen Dateien erzeugen.<br />
<br />
Als Beispiel wollen wir hier eine genau 5MByte große Datei aus einigen Bilddateien erzeugen.<br />
<pre><br />
robi@LINUX:~/test> ls -l bild*.jpg<br />
-rw-r--r-- 1 robi users 277960 2007-06-29 22:34 bild0.jpg<br />
-rw-r--r-- 1 robi users 312872 2007-06-29 22:48 bild10.jpg<br />
-rw-r--r-- 1 robi users 120061 2007-06-29 22:08 bild1.jpg<br />
-rw-r--r-- 1 robi users 164171 2007-06-29 22:10 bild2.jpg<br />
-rw-r--r-- 1 robi users 179737 2007-06-29 22:13 bild3.jpg<br />
-rw-r--r-- 1 robi users 173341 2007-06-29 22:13 bild4.jpg<br />
-rw-r--r-- 1 robi users 165532 2007-06-29 22:14 bild5.jpg<br />
-rw-r--r-- 1 robi users 161892 2007-06-29 22:16 bild6.jpg<br />
-rw-r--r-- 1 robi users 126340 2007-06-29 22:17 bild7.jpg<br />
-rw-r--r-- 1 robi users 125396 2007-06-29 22:19 bild8.jpg<br />
-rw-r--r-- 1 robi users 289134 2007-06-29 22:21 bild9.jpg<br />
robi@LINUX:~/test> cat bild*.jpg bild*.jpg bild*.jpg bild*.jpg | dd of=file.bild bs=1024K count=5 <br />
5+0 Datensätze ein<br />
5+0 Datensätze aus<br />
robi@LINUX:~/test> ls -l file.bild<br />
-rw-r--r-- 1 robi users 5242880 2007-06-30 00:40 file.bild<br />
</pre> <br />
Unsere Bilddateien haben zusammen nicht ganz 2 MB Größe. Wir Nutzen desshalb [http://linuxreviews.org/man/cat/index.html.de cat] , um die Dateien aneinander zu hängen, und da die Gesamtgröße aller Dateien nicht ausreichen würde, haben wir sie einfach durch '''"bild*.jpg bild*.jpg bild*.jpg bild*.jpg"''' mehrere Male angegeben, (4 Mal sollte dann hier im Beispiel dicke reichen). ''(wenn man hier bei anderer Gelegenheit einmal zu viele Dateien dazu verwenden müsste, könnte eventuell die Bash einen Fehler bringen, '''zu viele Argumente''', dann kann man auch schrittweise vorgehen)'' <br><br />
Den so erzeugten Datenstrom von '''cat''' leiten wir per Pipe an '''dd''' weiter und mit '''"bs=1024K count=5"''' erzeugen wir dann ein genau 5MB großes File daraus, die typische Komprimierungseigenschaften einer solchen JPEG Bilddatei hat, obwohl sie selbst kein (besser ein fehlerbehaftes) Bild ist.<br />
<br />
<br />
<br />
=== dd auf Partitionen und ganze Festplatten anwenden ===<br />
<br />
==== Allgemeine Bemerkungen und Warnungen ====<br />
<br />
Was passiert wenn wir mit '''dd''' auf eine Partition oder einer Festplatte zugreifen? <br><br />
* Die Byte werden alle sequentiell von der Festplatte gelesen. Dabei werden nicht nur die Inhalte der Dateien, sondern auch die Verwaltungsdaten und die Struktur der Partitionen und der Filesysteme mit gelesen, Ebenfalls mitgelesen werden natürlich auch derzeit unbenutzte- und leere Böcke, und Blöcke die derzeit zu gelöschten Dateien gehören. Die gesamte Partition oder Festplatte wird also Byte für Byte gelesen und so gegebenfalls auch Byte für Byte kopiert.<br />
<br />
* '''dd''' greift dabei direkt auf die Festplatte zu, also unter Umgehung des Cache der Filesysteme oder des Swap. Das Filesystem bekommt das auch gar nicht mit. Wir sollten aus diesem Grunde auch für '''dd''' eine geeignete Blockgröße für die Zugriffe angeben (oder mit den default 512 Byte leben). Es ist also keinesfalls immer sichergestellt, dass zu jedem Zeitpunkt wirklich das mit '''dd''' gelesen wird, was auch wirklich im Filesystem in diesem Moment aktuell ist. <br />
<br />
* Werden Filesysteme mit '''dd''' kopiert, die aktuell noch '''readonly gemountet''' sind, dann ist das Ergebnis ein Image von diesem Filesystem das nicht sauber ausgehängt ist. Bevor wir es mounten können, muss erst ein [http://www.die.net/doc/linux/man/man8/fsck.8.html fsck] gemacht werden.<br />
<br />
* Werden Filesysteme mit '''dd''' kopiert, die aktuell noch '''read-write gemountet''' sind, dann '''muss vor dem mounten des Images oder der Kopie bei Jounalfilesystemen ein kompletter Filesystemcheck gemacht werden'''. Ansonsten wird bei fsck nur das Journal abgearbeitet ( die Daten im Journal sind aber in diesem Image weder aktuell noch wirklich gültig und zutreffend) und entstandene Inkonsitenzen und Fehler werden nicht behoben. Solche Fehler und Inkonsitenzen entstehen, da '''dd''' ein Filesystem nicht innerhalb eines Bruchteiles von Sekunden lesen kann, sondern dazu einige Minuten oder gar Stunden benötigt. In dieser Zeit arbeitet aber der Cache vom Filesystem ganz normal weiter und ändert auch den Inhalt auf der Platte. Wird jetzt zB. während '''dd''' eine Partition ließt, ein Cronjob gestartet der die Logdateien großflächig umorganisiert. Dann kann es natürlich sein, das bestimmte Blöcke von '''dd''' schon verarbeitet sind, die später jedoch ungültig werden oder durch andere Blöcke ersetzt werden die '''dd''' erst dann ließt wenn sie schon geändert sind. Es ist also durchaus möglich, das selbst nach einem kompletten Filesystemcheck eines so entstandenen Images einige Dateien fehlen, oder einfach einen falschen Inhalt haben, oder im Extremfall, das das Filesystem so defekt ist, das es nur unter enormen Datenverlust wiederhergestellt werden kann. Besonders gefährlich wird das, wenn man bei einem Filesystemcheck nur das Journal abarbeitet, und dann ganz normal unwissentlich mit einem strukturdefektem Filesystem weiterarbeitet. Man denkt alles in Ordnung, und plötzlich geht irgendwas nicht richtig oder es geht gar nichts mehr. Jetzt kann ein kompletter Filesystemcheck richtig böse Sachen aufzeigen.<br />
<br />
* Zu den Verwaltungsdaten auf den Festplatte und Partitionen gehören natürlich auch die Partitionstabellen und gegebenenfalls Bootloader und auch Kennungs- Zustands- und Verwaltungsdaten von Softwareraid oder Virtuellen Laufwerken, vom Rechner als eindeutig gedeutete Filesystemkennungen, eventuell auch dem Filesystem bekannt gemachte defekte Blöcke. Werden diese Daten auf andere Festplatten kopiert und es sich dabei nicht um eine identischen Festplatte handeln sollte, die die ursprüngliche Festplatte ersetzen soll, sollte man sich hier sehr genau überlegen was man da macht, oder hin und wieder auch einmal mit einer Überraschung beim nächsten Bootvorgang rechnen.<br />
<br />
<br />
<br />
==== Festplatte testen durch Lesen ====<br />
<br />
* Hin und wieder muss man mal eine Festplatte testen, ob denn diese überhaupt noch richtig angesprochen werden kann.<br />
dd if=/dev/hdb of=/dev/null bs=4K count=1000<br />
:dieser Test dauert nur eine Sekunde, reicht aber aus, um zu erkennen ob die Platte überhaupt noch was tut.<br />
<br />
* Hat man viele SCSI-Platten im System, dann kann es hin und wieder vorkommen, man muss unbedingt wissen. welche physikalische Platte ist zB. /dev/sdf <br><br />
:solange die Platte bisher nicht mit Fehlern oder Totalausfall geglänzt hat:<br />
dd if=/dev/sdf of=/dev/null bs=8K count=100000<br />
:dieser Test könnte so 30 bis 60 Sekunden laufen, in dieser Zeit sollte die Aktivitäts-LED dieser Platte permanent an sein. Sobald der Befehl beendet ist, oder mit "STRG + C" abgebrochen wird, ist sie aus, oder flackert sporadisch wieder wie eventuell die anderen auch. Wenn diese Platte aber Probleme bereitet, dann ist es meist besser diese Platte nicht direkt anzusprechen, sondern die benachbarten Platten , hier im Beispiel also /dev/sde und /dev/sdg, die Platte zwischen diesen Beiden sollte dann die gesucht /dev/sdf sein.<br />
<br />
* Sollte es Busprobleme geben, zB wegen defekten oder ungeeigneten Kabel oder falschen DMA-Einstellungen oder Unverträglichkeit von 2 Geräten am Bus, kann man Lesetests über mehrere Minuten machen, gegebenenfalls über mehrere Geräte am selben Controller. Dabei die /var/log/messages auf Einträge beobachten. (Bei IDE Geräten: Fehler- und Befehlsbeschreibung [[Linux mit hdparm beschleunigen|hdparm]]) <br />
<br />
* Steht eine Platte in Verdacht auf sporadische oder gelegentliche Leseprobleme, und ist der erste kurze Ansprechtest erfolgreich gewesen, kann man die gesamte Platte oder die entsprechend fehlerverdächtige Partition komplett auslesen. '''(Achtung kann eventuell die Performance des Systems über einen längeren Zeitraum sehr negativ beeinflussen, je nachdem welche Filesysteme sich auf dieser Platte befinden)'''<br />
dd if=/dev/hda of=/dev/null bs=4k<br />
:kommt es zum Abbruch des Befalls wegen Lesefehler, dann wird es allerhöchste Eisenbahn sich eine Reserve Platte zu besorgen, und das letzte Backup auf Vollständigkeit zu prüfen. Eventuell gleich noch ein Backup dieser Platte versuchen. (''Einige Backup-Programme haben auch Optionen die bei Lesefehlern nicht gleich abbrechen, sondern versuchen erstmal noch weiterzumachen. Fehlerhafte Dateien oder Abschnitte werden übersprungen.'')<br />
<br />
{{Box Achtung ||<br />
Sollte die Elektronik des Controllers oder die Elektronik der Festplatte der Verursacher der zu untersuchenden Fehler gewesen sein, dann kann es in Einzelfällen dazu führen, dass der dd-Befehl hängen bleibt, aber weder eine Fehlermeldung ausgibt, noch sich mit [http://www.die.net/doc/linux/man/man1/kill.1.html kill] beenden läßt. Mit [http://www.die.net/doc/linux/man/man1/top.1.html top] oder [http://www.die.net/doc/linux/man/man1/ps.1.html ps] ist der Prozessstatus '''"D"''' beim dd-Prozess zu erkennen. Hier einfach erst einmal einige Minuten warten, eventuell greift doch noch ein Befehlstimeout oder eines der Geräte am Bus forciert einen Busreset. Wenn dem nicht so ist und es nach 15 Minuten keine Änderung ergeben hat, dann hilft hier dann oft nur noch ein reboot, um den hängenden dd-Befehl loszuwerden. <br />
}}<br />
<br />
<br />
<br />
<br />
==== der MBR und dd ====<br />
<br />
===== mit dd den Master Boot Record auf Festplatten lesen und schreiben =====<br />
<br />
Auf sehr vielen Seiten im Internet wird aufgezeigt wie man mit ''dd'' den [http://de.wikipedia.org/wiki/Master_Boot_Record MBR] ('''M'''aster '''B'''oot '''R'''ecord) einer Festplatte sichern und wieder zurückschreiben kann. Was auf vielen Seiten allerdings meistens fehlt, sind genauere Erklärungen dazu, was sich dort alles befindet, damit man besser abschätzen kann, unter welchen Bedingungen man was damit genau machen kann oder besser lassen sollte, und welche Alternativen es für einzelne Bereiche bzw. Abschnitte gibt. Aus diesem Grunde werden wir das hier einmal etwas ausführlicher behandeln.<br />
<br />
{{ Box Anmerkung ||<br />
Wir sprechen im Weiteren hier von [[BIOS]]-basierten Computern der [http://de.wikipedia.org/wiki/X86-Prozessor x86-Architektur], es gibt durchaus bei anderen Betriebssystemen und Plattformen auch noch ganz andere Architekturen und Strukturen, aber wir bleiben hier mal bei der typischen IBM-kompatiblen PC-Technik, mit der wohl bis auf ganz wenige Ausnahmen hier alle ihr Linux installiert haben werden <br />
}}<br />
<br />
Sichern könnte man den MBR von zB der Festplatte /dev/hda folgend:<br />
dd if=/dev/hda of=/PATH/DATEI bs=512 count=1<br />
Zurückspielen dieser Datei wieder in den MBR dieser Festplatte<br />
dd if=/PATH/DATEI of=/dev/hda bs=512 count=1<br />
Nur den Inhalt einmal [http://de.wikipedia.org/wiki/Hexadezimalsystem hexadezimal] anschauen, kann man zB so hier<br />
dd if=/dev/hda bs=512 count=1 | hexdump -C | more <br />
<br />
Wie wir aus den Befehlen herauslesen können, es handelt sich hier beim MBR um die ersten 512 Byte der Festplatte. Wie der Name es schon vermuten läßt, es hat irgend etwas mit dem booten zu tun. Und in der Tat, beim Start des Rechners, schaut das BIOS welches Medium soll ich booten, und dann läd er von diesem Medium genau diese 512 ersten Byte. Findet er darin etwas für ihn interessantes, dann versucht er damit den Bootvorgang zu starten.<br />
findet er nichts interessantes, dann schaut er ob noch weitere Medien konfiguriert und vorhanden sind, von denen er booten soll, und versucht dort sein Glück. Findet er dabei gar nichts brauchbares, dann kommt die Fehlermeldung, er hat kein Betriebssystem zum booten gefunden. <br />
<br />
<br />
<br />
<br />
===== Was befindet sich nun in diesen ersten 512 Byte einer Festplatte? =====<br />
<br />
Wir werden das hier mal von hinten aufrollen. ''( Das erste Byte bezeichnen wir als Byte 0 demnach umfasst der Bereich den wir untersuchen Byte 0 bis Byte 511 )''<br><br />
# '''Byte 510''' (0x1fe) und '''Byte 511''' (0x1ff) enthalten eine Kennung (auch MBR-Signatur genannt) die dem BIOS mitteilt, das was hier im MBR steht, ist für dich ein gültiger MBR oder ist nicht gültig als MBR. Das BIOS erkennt den MBR als gültig nur dann an, wenn dort '''0x55 0xAA''' steht. Bei nicht bootfähigen Platten darf hier auch etwas anderes stehen, allerdings wurden schon BIOS-Versionen erwischt, die vorsichtshalber eine solche Platte dann gleich mal mit geringer Geschwindigkeit bedient haben, so dass hier prinzipiell immer dieser Wert stehen sollte, sollte es eine gültige Partitionstabelle geben.<br />
# Die 64 Byte, '''Byte 446 bis Byte 509''' (0x1be bis 0x1fd) dort befindet sich prinzipiell auf jeder Festplatte immer die [http://de.wikipedia.org/wiki/Partitionstabelle Partitionstabelle] für die Partitionen 1 bis 4 . Pro Partition 16 Byte das ganze 4 Mal. Nicht definierte Partitionen sind mit NULLEN gefüllt.<br />
# Die '''Byte 444''' (0x1bc) '''und Byte 445''' (0x1bd) enthalten den Wert '''0x0000''' und dienen nur zur Trennung und dem Schutz der einzelnen Bereiche<br />
# Der Bereich von '''Byte 0 bis Byte 443''' (0x000 - 0x1bb) ist reserviert für einen [http://de.wikipedia.org/wiki/Boot-Loader Bootloader] ( wobei in einigen Windowssystemen noch ein Teilbereich davon fest definiert ist '''Byte 440-443''' (0x1b8 -0x1bb). hier befindet sich eine Disk-Signatur, mit deren Hilfe zB die Zuordnung zu den Laufwerksbuchstaben vorgenommen wird.) Es sind also in diesem Bereich maximal 444 Byte für einen Bootloader möglich. Beim Bootloader handelt sich dabei um ein kleines mittels [http://de.wikipedia.org/wiki/Assemblersprache Assemblerprogrammierung] geschrieben ausführbares Programm. Dieser Bereich kann aber durchaus auch leer sein (alles NULL) es können aber auch zB. Bootloader dort installiert sein, die bei Versuch diesen zu starten nur über den BIOS auf den Bildschirm ausgeben, dass das Medium nicht bootfähig ist, oder Bootloader die nur einen anderen Bootloader von einer der Partitionen laden und diesen dann starten oder nur ein Auswahlmenu bringen, um daraus dann auf andere Bootloader zu verzweigen. Aber auch Bootvieren sind dort möglich. Wie die einzelnen Bootloader intern genau arbeiten ist recht unterschiedlich. Jedoch können sie alle nur auf die wenigen Funktionen des BIOS zugreifen und ihre Aufgabe ist es, damit den Betriebssystemkern auf der Platte in den Arbeitsspeicher zu laden und zu starten, oder ein oder mehrere (größere) Programme zu laden, die genau das können. In vielen Bootloadern ist deshalb genau hinterlegt oder festgeschrieben, in welchen physikalischem Bereich (genauer Block) der Festplatte sich die Datei befindet, die als nächstes geladen werden soll, denn die komplizierten Strukturen von Filesystemen würden natürlich in diese 444 Byte nicht hinein zu programmieren sein.<br />
<br />
<br />
<br />
===== Schlussfolgerungen für das kopieren des MBR mittels dd =====<br />
<br />
Daraus ergeben sich jetzt eine ganze Reihe von Beschränkungen für das so schön einfache kopieren des MBR wie es oben angegeben ist. Prinzipiell gilt, es wird mit '''dd''' direkt in einen sehr sensiblen Bereich der Festplatte hineinschreiben, und dabei kann keinerlei logische Überprüfung vorgenommen werden. Solche Vorgehensweisen und Methoden sollten deshalb möglichst immer erst das letzte Mittel der Wahl darstellen. <br />
* Das kopieren eines solchen MBR (512 Byte) auf die selbe Platte bringt nur Erfolg, wenn sich in der Zwischenzeit weder die Partitionstabelle noch der physikalische Ort (Block auf Festplatte) der Dateien geändert hat, die dieser Bootloader über den BIOS laden soll.<br />
* Das kopieren eines solchen MBR (512 Byte) auf eine andere Platte macht nur dann Sinn, wenn es sich auch wirklich um eine identische Platte handelt. (Ausnahme wenn wir eine Platte durch eine größere Platte ersetzen müssten, und wir die Differenz sowieso nie benutzen möchten)<br />
* Baugleiche Platten könnten ( ist im PC-Bereich eher die Ausnahmen) logisch anders organisiert sein, da die [http://de.wikipedia.org/wiki/Festplattengeometrie Festplattengeometrie] wie wir sie sehen nicht mit dem physikalischen Aufbau der Platte gleich ist und die Platte das selbst verwaltet. Solche Differenzen könnten in Ausnahmefällen schon beim Erwerb gleicher Platten aus unterschiedlichen Bezugsquellen vorliegen, oder irgendwann einmal über Software manuell geändert worden sein. Es ist auch nicht gänzlich auszuschließen, daß der eine oder andere RAIDController durchaus auch einmal so eine logische Plattengeometrie geändert haben könnte. Ein kopieren einer Partitionstabelle mit andere logischer Geometrie könnte uU. durchaus dann zu defekten oder ungültigen Partitionstabellen führen.<br />
* Wenn wir 512 Byte anfassen, sollten wir bedenken, das damit immer die Partitionstabelle der Partitionen 1-4 enthalten ist. Die logischen Partitionen jedoch nicht, und somit beim neu Beschreiben des MBR sogar verloren gehen können.<br />
* Die Partitionstabelle wird in der Regel nur beim Start des Rechners oder bei speziellen Kommandos von Linux neu ausgelesen. Wird mit '''dd''' die Partitionstabelle geändert, dann arbeitet der Kernel nach wie vor nach der alten Partitionstabelle weiter. Wird also eine komplette Platte überschrieben, und anschließend eine Partition versucht zu mounten, dann wird der Kernel das Filesystem an einer eventuell falschen Stelle suchen. <br />
* Im Windowsumfeld könnten unter Umständen geklonte MBR (und somit enthaltene gleiche Disk-Signatur auf unterschiedlichen Platten) im gleichen System zu instabilem Betrieb oder Bootproblemen führen.<br />
<br />
<br />
<br />
===== Anwendungsbeispiele und Alternativen =====<br />
<br />
Den Bootloader sollte man nach dem kopieren oder verschieben der Rootpartition am besten wieder mit den dafür vorgesehen Tools neu schreiben. Siehe dazu [http://www.die.net/doc/linux/man/man8/grub-install.8.html grub-install] oder [[Grub-Install via "chroot" und Knoppix]] hier im Wiki, bei LILO gilt das analog, immer am Besten mit [http://www.die.net/doc/linux/man/man8/lilo.8.html lilo] wieder installieren, hilfreich sicher auch [[Lilo wieder herstellen]] hier im Wiki<br><br />
Die Partitionstabelle sollte man wenn möglich immer komplett (also auch die eventuellen logischen Partitionen) sichern und gegebenenfalls zurückschreiben oder clonen. Obwohl es nicht unmöglich ist, auch die logischen Partitionen mittels '''dd''' zu kopieren und wieder zurückzuschreiben, ist es so kompliziert, dass darauf verzichtet wird, es an dieser Stelle vorzustellen. Statt dessen soll hier auf den Artikel [[Partitionstabelle sichern und wiederherstellen]] verwiesen werden. Dort wird erklärt wie man die komplette Partitionstabelle mittels des Befehls [http://www.die.net/doc/linux/man/man8/sfdisk.8.html sfdisk] einfach und sicher speichern und wieder zurückschreiben kann.<br><br />
<br />
<br />
Für die jetzt nur noch ganz wenigen verbleibenden Ausnahmen hier einige Beispiele (auf eigenen Gefahr) wie man mittels '''dd''' im MBR bestimmte Dinge erledigen kann.<br />
{{Box Wichtig||<br />
nach jeder geschriebenen Manipulation an der Partitionstabelle mittels '''dd''' wird der Kernel so lange mit der alten Partitionstabelle weiterarbeiten, bis der Rechner wieder neu gebootet wurde, oder wir dem Kernel explizit dazu gezwungen haben die jetzt neue Partitionstabelle von der Platte neu einzulesen. Dazu darf keine Partition dieser Platte mehr gemountet sein und auch kein Swap auf dieser Platte aktiv, dann '''sfdisk -R /dev/PLATTE''' }} <br />
<br />
'''Bootloader als Datei sichern und zurückschreiben'''<br />
dd if=/dev/hda of=/PATH/DATEI bs=1 count=444<br />
dd if=/PATH/DATEI of=/dev/hda bs=1 count=444<br />
'''Bootloader mit Nullen überschreiben'''<br />
dd if=/dev/zero of=/dev/hda bs=1 count=444<br />
'''Partitionstabelle (nur Partitionen 1 bis 4) hexadezimal anschauen'''<br />
dd if=/dev/hda bs=1 count=66 skip=446 | hexdump -C<br />
'''Partitionstabelle (nur Partitionen 1 bis 4) als Datei sichern /zurückschreiben'''<br />
dd if=/dev/hda of=/PATH/DATEI bs=1 count=66 skip=446<br />
dd if=/PATH/DATEI of=/dev/hda bs=1 count=66 seek=446<br />
'''Partitionstabelle (nur Partitionen 1 bis 4) auf andere Platte direkt kopieren (hda -> hdb)'''<br />
dd if=/dev/hda of=/dev/hdb bs=1 count=66 skip=446 seek=446 <br />
'''Partitionstabelle löschen''' <br />
dd if=/dev/zero of=/dev/hda bs=1 count=64 seek=446<br />
'''Windows Disk-Signatur mit Nullen überschreiben'''<br />
dd if=/dev/zero of=/dev/hdb bs=1 count=4 seek=440<br />
'''MBR-Signatur wieder mit 0x55 0xAA beschreiben ( MBR wieder gültig machen)'''<br />
echo -en "\x55\xaa" | dd of=/dev/hda bs=1 count=2 seek=510<br />
<br />
<br />
<br />
==== einzelne Partitionen und ganze Platten mit dd ====<br />
<br />
Das kopieren, clonen, oder als Image ablegen und wieder zurückschreiben von einzelnen Partitionen und ganzen Platten mittels '''dd''', so wie es in unzähligen Beiträgen beschrieben ist, ist und bleibt eine riskante Angelegenheit, solange man sich nicht bewusst ist, was man da eigentlich genau macht.<br><br />
Es werden genau genommen jedes Byte der Festplatte oder der Partition genau so gelesen, wie sie derzeit auf der Platte gespeichert sind, und wieder zurückgeschrieben, wie sie zum jeweiligen Zeitpunkt des Lesens auf der Festplatte vorhanden waren. [[# Allgemeine Bemerkungen und Warnungen| (siehe auch die allgemeinen Warnungen)]] Somit benötigt man ein zweites Medium, das auch groß genug ist, diese Daten auch wirklich aufzunehmen, den ein Image einer 200GB Festplatte ist nun einmal 200GB groß, auch wenn nur 10% davon mit Dateien belegt sind. Prinzipiell ist es demnach umso interessanter, je kleiner die Festplatte oder die Partition ist, und um so mehr Daten darauf aktuell abgelegt sind. Solange man ein solches Image dann auch wieder auf die gleiche Festplatte oder in die gleiche Partition zurück schreibt, ist das auch relativ ungefährlich. Wird eine größere Festplatte zum zurückspielen benutzt, dann wird die größere Festplatte auf die Originalgröße der ursprünglichen Festplatte "herunterkonfiguriert", ein benutzen des übrigen unbenutzten Festplattenplatzes ist erst einmal ausgeschlossen und Versuche diesen doch noch nutzbar zu machen, sind sehr riskant für die Daten auf dieser Platte. Eine zu kleine Festplatte würde dann mindestens ein unvollständiges Filesystem ergeben, das sich gar nicht mounten läßt. Das selbe gilt für Partitionen analog. <br />
{{Box Achtung||<br />
Sehr gefährlich ist zB. ein zurückschreiben von erweiterten und logischen Partitionen, wenn sich die Partitionstabelle geändert hat, bzw auf eine andere logische oder erweiterte Partition. Hierbei ist es durchaus möglich, das nach dem nächsten booten ein Teil der Daten auf der Platte gar nicht mehr aufzufinden sind.<br />
}} <br />
<br />
<br />
<br />
===== Beispiele Clonen, Backup und Sicherung =====<br />
<br />
Es gilt, möglichst alle Filesysteme ungemountet auslesen, wo das nicht möglich ist, zu mindestens '''Readonly''' gemountet auslesen und dann auf das Image einen [http://www.phpman.info/index.php?parameter=fsck.ext3&mode=man Filesystemcheck] machen. <br />
<br />
einzelne Partition als Image ablegen / Image temporär mounten / zurückschreiben<br />
# dd if=/dev/hda2 of=/PATH/DATEI.IMAGE bs=8K<br />
# mount -o loop /PATH/DATEI.IMAGE /mnt # eventuell weitere Mountoptionen notwendig<br />
# dd if=/PATH/DATEI.IMAGE of=/dev/hda2 bs=8K<br />
<br />
Filesystemtype und Zustand eines Images ermitteln / korrigieren (Konsolauszug)<br />
<pre><br />
LINUX:/ # file DATEI.IMAGE<br />
DATEI.IMAGE: Linux rev 1.0 ext2 filesystem data (mounted or unclean)<br />
LINUX:/ # fsck /PATH/DATEI.IMAGE # evtl. weitere Optionen notwendig ; kompletten Path des Images<br />
fsck 1.38 (30-Jun-2005)<br />
e2fsck 1.38 (30-Jun-2005)<br />
/PATH/DATEI.IMAGE was not cleanly unmounted, check forced.<br />
Pass 1: Checking inodes, blocks, and sizes<br />
Pass 2: Checking directory structure<br />
Pass 3: Checking directory connectivity<br />
Pass 4: Checking reference counts<br />
Pass 5: Checking group summary information<br />
/PATH/DATEI.IMAGE: 72/16632 files (12.5% non-contiguous), 24776/66432 blocks<br />
LINUX:/ # file DATEI.IMAGE<br />
DATEI.IMAGE: Linux rev 1.0 ext2 filesystem data<br />
</pre> <br />
<br />
einzelne Partition auf eine Festplatte mit identischer Partitionstabelle kopieren<br />
# dd if=/dev/hda2 of=/dev/hdb2 bs=8K<br />
<br />
ganze Festplatte als Image ablegen / zurückschreiben<br />
# dd if=/dev/hda of=/PATH/DATEI.IMAGE bs=8K<br />
# dd if=/PATH/DATEI.IMAGE of=/dev/hda bs=8K<br />
man kann von einem solchem Image auch [[Partition eines Festplattenimage mounten|einzelne Partitionen temporär mounten]], dabei muss für das [http://www.phpman.info/index.php?parameter=mount&mode=man mount] der jeweilige Offset benutzt werden. <br />
<br />
<br />
Festplatte auf einen andere Festplatte clonen<br />
# dd if=/dev/hda of=/dev/hdb bs=8K<br />
<br />
===== Problem Komprimierung von dd-Image =====<br />
<br />
Hin und wieder besteht die Notwendigkeit ein solches Image zu komprimieren, weil eben nur wenige wirkliche Daten auf der Platte/Partition liegen. Dabei wird man auf das Problem stoßen, das kann recht gut funktionieren aber muss nicht zwangsläufig. Das liegt dann meistens an den zur Zeit nicht benutzten oder gelöschten Datenblöcken. Sind diese zum großen Teil nicht oder nicht richtig komprimierbar, dann wird man auch wenig Erfolg bei der Komprimierung der gesamten Platte/Partition haben.<br><br />
Nachfolgend eine Möglichkeit wie man die leeren/unbenutzten Datenblöcke einer Partition sehr gut komprimierbar machen kann, ohne das die richtigen Daten dabei beschädigt werden. Man legt einfach neue "NULL"-Dateien an, bis das Filesystem fast voll ist, danach löscht man sie wieder. Wir machen uns hier zum Vorteil, dass ein normaler User im Normalfall auf LINUX-Filesystemen nur bis zu 95% voll auf ein Filesystem schreiben kann. Ausnahme natürlich wenn [[Disk Quota]] eingerichtet ist.<br />
<br />
Als root in das Filesystem ein neues Verzeichnis anlegen und für Schreibrechte des Users sorgen<br />
# mkdir /PATH/test<br />
# chmod a+w /PATH/test<br />
<br />
Danach als User folgendes Script ausführen<br />
<pre><br />
#!/bin/bash<br />
VERZEICHNIS=/PATH/test<br />
<br />
dd if=/dev/zero of=/tmp/file.null count=1024 bs=1K 2>/dev/null<br />
echo "anlegen von Dateien bitte warten" <br />
for i in {a..z}{a..z}{a..z}<br />
do<br />
for j in {0..9}{0..9}{0..9}{0..9}<br />
do<br />
NAME=${VERZEICHNIS}/leer$i$j<br />
cp /tmp/file.null $NAME 2>/dev/null || break 2<br />
done<br />
done<br />
rm /tmp/file.null<br />
</pre> <br />
Als VERZEICHNIS ist hier genau das eben von root angelegte Verzeichnis anzugeben. Je nach Größe und Benutzungsgrad des Filesystems kann das schon seine Zeit dauern. Es werden 1MByte große Dateien in diesem Verzeichnis angelegt.<br><br />
Ist das Script fertig, muss erst einmal der Cache des Filesystems die Daten der letzten Änderungen auf Platte schreiben, also entweder abwarten oder wenn möglich das Filesystem [http://www.phpman.info/index.php?parameter=umount&mode=man umounten] und anschließend wieder [http://www.phpman.info/index.php?parameter=mount&mode=man mounten]. ( Das ist vor allem wichtig bei sehr kleinen Filesystemen die eventuell sogar komplett im Speicher gecacht sein könnten.)<br />
<br />
Root kann jetzt das komplette Verzeichnis wieder löschen (Achtung "'''rm *'''" im Verzeichnis wird meist wegen zu vieler Argumente nicht funktionieren)<br />
rm -rf /PATH/test<br />
<br />
Jetzt muss erst einmal wieder der Cache das Filesystem neu mit der Platte abgleichen, damit auch auf der Platte die Dateien alle gelöscht sind, also hier auch am Besten umount / mount (der [http://www.phpman.info/index.php?parameter=sync&mode=man sync] Befehl hat hier erstaunlicherweise bei meinen Tests nicht immer das erhoffte Resultat gebracht)<br />
<br />
Jetzt ist diese Partition bereit zum Erstellen eines effektiv komprimierten Images.<br />
dd if=/dev/hda2 bs=4K | gzip > /PATH/DATEI.IMAGE.gz<br />
Zurückschreiben könnte man dieses komprimierte Images zB.:<br />
zcat /PATH/DATEI.IMAGE.gz | dd of=/dev/hda2 bs=4K <br />
<br />
Mit ganzen Platten geht das analog, nur sollte man für optimale Ergebnisse eben alle Filesysteme vorher "aufräumen".<br />
<br />
<br />
<br />
<br />
===== Beispiel: dd nach einem Super-GAU im Filesystem =====<br />
<br />
Konstruieren wir uns doch einmal ein Super-GAU Szenario <br />
<br />
''(Ähnlichkeiten mit realen Ereignissen oder Personen sind rein zufällig ;-) )''<br />
{{Box Beispiel ||<br />
Nach monatelanger allnächtlicher Mühe ist die Doktorarbeit mit all ihren Texten, Bildern und Zeichnungen nun endgültig fertig. Korrektur ist gelesen, ist gut geworden, und man hat die Doktorwürden jetzt schon so gut wie in der Hand. Nur noch ausdrucken und fertig. Da man in den letzten Wochen leichtsinnigerweise kein Backup gemacht hat, man ist eben so optimistisch, wird es jetzt aber aller höchste Eisenbahn, dieses nachzuholen. Mit dem Kopf schon am überlegen ob wohl der Drucker auch noch genug Tinte hat, nur schnell noch ein paar alte temporäre Dateien löschen die nicht mit ins Backup brauchen. Doch was ist das jetzt für eine Fehlermeldung '''rm: cannot remove directory `./': Invalid argument''' und '''ls -l''' zeigt plötzlich auch nur '''total 0''' ???<br><br />
Der geschärfte Blick auf die Konsole läßt erkennen, die gesamte Doktorarbeit rekursiv gelöscht. Das Adrenalin schießt in den Kopf, wie war das nochmal mit reiserfs und gelöschten Dateien? - ein Aufschrei - ein Hechtsprung - den Kaltgerätestecker aus dem Rechner ziehen - alles Eins. <br><br />
Super-GAU komplett und morgen ist Abgabetermin.}}<br />
<br />
Wird jetzt an dieser Stelle der Rechner hochgefahren und normal gestartet, hat man eventuell genau einen Reparaturversuch wieder an seine gelöschte Doktorarbeit zu kommen. Misslingt dieser Versuch ganz oder teilweise, dürfen eventuell größere Teile ganz neu beschrieben werden. Wohl dem der in dieser Situation jetzt genau das richtige Howto findet.<br />
<br />
Besser hier, eine große Festplatte suchen und zusätzlich anschließen. Den Rechner von CD booten und zu aller erst mittels '''dd''' ein Image der betroffenen Partition oder der gesamten Festplatte auf diese Platte erstellen. Erst dann einen normalen Boot versuchen oder mit der Reparatur der Filesysteme beginnen. Sollte der erste Versuch fehlschlagen, dann wieder das Image zurückspielen und das nächste Howto ausprobieren. Man kann so über das zurückschreiben des Images die haargenaue ursprünglich defekte Situation des Filesystems beliebig oft rekonstruieren und so seine Chancen auf die Wiederherstellung der Daten bedeutend verbessern.<br />
<br />
<br />
<br />
===== Beispiel: mit dd nach verlorenen Dateiinhalten suchen =====<br />
<br />
{{Box Beispiel||<br />
Wir haben eine Textdatei verloren, an der wir in den letzten Tagen rumgebastelt haben. Alle bisherigen Versuche die Datei wiederzufinden waren ergebnisslos. <br />
}}<br />
<br />
Sollte es sich um eine Textdatei, script, Quelltext oder ähnliches handeln, haben wir eine gute Chance hier doch noch an den Inhalt heranzukommen, sollte sich dieser noch irgendwo in einem gelöschtem Datenblock befinden. Alles was wir benötigen ist die Partition auf der sich das Filesystem befindet in der sich die Datei befunden haben muss, die ungefähre Größe dieser Datei in Zeilen, eine sehr markante Wortkombination innerhalb einer Zeile die nur in dieser Datei oder deren Kopien vorkommen kann, und eine etwaige Position dieses Suchbegriffes in Zeilen innerhalb der Datei.<br />
<br />
Wir nehmen folgendes an:<br />
# Partition /dev/hda2<br />
# Größe der Datei 100-150 Zeilen<br />
# genaue Wortkombination im letztem Drittel "darf ich mir vormerken" <br />
<br />
<br />
dd if=/dev/hda2 bs=4K | strings | grep -B 150 -A 100 "darf ich mir vormerken" > /tmp/gefunden.txt<br />
<br />
Damit lesen wir mittels '''dd''' die Partition aus, [http://www.phpman.info/index.php?parameter=strings&mode=man strings] entfernt aus diesem Datenstrom schon einmal alles was nicht nach druckbaren aussieht, [http://www.phpman.info/index.php?parameter=grep&mode=man grep] durchsucht jetzt diesen Datenstrom nach dem Vorkommen der Wortkombination und wenn er eine solche gefunden hat, dann schreibt grep die Zeilen von 150 Zeilen davor bis 100 Zeilen danach in eine Datei Namens /tmp/gefunden.txt , werden mehrere solcher Wortkombinationen gefunden, dann auch die entsprechenden Bereiche aus diesen Blöcken.<br />
<br />
Wenn sich also ein Datenblock auf der Festplatte befindet, der die genaue Zeilenwortkombination beinhaltet, dann werden wir den Textinhalt irgendwo innerhalb der gefunden.txt wiederfinden. Jedoch ohne eventuelle Leerzeilen, auch extrem kurze Zeilen (weniger als 4 druckbare Zeichen) sind verschwunden. Diesen Inhalt können wir aber immerhin jetzt aus ''gefunden.txt'' herauskopieren und wieder neu zu einer entsprechenden Datei formatieren.<br />
<br />
<br />
<br />
===== mit dd Partitionen und Festplatten sicher löschen =====<br />
<br />
Ein Löschen ( besser ein Überschreiben) von Partitionen und Festplatten mit '''dd''' ist ein weiteres beliebtes Anwendungsgebiet. Abzuraten jedoch bei Logischen Partitionen, hier könnten innerhalb der ersten 512 Byte Teile der Gesamt-Partitionstabelle überschrieben werden, und somit andere logische Partitionen nach dem nächsten reboot nicht mehr sichtbar sein. Beispiele und weitere Programme und Alternativen hierzu auch [[Wie eine Platte unwiederherstellbar und sicher loeschen]]<br />
<br />
<br />
<br />
<br />
=== CD DVD und Floppy mit dd ===<br />
<br />
==== Floppy Images mit dd ====<br />
<br />
Der Eine oder Andere wird sie noch verstaubt in der Ecke habe, die gute alte 1,44er Floppy. Von den eventuell noch benötigten Floppys kann man aber auch mit '''dd''' Image erstellen und diese dann übersichtlich auf seiner Festplatte verwalten.<br />
<br />
dd if=/dev/fd0 of=/PATH/DATEI.IMG bs=1440K<br />
als Blockgröße kann man bei intakten Floppys gleich 1440 KByte nehmen, sollte die Floppy schon "faule Stellen" haben, dann ist 512 Byte angesagt. (Einen gravierenden Geschwindigkeitsvorteil konnte ich bei Tests jetzt unter Linux nicht ausmachen)<br />
<br />
<br />
Bei Bedarf kann man dieses Image dann auch gleich temporär mounten<br />
mount -o loop /PATH/DATEI.IMG /mnt<br />
Die Auto-Option wird hier die meisten Filesysteme von Floppy automatisch erkennen, ansonsten noch mit Mountoptionen nachhelfen.<br />
<br />
<br />
Wird wirklich einmal wieder eine dieser Image als Diskette zB als Bootdiskette benötigt, dann das Ganze wieder rückwärts.<br />
dd if=/PATH/DATEI.IMG of=/dev/fd0 bs=512<br />
<br />
Floppys die beim Lesen schon Lesefehler produzieren kann man trotzdem zu einem Image abziehen. Solange nur einige wenige Blöcke kaputt sind, und nicht gerade ein geziptes Tar darauf abgelegt ist, kann man oftmals noch das wirklich Wichtige benutzen.<br />
dd if=/dev/fd0 of=/PATH/DATEI.IMG bs=512 conv=noerror,sync<br />
Die Blockgröße hier zwingend 512 und die Option '''conv=noerror,sync''' sorgt dafür, das bei einem Lesefehler der entsprechende Block mit NULLen gefüllt wird, und '''dd''' bei diesem Lesefehler nicht abbricht. Es sind also alle intakten Blöcke hinterher an der richtigen Position und das Image läßt sich meist problemlos mounten, so das man in aller Ruhe und ohne nervige Lesefehler vom Floppylaufwerk, die defekten Dateien suchen kann. <br><br />
Die Ausgabe von '''dd''' in diesem Fall ist auch so präzise, dass man genau die fehlerhaften Stellen (mit den jetzt NULLen im Image) aus dem Fehlerausgabe herauslesen kann. Somit könnte man auch mit [http://www.phpman.info/index.php?parameter=hexdump&mode=man hexdump] schon mal nachschauen, ob es nicht doch nur die README erwischt hat.<br />
<br />
<br />
<br />
==== CD DVD und dd ====<br />
<br />
Es gibt eine ganze Reihe von [http://de.wikipedia.org/wiki/Compact_Disk#Physische_Formate CD-] und [http://de.wikipedia.org/wiki/DVD#DVD-Datenstrukturen DVD-]Formaten, und es gibt allerlei Bemühungen, damit nicht unbedingt jeder mit solchen Scheiben machen kann, was er gerne möchte. Wir wollen das an dieser Stelle etwas unterstützen und hier nicht allzu tiefgründig werden, deshalb nur einige kurze Bemerkungen. <br><br />
# Mit einer Vielzahl dieser Scheiben könnte man bestimmt analog wie mit einer Floppy verfahren. Die Blockgröße innerhalb normaler Grenzen sollte bei den heutigen Laufwerken bei '''dd''' meist wenig bis keinen Einfluss auf die Lesegeschwindigkeit haben, fällt also oft erst beim Auftreten von Lesefehlern ins Gewicht.<br />
# Ein Mounten eines Images wie oben beschrieben, funktioniert nicht zwangläufig mit jedem Type von Scheibenimage.<br />
# Versucht nicht mit '''dd''' eine CD oder DVD zu brennen, dazu gibt es genügend Brenntools die auch die Kontrolle über die Brennerhardware haben.<br />
# Den Inhalt zB. einer Audio-CD oder eine Video-DVD muss man noch lange nicht aufgeben, nur weil der Player immer an der selben Stelle abbricht. Mit '''dd''' könnte man hier schon noch etwas ausrichten, aber '''dd''' ist zwar universell aber nicht speziell für solche Zwecke gemacht, und hier nicht unbedingt die allerbeste Wahl.<br />
<br />
<br />
<br />
=== Bandlaufwerke und dd ===<br />
<br />
Bei den Bandlaufwerken sind wir dort, wofür '''dd''' ursprünglich einmal gedacht war. Hier kann '''dd''' als "Schweizer Taschenmesser" seine Stärken voll ausspielen. In den letzten Jahren hat sich jedoch die Hardware entschieden verbessert, aber '''dd''' ist in seinen Grundzügen immer noch das Alte. '''dd''' ist nicht in der Lage den Datenstrom im Speicher erwähnenswert zu cachen, so wie man es für moderne Laufwerke mit ihrem enormen Daten- und Durchsatzhunger gerne hätte. Wer sich näher damit befassen möchte, [[Bandlaufwerke und LINUX]] gibt eine Überblick und stellt auch [[Bandlaufwerke und LINUX#Pufferung der Daten zwischen Laufwerk und LINUX|Alternativen]] vor. Dennoch für viele nicht alltägliche Problemchen kann man sich immer wieder auf '''dd''' verlassen, auch wenn man die Laufwerke damit nicht immer im optimalen Bereich ansteuern kann. Die Einsatzmöglichkeiten sind hier vielfältig und in Zusammenarbeit mit einigen Spezialtools kann man nach Art eines [http://de.wikipedia.org/wiki/MacGyver MacGyver] schon mal das Unmögliche möglich machen.<br />
<br />
Hier nur ein paar einfache Beispiele: ''(Voreinstellungen und Positionierungsbefehle für das Laufwerk lassen wir der Einfachheit halber bei der Vorstellung reiner Befehle weg, bei Konsoleauszügen sind sie Ansatzhalber enthalten)''<br />
<br />
Eine ganze Festplatte als Image auf ein Laufwerk sichern. / zurückspielen<br />
dd if=/dev/hda of=/dev/nst0 ibs=8K obs=64K<br />
dd if=/dev/nst0 of=/dev/hda ibs=64K obs=8K<br />
Wir arbeiten hier also mit 8KByte mit der Festplatte aber mit 64KByte ''( oder Größer Laufwerkstypeabhängig)'' mit dem Bandlaufwerk. Durch die Hardwarekomprimierung der meisten Bandlaufwerke ist das übrigens sehr Speichereffektiv, wenn wir wie oben beschreiben [[#Problem Komprimierung von dd-Image|die ungenutzten Blöcke der Partitionen hin und wieder einmal NULLen]]. Das Image belegt dann oft nur unwesentlich mehr Platz auf dem Band wie eine Tarsicherung. Eine Zeiteinsparung erreichen wir hier in der Regel allerdings nicht, denn die ganzen Nullen müssen trotzdem über Controller und Bus zum Laufwerk transportiert werden. <br />
<br />
Prinzipiell können wir auf diese Art mit '''dd''' jede Datei, jeden Datenstrom auf ein Band schreiben und auch wieder lesen. Wir können mit '''dd''' auch das auslesen was mit anderen Backupprogrammen geschrieben wurde, Wichtig nur beim Lesen, wir müssen die selbe Blockgröße verwenden mit der geschrieben wurde. Was wir allerdings komplett verlieren, wenn wir Dateien auf ein Band schreiben, den Dateinamen und Zugriffsrechte und alles was dazu gehört. Ist ein '''dd''' Befehl fertig, wird ein EOF-Marke aufs Band geschrieben. Es käme also jede Datei als ein eigenes Filearchiv auf dem Band an. Das lohnt sich nur bei sehr großen Dateien, oder bei Dateien die schon selbst ein Archiv sind, wie folgendes Beispiel zeigt.<br />
<pre><br />
LINUX:/tmp # tar -cf ./test.tar /etc<br />
tar: Removing leading `/' from member names<br />
LINUX:/tmp # mtst -f /dev/nst0 rewind<br />
LINUX:/tmp # mtst -f /dev/nst0 setblk 0<br />
LINUX:/tmp # dd if=./test.tar of=/dev/nst0 bs=64K<br />
348+1 records in<br />
348+1 records out<br />
LINUX:/tmp # mtst -f /dev/nst0 rewind<br />
LINUX:/tmp # tar -tvb 128 -f /dev/nst0 | more<br />
drwxr-xr-x root/root 0 2007-07-16 20:08:35 etc/<br />
drwxr-xr-x root/root 0 2006-06-01 14:21:44 etc/X11/<br />
drwxr-xr-x root/root 0 2004-10-24 14:58:35 etc/X11/fs/<br />
-rw-r--r-- root/root 2523 2004-04-06 04:27:19 etc/X11/fs/config<br />
drwxr-xr-x root/root ....................<br />
................<br />
</pre><br />
wir haben hier zum Test ein Tararchiv aus '''/etc''' erstellt und als Datei abgelegt, diese Datei dann mittels '''dd''' auf das Band geschrieben und anschließend mit''' tar''' das Inhaltsverzeichnis direkt vom Bandarchiv ausgelesen. (Zu beachten hier, da wir mit '''dd''' mit 64 KByte geschrieben haben, müssen wir jetzt mit '''tar''' auch mit 64KByte zugreifen.)<br />
<br />
<br />
<br />
Da wir nun alles mögliche auf ein Band schreiben könnten, stellt sich die Frage, woher erkenne ich an einem unbekannten Band, was darauf abgelegt ist und mit welcher Blockgröße geschrieben wurde. Sprich, welches Tool müsste ich mit welchen Optionen verwenden, um das Band überhaupt lesen zu können. Die Lösung bietet '''dd'''.<br><br />
{{box Beispiel||<br />
Wir bekommen ein Band von einem Freund, und dieser sagt, wir sollen und das einmal anschauen. Es sollte ein selbst geschriebenes Programm im Quelltext sein, soviel wissen wir, aber nicht mit welchem Programm es gesichert wurde, geschweige denn, mit welcher Blockgröße geschrieben wurde.<br />
}}<br />
<br />
<pre>LINUX:/tmp # mtst -f /dev/nst0 rewind<br />
LINUX:/tmp # mtst -f /dev/nst0 setblk 0<br />
LINUX:/tmp # dd if=/dev/nst0 of=/tmp/block.data bs=128K count=1<br />
0+1 records in<br />
0+1 records out<br />
LINUX:/tmp # ls -l block<br />
-rw-r--r-- 1 root root 5120 Jul 16 18:57 block<br />
LINUX:/tmp # file block.data<br />
block.data: ASCII cpio archive (SVR4 with no CRC)<br />
</pre><br />
wir legen das Band ein, und lesen mittels '''dd''' und der größtmöglichen Blockgröße mit der Linux und das Laufwerk arbeiten würde, (hier im Beispiel ein EXABYTE Laufwerk das maximal 128KByte Blockgroße zulassen würde.) An der Ausgabe von '''dd''' erkennen wir, es wurde ein Block gelesen und als Datei abgespeichert der allerdings (erwartungsgemäß) nicht die 128KByte Größe erreicht hat.<br><br />
mit '''ls''' können wir jetzt erkennen wie groß die Datei und somit unser erster Block auf dem Band war, genau 5120 Byte (also 10 x 512Byte).<br><br />
mit '''file''' können wir jetzt auch noch Linux bemühen für uns herauszubekommen, was das für ein File sein könnte. '''file''' kann das aus dem Anfang einer Datei von sehr vielen Dateitypen erkennen. Den ersten Block der Datei, also den Anfang haben wir ja vom Band geholt, also setzen wir '''file''' darauf an. Als Ergebniss sehen wir, es würde mit '''cpio''' geschrieben und Blockgröße 5120 Byte (bei cpio der Defaultwert) geschrieben, eine genaue Formatbezeichnung hätten wir auch noch, wenn sie von '''cpio''' nicht selbst erkannt werden würde. Jetzt sollten wir alles wissen, um das Band auszulesen zu können. <br />
<br />
<br />
<br />
<br />
Neben Dateien und Archiven können wir auch Datenstöme auf Band schreiben. Das könnten jetzt zB Debugtraces von irgendwelchen Befehlen oder Trace von Netzverbindungen sein. Niemand kann genau vorhersagen wie schnell solche Datenstöme riesige Ausmaße annehmen, und niemand kann vorhersagen was alles für unbrauchbare und uninteressante Meldungen jetzt mitgelogt werden. Statt also hier noch irgend welche Filter nachzuschalten (und damit, und dem zusätzlichen Schreiben der Logdatei auf die Festplatte den Rechner jetzt noch unnötig weiter zu belasten) - wir haben doch ein Bandlaufwerk - also schreiben wir den gesamten Trace einfach auf das Band, egal wie lang er wird, da passt schon ordentlich was drauf. Angenommen der Tracelog kommt in der Befehlskette als Standardausgabekanal an, dann einfach nach '''dd''' weiterleiten und auf Band schreiben.<br />
strace -f 2>&1 SCRIPT | dd of=/dev/nst0 bs=64K <br />
Also '''[http://www.phpman.info/index.php?parameter=strace&mode=man strace]''' auf unser zu untersuchendes Script ansetzen und mit '''dd''' auf das Bandlaufwerk weiterleiten. Ist alles aufgezeichnet, dann kann entweder der Stream vom Laufwerk jetzt auf diesem oder einem anderem Rechner mittels '''dd''' in eine Datei zurückgespielt werden, oder dabei gleich noch mit '''grep''' gefiltert werden, um nur das wirklich Wichtige auszuwerten. Hat der Filter nicht funktioniert oder müssen noch weitere Filter hinzugefügt werden, kein Problem, der Stream kann ja beliebig oft vom Band ausgelesen werden, wir müssen also nicht nocheinmal den ganzen "Versuchsaufbau" rekonstruieren. <br />
<br />
<br />
<br />
Wir müssen dabei auch nicht immer nur das Ende einer Kette anzapfen. Zapfen wir doch mal eine mittels Pipe verbundene Befehlskette in der Mitte an, genau dort, wo der dickste Datenstrom anliegt, und schreiben diesen Datenstrom parallel zur normalen Befehlsverarbeitung aufs Band.<br><br />
<br />
Wir nehmen dazu einmal das Beispiel von vorhin, als wir auf der Platte nach verlorenen Dateiinhalten gesucht haben, und schreiben parallel dazu gleich noch das komplette Image dieser Partition auf das Band. Somit haben wir abgesichert, wird der von uns gesuchte Block später überschrieben, und wir ihn vorher immer noch nicht gefunden haben, können wir ihn immernoch beim Durchsuchen des Bandimages finden.<br />
<br />
<pre><br />
LINUX:/tmp # mkfifo /tmp/pipe<br />
LINUX:/tmp # mtst -f /dev/nst0 rewind<br />
LINUX:/tmp # mtst -f /dev/nst0 setblk 0<br />
LINUX:/tmp # dd if=/dev/sdb1 bs=4K | tee /tmp/pipe | strings | grep -B 50 -A 20 "Starker Schneefall" > /tmp/gefunden.txt &<br />
[1] 6373<br />
LINUX:/tmp # dd if=/tmp/pipe of=/dev/nst0 bs=64K<br />
126504+0 records in<br />
126504+0 records out<br />
0+63252 records in<br />
0+63252 records out<br />
[1]+ Done dd if=/dev/sdb1 bs=4K | tee /tmp/pipe | strings | grep -B 50 -A 20 "Starker Schneefall" >/tmp/gefunden.txt<br />
</pre><br />
Wir legen uns eine [http://www.phpman.info/index.php?parameter=mkfifo&mode=man Named Pipe] an.<br />
In der Suchbefehlskette duplizieren wir mittels [http://www.phpman.info/index.php?parameter=tee&mode=man tee] den Datenstrom in Richtung dieser Pipe.<br />
Die gesamte Befehlskette schicken wir in den Hintergrund. Dort wird sie so lange untätig warten, bis jemand die Pipe zum lesen öffnet. Zum Lesen öffnen wir die Pipe dann mit dem nächsten '''dd''' Kommando und leiten die Ausgabe an das Laufwerk weiter. Wenn der '''dd''' Befehl beendet ist, ist auch unser Hintergrundbefehl beendet.<br />
<br />
Die Pipe brauchen wir jetzt nicht mehr, die können wir löschen, aber schauen wir uns das Ergebnis an.<br />
<pre><br />
LINUX:/tmp # rm /tmp/pipe<br />
LINUX:/tmp # ls -l /tmp/gefunden.txt <br />
-rw-r--r-- 1 root root 4044 Jul 16 19:43 /tmp/gefunden.txt<br />
</pre> <br />
wir haben eine Datei ''gefunden.txt'' und wirklich, wir haben auch etwas gefunden <br />
<pre><br />
LINUX:/tmp # mtst -f /dev/nst0 rewind<br />
LINUX:/tmp # dd if=/dev/nst0 of=/tmp/test.img bs=64K<br />
0+63252 records in<br />
0+63252 records out<br />
LINUX:/tmp # file /tmp/test.img<br />
/tmp/test.img: Linux rev 1.0 ext2 filesystem data<br />
LINUX:/tmp # fsck /tmp/test.img<br />
fsck 1.34 (25-Jul-2003)<br />
e2fsck 1.34 (25-Jul-2003)<br />
/tmp/test.img: clean, 40/126976 files, 51084/506016 blocks<br />
LINUX:/tmp # mount -o loop /tmp/test.img /mnt<br />
</pre> <br />
Und wir können vom Band unser Partitionsimage lesen. Zum Test wird auch gleich noch einen Filesystemcheck gemachen und das mounten probiert.<br />
<br />
<br />
<br />
=== mit dd über Rechnergrenzen ===<br />
<br />
Daten von einem auf einen anderen Rechner übertragen oder weiterleiten ist eine häufig benötigte Funktion. Da '''dd''' problemlos mit den Standardein- und Ausgabekanälen arbeitet, könnten wir es in jede Pipe und somit auch in Verbindungen über Rechnergrenzen einschleusen. Einfache Verbindungen lassen sich so zB bequem über [http://www.phpman.info/index.php?parameter=rsh&mode=man rsh] [http://www.phpman.info/index.php?parameter=ssh&mode=man ssh] oder [http://linux.die.net/man/1/nc netcat] mit '''dd''' auf einer oder auf beiden Seiten der Pipe aufbauen.<br />
<br />
Beispiel: clonen einer Festplatte auf einen anderen Rechner<br />
dd if=/dev/hda bs=8K | ssh RECHNER2 "dd of=/dev/hdb bs=8K"<br />
damit würden wir die ''/dev/hda'' unseres Rechners auf die ''/dev/hdb'' von RECHNER2 clonen.<br><br />
<br />
Ähnlich könnten wir wohl vieles andere auch über Netzwerk weiterleiten. Der größte Teil der weiter oben vorgestellten Beispiele ginge also auch über Rechnergrenzen hinweg. Inwieweit das immer auch Sinn macht, sei mal dahingestellt, da sich vieles wahrscheinlich sogar auch ohne '''dd''' realisieren ließe. Das obrige Beispiel würde mit Sicherheit so hier genauso funktionieren.<br />
cat /dev/hda | ssh RECHNER2 "cat > /dev/hdb"<br />
Die Performancevorteile, die wir aus der Blockung mit '''dd''' ziehen, würde durch die Netzverbindung und der zusätzlichen Verschlüsselung über '''ssh''' sowieso zu nichte gemacht. Wenn wir also nicht irgendwelche andere Funktionen, wie zB Byte-Konvertierungen oder die Positionierungsfunktionen im Datenstrom von dd mit benutzen können, und auch auf eine Blockung des Datenstromes verzichten können, dann ist '''dd''' über das Netzwerk in vielen Fällen überflüssig. ''(die Befehlsverkettung mit '''dd''' würde aber wahrscheinlich leichter zu interpretierende Befehlszeilen ergeben ;-))''<br />
<br />
Ganz anders, wenn wir die Blockung an irgend einer Stelle zwingend benötigen. Wie zum Beispiel beim Schreiben und Lesen auf Bandlaufwerke.<br />
<pre><br />
LINUX:/ # tar -cf - /etc | ssh RECHNER2 "dd of=/dev/nst0 obs=64K"<br />
tar: Removing leading `/' from member names<br />
tar: Removing leading `/' from hard link targets<br />
49404+8 records in<br />
386+0 records out<br />
</pre><br />
Hiermit würden wir eine Sicherung mit '''tar''' gleich auf das Bandlaufwerk eines anderen Rechner schreiben.<br />
Sicherung wieder recovern, <br />
ssh RECHNER2 "dd if=/dev/nst0 bs=64K" | tar -xvf - <br />
oder nur das Inhaltsverzeichnis anschauen<br />
ssh RECHNER2 "dd if=/dev/nst0 bs=64K" | tar -tvf -<br />
Wir hätten hier also mittels der Verlängerung über '''ssh''' und '''dd''' ein remote Bandlaufwerk.<br />
<br />
Der Vollständigkeit halber: wir müssen das Laufwerk auch von unserem eigenem Rechner aus steuern können, also remote, aber das geht genau so. <br><br />
Beispiele:<br />
ssh RECHNER2 "mtst -f /dev/nst0 setblk 0"<br />
ssh RECHNER2 "mtst -f /dev/nst0 rewind"<br />
und wir müssen natürlich für root [[Einrichten von public keys mit ssh|Publickey-Authentifizierung]] einrichten, denn sonst müssten wir bei jedem ssh-Befehl das Passwort eingeben. Aber dann steht hier auch einer Sicherung durch ein Script auf ein entferntes Laufwerk nichts mehr im Wege. <br />
-- außer --<br />
Das Ganze würde, wenn wir es tagtäglich benutzen möchten, nur mit etwas älteren Laufwerken wirklich Sinn machen. Moderne Bandlaufwerke würden wir mit dem Datenstrom den wir somit dem Laufwerk anbieten nur zu tote langweilen. <br><br />
Es gibt jedoch Programme, die auch Blockfunktionen wie '''dd''' anbieten und darüber hinaus noch im Hauptspeicher oder auf Festplatte den Datenstrom cachen können. Darüber hinaus unter anderem auch noch die Eigenschaft haben, selbst mit TCP/IP Ports zu kommunizieren. Solchen Programmen ist hier bei regelmäßiger Anwendung auf moderne Bandlaufwerke der absolute Vorzug gegenüber von '''dd''' einzuräumen. [[Bandlaufwerke und LINUX#Das Programm mbuffer |Beispiele]] findet ihr unter [[Bandlaufwerke und LINUX]]. Auch bei vielen anderen Anwendungen können solche neuen Programme den guten alten dd-Befehl 100%ig und oft auch besser ersetzen. dd ist und bleibt dennoch der Kultbefehl mit dem man unter Linux oder Unix mal eben schnell "zaubert".<br />
<br />
<br />
<br />
== Alternative Programme ==<br />
<br />
* [http://www.gnu.org/software/ddrescue/ddrescue.html ddrescue] <br><br />
eine moderne Erweiterung von dd speziell geeignet um teilweise defekte Platten und Wechselmedien zu lesen oder zu kopieren. Es ist in der Handhabung etwas einfacher und die wichtige Optionen sind analog zu benutzen. Siehe auch [http://www.linux-user.de/ausgabe/2004/08/048-dd-rescue/ LinuxUser - Das Magazin für die Praxis - LU 08/2004: Datenrettung mit ddrescue] <br />
<br />
<br />
<br />
* [http://www.maier-komor.de/mbuffer.html mbuffer]<br><br />
eine Programm das einen Datenstrom im Speicher oder auf Festplatte sehr effektiv '''(buffern)''' kann, es wurde speziell für die Benutzung mit Bandlaufwerken entwickelt. Es ist nur eine indirekte Alternative für dd, ist aber durchaus in der Lage viele andere Aufgaben die bisher mit dd erledigt werden konnten, sehr effektiv zu meistern. Die Bedienung und Benutzung hat mit dd nichts gemein, und ist bisweilen sehr knifflig. Es hat eine ganze Reihe von nützlichen Zusatzfunktionen die in dd nicht enthalten sind.<br />
<br />
<br />
<br />
== Quellen und weiterführende Links ==<br />
*[http://wiki.ubuntuusers.de/dd wiki ubuntuusers.de]<br />
*[http://gentoo-en.vfose.ru/wiki/DM-Crypt_with_LUKS#Filling_the_disk_with_random_data Filling the disk with random data] {{Englisch}}<br />
<br />
----<br />
[[Konsole|zurück zur Konsole]]<br />
[[Category:Konsole]][[Category:Partitionen]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=USB_Status_von_USB_pr%C3%BCfen&diff=32123USB Status von USB prüfen2015-09-05T20:14:40Z<p>Robi: intern verlinkt</p>
<hr />
<div>== Um die USB-Hardware zum laufen zu bringen wird folgendes benötigt: ==<br />
<br />
* erkannte USB-Kontroller auf der Mutterplatine<br />
* erkanntes angeschlossen USB-Gerät<br />
* geladene USB-Schnittstellenmodule (ehci-hcd ohci-hcd uhci-hcd)<br />
* geladene USB-Treiber, die dem USB-Gerät entsprechen (z.B. usb_storage für USB-Speichergeräte)<br />
<br />
<br />
== Wird der USB-Controller erkannt?: ==<br />
<br />
<br />
Textkonsole / Shell :<br />
Erst Befehl:<br />
"su" + root Passwort<br />
dann<br />
Code:<br />
linux:~ # lspci | grep -i controller<br />
<br />
<br />
<br />
== Erkannte USB-Geräte: ==<br />
<br />
Code:<br />
lsusb<br />
oder<br />
lsmod | grep usb<br />
Beispiel:<br />
misiu@exotux:~> lsmod | grep usb<br />
usb_storage 80780 0<br />
usbhid 41300 0<br />
hid 29184 1 usbhid<br />
ide_core 122948 1 usb_storage<br />
usblp 17024 0<br />
ff_memless 9352 1 usbhid<br />
usbcore 123756 6 usb_storage,usbhid,usblp,ehci_hcd,ohci_hcd<br />
scsi_mod 140376 5 usb_storage,sr_mod,sg,sd_mod,libata<br />
<br />
<br />
<br />
<br />
== Detallierte Anzeige der USB-Geräte: ==<br />
<br />
cat /proc/bus/usb/devices<br />
<br />
lshal<br />
oder<br />
lshal | grep usb<br />
<br />
Geladene Module/Treiber<br />
linux:~ # lspci | grep usb<br />
<br />
<br />
Auflistung vom PCI-Bus:<br />
lspci -v<br />
<br />
<br />
USB-Geräte-Anzeige (Grafisch):<br />
<br />
KDE-->System-->Überwachung-->Infozentrum-->USB<br />
oder<br />
<br />
Programm "usbview"<br />
(falls nicht auffindbar, von der Textkonsole aufrufen oder nachinstallieren)<br />
<br />
Ab SuSE 9.1 gibt es manchmal Probleme mit usbview,<br />
da auf falsche "Devices" zugegrifen wird. So kann es<br />
berechtigt werden:<br />
- usbview aufrufen<br />
- auf Button "Configure" (Konfiguration) drücken<br />
es erscheint einFenster mit:<br />
"/proc/bus/usb/devices"<br />
- rechts davon auf Button drücken<br />
es geht ein doppelseitiges Fenster auf<br />
- in der rechten Hälfte den Eintrag devices-XXXXXXX<br />
Anklicken und alles mit "OK"-Button bestätigen.<br />
Jetzt durften die USB-Geräte angezeigt werden!<br />
(Evtl. noch "Refresh" drücken)<br />
<br />
Die meisten USB-Geräte können bei SuSE-Linux mit<br />
dem Werkzeug YaST eingerichtet werden. Voraussetzung<br />
ist , daß im [[BIOS]] USB eingeschaltet und ein IRQ-u zugewiesen sind.<br />
<br />
== Was bedeutet "/proc/bus/usb/devices/" ? ==<br />
<br />
<br />
Es ist eine Auflistung der USB-Geräte, dazu gehören auch der<br />
USB-Bus selbst, der in verschiedene Levels angeordnet ist.<br />
Die Dokumentation dazu befindet sich in:<br />
<br />
/usr/src/linux/Documentation/usb/proc_usb_info.txt<br />
<br />
(Kernelquellen müssen installiert sein!).<br />
<br />
Dieser Dokumentation nach:<br />
<br />
T: es handelt sich um topologische Informationen<br />
<br />
Bus: Busnummer<br />
<br />
Lev: Ebene in der USB-Baumtopologie an diesem Bus<br />
<br />
Prnt: Gerätenummer des übergeordneten Gerätes<br />
<br />
Port: Anschluß/Port an dem das Gerät am übergeordneten Gerät angeschlossen ist<br />
<br />
Cnt: Anzahl aller angeschlossenen Geräte in dieser Ebene (Bus,Lev)<br />
<br />
Dev#: eigene Gerätenummer<br />
<br />
Spd: Übertragungsgeschwindigkeit (1,5|12|480 MBit/s)<br />
<br />
MxCh: Anzahl maximal anschließbarer weiterer Geräte<br />
<br />
/usr/src/linux/Documentation/usb/ehci.txt<br />
<br />
Hotplug Dokumentation:<br />
/usr/src/linux/Documentation/usb/hotplug.txt<br />
<br />
USB-Serial Dokumentation (Handhelds, PDA´s) :<br />
/usr/src/linux/Documentation/usb/usb-serial.txt<br />
<br />
Speichermedien, Mountoptionen:<br />
FAT16/32:<br />
/usr/src/linux/Documentation/filesystems/vfat.txt<br />
<br />
ReiserFS4:<br />
/usr/src/linux/Documentation/filesystems/reiser4.txt<br />
<br />
EXT2:<br />
/usr/src/linux/Documentation/filesystems/ext2.txt<br />
<br />
EXT3:<br />
/usr/src/linux/Documentation/filesystems/ext3.txt<br />
<br />
NTFS:<br />
/usr/src/linux/Documentation/filesystems/ntfs.txt<br />
<br />
<br />
Automounting:<br />
/usr/src/linux/Documentation/filesystems/automount-support.txt<br />
<br />
KERNELPARAMETER (Bootparameter):<br />
/usr/src/linux/Documentation/kernel-parameters.txt<br />
<br />
<br />
== Was sind "ohci / uhci / ehci"? ==<br />
<br />
OHCI steht für Open Host Controller Interface und meint die USB-1.0-Spezifikation.<br />
<br />
UHCI steht für Universal Host Controller Interface und bezeichnet die Spezifikation von USB-1.1.<br />
<br />
EHCI ist die Abkürzung für Enhanced Host Controller Interface, was einen erweitertes USB-2.0-Interface ist.<br />
<br />
Dieselben Kürzel besitzen auch die Linux-USB-Module für die USB-Controller, die normalerweise<br />
dem vorhandenem USB-Controller entsprechend, automatisch geladen werden, sehe:<br />
lsmod | grep usb<br />
<br />
KDE - Kontrollzentrum: Geräteinfos<br />
<br />
bis Version 3 waren Kontrollzentrum und Infozentrum<br />
zusammen, ab 3.1 wurde Infozentrum (reine Infos über<br />
Hardware, keine Einstellungsmöglichkeiten) ausgesondert.<br />
<br />
SuSE 9.0+KDE 3.1.4-> KDE->System->Überwachung->Infozentrum<br />
<br />
opensuse 10.3 + KDE--> System-->Überwachung-->Infozentrum<br />
<br />
Digitalkameras anbinden:<br />
<br />
* erste Möglichkeit : Massenstorage, da wird die Kamera<br />
ganz normal gemountet, wie USB-Stick, einige Kameras<br />
müssen erst in den "Massenstorage"-Zustand versetzt<br />
werden. Sobald Hotplug existiert , gibt es ein KDE-Plugin<br />
"Camera", der die ablesen kann. Seit SuSE 10.0 geschieht<br />
die Anbindung meistens automatisch.<br />
<br />
* zweite Möglichkeit : es gibt "gphoto2" -><br />
http://www.gphoto.org/<br />
ist eigentlich ein Textkonsolen-Tool. Also kann die<br />
Kamera von der Textkonsole (auf rechte Achten !)<br />
abgefragt werden:<br />
<br />
gphoto2 --auto-detect<br />
<br />
Natürlich gibt es auch grafische Frontends, wie qtkam oder<br />
digikam, die mit Hilfe von gphoto2 einiges machen können.<br />
<br />
* dritte Möglichkeit:<br />
Kartenlesegerät, kann auch meistens leicht gemountet<br />
werden, bittet oft bessere Übertragungsraten, als die<br />
Kamera selbst und kostet nicht die Welt (12 bis 15 Euro).<br />
Kartenlesegeräte werden meistens , als sdd erkannt.<br />
<br />
<br />
==Mit dem Befehl "lsusb" kann ich die angeschlossenen Geräte anzeigen (Option -t zeigt zusätzlich welchen Bus sich diese Teilen)== <br />
<br />
Beispiel<br />
<br />
ich@linux:~> lsusb -t<br />
/: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/2p, 12M<br />
/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/3p, 12M<br />
|__ Port 2: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M<br />
|__ Port 2: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M<br />
|__ Port 3: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M<br />
|__ Port 3: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M<br />
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/3p, 12M<br />
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/3p, 12M<br />
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/3p, 12M <br />
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/6p, 480M <br />
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/6p, 480M <br />
|__ Port 4: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 480M <br />
|__ Port 6: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M <br />
|__ Port 6: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M <br />
|__ Port 6: Dev 3, If 2, Class=Audio, Driver=snd-usb-audio, 480M <br />
|__ Port 6: Dev 3, If 3, Class=Audio, Driver=snd-usb-audio, 480M <br />
<br />
<br />
<br />
<br />
==Informationen über Störungen aus den LOG / INFO-Dateien:==<br />
<br />
grep -i Begriff /var/log/messages<br />
<br />
Dabei "Begriff" durch gesuchtes Wort / Name des Gerätes etc. ersetzen<br />
<br />
Beispiel:<br />
<br />
grep -i usb /var/log/messages<br />
<br />
'''Kernelmeldungen:'''<br />
<br />
dmesg|grep -i Begriff<br />
<br />
Dabei "Begriff" durch gesuchtes Wort / Name des Gerätes etc. ersetzen<br />
<br />
dmesg|grep -i usb<br />
<br />
==Informationen kann auch "udevadm" liefern, z.B. mit Option "monitor"==<br />
<br />
Beispiel (Eine SD-Karte am USB-Lesegerät wird angesteckt):<br />
<br />
ich@linux:~> udevadm monitor<br />
monitor will print the received events for:<br />
UDEV - the event which udev sends out after rule processing<br />
KERNEL - the kernel uevent<br />
KERNEL[16092.681374] change /devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4:1.0/host8/target8:0:0/8:0:0:1/block/sde (block)<br />
KERNEL[16092.689931] change /devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4:1.0/host8/target8:0:0/8:0:0:1/block/sde (block)<br />
KERNEL[16092.690078] add /devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4:1.0/host8/target8:0:0/8:0:0:1/block/sde/sde1 (block)<br />
UDEV [16092.744334] change /devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4:1.0/host8/target8:0:0/8:0:0:1/block/sde (block)<br />
UDEV [16092.803558] change /devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4:1.0/host8/target8:0:0/8:0:0:1/block/sde (block)<br />
UDEV [16092.871765] add /devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4:1.0/host8/target8:0:0/8:0:0:1/block/sde/sde1 (block)<br />
<br />
<br />
[[USB|zurück zu USB]]<br /><br />
[[Partition|zurück zur Partition]]<br />
[[Category:USB]][[Category:Partitionen]]</div>Robihttps://linupedia.org/wiki/mediawiki/index.php?title=USB_Festplatte&diff=32122USB Festplatte2015-09-05T20:13:20Z<p>Robi: intern verlinkt</p>
<hr />
<div>Autoren: [http://www.linux-club.de/faq/Benutzer:Misiu Misiu] und [http://www.linux-club.de/faq/Benutzer:Yehudi Yehudi]<br />
[[Bild:USB-Festplatte.jpg|thumb|400px|Hier eine [[USB]] Festplatte mit 400GB]]<br />
{{Box Test||<br />
* [[openSUSE]] 10.3<br />
* [[openSUSE]] 10.2<br />
* SUSE Linux 10.0<br />
}}<br />
<br />
== Einleitung ==<br />
<br />
Hier handelt es sich in erster Linie um Probleme bei größeren USB-Festplatten (um ca. 300GB). Diese werden bei Verwendung von FAT32 als Dateisystem auch normalerweise problemlos erkannt. <br />
<br />
Beim Versuch im [[YaST]] eine USB-Festplatte mit z.B. ReiserFS zu formatieren, wird man gewarnt, dass es eventuell zu Problemen mit dem SYSTEM kommen kann. Jeder der kein Risiko eingehen will, lässt nach dieser eindringlich angezeigten WARNUNG die Finger davon. Wenn der Vorgang nicht korrekt ausgeführt und [[fstab]] falsch geschrieben wird, dann kann dies durchaus dazu führen, dass [[openSUSE]] beim nächsten START nicht hochfährt.<br />
<br />
Sollte beim Neustart jedoch mal Linux nicht hochfahren, so kann man in der Detailansicht sehen, woran das liegt. Wenn ein Eintrag in der [[fstab]] falsch ist, so ist die kein Gund zur Panik. Für diesen Fall sollte man stets eine aktuelle [http://www.knoppix.org/ Knoppix]/Kanotix-CD parat haben, oder ein Not-Linux (irgend eine schlank gehaltene installierte Linux-Distribution) von dem man dann startet und den Eintrag in der /etc/[[fstab]] löscht oder korrigiert. Danach kann das eigentliche System wieder gestartet werden. Auch Hochfahren mit dem [[openSUSE]]-Installationsdatenträger (CD/DVD) ist möglich.<br />
<br />
Wer jedoch einige Punkte beachtet, der braucht sich davor nicht zu fürchten. Meistens sind USB-Festplatten von Haus aus mit FAT-32 formatiert. Das kann auch so genutzt werden. Die verschiedenen Formatierungen bieten jedoch unterschiedlich Vorteile, die sollte man durchaus berücksichtigen.<br />
<br />
Eine [[USB]]-Festplatte lässt sich durchaus problemlos ein- und ausschalten, ohne dass sie jedesmal gemountet werden muss und ohne dass das System hinterher in Mitleidenschaft gezogen wird.<br />
<br />
Doch mit solch großen Einzelspeichergeräten kann es jedoch auch Probleme geben. Da eine USB-Festplatte ein Wechselmedium ist, welches für den Dateitransfer unterschiedlicher Betriebssysteme sein kann, wird diese Verwendung mit einbezogen.(?)<br />
<br />
== Bitte beachten! ==<br />
<br />
# Einige Motherboards haben Startprobleme, wenn ein USB-Massenspeichergerät dranhängt (dieses Verhalten habe ich selbst bei Athlon- wie Pentium-Boards beobachtet, und später auch in einem Zeitschrift-Artikel in der c't gelesen: http://www.heise.de/ct/05/09/180/default.shtml. Auch Massenspeicher ohne Bootsector bringen solche Probleme mit sich. Dies ist nicht immer zu beheben, manchmal hilft ein [[BIOS|BIOS-Update]], evtl. gibts dafür BIOS-Optionen: Booten vom Massenspeicher abschalten. Solches habe ich bei Bluetooth-, Wireless- und USB-Sticks beobachten können.<br />
# Separate Stromversorgung ist ein Muss.<br />
# Die Plattengeometrie muss richtig/vollständig erkannt werden.<br />
# Bei sehr grossen Dateimengen ist ein manuelles umount immer noch die sicherste Lösung, sonst kann es sein, dass die Platte während des Schreibens abgeklemmt wird. Bei USB ist die Unterbrechung leider immer möglich. Sonst kann man sich an den LEDs am Gehäuse orientieren, ob der Schreibvorgang beendet worden ist.<br />
# Bei SuSE 10.0 (das besteht vermutlich auch noch bei openSUSE 10.2) und USB 2.0 gibt es ein Problem, der mit folgendem Trick umgangen werden kann:<br />
## [[USB Geschwindigkeits-Bug]] ggf. einen Neustart machen (bei mir wurde unter openSUSE 10.2 die Festplatte anschließend erkannt)<br />
# Bei externen USB-Festplatten sollte darauf geachtet werden, dass die Kühlung beim Gehäuse gut genug ist. <br />
## Meiner Erfahrung nach bieten größere Gehäuse eine bessere Kühlung.<br />
## Bei senkrecht stehenden Platten ist der Vorteil, dass die Wärme besser abziehen kann.<br />
## Gehäuse mit Löchern bieten eine bessere Luftzirkulation.<br />
## Gehäuse aus Metall leiten die Wärme besser nach außen.<br />
## Gehäuse mit einem Ventilator sorgen für bessere Abluft. (Eigentlich wären hier 2 Ventilatoren förderlich, einer, der neue Luft hinzufügt, und einer der sie abführt.) Für den Dauerbetrieb unbedingt zu empfehlen.<br />
# Bei allgemeinen Problemen mit USB-Festplatten sollte festgestellt werden,ob nicht auch andere Probleme mit anderen USB-Geräten vorliegen. Wenn dies der Fall sein sollte, ist unter [[USB - FAQ openSUSE]] insbesonders Abschnitt mit Kernel-Bootparametern zu beachten (auch BIOS-Update in Betracht ziehen).<br />
# Alle RPMs die auf der openSUSE 10.2 installieren(?) (da dies mehrfach im Forum zu Erfolgen oder Verbesserungen führte)<br />
<br />
= Welches Dateisystem? =<br />
<br />
<br />
==Windows-Dateisysteme==<br />
<br />
Betreibt man mehrere Betriebssysteme auf seinem Rechner, möchte man oft auf den gleichen Datenbestand, unabhängig vom jeweiligen System, zugreifen. Microsoft Windows ist - was Dateisysteme angeht - recht beschränkt und kennt von Haus aus nur '''NTFS''' und '''FAT32'''. Hier sollen nur kurz die die verschiedenen Dateisysteme vorgestellt werden. <br />
<br />
Informationen zu den Windows-Dateisystemen und wie man sie unter Linux einbindet findet man im Artikel '''[[Zugriff auf Windows-Partitionen von Linux aus]]'''<br />
<br />
=== FAT32 ===<br />
<br />
Hat den Vorteil, das es plattformübergreifend von allen Betriebssystemen (Mac OS 9, OS X, Linux und Windows) ohne Verwendung von Zusatzsoftware gelesen werden kann.<br />
<br />
<br />
<!-- Vorrübergehend auskommentiert <br />
* '''Anmerkung für MacOS-X-User''' Das Gerücht dass es bei OS X eine Beschränkung der Formatierung gäbe, stimmt nicht. <br />
Es st mir aber aufgefallen, dass openSUSE/Linux bei der Formatierung mit FAT32 verschwederischer ist als bei OS X. Bei OS X habe ich mit der gleichen Platte 372GB zur Verfügung, bei openSUSE waren es 366GB. (Schonmal von 1000-vs-1024-Lüge der Hersteller gehört? 363x 1024er-GB = 372x 1000er-GB)<br />
--><br />
<br />
Nachteile: <br />
* Partitionsgröße auf 2TB limitiert (Wer also mit größeren Partitionsgrößen arbeitet, sollte z.B. eine EFI/GUID-Partitionstabelle verwenden)<br />
* maximale Dateigröße ist 4GB --> DVD Images lassen sich darüber nicht oder nur mit Tricks speichern<br />
* Unter Windows 2000 und XP können Formatierungen mit Boardmittel nur bis 32 GB vorgenommen werden. Gelesen werden können auch größere Mengen, daher sollte die Festplatte unter Linux formatiert werden.<br />
<br />
Eine Lösung von: http://de.opensuse.org/ (vom Ulrich Grün), die die Nachteile von FAT32 lindern:<br />
Die Festplatte mit einer kleinen FAT32-Partition (10 bis 20 MB) formatieren, den Rest mit EXT3.<br />
Auf die FAT-Partition das Programm 'ext2ifs' http://www.fs-driver.org kopieren.<br />
Bei Zugriff von Windows aus wird die FAT-Partition erkannt. Dann kann das Programm 'ext2ifs'<br />
kopiert und gestartet werden, das Zugriff auf die EXT3-Partition ermöglicht. Es handelt sich<br />
um einen Dateisystem-Treiber für Windows, der das lesen/schreiben auf EXT3-Dateisysteme<br />
bequem im Dateimanager möglich macht.<br />
<br />
=== NTFS ===<br />
<br />
Das Standarddateisystem für Windows NT, 2000, XP und Vista. Lange Zeit war das Schreiben auf NTFS-Partitionen unter Linux nur bedingt möglich. Mittlerweile kann mit Hilfe von zusätzlichen Treibern wie z.B. ntfs-3g sicher auf NTFS-Partitionen geschrieben werden<br />
<br />
Eine Anleitung zum automatischen Einbinden von NTFS-formatierten externen Platten für Opensuse 10.x: http://de.opensuse.org/NTFS<br />
<br />
Eine Anleitung zum automatischen Einbinden von NTFS-formatierten externen Platten für Opensuse 11.0: http://www.icesheep.de/blog/2008/06/26/externe-usb-festplatten-lassen-sich-unter-opensuse-11-nicht-mounten/<br />
<br />
''NTFS kann unter OS X nicht mit Bordmitteln gelesen werden. Dort wird dann gefragt, ob die Festplatte ausgeworfen, oder initialisiert werden soll.''<br />
<br />
== Offene Dateisysteme ==<br />
<br />
=== HFS und HFS+ ===<br />
<br />
Ist das Dateisystem von Apple. HFS+ unterstützt Journaling. Es kann auch unter Linux erkannt werden.<br />
<br />
=== ReiserFS ===<br />
<br />
Als Dateisystem kannst du ReiserFS nutzen (mehr dazu: [http://www.namesys.com/]), dabei auf die Mountoptionen achten, da du in 3 verschiedenen Reiser-Modi darauf zugreifen kannst:<br />
<br />
Zitat aus YaST:<br />
<br />
"Daten-Journaling-Modus: Bestimmt den Journaling-Modus für Dateidaten.<br />
:journal -- Alle Daten werden in das Journal übertragen, bevor sie in das Hauptdateisystem geschrieben werden.<br />
:ordered -- Alle Daten werden direkt in das Hauptdateisystem geschrieben, bevor deren Metadaten in das Journal übertragen werden.<br />
:writeback -- Datenfolge wird nicht erhalten."<br />
<br />
ReiserFS weiter bzw. neuentwickelt, die Neuentwicklung heißt Reiser4 und besitzt den schnellsten Journaling bis jetzt. Allerdings kann es bei bestimmten Vorraussetzungen zum Datenverlust kommen, deswegen sollte man da noch etwas abwarten. Es fehlen zudem Unterstützung für Quotas und ACLs.<br />
<br />
reiser3 ist wegen der langen Mountzeit und dem Speicherverbrauch (~128MB für 1.9TB) nicht zu verwenden. (Tipp von Jengelh) -- Tritt seit 2.6.18 (evtl. schon ein bisschen vorher) nicht mehr auf. -j<br />
<br />
=== ext3 ===<br />
openSUSE und Ubuntu nutzen [http://linuxwiki.de/ext3 ext3], als Standard-Journallingdateisystem. ext3 ist eine Weiterenwicklung von ext2, wovon letzteres noch kein Journalling besaß. Ab OpenSuse 10.2 wurde ReiserFS durch ext3 als Standard-Dateisystem ersetzt, weil es nicht auf eine CPU beschränkt ist und ReiserFS 4 immer noch Status "in Entwicklung" trägt.<br />
<br />
<br />
=== XFS ===<br />
<br />
Für sehr grosse Dateimengen wie z.B. bei Videobearbeitung, wo die einzelne Dateien über 2GB gross sind empfiehlt sich auch das Dateisystem XFS: http://de.wikipedia.org/wiki/XFS Besticht mit sehr guten Performance bei Umgang mit grossen Dateien, die sich bei Dateien ab 4GB noch steigert.<br />
<br />
<br />
= Wie die Grösse der Festplatten ausfällt =<br />
<br />
Wer eine größere Festplatte kauft, der wird feststellen, dass ihm je größer die Platte ist auch entsprechend einige Gigabits mehr fehlen. Hersteller geben (Mega-,Giga-,)Bytes in 1000er-Einheiten an, während Linux korrekterweise mit 1024 rechnet. Demnach gilt:<br />
<br />
36 GB = 33.5 GiB<br />
40 GB = 37 GiB<br />
60 GB = 55 GiB<br />
74 GB = 69 GiB<br />
80 GB = 74 GiB<br />
100 GB = 93 GiB<br />
120 GB = 112 GiB<br />
160 GB = 149 GiB<br />
200 GB = 186 GiB<br />
250 GB = 233 GiB<br />
300 GB = 279 GiB<br />
350 GB = 326 GiB<br />
400 GB = 372 GiB<br />
500 GB = 465 GiB<br />
<br />
= Quellen =<br />
* [http://testberichte.ebay.de/Dateisysteme-bei-Festplatten-ext-und-intern_W0QQugidZ10000000001410035?ssPageName=BUYGD:CAT:-1:LISTINGS:3 Dateisysteme bei Festplatten (ext. und intern)] <br />
* http://forums.hardwarezone.com/showthread.php?s=db2958f6f70a4fb6ff9889bd0f11666a&t=1503519<br />
* [http://de.wikipedia.org/wiki/FAT32#FAT32 FAT32 in der Wikipedia]<br />
* [http://de.wikipedia.org/wiki/NTFS NTFS in der Wikipedia]<br />
* [http://de.wikipedia.org/wiki/Hierarchisches_Dateisystem HFS in der Wikipedia]<br />
<br />
----<br />
<br />
[[USB|zurück zu USB]]<br /><br />
[[Partition|zurück zur Partition]]<br />
[[Category:USB]][[Category:Partitionen]]</div>Robi