Testbericht Datensicherheit für Bilder & Co.

Thread Status
Hello, There was no answer in this thread for more than 30 days.
It can take a long time to get an up-to-date response or contact with relevant users.

Markus Grundmann

Sehr aktives NF Mitglied
Registriert
Hallo! Wir kennen alle das Problem. Datensicherheit auf unseren Computern. Mit Datensicherheit meine ich
in diesem Fall nicht den Schutz von unerlaubten Zugriff Dritter. Vielmehr möchte ich Euch einen kleinen
Einblick in die Praxiserfahrung der letzten Wochen geben. Sicherlich wird dieses Thema nicht alle Forums-
mitglieder ansprechen weil sie ggf. die technische Grundlagen nicht besitzen oder diesen Aufwand nicht
betreiben wollen oder können. Wer unter uns keine NAS-basierten Storage-Systeme für den Heimbereich im
Einsatz hat und sich nicht davor scheut ein Stück PC-Hardware mit einem Unix-ähnlichen Betriebssystem
zu betreiben für diejenigen könnte das folgende Thema eventuell interessant sein.

Ich persönlich betreibe seit ca. 15+ Jahren meinen Home-Server unter dem FreeBSD-Betriebssystem. Wer von
FreeBSD noch nichts gehört hat oder meint er hätte noch keinen Kontakt damit gehabt der wird sich vielleicht
wundern auf welchen Platformen sich dieses unter anderem Namen befindet (z.B. MacOS, JunOS etc.)

FreeBSD arbeitet von Haus aus mit vfs. vfs ist ein sog. "file system layer" und ermöglicht dem Kernel
diverse Dateisysteme (Filesystems) einzubinden. Dieses Feature gibt es natürlich auch bei Linux-Betriebssystemen.
Bei Linux kommt in der Regel ein ext2/3/4-Dateisystem in einer Partition oder einem sogenannten
Logical Volume Manager (LVM) zum Einsatz. Das aber nur zur kurzen Einführung. Primär geht es mir um
die Vermittlung meiner Erfahrungen mit dem ZFS-Dateisystem ("The Z file system"). ZFS wurde von Sun Microsystems
entwickelt und wurde primär unter Sun Solaris zum Einsatz gebracht. ZFS ist Transaktionsorientiertes Dateisystem
was ohne Journalisierung arbeitet. In diesem Fall wird bei einem Schreibvorgang ein modifizierter Datenblock zusätzlich
in das Dateisystem geschrieben und dann nach erfolgreicher Arbeit der "alte" Datenblock erst gelöscht. So kann
es in der Praxis nie zu inkonsistenten Daten kommen. Wer Details über ZFS erfahren möchte darf gern Google bemühen.

Also! Meine Aufgabe war es einen Fileserver aufzubauen, dem ich meinen gesamten Bilderbestand in der Größe von
1000 GByte in Form von 74348 Bilddateien (NEF/TIF/JPEG) anvertrauen wollte. Warum nun ZFS? Die Frage beantworte
ich gern im Laufe dieses Threads. Ich möchte erst einmal ein paar Beispiele zeigen wie ZFS im Betrieb ausschaut.

Es gibt ein paar mächtige Befehle die auch ein Non-Root-User ausführen kann um sich eine Lage über das Datei-
systems zu verschaffen. Im folgenden Beispiel soll mir ZFS zeigen was es kennt. Bei ZFS wird i.d.R. nur mit
Dateisystemen gearbeitet. Partitionen (gibt es aber) werden hier nicht benötigt.

ZFS nun zeig mir mal wie mein Dateisystem aussieht:

Code:
# zpool status
  pool: raid1p1
 state: ONLINE
  scan: scrub repaired 0 in 4h46m with 0 errors on Sat Feb  2 07:56:07 2013
config:

        NAME        STATE     READ WRITE CKSUM
        raid1p1     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            ada3    ONLINE       0     0     0
            ada4    ONLINE       0     0     0

errors: No known data errors

