BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Kernel und Optionen für nächsten Start konfigurieren

Mit nextboot(8) kann der Kernel festgelegt werden, welcher automatisch beim nächsten Neustart geladen werden soll. So können auch Boot-Optionen dem Kernel übergeben werden. Folgendes Beispiel lädt beim nächsten Neustart den Kernel kernel.old und übergibt dem Kernel die -s Option, damit das System im Single User Mode gestartet wird:

# nextboot -o "-s" -k kernel.old

Möchte man nur den Kernel festlegen, welcher als nächstes gestartet wird, kann dies auch mit reboot gemacht werden.

 Permalink

FreeBSD binär auf eine neue Version aktualisieren

Mit Hilfe von freebsd-update(8) kann man ein FreeBSD System binär aktualisieren. Folgende Anleitung funktioniert allerdings nur, wenn man auf eine Version des gleichen Branches aktualisiert. In diesem Beispiel wird ein FreeBSD 6.1-RELEASE binär auf ein FreeBSD 6.3-RELEASE aktualisiert.

# uname -a
FreeBSD test.chruetertee.ch 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Sun May 7 04:32:43 UTC 2006 root@opus.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386

Zuerst muss freebsd-update heruntergeladen werden. Danach empfiehlt es sich, die Signatur von freebsd-update mit Hilfe von gpg(1) zu überprüfen:

# fetch http://www.daemonology.net/freebsd-update/freebsd-update-upgrade.tgz 
freebsd-update-upgrade.tgz 100% of 21 kB 38 kBps
# fetch http://www.daemonology.net/freebsd-update/freebsd-update-upgrade.tgz.asc
freebsd-update-upgrade.tgz.asc 100% of 187 B 1251 kBps
# gpg --verify freebsd-update-upgrade.tgz.asc freebsd-update-upgrade.tgz
gpg: Signature made Fr 16 Nov 15:01:38 2007 CET using DSA key ID CA6CDFB2
gpg: Good signature from "FreeBSD Security Officer <security-officer@FreeBSD.org>"

Sollte das Verzeichnis /var/db/freebsd-update nicht vorhanden sein, muss es angelegt werden, da sonst das Skript nicht funktioniert:

# sh freebsd-update.sh -f freebsd-update.conf -r 6.3-RELEASE upgrade
freebsd-update.sh: Directory does not exist or is not writable: /var/db/freebsd-update
# mkdir /var/db/freebsd-update

Nun kann das System auf die gewünschte Version aktualisiert werden. freebsd-update analysiert, welche Komponenten installiert sind und aktualisiert werden müssen:

# sh freebsd-update.sh -f freebsd-update.conf -r 6.3-RELEASE upgrade
Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching public key from update1.FreeBSD.org... done.
Fetching metadata signature for 6.1-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/generic world/base

The following components of FreeBSD do not seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/catpages world/dict world/doc world/games world/info
world/manpages world/proflibs

Does this look reasonable (y/n)? y

