BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

FreeBSD Installations-CDs erstellen

Mit Hilfe des FreeBSD -Quellcodes lassen sich einfach FreeBSD-Installations-CDs erstellen. So kann man zum Beispiel eine Installations-CD von einem aktuellen CURRENT-Stand erzeugen. Zuerst muss ein release-Verzeichnis erstellt werden, in welche alle zur Erstellung der CDs benötigten Daten geschrieben werden. Hat man die FreeBSD-Quelldateien nicht mit CVS aktualisiert, muss auch noch ein CVS-Verzeichnis erstellt werden, welches aber leer bleibt:

# mkdir /home/beat/cvs /home/beat/release

Nun muss die Welt in /usr/src gebaut werden:

# cd /usr/src
# make buildworld

Nun können aus dem Quellcode die Installationsdateien mit make release in /usr/src/release erstellt werden. Folgende Variable müssen dabei zwingend angegeben werden:

  • CHROOTDIR: Das Verzeichnis, in welchem die Daten installiert werden
  • CVSROOT: Das Verzeichnis, in welchem die mit CVS aktualisieren Quelldateien liegen (kann auch leer sein)

Folgende Variablen können unter anderem noch zusätzlich gesetzt werden:

  • BUILDNAME: Name des Buildes, wird unter anderem auch für den Namen der ISO-Images verwedent
  • EXTSRCDIR: Werden die Quelldateien nicht mit CVS aktualisiert, kann hier ein Verzeichnis angegeben werden, in welchem die Quelldateien vorhanden sind.
  • NO_FLOPPIES: Floppy-Images werden nicht gebaut
  • NODOC: Die FreeBSD-Dokumentation wird nicht gebaut
  • NOPORTS: Es werden keine Ports gebaut und auf die CDs kopiert
  • MAKE_ISOS: Die Installations-CDs werden erstellt
# cd /usr/src/release
# make CHROOTDIR=/home/beat/release CVSROOT=/home/beat/cvs BUILDNAME=CURRENT-SNAP EXTSRCDIR=/usr/src NO_FLOPPIES=YES NODOC=YES NOPORTS=YES MAKE_ISOS=YES release
[...]
Generating MD5 and SHA256 sums...
touch iso.1
Release done
+ LC_ALL=C TZ=GMT date
+ echo >>> make release for i386 finished on Tue Aug 26 00:27:20 GMT 2008
>>> make release for i386 finished on Tue Aug 26 00:27:20 GMT 2008

Danach sind die ISO-Images im release-Verzeichnis unter R/cdrom/ verfügbar.

# ls -l /home/beat/release/R/cdrom/
total 514718
-rw-r--r--   1 root  wheel   35227648 26 Aug 02:26 CURRENT-SNAP-i386-bootonly.iso
-rw-r--r--   1 root  wheel  266092544 26 Aug 02:26 CURRENT-SNAP-i386-disc1.iso
-rw-r--r--   1 root  wheel     372736 26 Aug 02:26 CURRENT-SNAP-i386-disc2.iso
-rw-r--r--   1 root  wheel     372736 26 Aug 02:26 CURRENT-SNAP-i386-disc3.iso
-rw-r--r--   1 root  wheel        349 26 Aug 02:27 CURRENT-SNAP-i386-iso.CHECKSUM.MD5
-rw-r--r--   1 root  wheel        524 26 Aug 02:27 CURRENT-SNAP-i386-iso.CHECKSUM.SHA256
-rw-r--r--   1 root  wheel  224604160 26 Aug 02:26 CURRENT-SNAP-i386-livefs.iso
drwxr-xr-x   3 root  wheel        512 26 Aug 02:26 bootonly/
drwxr-xr-x   4 root  wheel        512 26 Aug 02:26 disc1/
drwxr-xr-x   2 root  wheel        512 26 Aug 02:26 disc2/
drwxr-xr-x   2 root  wheel        512 26 Aug 02:26 disc3/
drwxr-xr-x  17 root  wheel        512 26 Aug 02:26 livefs

Mehr Informationen zu make release und allen vorhanden Variablen findet man in der Manpage release(7).

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

