BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

ZFS auf FreeBSD

Seit einiger Zeit ist das neue Dateisystem von Sun, ZFS, in FreeBSD 7-CURRENT verfügbar. Zeit sich mal ein bisschen genauer mit ZFS zu befassen. Folgende Beispiele zeigen, wie man einen Mehrbenutzerserver mit mehreren Festplatten und ZFS aufsetzen kann. Die Beispiele wurden mit dem Mai Snapshot von CURRENT durchgeführt:

# uname -a
FreeBSD test.chruetertee.ch 7.0-CURRENT-200705 FreeBSD 7.0-CURRENT-200705 #0: Mon May 7 11:24:25 UTC 2007
root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386

Damit ZFS verwendet werden kann, muss es in der rc.conf aktiviert und das dazugehörige rc.d-Skript ausgeführt werden. Ist der Eintrag in rc.conf einmal gemacht, wird die ZFS-Unterstützung beim Systemstart aktiviert und die vorhandenen ZFS-Dateisysteme automatisch gemountet.

# echo 'zfs_enable="YES"' >> /etc/rc.conf 
# /etc/rc.d/zfs start

Damit das System mit dem ZFS-Dateisystem umgehen kann, wird automatisch das entsprechende Kernelmodul geladen:

# kldstat
Id Refs Address Size Name
1 4 0xc0400000 7ddc50 kernel
2 1 0xc0bde000 5f5dc acpi.ko
3 1 0xc756d000 92000 zfs.ko

Bei einem Neustart wird man dann immer mit folgender Meldung begrüsst:

WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

Damit man ZFS-Dateisysteme erstellen kann, müssen zuerst die Festplatten, auf denen man ZFS-Dateisysteme verwenden möchte, zu einem ZFS-Pool zusammengefügt werden. Folgender Befehl kreiert einen Pool, in denen die Platten da1 und da2 zur Datensicherheit gespiegelt sind. Der Pool namens tank ist danach im Verzeichnisbaum unter /tank eingehängt.

# zpool create tank mirror da1 da2
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 16.9G 111K 16.9G 0% ONLINE -

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 105M 351M 23% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1d 989M 12K 910M 0% /tmp
/dev/da0s1f 9.2G 116M 8.3G 1% /usr
/dev/da0s1e 1.9G 250K 1.8G 0% /var
tank 17G 0B 17G 0% /tank

# mount
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/da0s1d on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, local, soft-updates)
/dev/da0s1e on /var (ufs, local, soft-updates)
tank on /tank (zfs, local)

Informationen zum Pool erhält man wie folgt:

# zpool status
pool: tank
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0

Zu jeder Zeit können einem Pool weitere Platten hinzugefügt werden. Sind zu einem späteren Zeitpunkt die ZFS-Dateisysteme in einem Pool fast voll, so können dem Pool neue Platten hinzugefügt werden und die sich darin befindenden Dateisysteme sofort den neuen Speicherplatz benutzen. Im folgenden Beispiel werden dem schon bestehenden Pool tank die gespiegelten Platten da3 und da4 hinzugefügt:

# zpool add tank mirror da3 da4
# zpool status -v tank
pool: tank
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0

Ein Pool kann wie folgt entfernt werden. Alle Daten gehen dabei jedoch verloren.

# zpool destroy tank

# zpool status -v tank
cannot open 'tank': no such pool

Folgendes Beispiel erstellt einen Pool, in welchem die Daten auf die Spiegel da1, da2 und da3, da4 verteilt werden.

# zpool create tank mirror da1 da2 mirror da3 da4

Nun kann ein ZFS-Dateisystem innerhalb des Pools erstellt werden. Hier wird das Dateisystem /ports innerhalb vom Pool tank erstellt:

# zfs create tank/ports

In das Dateisystem /ports soll später der Portbaum hinein kommen. Da der Portbaum fast ausschliesslich aus Textdateien besteht, kann eine Komprimierung auf dieses Dateisystem eingeschaltet werden.

