ZFS Root on MBR -> zweite Platte einhängen

peterle

Forenkasper
Mojen, Mojen,

ich habe ein wenig mit FreeBSD 10 und dem bsdinstall gespielt.
Der setzt mir sehr schick und unproblematisch einen ZFS Root on MBR auf.

Das sieht dann so aus:

Code:
===>> zpool status
  pool: bootpool
state: ONLINE
  scan: none requested
config:

        NAME                      STATE    READ WRITE CKSUM
        bootpool                  ONLINE      0    0    0
          diskid/DISK-9WK5LESYs1a  ONLINE      0    0    0

errors: No known data errors

  pool: zroot
state: ONLINE
  scan: none requested
config:

        NAME                      STATE    READ WRITE CKSUM
        zroot                      ONLINE      0    0    0
          diskid/DISK-9WK5LESYs1d  ONLINE      0    0    0

errors: No known data errors

Die passende Platte dazu, sieht so aus:

Code:
===>> gpart show /dev/diskid/DISK-9WK5LESY
=>        63  1953525105  diskid/DISK-9WK5LESY  MBR  (932G)
          63  1953525105                    1  freebsd  [active]  (932G)

===>> gpart show /dev/diskid/DISK-9WK5LESYs1
=>        0  1953525105  diskid/DISK-9WK5LESYs1  BSD  (932G)
          0    4194304                      1  freebsd-zfs  (2.0G)
    4194304    8388608                      2  freebsd-swap  (4.0G)
    12582912  1940942193                      4  freebsd-zfs  (926G)

Jetzt habe ich die Plattengemotrie mal auf eine zweite geklont:

Code:
===>> gpart backup /dev/diskid/DISK-9WK5LESY | gpart restore /dev/diskid/DISK-9WK5JYLR

===>> gpart backup /dev/diskid/DISK-9WK5LESYs1 | gpart restore /dev/diskid/DISK-9WK5JYLRs1

Nun stellt sich mir noch die Frage, wie ich auf die zweite Platte die korrekten Bootcodes bekomme?
Ich habe ehrlich gesagt keine Ahnung, wie bsdinstall das zusammenfrickelt und blicke auf Anhieb auch nicht recht durch das Scrip dazu durch. :o

Jede Hilfe ist mir willkommen! :)
Danke.
 
Hallo, sitze hier grad in Finnland, Rovaniemi am Flughafen und habe wieder WiFi :-)

Mit "gpart bootcode" sollte das gehen. Schau dir am besten die "man" Page dazu an "man gpart"
 
Da habe ich schon reingeschaut, aber um das anzuwenden muß ich ja wissen, wo welcher bootcode in dem Setup hinkommt und das weiß ich leider nicht und suche eine Methode, wie ich das herausfinden kann.
 
Mh also mit "gpart show -lp" kannst du dir alle Laufwerke ect. anzeigen lassen und dann mit "gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 adaX" den Bootcode installieren.
 
Mh also mit "gpart show -lp" kannst du dir alle Laufwerke ect. anzeigen lassen ...

Gut, das gibt mir:
Code:
===>> gpart show -lp
=>        63  1953525105    diskid/DISK-9WK5LESY  MBR  (932G)
          63  1953525105  diskid/DISK-9WK5LESYs1  (null)  [active]  (932G)

=>        0  1953525105  diskid/DISK-9WK5LESYs1  BSD  (932G)
          0    4194304  diskid/DISK-9WK5LESYs1a  (null)  (2.0G)
    4194304    8388608  diskid/DISK-9WK5LESYs1b  (null)  (4.0G)
    12582912  1940942193  diskid/DISK-9WK5LESYs1d  (null)  (926G)

=>        63  1953525105    diskid/DISK-9WK5JYLR  MBR  (932G)
          63  1953525105  diskid/DISK-9WK5JYLRs1  (null)  [active]  (932G)

=>        0  1953525105  diskid/DISK-9WK5JYLRs1  BSD  (932G)
          0    4194304  diskid/DISK-9WK5JYLRs1a  (null)  (2.0G)
    4194304    8388608  diskid/DISK-9WK5JYLRs1b  (null)  (4.0G)
    12582912  1940942193  diskid/DISK-9WK5JYLRs1d  (null)  (926G)

