Entwicklerhandbuch/Paketbau
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
- http://service.gmx.net/de/cgi/derefer?TYPE=3&DEST=http%3A%2F%2Fwww.blogator.de%2F2007%2F08%2F10%2Fperl-module-als-debian-paket-bauen%2F
- http://it.biologie.uni-muenchen.de/itg/knowhow/msg00028.html