ZFS auf Linux einsetzen: Unterschied zwischen den Versionen
imported>Meap |
imported>Meap Keine Bearbeitungszusammenfassung |
||
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
ZFS steht unter der freien Sun-eigenen CDDL Lizenz, die sich leider nicht für Distibutoren mit der GPL vereinbaren läßt. | 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)_ | 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 | 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 == | == Links == | ||
Zeile 16: | Zeile 16: | ||
<pre> | <pre> | ||
# Vorbereitung des Systems | # Vorbereitung des Systems | ||
aptitude install build-essential | aptitude install build-essential dkms linux-headers-$(uname -r) | ||
# | # aktuelles initiales Paket installieren | ||
mkdir | # @see http://zfsonlinux.org/debian.html | ||
cd | mkdir /root/zfs | ||
wget | cd /root/zfs | ||
wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_5_all.deb | |||
dpkg -i zfsonlinux_5_all.deb | |||
aptitude update | |||
aptitude install debian-zfs | |||
aptitude dist-upgrade | |||
</pre> | </pre> | ||
Zeile 53: | Zeile 41: | ||
Nehmen wir nun mal an, wir haben folgende Inhalt in ''/dev/disk/by-id/'' | Nehmen wir nun mal an, wir haben folgende Inhalt in ''/dev/disk/by-id/'' | ||
<pre> | <pre> | ||
/dev/disk/by-id/ata- | ls -l /dev/disk/by-id/ata* | sed s,'^.*/ata-','ata-',1 | sort | grep -v '[0-9]$' | ||
/ | |||
/ | ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M -> ../../sda | ||
/ | ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part4 -> ../../sda4 # -> zfsCacheWrite on SSD | ||
/ | ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part5 -> ../../sda5 # -> zfsCacheRead on SSD | ||
/ | ata-ST4000VN000-1H4168_Z300YR10 -> ../../sdc # -> raidz-pool 1 | ||
/ | ata-ST4000VN000-1H4168_Z300Z1A3 -> ../../sdg # -> raidz-pool 1 | ||
ata-ST4000VN000-1H4168_Z300Z3SK -> ../../sdi # -> raidz-pool 1 | |||
ata-ST4000VN000-1H4168_Z302CFMQ -> ../../sdl # -> raidz-pool 1 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0654079 -> ../../sdd # -> raidz-pool 2 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0741381 -> ../../sdh # -> raidz-pool 2 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0753907 -> ../../sdf # -> raidz-pool 2 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4EKKVJDSP -> ../../sdm # -> raidz-pool 2 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D2405034 -> ../../sdj # -> raidz-pool 3 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4428361 -> ../../sde # -> raidz-pool 3 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4440120 -> ../../sdb # -> raidz-pool 3 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D74RH68A -> ../../sdk # -> raidz-pool 3 | |||
</pre> | </pre> | ||
Nun erstellen wir | Nun erstellen wir drei Raid-Z ''(entspricht einem Raid-5)'' mit Namen 'zfs' wie folgt: | ||
<pre> | <pre> | ||
zpool create zfs \ | |||
raidz \ | |||
ata-ST4000VN000-1H4168_Z300YR10 \ | |||
ata-ST4000VN000-1H4168_Z300Z1A3 \ | |||
ata-ST4000VN000-1H4168_Z300Z3SK \ | |||
ata-ST4000VN000-1H4168_Z302CFMQ \ | |||
raidz \ | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0654079 \ | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0741381 \ | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0753907 \ | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4EKKVJDSP \ | |||
raidz \ | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D2405034 \ | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4428361 \ | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4440120 \ | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D74RH68A \ | |||
log \ | |||
ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part4 \ | |||
cache \ | |||
ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part5 | |||
</pre> | </pre> | ||
Dies wird nun durch den ZFS-Treiber direkt gemountet nach ''/ | Dies wird nun durch den ZFS-Treiber direkt gemountet nach ''/zfs''. Den Zustand des ZFS-Pools können wir uns nun anzeigen lassen mittels: | ||
<pre> | <pre> | ||
zpool status -v | zpool status -v zfs | ||
pool: | pool: zfs | ||
state: ONLINE | state: ONLINE | ||
scan: none requested | |||
config: | config: | ||
NAME STATE READ WRITE CKSUM | |||
zfs ONLINE 0 0 0 | |||
raidz1-0 ONLINE 0 0 0 | |||
ata-ST4000VN000-1H4168_Z300YR10 ONLINE 0 0 0 | |||
ata-ST4000VN000-1H4168_Z300Z1A3 ONLINE 0 0 0 | |||
ata-ST4000VN000-1H4168_Z300Z3SK ONLINE 0 0 0 | |||
ata-ST4000VN000-1H4168_Z302CFMQ ONLINE 0 0 0 | |||
raidz1-1 ONLINE 0 0 0 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0654079 ONLINE 0 0 0 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0741381 ONLINE 0 0 0 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0753907 ONLINE 0 0 0 | |||
ata-WDC_WD40EFRX-68WT0N0_WD-WCC4EKKVJDSP ONLINE 0 0 0 | |||
raidz1-2 ONLINE 0 0 0 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D2405034 ONLINE 0 0 0 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4428361 ONLINE 0 0 0 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4440120 ONLINE 0 0 0 | |||
ata-WDC_WD60EFRX-68MYMN1_WD-WX11D74RH68A ONLINE 0 0 0 | |||
logs | |||
ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part4 ONLINE 0 0 0 | |||
cache | |||
ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part5 ONLINE 0 0 0 | |||
errors: No known data errors | errors: No known data errors | ||
Zeile 113: | Zeile 134: | ||
# temporaeres ZFS-Volume erstellen und dedub+compression ausstellen | # temporaeres ZFS-Volume erstellen und dedub+compression ausstellen | ||
# | # | ||
zfs create | zfs create zfs/tmp | ||
zfs set compression=off | zfs set compression=off zfs/tmp | ||
zfs set dedup=off | zfs set dedup=off zfs/tmp | ||
# nun diese Datei so oft als möglich in den Pool schreiben | # 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 > / | while date >&2 +" neue Datei @ %Y-%m-%d %H:%M:%S" ; do cat /tmp/rand ; done > /zfs/tmp/rand & | ||
# die Beobachtung starten (abbrechen, wenn die Platte voll ist) | # die Beobachtung starten (abbrechen, wenn die Platte voll ist) | ||
# | # | ||
zpool iostat -v | zpool iostat -v zfs 10 | ||
# wenn die Platte (fast) voll ist die Kontrolle starten | # wenn die Platte (fast) voll ist die Kontrolle starten | ||
# | # | ||
zpool scrub | zpool scrub zfs | ||
# das scrubbing im Auge behalten | # das scrubbing im Auge behalten | ||
# | # | ||
while sleep 60 ; do zpool status -v | while sleep 60 ; do zpool status -v zfs ; done | ||
# am Ende kann man das Volume wieder entfernen | # am Ende kann man das Volume wieder entfernen | ||
# | # | ||
zfs destroy | zfs destroy zfs/tmp | ||
</pre> | |||
== reale Verzeichnisse anlegen == | |||
<pre> | |||
zfs create zfs/app | |||
zfs create zfs/audio | |||
zfs create zfs/home | |||
zfs create zfs/lxc | |||
zfs create zfs/srv | |||
zfs create zfs/systemBackup | |||
zfs create zfs/tv | |||
zfs create zfs/video | |||
# auf einigen Kompression einschalten | |||
zfs set compress=lz4 zfs/app | |||
zfs set compress=lz4 zfs/home | |||
zfs set compress=lz4 zfs/lxc | |||
zfs set compress=lz4 zfs/srv | |||
zfs set compress=lz4 zfs/systemBackup | |||
# auf einigen Deduplizierung anschalten (svn-Basis-Verzeichnisse / LXC-Zonen/Backup-Bereiche) | |||
zfs set dedup=on zfs/app | |||
zfs set dedup=on zfs/audio | |||
zfs set dedup=on zfs/home | |||
zfs set dedup=on zfs/lxc | |||
zfs set dedup=on zfs/srv | |||
zfs set dedup=on zfs/systemBackup | |||
zfs set dedup=on zfs/video | |||
# Abschalten, dass alle Daten durch die SSD geschoben werden | |||
zfs set secondarycache=metadata zfs/audio | |||
zfs set secondarycache=metadata zfs/systemBackup | |||
zfs set secondarycache=metadata zfs/video | |||
</pre> | |||
== ZFS-Speicher begrenzen == | |||
''/etc/modprobe.d/zfs.conf'' | |||
<pre> | |||
# 8GB RAM -> 128MB min + 1GB max | |||
#options zfs zfs_arc_min=134217728 zfs_arc_max=1073741824 | |||
# 16GB RM -> 1GB min + 4GB max | |||
#options zfs zfs_arc_min=1073741824 zfs_arc_max=4294967296 | |||
# 32GB RM -> 1GB min + 8GB max | |||
options zfs zfs_arc_min=1073741824 zfs_arc_max=8589934592 | |||
# 400GB RAM -> 24GB min + 32GB max | |||
#options zfs zfs_arc_min=25769803776 zfs_arc_max=34359738368 | |||
</pre> | </pre> |
Aktuelle Version vom 21. April 2015, 06:53 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)
# Vorbereitung des Systems aptitude install build-essential dkms linux-headers-$(uname -r) # aktuelles initiales Paket installieren # @see http://zfsonlinux.org/debian.html mkdir /root/zfs cd /root/zfs wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_5_all.deb dpkg -i zfsonlinux_5_all.deb aptitude update aptitude install debian-zfs aptitude dist-upgrade
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/
ls -l /dev/disk/by-id/ata* | sed s,'^.*/ata-','ata-',1 | sort | grep -v '[0-9]$' ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M -> ../../sda ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part4 -> ../../sda4 # -> zfsCacheWrite on SSD ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part5 -> ../../sda5 # -> zfsCacheRead on SSD ata-ST4000VN000-1H4168_Z300YR10 -> ../../sdc # -> raidz-pool 1 ata-ST4000VN000-1H4168_Z300Z1A3 -> ../../sdg # -> raidz-pool 1 ata-ST4000VN000-1H4168_Z300Z3SK -> ../../sdi # -> raidz-pool 1 ata-ST4000VN000-1H4168_Z302CFMQ -> ../../sdl # -> raidz-pool 1 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0654079 -> ../../sdd # -> raidz-pool 2 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0741381 -> ../../sdh # -> raidz-pool 2 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0753907 -> ../../sdf # -> raidz-pool 2 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4EKKVJDSP -> ../../sdm # -> raidz-pool 2 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D2405034 -> ../../sdj # -> raidz-pool 3 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4428361 -> ../../sde # -> raidz-pool 3 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4440120 -> ../../sdb # -> raidz-pool 3 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D74RH68A -> ../../sdk # -> raidz-pool 3
Nun erstellen wir drei Raid-Z (entspricht einem Raid-5) mit Namen 'zfs' wie folgt:
zpool create zfs \ raidz \ ata-ST4000VN000-1H4168_Z300YR10 \ ata-ST4000VN000-1H4168_Z300Z1A3 \ ata-ST4000VN000-1H4168_Z300Z3SK \ ata-ST4000VN000-1H4168_Z302CFMQ \ raidz \ ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0654079 \ ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0741381 \ ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0753907 \ ata-WDC_WD40EFRX-68WT0N0_WD-WCC4EKKVJDSP \ raidz \ ata-WDC_WD60EFRX-68MYMN1_WD-WX11D2405034 \ ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4428361 \ ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4440120 \ ata-WDC_WD60EFRX-68MYMN1_WD-WX11D74RH68A \ log \ ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part4 \ cache \ ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part5
Dies wird nun durch den ZFS-Treiber direkt gemountet nach /zfs. Den Zustand des ZFS-Pools können wir uns nun anzeigen lassen mittels:
zpool status -v zfs pool: zfs state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zfs ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ata-ST4000VN000-1H4168_Z300YR10 ONLINE 0 0 0 ata-ST4000VN000-1H4168_Z300Z1A3 ONLINE 0 0 0 ata-ST4000VN000-1H4168_Z300Z3SK ONLINE 0 0 0 ata-ST4000VN000-1H4168_Z302CFMQ ONLINE 0 0 0 raidz1-1 ONLINE 0 0 0 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0654079 ONLINE 0 0 0 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0741381 ONLINE 0 0 0 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0753907 ONLINE 0 0 0 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4EKKVJDSP ONLINE 0 0 0 raidz1-2 ONLINE 0 0 0 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D2405034 ONLINE 0 0 0 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4428361 ONLINE 0 0 0 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D4440120 ONLINE 0 0 0 ata-WDC_WD60EFRX-68MYMN1_WD-WX11D74RH68A ONLINE 0 0 0 logs ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part4 ONLINE 0 0 0 cache ata-Samsung_SSD_840_EVO_250GB_S1DBNSBF316431M-part5 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 zfs/tmp zfs set compression=off zfs/tmp zfs set dedup=off zfs/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 > /zfs/tmp/rand & # die Beobachtung starten (abbrechen, wenn die Platte voll ist) # zpool iostat -v zfs 10 # wenn die Platte (fast) voll ist die Kontrolle starten # zpool scrub zfs # das scrubbing im Auge behalten # while sleep 60 ; do zpool status -v zfs ; done # am Ende kann man das Volume wieder entfernen # zfs destroy zfs/tmp
reale Verzeichnisse anlegen
zfs create zfs/app zfs create zfs/audio zfs create zfs/home zfs create zfs/lxc zfs create zfs/srv zfs create zfs/systemBackup zfs create zfs/tv zfs create zfs/video # auf einigen Kompression einschalten zfs set compress=lz4 zfs/app zfs set compress=lz4 zfs/home zfs set compress=lz4 zfs/lxc zfs set compress=lz4 zfs/srv zfs set compress=lz4 zfs/systemBackup # auf einigen Deduplizierung anschalten (svn-Basis-Verzeichnisse / LXC-Zonen/Backup-Bereiche) zfs set dedup=on zfs/app zfs set dedup=on zfs/audio zfs set dedup=on zfs/home zfs set dedup=on zfs/lxc zfs set dedup=on zfs/srv zfs set dedup=on zfs/systemBackup zfs set dedup=on zfs/video # Abschalten, dass alle Daten durch die SSD geschoben werden zfs set secondarycache=metadata zfs/audio zfs set secondarycache=metadata zfs/systemBackup zfs set secondarycache=metadata zfs/video
ZFS-Speicher begrenzen
/etc/modprobe.d/zfs.conf
# 8GB RAM -> 128MB min + 1GB max #options zfs zfs_arc_min=134217728 zfs_arc_max=1073741824 # 16GB RM -> 1GB min + 4GB max #options zfs zfs_arc_min=1073741824 zfs_arc_max=4294967296 # 32GB RM -> 1GB min + 8GB max options zfs zfs_arc_min=1073741824 zfs_arc_max=8589934592 # 400GB RAM -> 24GB min + 32GB max #options zfs zfs_arc_min=25769803776 zfs_arc_max=34359738368