Riesumo questo post perchè, come promesso, ho risolto il problema del boot in una root ZFS su FreeBSD, in caso di schema MBR.
In realtà è stato più semplice del previsto, ma usando ormai sempre e solo OpenIndiana, non ho molto tempo di fare test su FreeBSD e ZFS.
Comunque, la soluzione al problema è semplice
Dopo aver aggiornato FreeBSD all'ultima release, NON aggiornate subito la storage pool ZFS.
In realtà, potreste anche farlo, però io consiglio di farlo alla fine.
Avendo, infatti, il DVD della obsoleta 8.1-RELEASE mi viene più facile aggiornare la storage pool solo dopo che ho aggiornato il boot loader.
Preciso subito alcune cose:
1) Il nome della pool che io uso è rpool, quindi in questo how-to userò questo nome.
2) Il mio root-dataset (ovvero il dataset in cui è installato FreeBSD) è rpool/ROOT/freebsd-0
3) Uso il DVD di FreeBSD 8.1-RELEASE
4) La mia slice ed la mia partizione freebsd-zfs sono rispettivamente /dev/ad0s1 e /dev/ad0s1a
Ovviamente è scontato dire di adattare questo how-to alla vostra situazione.
Fate il boot con il DVD e, se il DVD è di una versione meno recente di quella installata sul PC, caricate il driver di zfs e montate la pool (ecco perchè vi ho detto di non aggiornarla subito).
Codice: Seleziona tutto
Fixit# for i in opensolaris zfs; do kldload /mnt2/boot/kernel/$i.ko; done
Fixit# zpool import
Fixit# zpool import -o altroot=/mnt -o cachefile=/tmp/zpool.cache -f rpool
NON usate MAI
Poichè equivale a
Codice: Seleziona tutto
Fixit# zpool import -o altroot=/mnt -o cachefile=none -f rpool
Su FreeBSD è fortemente sconsigliato non creare e non aggornare la zpool.cache per ogni import esterno fatto.
Copiamo il bootloader nel live environment e installiamolo, assicurandoci di aver smontato prima la pool
Codice: Seleziona tutto
Fixit# cp /mnt/boot/zfsboot /
Fixit# cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache
Fixit# zpool export rpool
Fixit# dd if=/zfsboot of=/dev/ad0s1 count=1
Fixit# dd if=/zfsboot of=/dev/ad0s1a skip=1 seek=1024
Aggiornato il boot loader, reimportiamo la pool e riattiviamo la bootfs property (è IMPORTANTE FARLO, altrimenti si rischia che FreeBSD non riesca a montare la vostra root, anche se il loader avrà la variabile vfs.root.mountfrom settata correttamente).
Codice: Seleziona tutto
Fixit# zpool import rpool
Fixit# zpool set bootfs=rpool/ROOT/freebsd-0 rpool
Fixit# cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache
Riavviate (senza dare l'export!) e, una volta loggati, aggiornate la pool
usate -a se volete aggiornare *tutte* le pool alla massima versione. Usate il nome della vostra pool se volete aggiornare solo quella.
Ah dimenticavo.
Se avete aggiornato FreeBSD dalla 8.1-RELEASE ad una versione più recente, dovrete aggiornare anche i dataset ZFS che sono rimasti alla versione 3 (la versione 5 è l'ultima rilasciata).
Per farlo,
Nel mio caso, si è verificata una situazione di fortissima instabilità subito dopo l'upgrade.
Per risolverla, basta riavviare.