# zfs set compression=gzip tank/ports
# zfs get compression tank/ports
NAME PROPERTY VALUE SOURCE
tank/ports compression gzip local

Nun kann das Dateisystem nach /usr/ports gemountet und der Portbaum heruntergeladen werden:

# zfs set mountpoint=/usr/ports tank/ports
# portsnap fetch extract

Jetzt wird ein Dateisystem für die home-Verzeichnisse kreiert. In diesem Dateisystem wird nun ein weiteres für den Benutzer beat erstellt.

# zfs create tank/home
# zfs create tank/home/beat

Für den Benutzer setzen wir nun ein Quota von 1GB fest:

# zfs set quota=1G tank/home/beat

Alle Informationen eines Dateisystems können wie folgt abgefragt werden:

# zfs get all tank/home/beat
NAME PROPERTY VALUE SOURCE
tank/home/beat type filesystem -
tank/home/beat creation Mon May 7 12:42 2007 -
tank/home/beat used 18K -
tank/home/beat available 1024M -
tank/home/beat referenced 18K -
tank/home/beat compressratio 1.00x -
tank/home/beat mounted yes -
tank/home/beat quota 1G local
tank/home/beat reservation none default
tank/home/beat recordsize 128K default
tank/home/beat mountpoint /tank/home/beat default
tank/home/beat sharenfs off default
tank/home/beat checksum on default
tank/home/beat compression off default
tank/home/beat atime on default
tank/home/beat devices on default
tank/home/beat exec on default
tank/home/beat setuid on default
tank/home/beat readonly off default
tank/home/beat jailed off default
tank/home/beat snapdir hidden default
tank/home/beat aclmode groupmask default
tank/home/beat aclinherit secure default
tank/home/beat canmount on default
tank/home/beat shareiscsi off default
tank/home/beat xattr off temporary
tank/home/beat copies 1 default

Nun werden die home-Verzeichnisse nach /usr/home gemountet:

# zfs set mountpoint=/usr/home tank/home

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 105M 351M 23% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1d 989M 12K 910M 0% /tmp
/dev/da0s1f 9.2G 116M 8.3G 1% /usr
/dev/da0s1e 1.9G 310K 1.8G 0% /var
tank 33G 0B 33G 0% /tank
tank/ports 33G 98M 33G 0% /usr/ports
tank/home 33G 0B 33G 0% /usr/home
tank/home/beat 1.0G 128K 1.0G 0% /usr/home/beat

Nun wird versucht, das home-Verzeichnis von beat mit einer zu großen Testdatei zu füllen:

# cd /usr/home/beat/
# dd if=/dev/zero of=bla bs=1M count=2024

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 105M 351M 23% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1d 989M 12K 910M 0% /tmp
/dev/da0s1f 9.2G 116M 8.3G 1% /usr
/dev/da0s1e 1.9G 466K 1.8G 0% /var
tank 32G 128K 32G 0% /tank
tank/ports 32G 98M 32G 0% /usr/ports
tank/home 32G 128K 32G 0% /usr/home
tank/home/beat 1.0G 1.0G 1.5M 100% /usr/home/beat

Das gesetzte Quota verhindet, dass mehr als 1GB Daten in diesem Verzeichnis abgelegt werden. Ist das zuwenig, kann die Quota-Grenze auch erhöht werden:

# zfs set quota=2G tank/home/beat
# df -h | grep beat
tank/home/beat 2.0G 1.0G 2.0G 50% /usr/home/beat

# rm bla
# df -h | grep beat
tank/home/beat 2.0G 128K 2.0G 0% /usr/home/beat

Es lässt sich auch in einem ZFS-Dateisystem Speicherplatz reservieren. Für den Benutzer beat wird nun 1GB Speicherplatz reserviert.

# zfs set reservation=1G tank/home/beat
# zfs get reservation tank/home/beat
NAME PROPERTY VALUE SOURCE
tank/home/beat reservation 1G local

