ZFS Pool einrichten und verwalten (Linux Debian)

Das ZFS zeichnet sich durch seine Flexibilität, Robustheit, Sicherheit hinsichtlich der Datenintegrität und durch seine leichte Handhabung aus. Nachdem Sie den ZFS-Support auf Ihrem System installiert haben, können Sie als erstes einen ZFS-Pool erstellen. Ich habe mir dafür in meinem Linux Debian zwei weitere Festplatten ins System gehängt. Da ich hier zum Testen das gesamte Testsystem virtualisiert habe, bin ich sehr flexibel was das Hinzufügen weiterer Hardwarekomponenten angeht und auch was deren Größe betrifft. Deshalb werden Ihnen im weiteren Verlauf dieses Tutorials die Festplattengrößen von ca. 2GB vielleicht etwas seltsam vorkommen aber zum Testen reicht es allemal.

# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000af5b0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          43      340992   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              43        1045     8044545    5  Extended
/dev/sda5              43         407     2925568   83  Linux
/dev/sda6             408         586     1434624   83  Linux
/dev/sda7             586         645      473088   82  Linux swap / Solaris
/dev/sda8             645         676      246784   83  Linux
/dev/sda9             676        1045     2960384   83  Linux

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdc doesn't contain a valid partition table

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«1) 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«)2)3) offenbarte jedoch, dass dort die einzelnen Sym-Links zum Init-Skript fehlten. Also kurzerhand »insserv«4) 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-Facilities5) 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«6) 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«7) 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 8). 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«9) 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.

Verwandte Artikel:
-> ZFS Support auf Linux Debian installieren
-> ZFS Simple Pool erweitern
-> ZFS Mirror Pool einrichten

pronto 2012/10/14 11:51

tux/zfs_setup.txt (14467 views) · Zuletzt geändert: 2012/10/16 10:29 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0