BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

ZFS in einer FreeBSD Jail verwenden

Auf FreeBSD gibt es die Möglichkeit, innerhalb einer Jail das ZFS Dateisystem zu administrieren. Dazu muss auf dem Hostsystem ZFS aktiviert werden:

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

Nachdem man eine FreeBSD Jail erstellt hat, muss sichergestellt werden, dass die Jail auch auf /dev/zfs zugreifen kann. Dazu kann in der /etc/devfs.rules folgender Eintrag eingefügt werden:

[zfs=10]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'zfs' unhide

Nun müssen bei den Jail-Einträgen der /etc/rc.conf folgende Einträge hinzugefügt werden:

jail_<Jailname>_devfs_enable="YES"
jail_<Jailname>_devfs_ruleset="zfs"

Damit innerhalb der Jail ZFS Dateisysteme gemountet werden können, muss die security.jail.mount_allowed auf 1 gesetzt werden. Durch das Setzen von security.jail.enforce_statfs auf 0 werden alle gemounteten Dateisysteme des Hostsystemes in der Jail sichtbar. Das Setzen beider Werte wird für das Verwenden von ZFS innerhalb einer Jail benötigt, können jedoch die Sicherheit des Systemes heruntersetzen.

# sysctl security.jail.mount_allowed=1
# sysctl security.jail.enforce_statfs=0
# echo security.jail.mount_allowed=1 >> /etc/sysctl.conf
# echo security.jail.enforce_statfs=0 >> /etc/sysctl.conf

Danach kann ein ZFS-Pool erstellt werden. In folgendem Beispiel wird der ZFS-Pool /tank aus /dev/ad0s1e erstellt:

# zpool create tank /dev/ad0s1e
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

Nun wird das ZFS-Dateisystem erstellt, welches man danach der Jail zur Verfügung stellt.

# zfs create tank/jail
# zfs set jailed=on tank/jail

Damit das ZFS-Dateisystem der Jail zugewiesen werden kann, muss die Jail-ID der Jail mit jls(8) herausgefunden werden:

# jls
JID IP Address Hostname Path
1 <IP> <Jail-Name> <Pfad zur Jail>

Nun wird tank/jail der Jail mit der ID 1 zugewiesen:

# zfs jail 1 tank/jail

Danach kann das ZFS Dateisystem innerhalb der Jail administriert werden. Im folgenden Beispiel wird innerhalb der Jail das ZFS-Dateisystem tank/jail/beat erstellt und nach /home/beat gemountet:

jail# zfs create tank/jail/beat
jail# zfs set mountpoint=/home/beat tank/jail/beat

Startet man das Hostsystem neu, wird im Moment das ZFS-Dateisystem nicht automatisch wieder der Jail zugewiesen. Dazu muss die Jail-ID der Jail wieder mit jls bestimmt werden:

# zfs jail <JID> tank/jail

Nun können die ZFS-Dateisysteme innerhalb der Jail gemountet werden.

jail# zfs mount -a

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 Jail ohne kompilieren erstellen

Möchte man eine FreeBSD Jail erstellen, aber nicht wie normalerweise die Jail mit einem make world in /usr/src kompilieren, so kann eine Jail auch mit dem Base-Distributions-Set der FreeBSD Installations CD erstellt werden. Falls für das CD-ROM Laufwerk einen entsprechender Eintrag in der /etc/fstab besteht, kann die Installations CD wie folgt gemountet werden:

# mount /cdrom

Danach kann ins Verzeichnis mit dem Base-Distribution-Set gewechselt werden. In diesem Beispiel wird die FreeBSD 7.0-BETA4 Installations CD verwendet:

# cd /cdrom/7.0-BEAT4/base

Jetzt kann mit der DESTDIR Variable der Pfad gesetzt werden, wo die Jail installiert werden soll. Zum Beispiel in der (t)csh:

# setenv DESTDIR /usr/jail/

Nun wird die Installation gestartet. Dazu muss die Kontrollfrage mit y beantwortet werden:

# ./install.sh
You are about to extract the base distribution into /usr/jail/ -
are you SURE you want to do this over your installed system (y/n) y

Nun kann die Jail ganz normal fertig konfiguriert werden. Dazu muss zuerst das devfs in die Jail gemoutet werden:

# mount -t devfs devfs /usr/jail/dev

Als Nächstes muss man ein Alias mit der Jail-IP Adresse konfigurieren:

# ifconfig <Netzwerkkarte> alias <Jail IP>/32

Danach kann die Jail das erste Mal gestartet werden:

# jail /usr/jail <Jail Hostnamen> <Jail IP> /bin/sh

Jetzt müssen noch einige Konfigurationen in der Jail vorgenommen werden:

# touch /etc/fstab
# echo 'rpcbind_enable="NO"' >> /etc/rc.conf
# echo 'network_interfaces=""' >> /etc/rc.conf
# echo 'sshd_enable="YES"' >> /etc/rc.conf
# echo 'nameserver <DNS Server IP>' >> /etc/resolv.conf
# newaliases

