Updaten: Paket Manager pkgng

Die Installation von Paketen über den Paket Manager geht zwar schnell, kann jedoch auch zu Problemen führen, wenn man vorher alle Ports manuell konfiguriert & installiert hat. Als ich auf pkg umgestellt habe, hab ich danach stundenlang Probleme gefixt, weil PHP-GD, cyrus-imap und noch ein paar andere Dinge nicht mehr wie gewohnt funktioniert hatten.

Fertig kompilierte Pakete sind wie gesagt schnell installiert, die vorkompilierten Konfigurations-Optionen lassen sich jedoch (zur Zeit) nicht mehr ändern. Man muss sich mit dem zufrieden geben, was der Portmaster für angebracht hält. So kann es dann sein, dass cyrus-sasl per default ohne MYSQL Option installiert wird. Und ich frage mich dann stundenlang wieso ich mich nicht mehr einloggen kann & wie ich die Mysql Option aktivieren könnte.

Wenn man also den Paket Manager benutzt, kann man sicherlich die meisten Pakete darüber bedenkenlos installieren, ein paar wenige müssen aber weiterhin über /usr/ports/[…] installiert werden. Damit dann aber beim nächsten pkg upgrade nicht wieder alles überschrieben wird, muss man die custom ports LOCKEN.

Hier nun eine Übersicht mit allen nützlichen Befehlen rund ums Updaten.

Hier gehts zum offiziellen Manual.

 

Ports-Sammlung aktualisieren

portsnap fetch update

Ansonsten kann man das natürlich auch regelmässig einen Cronjob machen, der einem nach dem Update gleich per Email über die geänderten Ports informiert :

/usr/sbin/portsnap cron update > /dev/null 2>&1
/usr/sbin/pkg version -vIL=

Port installieren

pkg install paketname1 paketname2 paketname3

Port reinstallieren

pkg install -f paketname

Ports upgraden

Mit diesen Befehl werden alle Pakete aktualisiert

pkg upgrade 

Einzelner Port upgraden

Ja, für ein Single Upgrade wirklich install und nicht upgrade verwenden 😉

pkg install paketname

Installierte Ports mit Update Informationen anzeigen

pkg version -v

Liste aktueller Ports speichern

Vor der Installation ist es manchmal hilfreich, wenn man ein Backup der vorher installierten Ports gemacht hat. So kann man je nachdem im Nachhinein die fehlenden Ports schnell und einfach erneut installieren. z.B. alle PHP Ports speichert man so:

# pkg info php5\* > ~/installed-php-ports-list

Nach dem Upgrade dann einfach die Liste mit der neuen Liste vergleichen und nachinstallieren, falls nötig.

Port von pkg upgrade ausschliessen

Ports, die man selber kompiliert & manuell über /usr/ports/ installiert, sollte man locken, ansonsten werden sie beim nächsten pkg upgrade einfach überschrieben, was zu einem Totalschaden führen kann.

pkg lock paketname

WICHTIG: Bevor man ein Paket deinstalliert (updated), sollte man es unlocken, deinstallieren, reinstallieren und wieder locken.

Port manuell upgraden

Das, was pkg upgrade wegen lock nicht macht:

# portsnap fetch update
# pkg upgrade
# pkg unlock cyrus-imapd23
# cd /usr/ports/mail/cyrus-imapd23 && make
# make deinstall && make reinstall
# pkg lock cyrus-imapd23

 

Nützliche Tools & Scripts

Auf der Suche nach Lösungen bin ich auf diesen nützlichen Script von confluence.wartungsfenster.de gestossen, der die Options von den Lokal installierten Paketen mit den remote Paketen vergleicht und Warnungen ausgibt: (Script macht einen dry-run. Upgrades werden also keine ausgeführt)

