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

Mit Portsnap wird der Ports Tree aktualisiert (/usr/ports) über den man die Pakete manuell builden kann.

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=

Den pkg Katalog zu aktualisieren:

pkg update

Port suchen

pkg search SUCHBEGRIFF

Port informationen

Detailinformationen über Installierte Ports aufrufen

pkg info paketname

Detailinformationen über noch nicht installierte Ports

pkg search -f paketname

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 (LOCK)

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.

Liste aller locked Ports

pkg info -ak | grep yes

Hier noch ein Script (Quelle) für einen schöneren Output.

pkg info -ak | grep -w yes | while read line; do packnum=`echo $line | awk '{print $1}'`; pack=`echo $packnum | awk 'BEGIN{FS=OFS="-"}{$NF=""; NF--; print}'` ; printf "%-33s%sn" "$packnum" "locked, run: pkg unlock $pack" ;done

Für einen schnellen Zugriff einfach einen Alias auf den Script machen, z.B.

alias pkglocked='/global/scripts/pkg_show_locked.sh'

so kann der Script zukünftig über den Befehl pkglocked ausgeführt werden.

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

orphaned Ports entfernen mit pkg autoremove

Nicht mehr benötigte Ports (welche ursprünglich als Abhängigkeiten zu anderen Paketen automatisch installiert wurden), lassen sich mit pkg autoremove löschen. Der Befehl listet alle orphaned Ports vor dem löschen auf.

pkg autoremove

Wenn man nur den Output haben möchte, kann man den –dry-run laufen lassen:

pkg autoremove -n

Mit dem Zusatz –yes kannst du alle allfälligen Nachfragen automatisch mit JA bestätigen lassen.

pkg autoremove -y

Wenn nun aber mit autoremove Pakete aufgelistet, die man noch braucht, sollte man diese manuell reinstallieren. Danach verschwinden sie von der autoremove Liste:

$ pkg autoremove -n

Installed packages to be REMOVED:
php56-mysql-5.6.36_1
php56-mysqli-5.6.36_1

Also einfach reinstallieren:

pkg remove php56-mysql-5.6.36_1; pkg install php56-mysql-5.6.36_1
pkg remove php56-mysqli-5.6.36_1; pkg install php56-mysqli-5.6.36_1

Nun erscheinen die Ports nicht mehr in der autoremove Liste.

Platz schaffen mit pkg clean

pkg schreibt temporär Files in das /var/cache/pkg Verzeichnis. Man kann diese entweder manuell direkt im Filesystem löschen oder per Befehl:

pkg clean

Danach hat es wieder Platz im /var/ Verzeichnis 🙂

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:

Inzwischen gibt es einen sql-sasl Port (cyrus-sasl-sql), was alles einfacher macht. Somit braucht man nichts mehr zu locken:

pkg install cyrus-sasl-sql
pkg install cyrus-imapd23
pkg install sendmail+tls+sasl2
# 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

Neuere Port Versionen werden angezeigt, aber nicht installiert.

pkg version -v gibt folgende Info raus:

vim-8.1.0039 < needs updating (index has 8.1.0139)

Wenn ich nun aber ein pkg upgrade mache – oder ein pkg install -f vim, bleibt die Version trotzdem unverändert. Es wird nicht auf Version 8.1.0.139 geupdated.

Das Problem ist hier, dass bei FreeBSD die default Repository seit Version 10.23 auf quarterly lautet und nicht mehr latest. Dies ist jedoch ein Feature und kein Bug! Man hat sich dazu entschieden, dass per default nur Quartalsmässig geupdated werden soll, damit bis dann allfällige Bugs der Ports bis zum upgrade mit grösster Wahrscheinlichkeit behoben sind.

Wenn man trotzdem möchte, dass die latest Versionen installiert werden, kann man das im /etc/pkg/FreeBSD.conf anpassen:

vi /etc/pkg/FreeBSD.conf

Ändere die Zeile

 url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",

in

 url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",

danach mach ein

pkg update
pkg upgrade

nun wird alles auf die neusten Versionen aktualisiert.

.

nach oben