ARCH LINUX ColorBoot-HowTo

Copyright © 2003 Dennis Herbrich  <dennis@archlinux.org>

Sat Aug 9 14:11:41 2003

Zusammenfassung:

Diese Anleitung erläutert das Vorgehen zur Anpassung des Textes beim Bootvorgang von ARCHLINUX, speziell wie die Statusmeldungen ''BUSY'', ''DONE'' und ''FAILED'' farblich hervorgehoben werden können.


Inhalt

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 -- Standard
Der 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[<Z>;<S>H
      oder
   \033[<Z>;<S>f
   positioniert den Cursor in Zeile Z und Spalte S
 - Cursor N Zeilen hoch:
   \033[<N>A
 - Cursor N Zeilen runter:
   \033[<N>B
 - Cursor N Spalten nach rechts:
   \033[<N>C
 - Cursor N Spalten nach links:
   \033[<N>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:

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 <dennis@archlinux.org>.



Dennis Herbrich 2003-08-09