zfs für große Datenpartition

H

holgerw

Guest
Hallo,

für meine Einsteiger-Dokumentation "FreeBSD auf dem Desktop" möchte ich verschiedene Installations-Szenarien durch gehen, einmal weitgehend pkg-only, dann möchte ich mich aber auch an poudriere herantrauen (Bauen von einzelnen Ports, von Ports-Gruppen wie plasma5 oder aber den Gesamtbau aller Ports). Ich habe zwei SSD Platten, ada0 hat 240 GB, ada1 hat 120 GB. Entschieden habe ich mich für eine simple Partitionierung, wie @-Nuke- sie auch für Desktop-Systeme empfiehlt, also ohne extra /var, /usr u.s.f.
Code:
ada0
ada0p1 30 GB ext4 GNU/Linux produktiv
ada0p2 30 GB ext4 GNU/Linux test1
ada0p3 30 GB ext4 GNU/Linux test2
ada0p4 40 GB ufs2 FreeBSD test1 (Start über Grub)
ada0p5 40 GB ufs2 FreeBSD test2 (Start über Grub)
ada0p6 40 GB ufs2 FreeBSD test3 (Start über Grub)
ada0p128 3 MB bios_grub

Code:
ada1
ada1p1 freebsd-boot 512k
ada1p2 40 GB ufs2 FreeBSD produktiv (Start über Bios Device Menü oder Grub)
ada1p3 75 GB zfs pool daten
  /daten/poudriere (für den Bau von Ports)
  /daten/swapfile (4 GB für alle FreeBSD Systeme)
  /daten/test1/home
  /daten/test2/home
  /daten/produktiv/home

Die gebauten Ports möchte ich gerne als eigenes Repo auf mein NAS packen, und das in der /usr/local/etc/pkg/repos/FreeBSD.conf der jeweiligen FreeBSD-Systeme eintragen.

Das Verzeichnis /home beeinhaltet auf unseren Desktop-Systemen nur die Konfigurationen, da Nutzerdaten (Dokumente, Audio, Foto, Video) per nfs zur Verfügung gestellt werden.

Ist das so gut aufgeteilt? Ich meine mit "gut" jezt nicht Details, die eher mit persönlichem Geschmack zu tun haben, sondern, ob das eine solide Partitionierung für mein Vorhaben ist. Der zfs Datenpool und alles an /etc und /usr/local/etc jedes Systems wird selbstverständlich regelmäßig auf unser Backup-NAS gesichert.

Viele Grüße,
Holger
 
Meine Meinung: Vergiss den ganzen UFS Quatsch und nimm nur ZFS! Dazu ein Dataset für <ZPOOL>/tmp und <ZPOOL>/usr/home. Damit kannst du mit beadm schnell einen Snapshot erstellen und wieder aktivieren. Dateien im Homeverzeichnis bleiben dabei erhalten.
 
Hallo,

aber bei ZFS sollte man bedenken das ZFS Ram braucht, wenn der knapp wird und SWAP auch auf ZFS liegt kann das schon mal in die Hose gehen.

Gruß ré
 
Hallo,

danke für Eure Antworten.

@kira12: Da ich auf ada0 noch über 20 GB Platz habe, kann ich swap, sei es eine Partition, sei es ein Swapfile, ja auch dorthin verfrachten, dann liegt swap nicht auf zfs. Bei 8 GB DDR3 Ram dürfte es doch unter zfs nicht knapp werden mit den Ressourcen bei einer Festplattengröße von lediglich 120 GB.

@foxit: Die Testsysteme auf ada0 kann ich ja erstmal mit ufs2 formatieren, zumal sich diese Systeme auch noch mit GNU/Linux-Systemen die Platte teilen sollen.

Interssant wird es meines Erachtens für ada1, was Deinen Vorschlag mit zfs betrifft, da ich dort ja nur ein FeeeBSD-System und einen Bereich daten haben möchte. Wie kann die zfs-only-Partitionierung für ada1 aussehen? ada1p1 muss wohl freebsd-boot sein inklusive Bootcode, und dann? Ich kann zwar auch den Installer machen lassen, möchte aber doch gerne selbst nachvollziehen, wie ich auf einer ssd ordentlich mit zfs unter Berücksichtigung von korrekter Ausrichtung (alignment) umgehe. Und dabei möchte ich nicht beginnen, mit Kanonen auf Spatzen zu schießen. zfs hat dermaßen viele Optionen, es gibt wohl dicke Bücher nur zu diesem Dateisystem. Aber was meine Anforderungen betrifft: Es ist für ein Desktop-System ohne Raid-Verbund, nicht für einen Rootserver oder ähnliches und ich bin ambitionierter Nutzer, kein professioneller Unixadministrator :)