master.passwd mit vipw bearbeiten

Möchte man die /etc/master.passwd manuell bearbeiten, so empfiehlt es sich, dazu vipw zu verwenden. Startet man vipw, wird zuerst die /etc/master.passwd gesperrt. Wird nun vipw parallel nochmals gestartet, so wird ein Fehler ausgegeben:

# vipw 
vipw: the password db file is busy

Ist die master.passwd nicht gesperrt, wird ein Editor gestartet, womit die master.passwd bearbeitet werden kann. Beim Speichern der Datei wird sie auf syntaktische Fehler überprüft:

pwd_mkdb: corrupted entry
pwd_mkdb: at line #34
pwd_mkdb: /etc/pw.nK2GGB: Inappropriate file type or format
re-edit the password file? y

Werden keine Fehler gefunden, wird die Datei abgespeichert, die /etc/passwd generiert und die spwd.db und pwd.db mit Hilfe von pwd_mkdb automatisch erstellt.

Auf FreeBSD ist vipw bereits im Basissystem vorhanden. Mehr Informationen zu vipw findet man in der Manpage vipw(8).

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

Gestartete Prozesse aufzeichnen

Auf FreeBSD können aus Sicherheitsgründen oder zur Kontrolle der Benutzer alle gestarteten Prozesse aufgezeichnet werden. Dazu muss zuerst die entsprechende Logdatei angelegt werden.

# touch /var/account/acct

Nun kann das Aufzeichnen mit Hilfe von accton gestartet werden:

# accton /var/account/acct

Soll das Aufzeichnen bei einem Neustart des Systems automatisch wieder gestartet werden, muss ein entsprechender Eintrag in der /etc/rc.conf gemacht werden:

# echo 'accounting_enable="YES"' >> /etc/rc.conf

Nun können die auf dem System ausgeführten Prozesse mit Hilfe von lastcomm ausgelesen werden. Dabei werden die gebrauchte CPU-Zeit und der Zeitpunkt, an dem der Prozess gestartet wurde, angezeigt:

# lastcomm | head
cron             -F      root             __        0.001 secs Sat Aug 16 14:03
sh               -       beat             __        0.004 secs Sat Aug 16 14:03
sh               -       beat             __        0.007 secs Sat Aug 16 14:03
fetch            -       beat             __        0.008 secs Sat Aug 16 14:03
sh               -       beat             __        0.005 secs Sat Aug 16 14:03
rm               -       beat             __        0.001 secs Sat Aug 16 14:03
sh               -F      beat             __        0.001 secs Sat Aug 16 14:03
awk              -       beat             __        0.002 secs Sat Aug 16 14:03
sh               -F      beat             __        0.000 secs Sat Aug 16 14:03
date             -       beat             __        0.002 secs Sat Aug 16 14:03

Nun kann mit lastcomm auch abgefragt werden, welcher Prozess wann gestartet wurde. Die -S Option zeigt die Startzeit des Prozesses an, die -E Option die Zeit, zu welcher der Prozess beendet wurde:

# lastcomm -SE mysqlcheck
mysqlcheck       -       root             __       Sat Aug 16 04:59 Sat Aug 16 05:03
mysqlcheck       -       root             __       Sat Aug 16 04:27 Sat Aug 16 04:59

Auch können die gestarteten Prozesse eines Benutzers ausgelesen werden:

#  lastcomm beat | head
sh               -       beat             __        0.004 secs Sat Aug 16 14:18
sh               -       beat             __        0.007 secs Sat Aug 16 14:18
fetch            -       beat             __        0.008 secs Sat Aug 16 14:18
sh               -       beat             __        0.005 secs Sat Aug 16 14:18
rm               -       beat             __        0.001 secs Sat Aug 16 14:18
sh               -F      beat             __        0.001 secs Sat Aug 16 14:18
awk              -       beat             __        0.002 secs Sat Aug 16 14:18
sh               -F      beat             __        0.000 secs Sat Aug 16 14:18
date             -       beat             __        0.002 secs Sat Aug 16 14:18
sh               -F      beat             __        0.001 secs Sat Aug 16 14:18