Das home-Verzeichnis von beat ist immer noch gleich gross, in dem darüberliegenden Dateisystemen ist der reservierte Platz nun als besetzt markiert. Der Benutzer beat hat nun also immer mind. 1GB zur Verfügung, egal wieviel Platz andere Benutzer verbrauchen.

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.10G 32.1G 18K /tank
tank/home 1.00G 32.1G 20K /usr/home
tank/home/beat 25.5K 2.00G 25.5K /usr/home/beat
tank/ports 97.8M 32.1G 97.8M /usr/ports

Der reservierte Speicherplatz kann auch wieder aufgehoben werden. In den höherliegenden Dateisystemen wird der Speicherplatz nun wieder freigegeben:

# zfs set reservation=0 tank/home/beat
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 98.0M 33.1G 18K /tank
tank/home 45.5K 33.1G 20K /usr/home
tank/home/beat 25.5K 2.00G 25.5K /usr/home/beat
tank/ports 97.8M 33.1G 97.8M /usr/ports

Nun wird ein weiteres Benutzerverzeichnis erstellt und dieses mit Daten gefüllt:

# zfs create tank/home/andereruser
# dd if=/dev/zero of=/usr/home/andereruser/wichtig count=2000
2000+0 records in
2000+0 records out
1024000 bytes transferred in 0.232209 secs (4409821 bytes/sec)
# pwd
/usr/home/andereruser
# echo "Hallo" > Datei
# ll
total 1027
-rw-r--r-- 1 root wheel 6 May 7 13:08 Datei
-rw-r--r-- 1 root wheel 1024000 May 7 13:07 wichtig

Nun kann ein Snapshot aller Benutzerverzeichnisse gezogen werden. Durch die -r-Option werden auch Snapshots von darunterliegenden Dateissystemen gemacht.

# zfs snapshot -r tank/home@now
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
tank/home@now 0 - 21K -
tank/home/andereruser@now 0 - 1.02M -
tank/home/beat@now 0 - 27.5K -

Nun werden die Daten verändert.

# pwd
/usr/home/andereruser
# rm wichtig
# echo "Hallo2" >> Datei
# echo "Neu" > DateiNeu
# ls -l
total 2
-rw-r--r-- 1 root wheel 13 May 7 13:09 Datei
-rw-r--r-- 1 root wheel 4 May 7 13:09 DateiNeu

Die gezogenen Snapshots sind wie Dateisysteme sichtbar und können auch so genutzt werden.

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 99.0M 33.1G 18K /tank
tank/home 1.09M 33.1G 21K /usr/home
tank/home@now 0 - 21K -
tank/home/andereruser 1.04M 33.1G 20K /usr/home/andereruser
tank/home/andereruser@now 1.02M - 1.02M -
tank/home/beat 27.5K 2.00G 27.5K /usr/home/beat
tank/home/beat@now 0 - 27.5K -
tank/ports 97.8M 33.1G 97.8M /usr/ports

Ein Snapshot kann jederzeit zurückgespielt werden. Dabei werden alle Änderungen, die seit dem Snapshot gemacht wurden, rückgängig gemacht.

# zfs rollback -r tank/home/andereruser@now
# ll
total 1028
-rw-r--r-- 1 root wheel 6 May 7 13:08 Datei
-rw-r--r-- 1 root wheel 1024000 May 7 13:07 wichtig
# cat Datei
Hallo

Benötigt man den Snapshot nicht mehr, kann dieser gelöscht werden.

# zfs destroy -r tank/home@now

Soll eine Festplatte ausgetauscht werden, kann man diese zuerst offline setzten. Danach werden keine Lese- und Schreiboperationen mehr auf das Laufwerk ausgeführt.

# zpool offline tank da4
Bringing device da4 offline

# zpool status
pool: tank
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror DEGRADED 0 0 0
da3 ONLINE 0 0 0
da4 OFFLINE 0 0 0

errors: No known data errors

Nachdem das Laufwerk getauscht wurde, kann dieses wieder aktiviert werden:

# zpool online tank da4
Bringing device da4 online