Wie man oben sehen kann besteht mein Speicherpool ("raid1p1") aus vier 2TB Festplatten. Jeweils zwei Festplatten
sind in einem Spiegel (Mirror aka RAID1) zusammengefasst. Es gibt den Plattenpool "mirror-0" und "mirror-1". Die
Festplatten unter FreeBSD werden je nach Controller mit entsprechenden Namen versehen. In diesem Fall sind es
die Festplatten ada1, ada2, ada3 und ada4. Die Plattenspiegel war für mich die erste Wahl. ZFS kann natürlich
auch diverse RAID-Level. Die muss ich als Administrator aber eigentlich nicht kennen. ZFS nimmt sich die Platten
und schaut welchen sinnvollen RAIDZ-Level es dafür einrichtet. Soll mir Recht sein. Wozu gibt es Computer?! :)

Leider verbrauchen Spiegel immer viel Kapazität. Bei zwei 2TB Festplatten bleiben mir Netto ca. 1.8TB übrig.
Bei ZFS spielt sich aber alles in einem oder mehreren Pools ab. Jetzt kann ich mit einem einfachen Befehl weitere
Platten zu meinem Speicherpool hinzufügen. Dazu gebe ich ein: "zpool add raid1p1 mirror ada3 ada4". Was ist
passiert? ZFS hat die beiden Festplatten ada3 und ada4 zum Pool "raid1p1" hinzugefügt. Und das bedeutet was?

ZFS wieviel Platz habe ich den nun???

Code:
# zpool list
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
raid1p1  3.62T  1.28T  2.35T    35%  1.00x  ONLINE  -

Wie man nun sieht hat ZFS einfach meinen gespiegelt Pool um einen weiteren Spiegel erweitert und es sind
nun Netto 3.62TB für Daten verfügbar. Ist das auch alles gut?

ZFS nun sag mir mal wie Du Dich "fühlst" ?

Code:
# zpool status -x
all pools are healthy

Naja! Jetzt haben wir einen Speicherpool. Schön! Und nun? Mit "zfs list" zeige ich Euch mal das aktuelle
Dateisystem was ich im Einsatz habe. Die vielen Unterstriche in den Namen habe ich für diesen Artikel
eingefügt. Im Original stehen dort Unix-Usernamen. ZFS zeigt mir nun eine Liste von Pfaden. Auf der
linken Seite der Pool mit seinen Töchtern und ganz Rechts der sog. Mountpoint. ZFS benötigt keinen /etc/fstab
und Filesysteme müssen nicht gemounted werden. ZFS macht das alles selbst (auch nach dem Boot). ZFS ist
unter FreeBSD als vollwertige Kernel-Implementierung gegeben und damit sehr schnell. Es braucht allerdings
mindestens 4 GB RAM um "vernünftigt" arbeiten zu können. Im normalen Betrieb habe ich eine Speicherauslastung
von 10-12 GB (ohne Software). Unter Linux (bedingt durch die Lizenz) ist es nur als langsamere FUSE-Implementierug
vorhanden (bzw. wird in Distributionen so ausgeliefert). Das aber nur als kurze Anmerkung.

Code:
# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
raid1p1                     2.36T  1.21T    31K  /raid1p1
raid1p1/development         47.2M  4.95G  47.2M  /development
raid1p1/home                2.16T  1.21T  50.5K  /home
raid1p1/home/a_____r         145G  15.2G   140G  /home/a_____r
raid1p1/home/a_____r/mail    155M  4.85G   154M  /home/a_____r/mail
raid1p1/home/a__________r    186K   500M   186K  /home/a__________r
raid1p1/home/c______t       38.5K   500M  38.5K  /home/c_____t
raid1p1/home/c___e            36K   500G    36K  /home/c___e
raid1p1/home/d________t     40.5K   500M  40.5K  /home/d_______t
raid1p1/home/j______r        186M   838M   186M  /home/j______r
raid1p1/home/m______        1.06T   959G  1.06T  /home/m______
raid1p1/home/m______/mail   1.54G  3.46G  1.54G  /home/m______/mail
raid1p1/home/nanog          31.2M   469M  31.2M  /home/nanog
raid1p1/home/netop            40K   500M    40K  /home/netop
raid1p1/home/n_____         2.17M   498M  2.17M  /home/n______
raid1p1/home/o___            110M   390M   110M  /home/o____
raid1p1/home/s______r       20.5M  1003M  20.5M  /home/s_______r
raid1p1/home/t__r             31K  1024M    31K  /home/t__r
raid1p1/home/v_____p         159M  1.84G   159M  /home/v_______p
raid1p1/home/x______n        228K  1024M   228K  /home/x_______n
raid1p1/log                 12.9M  1.99G  12.9M  /var/log
raid1p1/mail                 213M  9.79G   213M  /var/mail
raid1p1/migration           4.39G   624M  4.39G  /migration
raid1p1/mysqldb             48.5M  9.95G  48.5M  /var/db/mysql
raid1p1/public              3.86M  4.00G  3.86M  /public
raid1p1/software            71.7G  28.3G  71.7G  /software
raid1p1/storage             5.36G  1.30T  1.23G  /storage
raid1p1/storage/compressed  4.09G  1.30T  4.09G  /storage/compressed
raid1p1/storage/squid       35.0M  1.30T  35.0M  /var/squid

