Inhaltsverzeichnis

ZFS Support auf Linux Debian installieren

Das »ZFS«1) oder Z-Filesystem wurde von SUN entwickelt, ursprünglich um die Verwaltung großer Datenmengen in zB Rechenzentren einfacher und sicherer zu machen. »ZFS« basiert auf Speicherpools, welche zum einen sehr einfach vergrößert werden können, ohne sich komplizierter Methoden zu bedienen um Partitionen zu vergrößern und zum anderen eine maximale Datenintegrität durch Prüfsummen, Snapshots, Mehrfach-Kopien und ein eigens entwickeltes RAID-System (RAID-Z) gewährleisten.

In meinem Fall bin ich bei der Evaluierung eins Langzeitarchivsystems auf »ZFS« gestoßen, vor allem durch die charmant einfache Art und Weise wie das Storage im laufenden Betrieb vergrößert werden kann. Das hält zum Einen die initialen Kosten relativ gering und zum Anderen gibt es ausreichend Spielraum, um in die zukünftige Aufgabe quasi hineinzuwachsen. Dem hohen Stellenwert eines Langzeitarchivs hinsichtlich Datenintegrität trägt »ZFS« ebenfalls adäquat Rechnung und so hat sich diese Technologie bei uns in den Vordergrund gedrängt und muss sich nun intensiveren Untersuchungen stellen.

Installation

Da »ZFS« unter der »Common Development and Distribution License« (CDDL)2) veröffentlicht wurde, ist keine direkte Integration in den Linux Kernel möglich. Im Debian Repository gibt es jedoch eine Fuse3) Variante von »ZFS«, welche für die ersten Gehversuche durchaus geeignet ist. Wer aber die Version des »ZFSonLinux«-Projektes4) haben möchte, muss sich »ZFS« selber kompilieren und für Debian auch die entsprechenden Pakete bauen. Diese Version dürfte aktueller sein, als die Fuse-Variante, vor allem hinsichtlich der zögerlichen Freigabe von neuen Paketen im Debian Repository.

Diese Installationsanleitung geht hierbei von der selber kompilierten Variante aus. Zu beachten ist im Anschluss daran, dass sich die Kommandosyntax zwischen Fuse-ZFS und »ZFS« an manchen Stellen geringfügig unterscheidet. Erwähnenswert ist auch, dass das »ZFSonLinux« Projekt eine 64-Bit Variante des Betriebssystem empfiehlt. »ZFS« benötigt bei starker Auslastung einiges an Systemressourcen, diesem Umstand sollte man beim Sizing des Servers frühzeitig Rechnung tragen.

Zuerst laden wir uns die Quellen der aktuellen Version bei zfsonlinux.org herunter:

# wget http://github.com/downloads/zfsonlinux/spl/spl-0.6.0-rc11.tar.gz
# wget http://github.com/downloads/zfsonlinux/zfs/zfs-0.6.0-rc11.tar.gz

Als nächstes müssen die notwendigen Pakete zum kompilieren der SPL-Quellen installiert werden:

# aptitude install build-essential gawk alien fakeroot linux-headers-$(uname -r)

Entpacken Sie anschließend den SPL Tarball und navigieren Sie in das entpackte Verzeichnis:

# tar -xvf spl-0.6.0-rc11.tar.gz
# cd spl-0.6.0-rc11/

Wenn Sie aus einem Tarball heraus installieren, können Sie mit den folgenden Schritten fortfahren. Sollten Sie einen Git-Download verwenden, müssen Sie zunächst das Skript »autogen.sh« ausführen, damit das »configure« Skript erzeugt wird.

~/spl-0.6.0-rc11# ./configure
~/spl-0.6.0-rc11# make deb

Dadurch werden die »SPL« RPMs erzeugt und mit »Alien« in »deb«-Pakete konvertiert. SPL steht für »Solaris Posix (Porting) Layer« und beinhaltet die zur Administration benötigten Utilities, Kernel Module und Development Headers. Durch die Solaris Porting Layer Module werden im Linux Kernel einige Solaris Stammfunktionen integriert.