Das ausgetauschte Laufwerk wird nun mit den Daten des gespiegelten Laufwerks synchronisiert.

# zpool status
pool: tank
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress, 82.43% done, 0h0m to go
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0

errors: No known data errors

Ist das Synchronisieren fertig, kann man nachschauen, ob dabei Fehler aufgetreten sind.

# zpool status
pool: tank
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver completed with 0 errors on Mon May 7 13:32:24 2007
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0

errors: No known data errors

Die ZFS-Pools können auch täglich durch die periodic-Scripte geprüft werden:

# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf

Danach findet man täglich in den daily-Mails den Status aller Pools:

Checking status of zfs pools:
all pools are healthy

Weitere Informationen zu ZFS findet man im Quickstart-Guide, im äusserst ausführlichen ZFS-Handbuch von OpenSolaris und in den Manpages zpool(1) und zfs(1).

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 (3)  Permalink

X.Org 7.2 Upgrade mit portmaster

Seit dem Wochenende ist X.Org 7.2 im Portsbaum vorhanden. In ports/UPDATING wird für die Aktualisierung die Benutzung von portupgrade-devel empfohlen. Das Aktualisieren mit portmaster hat hier jedoch auch mit folgendem Vorgehen auf zwei Systemen funktioniert, allerdings waren auf diesen Systemen kein KDE, Gnome oder Ähnliches installiert. Dieses Vorgehen ist jedoch nicht als eigentliche Anleitung gedacht, sondern eher dazu, eventuelle Probleme, die bei einer angefangenen Aktualisierung mit portmaster entstanden sind, zu beheben. Auf der ports@-Mailingliste wird vor einem Update mit portmaster abgeraten.

Zuerst wird der Portsbaum auf den aktuellsten Stand gebracht:

# portsnap fetch update

Da die neuste Version von portmaster eine abgebrochene Aktualisierungen wiederaufnehmen kann, wurde das Upgrade nicht mit der Version aus den Ports, sondern mit der neusten Version von portmaster gemacht:

# cd /root && fetch http://dougbarton.us/portmaster
# chmod 755 portmaster

Auf Systemen vor 6.2-RELEASE muss noch folgende Zeile in die /etc/make.conf eingefügt werden:

X11BASE=${LOCALBASE}

Da OpenOffice.org nicht neu gebaut werden soll, wurde es zuerst deinstalliert:

# pkg_delete de-openoffice.org\*

Nun kann das Aktualisieren gestartet werden, dazu muss zuerst die XORG_UPGRADE Variable gesetzt werden und danach kann das Update gestartet werden:

# setenv XORG_UPGRADE yes
# /root/portmaster -b -a

Das Upgrade brach hier zwei mal ab. Das erste Mal reichte ein Neustarten von portmaster:

# /root/portmaster -b -a -R

Das zweite Mal liess sich Thunderbird nicht aktualisieren, also wurden Thunderbird und alle davon anhängigen Ports deinstalliert. Dieses Problem wurde jedoch unterdessen im Portsbaum behoben. Nach dem Deinstallieren konnte das Upgrade fortgesetzt werden.

Falls vor dem Update der Meta-Port x11/xorg nicht installiert war, werden evtl. nicht alle benötigten X.Org 7.2 Komponenten installiert. Also muss dieser Port nachträglich installiert werden:

# cd /usr/ports/x11/xorg && make install clean

Nun können alle noch vorhandenen Dateien unter /usr/X11R6 nach /usr/local verschoben werden. Dazu kann ein vorhandenes Skript benutzt werden:

# sh /usr/ports/Tools/scripts/mergebase.sh

Sind Dateien sowohl unter /usr/X11R6 als auch unter /usr/local vorhanden, werden diese angezeigt und diese Konflikte müssen manuell gelöst werden. Danach kann das Skript nochmals gestartet werden.

Anschliessend kann eine neue xorg.conf generiert werden:

# mv /etc/X11/xorg.conf /etc/X11/xorg.conf.69
# Xorg -configure

