ZFS, die Kurzform von Zettabyte Filesystem, ist ein fortschrittliches und hochskalierbares Dateisystem. Es wurde ursprünglich von Sun Microsystems entwickelt und ist jetzt Teil des OpenZFS-Projekts. Bei so vielen Dateisystemen, die unter Linux verfügbar sind, ist es ganz natürlich zu fragen, was das Besondere an ZFS ist. Im Gegensatz zu anderen Dateisystemen ist es nicht nur ein Dateisystem, sondern auch ein logischer Volume-Manager. Einige der Funktionen von ZFS, die es beliebt machen, sind:
- Datenintegrität - Datenkonsistenz und -integrität werden durch Copy-on-Write- und Prüfsummentechniken sichergestellt
- Pooling von Speicherplatz - verfügbare Speicherlaufwerke können in einem einzigen Pool namens zpool zusammengefasst werden
- Software-RAID - Das Einrichten eines raidz-Arrays ist so einfach wie die Ausgabe eines einzigen Befehls.
- Integrierter Volume-Manager – ZFS fungiert auch als Volume-Manager.
- Snapshots, Klone, Komprimierung – dies sind einige der erweiterten Funktionen, die ZFS bietet.
ZFS ist ein 128-Bit-Dateisystem und kann 256 Zetta-Bytes speichern! In diesem Handbuch lernen wir, wie man einige wichtige ZFS-Befehle auf einem CentOS 7-Server installiert, einrichtet und auch verwendet.
HINWEIS:Der Installationsteil ist spezifisch für den CentOS-Server, während die Befehle auf allen Linux-Systemen gleich sind
Terminologie
Bevor wir fortfahren, lassen Sie uns einige der Terminologien verstehen, die häufig in ZFS verwendet werden.
Pool
Logische Gruppierung von Speicherlaufwerken. Es ist der Grundbaustein von ZFS und von hier aus wird den Datensätzen Speicherplatz zugewiesen.
Datensätze
Die Komponenten des ZFS-Dateisystems, nämlich Dateisystem, Klone, Snapshots und Volumes, werden als Datasets bezeichnet.
Spiegel
Ein virtuelles Gerät, das identische Datenkopien auf zwei oder mehr Festplatten speichert. In Situationen, in denen eine Festplatte ausfällt, sind dieselben Daten auf anderen Festplatten dieser Spiegelung verfügbar.
Resilvering
Vorgang des Kopierens von Daten von einer Festplatte auf eine andere im Falle der Wiederherstellung eines Geräts.
Scrubben
Scrub wird zur Konsistenzprüfung in ZFS verwendet, so wie fsck in anderen Dateisystemen verwendet wird
ZFS installieren
Um ZFS auf CentOS zu installieren, müssen wir zuerst das EPEL-Repository für unterstützende Pakete und dann das ZFS-Repository einrichten, um die erforderlichen ZFS-Pakete zu installieren.
Hinweis:Bitte stellen Sie allen Befehlen sudo voran, wenn Sie nicht der Root-Benutzer sind.
yum localinstall --nogpgcheck http://epel.mirror.net.in/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm
Installieren Sie nun die Kernel-Entwicklungs- und zfs-Pakete. Kernel-Entwicklungspakete werden benötigt, da ZFS als Modul erstellt und in den Kernel eingefügt wird.
yum install kernel-devel zfs
Überprüfen Sie, ob das zfs-Modul mit dem Befehl „lsmod“ in den Kernel eingefügt wurde, und falls nicht, fügen Sie es manuell mit dem Befehl „modprobe“ ein.
[root@li1467-130 ~]# lsmod |grep zfs
[root@li1467-130 ~]# modprobe zfs
[root@li1467-130 ~]# lsmod |grep zfs
zfs 2790271 0
zunicode 331170 1 zfs
zavl 15236 1 zfs
zcommon 55411 1 zfs
znvpair 89086 2 zfs,zcommon
spl 92029 3 zfs,zcommon,znvpair
Lassen Sie uns prüfen, ob wir die zfs-Befehle verwenden können:
[root@li1467-130 ~]# zfs list
no datasets available
Verwaltung
ZFS hat zwei Hauptdienstprogramme, zpool und zfs. Während sich zpool mit der Erstellung und Wartung von Pools unter Verwendung von Festplatten befasst, ist das Dienstprogramm zfs für die Erstellung und Wartung von Datensätzen verantwortlich.
zpool-Dienstprogramm
Pools erstellen und zerstören
Überprüfen Sie zuerst die verfügbaren Laufwerke, um einen Speicherpool zu erstellen.
[root@li1467-130 ~]# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Mar 16 08:12 /dev/sda
brw-rw---- 1 root disk 8, 16 Mar 16 08:12 /dev/sdb
brw-rw---- 1 root disk 8, 32 Mar 16 08:12 /dev/sdc
brw-rw---- 1 root disk 8, 48 Mar 16 08:12 /dev/sdd
brw-rw---- 1 root disk 8, 64 Mar 16 08:12 /dev/sde
brw-rw---- 1 root disk 8, 80 Mar 16 08:12 /dev/sdf
Erstellen Sie einen Pool aus einer Reihe von Laufwerken.
zpool create <option> <pool name. <drive 1> <drive 2> .... <drive n>
[root@li1467-130 ~]# zpool create -f zfspool sdc sdd sde sdf
Der Befehl 'zpool status' zeigt den Status der verfügbaren Pools an
[root@li1467-130 ~]# zpool status
pool: zfspool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zfspool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
Überprüfen Sie, ob die Pool-Erstellung erfolgreich war.
[root@li1467-130 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda 19G 1.4G 17G 8% /
devtmpfs 488M 0 488M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 50M 447M 11% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
tmpfs 100M 0 100M 0% /run/user/0
zfspool 3.7G 0 3.7G 0% /zfspool
Wie Sie sehen können, hat zpool einen Pool namens „zfspool“ mit einer Größe von 3,7 GB erstellt und ihn auch in /zfspool gemountet.
Verwenden Sie zum Zerstören eines Pools den Befehl „zpool Destroy“
zpool destroy <pool name>
[root@li1467-130 ~]# zpool destroy zfspool
[root@li1467-130 ~]# zpool status
no pools available
Lassen Sie uns nun versuchen, einen einfachen Spiegelpool zu erstellen.
zpool create <option> <pool name> mirror <drive 1> <drive 2>... <drive n>
Wir können auch mehrere Mirrors gleichzeitig erstellen, indem wir das Mirror-Schlüsselwort gefolgt von den Laufwerken wiederholen.
[root@li1467-130 ~]# zpool create -f mpool mirror sdc sdd mirror sde sdf
[root@li1467-130 ~]# zpool status
pool: mpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
Im obigen Beispiel haben wir Spiegelpools mit jeweils zwei Festplatten erstellt.
Ebenso können wir einen Raidz-Pool erstellen.
[root@li1467-130 ~]# zpool create -f rpool raidz sdc sdd sde sdf
[root@li1467-130 ~]# zpool status
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
Geräte in ZFS-Pools verwalten
Sobald ein Pool erstellt wurde, ist es möglich, Hotspares und Cache-Geräte zum Pool hinzuzufügen oder daraus zu entfernen, Geräte mit gespiegelten Pools zu verbinden oder von ihnen zu trennen und Geräte zu ersetzen. Aber nicht-redundante und raidz-Geräte können nicht aus einem Pool entfernt werden. Wir werden in diesem Abschnitt sehen, wie einige dieser Operationen durchgeführt werden.
Ich erstelle zuerst einen Pool namens „testpool“, der aus zwei Geräten besteht, sdc und sdd. Dieser wird dann eine weitere Geräte-sde hinzugefügt.
[root@li1467-130 ~]# zpool create -f testpool sdc sdd
[root@li1467-130 ~]# zpool add testpool sde
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
Wie bereits erwähnt, kann ich dieses neu hinzugefügte Gerät nicht entfernen, da es sich nicht um einen redundanten oder raidz-Pool handelt.
[root@li1467-130 ~]# zpool remove testpool sde
cannot remove sde: only inactive hot spares, cache, top-level, or log devices can be removed
Aber ich kann diesem Pool eine Ersatzfestplatte hinzufügen und sie entfernen.
[root@li1467-130 ~]# zpool add testpool spare sdf
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
spares
sdf AVAIL
errors: No known data errors
[root@li1467-130 ~]# zpool remove testpool sdf
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
In ähnlicher Weise können wir den Befehl „attach“ verwenden, um Datenträger an einen gespiegelten oder nicht gespiegelten Pool anzuhängen, und den Befehl „distach“, um Datenträger aus einem gespiegelten Pool zu trennen.
zpool attach <options> <pool name> <device> <new device>
zpool detach <pool name> <device>
Wenn ein Gerät ausfällt oder beschädigt wird, können wir es mit dem Befehl „replace“ ersetzen.
zpool replace <options> <pool name> <device> <new device>
Wir werden dies testen, indem wir ein Gerät in einer gespiegelten Konfiguration gewaltsam beschädigen.
[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde
Dadurch wird ein Spiegelpool erstellt, der aus den Festplatten sdd und sde besteht. Lassen Sie uns nun das SDD-Laufwerk absichtlich beschädigen, indem wir Nullen hineinschreiben.
[root@li1467-130 ~]# dd if=/dev/zero of=/dev/sdd
dd: writing to ‘/dev/sdd’: No space left on device
2048001+0 records in
2048000+0 records out
1048576000 bytes (1.0 GB) copied, 22.4804 s, 46.6 MB/s
Wir werden den 'scrub'-Befehl verwenden, um diese Beschädigung zu erkennen.
[root@li1467-130 ~]# zpool scrub testpool
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: scrub repaired 0 in 0h0m with 0 errors on Fri Mar 18 09:59:40 2016
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdd UNAVAIL 0 0 0 corrupted data
sde ONLINE 0 0 0
errors: No known data errors
Wir werden jetzt sdd durch sdc ersetzen.
[root@li1467-130 ~]# zpool replace testpool sdd sdc; zpool status
pool: testpool
state: ONLINE
scan: resilvered 83.5K in 0h0m with 0 errors on Fri Mar 18 10:05:17 2016
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
replacing-0 UNAVAIL 0 0 0
sdd UNAVAIL 0 0 0 corrupted data
sdc ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: resilvered 74.5K in 0h0m with 0 errors on Fri Mar 18 10:00:36 2016
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
Migration von Pools
Wir können Speicherpools mithilfe von Export- und Importbefehlen zwischen verschiedenen Hosts migrieren. Dazu sollten die im Pool verwendeten Platten auf beiden Systemen verfügbar sein.
[root@li1467-130 ~]# zpool export testpool
[root@li1467-130 ~]# zpool status
no pools available
Der Befehl 'zpool import' listet alle Pools auf, die für den Import zur Verfügung stehen. Führen Sie diesen Befehl auf dem System aus, in das Sie den Pool importieren möchten.
[root@li1467-131 ~]# zpool import
pool: testpool
id: 3823664125009563520
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
testpool ONLINE
sdc ONLINE
sdd ONLINE
sde ONLINE
Importieren Sie nun den benötigten Pool
[root@li1467-131 ~]# zpool import testpool
[root@li1467-131 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
iostat
Man kann die io-Statistiken der Pool-Geräte mit dem Befehl iostat überprüfen.
[root@li1467-130 ~]# zpool iostat -v testpool
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
testpool 1.80M 2.86G 22 27 470K 417K
sdc 598K 975M 8 9 200K 139K
sdd 636K 975M 7 9 135K 139K
sde 610K 975M 6 9 135K 139K
---------- ----- ----- ----- ----- ----- -----
zfs-Dienstprogramm
Wir werden nun zum Dienstprogramm zfs übergehen. Hier sehen wir uns an, wie Datensätze erstellt und zerstört werden, Dateisystemkomprimierung, Kontingente und Snapshots.
Dateisystem erstellen und zerstören
Das ZFS-Dateisystem kann mit dem Befehl zfs create
erstellt werdenzfs create <filesystem>
[root@li1467-130 ~]# zfs create testpool/students
[root@li1467-130 ~]# zfs create testpool/professors
[root@li1467-130 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda 19G 1.4G 17G 8% /
devtmpfs 488M 0 488M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 50M 447M 11% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
testpool 2.8G 0 2.8G 0% /testpool
tmpfs 100M 0 100M 0% /run/user/0
testpool/students 2.8G 0 2.8G 0% /testpool/students
testpool/professors 2.8G 0 2.8G 0% /testpool/professors
Beachten Sie bei der obigen Ausgabe, dass, obwohl zum Zeitpunkt der Dateisystemerstellung kein Einhängepunkt angegeben ist, der Einhängepunkt unter Verwendung derselben Pfadbeziehung wie die des Pools erstellt wird.
zfs create erlaubt die Verwendung von -o, wodurch wir Optionen wie Einhängepunkt, Komprimierung, Quota, Exec usw. angeben können.
Man kann das verfügbare Dateisystem mit zfs list auflisten:
[root@li1467-130 ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
testpool 100M 2.67G 19K /testpool
testpool/professors 31K 1024M 20.5K /testpool/professors
testpool/students 1.57M 98.4M 1.57M /testpool/students
Wir können ein Dateisystem mit der Destroy-Option
zerstörenzfs destroy <filesystem>
Komprimierung
Wir werden jetzt verstehen, wie die Komprimierung in ZFS funktioniert. Bevor wir mit der Verwendung der Komprimierung beginnen, müssen wir sie mit 'Komprimierung festlegen'
aktivierenzfs set <compression=value> <filesystem|volume|snapshot>
Sobald dies erledigt ist, erfolgt die Komprimierung und Dekomprimierung im laufenden Betrieb transparent auf dem Dateisystem.
In unserem Beispiel werde ich die Komprimierung für das Studentenverzeichnis mit dem lz4-Komprimierungsalgorithmus aktivieren.
[root@li1467-130 ~]# zfs set compression=lz4 testpool/students
Ich werde jetzt eine Datei der Größe 15M in dieses Dateisystem kopieren und die Größe nach dem Kopieren überprüfen.
[root@li1467-130 /]# cd /var/log
[root@li1467-130 log]# du -h secure
15M secure
[root@li1467-130 ~]# cp /var/log/secure /testpool/students/
[root@li1467-130 students]# df -h .
Filesystem Size Used Avail Use% Mounted on
testpool/students 100M 1.7M 99M 2% /testpool/students
Beachten Sie, dass die im Dateisystem verwendete Größe nur 1,7 MB beträgt, während die Dateigröße 15 MB betrug. Wir können auch das Komprimierungsverhältnis überprüfen..
[root@li1467-130 ~]# zfs get compressratio testpool
NAME PROPERTY VALUE SOURCE
testpool compressratio 9.03x
-
Kontingente und Reservierung
Lassen Sie mich Quoten anhand eines realen Beispiels erklären. Angenommen, wir haben in einer Universität die Anforderung, den vom Dateisystem für Professoren und Studenten verwendeten Speicherplatz zu begrenzen. Nehmen wir an, dass wir 100 MB für Studenten und 1 GB für Professoren zuweisen müssen. Wir können in ZFS „Kontingente“ verwenden, um diese Anforderung zu erfüllen. Quoten stellen sicher, dass der von einem Dateisystem belegte Speicherplatz die festgelegten Grenzen nicht überschreitet. Die Reservierung hilft bei der tatsächlichen Zuweisung und Gewährleistung, dass die erforderliche Menge an Speicherplatz für das Dateisystem verfügbar ist.
zfs set quota=<value> <filesystem|volume|snapshot>
zfs set reservation=<value> <filesystem|volume|snapshot>
[root@li1467-130 ~]# zfs set quota=100M testpool/students
[root@li1467-130 ~]# zfs set reservation=100M testpool/students
[root@li1467-130 ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
testpool 100M 2.67G 19K /testpool
testpool/professors 19K 2.67G 19K /testpool/professors
testpool/students 1.57M 98.4M 1.57M /testpool/students
[root@li1467-130 ~]# zfs set quota=1G testpool/professors
[root@li1467-130 ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
testpool 100M 2.67G 19K /testpool
testpool/professors 19K 1024M 19K /testpool/professors
testpool/students 1.57M 98.4M 1.57M /testpool/students
Im obigen Beispiel haben wir 100 MB für Studenten und 1 GB für Professoren zugewiesen. Beachten Sie die Spalte „AVAIL“ in „zfs list“. Anfangs hatten sie jeweils eine Größe von 2,67 GB und nach dem Festlegen des Kontingents haben sich die Werte entsprechend geändert.
Schnappschüsse
Snapshots sind schreibgeschützte Kopien des ZFS-Dateisystems zu einem bestimmten Zeitpunkt. Sie verbrauchen keinen zusätzlichen Speicherplatz im zfs-Pool. Wir können entweder zu einem späteren Zeitpunkt auf denselben Zustand zurücksetzen oder nur eine einzelne oder eine Gruppe von Dateien gemäß den Benutzeranforderungen extrahieren.
Ich werde jetzt einige Verzeichnisse und eine Datei unter „/testpool/professors“ aus unserem vorherigen Beispiel erstellen und dann einen Schnappschuss dieses Dateisystems machen.
[root@li1467-130 ~]# cd /testpool/professors/
[root@li1467-130 professors]# mkdir maths physics chemistry
[root@li1467-130 professors]# cat > qpaper.txt
Question paper for the year 2016-17
[root@li1467-130 professors]# ls -la
total 4
drwxr-xr-x 5 root root 6 Mar 19 10:34 .
drwxr-xr-x 4 root root 4 Mar 19 09:59 ..
drwxr-xr-x 2 root root 2 Mar 19 10:33 chemistry
drwxr-xr-x 2 root root 2 Mar 19 10:32 maths
drwxr-xr-x 2 root root 2 Mar 19 10:32 physics
-rw-r--r-- 1 root root 36 Mar 19 10:35 qpaper.txt
Um einen Schnappschuss zu erstellen, verwenden Sie die folgende Syntax:
zfs snapshot <filesystem|volume@<snap>>
[root@li1467-130 professors]# zfs snapshot testpool/professors@03-2016
[root@li1467-130 professors]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
testpool/professors@03-2016 0 - 20.5K -
Ich werde jetzt die erstellte Datei löschen und aus den Snapshots extrahieren
[root@li1467-130 professors]# rm -rf qpaper.txt
[root@li1467-130 professors]# ls
chemistry maths physics
[root@li1467-130 professors]# cd .zfs
[root@li1467-130 .zfs]# cd snapshot/03-2016/
[root@li1467-130 03-2016]# ls
chemistry maths physics qpaper.txt
[root@li1467-130 03-2016]# cp -a qpaper.txt /testpool/professors/
[root@li1467-130 03-2016]# cd /testpool/professors/
[root@li1467-130 professors]# ls
chemistry maths physics qpaper.txt
Die gelöschte Datei ist wieder an ihrem Platz.
Wir können alle verfügbaren Snapshots mit zfs list auflisten:
[root@li1467-130 ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
testpool/professors@03-2016 10.5K - 20.5K -
Lassen Sie uns zum Schluss den Snapshot mit dem Befehl zfs destroy zerstören:
zfs destroy <filesystem|volume@<snap>>
[root@li1467-130 ~]# zfs destroy testpool/professors@03-2016
[root@li1467-130 ~]# zfs list -t snapshot
no datasets available
Schlussfolgerung
In diesem Artikel haben Sie gelernt, wie Sie ZFS unter CentOS 7 installieren und einige grundlegende und wichtige Befehle der Dienstprogramme zpool und zfs verwenden. Dies ist keine vollständige Liste. ZFS hat viel mehr Möglichkeiten und Sie können sie auf der offiziellen Seite weiter erkunden.