ZFS auf Linux/ Dataset

DatasetBearbeiten

AllgemeinesBearbeiten

  • Es gibt 5 Typen von Datasets:
  1. Filesysteme: Dieser Typ ähnelt traditionellen Filesystemen am meisten. Er soll im folgenden als Dataset bezeichnet werden.
  2. Volumes
  3. Snapshots
  4. Clones
  5. Bookmarks
  • Files müssen in einem Dataset (genau in einem Filesystem-Dataset) gespeichert werden. Datasets werden in einem zpool gespeichert. zpools sind nicht dafür gemacht, Daten direkt darin zu speichern.
  • Ein Dataset ist eine Menge von Daten mit bestimmten, gemeinsamen Policies. Dies erinnert am ehesten an eine traditionelle Partition. Datasets sind aber ungleich flexibler.
  • Unter ZFS legt man üblicherweise sehr viele Datasets an, da dies die Kontrolle über die Daten erleichtert. Bei traditionellen Partitionen wäre dies ein Albtraum.
  • Alle Datasets teilen sich den Speicher eines zpools:
    • Sie belegen nur so viel Platz im Pool, wie die dort gespeicherten Daten tatsächlich benötigen.
    • Man kann Datasets Grenzen (Quotas) setzen. Diese Grenzen lassen sich im Betrieb dynamisch verändern. Man muss sich beim Anlegen eines Datasets keine Gedanken um die Größe machen wie bei den Partitionen.
  • Man kann Datasets hierarchisch aufbauen, also ineinander verschachteln. Eigenschaften werden in dieser Hierarchie vererbt, können aber in jeden Dataset auch verändert werden.
  • Man sollte einer Gruppe von Files/Directories ein Dataset zuweisen, wenn sie eine oder mehrere der aufgezählten Eigenschaften gemeinsam haben sollen.
  • Der Admin kann die Verwaltung eines Datasets an einen User (Projektleiter) ohne root-Rechte delegieren.
  • Jedes Dataset wird beim Anlegen automatisch gemountet.
  • Einem Dataset kann man bestimmte Eigenschaften mitgeben:
    • einen Mountpoint
    • Quota
    • Komprimierung
    • Deduplizierung
    • permissions
    • Eigenschaften der Snapshots
    • atime aktualisieren oder nicht
    • exec oder nicht
    • recordsize
  • Datasets werden mit dem Befehl "zfs" verwaltet.

Dataset anlegenBearbeiten

zfs create legt Datasets und Sub-Datasets, also eine Hierarchie von Datasets, in dem angegeben Pool an.

user> sudo zfs create zpooltest/dataset-1
user> sudo zfs create zpooltest/dataset-2
user> sudo zfs create zpooltest/dataset-2/dataset-2.1
user> sudo zfs create zpooltest/dataset-3
user> sudo zfs list                      
NAME                              USED  AVAIL  REFER  MOUNTPOINT
zpooltest                         188K   352M    19K  /zpooltest
zpooltest/dataset-1                19K   352M    19K  /zpooltest/dataset-1
zpooltest/dataset-2                38K   352M    19K  /zpooltest/dataset-2
zpooltest/dataset-2/dataset-2.1    19K   352M    19K  /zpooltest/dataset-2/dataset-2.1
zpooltest/dataset-3                19K   352M    19K  /zpooltest/dataset-3
Befehl Erklärung
zfs create legt Dataset an
zpooltest/dataset-2/dataset-2.1 Name des Pools/Name des Datasets/Name des Sub-Datasets
zfs list listet die Eigenschaften der Datasets

Achtung: Der name des zpools beginnt nicht mit einem "/".


Dataset mountenBearbeiten

Datasets werden nach dem Anlegen automatisch gemountet:

user> mount | grep zfs
zpooltest on /zpooltest type zfs (rw)
zpooltest/dataset-1 on /zpooltest/dataset-1 type zfs (rw)
zpooltest/dataset-2 on /zpooltest/dataset-2 type zfs (rw)
zpooltest/dataset-3 on /zpooltest/dataset-3 type zfs (rw)
zpooltest/dataset-2/dataset-2.1 on /zpooltest/dataset-2/dataset-2.1 type zfs (rw)