Möchte man in Echtzeit anschauen, welche Prozesse ausgeführt werden, so kann folgender Befehl verwendet werden:

#  tail -f -c 0 /var/account/acct | lastcomm -f -
pt_chown         -       root             __        0.002 secs Sat Aug 16 14:10
csh              -F      beat             ttyp2     0.001 secs Sat Aug 16 14:10
[                -       beat             ttyp2     0.002 secs Sat Aug 16 14:10
sleep            -       root             __        0.001 secs Sat Aug 16 14:08
id               -       root             __        0.002 secs Sat Aug 16 14:10
sh               -F      root             __        0.000 secs Sat Aug 16 14:10
sed              -       root             __        0.002 secs Sat Aug 16 14:10
sh               -F      root             __        0.001 secs Sat Aug 16 14:10
dirname          -       root             __        0.001 secs Sat Aug 16 14:10
realpath         -       root             __        0.002 secs Sat Aug 16 14:10
perl5.8.8        -       root             __        0.197 secs Sat Aug 16 14:10
sh               -       root             __        0.012 secs Sat Aug 16 14:10
sh               -F      root             __        0.001 secs Sat Aug 16 14:10
head             -       root             __        0.002 secs Sat Aug 16 14:10
[...]

Mit Hilfe von sa können nun Statistiken aus den gesammelten Daten erstellt werden. Mit Hilfe der -m Option kann eine Statistik pro Systembenutzer erstellt werden. In der ersten Spalte wird der Benutzername, in der zweiten die Anzahl aufgerufener Befehle, in der dritten Spalte die verbrauchte CPU Zeit in Minuten und in der vierten Spalte die Anzahl I/O Operationen angezeigt. Die letzte Spalte zeigt das "CPU storage Integral" an.

Die Informationen aus /var/account/acct werden regelmässig zusammengefasst und in zwei Dateien namens /var/account/savacct und /var/account/usracct geschrieben. Sollen diese Zusammenfassungen von sa nicht konsultiert werden, kann die -i Option verwendet werden:

# sa -m
root                355295 2469616839080897.00cpu 4680095707762672640tio4716451977516570624k*sec
operator              1320 2444245624632115.00cpu 4619567317775286272tio4673811998809535488k*sec
sshd                    24 2438677375134378.50cpu            0tio4657441095305658368k*sec
smmsp                   46 2433793290438792.50cpu 4621256167635550208tio4663265208397997056k*sec
beat                 55809 2457577981511816.50cpu 4624633867356078080tio4700035557291664384k*sec
guest                  195 2446241946682436.50cpu 4638496509959077888tio4669250949699600384k*sec
nobody                 384         1.32cpu       183408tio       23944k*sec
# sa -mi
root                 26203         8.28cpu       414130tio     1569806k*sec
operator               840         0.05cpu           10tio       53464k*sec
sshd                     6         0.00cpu            0tio         850k*sec
smmsp                   31         0.00cpu           61tio        9326k*sec
beat                 35755         2.30cpu          225tio     2961561k*sec
nobody                 384         1.32cpu       183408tio       23944k*sec

Ruft man sa ohne Optionen auf, werden die Statistiken pro Befehl angezeigt.:

#  sa | head
    6734      10.511re       10.46cp        0avio     6866k   cc1
    1992       7.495re        6.51cp        0avio     2122k   perl5.8.8
    1017       9.142re        4.22cp       16avio     1148k   bsdtar
   46443     484.530re        3.28cp        0avio    14967k   sh
     170      19.333re        3.10cp     3459avio       41k   find
  157832     176.759re        2.12cp        0avio    42037k   sh*
   48233      15.835re        2.03cp        0avio    26532k   sed
      26       2.005re        2.00cp        1avio       44k   perl
     608       2.390re        1.75cp       19avio      760k   mtree

Die erste Spalte zeigt an, wie oft der Befehl ausgeführt wurde, die zweite die Laufzeit in Minuten, die dritte Spalte die totale CPU Zeit in Minuten, die vierte Spalte die durchschnittliche Anzahl I/O Operationen. Möchte man die Liste nach der durchschnittlichen Anzahl I/O Operationen sortiert haben, kann die -d Option verwendet werden. Soll nach totalen CPU-Zeit sortiert werden, verwendet man die -k Option.

Mehr Informationen findet man in den Manpages accton(8), lastcomm(1) und sa(8).

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

Einmalig verwendbare Passwörter benutzen

Auf FreeBSD können zum Anmelden einmalig verwendbare Passwörter mit Hilfe von OPIE benutzt werden. Dazu muss OPIE zuerst auf einem sicheren Kanal mit der -c Option initialisiert werden (am besten auf der Konsole des Rechners). Mit der -s Option kann ein mindestens 5 Zeichen langer Seed (ein zufälliger Initialisierungswert, in folgendem Beispiel abc123) angegeben werden. Während der Initialisierung wird man nach einer mindestend 10 Zeichen langen Passphrase gefragt, welche später zum Generieren der Einweg-Passwörter verwendet werden muss:

# opiepasswd -c -s abc123
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:<Passphrase>
Again new secret pass phrase:<Passphrase>

ID beat OTP key is 499 abc123
BOLO SNOW FOUR SWAT FURY FAY

Das erste generierte Passwort besitzt die Nummer 499. Beim nächsten Anmelden wird man aber nach dem Passwort mit der Nummer 498 gefragt, deshalb muss dieses zuerst abgefragt werden. Dazu übergibt man die Passwort-Nummer und den Seed an opiekey:

# opiekey 498 abc123
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <Passphrase>
FRAU NAIR COCO DRAG SLOB RAFT

Meldet man sich nun zum Beispiel per SSH auf dem Rechner an, wird man nach dem Passwort mit der Nummer 498 gefragt:

# ssh beat@<Rechner>
otp-md5 498 abc123 ext
Password:FRAU NAIR COCO DRAG SLOB RAFT

Es lassen sich auch mehrere Passwörter gleichzeitig generieren. Die Anzahl der Passwörter, welche ausgegeben werden sollen, kann mit der -n Option angegeben werden. Auch muss die Nummer des ersten Passworts, welches generiert werden soll, angegeben werden:

# opiekey -n 5 497 abc123
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <Passphrase>
493: ITEM RUG WORN OLDY FOAL UNIT
494: NINE IVAN DEAD NERO BLUE TAP
495: WEE WADE LOG LAID DANA LAYS
496: FLUB BABE IVAN BURL VAIN HOYT
497: KNOW JOKE ALMA HUED TAIL BIT

Nun können die Passwörter notiert werden. Die Passwortnummern werden bis Null heruntergezählt. Spätestens wenn man bei Null angelangt ist, muss man OPIE neu initialisieren.

Mit Hilfe von opieinfo kann herausgefunden werden, welches Passwort als nächstes verwendet und welcher Seed gebraucht wird.

# opieinfo
497 abc123

Mehr Informationen zu OPIE findet man in der Manpage opiepasswd(1), opiekey(1) und opieinfo(1).

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

ZFS Dateisystem mit mehreren Snapshots replizieren

ZFS Dateisysteme können einfach von einem Pool in einen anderen repliziert werden. Möchte man nun ein ZFS Dateisystem mit mehreren Snapshots in einen anderen Pool replizieren, müsste man jeden Snapshot einzeln replizieren:

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 2.05G 64.9G 18K /tank
tank/home 2.05G 64.9G 2.05G /usr/home
tank/home@now 19K - 1000M -
tank/home@afterupload 19K - 1.95G -
tank/home@aftermodification 0 - 2.05G -
tank2 116K 66.9G 18K /tank2

Um dies zu vereinfachen, kann zfs-replicate installiert werden. zfs-replicate findet man im FreeBSD Portbaum unter sysutils/zfs-replicate:

# cd /usr/ports/sysutils/zfs-replicate && make install clean

Nun muss nur das ZFS Dateisystem angegeben werden, welches repliziert werden soll, und alle Snapshots werden automatisch mit repliziert. Mit der -v Option wird jeweils angezeigt, welche Schritte notwendig sind, um das Dateisystem zu replizieren:

# zfs-replicate -v tank/home tank2
Sending tank/home@now to tank2.
Sending tank/home@afterupload to tank2.
(incremental to tank/home@now.)
Sending tank/home@aftermodification to tank2.
(incremental to tank/home@afterupload.)

Erstellt man nun einen neuen Snapshot und führt zfs-replicate nochmals aus, wird nur der neue Snapshot übertragen:

# zfs snapshot tank/home@tape
# zfs-replicate -v tank/home tank2
Sending tank/home@tape to tank2.
(incremental to tank/home@aftermodification.)

Mehr Informationen zu zfs-replicate findet man auf folgender Webseite: http://blogs.sun.com/constantin/entry/useful_zfs_snapshot_replicator_script

Related Entries:
ZFS-Statistiken anzeigen
ZFS-Installation mit Hilfe von mfsBSD
FreeBSD nur auf ZFS installieren
Alle Änderungen eines ZFS-Pools anzeigen
Automatisch ZFS Snapshots erstellen
Comments (1)  Permalink

ZFS Dateisystem replizieren

Mit Hilfe von ZFS können Daten einfach von einem ZFS-Pool in einen anderen repliziert werden. Im folgenden Beispiel befinden sich Daten im ZFS-Pool tank. Diese sollen in den zweiten Pool tank2 repliziert werden:

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1000M 66.0G 18K /tank
tank/home 1000M 66.0G 1000M /usr/home
tank2 110K 66.9G 18K /tank2

Zuerst muss ein Snapshot der aktuellen Daten erstellt werden:

# zfs snapshot tank/home@now

Danach kann der Snapshot mit zfs send in einen Stream umgewandelt werden. Dieser wird mit zfs receive in den neuen Pool geschrieben. Verwendet man beim zfs receive die -vn Optionen, werden die Daten nicht geschrieben, sondern es wird nur angezeigt, welche Operationen durchgeführt werden würden:

# zfs send tank/home@now | zfs receive -vn tank2/home
would receive full stream of tank/home@now into tank2/home@now

Nun werden die Daten in den neuen Pool repliziert:

# zfs send tank/home@now | zfs receive tank2/home
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1000M 66.0G 18K /tank
tank/home 1000M 66.0G 1000M /usr/home
tank/home@now 0 - 1000M -
tank2 1000M 66.0G 20K /tank2
tank2/home 1000M 66.0G 1000M /tank2/home
tank2/home@now 0 - 1000M -

Ändern sich nun Daten im originalen Pool, kann ein neuer Snapshot erstellt werden:

# dd if=/dev/zero of=/home/beat/test2 bs=10M count=100
# zfs snapshot tank/home@afterupload
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.95G 65.0G 18K /tank
tank/home 1.95G 65.0G 1.95G /usr/home
tank/home@now 19K - 1000M -
tank/home@afterupload 0 - 1.95G -
tank2 1000M 66.0G 20K /tank2
tank2/home 1000M 66.0G 1000M /tank2/home
tank2/home@now 0 - 1000M -

Möchte man nun die Änderungen, welche zwischen den ersten und den zweiten Snapshot auf dem originalen Pool vorgenommen wurden, replizieren, kann mit der -i Option von zfs send der Snapshot angegeben werden, welcher schon repliziert wurde. Danach werden nur die Änderungen übertragen:

# zfs send -i tank/home@now tank/home@afterupload | zfs receive -vn tank2/home
would receive incremental stream of tank/home@afterupload into tank2/home@afterupload
# zfs send -i tank/home@now tank/home@afterupload | zfs receive tank2/home # zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.95G 65.0G 18K /tank
tank/home 1.95G 65.0G 1.95G /usr/home
tank/home@now 19K - 1000M -
tank/home@afterupload 0 - 1.95G -
tank2 1.95G 65.0G 20K /tank2
tank2/home 1.95G 65.0G 1.95G /tank2/home
tank2/home@now 19K - 1000M -
tank2/home@afterupload 0 - 1.95G -

ZFS Dateisysteme können auch zwischen Pools auf verschiedenen Rechnern repliziert werden. Dazu muss sich allerdings root per SSH anmelden können:

# zfs send tank/home@now | ssh root@<Rechner> 'zfs receive tank/home'

Mehr Informationen zu ZFS findet man in der Manpage zfs(8). Eine kleine Einführung in ZFS auf FreeBSD findet man hier: http://www.chruetertee.ch/blog/archive/2007/05/26/zfs-auf-freebsd.html

Related Entries:
ZFS-Statistiken anzeigen
ZFS-Installation mit Hilfe von mfsBSD
FreeBSD nur auf ZFS installieren
Alle Änderungen eines ZFS-Pools anzeigen
Automatisch ZFS Snapshots erstellen
Comments (1)  Permalink

FreeBSD Ports mit Hilfe von porttools erstellen oder aktualisieren

Möchte man einen FreeBSD Port erstellen oder aktualisieren, so können verschiedene Aufgaben mit porttools vereinfacht werden. Zuerst müssen die porttools installiert werden. Diese findet man im FreeBSD Portbaum unter ports-mgmt/porttools:

# cd /usr/ports/ports-mgmt/porttools && make install clean

Ruft man die porttools das erste Mal auf, wird die .porttools Konfigurationsdatei angelegt, und die verfügbaren Module der porttools angezeigt:

# port
===> Generating /home/beat/.porttools configuration file
FreeBSD Port Tools 0.77
Usage:  port <command> [<options>]

Available commands:
commit  - commit a port into the FreeBSD Ports CVS Repository
create  - create new port from template using newfile(1)
diff    - generate diff against original port version
fetch   - fetch distfile(s) of new port version
getpr   - get patch/shar from a PR
help    - display this command summary
install - install a port
submit  - submit Problem Report with new port, or port change/update
test    - test port (build, install, package, deinstall)
upgrade - upgrade a port

In der angelegten ~/.porttools Datei können nun Variablen gesetzt werden, welche von den porttools verwendet werden. Für was die Variablen verwendet werden, findet man in der Manpage porttools(5).

# FreeBSD Port Tools configuration file - see porttools(5)
# vim: ft=sh
EMAIL="beat@chruetertee.ch"
FULLNAME="Beat Gätzi"
ORGANIZATION=""
BUILDROOT="/tmp"
ARCHIVE_DIR=""
DIFF_MODE="CVS"
DIFF_VIEWER="more"
PORTLINT_FLAGS="abct

Um einen neuen Port zu erstellen, wechselt man in das Verzeichnis, in dem man den Port erstellen möchte und erstellt den Port mit Hilfe des create-Modules:

# cd /tmp
# port create portsopt

Es wurde nun ein Verzeichnis für den Port angelegt und eine Vorlage vom Makefile, pkg-descr und der pkg-plist erstellt:

# ls portsopt
Makefile   pkg-descr  pkg-plist

Jetzt können im Makefile die Variablen CATEGORIES, COMMENT, PORTVERSION, und MASTER_SITES gesetzt werden. Gegebenenfalls müssen die restlichen Variablen auch noch gesetzt werden, damit der Quellcode des Ports heruntergeladen werden kann:

# cd portsopt
# cat Makefile 

# New ports collection makefile for:    portsopt
# Date created:         2008-05-03
# Whom:                 Beat Gätzi <beat@chruetertee.ch>
#
# $FreeBSD$
#

PORTNAME=       portsopt
PORTVERSION=    1.4
#PORTREVISION=  0
#PORTEPOCH=     0
CATEGORIES=     ports-mgmt
MASTER_SITES=   http://www.chruetertee.ch/files/download/
#MASTER_SITE_SUBDIR=
#PKGNAMEPREFIX=
#PKGNAMESUFFIX=
#DISTNAME=
#EXTRACT_SUFX=
#DISTFILES=
#DIST_SUBDIR=   ${PORTNAME}
#EXTRACT_ONLY=

MAINTAINER=     beat@chruetertee.ch
COMMENT=        Shows WITH(OUT)-knobs of a port makefile

.include <bsd.port.pre.mk>
.include <bsd.port.post.mk>

Nicht benötigte Variablen können aus dem Makefile entfernt werden. Nun kann mit Hilfe des porttools der Quellcode heruntergeladen werden. Die Prüfsummen des Ports werden automatisch erstellt. Diese müssen noch mit den offiziellen Prüfsummen verglichen werden:

# port fetch
=> portsopt-1.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from http://www.chruetertee.ch/files/download/.
portsopt-1.4.tar.gz                           100% of 1126  B 1348 kBps
# cat distinfo 
MD5 (portsopt-1.4.tar.gz) = 9062b0fa280e98750dc29a13c41617e3
SHA256 (portsopt-1.4.tar.gz) = 845d6518ff2369fc6f17b6fa0299cba6e3251c7d2568b34c78e603d1a3d556f7
SIZE (portsopt-1.4.tar.gz) = 1126

Nun müssen die restlichen Variablen und make-Targets erstellt werden, die zum Bauen des Ports benötigt werden. Damit auch alle installierten Dateien beim Deinstallieren des Portes wieder entfernt werden, müssen alle Dateien in der Datei pkg-plist aufgelistet werden. Welche Dateien alles installiert werden, kann zum Beispiel mit ftrace herausgefunden werden. Werden nur wenige Dateien oder Verzeichnisse erstellt, können diese auch im Makefile unter PLIST_FILES und PLIST_DIRS aufgeführt und die Datei pkg-plist kann gelöscht werden. Wie die pkg-plist aufgebaut ist, findet man im Porters Hanbook. In der Datei pkg-descr muss nun noch eine Beschreibung des Programms erstellt und die URL zur offiziellen Seite des Programms eingefügt werden. Ist der Port fertig, kann er mit port test getestet werden. Der Port wird dabei standardmässig nach /tmp installiert:

# port test
===> Validating port with portlint
WARN: Makefile: only one MASTER_SITE configured.  Consider adding additional mirrors.
0 fatal errors and 1 warning found.
===> flags: PREFIX=/tmp/portsopt-1.4 NO_DEPENDS=yes PKG_DBDIR=/tmp/pkg_db.ud9qtv5I 
===> Cleaning workspace before port test
===>  Cleaning for portsopt-1.4
===>  Extracting for portsopt-1.4
=> MD5 Checksum OK for portsopt-1.4.tar.gz.
=> SHA256 Checksum OK for portsopt-1.4.tar.gz.
===>  Patching for portsopt-1.4
===>  Configuring for portsopt-1.4
===>  Installing for portsopt-1.4
===>   Generating temporary packing list
===>  Checking if ports-mgmt/portsopt already installed
install  -o root -g wheel -m 555 /usr/ports/ports-mgmt/portsopt/work/portsopt-1.4/portsopt /tmp/portsopt-1.4/sbin
===>   Registering installation for portsopt-1.4
===>  Building package for portsopt-1.4
Creating package /usr/ports/packages/All/portsopt-1.4.tbz
Registering depends:.
Creating bzip'd tar ball in '/usr/ports/packages/All/portsopt-1.4.tbz'
===> Checking pkg_info
portsopt-1.4        Shows WITH(OUT)-knobs of a port makefile
===> Checking shared library dependencies
===>  Deinstalling for ports-mgmt/portsopt
===>   Deinstalling portsopt-1.4
===> Extra files and directories check
===> Cleaning up after port test
===>  Cleaning for portsopt-1.4
===>  Removing existing /tmp/portsopt-1.4 dir
===> Done.

Treten beim Testen keine Fehler auf, kann der Port mittels einem Problem Report eingesandt werden. Dazu kann einfach port submit im Port-Verzeichnis eingegeben werden:

# port submit

Nun wird ein Editor mit dem Problem Report geöffnet. Die wichtigsten Teile des Problem Reports sind bereits ausgefüllt. Auch ist der neue Port als shar-Archiv bereits angehängt. Speichert man den Problem Report und schliesst den Editor, wird nachgefragt, was man damit machen möchte. Um den Problem Report abzusenden kann s gedrückt werden:

s)end, e)dit or a)bort? s

