ZFS auf Linux einsetzen
ZFS steht unter der freien Sun-eigenen CDDL Lizenz, die sich leider nicht für Distibutoren mit der GPL vereinbaren läßt.
Diese Dilemma kann man als Linux-Nutzer umgehen, indem man die zfs-Pakete selber baut _(auch als DEB/RPM Pakete)_
Es ist noch anzumerken, dass die ZFS-Versionen mit der Übernahme von SUN durch Oracle ggf. auseinander laufen werden _(sprich unter Linux eine kleinere ZFS-Version existiert, wie unter Solaris oder Nexenta/SmartOS/...)_
Links
Homepage......................: http://zfsonlinux.org/ Dokumentation.................: http://zfsonlinux.org/docs.html Wikipedia.....................: http://de.wikipedia.org/wiki/ZFS_(Dateisystem)
ZFS auf Linux bauen
(hier am Beispiel von Debian - es wird aber auch für RPM-Pakete beschrieben)
# welche Pakete sind aktuell installiert ? dpkg -l|grep ^ii|grep -e zfs- -e spl- # falls man auf dem Rechner bereits ZFS im Einsatz hat, dies deaktivieren, die Module und DEB-Pakete entfernen test -x /etc/init.d/zfs && /etc/init.d/zfs stop lsmod | grep zfs # -> dann mittels rmmod die Module entfernen rmmod zfs aptitude purge zfs zfs-devel zfs-dracut zfs-modules zfs-modules-devel zfs-test spl spl-modules spl-modules-devel # Vorbereitung des Systems aptitude install build-essential gawk alien fakeroot linux-headers-$(uname -r) aptitude install zlib1g-dev uuid-dev libblkid-dev libselinux-dev parted lsscsi aptitude install uuid-dev # erleichterungen fuer neue Versionen version=0.6.2 basedir=/root/zfs debdir=$basedir/deb-${version} urlbase="archive.zfsonlinux.org/downloads/zfsonlinux" # herunterladen der aktuellen pakete mkdir -pv $debdir cd $basedir wget -p http://$urlbase/spl/spl-${version}.tar.gz wget -p http://$urlbase/zfs/zfs-${version}.tar.gz ln -s $urlbase/{spl,zfs}/*${version}.tar.gz . # auspacken cd $basedir && tar -xzf spl-${version}.tar.gz && tar -xzf zfs-${version}.tar.gz # bauen & installieren der deb-Pakete cd $basedir/spl-${version} && ./configure && make deb && mv *.deb $debdir && dpkg -i $debdir/kmod*spl*deb $debdir/spl*deb && cd $basedir cd $basedir/zfs-${version} && ./configure && make deb && mv *.deb $debdir && dpkg -i $debdir/kmod*zfs*deb $debdir/zfs*deb && cd $basedir rm -rf $basedir/spl-${version} $basedir/zfs-${version} # welche Pakete sind jetzt installiert ? dpkg -l|grep ^ii|grep -e zfs- -e spl- # automatisches Mounten beim Booten insserv /etc/init.d/zfs
ZPool erstellen
Dies bedarf des Studiums der Manpage von [1] (wobei die Linux-Version ggf. einen älteren Version hat) Es stellt sich hierbei die Frage, welche Device-Bezeichnung man verwenden sollte. Meiner Meinung nach ist es nicht so geschickt, /dev/sda, /dev/sdb zu verwenden, da diese ggf. auch das Root-FS beinhalten könnten und ggf. Festplatten andere Bezeichnungen bekommen können (z.B. beim Umstecken der SATA-Ports)
Ich favorisiere die Namen unter /dev/disk/by-id/ata..., da diese die Festplatte eindeutig kennzeichnen. Der Nachteil ist sicherlich, die etwas lange Schreibform.
Beispiel: Nehmen wir nun mal an, wir haben folgende Inhalt in /dev/disk/by-id/
/dev/disk/by-id/ata-HDS725050KLA360_KRVN65ZAHMMZBF -> ../../sda # Root Filesystem /dev/disk/by-id/ata-HL-DT-ST_DVDRAM_GSA-H10N_K1B66FL2131 -> ../../sr0 # CDRom /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F0ZPTW -> ../../sdd # fuer ZFS /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F0ZTQC -> ../../sdj # fuer ZFS /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F1076E -> ../../sdc # fuer ZFS /dev/disk/by-id/ata-ST3000DM001-9YN166_W1F0NA2S -> ../../sdg # fuer ZFS /dev/disk/by-id/ata-ST3000DM001-9YN166_W1F0TZ5T -> ../../sdh # fuer ZFS /dev/disk/by-id/ata-WDC_WD30EZRX-00MMMB0_WD-WCAWZ0966140 -> ../../sdi # fuer ZFS /dev/disk/by-id/ata-WDC_WD30EZRX-00MMMB0_WD-WCAWZ0987954 -> ../../sdb # fuer ZFS
Nun erstellen wir ein Raid-Z (entspricht einem Raid-5) mit Namen 'hd' wie folgt:
i=/dev/disk/by-id zpool create hd raidz \ $i/ata-ST3000DM001-1CH166_Z1F0ZPTW \ $i/ata-ST3000DM001-1CH166_Z1F0ZTQC \ $i/ata-ST3000DM001-1CH166_Z1F1076E \ $i/ata-ST3000DM001-9YN166_W1F0NA2S \ $i/ata-ST3000DM001-9YN166_W1F0TZ5T \ $i/ata-WDC_WD30EZRX-00MMMB0_WD-WCAWZ0966140 \ $i/ata-WDC_WD30EZRX-00MMMB0_WD-WCAWZ0987954 \
Dies wird nun durch den ZFS-Treiber direkt gemountet nach /hd. Den Zustand des ZFS-Pools können wir uns nun anzeigen lassen mittels:
zpool status -v hd pool: hd state: ONLINE scan: not scanned config: NAME STATE READ WRITE CKSUM hd-0 ONLINE 0 0 0 ata-ST3000DM001-1CH166_Z1F0ZTQC ONLINE 0 0 0 ata-WDC_WD30EZRX-00MMMB0_WD-WCAWZ0987954 ONLINE 0 0 0 ata-ST3000DM001-1CH166_Z1F1076E ONLINE 0 0 0 ata-ST3000DM001-1CH166_Z1F0ZPTW ONLINE 0 0 0 ata-ST3000DM001-9YN166_W1F0TZ5T ONLINE 0 0 0 ata-ST3000DM001-9YN166_W1F0NA2S ONLINE 0 0 0 ata-WDC_WD30EZRX-00MMMB0_WD-WCAWZ0966140 ONLINE 0 0 0 errors: No known data errors
Pool testen
Um zu sehen, ob die Festplatten alle in Ordnung sind, kann man zu beginn gut den Pool voll schreiben und dann das 'ZFS-Scrubbing' anwerfen (das eignet sich bei raidz oder mirror)
# erstmal eine Datei mit zufälligen Werten von 1G erstellen # openssl rand 1073741824 > /tmp/rand # temporaeres ZFS-Volume erstellen und dedub+compression ausstellen # zfs create hd/tmp zfs set compression=off hd/tmp zfs set dedup=off hd/tmp # nun diese Datei so oft als möglich in den Pool schreiben # while date >&2 +" neue Datei @ %Y-%m-%d %H:%M:%S" ; do cat /tmp/rand ; done > /hd/tmp/rand & # die Beobachtung starten (abbrechen, wenn die Platte voll ist) # zpool iostat -v hd 10 # wenn die Platte (fast) voll ist die Kontrolle starten # zpool scrub hd # das scrubbing im Auge behalten # while sleep 60 ; do zpool status -v hd ; done # am Ende kann man das Volume wieder entfernen # zfs destroy hd/tmp