Werden wir mal ein wenig praktischer. Ich habe für Euch eine 500 GB USB-Festplatte an den Server angeschlossen.
Mit "dd if=/dev/zero of=/dev/da0" habe ich die ersten Sektoren ausgenullt. Erstellen wir mal einfach mal einen
weiteren Speicherpool mit dem Namen "usbdisk" im System und schauen uns das ganze an:

Code:
# zpool create usbdisk /dev/da0
# zpool status
  pool: raid1p1
 state: ONLINE
  scan: scrub repaired 0 in 4h46m with 0 errors on Sat Feb  2 07:56:07 2013
config:

        NAME        STATE     READ WRITE CKSUM
        raid1p1     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            ada3    ONLINE       0     0     0
            ada4    ONLINE       0     0     0

errors: No known data errors

  pool: usbdisk
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        usbdisk     ONLINE       0     0     0
          da0       ONLINE       0     0     0

errors: No known data errors

# zpool list
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
raid1p1  3.62T  1.28T  2.35T    35%  1.00x  ONLINE  -
usbdisk   464G  89.5K   464G     0%  1.00x  ONLINE  -

Wir haben nun einen Pool "usbdisk" mit 464GB Nettokapazität erzeugt. Prüfen wir das mal!
OK. ZFS hat sofort den Pool in das System eingehängt und wir können Daten abspeichern.

Code:
# df -h
Filesystem                    Size    Used   Avail Capacity  Mounted on
/dev/ada0p2                    51G    9.2G     38G    19%    /
devfs                         1.0k    1.0k      0B   100%    /dev
procfs                        4.0k    4.0k      0B   100%    /proc
raid1p1/development           5.0G     47M      5G     1%    /development
raid1p1/home                  1.2T     50k    1.2T     0%    /home
...
usbdisk                       456G     31k    456G     0%    /usbdisk  (Mountpoint == Pool).

Ein kleiner Test! Und wie wir sehen gibt es nun zwei leere Dateien mit den Namen "Hallo" und "NF-F".
Ich mußte keine Formattierung oder dergleichen durchführen. Geht einfach!

Code:
# cd /usbdisk
# touch Hallo NF-F
# ls -la
total 7
drwxr-xr-x   2 root  wheel     4 Feb  5 22:41 .
drwxr-xr-x  31 root  wheel  1024 Feb  5 22:37 ..
-rw-r--r--   1 root  wheel     0 Feb  5 22:41 Hallo
-rw-r--r--   1 root  wheel     0 Feb  5 22:41 NF-F

Im Folgenden möchte ich mein Dateisystem aber besser strukturieren. Ich lege daher ein neues Dateisystem
im Speicherpool "usbdisk" von ZFS an. Dateisystem? Sieht doch aus wie ein normales Directory?!

Code:
# zfs create usbdisk/NikonFotografieForum 
# zfs list
NAME                           USED  AVAIL  REFER  MOUNTPOINT
...
usbdisk                        130K   457G    31K  /usbdisk
usbdisk/NikonFotografieForum    31K   457G    31K  /usbdisk/NikonFotografieForum

# ls -la
total 8
drwxr-xr-x   3 root  wheel     5 Feb  5 22:42 .
drwxr-xr-x  31 root  wheel  1024 Feb  5 22:37 ..
-rw-r--r--   1 root  wheel     0 Feb  5 22:41 Hallo
-rw-r--r--   1 root  wheel     0 Feb  5 22:41 NF-F
drwxr-xr-x   2 root  wheel     2 Feb  5 22:42 NikonFotografieForum

Warum ist "NikonFotografieForum" jetzt ein weiteres Dateisystem? Das zeigt uns gleich ein paar
Abfragen und Einstellungen in ZFS. Stellen wir uns vor ich möchte "usbdisk/NikonFotografieForum" als
"fForum" nutzen. Dann gebe ich folgendes ein:

Code:
# zfs set mountpoint=/forum usbdisk/NikonFotografieForum
# df -h
Filesystem                      Size    Used   Avail Capacity  Mounted on
...
usbdisk                         456G     31k    456G     0%    /usbdisk
usbdisk/NikonFotografieForum    456G     31k    456G     0%    /forum    <== umgehängt!

Im laufenden Betrieb kann ich die Dateisystem einfach umhängen. Nun habe ich neben /home etc. auch
ein /forum. Komisch! Warum habe alle Dateisysteme (/usbdisk und /forum) die selbe Größe (456G) ?
Das liegt daran, daß diese im selben Pool liegen. Finde ich das gut? Nein! Weil ich möchte maximal
10GB darin ablegen können. Andererseits soll aber auch garantiert werden, daß ich mindestens 5GB auch
wirklich nutzen kann. Weil wenn ich in "/usbdisk" Daten speichere geht das vom Pool ab und alle weiteren
Dateisysteme werden verringert. Aber wir sind hier ja bei ZFS. Also ...

Code:
# zfs set quota=10G usbdisk/NikonFotografieForum
# zfs set reservation=5G usbdisk/NikonFotografieForum
# df -h
Filesystem                      Size    Used   Avail Capacity  Mounted on
usbdisk                         451G     31k    451G     0%    /usbdisk
usbdisk/NikonFotografieForum     10G     31k     10G     0%    /forum

Wir sehen nun das "/forum" maximal 10GB Daten aufnehmen kann und auch noch ~10GB frei hat. Stimmt das?
OK! Wir prüfen das einfach mal:

Code:
# zfs get avail,quota,used,reservation usbdisk/NikonFotografieForum
NAME                          PROPERTY     VALUE   SOURCE
usbdisk/NikonFotografieForum  available    10.0G   -
usbdisk/NikonFotografieForum  quota        10G     local
usbdisk/NikonFotografieForum  used         31K     -
usbdisk/NikonFotografieForum  reservation  5G      local

In der letzten Zeile sehen wir unsere Reservierung. Egal was passiert das ZFS garantiert nun für "/forum"
eine Mindestkapazität von 5GB. Ups! Ich wollte doch eigentlich 6GB Reservierung haben und nur maximal 8GB.
Kein Problem ...

Code:
# zfs set quota=8G usbdisk/NikonFotografieForum
# zfs set reservation=6G usbdisk/NikonFotografieForum
# zfs get avail,quota,used,reservation usbdisk/NikonFotografieForum
NAME                          PROPERTY     VALUE   SOURCE
usbdisk/NikonFotografieForum  available    8.00G   -
usbdisk/NikonFotografieForum  quota        8G      local
usbdisk/NikonFotografieForum  used         31K     -
usbdisk/NikonFotografieForum  reservation  6G      local

Ihr seht man kann ganz einfach im laufenden Betrieb die Resourcenverteilung verändern. Ich speichere aber
häufig auch Texte im Dateisystem. Text kann man doch gut "zusammenfassen" (Komprimierung). ZFS bietet mir
dafür eine Online-Komprimierung an.

ZFS bitte komprimiere alles was ich in das Dateisystem kopiere ...

Code:
# zfs set compression=on usbdisk/NikonFotografieForum
# zfs get compression,compressratio usbdisk/NikonFotografieForum
NAME                          PROPERTY       VALUE     SOURCE
usbdisk/NikonFotografieForum  compression    on        local
usbdisk/NikonFotografieForum  compressratio  1.00x     -

Jetzt kopiere ich mal ein paar Texte in das Dateisystem. Ich nutze dazu einfach den Befehl
"man zfs >> /forum/zfs-manual.txt" (mehrfach) und dann sieht das so aus:

Code:
# df -h
usbdisk/NikonFotografieForum    8.0G    275k      8G     0%    /forum

# ls -la /forum
total 250
drwxr-xr-x   2 root  wheel       3 Feb  5 23:01 .
drwxr-xr-x  32 root  wheel    1024 Feb  5 22:46 ..
-rw-r--r--   1 root  wheel  434128 Feb  5 23:01 zfs-manual.txt

# zfs get compression,compressratio usbdisk/NikonFotografieForum
NAME                          PROPERTY       VALUE     SOURCE
usbdisk/NikonFotografieForum  compression    on        local
usbdisk/NikonFotografieForum  compressratio  2.04x     -