#!/bin/sh
attnonly=n
if [ $# = 1 ] && [ $1 = "-a" ]; then
   attnonly=y
fi
cd /tmp
pkgs=`pkg upgrade -n | grep "options changed" | cut -f1 -d\-`
for pkgname in $pkgs ; do
    err=n
    pkg  query '%Ok %Ov %Od %OD' $pkgname > ${pkgname}.LQ
    pkg rquery '%Ok %Ov %Od %OD' $pkgname > ${pkgname}.RQ
    #echo "---- option diff for $pkgname ----"
    DIFF=`diff ${pkgname}.LQ ${pkgname}.RQ | egrep "^<|^>"`
    BAD=`echo "$DIFF" | grep -v -e DOCS -e EXAMPLES | egrep ">.* off o"`
    if [ $? = 0 ]; then
       echo "---- option diff for $pkgname ----"
       echo "ATTENTION for $pkgname"
       err=y
    fi
    if [ $attnonly = "y" ] && [ $err = "y" ] ; then
        echo "---- option diff for $pkgname ----"
        echo "$BAD"
    fi
    if [ $attnonly = "n" ]; then
        echo "---- option diff for $pkgname ----"
        echo "$DIFF"
    fi
done

 

Fehlermeldungen nach Updates

Imap/Cyrus/SASL/Sendmail: unknown password verifier(s) auxprop

Nach dem Upgrade kamen plötzlich folgende Fehler und die Mails liessen sich nicht mehr checken wegen Login Problem:

Mar  9 16:12:01 corky sm-mta[37112]: sql plugin: no result found
Mar  9 16:12:01 corky last message repeated 2 times
Mar  9 16:17:00 corky sshd[37535]: refused connect from xxx.xx.xxx.xx(xxx.xx.xxx.xx)
Mar  9 16:27:59 corky sm-mta[38563]: unknown password verifier(s) auxprop
Mar  9 16:28:17 corky perl: attempting client step after doneflag
Mar  9 16:28:17 corky last message repeated 2 times
Mar  9 16:29:00 corky sm-mta[38654]: unknown password verifier(s) auxprop

Das Problem lag daran, dass die vorkompilierten Pakete (cyrus-sasl & cyrus-imapd) OHNE Mysql kommen:

# pkg rquery '%Ok %Ov %Od %OD' cyrus-sasl
ALWAYSTRUE off off (null)
ANONYMOUS on on (null)
AUTHDAEMOND on on (null)
BDB off off (null)
BDB1 on on (null)
CRAM on on (null)
DIGEST on on (null)
DOCS on on (null)
GDBM off off (null)
KEEP_DB_OPEN off off (null)
LOGIN on on (null)
MYSQL off off (null)
NTLM on on (null)
OBSOLETE_CRAM_ATTR on on (null)
OTP on on (null)
PGSQL off off (null)
PLAIN on on (null)
SCRAM on on (null)
SQLITE2 off off (null)
SQLITE3 off off (null)

Lösung:

# pkg delete cyrus-imapd23

Installed packages to be REMOVED:
        cyrus-sasl-2.1.26_12
        cyrus-imapd23-2.3.19_1
        cyrus-sasl-saslauthd-2.1.26_3
        cyrus-sasl-gssapi-2.1.26_7
        sendmail+tls+sasl2-8.15.2_1

und manuell installieren:

hierzu ist wichtig, dass im /etc/make.conf mysql aktiviert ist und auf die aktuelle perl version verwiesen wird:

DEFAULT_VERSIONS+=  perl5=5.24  #update 03.05.2017
OPTIONS_SET=MYSQL
cd /usr/ports/mail/cyrus-imapd23/
make install clean

Danach die installieren Ports LOCKEN, damit sie nicht automatisch geupgradet werden:

pkg lock cyrus-imapd23
pkg lock cyrus-sasl

[09-Mar-2016 15:17:01 Europe/Zurich] PHP Warning:  PHP Startup: Unable to load dynamic library ‘/usr/local/lib/php/20131226/gd.so’ – Shared object “libjpeg.so.8” not found, required by “gd.so” in Unknown on line 0

Hier auch wieder nach upgrade passiert:

root@corky(/usr/ports/www)> ldd /usr/local/lib/php/20131226/gd.so 
/usr/local/lib/php/20131226/gd.so:
        libt1.so.5 => /usr/local/lib/libt1.so.5 (0x801265000)
        libX11.so.6 => /usr/local/lib/libX11.so.6 (0x8014c0000)
        libXpm.so.4 => /usr/local/lib/libXpm.so.4 (0x8017f6000)
        libpng16.so.16 => /usr/local/lib/libpng16.so.16 (0x801a07000)
        libz.so.6 => /lib/libz.so.6 (0x801c39000)
        libjpeg.so.8 => not found (0)
        libfreetype.so.6 => /usr/local/lib/libfreetype.so.6 (0x801e4d000)
        libc.so.7 => /lib/libc.so.7 (0x80081b000)
        libm.so.5 => /lib/libm.so.5 (0x8020e6000)
        libxcb.so.1 => /usr/local/lib/libxcb.so.1 (0x802307000)
        librpcsvc.so.5 => /usr/lib/librpcsvc.so.5 (0x802527000)
        libintl.so.8 => /usr/local/lib/libintl.so.8 (0x802730000)
        libbz2.so.4 => /usr/lib/libbz2.so.4 (0x80293b000)
        libXau.so.6 => /usr/local/lib/libXau.so.6 (0x802b4b000)
        libpthread-stubs.so.0 => /usr/local/lib/libpthread-stubs.so.0 (0x802d4d000)
        libXdmcp.so.6 => /usr/local/lib/libXdmcp.so.6 (0x802f4e000)
        libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x803153000)
root@corky(/usr/ports/www)> ldconfig -r | grep jpeg               
        352:-lturbojpeg.0 => /usr/local/lib/libturbojpeg.so.0
root@corky(/usr/ports/www)> pkg shlib libjpeg.so.8
libjpeg.so.8 is provided by the following packages:
jpeg-turbo-1.4.2
libjpeg.so.8 is linked to by the following packages:
tiff-4.0.6_1
jasper-1.900.1_16
gdk-pixbuf2-2.32.3
open-motif-2.3.4_2
libgd-2.1.0_7,1
nagios-3.5.1_9
links-2.9,1
php56-gd-5.6.19

Lösung:

Hier hat das einfache reinstallieren von jpeg gereicht:

pkg install -f jpeg-turbo

Und siehe da…

root@corky(/usr/ports/www)> ldconfig -r | grep jpeg
        352:-lturbojpeg.0 => /usr/local/lib/libturbojpeg.so.0
        353:-ljpeg.8 => /usr/local/lib/libjpeg.so.8

.

Go to Top