Nun kann X.Org und die neue Konfiguration getestet werden:

# X -config /root/xorg.conf.new

Startet der X-Server, kann die neu generiert xorg.conf verwendet werden:

# mv /root/xorg.conf.new /etc/X11/xorg.conf

Danach sollte die graphische Oberfläche wieder funktionieren. Nun können OpenOffice.org und die Ports, die sich nicht aktualisieren liessen und deshalb deinstalliert wurden, wieder installiert werden.

Möchte man beim Upgrade allerdings auf Nummer sicher gehen, so sollte man die Anweisungen aus ports/UPDATING befolgen!

UPDATE 28.05.2007: Auf ports@ wurde nun der offizielle Weg des Upgrades mit portmaster vorgestellt: http://marc.info/?l=freebsd-ports&m=118025616904661&w=2

Comments (4)  Permalink

tail auf mehrere Dateien gleichzeitig anwenden

Möchte man ein tail -f gleichzeitig auf mehrere Dateien anwenden, so kann man einfach multitail verwenden. multitail findet man sowohl in den FreeBSD- als auch in den OpenBSD-Ports unter sysutils/multitail:

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

Nun können die verschiedenen Dateien angegeben werden, die man betrachten möchte. Das Terminalfenster wird dann durch die Anzahl der zu betrachtenden Dateien geteilt:

# multitail <Datei1> <Datei2> [<Datei3>] [...]

Betrachtet man Dateien mit multitail, so können durch das Drücken von F1 alle vorhandenen Befehle und ihre Tastenkombinationen angezeigt werden. Durch das Drücken von Q verlässt man multitail.

Sollen mehrere Dateien vereint in einem Fenster angezeigt werden, kann die -I Option von multitail verwendet werden:

# multitail <Datei1> -I <Datei2> [-I <Datei3>] [...]

Nun werden die neuen Einträge der jeweiligen Datei sofort im gemeinsamen Fenster angezeigt.

multitail besitzt noch viele weitere Optionen und Einsatzmöglichkeiten, diese sind ausführlich in der Manpage multitail(1) beschrieben. Auf der Webseite von multitail findet man ausserdem viele Beispiele zur Benutzung von multitail.

 Permalink

Zu einem Windows PPTP Server einen VPN Tunnel aufbauen

Möchte man von einem FreeBSD Client eine VPN-Verbindung zu einem Windows PPTP Server aufbauen, muss der net/pptpclient Port installiert werden:

# cd /usr/ports/net/pptpclient && make install clean

Nun muss der pptpclient konfiguriert werden. Dazu muss die Datei /etc/ppp/ppp.conf mit folgendem Inhalt angepasst werden:

<VERBINDUNGSNAMEN>:
set authname <Benutzernamen>
set authkey <Passwort>
set timeout 0
set ifaddr 0 0
add <Netzadresse>/<Subnetzmaske> HISADDR
alias enable yes

Als Netzadresse und Subnetzmaske werden jene des Netzes angegeben, mit dem man sich verbindet. Da in der Datei der Benutzername und das Passwort gespeichert sind, sollten die Leserechte für alle Benutzer entfernt werden:

# chmod o-r /etc/ppp/ppp.conf

Nun kann man die VPN-Verbindung aufbauen:

# pptp <IP des VPN-Servers> <VERBINDUNGSNAMEN>

Läuft auf dem Rechner, mit dem man die Verbindung herstellen möchte, eine Firewall, so müssen TCP-Verbindungen zu Port 1723 und das GRE-Protokoll erlaubt werden. Benutzt man die IPFW-Firewall, können folgende Regeln zu den bestehenden hinzugefügt werden:

ipfw -q add <Regelnummer> allow tcp from me to <IP des PPTP-Servers> 1723 setup keep-state
ipfw -q add <Regelnummer> allow gre from me to <IP des PPTP-Servers>
ipfw -q add <Regelnummer> allow gre from <IP des PPTP-Servers> to me
 Permalink

Angezeigter Pfad von pwd wenn man Symlinks folgt