Wie man oben sieht wurde eine Datei mit dem Namen "zfs-manual.txt" angelegt. Diese ist 434128 Bytes groß.
Belegt werden aber nur 275k (inkl. Verwaltungsdaten) in "/forum". ZFS scheint komprimiert zu haben und
das ohne Zeitverzögerung. Mit dem "zfs get ..." Befehl sehe ich nun einen Faktor 2.04x für die Komprimierung.
Mir gefällt dieser transparente Mechanismus. Speicherplatz sparen und Sicherheit in einer Lösung.

Und das ist natürlich nicht alles was das Dateisystem kann. Ich erzeuge in festen Intervalen in meinem
mir wichtigen Dateisystem-Strukturen eine sog. Snapshot. Snapshots ist eine Funktionalität die meistens
nur Volume Manager beherrschen. Also ext2/3/4, ufs etc. haben dieses Feature in der Regel nicht. Was bedeutet das?

Das Dateisystem ZFS merkt sich alle Änderungen ab dem Zeitpunkt wo ich den Snapshot setze. Der Befehl
lautet wie folgt:

Code:
# zfs snapshot usbdisk/NikonFotografieForum[MENTION=39745]Frozen[/MENTION]

In diesem Beispiel wird ein Snapshot mit dem Label "frozen" im Pool "usbdisk" und dem Dateisystem
"NikonFotografieForum" angelegt. Das @-Symbol leitet den Namen des Snapshots ein. Mit dem Befehl ...

Code:
# zfs list -t snapshot
NAME                                  USED  AVAIL  REFER  MOUNTPOINT
raid1p1/home/a____r@daily22             0      -   140G  -
raid1p1/home/a____r/mail@daily22     638K      -   154M  -
raid1p1/home/m_____@daily22         4.50M      -  1.06T  -
raid1p1/home/m_____/mail@daily22    89.5K      -  1.54G  -
usbdisk/NikonFotografieForum[MENTION=39745]Frozen[/MENTION]     0      -   275K  -

... kann ich mir die aktuellen Snapshots anschauen und sehe wieviel Änderungen dort vorhanden sind.
Über einen Snapshot kann ich jederzeit ein Backup anfertigen ohne inkonsistente Daten zu haben. Ich gehe
sogar ein Schritt weiter. Ich lösche versehentlich meine Datei "zfs-manual.txt":

Code:
# rm zfs-manual.txt 
# ls -la
total 6
drwxr-xr-x   2 root  wheel     2 Feb  5 23:13 .
drwxr-xr-x  32 root  wheel  1024 Feb  5 22:46 ..

Die Datei ist weg. Stellt euch vor das wäre das bestes Foto in 2012 gewesen. Weg! Nun kommt der Snapshot
zum tragen. Wir zaubern ...

Code:
# zfs rollback usbdisk/NikonFotografieForum[MENTION=39745]Frozen[/MENTION]
# ls -la
total 250
drwxr-xr-x   2 root  wheel       3 Feb  5 23:01 .
drwxr-xr-x  32 root  wheel    1024 Feb  5 22:46 ..
-rw-r--r--   1 root  wheel  434128 Feb  5 23:01 zfs-manual.txt

Die Daten sind wieder da. Und zwar in dem selben Zustand wie sie zum Zeitpunkt des Snapshots vorgelegen haben. Soo! Das war es erst einmal. Sicherlich kein Thema für alle aber es soll ja auch nur ein Erfahrungsbericht sein. Ich greife via SAMBA im Netzwerk mit meinen Windows XP/7-Clients auf den Server zu. Im Gigabit-Netz erreiche ich ca. 70 Mbyte/s im Schreib-/Lesezugriff. Ergänzungen / Korrekturen natürlich gern willkommen.

- Fortsetzung folgt sofern Interesse besteht -
 
Anzeigen
Guten Morgen! Gestern Abend habe ich einen minimalen Ausflug in die Welt der Snapshots vorgenommen. An dieser Stelle setze ich einfach mal fort. Wie kann ich den nun z.B. meine Daten im laufenden Betrieb sichern? Dazu eine kurze Übersicht wie unsere "usbdisk"-Pool und sein Snapshot organisiert ist. Pro Dateisystem können diverse Properties gesetzt werden. U.a. auch ob Snapshots sichtbar sind oder auch nicht. In den Standardeinstellungen sind diese nicht sichtbar aber ein Zugriff ist jederzeit möglich ...

