ARCH LINUX ColorBoot-HowTo
Copyright © 2003 Dennis Herbrich
Sat Aug 9 14:11:41 2003
Zusammenfassung:
Inhalt
- 1 Was brauche ich alles?
- 2 Wo muss ich ansetzen?
- 3 Wozu dient die /etc/rc.d/functions Datei?
- 4 ANSI Codes
- 5 Ein Beispiel (Ampelfarben)
- 6 Feedback
1 Was brauche ich alles?
Nicht viel. Diesen Leitfaden und gegebenenfalls, wenn Sie nicht selbst Hand anlegen sondern einfach nur bunte Farben haben wollen, den Patch aus Abschnitt 5.1, entweder abgetippt oder aus dem Netz heruntergeladen.
2 Wo muss ich ansetzen?
Die interessante Datei heisst functions und befindet sich im Verzeichnis /etc/rc.d/ zusammen mit den anderen Initialisierungsskripten. Sie ist nur wenige hundert Bytes gross und entsprechend übersichtlich, nichtsdestotrotz sollen Sie aber nicht im Unklaren gelassen werden, was diese Datei überhaupt tut.
3 Wozu dient die /etc/rc.d/functions Datei?
Diese Datei ist eine Art ''Funktionsbibliothek'' für die Systemstartskripte,
und definiert bestimmte Funktionen die bei Aufruf einige wichtige Aufgaben
erfüllen. Unter anderem findet sich hier eben auch die textuelle Darstellung
der Statusmeldungen, so dass hier zentral das Aussehen des Bootvorgangs
angepasst werden kann.
Der Ablauf ist sehr gradlinig; Zuerst wird von einem der Startskripte (z.B.
für den SSH Daemon) die in dieser Datei definierte Funktion mit dem Namen
''stat_busy'' aufgerufen und mit einem kurzen Satz um welchen Daemon es sich
handelt (''Starting Secure Shell Daemon'') versorgt. Die ''stat_busy''
Funktion druckt dann normalerweise eine offene eckige Klammer und den
übergebenen Parameter auf den Bildschirm, gefolgt von einer fies aussehenden
''awk'' Zeile die nichts anderes tut als die richtige Anzahl von Leerzeichen
auf den Bildschirm zu zaubern, da diese ja abhängig von der Länge des
Parameters ist. Als kronenden Abschluss wird dann ein ''BUSY'' und eine
geschlossene eckige Klammer ausgegeben. Je nachdem ob der betroffene Daemon
erfolgreich startete oder nicht wird dann mit Hilfe der ''stat_done'' bzw.
''stat_fail'' Funktion das ausgegebene ''BUSY'' angesprungen und mit neuem Text
überschrieben.
Mit diesem Wissen ist es ein leichtes selbstgewählte Texte oder auch ein komplett anderes Bootlayout einzusetzen. Ein wichtiges Werkzeug dabei ist der ANSI ''Standard'', der leider mehr schlecht als recht standardisiert ist.
4 ANSI Codes
Mit Hilfe von sogenannten ANSI Codes werden seit geraumer Zeit Steuersignale an
''dumme Terminals'' geschickt, die auf diese Weise unabhängig von speziellen
seriellen Leitungen bestimmte Einstellungen übernehmen konnten. ANSI
Steuercodes werden direkt in die Textausgabe eingebaut und grundsätzlich mit
dem (unsichtbaren) ASCII-Code 0x1B (oder auch 033 oktal) eingeleitet, auch
''escape sequence'' genannt, folgend von einer offenen eckigen Klammer und
durch Semikolon abgetrennte Zifferncodes, die das Verhalten des Terminals
beeinflussen. Um die escape sequence einzugeben kann man sich des Kürzels
\e
oder auch \033
bedienen.
Von den hunderten von möglichen Steuercodes interessieren uns in diesem Falle nur die, die zur direkten Manipulation des Bildschirminhalts dienen können, also z.B. Text- und Hintergrundfarbe ändern oder den Cursor zu einer anderen Position verschieben.
4.1 Farben ändern
Sie können eine Hintergrund und eine Vordergrundfarbe aus acht verschiedenen Farben unabhängig voneinander wählen, und die Textfarbe ggf. noch mit der ''Bold'' (Fettschrift) Option intensivieren. Zur Auswahl stehen:
0 -- schwarz 1 -- rot 2 -- gruen 3 -- gelb 4 -- blau 5 -- magenta 6 -- cyan 7 -- weiss 9 -- StandardDer Vordergrundfarbe wird eine ''3'' vorangestellt, der Hintergrundfarbe eine ''4''. Um Fettschrift zu aktivieren muss eine ''1'' als seperater Steuercode mitgeschickt werden. Die gesamte ANSI Sequenz muss dann mit einem ''m'' terminiert werden, und fertig ist das Kommando. Um z.B. ''Hallo'' mit roter Schrift auf weissem Hintergrund zu schreiben und danach die Standardeinstellungen wiederherzustellen muss man dieses Kommando in einer Shell absetzen:
echo -e "\e[31;47mHallo\e[0m"
Wie man sieht wird im ersten Teil nach der escape sequence und der
obligatorischen eckigen Klammer der Code 31 und der Code 47 übermittelt und
die Übermittlung mit dem ''m'' beendet. Danach folgt der normale Text, der
wiederum mit dem Code 0 beendet wird, der alle Einstellungen zurücksetzt.
Beachten Sie unbedingt die ''-e'' Option des echo Befehls, da ohne diese Option
keine Steuerzeichen interpretiert werden!
Zusätzlich zur Fettschrift gibt es noch die Codes 4 (Unterstrichen), 5 (Blinken), 7 (Invertiert) und 8 (Versteckt), die jedoch bei weitem nicht von allen Terminals unterstützt werden. Die Framebuffer-Console scheint zum Beispiel ausser der Unterstreichung und Invertierung nichts weiter zu unterstützen.
4.2 Farbenliste
Um einen besseren Eindruck von der Farbwirkung zu bekommen führen Sie dieses kleine Shellscript aus. Es druckt eine Tabelle aller möglichen Farbkombinationen auf den Bildschirm die sie leicht ablesen und dann verwenden können.
#!/bin/bash # Display ANSI color table # e="\033[" echo -n " _ _ _ _ _40 _ _ _ 41_ _ _ _42 _ _ _ 43" echo "_ _ _ 44_ _ _ _45 _ _ _ 46_ _ _ _47 _" for fg in `seq 30 37`; do line1="$fg " line2=" " for bg in `seq 40 47`; do line1="${line1}${e}${bg};${fg}m Normal ${e}0m" line2="${line2}${e}${bg};${fg};1m Bold ${e}0m" done echo -e "$line1\n$line2" done
4.3 Cursorpositionierung
Die unten stehende Liste habe ich dreist aus dem Bash- Prompt- HOWTO geklaut und übersetzt. Diese Codes werden wie üblich einfach in den Textfluss eingebunden.
- Cursorposition: \033[; H oder \033[; f positioniert den Cursor in Zeile Z und Spalte S - Cursor N Zeilen hoch: \033[A - Cursor N Zeilen runter: \033[ B - Cursor N Spalten nach rechts: \033[ C - Cursor N Spalten nach links: \033[ D - Schirm leeren und Cursor auf (0,0): \033[2J - Alles von aktueller Position bis Zeilenende entfernen \033[K - Cursorposition speichern: \033[s - Cursorposition wiederherstellen: \033[u
5 Ein Beispiel (Ampelfarben)
In diesem Beispiel wird eine simple aber effektvolle Modifikation an der
Bootausgabe vorgenommen; Die ausgegebenen Statusmeldungen wie ''BUSY'',
''DONE'' und ''FAILED'' sollen nicht wie üblich in tristem mausgrau
erscheinen, sondern in gelb, grün und rot. Ampelfarben werden immer wieder
gerne verwendet, darum müssen sie auch hier wieder einmal herhalten.
Als erstes wird in der geöffneten /etc/rc.d/functions Datei direkt zu Beginn eine Hand voll Variablen definiert die die zu benutzenden Farben zentral bestimmen. Die vier Variablen für die drei verschiedenen Stati und der ''normalen'' Textfarbe werden mit den passenden ANSI Codes für Rot, Gelb und Grün (alle fett) und ''Standard'' (normal) belegt.
In der ''stat_busy'' Funktion wird daraufhin als erstes die Textfarbe auf
Normal zurückgestellt, damit nicht irgendwelche Resteinstellungen dazwischen
funken wenn die offene Klammer und der Name des Service angezeigt werden.
Natürlich könnte man auch hier fröhlich mit Farben spielen, aber in diesem
Beispiel halte ich mich etwas zurück. Das abschliessende ''BUSY'' mit
geschlossener eckiger Klammer und den Pufferleerzeichen vorneweg wird dann
aufgespalten, so dass die Leerzeichen und die Klammer definitiv normal
gezeigt werden, und nur das ''BUSY'' selbst die entsprechende Farbe zugewiesen
bekommt. Das verhindert hässliche Leerzeichen falls auch eine
Texthintergrundfarbe eingestellt wurde. Analog wird mit den ''stat_done'' und
''stat_fail'' Funktionen verfahren. Fertig.
5.1 Der Patch zum Beispiel
Der geneigte Leser mit Internetanschluss kann diesen Patch auch von
http://archlinux.veloxis.de/howtos/colorboot/downloads/functions-color.patch
herunterladen und entsprechend der Anleitung in Abschnitt 5.2 auf seinem System anwenden. Zu Referenzzwecken und damit die plain ASCII Leser auch was davon haben gibt es hier den kompletten Patch noch einmal im Klartext, angewandt auf das initscripts 0.5-4 Paket, welches momentan aktuell ist.
--- functions.orig 2003-08-09 06:10:07.000000000 +0200 +++ functions 2003-08-09 06:07:11.000000000 +0200 @@ -3,6 +3,15 @@ # functions # +# ANSI code for failure color (red) +COLOR_FAIL="\033[1;31m" +# ANSI code for busy color (yellow) +COLOR_BUSY="\033[1;33m" +# ANSI code for success color (green) +COLOR_DONE="\033[1;32m" +# ANSI code for default color +COLOR_NORMAL="\033[0;39m" + STAT_COL=68 deltext() { @@ -10,19 +19,26 @@ } stat_busy() { + echo -en "${COLOR_NORMAL}" echo -n "[ $1 " awk "BEGIN { for (j=length(\"$1\"); j<$STAT_COL; j++) printf \" \" }" - echo -n " BUSY ]" + echo -n " " + echo -en "${COLOR_BUSY}BUSY" + echo -en "${COLOR_NORMAL} ]" } stat_done() { deltext - echo " DONE ]" + echo -en "${COLOR_NORMAL} " + echo -en "${COLOR_DONE}DONE" + echo -e "${COLOR_NORMAL} ]" } stat_fail() { deltext - echo " FAILED ]" + echo -en "${COLOR_NORMAL} " + echo -en "${COLOR_FAIL}FAILED" + echo -e "${COLOR_NORMAL} ]" } stat_die() {
5.2 Installation des Patches
Die Anwendung dieses Patches sollte auch einen blutigen Anfänger nicht überfordern. Folgen Sie diesen Schritten:
- Speichern Sie den Patch aus Abschnitt 5.1 in einem erreichbaren Verzeichnis auf ihrer Festplatte
- Erlangen Sie eine Shell mit root-Rechten, z.B. mit ''su'' in einem XTerm
- Wechseln Sie in das Verzeichnis /etc/rc.d
- Führen Sie den Befehl ''patch -p1 -i
'' aus, wobei den vollständigen Pfad des heruntergeladenen oder abgetippten Patches darstellt. - Wenn der Patch fehlerfrei angenommen wurde haben Sie erfolgreich ihre Bootausgabe colorisiert! Herzlichen Glückwunsch!
6 Feedback
Feedback ist natürlich immer erwünscht, auch wenn es sich nur um eine kurze
''Funktioniert bei mir!'' Nachricht handelt. Wenn Sie die Zeit und Lust dazu
haben fortgeschrittenere Features zur Bootkonfiguration mit ANSI zu
dokumentieren sind Sie herzlich dazu eingeladen! Bitte senden Sie jedwedes
Feedback an