Boot von ZFS Mirror

hippodriver

Well-Known Member
Hallo Bastelfreunde!

Nach dem Erscheinen von 8.0 RC1 habe ich mich an die Umsetzung meines ZFS only Systems gemacht. Wie bekannt ist, unterstützt der Installer leider keine Installation auf ZFS. Deshalb bricht das große Frickeln aus.

Voraussetzungen

  • Zwei identische 1 TB SATA Platten (ad4 und ad7)
  • FreeBSD 8.0-RC1 ADM64 DVD
  • Booten von DVD in Fixit Mode.
  • Sicherheitshalber symmetrisches Festplatten-Layout.

Vorgehen

Ich habe die zwei passenden HowTos von wiki.freebsd.org benutzt.

Vorbereiten der Festplatten mit GPT Partitionen durch gpart
Code:
gpart create -s GPT ad4
gpart add -b 34 -s 128 -t freebsd-boot ad4
gpart add -b 162 -s 8388608 -t freebsd-swap ad4
gpart add -b 8388770 -s 1945134218 -t freebsd-zfs ad4
Für ad7 symmetrisch.

Bootcode installieren.
Code:
gpart bootcode -b /dist/boot/pmbr -p /dist/boot/gptzfsboot -i 1 ad4
gpart bootcode -b /dist/boot/pmbr -p /dist/boot/gptzfsboot -i 1 ad4

ZFS mirror anlegen
Code:
zpool create zroot mirror ad4r3 ad7r3
zpool set bootfs=zroot zroot