Mit pwd(1) wird das Verzeichnis angezeigt, in dem man sich zur Zeit befindet. Folgt man auf FreeBSD einem Symlink, so wird, je nachdem welche Shell man benutzt, von pwd der logische oder der physikalische Pfad angezeigt. In folgendem Beispiel zeigt der Symlink test2 auf das Verzeichnis test1:

# mkdir test1
# ln -s test1 test2
# ls -l
total 2
drwxr-xr-x 2 beat wheel 512 12 Mai 13:48 test1/
lrwxr-xr-x 1 beat wheel 5 12 Mai 13:48 test2@ -> test1

Verwendet man nun die tcsh und folgt dem Symlink ,so wird von pwd der physikalische Pfad angezeigt:

tcsh# cd test2/
tcsh# pwd
/tmp/test1

Möchte man sich den logischen Pfad anzeigen lassen, so verwendet man die -L Option von pwd:

tcsh# pwd -L
/tmp/test2

Verwendet man die Bourne-Shell, so wird von pwd der logische Pfad angezeigt:

sh# cd test2
sh# pwd
/tmp/test2

Soll nun von pwd der physikalische Pfad angezeigt werden, so kann die -P Option von pwd verwendet werden:

sh# pwd -P
/tmp/test1

Die Umgebungsvariable PWD zeigt in beiden Shells immer den logischen Pfad an:

# cd test2
# echo $PWD
/tmp/test2
 Permalink

Verzeichnis mit Unterverzeichnis erstellen

Mit mkdir lassen sich Verzeichnisse anlegen. Möchte man nun ein Verzeichnis mit einem Unterverzeichnis darin anlegen, so wird dies nicht funktionieren.

# mkdir /tmp/test/test2
mkdir: /tmp/test: No such file or directory

Damit alle Verzeichnisse im Pfad erstellt werden, die noch nicht existieren, kann die Option -p verwendet werden.

# mkdir -p /tmp/test/test2

Mit der -m Option vom mkdir können auch gleich die Rechte des neu erstellten Verzeichnisses festgelegt werden:

# mkdir -m 700 test
# ls -l
total 2
drwx------  2 beat  wheel  512  5 Mai 18:03 test/

Kombiniert man die -m und die -p Optionen, so werden nur die Rechte des letzten Unterverzeichnisses durch die -m Option beeinflusst. Alle anderen erstellten Zwischenverzeichnisse haben Standardrechte.

# ls -l
total 0
# mkdir -m 700 -p test/test2
# ls -l
total 2
drwxr-xr-x  3 beat  wheel  512  5 Mai 18:10 test/
# ls -l test/
total 2
drwx------  2 beat  wheel  512  5 Mai 18:10 test2/

mkdir(1) ist natürlich sowohl in FreeBSD als auch in OpenBSD im Basissystem vorhanden.

 Permalink

Festlegen welcher Kernel als nächster gestartet werden soll

Besitzt man ein FreeBSD-System auf welches man keinen direkten oder seriellen Zugriff hat, und möchte beim nächsten Systemstart, aus welchem Grund auch immer, einen anderen Kernel starten, kann man dies mit reboot(8) festlegen. Folgender Befehl fährt das System umgehend herunter und startet mit dem kernel.old-Kernel neu:

# reboot -k kernel.old

Wird das System danach nochmals neu gestartet, so wird wieder der Standard-Kernel geladen.

Möchten man das System neu starten, jedoch keinen anderen Kernel verwenden, so sollte man auf reboot verzichten, da keine Warnung an die Benutzer gesendet und die rc.d-shutdown-Skripte nicht abgearbeitet werden. Stattdessen sollte man zum Herunterfahren oder Neustarten des Systemes shutdown(8) verwenden. Mit shutdown kann der Kernel, der als nächstes gestartet werden soll, nicht festgelegt werden.

 Permalink

Welcher Apache-Prozess beantwortet welche Anfrage