Fetching metadata signature for 6.3-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 2033 patches.....10....20....30....40....50....60....70....80....90....100....110....120....130....140....150....160....170....180....190....200....210....220....230....240....250....260....270....280....290....300....310....320....330....340....350....360....370....380....390....400....410....420....430....440....450....460....470....480....490....500....510....520....530....540....550....560....570....580....590....600....610....620....630....640....650....660....670....680....690....700....710....720....730....740....750....760....770....780....790....800....810....820....830....840....850....860....870....880....890....900....910....920....930....940....950....960....970....980....990....1000....1010....1020....1030....1040....1050....1060....1070....1080....1090....1100....1110....1120....1130....1140....1150....1160....1170....1180....1190....1200....1210....1220....1230....1240....1250....1260....1270....1280....1290....1300....1310....1320....1330....1340....1350....1360....1370....1380....1390....1400....1410....1420....1430....1440....1450....1460....1470....1480....1490....1500....1510....1520....1530....1540....1550....1560....1570....1580....1590....1600....1610....1620....1630....1640....1650....1660....1670....1680....1690....1700....1710....1720....1730....1740....1750....1760....1770....1780....1790....1800....1810....1820....1830....1840....1850....1860....1870....1880....1890....1900....1910....1920....1930....1940....1950....1960....1970....1980....1990....2000....2010....2020....2030. done.
Applying patches... done.
Fetching 124 files... done.
The following files will be removed as part of updating to 6.3-RELEASE-p1:
/boot/kernel/hptmv.ko
/etc/periodic/weekly/120.clean-kvmdb
/usr/include/c++/3.4/ext/demangle.h
/usr/lib/libpcap.so.4
/usr/lib/libpthread.so.2
[...]
/var/named/etc/namedb/PROTO.localhost-v6.rev
/var/named/etc/namedb/PROTO.localhost.rev
/var/named/etc/namedb/make-localhost
The following files will be added as part of updating to 6.3-RELEASE-p1:
/bin/pgrep
/bin/pkill
/boot/kernel/acpi_dock.ko
/boot/kernel/amdsmb.ko
/boot/kernel/coretemp.ko
/boot/kernel/geom_md.ko
[...]
/usr/share/zoneinfo/Europe/Volgograd
/var/named/etc/namedb/master/empty.db
/var/named/etc/namedb/master/localhost-forward.db
/var/named/etc/namedb/master/localhost-reverse.db
The following files will be updated as part of updating to 6.3-RELEASE-p1:
/COPYRIGHT
/bin/[
/bin/cat
/bin/chflags
/bin/chio
/bin/chmod
[...]
/usr/share/zoneinfo/zone.tab
/var/named/etc/namedb/named.conf
/var/named/etc/namedb/named.root
/var/yp/Makefile.dist

Nun kann der neue Kernel installiert werden:

# sh freebsd-update.sh -f freebsd-update.conf install
Installing updates...
Kernel updates have been installed. Please reboot and run
"freebsd-update.sh install" again to finish installing updates.

Ist der Kernel installiert, muss das System neu gestartet werden:

# shutdown -r now

Nun kann der Rest des Systems aktualisiert werden:

# freebsd-update.sh -f freebsd-update.conf install
Installing updates...
Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "freebsd-update.sh install"
again to finish installing updates.

Danach sollten die Ports neu gebaut werden. Zum Beispiel kann man alle Ports deinstallieren und anschliessend neu bauen. Dazu kann portmaster(8) zur Hilfe genommen werden:

# portmaster -l > ~/installed-port-list
# portsnap fetch update
# portmaster --clean-distfiles-all
# portmaster -Faf
# pkg_delete *

portmaster erstellt eine Liste aller installierten Ports. Möchte man alle diese Ports wieder installieren, nachdem man sie gelöscht hat, so müssen nur die Root- und Leaf-Ports installiert werden. Alle anderen werden automatisch als Abhängigkeit installiert.

# cat ~/installed-port-list
===>>> Root ports (No dependencies, not depended on)
===>>> cciss_vol_status-1.03
===>>> libtool-1.5.24
===>>> poptop-1.3.4_1
===>>> portaudit-0.5.12
===>>> portmaster-2.1
===>>> portsopt-1.4
===>>> rsync-2.6.9_2
===>>> screen-4.0.3_1
===>>> sudo-1.6.9.6
===>>> 9 root ports

===>>> Trunk ports (No dependencies, are depended on)
===>>> autoconf-wrapper-20071109
===>>> expat-2.0.0_1
===>>> libiconv-1.11_1
===>>> m4-1.4.9,1
===>>> mysql-client-5.0.51
===>>> perl-5.8.8_1
===>>> pkg-config-0.22_1
===>>> 7 trunk ports

===>>> Branch ports (Have dependencies, are depended on)
===>>> apache-2.0.63
===>>> gettext-0.16.1_3
===>>> libxml2-2.6.30
===>>> p5-DBD-mysql50-4.005
===>>> p5-DBI-1.60.1
===>>> p5-Storable-2.18
===>>> p5-gettext-1.05_1
===>>> pear-1.6.2_1
===>>> pear-DB-1.7.13,1
===>>> php5-5.2.5
===>>> php5-mysql-5.2.5
===>>> php5-pcre-5.2.5
===>>> php5-session-5.2.5
===>>> php5-xml-5.2.5
===>>> 14 branch ports

===>>> Leaf ports (Have dependencies, not depended on)
===>>> autoconf-2.61_2
===>>> gmake-3.81_2
===>>> help2man-1.36.4_1
===>>> mysql-server-5.0.51
===>>> tinderbox-2.4.2
===>>> vim-lite-7.1.175
===>>> 6 leaf ports

===>>> 36 total installed ports

Nun können noch die alten Libraries gelöscht werden:

# sh freebsd-update.sh -f freebsd-update.conf install
Installing updates... done.

Danach sollte das System nochmals neu gestartet werden:

# shutdown -r now

Nach dem Neustart ist die Aktualisierung abgeschlossen.

# uname -a
FreeBSD test.chruetertee.ch 6.3-RELEASE-p1 FreeBSD 6.3-RELEASE-p1 #0: Wed Feb 13 02:40:56 UTC 2008 root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386
Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 Permalink

UFS-Snapshots verwenden

Mit Hilfe eines Snapshots kann man den Stand eines Dateisystems festhalten. Verwendet man UFS als Dateisystem, so kann mit mount(8) ein Snapshot erzeugt werden. Folgendes Beispiel erzeugt einen Snapshot mit dem Namen snap1 von /var im Verzeichnis /var/.snap:

# mount -u -o snapshot /var/.snap/snap1 /var

Möchte man nun Daten des Snapshots lesen, so kann dieser mit Hilfe von mdconfig(8) und mount ins System eingebunden werden. Werden nun Änderungen am Dateisystem vorgenommen, sind diese im Snapshot nicht sichtbar:

# echo "test" > /var/testdatei
# mount -u -o snapshot /var/.snap/snap1 /var
# mdconfig -a -t vnode -f /var/.snap/snap1  -u 0
WARNING: opening backing store: /var/.snap/snap1 readonly
# mkdir /mnt/snap1
# mount -o ro /dev/md0 /mnt/snap1
# cat /mnt/snap1/testdatei
test
# echo "test2" >> /var/testdatei
# cat /var/testdatei
test
test2
# cat /mnt/snap1/testdatei
test

Vorhandene Snapshots können mit Hilfe von snapinfo(8) gefunden werden:

# snapinfo -a
/var/.snap/snap1

Eine detailliertere Ausgabe erhält man mit der -v Option:

# snapinfo -v -a
/dev/ad0s1a mounted on /
        no snapshots found
/dev/ad0s1d mounted on /tmp
        no snapshots found
/dev/ad0s1f mounted on /usr
        no snapshots found
/dev/ad0s1e mounted on /var
        snapshot /var/.snap/snap1 (inode 172)

Wird der Snapshot nicht mehr benötigt, kann er mit Hilfe vom umount(8), mdconfig und rm(1) aus dem System entfernt und gelöscht werden:

# umount /mnt/snap1
# mdconfig -d -u 0
# rm -f /var/.snap/snap1

Benutzt man ZFS als Dateisystem, stehen auch Shapshots zur Verfügung, diese werden allerdings mit Hilfe von zfs(1) verwaltet.

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 Permalink

Inhalt zweier Verzeichnisse vergleichen

Um den Inhalt zweier Verzeichnisse zu vergleichen kann man DirComp verwenden. DirComp findet man im FreeBSD Portsbaum unter sysutils/dircomp. Falls man die grafische Oberfläche zu DirComp nicht installieren möchte, kann der Port mit WITHOUT_X11 installiert werden:

# cd /usr/ports/sysutils/dircomp && make -DWITHOUT_X11 install clean

Nun können die beiden Verzeichnisse, welche vergleichen werden sollen, an DirComp übergeben werden. Verwendet man die -s Option, so werden auch die Dateien in den Unterverzeichnissen verglichen. Die Ausgabe wird dabei aus Sicht des zweiten übergebenen Verzeichnisses ausgegeben:

# DirComp -s dir1 dir2
DirComp V1.3

Older          : Datei1
Older          : Datei2
Deleted        : Datei3
Younger        : dir/AuchEineDatei
New            : dir/UndNochEine

Verglichen werden dabei die Zeiten zu denen die Datei das letzte Mal verändert wurde. Sollen die Dateien anhand Ihres Inhaltes verglichen werden, kann die -c Option verwendet werden:

# DirComp -c dir1 dir2
DirComp V1.3

Älter          : Datei2
Gelöscht       : Datei3
 Permalink

Zusammenfassung aus sendmail-Logdatei erstellen

Mit Hilfe von mreport lässt sich eine Zusammenfassung aus einer sendmail-Logdatei generieren. mreport findet man in den FreeBSD Ports unter mail/mreport:

# cd /usr/ports/mail/mreport && make install clean

Ruft man mreport ohne Argumente auf, so wird eine Zusammenfassung von /var/log/maillog erstellt:

# mreport
[mailserver.chruetertee.ch] [/var/log/maillog]
* [ 101] 2547567 mail1@cheutertee.ch empfänger1@example.org
[ 22] 3471 mail1@cheutertee.ch empfänger2@example.org
[ 10] 2452 mail2@cheutertee.ch empfänger1@example.org
[ 4] 1152 mail2@cheutertee.ch empfänger2@example.org

=====================
Total Bytes : 2561966
Number of Records : 137
---------------------
Host Name : mailserver.chruetertee.ch
Input File : /var/log/maillog
Output File : stdout
First Record : Mar 9 10:34:37
Last Record : Mar 14 12:30:07
---------------------
Time Taken : 773 µs
=====================
mreport-0.9 by Jason Armstrong

In der ersten Spalte wird angezeigt, wieviele Mails von diesem Absender an den Empfänger gesendet wurden. Die zweite Spalte zeigt die Gesamtgrösse aller Mails in Byte an, danach wird die Absenderadresse und die Empfängeradresse ausgegeben. Mit der -i Option kann ein alternativer Pfad zur sendmail-Logdatei angegeben werden. Verwendet man die -o Option, wird die Ausgabe in eine Datei geschrieben:

# mreport -i /var/log/maillog.archive -o /tmp/mreport.out

Soll nur eine Zusammenfassung für bestimmte Mailadressen generiert werden, kann mit der -p Option ein Teil der Mail-Adresse angegeben werden. Verwendet man die -l Option, so werden nur Adressen, welche das übergebene Argument im Domainnamen haben, in der Statistik berücksichtigt:

# mreport -l test
[mailserver.chruetertee.ch] [/var/log/maillog]

[ 4] 2452 root@test.chreutertee.ch empfänger1@example.org

=====================
Total Bytes : 2452
Number of Records : 1
---------------------
Host Name : mailserver.chruetertee.ch
Input File : /var/log/maillog
Output File : stdout
First Record : Mar 9 10:34:37
Last Record : Mar 14 12:30:07
---------------------
Time Taken : 694 µs
=====================
mreport-0.9 by Jason Armstrong

Mehr Informationen zu mreport findet man in der Manpage mreport(8).

 Permalink

Verzeichnis überwachen und auf Veränderungen reagieren

Mit Hilfe von wait_on kann zum Beispiel mittels eines Shell-Skripts ein Verzeichnis oder eine Datei überwacht und falls neue Dateien in das Verzeichnis geschrieben werden oder die überwachte Datei geändert wird, darauf reagiert werden. wait_on findet man im FreeBSD Portbaum unter sysutils/wait_on:

# cd /usr/ports/sysutils/wait_on && make install clean

Als Argument kann wait_on zum Beispiel ein Verzeichnis übergeben werden. Danach wartet wait_on, bis in diesem Verzeichnis zum Beispiel eine neue Datei gespeichert oder gelöscht wird. Sobald eine solche Änderung erkannt wird, beendet sich wait_on. Anhand des Rückgabewertes von wait_on kann bestimmt werden, was für eine Änderung im Verzeichnis vorgenommen wurde. Verwendet man die -h Option werden zusätzliche Informationen zur Änderung ausgegeben:

# sleep 10 && touch /tmp/test &
# wait_on -h /tmp/
/tmp/: written
# echo $?
2

Die Bedeutungen aller Rückgabewerte sind in der Manpage von wait_on beschrieben.

Nun kann zum Beispiel ein Shell-Skript erstellt werden, welches auf neue Dateien in einem Verzeichnis reagiert.

#!/bin/sh
SOURCE=/var/upload


while :; do
wait_on $SOURCE
....
<Verarbeitet neue Dateien>
...
done

Mehr Informationen zu wait_on findet man in der Manpage wait_on(1).

 Permalink

Text einer Word-Datei auslesen

Mit Hilfe von antiword kann der Text einer Word-Datei ausgelesen und wenn gewünscht in eine Textdatei geschrieben werden. antiword findet man in den FreeBSD Ports unter textproc/antiword:

# cd /usr/ports/textproc/antiword && make install clean

Der Pfad zur Word-Datei muss als Argument an antiword übergeben werden. Der Text wird dann auf der Standardausgabe ausgegeben. Dieser kann wenn gewünscht in eine Textdatei umgelenkt werden:

# antiword <.doc-Datei> > <Text-Datei>

Wird die -f Option verwendet, werden in der Textausgabe fett geschriebene Textpassagen mit *Sternchen*, kursiver Text durch /Slashes/ und unterstrichener Text mit _Unterstrichen_ gekennzeichnet. Verwendet man die -a Option und gibt das gewünschte Papierformat an, wird ein PDF im entsprechenden Format generiert:

# antiword -a a4 <.doc-Datei> > <PDF-Datei>

Möchte man ein PostScript erstellen, kann die -p Option und das gewünschte Papierformat angegeben werden:

# antiword -p a4 <.doc-Datei> > <PS-Datei>
Mehr Informationen zu antiword findet man in der Manpage antiword(1).
 Permalink
1-7/7