Code:
# cd /forum/       
# ls -la
total 250
drwxr-xr-x   2 root  wheel       3 Feb  5 23:01 .
drwxr-xr-x  32 root  wheel    1024 Feb  5 22:46 ..
-rw-r--r--   1 root  wheel  434128 Feb  5 23:01 zfs-manual.txt

# cd .zfs
# ls -la
total 3
dr-xr-xr-x  4 root  wheel  4 Feb  5 22:42 .
drwxr-xr-x  2 root  wheel  3 Feb  5 23:01 ..
dr-xr-xr-x  2 root  wheel  2 Feb  5 22:42 shares
dr-xr-xr-x  2 root  wheel  2 Feb  6 08:32 snapshot

# cd snapshot/
# ls -la
total 2
dr-xr-xr-x  2 root  wheel  2 Feb  6 08:32 .
dr-xr-xr-x  4 root  wheel  4 Feb  5 22:42 ..
drwxr-xr-x  2 root  wheel  3 Feb  5 23:01 frozen

# cd frozen/
# ls -la
total 246
drwxr-xr-x  2 root  wheel       3 Feb  5 23:01 .
dr-xr-xr-x  3 root  wheel       3 Feb  6 08:32 ..
-rw-r--r--  1 root  wheel  434128 Feb  5 23:01 zfs-manual.txt

# pwd
/forum/.zfs/snapshot/frozen

In dem obigen Beispiel habe ich nun in den Pfad "/forum/.zfs/snapshot/frozen" gewechselt. Und genau an dieser Stelle liegen nun meine Daten die ich ohne Probleme sichern kann. Bevor ich das aber ausführe noch ein Beispiel wie man den Unterschied sieht.

Ich berechne eine MD5 Prüfsumme der Datei "/forum/.zfs/snapshot/frozen/zfs-manual.txt" ...
Code:
md5 zfs-manual.txt 
MD5 (zfs-manual.txt) = 56431e791ad2644b65b9ea76cfb21b11

Und das ganze noch einmal für die Datei "/forum/zfs-manual.txt"

Code:
# cd /forum
# ls -la
total 250
drwxr-xr-x   2 root  wheel       3 Feb  5 23:01 .
drwxr-xr-x  32 root  wheel    1024 Feb  5 22:46 ..
-rw-r--r--   1 root  wheel  434128 Feb  5 23:01 zfs-manual.txt

# md5 zfs-manual.txt 
MD5 (zfs-manual.txt) = 56431e791ad2644b65b9ea76cfb21b11

# pwd
/forum

Wie man hier sieht habe beide Dateien die selbe Prüfsumme. Snapshots sind keine einfachen Kopien der Dateien sondern Deltas. Daher benötigen Snapshots auch nicht unbedingt mehr Speicher (mal abgesehen von Verwaltungsinformationen). Nun modifizieren wir mal unsere Datei "zfs-manual.txt" in "/forum". Im Beispiel wird eine Zeile Text an die Datei angehängt und die Prüfsumme neu berechnet.

Code:
# echo "Hallo NF-F" >> zfs-manual.txt 

# md5 zfs-manual.txt
MD5 (zfs-manual.txt) = 636cb671742dc2a96f49e41f6e918968

Wie wir sehen hat die Datei nun eine andere Prüfsumme. Sie ist jetzt auch eine neue Datei. Jetzt schauen wir uns den Snapshot an.

Code:
# md5 /forum/.zfs/snapshot/frozen/zfs-manual.txt 
MD5 (/forum/.zfs/snapshot/frozen/zfs-manual.txt) = 56431e791ad2644b65b9ea76cfb21b11

Die Datei im Snapshot hat immer noch die alte Prüfsumme weil die Daten unverändert sind. Und diese Datei kann ich nun einfach kopieren selbst wenn diese
Datei "zfs-manual.txt" im Schreibzugriff ist. Snapshots sind halt Block-Deltas im Dateisystem.

Ich kann nun einen weiteren Snapshot zu einem anderen Zeitpunkt anlegen. Tun wir das einfach mal ...