Möchte man herausfinden, welcher Apache2-Prozess welche HTTP-Anfrage beantwortet, so findet man dies in der FreeBSD Ports www/mod_proctitle.

# cd /usr/ports/www/mod_proctitle && make install clean

Danach muss das Apachemodul in der /usr/local/etc/apache2/httpd.conf mit folgendem Eintrag aktiviert werden:

LoadModule proctitle_module libexec/apache2/mod_proctitle.so

Nun muss die Apache-Konfiguration neu geladen werden, so dass das mod_proctitle-Modul aktiviert wird:

# /usr/local/etc/rc.d/apache2.sh reload

Nun kann mit ps(1) herausgefunden werden, welche Anfrage ein Prozess als letztes abgearbeitet hat:

# ps wwaux -U www
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
www 45042 0,0 0,9 40464 17924 ?? SJ 8:54am 0:02,49 www.chruetertee.ch::/blog/archive/2006/12/29/portsopt-version-1-0-erschienen.html (httpd)
www 45078 0,0 0,8 40104 17568 ?? SJ 8:54am 0:02,32 www.chruetertee.ch::/index.php (httpd)
www 45176 0,0 0,8 40104 17568 ?? SJ 8:54am 0:02,52 www.chruetertee.ch::/index.php (httpd)
www 45240 0,0 0,8 39200 16664 ?? SJ 8:54am 0:02,73 www.chruetertee.ch::/favicon.ico (httpd)
www 45270 0,0 0,9 40344 17840 ?? SJ 8:54am 0:02,70 www.chruetertee.ch::/index.php (httpd)
www 49577 0,0 0,8 40092 17544 ?? SJ 8:55am 0:02,43 www.chruetertee.ch::/index.php (httpd)
www 57113 0,0 0,8 39456 16880 ?? SJ 9:00am 0:02,36 www.chruetertee.ch::/inc/bx/php/ResizeImageDynamic.php (httpd)
www 61015 0,0 0,5 32816 9612 ?? SJ 9:07am 0:00,00 /usr/local/sbin/httpd -DSSL

Verbraucht nun ein Apacheprozess übermässig Systemressourcen, kann so herausgefunden werden, welche Anfrage dies verursacht hat.

Comments (4)  Permalink

Ausgabe eines Programmes verzweigen

Möchte man die Ausgabe eines Programmes auf der Standardausgabe anzeigen und gleichzeitig in eine Datei schrieben, so kann man tee(1) einsetzen. Folgender Befehl führt ein make install clean aus, schickt die Ausgabe auf die Standardausgabe und schreibt diese gleichzeitig nach /tmp/make:

# make install clean | tee /tmp/make

Existiert die Datei, in welche man die Ausgabe schreibt, schon, so wird der Inhalt dieser überschrieben. Möchte man die Ausgabe an die Datei anhängen, so dass existierender Inhalt nicht überschrieben wird, verwendet man die -a Option von tee. Sowohl auf FreeBSD als auch auf OpenBSD befindet sich tee im Basissystem.

Comments (1)  Permalink

SVN-Server mit Trac auf FreeBSD installieren

Um einen Subversion-Server, auf welchen man per WebDAV zugreift, und dazu ein Trac auf FreeBSD zu installieren, können das Trac und Subversion aus den Ports installiert werden:

# cd /usr/ports/devel/subversion
# make -DWITH_MOD_DAV_SVN install clean
# cd /usr/ports/www/trac
# make install clean

Nun kann ein Verzeichnis erstellt werden, in dem alle SVN-Repositories gespeichert werden sollen:

# mkdir -p /var/db/svn/repos

Danach kann ein Repository erstellt werden:

# svnadmin create /var/db/svn/repos/<Projektname>

Ist das Repository erstellt, kann eine gewünschte initiale Verzeichnisstruktur dem Repository hinzugefügt werden:

# svn import <Pfad zu initialer Verzeichnisstruktur> file:///var/db/svn/repos/<Projektname> -m "Initial Import"

