- Ports-Sammlung aktualisieren
- Port suchen
- Port informationen
- Port installieren
- Port reinstallieren
- Ports upgraden
- Einzelner Port upgraden
- Installierte Ports mit Update Informationen anzeigen
- Liste aktueller Ports speichern
- Port von pkg upgrade ausschliessen (LOCK)
- Liste aller locked Ports
- Port manuell upgraden
- orphaned Ports entfernen mit pkg autoremove
- Platz schaffen mit pkg clean
- Nützliche Tools & Scripts
- Imap/Cyrus/SASL/Sendmail: unknown password verifier(s) auxprop
- [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
- Neuere Port Versionen werden angezeigt, aber nicht installiert.
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-imapd23Installed packages to be REMOVED:cyrus-sasl-2.1.26_12cyrus-imapd23-2.3.19_1cyrus-sasl-saslauthd-2.1.26_3cyrus-sasl-gssapi-2.1.26_7sendmail+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.2017OPTIONS_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-imapd23pkg 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.
.