Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige ÜberarbeitungLetzte ÜberarbeitungBeide Seiten, nächste Überarbeitung | ||
server_und_serverdienste:linux_zfs [2017/04/01 02:38] – angelegt admin | server_und_serverdienste:linux_zfs [2022/03/21 09:46] – [Autoexpand auf einem Rootpool] loma | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
{{datei: | {{datei: | ||
+ | ====== Linux ZFS ====== | ||
+ | |||
+ | Du möchtest dich gerne für unsere Hilfe erkenntlich zeigen 8-o. Gerne. Wir bedanken uns bei dir für deine Spende! LOL \\ | ||
+ | [[https:// | ||
+ | \\ | ||
+ | Hauseigenes Apt-Repo: [[https:// | ||
+ | \\ | ||
+ | GITLAB Enterprise: [[https:// | ||
+ | \\ | ||
+ | \\ | ||
ZFS (ursprünglich Zettabyte File System) wird oft als Dateisystem angesehen, was im Grunde genommen ein Missverständnis darstellt. ZFS kann ein Dateisystem sein, aber beherrscht auch noch einiges mehr. Es vereint die Funktionalität eines Logical Volume Managers und eines Software-RAID mit einem Copy-on-Write-Dateisystem (COW). Das heißt, dass es (aufgrund seiner Kenntnisse der Festplattenbelegung) effizienter als jedes Hardware-RAID arbeitet, Daten-Integrität per Transaktionen ähnlich wie bei relationalen Datenbanken sichert und im Falle von Daten-Redundanz (Mehrfachspeicherung) sogar selbständig Daten repariert. | ZFS (ursprünglich Zettabyte File System) wird oft als Dateisystem angesehen, was im Grunde genommen ein Missverständnis darstellt. ZFS kann ein Dateisystem sein, aber beherrscht auch noch einiges mehr. Es vereint die Funktionalität eines Logical Volume Managers und eines Software-RAID mit einem Copy-on-Write-Dateisystem (COW). Das heißt, dass es (aufgrund seiner Kenntnisse der Festplattenbelegung) effizienter als jedes Hardware-RAID arbeitet, Daten-Integrität per Transaktionen ähnlich wie bei relationalen Datenbanken sichert und im Falle von Daten-Redundanz (Mehrfachspeicherung) sogar selbständig Daten repariert. | ||
- | * Systemgrundlage: | + | * Systemgrundlage: |
* ZFSutils: 0.6.4.3 / 0.6.5-pve6~jessie | * ZFSutils: 0.6.4.3 / 0.6.5-pve6~jessie | ||
- | * Kernel: 3.10.0-10-pve / 4.2.3-2-pve | + | * Kernel: 3.10.0-10-pve / 4.2.3-2-pve / 4.10.17-4-pve |
Alles was unter diese Version liegt, ist entweder durch Bugs, oder fehlende Features wie z.B. das ZFS die Geräte per ID anspricht, nicht brauchbar. | Alles was unter diese Version liegt, ist entweder durch Bugs, oder fehlende Features wie z.B. das ZFS die Geräte per ID anspricht, nicht brauchbar. | ||
- | ====== Option Ashift | + | ===== Option Ashift ===== |
Zeile 37: | Zeile 47: | ||
- | ====== Memorylimit setzen ====== | + | ===== Memorylimit setzen ===== |
+ | Genaue Info zu den aktuellen Werten bekommt man mit: | ||
+ | arcstat | ||
+ | oder | ||
+ | arc_summary | ||
Wenn man möchte kann man ZFS ein Memorylimit setzten. | Wenn man möchte kann man ZFS ein Memorylimit setzten. | ||
Zeile 43: | Zeile 57: | ||
nano / | nano / | ||
options zfs zfs_arc_max=10737418240 | options zfs zfs_arc_max=10737418240 | ||
+ | | ||
+ | oder 8GB | ||
+ | 8589934592 | ||
Danach noch die initram updaten und rebooten. | Danach noch die initram updaten und rebooten. | ||
Zeile 50: | Zeile 67: | ||
- | ====== Anlegen eines neuen Pools im Raid10 und hinzufügen zweier weiteren Festplatten | + | ===== Anlegen eines neuen Pools im Raid10 und hinzufügen zweier weiteren Festplatten ===== |
Zeile 102: | Zeile 119: | ||
errors: No known data errors | errors: No known data errors | ||
- | Die Daten werden bei einer Erweiterung nicht gesynct. Somit ist der Erweitungsprozess binnen Minuten abgeschlossen. Unabhängig von der Speichergröße. Daten werden erst dann auf die neuen Platten verteilt wenn diese das erste mal verwendet | + | Die Daten werden bei einer Erweiterung nicht gesynct. Somit ist der Erweitungsprozess binnen Minuten abgeschlossen. Unabhängig von der Speichergröße. Daten werden erst dann auf die neuen Platten verteilt wenn diese das erste mal geschrieben |
+ | **Wichtig ist auch zu erwähnen das die neu hinzugefügten Platten zuerst bevorzugt auf den Füllstand der anderen Platten gebracht werden, erst dann werden wieder immer alle HDD's gleichzeitg verwendet.** | ||
- | ====== Anlegen eines neuen Pools im RaidZ10 (entspricht Raid50) | + | |
+ | ===== Anlegen eines neuen Pools im RaidZ10 (entspricht Raid50) ===== | ||
Annahme ist hier ein Gerät mit 2 SDDs für das OS im Raid1 (läuft bereits). Nun bauen wir 10 Stück SATA Fesplatten mit einer Enterprise SSD für für Cache und Log dazu. Man das ganze nicht auf einmal erstellen, also zuerst die hälfte der Disks + Log und Cache, danach den Rest: | Annahme ist hier ein Gerät mit 2 SDDs für das OS im Raid1 (läuft bereits). Nun bauen wir 10 Stück SATA Fesplatten mit einer Enterprise SSD für für Cache und Log dazu. Man das ganze nicht auf einmal erstellen, also zuerst die hälfte der Disks + Log und Cache, danach den Rest: | ||
Zeile 155: | Zeile 174: | ||
errors: No known data errors | errors: No known data errors | ||
+ | Nachdem dies ein Rpool ist, danach nicht vergessen Grub auf allen hinzugefügten Platten zu installieren. | ||
- | + | ===== Korrupte Daten ===== | |
- | ====== Korrupte Daten ====== | + | |
Zeile 175: | Zeile 194: | ||
- | ====== Festplatte ersetzen | + | ===== Festplatte ersetzen ===== |
Zeile 185: | Zeile 204: | ||
- | ===== Festplatte im Rpool ersetzen | + | ==== Festplatte im Rpool ersetzen ==== |
Zeile 198: | Zeile 217: | ||
sgdisk -G /dev/sdb | sgdisk -G /dev/sdb | ||
- | Nun den Resilverprozess anstoßen. | + | Nun den Resilverprozess |
| | ||
zpool replace -f rpool sdb2 sdb2 | zpool replace -f rpool sdb2 sdb2 | ||
Zeile 255: | Zeile 274: | ||
Write failed: Broken pipe | Write failed: Broken pipe | ||
+ | Neuere Proxmoxsysteme haben ZFS immer beides. Grub und EFI. Verwendet man zum Booten Grub, verwendet man den '' | ||
+ | < | ||
+ | pve-efiboot-tool format <new disk's ESP> | ||
+ | pve-efiboot-tool init <new disk's ESP> | ||
+ | </ | ||
- | + | ===== Die wichtigsten ZFS-Befehle auf einen Blick ===== | |
- | ====== Die wichtigsten ZFS-Befehle auf einen Blick ====== | + | |
Zeile 277: | Zeile 300: | ||
| mount / | | mount / | ||
| zpool import -d / | | zpool import -d / | ||
+ | | zpool import v-machines neuepoolname| importiert einen bestehenden Pool mit einem anderen Namen | | ||
+ | | zpool import -f -R /mnt rpool| importiert einen Rootpool auf einen anderen Mountpoint | | ||
| zfs list -t snapshot| zeigt alle Snapshots an | | | zfs list -t snapshot| zeigt alle Snapshots an | | ||
| zpool set listsnapshots=on rpool| zeigt bei "zfs list" auch snapshots an | | | zpool set listsnapshots=on rpool| zeigt bei "zfs list" auch snapshots an | | ||
| zfs list -r -t snapshot -o name, | | zfs list -r -t snapshot -o name, | ||
| zfs get volsize v-machines/ | | zfs get volsize v-machines/ | ||
- | | zfs set volsize=32g v-machines/ | + | | zfs set volsize=32g v-machines/ |
- | | zfs create -V 5gb tank/vol| legt ein neues Dataset | + | | zfs create -V 5gb tank/vol| legt ein neues zvol mit einer maximalen Größe von 5G an \\ (Blockdevice) | |
+ | | zfs set quota=50g tank/ | ||
+ | | zfs rename -p rpool/test rpool/ | ||
+ | | zfs list -o space | Speicherauslastung inkl. wie viel für Snapshots verbraucht wird | | ||
+ | | mount -t zfs -o ro v-machines/ | ||
+ | | zfs set primarycache=metadata pool/ | ||
+ | |apt install zfs-auto-snapshot | [[https:// | ||
- | ====== ZFS Snapshots und deren Verwaltung | + | ===== ZFS Snapshots und deren Verwaltung ===== |
Snapshots eigenes sich hervorragend für die Datensicherung oder auch wenn man was testet oder auch nur Updates fährt. Man kann sofort wieder zurück. Um nun ein Snapshot von unserem Rootfilesystem zu erstellen geht von wie folgt vor: | Snapshots eigenes sich hervorragend für die Datensicherung oder auch wenn man was testet oder auch nur Updates fährt. Man kann sofort wieder zurück. Um nun ein Snapshot von unserem Rootfilesystem zu erstellen geht von wie folgt vor: | ||
Zeile 324: | Zeile 355: | ||
- | ===== Snapshots Remote abspeichern | + | ==== Snapshots Remote abspeichern ==== |
Um nun auch wirkliche Backups zu generieren muss man die Snapshots natürlich außerhalb des Servers ablegen. In unserem ersten Beispiel senden wir einen Snapshot auf eine Backupfestplatte in unserem Server. | Um nun auch wirkliche Backups zu generieren muss man die Snapshots natürlich außerhalb des Servers ablegen. In unserem ersten Beispiel senden wir einen Snapshot auf eine Backupfestplatte in unserem Server. | ||
Zeile 358: | Zeile 389: | ||
- | ===== Snapshots inkrementell abspeichern | + | ==== Snapshots inkrementell abspeichern ==== |
Die beste Methode für Backups ist wohl diese. Es werden hier immer nur die Änderungen gespeichert und man kann auch auf jede einzelne Datei zugreifen. In diesem Fall möchten wir wieder unser home-Dataset auf einer anderen Festplatte abspeichern. Zuerst müssen wir das Dataset auf der Zielfestplatte erstellen. Danach machen wir unser erstes Snapshot und überspielen das auf diese Platte. ACHTUNG: Feature wie Posixacls werden nicht mit aktiviert. Diese mit "zfs set ..." einfach vorher oder nachher nach Wunsch aktivieren. | Die beste Methode für Backups ist wohl diese. Es werden hier immer nur die Änderungen gespeichert und man kann auch auf jede einzelne Datei zugreifen. In diesem Fall möchten wir wieder unser home-Dataset auf einer anderen Festplatte abspeichern. Zuerst müssen wir das Dataset auf der Zielfestplatte erstellen. Danach machen wir unser erstes Snapshot und überspielen das auf diese Platte. ACHTUNG: Feature wie Posixacls werden nicht mit aktiviert. Diese mit "zfs set ..." einfach vorher oder nachher nach Wunsch aktivieren. | ||
Zeile 389: | Zeile 420: | ||
- | ==== Snapshot kann nicht gesendet werden | + | === Snapshot kann nicht gesendet werden === |
Sollte das Snapshot nicht gesendet werden können z.b. hier ein riesiges Homedataset: | Sollte das Snapshot nicht gesendet werden können z.b. hier ein riesiges Homedataset: | ||
Zeile 412: | Zeile 443: | ||
- | ===== Snapshot von einem anderen Ort zurückspielen | + | ==== Snapshot von einem anderen Ort zurückspielen ==== |
Um ein Snapshot zurückspielen zu können muss man zuerst vorhandene lokale Snapshots löschen: | Um ein Snapshot zurückspielen zu können muss man zuerst vorhandene lokale Snapshots löschen: | ||
Zeile 423: | Zeile 454: | ||
pigz -d -c / | pigz -d -c / | ||
+ | ==== Snapshot mounten und Daten rausholen ==== | ||
+ | Sehr praktisch. Um ein Snapshot zu mounten kann den normalen Mountbefehl benutzen. Z.B. | ||
+ | < | ||
+ | mount -t zfs v-machines/ | ||
+ | </ | ||
+ | Um das ganze automatisch und elegant mit ZFS zu gestalten machten den Ordner '' | ||
+ | < | ||
+ | zfs set snapdir=visible | ||
+ | </ | ||
+ | Danach wird das gewünschte Snapshot automatisch beim Zugriff auf '' | ||
- | ===== Snapshot klonen | + | ==== Snapshot klonen ==== |
Es ist oft sehr praktisch ein Filesystem zu klonen um Dinge auszutesten. | Es ist oft sehr praktisch ein Filesystem zu klonen um Dinge auszutesten. | ||
Zeile 449: | Zeile 490: | ||
</ | </ | ||
+ | ===== Mit komplettem ZFSpool umziehen ===== | ||
+ | Mit einem kompletten Pool um zu ziehen ist super einfach, in Gegesatz zu nem Rsync oder ähnlichem. Zuerst macht man rekursiv ein Snapshot, danach kopiert man dem Pool auf die neuen/ | ||
+ | < | ||
+ | zfs snapshot -r oldpool@migration | ||
+ | zfs send -v -R -p oldpool@migration | ||
+ | </ | ||
- | ====== Autoexpand | + | ===== Autoexpand ===== |
Ist " | Ist " | ||
Zeile 468: | Zeile 515: | ||
- | ===== Autoexpand auf einem Rootpool | + | ==== Autoexpand auf einem Rootpool ==== |
Das ganze ist ein wenig komplizierter da man die GPT Bootpartion beachten muss. Zuerst erstellt auf der neuen getauschten Disk eine GPT Partition: | Das ganze ist ein wenig komplizierter da man die GPT Bootpartion beachten muss. Zuerst erstellt auf der neuen getauschten Disk eine GPT Partition: | ||
| | ||
- | | + | < |
- | sgdisk -a1 -n1:34:2047 -t1:EF02 -n9:-8M:0 -t9:BF07 -n2:2048:0 -t2:BF01 -c 2:zfs /dev/sdf | + | sgdisk -Z / |
- | zpool replace rpool 10714300945297318711 sdf2 | + | sgdisk -Z -o /dev/sdf # löscht auch Partitionen |
- | grub-intall | + | sgdisk -a1 -n1:34:2047 -t1:EF02 -n9:-8M:0 -t9:BF07 -n2:2048:0 -t2:BF01 -c 2:zfs /dev/sdf |
+ | partx -s /dev/sdf (hier sieht man die Partionierung) | ||
+ | zpool replace rpool 10714300945297318711 sdf2 | ||
+ | grub-install | ||
+ | </ | ||
Das natürlich mit jeder Platte wiederholen. | Das natürlich mit jeder Platte wiederholen. | ||
Zeile 486: | Zeile 537: | ||
9: reserved space (8MB) | 9: reserved space (8MB) | ||
+ | |||
+ | === Partitionieren ab Proxmox-Boot-Tool === | ||
+ | Bei neuen Systemen wird nicht mehr Grub sondern Proxmox Boottool verwendet. Dabei wird für EFI eine extra 512MB Partition benötigt. Der Befehl dazu sieht dann so aus: Die erste zwei Befehle können auch über die Webgui durch einen Mausklick ausgeführt werden (Initialisiere Disk mit GPT) | ||
+ | < | ||
+ | sgdisk -Z / | ||
+ | sgdisk -Z -o / | ||
+ | sgdisk -a1 -n1:34:2047 -t1:EF02 -n2: | ||
+ | partx -s / | ||
+ | zpool replace rpool 10714300945297318711 ata-ST8000VN004-3CP101_XXXXXX-part3 | ||
+ | proxmox-boot-tool format / | ||
+ | proxmox-boot-tool init / | ||
+ | </ | ||
+ | ==== Umwandeln eines Rpool Singledisk in einen Mirror inkl. Autoexpand ==== | ||
+ | Annahme ist hier ein Rpool mit einer Samsung EVO750. Da die Disk nicht Enterprise ist und das Wearoutlevel schon bei 90% ist, fügen wir eine Samsung SM863a als Mirror hinzu. Dann können wir beim Ausfall der EVO bequem eine weitere SM863a hinzufügen. Der zeitiger Status ist: | ||
+ | < | ||
+ | zpool status | ||
+ | pool: rpool | ||
+ | | ||
+ | scan: scrub repaired 0B in 0h3m with 0 errors on Sun Oct 14 00:27:05 2018 | ||
+ | config: | ||
+ | |||
+ | NAME STATE READ WRITE CKSUM | ||
+ | rpool | ||
+ | sda2 ONLINE | ||
+ | </ | ||
+ | Rpool' | ||
+ | Wir haben nun unsere neue SSD in's laufende System gehängt. Diese scheint mit '' | ||
+ | < | ||
+ | sgdisk -a1 -n1:34:2047 -t1:EF02 -n9:-8M:0 -t9:BF07 -n2:2048:0 -t2:BF01 -c 2:zfs /dev/sdb | ||
+ | Setting name! | ||
+ | partNum is 1 | ||
+ | REALLY setting name! | ||
+ | The operation has completed successfully. | ||
+ | </ | ||
+ | Mit '' | ||
+ | < | ||
+ | partx -s /dev/sdb | ||
+ | NR | ||
+ | | ||
+ | | ||
+ | 9 468845710 468862094 | ||
+ | </ | ||
+ | Nun können wir die neue Disk zu unserer alten dazu hängen: | ||
+ | < | ||
+ | zpool attach | ||
+ | Make sure to wait until resilver is done before rebooting. | ||
+ | </ | ||
+ | Nach erfolgreichen resilvern, sieht unser Pool nun so aus: | ||
+ | < | ||
+ | zpool status | ||
+ | pool: rpool | ||
+ | | ||
+ | scan: resilvered 31,9G in 0h2m with 0 errors on Mon Nov 5 17:02:53 2018 | ||
+ | config: | ||
+ | |||
+ | NAME STATE READ WRITE CKSUM | ||
+ | rpool | ||
+ | mirror-0 | ||
+ | sda2 ONLINE | ||
+ | sdb2 ONLINE | ||
+ | |||
+ | errors: No known data errors | ||
+ | </ | ||
+ | Danach noch Grub installieren und fertig. | ||
+ | < | ||
+ | grub-install /dev/sdb | ||
+ | </ | ||
+ | Nachdem wir dann später mal die EVO getauscht haben, wird der Pool automatisch auf die 240GB vergrößert. | ||
+ | |||
+ | |||
+ | ===== Autoreplace ===== | ||
+ | Autoreplace ersetzt automatische eine defekte Platte aus einem Zpool. Hierfür ist aber ein eingener [[http:// | ||
- | ====== Proxmox spezifisches | + | ===== Proxmox spezifisches ===== |
Unter Proxmox wird LVM defaultmäßing mitinstalliert, | Unter Proxmox wird LVM defaultmäßing mitinstalliert, | ||
Zeile 499: | Zeile 622: | ||
- | ===== Proxmox Rescue ZFS ===== | + | ==== Proxmox Rescue ZFS ==== |
Zeile 516: | Zeile 639: | ||
Natürlich bevor wir das alles erledigen möge man sich vorher erkundigen ob noch etwaige Zusatzdatasets auf Root zeigen. Diese müssen vorher ausgehängt werden. | Natürlich bevor wir das alles erledigen möge man sich vorher erkundigen ob noch etwaige Zusatzdatasets auf Root zeigen. Diese müssen vorher ausgehängt werden. | ||
+ | ===== Kompletten RPOOL mit Proxmox recovern ===== | ||
+ | https:// | ||
+ | |||
+ | FIXME | ||
+ | |||
+ | ===== sharenfs ===== | ||
+ | Nutzt man ZFS als Dateisystem ist es klug die " | ||
+ | < | ||
+ | zfs create testpool/ | ||
+ | </ | ||
+ | Für IPV6 können als Source nur mehr FQDN verwendet werden. | ||
+ | |||
+ | Bei einem bestehenden Dataset: | ||
+ | < | ||
+ | zfs set sharenfs=" | ||
+ | </ | ||
+ | Für eine einfache Freigabe: | ||
+ | < | ||
+ | zfs set sharenfs=on testpool/ | ||
+ | </ | ||
+ | Um eine Freigabe zu beenden: | ||
+ | < | ||
+ | zfs set sharenfs=off testpool/ | ||
+ | </ | ||
+ | Das Dataset löschen, löscht natürlich auch die Freigabe. | ||
+ | Um zu sehen welche Freigaben nun aktiv sind gibt es mehrere Möglichkeiten. Am Host selbst: | ||
+ | < | ||
+ | cat / | ||
+ | </ | ||
+ | < | ||
+ | zfs get sharenfs # kann auch mit weiteren Optionen kombiniert werden | ||
+ | </ | ||
+ | Von einem anderen Host: | ||
+ | < | ||
+ | showmount | ||
+ | </ | ||
+ | |||
+ | ===== Swap ===== | ||
+ | Swap direkt auf ZFS erstellen. Empfohlen, genug RAM, oder Swap auf einem nicht ZFS-Filesystem. | ||
+ | < | ||
+ | zfs create -V 8G -b $(getconf PAGESIZE) -o compression=zle -o logbias=throughput -o sync=always -o primarycache=metadata -o secondarycache=none -o com.sun: | ||
+ | </ | ||
- | ====== Links ====== | + | ===== Links ===== |
* [[https:// | * [[https:// | ||
Zeile 524: | Zeile 689: | ||
* [[https:// | * [[https:// | ||
* [[http:// | * [[http:// | ||
+ | * [[http:// | ||
- | ====== Notiz ====== | + | ===== Notiz ===== |
| | ||
zpool replace | zpool replace | ||
+ | zdb --help | ||