Hogy megy a ZFS-boot FreeBSD-n?

Forrás: Andriy Gapon a freebsd-stable-levlistán ( http://lists.freebsd.org/pipermail/freebsd-stable/2013-September/075173… ) Jól jöhet ez még.

Now some high level information on how ZFS boot works and a little bit more
detailed information on how a root filesystem is chosen in ZFS case. The
information is applicable to recent versions of FreeBSD in head, stable/9
(including upcoming 9.2) and stable/8 (including 8.4).

- boot0-like stage always takes boot2-like stage from the same disk using simple
rules
- boot2-like stage probes all disks and partitions it can understand for ZFS pools
- default pool is the first pool detected by probing which starts at boot disk
- default filesystem is determined by bootfs property
- boot2-like stage allows to select a different pool, a specific filesystem in
the pool and a specific loader

boot0-like stage is pmbr in the case of GPT partitioning.
boot0-like stage is the first block of zfsboot in the case of whole-disk ZFS.
boot2-like stage is either gptzfsboot or zfsboot correspondingly.

- loader uses boot pool and filesystem information passed by boot2-like stage
- loader exposes loaddev and currdev variables, initially they point to the pool
and filesystem obtained from boot2-like stage
- currdev can be changed (e.g. at the prompt) while loaddev is read only
- kernel and modules are loaded from currdev by default

- kernel mounts root from a filesystem specified by vfs.root.mountfrom variable
that is passed by loader to kenv
- value of the variable is determined as follows:
- loader tries to set this variable based on "/" entry, if any, in /etc/fstab,
if any, in the filesystem specified by currdev
- the variable can be explicitly set in loader.conf or at the prompt; the
explicit assignment overrides the fstab-based auto-detected value
- for ZFS, if the above methods do not produce any value, vfs.root.mountfrom is
set based on currdev

So, you can see that all three methods mentioned in this thread can work equally
well. You can either specify a root entry in fstab, or set vfs.root.mountfrom
in loader.conf, or simply set bootfs property. The above information also
describes precedence rules if more than one knob is used: vfs.root.mountfrom is
the most significant, fstab is after it, bootfs plays role in root filesystem
selection only if neither of the previous is set.
Thus, it's completely up to you which method to use. Whichever is more
convenient. I prefer to just set bootfs.

Another piece of information is that neither mountpoint nor canmount property
affects ZFS root mounting. They of course have their usual effect in other
contexts like importing a pool on a different system or when a different
filesystem is selected to be a root filesystem.
So, again, you can set these properties to whatever is most convenient for you.

Hozzászólások

El is olvastad, vagy csak elborzadtál a szöveg hosszúságán?

Persze abban igazad van, hogy bőven elég lenne valami olyan rendszerbetöltő+fs-kombó, hogy a rendszerbetöltő ami a diszk legelején fix címen van mar kb fél-K hosszúságban, előveszi a diszk egy másik fix helyén levő szektorfolytonos adathalmazt, aminek mondjuk a hosszúsága a legelső szektorban ott van, ráugrik az elejére, osztán ennyi. Persze hogy egy csomó dolog az adott esetben nem lenne megoldható, az egyedi pech. Mivel bitang sok lehetőség van mind bootnál, mint a ZFS lehetőségei között, így nyilván nem lehet ilyen egyszerűen megoldani. Ez van.

Igen, elolvastam. Jó, ha a felét értettem. Ahogy azt se értem, hogy miért kell (lehet) valamit ötféleképpen csinálni. Az rég rossz, ha minden egyes esethez előbb olvasnom kell még 20 oldalt, hogy fel tudjam mérni, melyik lesz a legkevésbé szopáslegjobb. Egyetlen, egyszerűen működő módszer kéne, aztán heló. Egy bootloader telepítés ne legyen már fél napos kutatási projekt.

Minden lépést nem fogok elmagyarázni, de úgy kezdődik, hogy egy átlag bootloader helyből telepíthető a diszk elejére (ahol eredetileg az van, ami kiszedi, hogy melyik az első aktív partíció, aztán az annak a partíciónak az elején levő kódot beolvasa és ráugrik), de azt is lehet, hogy a zárójelben szereplő progit a helyén hagyjuk, és a partíció elejére rakunk egy okos programot, amelyik tud pl. menüt, meg animációs és USB-n keresztül zenélő tetriszt játszatni. Ez már két különböző lehetősg. Pl. ma már okos boot loadere van a Windows-nak, a Linuxnak, a BSD-knek, meg van egy halom alternatíva csak úgy. Osztán folytatódik azzal, hogy az a partíció milyen fájlrendszert tartalmaz (ezt ugye érteni kéne ha név alapján akarunk valamit megtalálni, nem pedig fixen drótozott diszkcímeken). A partíció milyen virtuális diszkalrendszeren szerepel, mert ha az a partíció egyetlen összefüggő terület a diszken, akkor még csak-csak, de ha mondjuk egy stripe-olt virtuális diszk része, akkor tudni kéne a stripe csíkszélességét, meg hogy kik tartoznak még bele a stripe-setbe, stb. És akkor ugye ZFS tud blokkonként tömöríteni, meg stripe-ot meg egyéb RAID-szinteket, meg valamikor nagyon fontos volt, hogy kompatibilis legyen a régi fstab-os világgal, de lehet hogy valakinél ez az igény elmúlt. Szóval van oka őven annak, hogy miért em triviális maga a mechanizmus.

Amúgy normális körülmények között a bootloader telepítése automatikus, tehát nem kell olvasgatnod neked felhasználónak semmit. Fenti leírás is inkább hibahelyzetben érdekes, azt viszont - szintén épelméjű esetben - olyan ember próbálja javítani, aki egy-két dologgal tisztában van.