Viele Grüße,
Holger
 
aber bei ZFS sollte man bedenken das ZFS Ram braucht
8GB DDR3 sind für rund 25 Euro zu haben. Bei diesen Preisen, sollte das Thema RAM und ZFS nicht ausschlaggeben sein, finde ich.

Die Testsysteme auf ada0 kann ich ja erstmal mit ufs2 formatieren, zumal sich diese Systeme auch noch mit GNU/Linux-Systemen die Platte teilen sollen.
Bei ZFS niemals die ganze Festplatte verwenden sondern immer mit Partitionen arbeiten. Dann ist auch ein vorhandenes Linux kein Problem.
 
Hallo,

aber bei ZFS sollte man bedenken das ZFS Ram braucht, wenn der knapp wird und SWAP auch auf ZFS liegt kann das schon mal in die Hose gehen.

Gruß ré
Auf ZFS zu swappen ist und bleibt eine dumme Idee. Auch das schreiben auf ein ZVOL muss potentiell im Kernel RAM allozieren. Meistens geht es gut oder wird nur lahm, aber mit etwas Anstrengung bekommt man so den Kernel in eine Panic gezwungen. Ich bevorzuge es auf soviele GELI onetime verschlüsselte GEOM Mirrors zu swappen wie ich halt zur Verfügung habe. Das FreeBSD VM Subsystem braucht etwas Swap um optimal zu funktionieren, weil ein nicht vorhandenes Swap wie ein voller Swap behandelt wird. In diesem Fall wird der Kernel zu "nervös" bei der Speicherverwaltung.
 
Die alten Anleitungen ZFS aus Performancegründen auf unformatierte Platten zu legen haben ihren Ursprung in einem Solaris spezfischen Problem. Unter Solaris erfordert UFS es die Writecaches der Platten zu deaktivieren um die Datenintegrität zu wahren. Deswegen deaktiviert Solaris diese Cache sobald eine Platte formatiert ist, weil sie potentiell eine UFS Partition enthalten könnte. Unter FreeBSD bestand dieses Problem nie (okay in FreeBSD 4 gab es mal Bestrebungen auf IDE Platten die Writecaches zu deaktivieren, weil deren Firmware so verlogen war).

ZFS findet seine Devices anhand von Metadaten im Device. Es braucht also keine Metadaten in der Partitionstabelle, aber es macht dennoch Sinn die Platten erst mit einer GPT zu versehen.
 
Eine kleine Randbemerkung: Ich nutze nur noch ZFS unter FreeBSD seit Jahren. Es läuft wunderbar. Und ich bin froh auf Servern es nutzen zu können. Und obwohl auf einem Server immer wieder Platten kaputt gehen, hatte ich bisher noch nie Datenverlust gehabt. Einfach Platte wechseln und ein zpool replace machen... Sogar auf Laptops mit "nur" 4GB RAM ist das kein Probem. Ausserdem kann man auch festlegen wie gross der "arc" Bereich maximal sein darf (z.B. vfs.zfs.arc_max="1G").

@holgerw: Zu Deiner Frage "wie ZFS aufsetzen"? Ich mache das eigentlich so: swap kommt auf eine extra Partition, der Rest auf den rest der Platte. Dafür habe ich ein eigenenes Script geschrieben, dass -nachdem per mfsbsd gebootet wurde- alles notwendige vornimmt... Hier der teil mit der Partitionierung:

zpool destroy $POOLNAME
for DISK in $DISKS; do
gpart destroy -F $DISK
dd if=/dev/zero of=/dev/$DISK bs=512 count=1
gpart create -s gpt $DISK
gpart add -t freebsd-boot -l b$DISK -b 40 -s 512K $DISK
gpart add -a 4k -t freebsd-swap -l s$DISK -s ${SWAPSIZE}G $DISK
gpart add -a 4k -t freebsd-zfs -l r$DISK $DISK
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 $DISK
done