Mit den Befehl mountall aus dem Paket "ubuntu-zfs", das beim Booten aufgerufen wird, kann man die Datasets dauerhaft mounten.


Datasets füllenBearbeiten

Das folgende Beispiel zeigt, wie Files in den diversen Datasets Platz in dem gemeinsamen Pool belegen:

mehr/weniger
user> dd if=/dev/urandom of=/zpooltest/dataset-1/fill-10M  bs=1M count=10
user> dd if=/dev/urandom of=/zpooltest/dataset-2/fill-20M  bs=1M count=20
user> dd if=/dev/urandom of=/zpooltest/dataset-2/dataset-2.1/fill-5M  bs=1M count=5


user>tree /zpooltest
/zpooltest
├── dataset-1
│   └── fill-10M
├── dataset-2
│   ├── dataset-2.1
│   │   └── fill-5M
│   └── fill-20M
└── dataset-3


user> sudo zfs list
NAME                              USED  AVAIL  REFER  MOUNTPOINT
zpooltest                        35.2M   317M    19K  /zpooltest
zpooltest/dataset-1              10.0M   317M  10.0M  /zpooltest/dataset-1
zpooltest/dataset-2              25.1M   317M  20.0M  /zpooltest/dataset-2
zpooltest/dataset-2/dataset-2.1  5.02M   317M  5.02M  /zpooltest/dataset-2/dataset-2.1
zpooltest/dataset-3                19K   317M    19K  /zpooltest/dataset-3


Dataset umbenennen,verschiebenBearbeiten

"zfs rename" kann sowohl Datasets umbenennen als auch Datasets von einem Ende des zpools an das andere verschieben.

user> sudo zfs rename  zpooltest/dataset-1  zpooltest/dataset-A
user> sudo zfs rename  zpooltest/dataset-2/dataset-2.1  zpooltest/dataset-B

Hierarchie vor und nach obigen beiden Befehlen:

mehr/weniger
# vorher
>tree
├── dataset-1
│   └── fill-10M
├── dataset-2
│   ├── dataset-2.1
│   │   └── fill-5M
│   └── fill-20M
└── dataset-3

#nacher
>tree
├── dataset-2
│   └── fill-20M
├── dataset-3
├── dataset-A
│   └── fill-10M
└── dataset-B
    └── fill-5M

Man muss dabei beachten:

  • Wenn ein Dataset neue Eltern bekommt, werden von diesen möglicherweise andere Eigenschaften vererbt.
  • Die Dataset-spezifischen Eigenschaften bleiben unverändert.
  • Der Mountpoint ändert sich schlagartig. Mit der Option "-u" kann man dies verhindern.


Dataset zerstörenBearbeiten

Vorsicht: Das Dataset wird ohne Rückfrage und Warnung zerstört.

user> sudo zfs destroy zpooltest/dataset-2/dataset-2.1
Befehl Erklärung
zfs destroy zerstört Dataset mit Inhalt ohne Warnung/Rückfrage
zpooltest/dataset-2/dataset-2.1 Name des Pools/Name des Datasets/Name des Sub-Datasets


Liste der Datasets vor und nach "zfs destroy"

mehr/weniger
user> sudo zfs list
NAME                              USED  AVAIL  REFER  MOUNTPOINT
zpooltest                        35.2M   317M    19K  /zpooltest
zpooltest/dataset-1              10.0M   317M  10.0M  /zpooltest/dataset-1
zpooltest/dataset-2              25.1M   317M  20.0M  /zpooltest/dataset-2
zpooltest/dataset-2/dataset-2.1  5.02M   317M  5.02M  /zpooltest/dataset-2/dataset-2.1
zpooltest/dataset-3                19K   317M    19K  /zpooltest/dataset-3

user> sudo zfs destroy zpooltest/dataset-2/dataset-2.1

user> sudo zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpooltest            30.4M   322M    19K  /zpooltest
zpooltest/dataset-1  10.0M   322M  10.0M  /zpooltest/dataset-1
zpooltest/dataset-2  20.0M   322M  20.0M  /zpooltest/dataset-2
zpooltest/dataset-3    19K   322M    19K  /zpooltest/dataset-3



To-Do:

mehr zu mountall, rename, Optionen