Den Problem Report findet man nach einiger Zeit im GNATS und wird danach von einem FreeBSD-Commiter in den Portbaum aufgenommen.

Mit den porttools lassen sich nicht nur Ports erstellen, sondern auch bestehende Ports aktualisieren. Dazu sichert man zuerst den aktuellen Port:

# cd /usr/ports/www
# cp -Rp fluxcms fluxcsm.orig

Nun können alle Änderungen am Port durchgeführt werden. Die Änderungen können danach auch wieder mit port test geprüft werden. Möchte man die gemachen Änderungen anschauen, kann dazu port diff verwendet werden. Hat der originale Port den Suffix .orig, kann dies den porttools mit der -d Option übergeben werden:

# ls -d /usr/ports/www/fluxcms*
/usr/ports/www/fluxcms/      /usr/ports/www/fluxcms.orig/
# cd /usr/ports/www/fluxcms
# port diff -d .orig

Sind alle Änderungen abgeschlossen, können diese wieder mit einem Problem Report eingesandt werden. Auch hier wird der Patch automatisch von den porttools erstellt. Dazu muss auch wieder der Suffix des originalen Portverzeichnisses mit -d übergeben werden. Der Problem Report wird standardmässig als "non-critical" und der Dringlichkeit low eingesandt. Das kann, wenn nötig, mit der -s und der -s Option, zum Beispiel bei einem Sicherheitsupdate ,überschrieben werden. Gültige Werte bei -s sind non-critical, serious oder critical, bei -p low, medium oder high.

