Entwicklerhandbuch/Paketbau

Aus Delixs
Zur Navigation springen Zur Suche springen
Uberarbeiten Diese Seite sollte nochmals überarbeitet werden. Eine Begründung befindet sich in der Regel unter Diskussion (oben).


debian Pakete konfigurieren: debconf

Das Einstiegsdokument um das Thema anzugehen, sollte

 man 7 debconf

sein. Diese Manual-Seite ist verfügbar, wenn das Paket "debconf-doc" installiert ist.

 man debconf-devel

beschreibt ausführlich (ca. 13 DIN-A4 Seiten), wie man mit Debconf programmiert. Natürlich in einer shell. Perl Programmierer sollten das Paket "debaux-debconf" nach installieren.

In Debian wird fast alles in Manual-Seiten erklärt. Daher ist das Lesen dieser Seiten für einen Entwickler unerlässlich. Manchmal will man aber eine man-Seite nicht auf dem Schirm lesen, sondern als Papier-Ausdruck neben sich liegen haben. Das geht mit diesem Kommando:

 man -t debconf-devel | lpr -Plp0

Vorausgesetzt, man will die man Seite "debconf-devel" auf den lokalen Drucker (Warteschlange) lp0 drucken. Zwischen dem großen P und dem Drucker-Namen darf kein Leerzeichen sein. Der Drucker muss Postscript können. Aber welcher Druckertreiber unter Linux kann das nicht?

Was ist "Debconf"?

Debconf ist ein Framework das dazu dient, Pakete bzw Programme zu konfigurieren.

Es ist limitiert! Es ist keine Registry wie unter Windows. Debconf soll nur dazu benutzt werden eine sinnvolle Grundkonfiguration der Pakete einzustellen.

Woraus besteht Debconf?

Zunächst mal aus 2 Datenbanken. Eine enthält Fragen, die andere Antworten. Wenn Fragen gestellt werden sollen, muss es auch eine Möglichkeit geben, diese dem Benutzer zu präsentieren, dafür sind die Frontends zuständig. Es gibt diverse Frontends. Bekannt dürfte das "Dialog-Frontend" sein. Mein Favorit ist Gnome, KDE ist auch sehr hübsch.

Jede Frage kann in jedem Frontend dargestellt werden! Für die Frontends Gnome bzw KDE muss nicht zwingend Gnome und KDE installiert sein, eine simple VGA-Grafik mit VESA ist ausreichend.

praktisches Beispiel: Du hast ein installiertes Debian mit X-Window (die ADE reicht aus, auch wenn sie weder Gnome noch KDE hat). Knoppix oder Suse tuts auch. Selbst Windows, wenn denn cygwin installiert ist.

In einem X-Terminal Fenster ( Du bist ein normaler User, nicht root) gibst Du ein:

 xhost +

Das ermöglicht allen lokalen Usern (dies gilt nur für Debian, nicht für andere Linuxe) X-Windows Anwendungen auf Deinem X-Server zu starten.

Um die verschiedenen Frontends zu Testen, gibt man folgendes sein

 su -
 export DISPLAY=:0.0

Das aktuelle Frontend:

 dpkg-reconfigure debconf

Das Dialog Interface. Nennt sich "dialog" ist aber "whiptail" und damit also nicht Aufruf-kompatibel zu "dialog".

 DEBIAN_FRONTEND=dialog dpkg-reconfigure debconf

Die beiden grafischen Frontends

 DEBIAN_FRONTEND=gnome dpkg-reconfigure debconf
 DEBIAN_FRONTEND=kde dpkg-reconfigure debconf

Das Editor Interface mit dem allseits beliebten Editor mcedit:

 DEBIAN_FRONTEND=editor EDITOR=mcedit dpkg-reconfigure debconf

Der mcedit ist im Paket mc enthalten. Im Zweifel also ein

 apt-get install mc

durchführen.


Die Debconf Fragen sind multi-lingual. Wenn man eine Sprache wählen will, muss die Variable LANG angepasst werden, z.B.:

 LANG=C dpkg-reconfigure debconf