wobei POOLNAME der name des zfs pools ist, DISK die disk (z.B. ada0), SWAPSIZE die Grösse des swaps in GB. Danach kommt noch ein Haufen spezifisches - vielleicht hilft es Dir aber trotzdem weiter :)

Grüße, Norbert
 
Hallo,

vielen Dank für Eure weiteren Erläuterungen zu zfs. Norbert, Dein Skript werde ich mal probieren, nachdem ich es komplett manuell bewerkstelligt habe.

Wenn ich wie folgt vorgehe

1. alte GTP löschen
2. GPT erstellen
3. freebsd-boot erstellen (ada1p1) und bootcode nach freebsd-boot schreiben
4. freebsd-swap erstellen (ada1p2)
5. zfs-Partition erstellen (ada1p3)
5.1. Pool "system" in der zfs-Partition erstellen (mit zpool)
5.1.1 Dataset / mit entsprechenden zfs-Optionen (mit zfs set ...)
5.1.2 Dataset /tmp mit entsprechenden zfs-Optionen (mit zfs set ...)
...
6. zfs-Partition erstellen (ada1p4)
6.1. Pool "daten" in der zfs-Partition erstellen (mit zpool)
6.1.1 Dataset /daten/poudriere mit entsprechenden zfs-Optionen (mit zfs set ...)
6.1.2 Dataset /daten/nutzerdaten mit entsprechenden zfs-Optionen (mit zfs set ...)

...

würdet Ihr dann sagen: "Holger hat die Basics von zfs-Partitionierung kapiert." ? :)

Viele Grüße,
Holger
 
nimm doch einen zpool für Daten und System. Bei mir sieht das z.B. so aus:
Code:
zroot
zroot/data
zroot/data/backup
zroot/data/jail
...
zroot/root
zroot/root/home
zroot/root/ports
zroot/root/tmp
 
Ich lasse ZFS standardmäßig durch den Installer anlegen und ändere daran nichts.
Wenn ich unter KDE ksysguard als Systemmonitor aufrufe, zeigt er mir an, das eine 2 GB große Swap Partition angelegt wurde. Aber zfs list zeigt mir, das die 2GB Swap hier nicht auftauchen.

zroot 17,0G 429G 96K /zroot
zroot/ROOT 8,27G 429G 96K none
zroot/ROOT/default 8,27G 429G 8,27G /
zroot/tmp 208K 429G 208K /tmp
zroot/usr 8,62G 429G 96K /usr
zroot/usr/home 8,62G 429G 8,62G /usr/home
zroot/usr/ports 96K 429G 96K /usr/ports
zroot/usr/src 96K 429G 96K /usr/src
zroot/var 64,9M 429G 96K /var
zroot/var/audit 96K 429G 96K /var/audit
zroot/var/crash 96K 429G 96K /var/crash
zroot/var/log 216K 429G 216K /var/log
zroot/var/mail 120K 429G 120K /var/mail
zroot/var/tmp 64,3M 429G 64,3M /var/tmp

Mit @holgerw's Installationsanleitung werde ich mich mal an die manuelle Partitionierung heranwagen. Am besten in einer VM zur Übung.
 
Auf ZFS zu swappen ist und bleibt eine dumme Idee. Auch das schreiben auf ein ZVOL muss potentiell im Kernel RAM allozieren. Meistens geht es gut oder wird nur lahm, aber mit etwas Anstrengung bekommt man so den Kernel in eine Panic gezwungen. Ich bevorzuge es auf soviele GELI onetime verschlüsselte GEOM Mirrors zu swappen wie ich halt zur Verfügung habe. Das FreeBSD VM Subsystem braucht etwas Swap um optimal zu funktionieren, weil ein nicht vorhandenes Swap wie ein voller Swap behandelt wird. In diesem Fall wird der Kernel zu "nervös" bei der Speicherverwaltung.

Also ZFS geht nicht, aber GELI schon?

Auf meinem NAS bin ich bisher mit Folgendem gut gefahren:
Code:
NAME  PROPERTY  VALUE  SOURCE
ssdpool/swap  checksum  off  local
ssdpool/swap  compression  off  local
ssdpool/swap  primarycache  none  local
ssdpool/swap  secondarycache  none  local
ssdpool/swap  sync  disabled  local
ssdpool/swap  volmode  geom  local
ssdpool/swap  org.freebsd:swap  on  local

