Entwicklerhandbuch/Paketbau: Unterschied zwischen den Versionen

Aus Delixs
Zur Navigation springen Zur Suche springen
(→‎Beispiel für eine automatische Installation: syntax der Scripte auf bash gesetzt)
(→‎debian Pakete konfigurieren: debconf: manpage -> pdf hinzugefügt)
Zeile 31: Zeile 31:
Drucker-Namen darf kein Leerzeichen sein. Der Drucker muss Postscript  
Drucker-Namen darf kein Leerzeichen sein. Der Drucker muss Postscript  
können. Aber welcher Druckertreiber unter Linux kann das nicht?
können. Aber welcher Druckertreiber unter Linux kann das nicht?
Wer lieber ein PDF Dokument erhalten möchte, kann dies mit dem tool ps2pdf (debian-Paket gs-common) erzeugen:
  man -t debconf-devel | ps2pdf - debconfdevel.pdf


=== Was ist "Debconf"? ===
=== Was ist "Debconf"? ===
Zeile 251: Zeile 256:


* [[Delixs:Entwicklerhandbuch/Debconf/Frontends|Frontends für Debconf]]
* [[Delixs:Entwicklerhandbuch/Debconf/Frontends|Frontends für Debconf]]


== Beispiel für eine automatische Installation ==
== Beispiel für eine automatische Installation ==

Version vom 8. Februar 2010, 05:12 Uhr

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?

Wer lieber ein PDF Dokument erhalten möchte, kann dies mit dem tool ps2pdf (debian-Paket gs-common) erzeugen:

 man -t debconf-devel | ps2pdf - debconfdevel.pdf


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

 aptitude 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

 aptitude 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 "aptitude remove samba" gesetzt werden. Sonst bleiben die Antworten in der Debconf-DB erhalten. Also

aptitude --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

<source lang=bash>

 DEBIAN_FRONTEND=noninteractive

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

<source lang=bash>

  1. !/bin/sh

export DEBIAN_FRONTEND=noninteractive SELECTIONFILE=/etc/delixs/package_selection.txt

  1. 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

  1. Paketliste aktualisieren

aptitude update

  1. Paketauswahl auf minimal zurücksetzen

dpkg --clear-selections

  1. globale Paket-Auswahl einlesen

dpkg --set-selections < $SELECTIONFILE

  1. Architektur Paket-Auswahl einlesen

test -s $SELECTIONARCHFILE && dpkg --set-selections < $SELECTIONARCHFILE

  1. ggf. lokale Paket-Auswahl einlesen

test -s $SELECTIONFILELOCAL && dpkg --set-selections < $SELECTIONFILELOCAL

  1. Upgrade durchführen

aptitude --yes dselect-upgrade aptitude dist-upgrade

  1. runtergeladene Pakete aufräumen

aptitude clean </source> 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 kann ich auf zwei Arten abfragen - entweder über den installierten kernel, oder über die Architektur des installierten Systems. Beide müssen nicht übereinstimmen. (ein amd64 kernel vertrgät sich mit einem i386er Userland)

Hier die Variante über das installierte System: <source lang="bash">

  1. !/bin/sh

ARCH=$(dpkg --print-architecture) case "$ARCH" in

 amd64)
   export SERVER_ARCH=amd64
 ;;
 i386)
   export SERVER_ARCH=i386
 ;;
 *)
   export SERVER_ARCH=
   # das darf nie passieren
   logger "Die Architektur ist unbekannt (${PWD}/$0)"
 ;;

esac echo $SERVER_ARCH </source> Hier die Variante über den laufenden kernel: <source lang="bash">

 [ -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

</source>

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