====== Allgemein ======
ZFS ist ein modernes Dateisystem welches gegenüber UFS einige Vorteile bietet. Einige Dieser Vorteile sind:
*Instant Snapshots (für Backups)
*Ein integrierter LVM
*Integrierte Quotas
*Komprimierung einzelner Dateisysteme
*Verschiedene RAID-Levels (Mirror, RAID-Z).
Als Nachteile sind zu werten:
*Etwas komplexeres Handling
*Derzeit nur von manuell zu erstellen (Keine Installeroption)
*Ressourcenhungrig (64Bit und "ausreichend" RAM sollten vorhanden sein).
====== Voraussetzung ======
Es wird hier davon ausgegangen, dass ein vorhandenes System welches mit UFS partitioniert wurde in ein reines ZFS-System umgewandelt wird. Damit das Vorgehen ohne Datenverlust durchführbar ist muss eine von zwei Vorraussetzungen erfüllt sein.
-Es liegen zwei Festplatten vor
-Es liegt ein Komplettbackup des Systems vor.
Im Weiteren wird davon ausgegangen, dass zwei Festplatten gleicher Größe vorliegen. Auf Festplatte //ada0// liegt das aktuelle System und //ada1// wird neu mit ZFS angelegt. Zum Ende wird //ada0// zusammen zu //ada1// in ein zmirror (also ein RAID1-Verband in ZFS) überführt.
====== Partitionen anlegen ======
Zunächst wird die 2. Festplatte //ada1// partitioniert. Sie erhält einen Bootsector um später das System starten zu können und eine 8GB große Swap-Partition für Auslagerungen. Der Rest der Festplatte wird für das ZFS zur Verfügung gestellt.
# gpart create -s gpt ada1
# gpart add -b 34 -s 128k -t freebsd-boot ada1
# gpart add -s 8G -a 1m -t freebsd-swap -l swap1 ada1
# gpart add -a 1m -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
====== Module laden ======
Bevor mit ZFS gearbeitet werden kann müssen die hierfür nötigen Kernelmodule geladen werden.
# kldload opensolaris
# kldload zfs
====== ZFS anlegen ======
Im nächsten Schritt wird der **zpool** angelegt und die ZFS-Datasets (die ZFS-Partitionen) angelegt. Zunächst wird mittels des ashift-Werts eine Sektorgröße von mindestens 4K-Blöcken erzwungen.
# sysctl vfs.zfs.min_auto_ashift=12
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot /dev/gpt/disk1
# zpool set bootfs=zroot zroot
# zfs set checksum=fletcher4 zroot
# zfs create zroot/usr
# zfs create zroot/usr/home
# zfs create zroot/usr/home/user1
# zfs create zroot/usr/jails
# zfs create zroot/usr/local
# zfs create zroot/var
# zfs create -o setuid=off zroot/usr/ports
# zfs create -o exec=on -o setuid=off zroot/tmp
# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/usr/src
====== Anpassungen ======
Das Verzeichnis ///tmp// benötigt besondere Rechte damit jeder Nutzer darin seine temorären Daten ablegen kann.
# chmod 1777 /mnt/tmp
====== Daten einspielen ======
Nachdem das Dateisystem komplett angelegt ist können die Daten der alten Festplatte //ada0// eingespielt werden. Dies muss für jede Partition auf //ada0// die übernommen werden soll durchgeführt. Im Beispiel hier ist unter //ada0p1// das root-Verzeichnis ///// abgelegt und unter //ada0p3// das Verzeichnis ///usr//.
Alternativ kann an dieser Stelle ein bestehendes Backup eingespielt werden.
# cd /mnt
# dump 0Laf - /dev/ada0p1 | restore rf -
# cd /mnt/usr
# dump 0Laf - /dev/ada0p3 | restore rf -
...
====== Nachbereitung ======
Das neue System muss nun noch angepasst werden. Zunächst wird der ZFS-Cache in das neue System kopiert damit das zpool überhaupt eingebunden werden kann.
Als nächstes werden in //rc.conf// und //loader.conf// die zfs-optionen gesetzt damit das Kernelmodul geladen wird und alle fehlenden Partitionen eingebunden werden.
Abschliessend wird in der //loader.conf// noch das zu bootende Root-Dateisystem gesetzt. In diesem Fall ist das der zpool.
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf
In ///mnt/etc/fstab// alle Mountpoints löschen oder auskommentieren und folgende Zeile für den Swap ergänzen:
/dev/gpt/swap1 none swap sw 0 0
====== Reboot ======
Nun kann in das neue ZFS-System gebootet werden um zu testen ob alles funktioniert.
====== Mirror erzeugen ======
Wenn alle Daten von //ada0// sicher auf //ada1// übertragen wurden kann die Platte in einen Spiegel aufgenommen werden. Hierbei gehen alle auf //ada0// vorhandenen Daten verloren!!
Zunächst wird die Festplatte identisch zur ersten partitioniert:
# gpart create -s gpt ada0
# gpart add -b 34 -s 128k -a 1m -t freebsd-boot ada0
# gpart add -s 8G -a 1m -t freebsd-swap -l swap0 ada0
# gpart add -a 1m -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
Anschließend wird die Festplatte zum //zroot// hinzugefügt. Wird dies mit dem Befehl **attach** durchgeführt wird automatisch ein Mirror erstellt.
# zpool attach zroot /dev/gpt/disk1 /dev/gpt/disk0
Zum Abschluss muss nur noch die zweite Swap-Partition in ///etc/fstab// hinzugefügt werden.
/dev/gpt/swap0 swap sw 0 0