~/spl-0.6.0-rc11# ls -l *.deb
-rw-r--r-- 1 root root   37224 13. Okt 11:23 spl_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root 1796592 13. Okt 11:23 spl-modules_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root   54748 13. Okt 11:23 spl-modules-devel_0.6.0-1_amd64.deb

Sie können diese Pakete nun auf Ihrem System installieren:

~/spl-0.6.0-rc11# dpkg -i *_amd64.deb

Nachdem Sie die SPL-Pakete installiert haben, können Sie die ZFS-Pakete bauen. Die »ZFS« Pakete enthalten die eigentlichen Kernel Module für die Bereitstellung von »ZFS« und deren Librarys.

Entpacken Sie den zuvor heruntergeladenen ZFS-Tarball und navigieren Sie in das entpackte Verzeichnis:

# tar -xvf zfs-0.6.0-rc11.tar.gz
# cd zfs-0.6.0-rc11/

Zum Kompilieren der ZFS-Pakete sind noch einige weitere Basispakete notwendig, welche aus dem Debian Repository nachinstalliert werden müssen:

# aptitude install zlib1g-dev uuid-dev libblkid-dev libselinux-dev parted lsscsi

Wie zuvor auch schon, können Sie hier direkt das »configure«-Skript aufrufen, wenn Sie aus dem Tarball heraus installieren. Sollten Sie die Git-Variante verwenden, müssen Sie zuerst das »autogen.sh«-Skript aufrufen, um das »configure«-Skript zu erzeugen. Im Anschluss daran erstellen Sie die benötigten »deb«-Pakete:

~/zfs-0.6.0-rc11# ./configure
~/zfs-0.6.0-rc11# make deb

Im Anschluss daran finden Sie im Installationsverzeichnis die soeben gebauten »deb«-Pakete:

~/zfs-0.6.0-rc11# ls -l *.deb
-rw-r--r-- 1 root root 2587270 13. Okt 12:15 zfs_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root  280938 13. Okt 12:15 zfs-devel_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root    3812 13. Okt 12:15 zfs-dracut_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root 7211094 13. Okt 12:13 zfs-modules_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root  242100 13. Okt 12:13 zfs-modules-devel_0.6.0-1_amd64.deb
-rw-r--r-- 1 root root   34404 13. Okt 12:15 zfs-test_0.6.0-1_amd64.deb

Sie können diese Pakete nun auf Ihrem System installieren:

~/zfs-0.6.0-rc11# dpkg -i *_amd64.deb

»ZFS« ist nun auf Ihrem System installiert und einsatzbereit.

ZFS Pool einrichten

Um sich einen Überblick über den Funktionsumfang von »ZFS« und deren Möglichkeiten zu machen, sollten Sie einen ersten Blick in die Manpage von von »ZFS« werfen (»man zfs«). IdR kommt ein ZFS-Administrator mit ein paar wenigen Kommandos aus, neben dem schon angesprochenen Kommando »zfs« gibt es noch »zpool« und »ztest«.

Um nun einen ZFS-Pool mit dem Namen »tank« aus der ersten der beiden zusätzlichen Platten (»/dev/sdb«) hinzuzufügen, reicht zB bereits folgendes Kommando:

# zpool create -f tank /dev/sdb

Der Terminus »tank« wird in allen Tutorials die ich gelesen und Podcast die ich gehört habe für die Benennung des ZFS-Pools verwendet. Ich möchte mich dem nicht widersetzen aber im Prinzip ist der Name frei wählbar.

Der ZFS-Pool ist nun bereits schon einsatzfähig, ein formatieren oder dergleichen ist nicht notwendig. Sie können sich den Status Ihres ersten ZFS-Pools nun mit folgenden Kommando anschauen:

# zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank  1,98G  91,5K  1,98G     0%  1.00x  ONLINE  -