FreeBSD installieren. Alle möglichen Pakete (base, doc, lib32, ...)
Code:
cd /dist/8.0-RC1
export DESTDIR=/zroot
(.. Pakate installieren ..)
cd kernel; ./install.sh generic
cd /zroot/boot; cp -rp GENERIC/* /zroot/boot/kernel/

Einträge in fstab, rc.conf, src.conf und loader.conf
Code:
# fstab
/dev/ad4p2 none swap sw 0 0
zroot / zfs rw,noatime 0 0
# rc.conf
zfs_enable="YES"
# src.conf
LOADER_ZFS_SUPPORT=YES
# loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"

Boot loader mit ZFS-Unterstützung einbauen
Code:
chroot /zroot
mount -t devfs devfs /dev
export DESTDIR=""
cd /usr/src/sys/boot/
make obj
make depend
make
cd i386/loader
make install
passwd
umount /dev
exit

zpool.cache anlegen
Code:
mkdir /boot/zfs
zpool export zroot
zpool import zroot
cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache

Rest anpassen
Code:
export LD_LIBRARY_PATH=/mnt2/lib
zfs set mountpoint=legacy zroot
zfs unmount -a
reboot

Problem

Das System bootet nicht. Das BIOS läuft durch, aber nach der letzten BIOS Anzeige mir den gefunden PCI devices bleibt die Kiste stehen. Von den Bootloadern ist nicht zu sehen. Der Fehler scheint also schon bei der Installation des boot codes zu liegen.
 
So ich habe es in einer VM jetzt mal nach der Anleitung von chruetertee probiert.
Denn Loader habe ich allerdings nicht no übersetzt, da ich dachte das mit 8.0 Release von einem Pool default gebootet werden kann.

Installiert ist alles, Pool wurde exportiert und importiert und in das installierte System kopiert.
Anschließend neugestartet.
Loader kommt sagt aber er kann keinen Kernel finden :zitter:
Also wieder LiveFS gestartet ... nun denke ich mir das die Konfiguration des Pools in der Pool.cache Datei gespeichert wird oder? Wenn ja ist diese in dem Pool.
Kann ich auf den Pool zugreifen ohne diese Datei? Wenn nein würde das bei ZFS ja bedeuten wenn diese Datei kaputt ist das alles weg ist oder?

Wie funktioniert denn eine Installation im 8.0 Release, inzwischen anders?

Mfg KO
 
nun denke ich mir das die Konfiguration des Pools in der Pool.cache Datei gespeichert wird oder? Wenn ja ist diese in dem Pool.
Kann ich auf den Pool zugreifen ohne diese Datei? Wenn nein würde das bei ZFS ja bedeuten wenn diese Datei kaputt ist das alles weg ist oder?

Wie der Name der Datei schon sagt...sie ist nur ein Cache. Damit BSD beim nächsten Booten weiß, welchen Pool es wieder einhängen muss.

Man kann die Datei jederzeit löschen. Sobald man seinen Pool mit "zpool import ..." wieder importiert, wird sie automatisch neu angelegt.
 
Falsch nachgedacht.
Man kann ja einfach ein zpool import machen, damit der Pool eingebunden wird. Ich dachte man benötigt zwingend diese Datei um einen Pool zu importieren. In diesem Falle wäre diese ja "weg" gewesen. Na ja ich werde es mal weiter versuchen :-)
 
Du brauchst die Datei nicht um auf den Pool mit einem vollständigen Kernel und Userland zuzugreifen wohl aber um aus dem Bootloader darauf zuzugreifen, weil der sich den Pool nicht mal eben importieren kann. AFAIK muss man auch mit FreeBSD 8.0 noch immer loader(8) mit LOADER_ZFS_SUPPORT=yes compiliern und installiern weswegen freebsd-update mit großer Vorsicht zu genießen ist und ich zum selbst Compilen des gesammten Systems raten würde.
 
Das war mein Fehler,
ich dachte der Loader kann per Default ZFS, kann er aber nicht.

Mein System läuft jetzt in der Virtuellen Maschiene und ich bin begeistert von ZFS was ich jetzt gesehen habe. Ich habe ein ZFS Only System gebaut mit Spiegel also ad0 und ad1. Bootreihenfolge immer auf ad0 gesetzt. (BIOS).

Dann mal zum Probieren ad0 entfernt und von ad1 gestartet, funktioniert auch :)
Jetzt eine neue Festplatte hinzugefügt ad3, diese mit GPT wie die andere Partitioniert. Dann diese Platte zu meinem Pool hinzugefügt. (Die erste Festplatte immer noch "ausgebaut").
Der Kopiert erstmal alle Daten auf die neue Platte, wunderschön.

Im Anschluss ausgeschaltet und ad0 wieder hinzugefügt. Bootreihenfolge auf ad0 gesetzt. Vor dem Start des Loaders kamm ne Meldung das ZFS inkonsistent ist.
FreeBSB ist hochgefahren und die letzte hinzugefügte Platte war immer noch im Pool. Hätte ja sein können das die "raus" ist.

Was ich mich jedoch Frage wie ZFS das Regelt wenn jetzt viele Daten auf ad1 geändert worden wären ob der diese auf ad0 kopiert hätte oder ob er die Daten von ad0 auf ad1 kopiert hätte. Nach welchen Regeln geht das? Änderungsdatum?

Tut mir leid für diese Fragen bin aber im allen was ZFS betifft unwissend. Auf jedenfall ist es total geil.

Mfg KO

PS: In der Anleitung von chruetertee wird der SWAP in ZFS erstellt, im hauseignen Wiki wird dringend davon abgeraten, was auch nachvollziehbar begründet wird. Was ist denn nun "richtig"? Ich meine wenn man eine Spiegel vom kompletten System macht und auch den SWAP da einbaut wird der ja auch gespiegelt, nicht unbedingt ich weiß, wäre aber bestimmt sehr Ressourcenfressend wenn man den SWAP spiegelt oder?
 
Wenn du swap nicht spiegelst wird das System beim Verlust einer Platte sehr unschön zu stehen kommen. Du musst swap aber nie resilvern wenn du das meinst, weil swap volatile ist.
 
Also, früher war die Swap auf einem ZPool absolut tödlich, da hättest du genauso gut den Reset-Knopf drücken können. Inzwischen, bei 8.0, ist es nutzbar. Aber immer noch recht langsam, verglichen mit einer echten Swap. Also ich würde es lassen und stattdessen die Swap per gmirror über die Platten spiegeln.
 
Zurück
Oben