ZFS auf Linux einsetzen: Unterschied zwischen den Versionen

Aus rü5
Wechseln zu:Navigation, Suche
imported>Meap
imported>Meap
Zeile 48: Zeile 48:
rm -rf $basedir/spl-${version} $basedir/zfs-${version}
rm -rf $basedir/spl-${version} $basedir/zfs-${version}


# automatisches Mounten beim Booten
insserv /etc/init.d/zfs
</pre>
</pre>



Version vom 1. Februar 2013, 14:34 Uhr


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)

# 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.0-rc13
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/spl*deb && cd $basedir
cd $basedir/zfs-${version} && ./configure && make deb && mv *.deb $debdir && dpkg -i $debdir/zfs*deb && cd $basedir
rm -rf $basedir/spl-${version} $basedir/zfs-${version}

# 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