ZFS auf Linux/ Dataset
Dataset
[Bearbeiten]Allgemeines
[Bearbeiten]- Es gibt 5 Typen von Datasets:
- Filesysteme: Dieser Typ ähnelt traditionellen Filesystemen am meisten. Er soll im folgenden als Dataset bezeichnet werden.
- Volumes
- Snapshots
- Clones
- 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 anlegen
[Bearbeiten]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 mounten
[Bearbeiten]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üllen
[Bearbeiten]Das folgende Beispiel zeigt, wie Files in den diversen Datasets Platz in dem gemeinsamen Pool belegen:
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,verschieben
[Bearbeiten]"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:
# 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ören
[Bearbeiten]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"
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
mehr zu mountall, rename, Optionen