oder für russisch, sofern installiert

 LANG=ru dpkg-reconfigure debconf

Verfügbare Sprachen, eigentlich verfügbare Schriften, kann man erfragen mit:

 locale -a

Zurück zu Debconf, ein wichtiges Kommando ist:

 debconf-show

Ohne Parameter gibt es die Aufruf-Syntax auf. Mit

 debconf-show debconf

kann man sich anzeigen lassen, wie das Paket "debconf" konfiguriert ist. Bei mir sieht das so aus:

 debconf-show debconf
 debconf-apt-progress/preparing:
 debconf-apt-progress/title:
 debconf-apt-progress/info:
 debconf-apt-progress/media-change:
 * debconf/frontend: Gnome
 * debconf/priority: medium

In der Antwort-DB von Debconf steht also zu dem Paket "debconf" folgendes drin:

 frontend: Gnome
 priority: medium

In der obigen Ausgabe von debconf-show haben nur zwei von sechs Fragen eine Antwort hinterlegt (die beiden mit dem '*' am Anfang.

Die Debconf Datenbanken sind ASCII DBs und liegen unter /var/cache/debconf. Eine Anfrage an die Antwort-DB mit grep, ergibt dies:

 grep 'debconf/frontend' /var/cache/debconf/config.dat
 Name: debconf/frontend
 Template: debconf/frontend

Wo ist der Wert "Gnome" geblieben? Hier:

 grep -A 1 'debconf/frontend' /var/cache/debconf/config.dat
 Name: debconf/frontend
 Template: debconf/frontend
 Value: Gnome

Er steht im Feld "Value" eine Zeile tiefer.

Dafür gibt es natürlich auch ein Tool,

 debconf-get-selections |grep debconf/frontend
 debconf debconf/frontend        select  Gnome

Die Ausgabe sieht hier etwas anders aus, aber das Resultat ist dasselbe. Die Ausgabe von "debconf-get-selections" ist geeignet, um sie in einer preseed-Datei weiter zu benutzen.

Nicht immer werden alle Fragen, die hinterlegt sind, auch angezeigt. Das wird primär mit dem Schalter "DEBIAN_PRIORITY" gesteuert:

Installieren wir zunächst mal ein Paket, bei dem sich das gut demonstrieren lässt: samba

 apt-get install samba

Nun die Prioritäten testen:

DEBIAN_PRIORITY=high dpkg-reconfigure samba
DEBIAN_PRIORITY=medium dpkg-reconfigure samba
DEBIAN_PRIORITY=low dpkg-reconfigure samba

Um das Samba Paket vollständig zu entfernen muss der --purge Schalter beim "apt-get remove samba" gesetzt werden. Sonst bleiben die Antworten in der Debconf-DB erhalten. Also

apt-get --purge remove samba samba-common

Kann mit

debconf-show samba 

bzw mit

debconf-show samba-common

überprüft werden.

Das "purgen" also das Entfernen der Einträge in der Debconf-DB ist sehr wichtig, wenn man das "preseeding" Testen will.

debconf-show --listowners

zeigt alle installierten Pakete an, die Einträge in der Debconf-DB haben, debconf-show <Paketname> zeigt die Einträge für das Paket an. Hier einige Beispiele:

Die Einstellungen des Installers:

 debconf-show d-i
 debian-installer/language: de
 debian-installer/country: DE
 debian-installer/keymap: de-latin1-nodeadkeys

Die installierten Profiles von simple-cdd:

 debconf-show simple-cdd
 simple-cdd/profiles: ARK45, ARK45_devel, ARK45_CD_build

Die installierten Sprachen:

 debconf-show locales
 * locales/default_environment_locale: de_DE.UTF-8
 * locales/locales_to_be_generated: de_DE ISO-8859-1, de_DE.UTF-8 UTF-8, 
 de_DE@euro ISO-8859-15, en_US ISO-8859-1, en_US.ISO-8859-15 
 ISO-8859-15, en_US.UTF-8 UTF-8

Und um jetzt das vorher genannte Beispiel mit einer russischen GUI zu ermöglichen, muss man hier "ru_RU.UTF-8" zusätzlich auswählen und dann:

 LANG=ru_RU.UTF-8 dpkg-reconfigure debconf

Und schon kann der PC und die Anwendung (Schul-Server) russisch. Bei mir geht das leider nicht so schnell. Das klappt dann, wenn das Template dieser Frage auch russisch enthält.

Die Anworten in der Config.dat, werden immer mit LANG=C abgespeichert, also amerikanisch mit einem 7-bit Zeichensatz.

 debconf-get-selections |grep debconf/frontend
 debconf debconf/frontend        select  Gnome

Wenn diese Ausgabe in einer preseed Datei benutzt wird, wird die dazugehörige Frage nicht mehr angezeigt. Um ein Preseeding zu setzen, aber dem Benutzer trotzdem die Möglichkeit zu geben sich anders zu entscheiden, muss das "seen-Flag" für diese Frage auf false gesetzt werden:

 debconf debconf/frontend        select  Gnome
 debconf debconf/frontend        seen	false


Frontends


Beispiel für eine automatische Installation

Ein Hinweis noch zum leider oft nicht wahrgenommenen

 DEBIAN_FRONTEND=noninteractive

Damit kannst du einen Schwung Pakete ohne Nachfragen installieren. Sofern du vorher die debconf Antworten injiziert hast, verhalten sich die Dienst wie vorgesehen.


 #!/bin/sh
 export DEBIAN_FRONTEND=noninteractive
 SELECTIONFILE=/etc/delixs/package_selection.txt
 # mit dpkg --get-selections erstellt, nur PURGE und INSTALL
 SELECTIONFILELOCAL=/etc/delixs/package_selection.local.txt
 SELECTIONARCHFILE=/etc/delixs/package_selection.${SERVER_ARCH}
 PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
 # Paketliste aktualisieren
 aptitude update
 # Paketauswahl auf minimal zurücksetzen
 dpkg --clear-selections
 # globale Paket-Auswahl einlesen
 dpkg --set-selections < $SELECTIONFILE
 # Architektur Paket-Auswahl einlesen
 test -s $SELECTIONARCHFILE && dpkg --set-selections < $SELECTIONARCHFILE
 # ggf. lokale Paket-Auswahl einlesen
 test -s $SELECTIONFILELOCAL && dpkg --set-selections <
 $SELECTIONFILELOCAL
 # Upgrade durchführen
 apt-get --yes dselect-upgrade
 aptitude dist-upgrade
 # runtergeladene Pakete aufräumen
 aptitude clean

Damit kannst du nach einer Minimalinstallation deine Pakete ins System drücken, ohne dass du eine Nachfrage erhälst.

Stolperfalle: in der globalen Selections dürfen keine Architektur abhängige Pakete stecken, die gehören in die jeweils zu erstellende $SELECTIONARCHFILE. Beispiel dafür: kernel, kernel-module, libc6-$ARCH. Die Variable SERVER_ARCH definiere ich über:

 # Die Architektur abfragen
 [ -x /bin/uname ] && ARCH=$(uname -m) || logger -t delixs "uname\ (Paket: coreutils) fehlt, kein Softwareupdate moeglich."
 case "$ARCH" in
       i686)
               export SERVER_ARCH=i386
       ;;
       x86_64)
               export SERVER_ARCH=amd64
       ;;
       *)
               export SERVER_ARCH=i386
               # das darf nie passieren
               logger -t delixs "Die Architektur stimmt nicht - ueberpreufe das dringend  (${PWD}/$0)"
       ;;
 esac

Evtl. hilft das an der ein oder anderen Stelle weiter. Auch wenn das beim Einsatz von tasks nicht zum Einsatz kommen muss/braucht.

Weblinks

um Scripte in deb-Pakete zu packen:


schon "portierte" CPAN-Module suchen


CPAN-Module nach Deb-Pakete



zurück | Hauptseite