NAS mit zfs - raidz 3x8TB

sandreas

Well-Known Member
Hallo zusammen,

ich möchte mir gerne das NAS mit 3x8TB so einrichten, dass eine Platte zur Ausfallsicherheit vorhanden ist. Da ich nur sehr wenig Schnickschnack brauche, möchte ich es gerne mit einem FreeBSD machen (kein FreeNAS oder NAS4Free oder wie sie alle heißen).

Für ein Testsystem habe ich mir eine VM mit 3x1GB aufgesetzt, um das Szenario durchzuspielen. Dabei bin ich wie folgt vorgegangen:
  • FreeBSD installiert (alles Standard)
  • User "andreas" angelegt
  • Folgende Befehle zum Anlegen des raidz ausgeführt:
Code:
# enable zfs
echo 'zfs_enable="YES"' >> rc.conf

# start zfs as service
service zfs start

# create storage
zpool create storage da1 da2 da3

# create file system
zfs create storage/home

# enable compression
zfs set compression=lz4 storage/home

# improve redunancy (1-3)
zfs set copies=2 storage/home

# move existing home directory to zfs storage
cp -rp /home/* /storage/home
mv /home /home.bak
mv /usr/home /usr/home.bak
ln -s /storage/home /home
ln -s /storage/home /usr/home
zfs set mountpoint=/home storage/home

Nach einem Reboot läuft alles soweit. Mich wundert nur, dass ich als Avail 3GB angezeigt bekomme, obwohl doch eigentlich eine Disk als Parity laufen sollte oder?
Code:
df -h
Filesystem      Size    Used   Avail Capacity  Mounted on
/dev/da0p2       37G    2.0G     32G     6%    /
devfs           1.0K    1.0K      0B   100%    /dev
storage         2.8G     25K    2.8G     0%    /storage
storage/home    2.8G     47K    2.8G     0%    /storage/home
 
Hallo zusammen,

ich möchte mir gerne das NAS mit 3x8TB so einrichten, dass eine Platte zur Ausfallsicherheit vorhanden ist. Da ich nur sehr wenig Schnickschnack brauche, möchte ich es gerne mit einem FreeBSD machen (kein FreeNAS oder NAS4Free oder wie sie alle heißen).


[/code]
Hallo,

bei der potentiellen Datenmenge würde ich eine Platte mehr einbauen und ein RaidZ2-Pool aufbauen.
Aus der Manpage von zpool:
A raidz group with N disks of size X with P parity disks can hold
approximately (N-P)*X bytes and can withstand P device(s) failing
before data integrity is compromised. The minimum number of
devices in a raidz group is one more than the number of parity
disks. The recommended number is between 3 and 9 to help increase
performance
.

Lass Dich mal ne Montagscharge erwischen und Dir fällt erst eine Platte aus, Du tauscht die aus und startest den Resilverprozeß und genau zu der Zeit macht die nächste Platte die Grätsche.
Beim RaidZ1 ist Dein Pool hin und Du darfst Dein hoffentlich vorhandenes Backup einspielen, beim RaidZ2 kann das Resilvern weitergehen.

Gruß
marmorkuchen
 
@KobRheTilla
Ah super danke... blöder Copy & Paste Fehler - hätte ich selber sehen müssen.

@marmorkuchen
Danke für den Hinweis - mir ist die ganze "RaidZ ist kein Backup"-Problematik bewusst - auch, dass die Wahrscheinlichkeit eines Ausfalls nicht besonders gering ist, wenn eine Platte abraucht. Die Daten sind nicht so wichtig, nur "nützlich" und ein Backup gibt es dann (wenn das System steht) auch auf eine andere Charge Platten von einem anderen Hersteller. Ich lebe daher mit dem mir durchaus bekannten Risiko aufgrund der Kostenersparnis.

Gibt es bei ZFS sonst noch etwas zu beachten? Ich liebäugle mit einer RAID-Expansion (sobald verfügbar und wegen Platzmangel notwendig)... könnte ich das mit der Config machen?


Und anbei mal meine samba4.conf, falls jemandem noch was auffällt. Ansonsten ist das NAS erstmal "fertig";)

Code:
[global]
  server string = nas
  workgroup = WORKGROUP
  netbios name = %h
  load printers = no
  browseable = yes
  writeable = yes
  printable = no
  encrypt passwords = true
  passdb backend = smbpasswd
  use sendfile = yes
  socket options = SO_RCVBUF=65536 SO_SNDBUF=65536 TCP_NODELAY IPTOS_LOWDELAY
  min receivefile size = 16384
  aio read size = 16384
  aio write size = 16384
# aio write behind = true #(may cause problems)

[homes]
  comment = Home directories
  browseable = yes
  valid users = %S
  writable = yes

[media]
   path = /home/andreas/Media
   # public = yes
   guest ok = yes
   only guest = yes
   writable = no
   force user = andreas
   force group = andreas
   printable = no
 
Bei zfs kannst eigentlich immer komfortabel Platten dazu-add-en (aber nicht ohne weiteres wegnehmen) oder halt mittels autoexpand und größeren Platten das bestehende RaidZ 'aufpumpen' - bei gleichbleibender Plattenzahl.
Einmal angelegt, laufen pools eigentlich selbständig, groß rummachen muss man da nichts.
 
@marmorkuchen @turrican Ja, Pool-Add oder größere Platten war mir bekannt... in dem Link von mir ist aber die Rede von "Expansion", sprich: gleich große Platte dazu, gleicher Pool, 8TB mehr (in meinem Fall)

Ich werde übrigens auch noch was für die Boot-Zeit tun und versuchen, Hibernate auf dem NAS hinzukriegen... bin mal gespannt, was ich da alles tun kann.

Der Befehl
Code:
acpiconf -s 3
um S3 / Hibernate hinzukriegen, funktioniert ja je nach Hardware lange nicht immer und überall.

Hier auch mal eine Liste mit Maßnahmen für den schnelleren Boot-Vorgang (englisch), die ich schon mal ganz brauchbar fand:

1. configure kernel with all drivers compiled in
2. remove debug options from kernel (-g)
3. left only I686_CPU on kernel config (remove 586 etc)
4. add autoboot_delay="1" --> /boot/loader.conf
5. disable sendmail --> /etc/rc.conf (and other unuser services)
6. kernel config: SCSI_DELAY=1000
7. use customized CFLAGS for kernel and base system
start with these:

CFLAGS= -O2 -fno-strict-aliasing -pipe -s -funroll-loops -fomit-frame-pointer
CXXFLAGS= -O2 -fno-strict-aliasing -pipe -s -funroll-loops
COPTFLAGS= -O2 -fno-strict-aliasing -pipe -s -funroll-loops -fomit-frame-pointer
You may also check:

-frename-registers -fweb -ffast-math -ftracer -funroll-loops -fstack-protector
8. Remove sleep fonctions from startup scripts:

# grep sleep /etc/rc.d/*
Oct 31 09:12:06 moshnroll kernel: acd0: FAILURE - INQUIRY ILLEGAL REQUEST asc=0x24 ascq=0x00 sks=0x40 0x00 0x01
Oct 31 09:12:06 moshnroll kernel: acd0: FAILURE - INQUIRY ILLEGAL REQUEST asc=0x24 ascq=0x00 sks=0x40 0x00 0x01
 
@marmorkuchen @turrican Ja, Pool-Add oder größere Platten war mir bekannt... in dem Link von mir ist aber die Rede von "Expansion", sprich: gleich große Platte dazu, gleicher Pool, 8TB mehr (in meinem Fall)

Nein, das funktioniert bei ZFS so nicht. Du musst entweder einen Spiegel oder ein weiteres RaidZ anhängen. Wir hatten mal, allerdings unter Solaris, den Root-Pool vergrößert, indem wir eine Platte gegen eine größere getauscht haben, den Spiegel resilvern liessen und dann die zweite Platte gegen eine größere tauschten und auf hier wieder resilvern liessen. Man darf nur nicht vergessen den Grub neu zu schreiben, sonst wird der nächste Reboot nicht so lustig. :-)
 
NOCH nicht... in FreeBSD 12 soll das laut dem Link drin sein.

Aber die Spielerei mit Solaris klingt witzig... für mich nicht nutzbar aber sehr cool :-)
Na ja, da hatte ein Kollege ein PRD-System zu knapp bemessen und wir mussten das dann halt fixen. Quasi Spaß am System.
Ich sitze hier hinterm Proxy und kann den Link nicht aufrufen. :-(
 
Das copies=2 kannst du dir dann halt sparen, da du ja raidZ hast und es dir auf die Kosten ankommt.
 
@-Nuke-

Weil ich gerade 8TB lese... ich hoffe das sind keine Archive / SMR Platten?

Nope, sind WD Red. Ultrastar waren mir zu teuer und ich hab die WD-Red günstig gekriegt :-)

Gerade fange ich an, einen Custom-Kernel zu kompilieren, um die Boot-Zeit und das System generell zu optimieren. Hier habe ich bestimmt noch ein paar Fragen, soll ich dafür einen extra Thread aufmachen, wenn es soweit ist? Weil zum Thema passt es ja eigentlich nicht...
 
Gerade fange ich an, einen Custom-Kernel zu kompilieren, um die Boot-Zeit und das System generell zu optimieren. Hier habe ich bestimmt noch ein paar Fragen, soll ich dafür einen extra Thread aufmachen, wenn es soweit ist? Weil zum Thema passt es ja eigentlich nicht...
Jau, ein eigener Kernel. Aber ich sage gleich: Da gibt's nicht viel zu optimieren.
 
Wir hatten mal, allerdings unter Solaris, den Root-Pool vergrößert, indem wir eine Platte gegen eine größere getauscht haben, den Spiegel resilvern liessen und dann die zweite Platte gegen eine größere tauschten und auf hier wieder resilvern liessen. Man darf nur nicht vergessen den Grub neu zu schreiben, sonst wird der nächste Reboot nicht so lustig. :-)

Was entgeht mir hier bzw. kannst du das Problem, das ihr hattet näher erläutern? Oder steh ich grad aufm Schlauch...?
 
@Yamagi
@KobRheTilla

Jau, ein eigener Kernel. Aber ich sage gleich: Da gibt's nicht viel zu optimieren.

Das beste was du machen kannst, ist eine SSD fürs System zu nutzen. Mit sysctl-Tuning und Kernelbacken kommst du da nicht weit.

Ok, auf diese Aussage würde ich mich jetzt schon verlassen, SSD ist verbaut... Dazu folgende Frage:

Wenn ich aus dem System folgendes raus schmeiße:
sound
wlan
hyperv
xenpci
mmc

Und alle SCSI-Controller und Hardware die ich nicht benötige - Dann noch folgendes Setze:
makeoptions DEBUG=
makeoptions WITH_CTF=0
options SCSI_DELAY=1000


würde es den Bootvorgang nach eurer Aussage nicht signifikant beschleunigen (signifikant heißt für mich mehr als 5 Sekunden / oder 10%)?
 
Nein, denn so funktioniert der Kernel nicht. Technisch gesehen sind es immer Kernel-Module, egal ob sie Teil des großen Kernel Images sind oder als einzelne Dateien vorliegen. Der einzige Unterschied ist, dass Module aus einzelnen Dateien zur Laufzeit geladen werden können und andere nicht. Beim Boot baut der Kernel zuerst den "Device Tree" auf, er findet also heraus welche Geräte sich wo im System befinden. Mit dem "devinfo" Kommando kann man sich den Device Tree ausgeben lassen. Anschließend ruft der Kernel die Initialisierungsroutine für jedes ihm bekannte Kernelmodul auf. Diese Routine schaut im Device Tree, ob es seine Geräte darin findet. Wenn das der Fall ist - und wirklich nur dann - wird ein genauerer Test durchgeführt um das Gerät sicher als unterstützt zu identifizieren. Ist das Gerät erfolgreich identifiziert, wird das Modul einen Attach starten. Dabei wird die Hardware initialisiert, Interruptvektoren und DMA-Bereiche definiert, etc.
Durch das Herausnehmen von Modulen aus dem Kernel sparst du also nur das Prüfen auf vorhandene Hardware durch nicht benötigte Module. Aber das ist nur ein verschwindend geringer Anteil der Bootzeit und hart an der Grenze des Messbaren. Das FreeBSD deutlich langsamer als Linux bootet liegt auch nicht daran, dass mehr Module als notwendig durchlaufen werden, sondern daran, dass Linux parallelisiert bootet und FreeBSD nicht.
 
So... nach einigen Tests bin ich jetzt mit meinem Grundsystem zufrieden... nun würde ich gerne etwas weiter gehen und die Datenpflege und Systemüberprüfungen angehen...

Dazu habe ich mir mal angeschaut, was sinnvoll ist, folgendes würde ich gerne machen

  • smartcrl short self test
  • zfs pool scrub
Problem: Das NAS wird wenig gebraucht (nur für Wöchentliche Backups) und hin und wieder mal für einen Film, daher ist es die meiste Zeit ausgeschaltet.

Ich würde also gerne beim Hochfahren einen smart short self test im Hintergrund machen und vielleicht alle 4 Wochen mal ein Scrub. Ist das grundsätzlich sinnvoll?

Wenn ja: schreibe ich die Befehle einfach in die /etc/rc.local und forke das, oder wie würde ich das am elegantesten machen?
 
Für den ZFS Scrub kannst du die Parameter in der /etc/defaults/periodic.conf eintragen. Ich persönlich halte aber nicht viel davon, die Festplatten "zu tode" zu überprüfen. Mein Scrub läuft 2 mal jährlich.
 
Zurück
Oben