Code:
# zfs snapshot usbdisk/NikonFotografieForum[MENTION=94877]heute[/MENTION]
# zfs list -t snapshot
NAME                                  USED  AVAIL  REFER  MOUNTPOINT
usbdisk/NikonFotografieForum[MENTION=39745]Frozen[/MENTION]    43K      -   275K  -
usbdisk/NikonFotografieForum[MENTION=94877]heute[/MENTION]       0      -   275K  -

Jetzt sehen wir zwei Snapshots auf das selbe Dateisystem mit dem Unterschied das "frozen" Speicher benötigt aber "heute" nicht.
Das liegt daran, daß es bisher keine Änderungen gegeben hat seit dem ich die Textzeile hinzugefügt habe.

-Fortsetzung folgt-
 
Kommentar
In ZFS kann pro Dateisystem die Datensicherheit erhöht werden in dem man definiert, daß jeder Datenblock n-Mal geschrieben wird.
Im folgenden Fall möchte ich das jeder Block genau 3-mal geschrieben wird. ZFS schreibt übrigens pro Datenblock
eine Prüfsumme mit und kann daher immer feststellen (ohne Filesystemcheck) ob alles im "Grünenbereich" ist.

Ich lege nun ein neues Dateisystem an:

Code:
# zfs create usbdisk/TotalSicher
# zfs list        
NAME                           USED  AVAIL  REFER  MOUNTPOINT
usbdisk                       6.00G   451G    32K  /usbdisk
usbdisk/NikonFotografieForum   318K  8.00G   275K  /forum
usbdisk/TotalSicher             31K   451G    31K  /usbdisk/TotalSicher

In diesem neuen Dateisystem "usbdisk/TotalSicher" schaue ich mir die Standardwerte an.
Hier wird pro Datenblock genau ein Datenblock auch geschrieben.

Code:
# zfs get -r copies usbdisk 
NAME                                 PROPERTY  VALUE   SOURCE
usbdisk                              copies    1       default
usbdisk/NikonFotografieForum         copies    1       default
usbdisk/NikonFotografieForum[MENTION=39745]Frozen[/MENTION]  copies    -       -
usbdisk/NikonFotografieForum[MENTION=94877]heute[/MENTION]   copies    -       -
usbdisk/TotalSicher                  copies    1       default

Ich bin jetzt gerade mal Paranoid und möchte mehr Datensicherheit und definiere drei Kopien:

Code:
# zfs set copies=3 usbdisk/TotalSicher
# zfs get -r copies usbdisk
NAME                                 PROPERTY  VALUE   SOURCE
usbdisk                              copies    1       default
usbdisk/NikonFotografieForum         copies    1       default
usbdisk/NikonFotografieForum[MENTION=39745]Frozen[/MENTION]  copies    -       -
usbdisk/NikonFotografieForum[MENTION=94877]heute[/MENTION]   copies    -       -
usbdisk/TotalSicher                  copies    3       local

# df -h usbdisk/TotalSicher
Filesystem             Size    Used   Avail Capacity  Mounted on
usbdisk/TotalSicher    450G     31k    450G     0%    /usbdisk/TotalSicher

Jetzt erzeuge ich per DD eine Datei die ungefähr ein Gigabyte umfassend ist:

Code:
# dd if=/dev/random of=/usbdisk/TotalSicher/1GB-datei bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes transferred in 92.540652 secs (11602920 bytes/sec)

# ls -la /usbdisk/TotalSicher/
total 3146908
drwxr-xr-x  2 root  wheel           3 Feb  6 09:22 .
drwxr-xr-x  3 root  wheel           5 Feb  6 09:18 ..
-rw-r--r--  1 root  wheel  1073741824 Feb  6 09:24 1GB-datei

Tatsächlich sagt mir ZFS aber das ich 3GB im Dateisystem verbraucht habe:

Code:
# zfs get avail,used,referenced usbdisk/TotalSicher
NAME                 PROPERTY    VALUE  SOURCE
usbdisk/TotalSicher  available   448G   -
usbdisk/TotalSicher  used        3.00G  -
usbdisk/TotalSicher  referenced  3.00G  -

Warum das ganze? Es kann immer mal zu Defekten im Dateisystem oder auf der Plattenstruktur kommen.
In diesem Fall hätte mein ZFS-Dateisystem noch zwei weitere Datenblöcke um meine Datei korrekt auszuliefern.

Man muss für sich sicherstellen was einem wichtiger ist. Datenkonsistenz oder Kapazität.
 
Kommentar
-Anzeige-
Zurück
Oben Unten