Nun kann ein Verzeichnis erstellt werden, in dem die Zugriffsberechtigungen für den SVN-Server abgelegt werden:

# mkdir -p /var/db/svn/access

Anschliessend kann eine Passwortdatei mit dem SVN-Benutzer erstellt werden:

# htpasswd -c /var/db/svn/access/users <Benutzer1>

Weitere Benutzer können wie folgt hinzugefügt werden:

# htpasswd  /var/db/svn/access/users <Benutzer2>

Nun kann eine Datei angelegt werden, in der die Lese- und Schreibrechte geregelt werden. Folgende Datei gewährt allen Leserechte und Benutzer1 und Benutzer2 Lese- und Schreibrechte:

# vi /var/db/svn/access/control
[/]
* = r
<Benutzer1> = rw
<Benutzer2> = rw

Die Rechte auf die Benutzerdateien werden nun noch eingeschränkt:

# chmod 600 /var/db/svn/access/*
# chown -R www:www /var/db/svn

Damit über den Apache auf den SVN-Server zugegriffen werden kann, muss der Apache-Server in der rc.conf aktiviert werden:

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

Damit auch über SSL auf den SVN-Server zugegriffen werden kann, muss ein Zertifikat für den Apache erstellt werden.

Nun können die SVN-Einstellungen in der httpd.conf gemacht werden:

# vi /usr/local/etc/apache2/httpd.conf
# SVN WebDAV Repository Setup
<Location /svn>
DAV svn
SVNParentPath /var/db/svn/repos
SVNIndexXSLT "http://<Domain>/svnindex.xsl"

# anonymous first
Satisfy Any
Require valid-user

# authenticating them valid ones
AuthType Basic
AuthName "Subversion Repositories"
AuthUserFile /var/db/svn/access/users
AuthzSVNAccessFile /var/db/svn/access/control
</Location>

<Directory "/usr/local/share/subversion/xslt/">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

Alias /svnindex.xsl "/usr/local/share/subversion/xslt/svnindex.xsl"
Alias /svnindex.css "/usr/local/share/subversion/xslt/svnindex.css"

Nun kann ein Verzeichnis erstellt werden, in dem alle Trac-Instanzen gespeichert werden:

# mkdir -p /var/db/trac

Danach kann ein Trac initialisiert werden:

# trac-admin /var/db/trac/<Projektname> initenv

Dabei müssen verschiedene Fragen beantwortet werden:

Project Name [My Project]> <Projektname>
Database connection string [sqlite:db/trac.db]>[Enter]
Repository type [svn]>[Enter]
Path to repository [/path/to/repos]> /var/db/svn/repos/<Projektname>
Templates directory [/usr/local/share/trac/templates]>[Enter]

Danach kann auch das Trac in der httpd.conf konfiguriert werden:

# vi /usr/local/etc/apache2/httpd.conf
ScriptAlias /cgi-bin/ "/usr/local/share/trac/cgi-bin/"
<Directory "/usr/local/share/trac/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

ScriptAlias /<Projektname> /usr/local/share/trac/cgi-bin/trac.cgi
<Location /<Projektname> >
SetEnv TRAC_ENV "/var/db/trac/<Projektname>"
</Location>

<Location "/<Projektname>/login">
AuthType Basic
AuthName "Guete Morge"
AuthUserFile /var/db/svn/access/users
Require user <Benutzer1> <Benutzer2>
</Location>

Die Rechte für das Trac müssen noch angepasst werden:

# chown -R www:www /var/db/trac

Zu guter Letzt muss der Apache gestartet werden:

# /usr/local/etc/rc.d/apache2.sh start

Der SVN-Server ist nun unter https://<Domain>/svn/<Projektname>/, das Trac unter https://<Domain>/<Projektname>/ erreichbar.

Eine ausführliche Anleitung zu SVN unter FreeBSD findet man unter: http://www.bsdguides.org/guides/freebsd/misc/subversion.php

Vielen Dank an Alain für seine Tipps zur Konfiguration.

Comments (6)  Permalink
Prev Next361-370/521