Ich habe eine Festplatte mit diesen Schichten: SATA-Festplatte, Luks, Zpool, Ext4
Das ext4-FS wurde mit diesen Befehlen erstellt:
cryptsetup -v luksFormat /dev/sdb
cryptsetup luksOpen /dev/sda store02
zpool create zstore02 /dev/mapper/store02
zfs create -V 1600G zstore02/dsk02
mkfs.ext4 -L dsk02 /dev/zstore02/dsk02
Das System ist Ubuntu 20.04.1 LTS. Dieser Pool wurde später auf ein anderes 20.04.1-System importiert.
Ich möchte einen Lese-/Schreib-Snapshot erstellen und ihn mounten. Aber ich bekomme die Meldung „Nicht genügend Speicherplatz“:
root@computer:~# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zstore02 1,81T 1,50T 320G - - 7% 82% 1.00x ONLINE -
root@computer:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zstore02 1,61T 148G 24K /zstore02
zstore02/dsk02 1,61T 262G 1,50T -
root@computer:~# zfs snapshot zstore02/dsk02@test
cannot create snapshot 'zstore02/dsk02@test': out of space
root@computer:~# zfs get reservation zstore02/dsk02
NAME PROPERTY VALUE SOURCE
zstore02/dsk02 reservation none local
root@computer:~# zfs set reservation=10G zstore02
root@computer:~# zfs set reservation=10G zstore02/dsk02
root@computer:~# zfs snapshot zstore02/dsk02@test
cannot create snapshot 'zstore02/dsk02@test': out of space
root@computer:~#
Es funktioniert nicht mit „reserviert=keine“ oder „reserviert=10G“.
Anscheinend meldet „zpool list“ 300 GB freien Speicherplatz und „zfs list“ meldet 262 GB freien Speicherplatz. Aber irgendwie kann ich keinen Snapshot erstellen. Warum?
AKTUALISIEREN
Wenn ich versuche, ein neues Volume zu erstellen, funktioniert es (entschuldigen Sie das ungarische Gebietsschema):
root@computer:~# zfs create -V 1G zstore02/test
root@computer:~# mkfs.ext4 -L test /dev/zstore02/test
mke2fs 1.45.5 (07-Jan-2020)
Eszközblokkok eldobása: kész
Fájlrendszer létrehozása 262144 4 blokkal és 65536 inode-dal
Fájlrendszer UUID: 14e07b33-5d25-465a-aeb8-7fbfe2499dfd
Tartalék szuperblokkok tárolva a blokkokon:
32768, 98304, 163840, 229376
Csoporttáblák foglalása: kész
Inode táblák írásakor: kész
Napló létrehozása (8192 blokk): kész
Szuperblokkok és fájlrendszer-könyvelési információk írása: kész
root@computer:~# zfs snapshot zstore02/test@snap1
root@computer:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zstore02/test@snap1 0B - 32,7M -
root@computer:~#
Es funktioniert für jedes Volume, das ich erstelle, außer zstore02/dsk02.
Aber warum?
Antwort1
Sie haben einen refreservation
Satz auf Ihrem Zvol, der Speicherplatz für diesen Datensatz oder Zvol reserviert, ohne Rücksicht auf Snapshots oder Klone. Um einen Snapshot zu erstellen, muss genügendvorbehaltlosim Datensatz ist noch Platz übrig, um den referenzierten Speicherplatz unterzubringen, in diesem Fall 1,50 T. Da Ihr Speicherplatz refreservation
(höchstwahrscheinlich) 1,61 T beträgt, können Sie im Grunde nicht viel tun, da der gesamte freie Speicherplatz für diesen Zvol reserviert ist (der ihn nie verwenden wird).
Um das Problem zu beheben, entfernen Sie die Erfrischungsreservierung.
zfs set refreservation=none zstore02/dsk02
Um das Problem in Zukunft zu vermeiden, erstellen Sie Zvols mit dem -s
Flag (sparse), wodurch sie auch Thin Provisioning durchlaufen:
zfs create -s -V 1600G zstore02/dsk02
Wenn stattdessen ein Thick-Provisioning-Volume gewünscht wird, erstellen Sie das Volume und legen Sie es dann fest refreservation=auto
.
zfs set refreservation=auto zstore02/dsk02