Danach kann noch das root-Passwort, die Zeitzone konfiguriert und Benutzer und Gruppen angelegt werden. Hat man die Jail fertig konfiguriert, verlässt man die Jail:

# exit

Als Letztes wird die Jail vollständig gestartet:

# jail /usr/jail <Jail Hostnamen> <Jail IP> /bin/sh /etc/rc

Soll die Jail bei einem Neustart automatisch gestartet werden, müssen noch die entsprechenden Einträge in der /etc/rc.conf gemacht werden. Mehr Informationen zu den Jails findet man in der Manpage jail(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

FreeBSD auf ZFS installieren

Möchte man FreeBSD auf ZFS installieren, so ist das noch nicht über die Installationsroutine möglich. Unter http://www.ish.com.au/solutions/articles/freebsdzfs findet man ein Anleitung wie man FreeBSD trotzdem auf ZFS installieren kann. Hier eine kleine Zusammenfassung: Um FreeBSD auf ZFS zu installieren, muss man mindestens FreeBSD 7 einsetzen. Man erstellt zuerst mit sysinstall einen Slice über die ganze Festplatte und anschliessend ein Label so, dass die Partition a 512 MB gross ist, und als / gemountet wird. Auch die Swappartition wird bereits erstellt. Im Rest des Slices wird eine Partition gelabelt, welche nicht formatiert und gemountet wird. In / wird dann ein minimal FreeBSD installiert.

Danach wird das installierte System im Single User Mode gestartet und die / Partition schreibend gemountet:

# mount -w / 
Nun kann auf dem freien Speicherplatz ein ZFS-Pool erstellt werden:

# zpool create tank /dev/ad0s1d
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

Danach können die Dateisysteme für /usr, /var und /tmp erstellt werden:

# zfs create tank/usr
# zfs create tank/var
# zfs create tank/tmp

Mit folgendem Eintrag in der /etc/rc.conf wird das ZFS Kernelmodul beim Booten geladen:

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

Nun kann der Inhalt der root-Partition auf das ZFS-Dateisystem verschoben werden:

# find -x / | cpio -pmd /tank
471416 blocks

Da FreeBSD noch nicht von ZFS booten kann, muss die bestehende UFS-Partition als boot-Partition verwendet werden:

# rm -rf /tank/boot
# mkdir /tank/bootdir
# cd /tank
# ln -s bootdir/boot boot

In der /tank/etc/fstab muss nun der Eintrag für die UFS boot-Partition geändert werden:

/dev/ad4s1a  /bootdir        ufs     rw      1       1 

Nun muss in der /boot/loader.conf eingetragen werden, dass das ZFS root-Dateisystem beim Booten geladen werden soll:

# echo 'zfs_load="YES"' >>  /boot/loader.conf
# echo 'vfs.root.mountfrom="zfs:tank"' >> /boot/loader.conf

Zum Schluss müssen noch die ZFS-Mountpoints für /usr, /var und /tmp konfiguriert werden und dabei sichergestellt werden, dass /tank nicht gemountet wird, da dies nun das root-Dateisystem ist:

# zfs set mountpoint=/tmp tank/tmp
# zfs set mountpoint=/usr tank/usr
# zfs set mountpoint=/var tank/var
# zfs set mountpoint=legacy tank

Jetzt sind alle Einstellungen gemacht und FreeBSD kann neu gestartet werden:

# shutdown -r now

Falls man möchte, können nun nicht gebrauchte Dateien aus der UFS boot-Partition gelöscht werden:

# cd /bootdir
# chflags noschg var/empty
# rm -rf usr var tmp COPYRIGHT home compat media mnt proc bin cdrom dev dist etc lib libexec root sbin sys

Mehr Informationen dazu findet man im FreeBSD wiki: http://wiki.freebsd.org/ZFSOnRoot

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

RAM-Disk mit tmpfs auf FreeBSD erstellen

Wollte man bis anhin auf FreeBSD zum Beispiel die /tmp Partition in einer RAM-Disk anlegen, so musste man eine RAM-Disk mit fixer Grösse erstellen.

Seit einiger Zeit ist in FreeBSD 7-CURRENT eine Portierung der NetBSD tmpfs Implementation vorhanden. Somit können Partitionen im Arbeitsspeicher erstellt werden, ohne dass eine feste Grösse vorgegeben werden muss und auch nur der auf der Partition verwendete Platz im Arbeitsspeicher verwendet wird.

Eine RAM-Disk kann wie folgt erstellt werden:

# mount -t tmpfs tmpfs <Mountpunkt>

Möchte man /tmp fest in den Arbeitspeicher auslagern, fügt man folgende Zeile in der /etc/fstab ein:

tmpfs          /tmp        tmpfs   rw,mode=1777    0       0

Wird nun das System neu gestartet oder man mountet /tmp neu, ist /tmp als RAM-Disk vorhanden:

# mount
/dev/ad0s3a on / (ufs, local)
devfs on /dev (devfs, local)
tmpfs on /tmp (tmpfs, local)
/dev/ad0s3f on /usr (ufs, local, soft-updates)
/dev/ad0s3e on /var (ufs, local, soft-updates)
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
Comments (4)  Permalink

FreeBSD als RDP-Client benutzen

Hat man auf einem Windows-Rechner die Remotedesktop-Verbindung freigegeben und man möchte mit einem FreeBSD-Rechner auf diesen zugreifen, so kann man dazu rdesktop benutzen. rdesktop findet man in den FreeBSD Ports:

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

Nun kann eine Verbindung zum Windows-Recher aufgebaut werden:

# rdesktop -z -u <Benutzername> -f <IP-Adresse>

Mit der -z Option werden die RDP-Daten komprimiert und -f startet das Fenster im Vollbildmodus. Alle Optionen von rdesktop findet man in der Manpage rdesktop(1).

 Permalink

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

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

OpenBSD in FreeBSD mit QEMU installieren

Mit QEMU lassen sich nicht nur ISO-Images testen, sondern auch ganze Betriebssysteme installieren. Dazu muss zuerst QEMU installiert werden:

# cd /usr/ports/emulators/qemu && make install clean

Nun kann eine Datei erstellt werden, in die ein Betriebssystem installiert werden soll:

# qemu-img create <Dateiname> <Grösse>

Möchte man zum Beispiel OpenBSD 4.0 in einer 2 GB grossen Datei installieren, so erstellt man diese Datei wie folgt:

# qemu-img create OPENBSD.img 2GB
Formating 'OPENBSD.img', fmt=raw, size=2097152 kB

Nun kann man das OpenBSD cd40.iso Image starten (welches sich auf der OpenBSD-CD befindet oder man im Internet herunterladen kann), um das System zu installieren:

# qemu -hda <Datei in die das System installiert werden soll> -cdrom <Installations ISO Image> -boot d

In diesem Fall zum Beispiel:

# qemu -hda OPENBSD.img -cdrom /cdrom/4.0/i386/cd40.iso -boot d

Sollte das Starten mit folgender Fehlermeldung fehlschlagen,

# qemu -hda OPENBSD.img -cdrom /cdrom/4.0/i386/cd40.iso -boot d
Falscher Systemaufruf(core dumped)

so muss das aio Kernelmodul nachgeladen werden:

# kldload aio

Hat man das KQEMU-Kernelmodul geladen, so hängt QEMU während des Startens von OpenBSD. Also muss das KQEMU Kernelmodul entladen werden:

# kldunload kqemu.ko

Nun startet OpenBSD und kann installiert werden. Konfiguriert man die erkennte Netzwerkkarte mit DHCP, so wird in QEMU automatisch eine IP-Adresse vergeben, mit welcher man auch aus QEMU heraus ins Internet kann, solange der Rechner mit dem Internet verbunden ist. Als Installationsquelle kann danach ftp ausgewählt werden und ein FTP-Server, zum Beispiel mirror.switch.ch, angegeben werden, von welchem die Dateisets heruntergeladen und installiert werden.

Ist die Installation beendet, so kann man OpenBSD in der QEMU herunterfahren und danach das frisch installierte System wie folgt starten:

# qemu -hda OPENBSD.img

Mit QEMU lässt sich nicht nur OpenBSD installieren, sondern auch zum Beispiel NetBSD, Linux oder Windows.

Comments (1)  Permalink

Notizen zur Konfiguration eines Servers mit FreeBSD 6.2

Rechtzeitig zum Erscheinen von FreeBSD 6.2 wurde das PDF mit "Notizen zur Konfiguration eines Servers mit FreeBSD" auf FreeBSD 6.2 aktualisiert. Zudem wurden die Optionen in den Konfigurationsdateien besser dokumentiert sowie die pf-Firewall und gmirror hinzugefügt.
Das PDF kann unter http://www.chruetertee.ch/freebsd/ heruntergeladen werden. Es handelt sich dabei nicht um eine Schritt-für-Schritt Anleitung, sondern mehr um eine Sammlung von Möglichkeiten zur Konfiguration.
Comments (3)  Permalink

Notizen zur Konfiguration eines Servers mit FreeBSD 6.1

Das PDF mit Notizen zur Konfiguration eines Servers mit FreeBSD wurde auf FreeBSD 6.1 aktualisiert. Es kann unter http://www.chruetertee.ch/freebsd/ heruntergeladen werden. Dabei handelt es sich nicht um eine Schritt-für-Schritt Anleitung, sondern mehr um eine Sammlung von Möglichkeiten zur Konfiguration.

 Permalink
Prev Next21-30/48