... aber woher weiß ich wo welche Art von Bootcode in der Platte diskid/DISK-9WK5LESY steht?
Das ist das, was ich gerne rausfinden möchte. :o

... und dann mit "gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 adaX" den Bootcode installieren.

Auf einer reinen GPT Platte dürfte das auch so sein, aber bei einem MBR und hier dürfte das anders gehen. Zumindest vermute ich das aus den Anleitungen, die "ZFS Root on MBR".
Hier ist z.B. eine Anleitung dazu:
https://wiki.freebsd.org/RootOnZFS/ZFSBootPartition
Nur verstehen tu ich sie nicht wirklich, was die bootcodes und deren Verteilung angehen. :O
 
Kannst du mir mal die Ausgabe von "gpart show -p" zeigen?

Was meinst du mit: "...welche Art von Bootcode"? Hinter der Disk in der 4 Spalte steht bei dir "MBR". Wenn die Disk mit "GPT" formatiert ist, steht da "GPT". Explizit MBR sollte so gehen: "gpart bootcode -b /boot/mbr adaX".
 
Kannst du mir mal die Ausgabe von "gpart show -p" zeigen?

Gerne:

Code:
===>> gpart show -p
=>        63  1953525105    diskid/DISK-9WK5LESY  MBR  (932G)
          63  1953525105  diskid/DISK-9WK5LESYs1  freebsd  [active]  (932G)

=>        0  1953525105  diskid/DISK-9WK5LESYs1  BSD  (932G)
          0    4194304  diskid/DISK-9WK5LESYs1a  freebsd-zfs  (2.0G)
    4194304    8388608  diskid/DISK-9WK5LESYs1b  freebsd-swap  (4.0G)
    12582912  1940942193  diskid/DISK-9WK5LESYs1d  freebsd-zfs  (926G)

=>        63  1953525105    diskid/DISK-9WK5JYLR  MBR  (932G)
          63  1953525105  diskid/DISK-9WK5JYLRs1  freebsd  [active]  (932G)

=>        0  1953525105  diskid/DISK-9WK5JYLRs1  BSD  (932G)
          0    4194304  diskid/DISK-9WK5JYLRs1a  freebsd-zfs  (2.0G)
    4194304    8388608  diskid/DISK-9WK5JYLRs1b  freebsd-swap  (4.0G)
    12582912  1940942193  diskid/DISK-9WK5JYLRs1d  freebsd-zfs  (926G)

Was meinst du mit: "...welche Art von Bootcode"? Hinter der Disk in der 4 Spalte steht bei dir "MBR". Wenn die Disk mit "GPT" formatiert ist, steht da "GPT". Explizit MBR sollte so gehen: "gpart bootcode -b /boot/mbr adaX".

Wenn ich das alles händisch anlege, dann schreibe ich z.B. sowohl einen
"gpart bootcode -b /mnt2/boot/boot0 ad0"
als auch einen
"gpart bootcode -b /tmp/zfsboot1 /dev/ad0s3"

Wenn ich aber nun nicht weiß, wie die Disk ursprünglich eingerichtet wurde, wie finde ich raus, was wo hingehört, damit das ganze dann auch startet, wenn die Originalplatte ausgefallen und nur noch die zusätzlich eingefügte Mirror-Platte im System ist?
 
So, nachdem ich jetzt wieder etwas Zeit hatte und versucht habe das Handbuch zu verstehen, habe ich kurzerhand mal "hexdump" und "diff" genommen und mir von den jeweiligen Platten und den Slices die ersten 512b als Hex in ein File kopiert und mir auch von den diversen mbr, pmbr, zfsboot, boot und so weiter files aus /boot je ein Hex-File gemacht.