# port submit -d .orig

Nun müssen im Editor noch in der Zeile Synopsis der Platzhalter [SUMMARIZE CHANGES] durch einen kleine Beschreibung der Änderung ersetzt werden. Bei Description sollte der Platzhalter [DESCRIBE CHANGES] durch eine ausführlichere Beschreibung der Änderungen ersetzt werden. Beim Beenden des Editors muss das Versenden des Problem Reports wieder bestätigt werden.

Mehr Informationen wie man FreeBSD Ports erstellt oder aktualisiert findet man im FreeBSD Porter's Handbook. Mehr Informationen zu den porttools findet man in der Manpage port(1) .

Vielen Dank an Martin für seine hilfreichen Anregungen beim Erstellen dieses Artikels.

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

ccache in einer Tinderbox verwenden

Kompiliert man Ports in einer Tinderbox mehrere Male, so kann die Zeit die zum Kompilieren benötigt wird, mit Hilfe von ccache reduziert werden. ccache findet man im FreeBSD Portbaum unter devel/ccache:

# cd /usr/ports/devel/ccache && make install clean

Nun muss ein Tarball, mit den für die Tinderbox benötigten Dateien, erstellt werden. Die FreeBSD Version mit welcher ccache gebaut worden ist, sollte mit der Version der Tindebox-Jail, in welcher man ccache verwenden möchte, übereinstimmen da sonst unter Umständen gewisse Bibliotheken nicht gefunden werden:

# cd /tmp
# mkdir opt
# cp /usr/local/bin/ccache opt
# cd opt
# ln -s ccache gcc
# ln -s ccache cc
# ln -s ccache g++
# ln -s ccache c++
# cd ..
# tar cf ccache.tar opt

Nun kann der ccache-Tarball in das Verzeichnis einer Tinderbox-Jail kopiert werden, in welcher man ccache verwenden möchte. Zum Beispiel:

# cp /tmp/ccache.tar /usr/local/tinderbox/jails/6

Danach muss ccache in der Tinderbox aktiviert werden. Mit der -s Option kann festgelegt werden, wieviel Speicherplatz ccache verwenden darf:

# cd /usr/local/tinderbox/scripts && ./tc configCcache -e -c /ccache -s 10G

Die Dateien die ccache nun anlegt, werden unter /usr/local/tinderbox/ccache gespeichert. Mehr Informationen zu ccache findet man in der Manpage ccache(1).

Related Entries:
Tinderbox aufräumen
Wartezeit von tinderd ändern
Quellcode in der Tinderbox speichern
Tinderbox-Jail ohne Kompilieren erstellen
RSS-Feed der zuletzt gebauten Ports einer Tinderbox
 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
Prev Next41-50/125