Die Kiste hat aber auch 16G RAM und kommt nicht annähernd an die Grenze. Im Moment:
Code:
Mem: 14M Active, 2207M Inact, 13G Wired, 500K Cache, 273M Free
ARC: 9990M Total, 3316M MFU, 4356M MRU, 9008K Anon, 442M Header, 1867M Other
Swap: 4096M Total, 38M Used, 4058M Free

PS: Dass die Liste oben so verkackt aussieht, liegt entweder am FF oder am Forum. Das ist alles mit Space gepastet. Toller Schrott.
 
nimm doch einen zpool für Daten und System. Bei mir sieht das z.B. so aus:
Code:
zroot
zroot/data
zroot/data/backup
zroot/data/jail
...
zroot/root
zroot/root/home
zroot/root/ports
zroot/root/tmp

Hallo Oliver,

dazu habe ich zwei Fragen:
1. kann ich dann mit nur einem zpool auf ada1 auch die Datasets unter zroot/data auch für andere FreeBSD-Installation auf ada0 verwenden und wie sehen dazu dann eigentlich die fstab-Einträge aus?

2. Mit welchen Optionen (z.B. compression, copies u.s.w.) versiehst Du die einzelnen Datasets? Ich meine, wenn man schon zu zfs greift, und den Kram dazu noch manuell machen möchte, dann kann man doch auch gleich von dessen mächtigen Optionen Gebrauch machen. Wenn ich nicht mal ansatzweise beim Einsatz von zfs von dessen Optionen Gebrauch mache, kann ich doch gleich bei ufs2 bleiben.

Mir ist klar, dass ich den Installer in Sachen zfs auch einfach mal machen lassen kann, aber das widerspricht meiner Absicht, die ich mit meiner Dokumentation verbinde: Ich möchte die Schritte, die ich mache, nachvollziehen können, um sie dann einsteigerfreundlich dokumentieren zu können.

Viele Grüße,
Holger
 
Hallo holgerw.

Mein Setup bzgl. ZFS sieht wie folgt aus:
Betriebssystem auf UFS und Daten bzw. Homepage auf ZFS.
Aus meiner Sicht bietet es den Vorteil, dass in im Falle eines ZFS-Problems ich ohne sekundäre Medien das ZFS administrieren kann. Ich starte also das System mit den gewohnten Einstellungen und kann im Falle eines Falles auch sofort auf Backups zurückgreifen.

Aus meiner Sicht finde ich das die praktikabelste Lösung, aber jeder hat da so seine Vorlieben:D

Grüßle

Jürgen
 
Hallo holgerw.

Mein Setup bzgl. ZFS sieht wie folgt aus:
Betriebssystem auf UFS und Daten bzw. Homepage auf ZFS.
Aus meiner Sicht bietet es den Vorteil, dass in im Falle eines ZFS-Problems ich ohne sekundäre Medien das ZFS administrieren kann. Ich starte also das System mit den gewohnten Einstellungen und kann im Falle eines Falles auch sofort auf Backups zurückgreifen.

Aus meiner Sicht finde ich das die praktikabelste Lösung, aber jeder hat da so seine Vorlieben:D

Grüßle

Jürgen

Hallo Jürgen,

danke, das war in etwa mein Ausgangsvorschlag, siehe die Thread-Eröffnung (okay, swapfile auf zfs werde ich wohl lassen). Du rätst zu ähnlichem, aber @foxit rät zu zfs-only. Ich glaube, für beide Ansätze gibt es Argumente.
Bei mir wird es auf ada0 aber eh mindestens ein weiteres FreeBSD-Testsystem mit ufs geben, sollte also beim zfs-only auf ada1 etwas daneben gehen, habe ich ein weiteres FreeBSD zur Wartung.

Viele Grüße,
Holger
 
