Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
ZFS
- https://docs.oracle.com/cd/E19253-01/820-2313/gaypw/index.html - Oracle Solaris ZFS-Administrationshandbuch
- https://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide - ZFS Best Practices Guide
-
- FreeBSD ZFS vs. ZoL Performance, Ubuntu ZFS On Linux Reference - ZFS-Vergleich zwischen "FreeBSD 12.0" und "Ubuntu 18.04"
Dieses Dateisystem verwendet dynamische Inodes.
-
- ZFS: 21.3.6. Behandlung von fehlerhaften Geräten
- ZFS: 21.3.8. Selbstheilung
- ZFS: 21.3.9. Einen Pool vergrössern
Unterstützung
ZFS wird natürlich von Solaris unterstützt, mittlerweile hat ja auch FreeBSD ZFS in den Kernel auf genommen und Apple setzt ebenfalls in McOS den ZFS-Treiber in der Art von FreeBSD erfolgreich ein. Nur Linux hat noch keine zufriedenstellende ZFS-Unterstützung zu bieten.
Allerdings gibt es hier drei verschiedene Lösungswege:
- Fuse (ist im Paketsystem fast jeder Linux-Distribution enthalten), hier arbeitet ein sehr aktueller ZFS-Treiber im User-Land, ist aber sehr langsam und instabil bei großen Datenmengen;
- mit kFreeBSD setzt man auf einem FreeBSD-Kernel ein Debian User-Land auf, diese Lösung ist beim schreiben sogar etwas schneller als das native FreeBSD aber beim lesen deutlich langsamer;
- mit KQ wird ein propritärer ZFS-Treiber für Linux bereit gestellt, der in etwa so schnell ist wie FreeBSD, der Treiber wird aber nur für Fedora, RHEL und Ubuntu angeboten;
single user mode in FreeBSD mit ZFS auf der System-Platte
https://rubenerd.com/mount-zfs-in-freebsd-single-user-mode/
Um das Dateisystem beschreibbar zu machen, genügt dieses Kommando:
$ mount -u /
Festplatten-Status - I/O
zpool iostat -v pool 5 zpool iostat -vl zpool iostat -p zpool iostat -pl zpool iostat -P zpool iostat -Pl
Festplatten im System finden
FreeBSD:
camcontrol devlist gpart status gpart show gpart show -l gpart show -lp gpart list zpool list zpool status zfs list zfs get -s default all
ZFS-Snapshot
automatisch mehrere Kopien von den Daten ablegen
# zfs get all | fgrep copies home copies 1 default # zfs set copies=2 home # zfs get allgrep copies home copies 2 local
Allgemeines
> zpool create -m none -f HDD1000 /dev/sda > zpool list > zpool status > zpool destroy HDD1000
Eine komplette Platte auf die schnelle mit ZFS versehen:
# dd if=/dev/zero of=/dev/da4 bs=1k count=1000 # fdisk -I /dev/da4 # disklabel -w /dev/da4 # zpool create BACKUP3TB /dev/da4 # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT BACKUP3TB 2.72T 400K 2.72T 0% ONLINE -
Alle gemounteten ZFS-Pool's (Container des ZFS-Dateisystems) anzeigen:
# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT BACKUP3000GB 2.72T 714G 2.02T 25% ONLINE - home 1.36T 1.30T 57.0G 95% ONLINE -
Alle gemounteten ZFS - on-disk's (Dateisysteme) anzeigen:
# zfs list NAME USED AVAIL REFER MOUNTPOINT BACKUP3000GB 712G 1.98T 712G /BACKUP3000GB home 1.30T 38.0G 1.30T /home
ZFS-SnapShot (Beispiel mit MySQL): http://dev.mysql.com/doc/refman/5.1/en/ha-zfs-replication.html
alle ZFS-Tuning-Parameter anzeigen:
# zfs get
missing property argument
usage:
get [-rHp] [-d max] [-o field[,...]] [-s source[,...]]
<"all" | property[,...]> [filesystem|volume|snapshot] ...
The following properties are supported:
PROPERTY EDIT INHERIT VALUES
available NO NO <size>
compressratio NO NO <1.00x or higher if compressed>
creation NO NO <date>
mounted NO NO yes | no
origin NO NO <snapshot>
referenced NO NO <size>
type NO NO filesystem | volume | snapshot
used NO NO <size>
usedbychildren NO NO <size>
usedbydataset NO NO <size>
usedbyrefreservation NO NO <size>
usedbysnapshots NO NO <size>
aclinherit YES YES discard | noallow | restricted | passthrough | passthrough-x
aclmode YES YES discard | groupmask | passthrough
atime YES YES on | off
canmount YES NO on | off | noauto
casesensitivity NO YES sensitive | insensitive | mixed
checksum YES YES on | off | fletcher2 | fletcher4 | sha256
compression YES YES on | off | lzjb | gzip | gzip-[1-9]
copies YES YES 1 | 2 | 3
devices YES YES on | off
exec YES YES on | off
jailed YES YES on | off
mountpoint YES YES <path> | legacy | none
nbmand YES YES on | off
normalization NO YES none | formC | formD | formKC | formKD
primarycache YES YES all | none | metadata
quota YES NO <size> | none
readonly YES YES on | off
recordsize YES YES 512 to 128k, power of 2
refquota YES NO <size> | none
refreservation YES NO <size> | none
reservation YES NO <size> | none
secondarycache YES YES all | none | metadata
setuid YES YES on | off
shareiscsi YES YES on | off | type=<type>
sharenfs YES YES on | off | share(1M) options
sharesmb YES YES on | off | sharemgr(1M) options
snapdir YES YES hidden | visible
utf8only NO YES on | off
version YES NO 1 | 2 | 3 | current
volblocksize NO YES 512 to 128k, power of 2
volsize YES NO <size>
vscan YES YES on | off
xattr YES YES on | off
Sizes are specified in bytes with standard units such as K, M, G, etc.
User-defined properties can be specified by using a name containing a colon (:).
# zpool get all
usage:
get <"all" | property[,...]> <pool> ...
the following properties are supported:
PROPERTY EDIT VALUES
available NO <size>
capacity NO <size>
guid NO <guid>
health NO <state>
size NO <size>
used NO <size>
altroot YES <path>
autoreplace YES on | off
bootfs YES <filesystem>
cachefile YES <file> | none
delegation YES on | off
failmode YES wait | continue | panic
listsnapshots YES on | off
version YES <version>
ZFS-"on-disk"-Version (Dateisystemversion) der gemounteten Pool's (ZFS-Dateisystem-Container) anzeigen:
# zfs get version NAME PROPERTY VALUE SOURCE BACKUP3000GB version 3 - home version 3 -
ZFS-Pool-Version (Container-Version) des "BACKUP3000GB"-Pool's anzeigen:
# zpool get version BACKUP3000GB NAME PROPERTY VALUE SOURCE BACKUP3000GB version 14 default
ZFS-Pool-Version (Container-Version) des "home"-Pool's anzeigen:
# zpool get version home NAME PROPERTY VALUE SOURCE home version 14 default
Statistik:
# zpool iostat
capacity operations bandwidth
pool used avail read write read write
---------- ----- ----- ----- ----- ----- -----
BACKUP3000GB 712G 2.02T 4 85 567K 10.4M
home 1.30T 59.7G 69 3 8.53M 26.1K
---------- ----- ----- ----- ----- ----- -----
Version der aktuellen ZFS-Installation anzeigen:
# zpool upgrade This system is currently running ZFS pool version 14. All pools are formatted using this version.
Version der aktuellen ZFS-Installation und alle Eigenschaften aller bisherigen ZFS-Pool-Versionen anzeigen:
# zpool upgrade -v This system is currently running ZFS pool version 14. The following versions are supported: VER DESCRIPTION --- -------------------------------------------------------- 1 Initial ZFS version 2 Ditto blocks (replicated metadata) 3 Hot spares and double parity RAID-Z 4 zpool history 5 Compression using the gzip algorithm 6 bootfs pool property 7 Separate intent log devices 8 Delegated administration 9 refquota and refreservation properties 10 Cache devices 11 Improved scrub performance 12 Snapshot properties 13 snapused property 14 passthrough-x aclinherit support For more information on a particular version, including supported releases, see: http://www.opensolaris.org/os/community/zfs/version/N Where 'N' is the version number.
alle ZFS-Pool's auf aktuelle Version upgraden:
# zpool upgrade -a
so kann man alle Laufwerke mit G-Partitionen sehen
> gpart status
Name Status Components
ada4p1 OK ada4
ada4p2 OK ada4
ada4p3 OK ada4
diskid/DISK-03EF039300A9s1 OK diskid/DISK-03EF039300A9
da0s1 OK da0
weitere wichtige G-Infos:
> gpart show > gpart list
Jetzt muss der MBR neu geschrieben werden, in diesem Fall heißt die Boot-Platte "ada4" (zroot):
> gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/ada4 partcode written to ada4p1 bootcode written to ada4
Hat man einen Pool über USB angeschlossen, kann es sein, das der erste Zugriff recht lange dauert, wenn die Platten "eingeschlafen" sind. Um die Platten vor einem regelmäßigen Zugriff automatisiert (z.B. per Cron) aufzuwecken, habe ich diese Kommandozeile geschrieben. Es setzt einfach nur ein "ls" auf dem Mount-Point ab:
# for mp in $(zpool list -H -o name); do zmp="$(mount|egrep "^${mp}"|awk '{print $3}')";ls ${zmp}/ >/dev/null;done
- /home/sbin/zfs-hdd-serial.sh
#!/usr/bin/env bash VERSION="v2017071100" SKRIPTNAME="$(basename ${0})_$(date +'%F')" SKRIPTVERZEICHNIS="$(dirname ${0})" #------------------------------------------------------------------------------# if [ "$(id -u)" != "0" ] ; then echo "Sie muessen root sein!" exit 1 fi #------------------------------------------------------------------------------# if [ "$(uname -s)" = "FreeBSD" ] ; then ### FreeBSD SMARTOPT="-a" elif [ "$(uname -s)" = "Linux" ] ; then ### Linux SMARTOPT="-H" else ### Windows SMARTOPT="-h" fi #------------------------------------------------------------------------------# ( echo "================================================================================" date +'%F %T' echo "--------------------------------------------------------------------------------" for i in $(ls /dev/ad*);do smartctl -i ${i}|fgrep 'Serial Number:'|awk -v name=${i} '{print name,$NF}';done echo "--------------------------------------------------------------------------------" for ZFSPOOL in $(zpool list -H | awk '{print $1}') do for BLKGER in $(zpool status ${ZFSPOOL} | sed -ne "1,/^$/ d;/${ZFSPOOL}/,/^$/ p" | awk '{print $1}') do ls -1 /dev/${BLKGER} 2>/dev/null | while read BLKDEV do #echo "${ZFSPOOL} | ${BLKDEV} | smartctl ${SMARTOPT} ${BLKDEV}" #echo "smartctl ${SMARTOPT} ${BLKDEV}" echo -n "${ZFSPOOL} ${BLKDEV} " smartctl ${SMARTOPT} ${BLKDEV} | grep -Ei 'Device Model:|Serial Number:' | awk '{print $NF}' | tr -s '\n' '\t' | sed 's/ $//' echo done | grep -Ev '^$' done done echo echo "--------------------------------------------------------------------------------" df -h | grep -E '^/dev/' | awk '{print $1}' | grep -Fv '/md' | sed -e 's/[0-9]*$//;s/[a-z]*$//' | while read BLKGER do #echo "# ${BLKGER} | smartctl ${SMARTOPT} ${BLKGER}" echo -n "# ${BLKGER} " smartctl ${SMARTOPT} ${BLKGER} | grep -Ei 'Device Model:|Serial Number:' | awk '{print $NF}' | tr -s '\n' '\t' | sed 's/ $//' done echo "================================================================================" ) 2>&1 | tee -a /home/${SKRIPTNAME}.log ls -lha /home/${SKRIPTNAME}.log #------------------------------------------------------------------------------#
FreeBSD:~# /home/sbin/zfs-hdd-serial.sh ================================================================================ 2017-07-11 16:31:21 -------------------------------------------------------------------------------- /dev/ada0 WD-WCAV33097185 /dev/ada1 WD-WCC133494387 /dev/ada2 PL1331L3GG9G8H /dev/ada3 WD-WCAW33995888 /dev/ada4 WD-WCC133691187 /dev/ada5 WD-WX2137493S81 /dev/ada6 WD-WCAW33994189 /dev/ada7 PL2331L3G9908J /dev/ada8 WD-WXB13B499A8F /dev/ada9 WD-WCAZ3J498182 -------------------------------------------------------------------------------- extern01 /dev/ada7 HDS5C4040ALE630 PL2331LAGG90EJ extern01 /dev/ada4 WD4000FYYZ-01UL1B0 WD-WCC130651147 extern02 /dev/diskid/DISK-WD-WCC131404337 extern02 /dev/diskid/DISK-PL1331LAGG7GKH extern04 /dev/diskid/DISK-WD-WX21D7453SY1 extern04 /dev/ada8 WD6001FSYZ-01SS7B1 WD-WXB1HB4H9AHF home /dev/diskid/DISK-WD-WCAVY3027155 home /dev/diskid/DISK-WD-WCAZAJ471182 zroot /dev/gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70 zroot /dev/gptid/3f737947-14c4-11e4-bc13-bcaec58cba70 -------------------------------------------------------------------------------- ================================================================================ -rw-r--r-- 1 root wheel 1,1K 11 Juli 16:31 /home/zfs-hdd-serial.sh_2017-07-11.log
bootcode
[root@erde ~]# zpool status zroot
pool: zroot
state: DEGRADED
status: One or more devices has been removed by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: resilvered 0 in 213503982334601 days 06:23:30 with 0 errors on Mon Mar 23 20:47:39 2020
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
6227138898055136738 REMOVED 0 0 0 was /dev/diskid/DISK-WD-WMC6M0H02SPUp3
diskid/DISK-WD-WMC6N0H1T7LJp3 ONLINE 0 0 0
errors: No known data errors
[root@erde ~]# zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT extern01 9,06T 7,72T 1,34T - - 1% 85% 1.00x ONLINE - extern02 9,06T 7,97T 1,09T - - 5% 87% 1.00x ONLINE - home 9,06T 2,14T 6,93T - - 3% 23% 1.00x ONLINE - temp 928G 304G 624G - - 0% 32% 1.00x ONLINE - zroot 920G 279G 641G - - 8% 30% 1.00x DEGRADED -
[root@erde ~]# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/diskid/DISK-WD-WMC6N0H1T7LJ partcode written to diskid/DISK-WD-WMC6N0H1T7LJp1 bootcode written to diskid/DISK-WD-WMC6N0H1T7LJ
ein ZFS-Volumen
https://docs.oracle.com/cd/E19253-01/820-2313/gbcet/index.html
Alle ZFS-Informationen anzeigen:
# zfs get -s local all home # zfs get -s default all home # zfs get -s temporary all home # zfs get -s inherited all home # zfs get -s none all home
NFS einschalten:
# zfs set sharenfs=on home
kontrollieren:
# zfs get -s local all home NAME PROPERTY VALUE SOURCE home sharenfs on local
Alle gemounteten ZFS-Volumen anzeigen:
# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT home 1.36T 1.25T 114G 91% ONLINE -
Den status aller gemounteten ZFS-Volumen anzeigen:
# zpool status
pool: home
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
home ONLINE 0 0 0
mirror ONLINE 0 0 0
ad6 ONLINE 0 0 0
ad8 ONLINE 0 0 0
errors: No known data errors
Das ZFS-Volumen BACKUP1000GB auflösen:
# zpool import BACKUP1000GB # zpool destroy BACKUP1000GB # zpool list
Test-Volumen auf Dateibasis anlegen
eine 100MB-Test-Pool-Datei erstellen
> dd if=/dev/zero of=/home/zfs.img bs=10240 count=10240
einen Pool erstellen
> zpool create tank /home/zfs.img
verfühgbare Pools zeigen
> zpool import -d /home/
Pool importieren
> zpool import -d /home/ tank
Pool exportieren
> zpool export tank
einen ZFS-Tank aus einer Platte um eine Platte erweitern
einen ZFS-Tank mit einer Platte erstellen
> zpool create tank1 /var/tmp/zfs1.img
> zpool list tank1 NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank1 95,5M 92,5K 95,4M 0% 1.00x ONLINE -
> zpool status tank1
pool: tank1
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank1 ONLINE 0 0 0
/var/tmp/zfs1.img ONLINE 0 0 0
errors: No known data errors
mit der zweiten Platte ein RAID-0 bauen
> zpool add tank1 /var/tmp/zfs2.img
> zpool list tank1 NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank1 191M 165K 191M 0% 1.00x ONLINE -
> zpool status tank1
pool: tank1
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank1 ONLINE 0 0 0
/var/tmp/zfs1.img ONLINE 0 0 0
/var/tmp/zfs2.img ONLINE 0 0 0
errors: No known data errors
den RAID-0 - Tank zerstören und mit einer Platte wieder erstellen
> zpool destroy tank1 > zpool create tank1 /var/tmp/zfs1.img > zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank1 95,5M 134K 95,4M 0% 1.00x ONLINE -
> zpool status tank1
pool: tank1
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank1 ONLINE 0 0 0
/var/tmp/zfs1.img ONLINE 0 0 0
errors: No known data errors
mit der zweiten Platte ein RAID-1 bauen
> zpool attach tank1 /var/tmp/zfs1.img /var/tmp/zfs2.img > zpool list tank1 NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank1 95,5M 144K 95,4M 0% 1.00x ONLINE -
> zpool status tank1
pool: tank1
state: ONLINE
scan: resilvered 99K in 0h0m with 0 errors on Fri Feb 21 21:48:18 2014
config:
NAME STATE READ WRITE CKSUM
tank1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
/var/tmp/zfs1.img ONLINE 0 0 0
/var/tmp/zfs2.img ONLINE 0 0 0
errors: No known data errors
die zweite Platte aus dem RAID entfernen
> zpool detach tank1 /var/tmp/zfs2.img
eine defekte Platte im RAID gegen eine neue Platte austauschen
nehmen wir mal an, die Platte "zfs1.img" ist defekt und soll gegen die Platte zfs3.img" ausgetauscht werden:
> zpool replace tank1 /var/tmp/zfs1.img /var/tmp/zfs3.img
ZFS-Volumen auf Platte anlegen
einfaches Volumen
einen Pool erstellen
# zpool create BACKUP1000GB /dev/da2
verfühgbare Pools zeigen
# zpool import
Pool importieren
# zpool import BACKUP1000GB
Pool schreibgeschützt importieren
# zpool import -o ro BACKUP1000GB
Pool exportieren
# zpool export BACKUP1000GB
RAID-1 Volumen (Spiegel)
Der einfachste "Spiegel" besteht aus 2 Platten. In der Beschreibung von SUN steht, dass der sinnvollste Spiegen aus 3 Platten besteht, da er in dieser Konfiguration die höchste Sicherheit bietet. Der Sicherheitsgewinn bei 4 und mehr Platten ist zu klein um wirtschaftlich sinnvoll zu sein.
einen Pool erstellen
# zpool create home mirror /dev/ad6 /dev/ad8
Pool exportieren
# zpool export home
verfühgbare Pools zeigen
# zpool import
Pool importieren
# zpool import home
Pool schreibgeschützt importieren
# zpool import -o ro home
RAID-10 Volumen
als erstes bauen wir uns einen RAID-1-Pool:
# zpool create daten mirror diskid/DISK-2CKMG12J diskid/DISK-2CJPY1EN
# zpool status daten
...
config:
NAME STATE READ WRITE CKSUM
daten ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
diskid/DISK-2CKMG12J ONLINE 0 0 0
diskid/DISK-2CJPY1EN ONLINE 0 0 0
und wollen daraus nun ein RAID-10-Pool machen.
Dazu binden wir zwei weitere Festplatten als Mirror zusätzlich dran:
# zpool add daten mirror diskid/DISK-3DJZ45WH diskid/DISK-3PGR457C
# zpool status daten
...
config:
NAME STATE READ WRITE CKSUM
daten ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
diskid/DISK-2CKMG12J ONLINE 0 0 0
diskid/DISK-2CJPY1EN ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
diskid/DISK-3DJZ45WH ONLINE 0 0 0
diskid/DISK-3PGR457C ONLINE 0 0 0
Es ist auch möglich alles in einem einzigen Kommando machen:
# zpool create daten mirror diskid/DISK-2CKMG12J diskid/DISK-2CJPY1EN mirror diskid/DISK-3DJZ45WH diskid/DISK-3PGR457C
ZFS-Volumen vergrößern
Nachdem die alten Platten in einem Pool durch neue größere ausgetauscht wurden, muß der Pool auf die Größer der neuen Festplatten angepasst werden.
# zpool list home NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT home 9.06T 5.87T 3.19T - 1.81T 18% 64% 1.00x ONLINE -
# zpool online -e home diskid/DISK-5QHUL123 diskid/DISK-5QHUR456
# zpool list home NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT home 10.9T 5.87T 5.01T - - 15% 53% 1.00x ONLINE -
Boot-Pool
siehe auch: zusätzliches Laufwerk für FreeBSD 12 einrichten
Wenn man FreeBSD 10 auf einem ZFS-Volumen (RAID1) installiert hat und nun eine Platte davon defekt ist und ausgetauscht werden muss, dann darf man nicht vergessen auch den Boot-Kode zu aktualisieren!
> zpool attach zroot gptid/3f737947-14c4-11e4-bc13-bcaec58cba70 /dev/ada4
Make sure to wait until resilver is done before rebooting.
If you boot from pool 'zroot', you may need to update
boot code on newly attached disk '/dev/ada4'.
Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
in unserem Fall würde das Kommando so aussehen (das funktioniert aber erst, wenn das resilvering abgeschlossen ist):
> gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/ada4
sollte es nicht funktionieren, dann mal nachschauen, ob GEOM die Platte überhaupt kennt:
> glabel status
Name Status Components
diskid/DISK-7JJKANEC N/A ada5
gpt/swap0 N/A ada3p2
gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70 N/A ada3p3
diskid/DISK-PL1331LAGG7GKH N/A ada6
diskid/DISK-WD-WCAZAJ471182 N/A ada7
diskid/DISK-WD-WXB1HB4H9AHF N/A ada8
diskid/DISK-03EF039300A9 N/A da0
ntfs/Freecom N/A da0s1
gpt/gptboot0 N/A ada3p1
gptid/3cde3f3e-14c4-11e4-bc13-bcaec58cba70 N/A ada3p1
diskid/DISK-WD-WMC1T0936998 N/A ada4
gpt/zfs N/A ada4p1
gptid/2c6ef70c-d435-0d40-9c4b-6bb682066374 N/A ada4p1
gptid/a6dd9a1e-fe18-cf4c-8dd7-a7af65ad27af N/A ada4p9
sollte die Platte nicht aufgelistet werden, dann muss man die Platte nocheinmal aus dem Pool entfernen und mit diesem Kommando GEOM bekannt machen:
> gpart create -s gpt ada4
jetzt kann man sie im Pool wieder aufnehmen und das bootcode-Kommando sollte funktionieren.
> geom disk list Geom name: ada3 Providers: 1. Name: ada3 Mediasize: 1000204886016 (932G) Sectorsize: 512 Mode: r2w2e5 descr: WDC WD1003FBYZ-010FB0 lunid: 50014ee25ecb3d1b ident: WD-WCAW36974129 rotationrate: 7200 fwsectors: 63 fwheads: 16
eine boot-fähige root-Platte (ada4) für FreeBSD-10 anlegen, die dann an die bestehende root-Platte (ada3) als mirror (zum RAID-1) angehängt wird:
> gpart show -p ada3
=> 34 1953525101 ada3 GPT (932G)
34 1024 ada3p1 freebsd-boot (512K)
1058 16777216 ada3p2 freebsd-swap (8.0G)
16778274 1936746861 ada3p3 freebsd-zfs (924G)
> gpart destroy -F ada4
> gpart show -l ada4
> gpart create -s gpt ada4
> gpart show -p ada4
> gpart add -t freebsd-boot -s 512K ada4
> gpart show -p ada4
> gpart add -t freebsd-swap -s 8G ada4
> gpart show -p ada4
> gpart add -t freebsd-zfs ada4
> gpart show -p ada4
beide Paltten zu einem RAID-1 zusammenfühgen:
> zpool attach zroot ada3 ada4
…warten, bis beide Platten syncronisiert sind…
Boot-Kode auf die neue Platte schreiben, damit das System auch bei Ausfall der ersten Platte boot-fähig bleibt:
> gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada4
oder so: https://adminforge.de/freebsd/freebsd-zfs-raid-reparieren-nach-festplattentausch/
> gpart destroy -F ada4 > gpart backup ada3 | gpart restore ada4 > gpart show -l ada3 > gpart show -l ada4 > zpool attach zroot ada3 ada4 > zpool status > gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada4
Mount-Point
Konfiguriert man keinen speziellen Mount-Point, dann wird von ZFS automatisch ein Top-Level-Verzeichnis mit Pool-Namen angelegt ("/home").
# zpool import home
ergibt das Verzeichnis:
/home
Will man einen speziellen mount-Point angeben, dann geht das so:
Beispiele
Beispiel 1
# zfs set mountpoint=/home/fritz home/fritz
Hier wird das Volumen (fritz) aus dem Pool (home) als "/home/fritz" gemountet.
Beispiel aus dem Handbuch
# zfs create tank/home # zfs set mountpoint=/export/zfs tank/home # zfs set sharenfs=on tank/home # zfs set compression=on tank/home
oder
# zfs create -o mountpoint=/export/zfs -o sharenfs=on -o compression=on tank/home
Und dann überprüfen:
# zfs get mountpoint,compression tank/home
Beispiel 2
# zfs set mountpoint=/opt tank/opt
Hier wird das Volumen (opt) aus dem Pool (tank) als "/opt" gemountet.
Beispiel 3
auf einem PC-BSD 9.1 - System:
> zpool history History for 'tank0': 2013-05-19.20:51:00 zpool create -m none -f tank0 /dev/ada0s1a.nop 2013-05-19.20:51:00 zpool export tank0 2013-05-19.20:51:02 zpool import tank0 2013-05-19.20:51:02 zfs set atime=off tank0 2013-05-19.20:51:02 zfs create -p tank0/ROOT 2013-05-19.20:51:04 zfs create -p tank0/ROOT/default 2013-05-19.20:51:04 zfs set mountpoint=/mnt tank0/ROOT/default 2013-05-19.20:51:05 zpool set bootfs=tank0/ROOT/default tank0 2013-05-19.20:51:07 zfs create -V 2G -p tank0/swap 2013-05-19.20:51:07 zfs set org.freebsd:swap=on tank0/swap 2013-05-19.20:51:07 zfs set checksum=off tank0/swap 2013-05-19.20:51:09 zfs create -p tank0/root 2013-05-19.20:51:09 zfs set mountpoint=/mnt/root tank0/root 2013-05-19.20:51:11 zfs create -p tank0/tmp 2013-05-19.20:51:11 zfs set mountpoint=/mnt/tmp tank0/tmp 2013-05-19.20:51:11 zfs set compress=lzjb tank0/tmp 2013-05-19.20:51:14 zfs create -p tank0/usr 2013-05-19.20:51:14 zfs set mountpoint=/mnt/usr tank0/usr 2013-05-19.20:51:14 zfs set canmount=off tank0/usr 2013-05-19.20:51:16 zfs create -p tank0/usr/home 2013-05-19.20:51:16 zfs set mountpoint=/mnt/usr/home tank0/usr/home 2013-05-19.20:51:18 zfs create -p tank0/usr/jails 2013-05-19.20:51:18 zfs set mountpoint=/mnt/usr/jails tank0/usr/jails 2013-05-19.20:51:20 zfs create -p tank0/usr/obj 2013-05-19.20:51:21 zfs set mountpoint=/mnt/usr/obj tank0/usr/obj 2013-05-19.20:51:21 zfs set compress=lzjb tank0/usr/obj 2013-05-19.20:51:23 zfs create -p tank0/usr/pbi 2013-05-19.20:51:23 zfs set mountpoint=/mnt/usr/pbi tank0/usr/pbi ...
die für uns wichtigen Befehle können wir z.B. so filtern:
> zpool history | fgrep fritz > zfs create -o mountpoint=/usr/home/fritz -p tank0/usr/home/fritz > zfs destroy tank0/usr/home/fritz
Beispiel 4 (Ubuntu 14.04)
einen Pool (Tank) an einem alternativen Verzeichnis mounten
zpool create -R /alternativer/mount/point tank0 /dev/sdb1
der ZFS-Treiber soll beim booten geladen werden
echo "zfs" >> /etc/modules update-initramfs -u update-grub2
den Pool (Tank) generieren
zpool create fritz /dev/sdb1
es ist möglich, dass man den Pool an ein anderes Verzeichnis mounten lässt:
zfs set mountpoint=/home/fritz fritz
man kann auf einem Pool mehrere Volumen anlegen:
zfs create fritz/jobs
es ist möglich, dass man das Volumen an ein anderes Verzeichnis mounten lässt:
zfs set mountpoint=/home/fritz/jobs fritz/jobs chown -R fritz:nogroup /home/fritz/jobs
Anzeige
zpool list zpool status
ZFS-Datasets im Netzwerk (per NFS bzw. SMB) freigeben
Zwei häufig verwendete und nützliche Dataset-Eigenschaften sind die Freigabeoptionen von NFS und SMB. Diese Optionen legen fest, ob und wie ZFS-Datasets im Netzwerk freigegeben werden. Derzeit unterstützt FreeBSD nur Freigaben von Datasets über NFS.
Für Freigaben per SMB/CIFS muss derzeit noch Samba eingesetzt werden.
Reparieren von Schäden am gesamten ZFS-Speicher-Pool
Dokumentation auf den Seiten von SUN:
am 2011-01-08 gesichert: reparieren_von_schaeden_am_gesamten_zfs-speicher-pool.pdf
zpool status extern04
pool: extern04
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
scan: none requested
config:
NAME STATE READ WRITE CKSUM
extern04 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ada6 FAULTED 0 7.73K 0 too many errors
ada9 ONLINE 0 0 0
zpool scrub extern04
zpool status extern04
pool: extern04
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
scan: scrub in progress since Tue Feb 24 23:34:22 2015
2.36G scanned out of 4.09T at 44.8M/s, 26h32m to go
0 repaired, 0.06% done
config:
NAME STATE READ WRITE CKSUM
extern04 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ada6 FAULTED 0 7.73K 0 too many errors
ada9 ONLINE 0 0 0
aus einem einfachen Pool ein RAID1 machen
In diesem Beispiel verwende ich an Stelle von Festplatten nur Dateien. Das ist zum testen besser geeignet.
So bekommt man ein gutes Gefühl für den Vorgang und kann so eine "Trockenübung" vor dem "Ernstfall" durchgehen.
Als erstes müssen wir uns die beiden Image-Dateien als Plattenersatz erstellen:
# dd if=/dev/zero of=/tmp/zfs1.img bs=10240 count=10240 # dd if=/dev/zero of=/tmp/zfs2.img bs=10240 count=10240
oder so
# truncate -s +100M /tmp/zfs1.img # truncate -s +100M /tmp/zfs2.img
jetzt bauen wir unsere Ausgangsbasis, ein einfachen Pool:
# zpool create TEST01 /tmp/zfs1.img
so, das haben wir erstmal geschaft:
# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT TEST01 95.5M 84K 95.4M 0% ONLINE -
hier sieht man, dass es sich hier um unsere Dateien (und keine Festplatten) handelt:
# zpool status
pool: TEST01
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
TEST01 ONLINE 0 0 0
/tmp/zfs1.img ONLINE 0 0 0
errors: No known data errors
jetzt legen wir unsere Testdaten ab:
# echo "Test 001" > /TEST01/test.txt
und sie sind auch angekommen:
# cat /TEST01/test.txt Test 001
hier machen wir aus unserem einfachen Pool ein RAID-1:
# zpool attach TEST01 /tmp/zfs1.img /tmp/zfs2.img
Wichtig: Die Platte mit den Daten muss als erstes (/tmp/zfs1.img) angegeben werden!
und wir sehen, dass der Pool jetzt aus zwei Dateien (Platten) besteht:
# zpool status
pool: TEST01
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Wed Jan 19 00:49:32 2011
config:
NAME STATE READ WRITE CKSUM
TEST01 ONLINE 0 0 0
mirror ONLINE 0 0 0
/tmp/zfs1.img ONLINE 0 0 0
/tmp/zfs2.img ONLINE 0 0 0 96K resilvered
errors: No known data errors
und jetzt der finale Test, sind unsere Daten noch da?
# cat /TEST01/test.txt Test 001
… es hat geklappt, die Daten sind erhalten geblieben!
einen Pool vergrößern (so etwas ähnliches wie RAID0)
Die Vorbereitungen sehen genauso aus, wie bei dem Test mit dem RAID-1:
# truncate -s +100M /tmp/zfs3.img # truncate -s +100M /tmp/zfs4.img # zpool create TEST02 /tmp/zfs3.img # echo "Test 002" > /TEST01/test.txt # cat /TEST02/test.txt Test 001
und jetzt werden die beiden Platten zusammen gesetzt, hierbei bleiben
# zpool add TEST02 /tmp/zfs4.img
die Daten sind noch da:
# cat /TEST02/test.txt Test 001
der Pool ist jetzt doppelt so groß:
# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT TEST02 191M 150K 191M 0% 1.00x ONLINE -
beide Platten sind im Pool und es ist kein Mirror:
# zpool status TEST02
pool: TEST02
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
TEST02 ONLINE 0 0 0
/tmp/zfs3.img ONLINE 0 0 0
/tmp/zfs4.img ONLINE 0 0 0
errors: No known data errors
spare
eine "spare" zum ganzen Pool hinzufühgen:
# zpool add pool01 spare diskid/DISK-ZA23ZYXJ
# zpool status pool01
...
NAME STATE READ WRITE CKSUM
pool01 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
diskid/DISK-1A25NDPU ONLINE 0 0 0
diskid/DISK-2BHNABYV ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
diskid/DISK-3CHWEMHW ONLINE 0 0 0
diskid/DISK-4DGR4H7X ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
diskid/DISK-5EGW976Y ONLINE 0 0 0
diskid/DISK-6FKMG95Z ONLINE 0 0 0
spares
diskid/DISK-ZA23ZYXJ AVAIL
errors: No known data errors
Mir ist leider nicht bekannt, wie man zu einem einzelnen Mirror im Raid-10-Pool eine spare-Platte hinzufügen kann.
Denn der mirror-0 besteht aus 10TB-Platten, der mirror-1 besteht aus 12TB-Platten der mirror-2 besteht aus 16TB-Platten.
Die spare-Platte ist aber auch nur 10TB groß…
Demnach macht eine Spare für den kompletten Pool keinen Sinn.
# zpool list pool01 NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT pool01 34.5T 28.6T 5.93T - - 4% 82% 1.00x ONLINE -
defekte Platte durch spare ersetzen
# zpool status pool01
...
NAME STATE READ WRITE CKSUM
pool01 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
diskid/DISK-1A25NDPU ONLINE 0 0 0
diskid/DISK-2BHNABYV REMOVED 0 0 0
mirror-1 ONLINE 0 0 0
diskid/DISK-3CHWEMHW ONLINE 0 0 0
diskid/DISK-4DGR4H7X ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
diskid/DISK-5EGW976Y ONLINE 0 0 0
diskid/DISK-6FKMG95Z ONLINE 0 0 0
spares
diskid/DISK-ZA23ZYXJ AVAIL
errors: No known data errors
so wird die defekte Platte durch die Spare-Platte ausgetauscht:
# zpool replace daten diskid/DISK-2BHNABYV diskid/DISK-ZA23ZYXJ
...
NAME STATE READ WRITE CKSUM
pool01 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
diskid/DISK-1A25NDPU ONLINE 0 0 0
spare-1 ONLINE 0 0 0
diskid/DISK-2BHNABYV ONLINE 0 0 0
diskid/DISK-ZA23ZYXJ ONLINE 0 0 0 (resilvering)
mirror-1 ONLINE 0 0 0
diskid/DISK-3CHWEMHW ONLINE 0 0 0
diskid/DISK-4DGR4H7X ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
diskid/DISK-5EGW976Y ONLINE 0 0 0
diskid/DISK-6FKMG95Z ONLINE 0 0 0
spares
diskid/DISK-ZA23ZYXJ INUSE currently in use
ZFS-Probleme
ZFS: checksum mismatch
Das Problem sieht in der Logdatei wie folgt aus:
Mar 31 23:30:50 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=297610772480 size=131072 Mar 31 23:30:50 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=297610772480 size=131072 Mar 31 23:30:50 plebeian root: ZFS: zpool I/O failure, zpool=storage error=86 Mar 31 23:31:20 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=23159373824 size=131072 Mar 31 23:31:20 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=23159373824 size=131072 Mar 31 23:31:20 plebeian root: ZFS: zpool I/O failure, zpool=storage error=86 Mar 31 23:31:34 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=18063163392 size=131072 Mar 31 23:31:34 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=18063163392 size=131072 Mar 31 23:31:34 plebeian root: ZFS: zpool I/O failure, zpool=storage error=86 Mar 31 23:31:34 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=18062901248 size=131072 Mar 31 23:31:34 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=18062901248 size=131072 Mar 31 23:31:34 plebeian root: ZFS: zpool I/O failure, zpool=storage error=86 Mar 31 23:31:35 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=17453809664 size=131072 Mar 31 23:31:35 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=17453809664 size=131072 Mar 31 23:31:35 plebeian root: ZFS: zpool I/O failure, zpool=storage error=86 Mar 31 23:31:35 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=17453809664 size=131072 Mar 31 23:31:35 plebeian root: ZFS: checksum mismatch, zpool=storage path=/dev/ad4s1d.eli offset=17453809664 size=131072 Mar 31 23:31:35 plebeian root: ZFS: zpool I/O failure, zpool=storage error=86
# sysctl kern.smp.disabled=1
zpool device UNAVAIL
Problem anzeigen:
[root@server ~]# zpool status -v extern03
pool: extern03
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://illumos.org/msg/ZFS-8000-2Q
scan: scrub in progress since Sun Feb 2 21:35:35 2014
1,89T scanned out of 2,79T at 50,5M/s, 5h10m to go
0 repaired, 67,85% done
config:
NAME STATE READ WRITE CKSUM
extern03 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
da1 ONLINE 0 0 0
17785732228181994288 UNAVAIL 0 0 0 was /dev/da3
errors: No known data errors
Laufwerk wieder online nehmen:
[root@server ~]# zpool online extern03 17785732228181994288
wenn das nicht funktioniert, dann Laufwerk entfernen:
[root@server ~]# zpool detach extern03 17785732228181994288
Laufwerk wieder anfühgen:
[root@server ~]# zpool attach extern03 /dev/da1 /dev/da2
jetzt wird der Spiegel wieder hergestellt:
[root@server ~]# zpool status -v extern03
pool: extern03
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Feb 3 08:36:50 2014
59,5M scanned out of 2,79T at 2,29M/s, 355h0m to go
59,2M resilvered, 0,00% done
config:
NAME STATE READ WRITE CKSUM
extern03 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0 (resilvering)
errors: No known data errors
…das dauert jetzt eine Weile…
…und wenn es fertig ist, können wir den Fehlerspeicher löschen:
> zpool clear extern03
und so sieht es dann wieder wie neu aus:
> zpool status extern03
pool: extern03
state: ONLINE
scan: resilvered 220K in 0h0m with 0 errors on Tue Feb 4 10:10:25 2014
config:
NAME STATE READ WRITE CKSUM
extern03 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
ZFS Tuning
Tuning is Evil
Tuning is often evil and should rarely be done.
First, consider that the default values are set by the people who know the most about the effects of the tuning on the software that they supply. If a better value exists, it should be the default. While alternative values might help a given workload, it could quite possibly degrade some other aspects of performance. Occasionally, catastrophically so.
interessante Optionen:
- "
compression:" der Speicherplatzbedarf sinkt dramatisch, ebenso sinkt die Datensicherheit; - "
deduplication:" der Speicherplatzbedarf sinkt nur leicht (2-5GB bei 1TB) und die Geschwindigkeit sinkt ebenfalls;
Trivial
Die Speicherung oder Übertragung einer Informationseinheit (z. B. ein Bit) ist an die Speicherung oder Übertragung von Energie gekoppelt, da Information ohne ein Medium nicht existieren kann, d. h. Information ist an die Existenz unterscheidbarer Zustände gekoppelt. Da die Energie Quantisiert ist (es eine aller kleinste unteilbare Energiemenge gibt), ist eine Mindestmenge von Energie pro Informationseinheit notwendig, sonst geht die Information verloren. Um einen Speicherpool mit 128-Bit-Adressierung zu füllen, wäre eine Energiemenge notwendig, die größer ist als die Menge an Energie, die ausreichen würde, um die irdischen Ozeane zu verdampfen. Deshalb geht man davon aus, dass die Kapazität von ZFS für immer ausreichen wird.
Probleme / Fehler
Aug 2 07:09:23 freebsd12 kernel: ahcich5: Timeout on slot 20 port 0 Aug 2 07:09:23 freebsd12 kernel: ahcich5: is 00000000 cs 00000000 ss 00000000 rs 00100000 tfd 50 serr 00000000 cmd 00711417
Scheinbar funktionieren ZFS + Marvell-Controller nicht so gut zusammen!
Nachdem ich diesen SATA-Controller mit Marvell-Chipsatz aus dem System entfernt hatte, war das Problem behoben.