Auf den Slices liegt eindeutig ein /boot/zfsboot, aber auf den Platten liegt ein /boot/mbr bei dem sich ein paar Zeilen unterscheiden:
Code:
===>> diff DISK-9WK5LESY.hex mbr.hex
20,22c20,21
< 00001b0 9090 9090 9090 9090 9090 9090 8090 0180
< 00001c0 0001 ffa5 ffff 003f 0000 6d71 7470 0000
< 00001d0 0000 0000 0000 0000 0000 0000 0000 0000
---
> 00001b0 9090 9090 9090 9090 9090 9090 8090 0000
> 00001c0 0000 0000 0000 0000 0000 0000 0000 0000

Nun vermute ich mal, daß sich da die Partitionstabellen befinden und daher die Unterschiede kommen ...
 
Interessanterweise gibt ein
Code:
===>> gpart bootcode -b /boot/mbr /dev/diskid/DISK-9WK5JYLR

das korrekte Ergebnis und die beiden Platten sind in dem Bereich gleich.

Ein Versuch mit einem identischen Befehl zfsboot auf s1 zu schreiben zerstört aber die Partitionstabelle für den Slice ... :o
 
Noch ein wenig später ...

zfsboot muß man scheinends auseinanderfriemeln und auf s1 und s1a verteilen ...
Code:
===>> dd if=/boot/zfsboot of=/dev/diskid/DISK-9WK5JYLRs1 count=1

===>> dd if=/boot/zfsboot of=/dev/diskid/DISK-9WK5JYLRs1a skip=1 seek=1024

... scheint die richtige Lösung zu sein.

Könnte mir irgendwer erklären, was da was genau macht?
Ich nehme mal an, daß MBR den Start an zfsboot auf s1 schickt und der dann den Rest auf s1a aufnimmt, aber warum das da getrennt werden muß und nicht einfach mit einem gpart darauf geworfen werden kann, erschließt sich mir nicht. :o
 
FreeBSDs Bootcode besteht grob aus 3 Schritten:
1. mbr, pmbr oder boot0 liegt in den ersten 512 Byte der Festplatte und wird vom BIOS gelesen.
2. Dieser gelesene Bootcode liest boot, zfsboot oder gptboot. Alle 3 zerfallen intern noch einmal in zwei Stufen. Einen einfachen "boot1", dessen Aufgabe es ist das System in einen für "boot2" nutzbaren Zustand zu bringen.
3. boot2 liest /boot/loader oder /boot/zfsloader vom Dateisystem und führt ihn aus.

Für GPT liegen diese Stufen:
1. Im Protective MBR, d.h. den ersten 512 Byte der Platte
2. In der freebsd-boot Partition
3. Im Dateisystem

Für MBR liegen sie in:
1. Im MBR, also den ersten 512 Byte der Platte
2. Im "Bootcode"-Feld des bsdlabel
3. Im Dateisystem

Dein - oder besser das allgemeine Problem - mit bsdlabel besteht darin, dass das "Bootcode"-Feld sehr klein ist. Ich glaube es waren 16 Kilobyte. Das war mehr als genug, als bsdlabel spezifiziert wurde. Und es ist heute auch locker genug für einfache Dateisysteme wie UFS. ZFS ist aber so kompliziert, dass man die zum Lesen von /boot/loader vom Dateisystem notwendige Logik unmöglich in diese 16 Kilobyte bekommen kann. Der dd-Befehl ist ein dreckiger Hack, um dies zu umgehen:
- Der erste Befehl schreibt den 512 Byte großen boot1 (Teil des /boot/zfsboot Images) in das "Bootcode"-Feld des bsdlabels
- Der zweite Befehl schreibt boot2 (ebenfalls Teil des Images) in einen freien Bereich des ZFS-Dateisystem hinter dessen Header. Der wurde von Sun für genau solche Hacks freigelassen

Die Boot-Kette ist dann also:
1. Das BIOS liest mbr aus den ersten 512 Byte der Platte
2. mbr liest boot1 aus dem bsdlabel
3. boot1 nimmt die "a" Partition, überspringt des ZFS-Header und liest boot2.
3. boot2 sucht und liest /boot/zfsloader vom ZFS
 
Danke!
Plant denn irgendwer das zumindest mal einfacher in der Gestaltung einzurichten oder wäre das auch mit einem gpart bootcode -b /boot/mbr -p /boot/zfsboot -i 1 adaX gegangen?
 
Zurück
Oben