1. kann ich dann mit nur einem zpool auf ada1 auch die Datasets unter zroot/data auch für andere FreeBSD-Installation auf ada0 verwenden und wie sehen dazu dann eigentlich die fstab-Einträge aus?
Wenn du den Mountpoint eines ZFS Dataset auf legacy setzt, wird er beim Import des Pools nicht automatisch gemounted und du kannst ihn via fstab mounten. Ich denke der Pool muss dazu trotzdem importiert werden. Du könntest mal versuchen, dein Root-Datset auf legacy zu setzen, das wird ja via bootfs Property am Pool festgemacht. Gemacht hab ich das noch nicht. Achja, noch ein kleiner Stolperstein: Ein zpool weis, von welchem System er als letztes verwendet wurde. Das wird an irgendeiner zufällig generierten UUID festgemacht. Wenn du nun von einem anderen System aus den zpool importieren willst, musst du den Schalter -f verwenden, sonst klappts nicht. Wenn ich so darüber nachdenke, wird es für dich wohl am einfachsten sein, du nimmst den selben zpool für alle deine FreeBSD Installationen und schaltest via beadm zwischen ihnen hin und her. Der Bootloader unterstützt das seit 10.3, sodass du dort direkt deine verschiedenen Installationen auswählen kannst.

2. Mit welchen Optionen (z.B. compression, copies u.s.w.) versiehst Du die einzelnen Datasets? Ich meine, wenn man schon zu zfs greift, und den Kram dazu noch manuell machen möchte, dann kann man doch auch gleich von dessen mächtigen Optionen Gebrauch machen. Wenn ich nicht mal ansatzweise beim Einsatz von zfs von dessen Optionen Gebrauch mache, kann ich doch gleich bei ufs2 bleiben.
compression hab ich an, weils auf halbwegs aktuellen Maschinen mehr bringt als es kostet. Deduplication hab ich auf den Datasets mit den Jails an, weil es mir da tatsächlich was bringt. Für das ganze System braucht mir das zu viel Speicher und bringt auch zu wenig. Den Rest hab ich auf Standard gelassen.

Ich hoffe das hilft dir etwas weiter! Ich finde es übrigens bemerkenswert, wieviel Arbeit und Herzblut du in das ganze steckst. :-)
 
Moin @holgerw, ich bewundere Deinen Einsatz und Dein Engagement sehr. Der Horizont wird nur erweitert, indem ich mich mit den Dingen auseinandersetze. Allerdings möchte ich noch anmerken, das ich, obwohl ich den Installer für die Grundinstallation benutze, trotzdem und sehr wohl weiß, was hinter den Kulissen passiert. Nur finde ich es einfach bequemer. Auch weil ich mit den Standardeinstellungen zurecht komme und keine größeren Anpassungen benötige.
 
Also ZFS geht nicht, aber GELI schon?

Auf meinem NAS bin ich bisher mit Folgendem gut gefahren:
Code:
NAME  PROPERTY  VALUE  SOURCE
ssdpool/swap  checksum  off  local
ssdpool/swap  compression  off  local
ssdpool/swap  primarycache  none  local
ssdpool/swap  secondarycache  none  local
ssdpool/swap  sync  disabled  local
ssdpool/swap  volmode  geom  local
ssdpool/swap  org.freebsd:swap  on  local

Die Kiste hat aber auch 16G RAM und kommt nicht annähernd an die Grenze. Im Moment:
Code:
Mem: 14M Active, 2207M Inact, 13G Wired, 500K Cache, 273M Free
ARC: 9990M Total, 3316M MFU, 4356M MRU, 9008K Anon, 442M Header, 1867M Other
Swap: 4096M Total, 38M Used, 4058M Free

PS: Dass die Liste oben so verkackt aussieht, liegt entweder am FF oder am Forum. Das ist alles mit Space gepastet. Toller Schrott.

Solange du keinen wirklichen Druck auf deinem Swap hast findet der Kernel schon genug Speicher. Eines der Probleme ist das potentiell in der selben Transaktionsgruppe noch nen 128K Block landen kann, der dann im Speicher zusammenhängend alloziert werden muss. Diese Allokation kann fehlschlagen und damit zur Panic führen.

Swappen auf GELI (auch GELI auf GEOM Mirror) ist überhaupt kein Problem und eine sehr sinnvolle Sicherheitsmaßnahme. Solltest du massiv Swappen müssen hast du eh genug CPU-Zeit für die GELI Verschlüsselung ;).
 
Zurück
Oben