Das »zpool create« Kommando erstellt auch einen Mountpoint im Root-Verzeichnis »/tank« und hängt den neuen Pool auch gleich dort ein:

# mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda9 on /home type ext3 (rw)
/dev/sda8 on /tmp type ext3 (rw)
/dev/sda5 on /usr type ext3 (rw)
/dev/sda6 on /var type ext3 (rw)
tank on /tank type zfs (rw,xattr)

Der ZFS-Pool »tank« ist somit schon bereits einsatzbereit.

It's just that simple ;-)

Mounting ZFS-Pools beim Systemstart

Nach einem Neustart wird der eben angelegte ZFS-Pool allerdings nicht automatisch ins System eingehängt. An dieser Stelle musste ich mich erst eine zeitlang am Kopf kratzen und dem Problem auf die Schliche kommen. Einen Eintrag in der »/etc/fstab«5) sucht man erst einmal vergeblich und ich habe der Versuchung widerstanden einfach einen passenden Eintrag anzulegen. Das ist zwar möglich aber nicht unter normalen Umständen, dazu aber später mehr in diesem Abschnitt.

Mount via Init-Skript

ZFS-Pools werden idR mit dem Kommando »zfs mount -a« ins System eingehängt. Die Option »-a« behandelt dabei alle verfügbaren ZFS-Pools, man könnte die Auswahl der einzuhängenden ZFS-Pools auch mit der Angabe des Pools einschränken; zB »zfs mount tank«. Das Kommando »zfs mount -a« sollte eigentlich durch das init-Skript »/etc/init.d/zfs« beim Systemstart ausgeführt werden - sollte - wird es aber nicht. Ich habe es nach einem Systemstart dann von Hand ausgeführt, um ein eventuelles Problem mit dem init-Skript auszuschließen. Durch das Ausführen wurde der ZFS-Pool auch gemountet, dass Skript scheint demnach in Ordnung.

Ein schneller Blick in die einzelnen Runlevel (»/etc/rc1.d« und »/etc/rc2.d«)6)7) offenbarte jedoch, dass dort die einzelnen Sym-Links zum Init-Skript fehlten. Also kurzerhand »insserv«8) beauftragt, diese anzulegen und siehe da, jetzt wurden die ZFS-Pools auch beim Systemstart gemountet:

# insserv zfs

Jetzt ist die Ausführung der Init-Skripte unter Debian aber nicht wirklich zuverlässig, was die Reihenfolge der Ausführung angeht und gerade bei einem Dateisystem könnte es uU früher oder später vorkommen, dass ein anderes Init-Skript von diesem Dateisystem abhängig ist. Es ist demnach sinnvoll ZFS als lokales Dateisystem zu behandeln. Debian sieht in den Init-Skripten dafür bestimmte Boot-Facilities9) vor. Eines der wichtigsten überhaupt ist das Boot-Facility »$local_fs«. Um ZFS nun der Gruppe von »$local_fs« hinzuzufügen, legen Sie die Datei »/etc/insserv.conf.d/zfs« mit folgenden Inahlt an:

/etc/insserv.conf-d/zfs

$local_fs zfs

und führen das Kommando »insserv« aus:

# insserv

Auszug aus der Manpage von insserv: insserv scans for System Facilities in the configuration file /etc/insserv.conf and each file in the directory /etc/insserv.conf.d/. Each line which begins with $ and a following name defines a system facility accordingly to the Linux Standard Base Specification (LSB), All names followed by such a system facility will declare the required dependencies of the facility.

Note: Der Name der Datei, wie auch der Zuordnung zu »$local_fs« innerhalb der Datei muss dabei dem »Provides«-Tag des Init-Skripts entsprechen, welches ZFS startet:

/etc/init.d/zfs

