Entwicklerhandbuch/Paketbau: Unterschied zwischen den Versionen
K (hat „Delixs:Entwicklerhandbuch/Paketbau“ nach „Entwicklerhandbuch/Paketbau“ verschoben) |
|||
(3 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
__NOTOC__ | __NOTOC__ | ||
{{ | {{EditStatus|1|ThorstenStrusch}} | ||
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 == | ||
Zeile 257: | Zeile 261: | ||
Ein Hinweis noch zum leider oft nicht wahrgenommenen | Ein Hinweis noch zum leider oft nicht wahrgenommenen | ||
<source lang=bash> | |||
DEBIAN_FRONTEND=noninteractive | DEBIAN_FRONTEND=noninteractive | ||
</source> | |||
Damit kannst du einen Schwung Pakete ohne Nachfragen | Damit kannst du einen Schwung Pakete ohne Nachfragen | ||
installieren. Sofern du vorher die debconf Antworten | installieren. Sofern du vorher die debconf Antworten | ||
injiziert hast, verhalten sich die Dienst wie vorgesehen. | injiziert hast, verhalten sich die Dienst wie vorgesehen. | ||
<source lang=bash> | |||
#!/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 | |||
aptitude --yes dselect-upgrade | |||
aptitude dist-upgrade | |||
# runtergeladene Pakete aufräumen | |||
aptitude clean | |||
</source> | |||
Damit kannst du nach einer Minimalinstallation deine Pakete | Damit kannst du nach einer Minimalinstallation deine Pakete | ||
ins System drücken, ohne dass du eine Nachfrage erhälst. | ins System drücken, ohne dass du eine Nachfrage erhälst. | ||
Zeile 294: | Zeile 299: | ||
abhängige Pakete stecken, die gehören in die jeweils zu erstellende | abhängige Pakete stecken, die gehören in die jeweils zu erstellende | ||
$SELECTIONARCHFILE. Beispiel dafür: kernel, kernel-module, libc6-$ARCH. | $SELECTIONARCHFILE. Beispiel dafür: kernel, kernel-module, libc6-$ARCH. | ||
Die Variable SERVER_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) | |||
# Die Architektur | Hier die Variante über das installierte System: | ||
<source lang="bash"> | |||
#!/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." | [ -x /bin/uname ] && ARCH=$(uname -m) || logger -t delixs "uname\ (Paket: coreutils) fehlt, kein Softwareupdate moeglich." | ||
case "$ARCH" in | case "$ARCH" in | ||
Zeile 311: | Zeile 337: | ||
;; | ;; | ||
esac | 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. | Evtl. hilft das an der ein oder anderen Stelle weiter. Auch wenn das beim Einsatz von tasks nicht zum Einsatz kommen muss/braucht. | ||
Zeile 335: | Zeile 362: | ||
---- | ---- | ||
<div align="right">[[Delixs:Entwicklerhandbuch|zurück]] | [[Hauptseite]]</div> | <div align="right">[[Delixs:Entwicklerhandbuch|zurück]] | [[Hauptseite]]</div> | ||
[[Kategorie:Entwicklerhinweise]] |
Aktuelle Version vom 22. März 2011, 14:02 Uhr
Diese Seite ist momentan eine Baustelle im Zustand: 1
-
0
-
1
-
2
-
3
-
4
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>
- !/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
aptitude --yes dselect-upgrade aptitude dist-upgrade
- 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">
- !/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
- 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