#!/bin/bash
#
# zfs This script will mount/umount the zfs filesystems.
#
# chkconfig: 2345 01 99
# description: This script will mount/umount the zfs filesystems during
# system boot/shutdown. Configuration of which filesystems
# should be mounted is handled by the zfs 'mountpoint' and
# 'canmount' properties. See the zfs(8) man page for details.
# It is also responsible for all userspace zfs services.
#
### BEGIN INIT INFO
# Provides: zfs
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Should-Stop:
# Short-Description: Mount/umount the zfs filesystems
# Description: ZFS is an advanced filesystem designed to simplify managing
# and protecting your data. This service mounts the ZFS
# filesystems and starts all related zfs services.
### END INIT INFO

Wenn nun ein Service vom lokalen Dateisystem (»$local_fs«) abhängt, hängt er automatisch auch von ZFS ab. Dieser Schritt ist nicht zwingend notwendig aber durchaus zu empfehlen.

Mount via /etc/fstab

Die Datei »/etc/fstab«10) ist die zentrale Konfigurationsdatei in unixoiden Betriebssystemen, wo im Prinzip alle Dateisysteme und Partitionen mit bestimmten Mountoptionen eingetragen werden. Diese Datei wird beim Systemstart durch das »mount«-Kommando ausgewertet, welches dann die konfigurierten Partitionen automatisch ins System einhängt oder anders ausgedrückt »mountet«. "Im Prinzip" deshalb, weil zB ZFS auch die oben bereits vorgestellte Methode über ein Init-Skript anbietet.

Aber ZFS kann auch über die Datei »/etc/fstab« seine Pools ins System einhängen lassen. Dafür müssen aber die Mountpoints der ZFS-Pools vorbereitet und die Datei »etc/fstab« von Hand angepasst werden. Ein Mountpoint kann in ZFS auf »legacy«11) gesetzt werden. Damit wird dieser Mountpoint vom Kommando »zfs mount« ignoriert und übergibt den Systemkommandos »mount« bzw »unmount« die Kontrolle.

Legen wir nun einen »legacy«-Mountpoint und weiteren ZFS-Pool mit dem Namen »pool« für die dritte Festplatte im System an:

# zpool create -f pool /dev/sdc

Wenn Sie jetzt das System neu starten, wird dieser ZFS-Pool noch durch das Init-Skript bzw. durch das Kommando »zfs mount -a« gemountet. Wir setzen aber den Mountpoint des ZFS-Pool »pool« auf »legacy«:

# zfs set mountpoint=legacy pool

Wenn Sie jetzt Ihr System neu starten, werden Sie feststellen, dass zwar der Pool »tank« schon gemountet ist aber der Pool »pool« jedoch nicht. Auch der durch das »zfs create« Kommando anglegte Mountpoint »/pool« wurde wieder entfernt. Diesen müssen wir für die weitere Vorgehensweise selbst anlegen:

# mkdir /pool

Danach kann der ZFS-Pool »pool« bereits durch das Systemkommando »mount« ins Dateisystem eingehängt werden:

# mount -t zfs pool /pool

Um das Mounten bereits beim Systemstart durchzuführen, müssen wir der Datei »/etc/fstab« einen entsprechenden Eintrag hinzufügen:

/etc/fstab

pool /pool zfs defaults 0 0

Jetzt wird auch dieser Pool bereits beim Systemstart in das Dateisystem eingehängt.

Die Debian Syntax der Datei »/etc/fstab« entnehmen Sie bitte dem Artikel in 12). Erwähnenswert ist die deaktivierte Pass-Option (die letzte Null in der »/etc/fstab«). Hier wird die Priorität eingestellt, in welcher das »fsck«-Utility das Dateisystem in einem Wartungszyklus überprüft. ZFS unterstützt »fsck«13) allerdings nicht. Daher die Null an dieser Stelle, was diese Option deaktiviert. ZFS bringt an dieser Stelle eigene Methoden zur Gewährleistung der Dateisystem-Integrität mit.

pronto 2012/10/13 12:35

Verwandte Artikel:

-> ZFS Simple Pool erweitern
-> ZFS Mirror Pool einrichten