Grub vor Freebsd Bootloader - etwas speziell...

MrWeb

Member
Hallo,
ich habe da ein etwas spezielles Anliegen, konnte es aber noch nicht zu 100% lösen.
Vielleicht hat ja von euch einer eine Idee dazu ....

Prinzipiell geht es um eine OPNsense Installation, die ja auf FreeBSD basiert.
Ich muss die Image Installation nehmen, da das technisch in meinem Fall
nicht anders zu lösen ist. Das ist quasi eine vorinstallierte Version (OPNsense Nano)
Das Image wird normal einfach auf die HDD mittels dd geschrieben und fertig.
(Da ist ein Bootloader drauf, der dann in das System bootet)
Ich habe aber spezielle (via NFS etc) Rescue und Backup boot's. die ich via Grub2 starte.
(Ich komme eigentlich von Debian Linux...)

Jetzt wollte ich einfach grub vor das image 'schalten'.
Ich habe einfach eine Debian Installation ausgeführt, mit /boot auf einer kleinen separaten Partition.
Dann auf die debian root Partition das OPNSense Nano image geschrieben.
Nun einen menuentry in der grub.cf passend zum OPNSense image.

Ich habe es soweit hinbekommen, dass es das freebsd bootet, ABER, es schmiert mir im
initrd ab (wenn das in freebsd auch so heißt)
Ich vermute, es kann das rootfs nicht finden/mounten.
Wobei ich das nicht nachvollziehen kann.
Ich bin leider freebsd Neuling.
In dem OPNsense freebsd Image sind wohl 4 Partitionen. Die ersten drei sind leer, in der vierten ist das freebsd.

Hier mal meine Partitionen
Die Disk ist nur 10GB groß und es ist eine VM.

sda 10GB
sda1 /boot 512MB
sda2 / rest

Auf sda2 ist das freebsd Image (OPNsense-24.7-nano-amd64.img, 3GB, kann dann später resized werden)

Mein grub Eintrag (in sda1/grub/grub.cfg)
menuentry "FreeBSD" {
insmod ufs2
insmod bsd
insmod part_msdos
set root=(hd0,msdos2)
kfreebsd /boot/loader
kfreebsd_loadenv /boot/device.hints
}

Wie geschrieben, das System bootet in den Grub und dann den Bootloader des FreeBSD...
Dann während des bootens des initramfs schmiert er ab.
Gibt es eine Möglichkeit im Grub das zu mountende rootfs mit zu geben und wie ist der Pfad dahin ?
Es liegt ja wohl irgendwie als 4. Partition in sda2 .... ???

Ich wäre für einen Tipp dankbar.
P.S.: Wenn ich das OPNsense Image direkt auf sda schreibe, dann bootet das System korrekt durch.
(Nur eben dann ohne den grub bootloader davor...)

Grüße,
MrWeb
 
Das Image wird normal einfach auf die HDD mittels dd geschrieben und fertig.
Wenn das ein Full-Disk-Image ist, dann musst Du es natürlich auch "full-disk" schreiben und nicht etwa in eine Partition.
Also so mit verschachtelter Partitionstabelle oder so was wird eher ähm .... schwierig.

Da müsste man dann eher den Weg gehen das Disk-Image auch auf Disk (nach /dev/sda) zu schreiben und dann mit einem Partitiontool (gparted?) sich die Partition zurechtorganisieren, damit man den anderen Kram (Debian?) auch drauf kriegt.


Wenn Du sowieso eine VM machst, warum trennst Du dann nicht gleich die Systeme? Oder ist die VM nur eine Spielwiese um rumzutesten und später ists für "direkt auf Hardware" geplant?
 
Das ist eine vm, aber ich kann an dieser nichts ändern. Muss ich so nehmen wie es ist.
Es gibt auch nicht wirklich was zu trennen. Ich muss nur auf der vm auch die anderen beiden live
systeme (via nfs Rescue und Backup) booten können.
Da grub ja freebsd booten kann, war das für mich er einfachste Ansatz...
Es funktioniert ja auch wie es soll, was grub und freebsd booten betrifft.

Ich vermute als Problem eher, dass freebsd sein rootfs nicht findet bzw mounten kann.
Vielleicht ändern sich device namen oder so. Es sind ja partitionstabellen auf sda und auf sda2 durch das image.
Wenn ich das OPNsense Nano Image richtig verstehe, ist darin das freebsd in der 4. Partition.
also quasi sda2p4 ...
Ich glaube, dass ich beim grub freebasd boot irgendwie mitgeben muss, wo/wie das rootfs zu mounten ist.

ich habe bei der Recherche auch sowas gefunden, wie:
set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ufs/OPNsense_nano
set kFreeBSD.vfs.root.mountfrom.options=rw

Der Pfad darin ist von mir, den sehe ich beim Bootprozess, dass er versucht das zu mounten.
Wenn das image direkt auf sda ist, funktioniert das auch. Aber durch das kaskadieren der
Partionen(tabellen) stimmt der Pfad vielleicht hier nicht mehr.
Aber ich weiß nicht, wie ich es anpassen müsste...

Noch jemand eine Idee ... ?

Grüße,
MrWen
 
Sorry, ich hab gerade nur deinen zweiten 'Block' gesehen und gelesen.

Ja genau, ich denke auch, dass das hier das schwierige bzw Problem ist.
Aber direkt auf sda schreiben hilft mir nicht, dann schmeiße ich grub weg und den
kann ich hinterher nicht so einfach wieder rein holen.
Es ist quasi wie ein Multiboot System. Nur, dass es eigentlich nur ein lokales System auf der Platte gibt.
Vielleicht muss ich versuchen, den freebsd Bootloader zu killen... bzw. die Partitionstabelle aus dem Image.
So dass ich diese 4,. Partition dann direkt auf sda2 schreiben kann.,,
Aber ich konnte die Partition aus dem image unter Linux noch nicht mounten bisher....
Ich hatte gehofft, dass ich via chainloader oder so etwas einfach auf sda2 verweisen kann.
Wie geschrieben, das funktioniert ja auch, das eigentliche Problem das zu booten funktioniert.
Es booten quasi beide bootloader nacheinander.... erst grub, dann der von freebsd.
Nur der rootfs mount klappt dort nicht.... Das kann eig. nur ein pfad Problem beim mounten sein.
Ich kenne freebsd aber viel zu wenig aktuell um die device name in so einem fall zu kennen...
da0a bspw... (das sehe ich, wenn ich das image direkt auf sda schreibe, da0 und da0a...)

Grüße
MrWeb
 
3GB, kann dann später resized werden
Die nano bläst sich beim ersten boot automatisch auf "was halt verfügbar ist", aber ich weiß jetzt nicht wie failsafe das ist oder ob überhaupt relevant hier.

Edit: die nano ist MBR-only, die anderen können auch UEFI. Vllt. Halbwissen, aber ich meine wenn du chainloading machen willst, sollte es gleich sein, gemischt dürfte nicht gehen.
 
Ja, das weiß ich. Das funktioniert eig. ganz gut.
Aber das ist hier nicht relevant, das System kann ja noch nicht in's rootfs booten...
Erst darin kommt das dann, während des boot Prozesses.
 
Aber direkt auf sda schreiben hilft mir nicht
Ich erkläre es Dir gerne noch mal:
Das Problem ist, das das Image bereits eine Partitionstabelle enthält. Das kannst Du nicht einfach in eine Partition schreiben.
Um mal einen Vergleich zu nehmen: Eine Disk ist ein Kasten Bier. Und eine einzelne Bierflasche ist eine Partition.
Was Du versuchst, ist einen Kasten Bier in einen anderen Kasten Bier rein zu tun. Und zwar an dem Platz, wo normalerweise eine Flasche steht. Und das geht dann nicht.

Es bleibt Dir nur die Variante die Partitionen zu re-organisieren. Sprich: Entweder die einzelnen Partitionen aus dem Image rauszufischen oder das Image als Disk auf Disk zu schreiben und mit gparted (oder was auch immer) die Partitionen herum zu schieben und die weiteren benötigten Partitionen anzulegen.

Solange die Partitionsstruktur nicht sauber ist, kannst Du in GRUB herumkonfigurieren wie Du willst. Das wird nix bringen.
 
Ich verstehe natürlich was du meinst und ich dachte auch nicht, dass es so bootbar ist. Aber es bootet ja...
Ich kann im Grub ja auf die Partition innerhalb der sda2 zugreifen. Somit muss auch das ja im freebsd gehen.
Nur weiß der freebsd bootloader davon nichts und ich müsste es ihm über Parameter vom Grub aus mit geben.
der das freebsd initramfs, das ja den mount des rootfs vornimmt findet das root Dateisystem nicht. Das ist ja auch
logisch, da es in einer partition in einer partition ist. Wenn man ihm das aber sagt, dann würde er das auch finden.
Also ich verstehe wie du das meinst, aber der Vergleich mit dem Bierkasten passt nicht ganz. Denn der Bierkasten passt
wirklich nicht in die Flasche, aber eine Partitionstabelle in eine Partition. Wenn natürlich auch absolut unüblich,
so ist das technisch möglich und funktioniert auch. Dass das System nacheinander beide Bootloader bootet zeigt das ja auch,
nur eben ist der Pfad bzw. die Pfade an denen freebsd das rootfs such nicht vorhanden (durch diese krumme partition in partition)
Ich muss es dem freebsd nun zum einen sagen (können), wobei diverse beispiele im Netz zeigen, dass das wohl möglich ist und
dann müsste ich die freebsd notation kennen, um den korrekten Pfad zum rootfs zusammensetzen zu können.
Gehen muss das...
Wenn ich im grub auf die msdos2, also die zweite Partitionstabelle verweise sehe ich direkt im root ls -l / das rootfs des freebsd ...
 
so ist das technisch möglich und funktioniert auch
Weiß nicht. Dann müsste ja auch GRUB verschachtelte Partitionen beherrschen. Sprich: Es müsste einge Möglichkeit geben, die entsprechende (Unter-)Partition auch zu selektieren. Und soweit ich weiß (kann mich irren; darfst mich gern überzeugen) kann man nur Disk und Partition selektieren. Man kann aber nicht sagen: Da ist ne Partition und übrigens da ist auch noch mal ne vollständige Partitionstabelle drin.

Und das GRUB beizubringen wäre ja auch nur der erste Schritt. Dem FreeBSD-Loader müsstest Du ja dann auch sagen: "Nimm nicht die ganze Disk; nimm die Partition als ganze Disk und such darin weitere Partitionen".

Und selbst wenn man das alles hingebogen kriegen sollte, dann ist es auch nicht einfacher als die Partitionen einfach zu reoganisieren. Nur das man bei der Reorganisationslösung auch ziemlich sicher sein kann, das es funktioniert.
 
Das kann grub aber, wenn ich auch nicht weiß wieso....

Im grub, bekomme ich für die sda angezeigt
(hd0), (hd0,msdos1), (hd0,msdos2)

Er siehst die ganze Disk hd0, dann eine 1. msdos Partition und auch die 2. msdos Partition (die auf sda2 liegt)
Wenn ich nun mit set root=(hd0,msdos2) selektiere, und dann
ls ausführe, sehe ich direkt das root Dateisystem des freebsd.
Also genau das rootfs, das ich im freebsd gemounted haben will....
Warum Grub das kann weiß ich nicht, ich hatte auch nicht damit gerechnet.
Aber grub sieht auch die zweite Partitionstabelle und auch die Partition darin.
Grub zeigt mir da zuzusagen sda2p4 ...
Bzgl. Komplexität, wenn ein einfacher Parameter im Grub dem nachfolgenden Loader übergeben kann, was er mounten soll,
dann wäre das doch absolut das Einfachste...
Das reorganisieren der Partitionen ist da weitaus komplexer...
Aber wenn ich so nicht weiter komme, dann würde ich wohl mal einen Versuch machen, die freebsd Partition aus dem Image
zu bekommen und diese direkt nach sda2 zu schreiben.

Vielleicht hat ja noch jemand eine Idee oder die Ahnung, bzgl. Übergabe des zu mountendem rootfs als Parameter im Grub
und wie dieser denn in der Konstellation lauten muss...
 
Ja, vlt. aber genau so ein gebastel würde ich gern vermeiden. Ich würde geren
das original verwenden, so wie es ist.
Dann wird es wohl einfacher sein, das vorhandene Image zu zerlegen.
Ich hatte da auch schon mal geschaut, aber irgendwie kam ich nicht
an die Partition darin von Linux aus. Muss ich mir dann nochmal anschauen.
 
ich halte dich von nichts ab ;)

dieses Vorgehen wäre in deinem Fall allerdings meiner Meinung nach die leichtere Lösung als an den Partitionen im Image zu arbeiten;

OPNsense nano nutzt wenn ich mich recht erinnere, 2 "Nutz"-Partitionen für die jeweilige Installation - eine "primäre" (*) welche bootet und eine "sekundäre" zum Update - ein Update wird immer auf die 2. Partition gespielt und diese bootet dann beim nächsten Neustart; im Erfolgsfall ist dies dann die neue "primäre" und die vorherige die neue "sekundäre";
so kann man bei einem schiefgegangenen Update wieder auf den letzten guten Stand zurück;

(primär und sekundär jetzt nicht in Bezug auf Partitionierung gemeint, sondern organisatorisch, vom OPNsense aus gesehen)
 
ls ausführe, sehe ich direkt das root Dateisystem des freebsd.
Keine Ahnung, was GRUB da macht. Möglicherweise "skipt" der auch einfach bis zum erkannten Anfang eines Dateisystems.

Grub zeigt mir da zuzusagen sda2p4 ...
Ja. Das Ding ist, eine solche Angabe müsstest Du ja direkt in GRUB machen können.

Aber wie schon gesagt: Selbst wenn Du GRUB dazu bringst (oder der das sogar von sich aus schon macht, weil er smart "skipt"), musst Du immer noch dem FreeBSD-Loader und Kernel vermitteln, das der da keine ganze Disk hat, sondern eine verschachtelte Partitionstabelle.

Ja, vlt. aber genau so ein gebastel würde ich gern vermeiden.
Ähm. Der Weg den Du im Kopf hast ist auch ein ziemliches Gebastel.
Ich find' den Vorschlag eigentlich ziemlich clever. Und vor allem auch (im Gegensatz zur Partition-Reorganisation) schnell umzusetzen.
 
@turricane verstehe, das mit den zwei Nutzpartitionen macht Sinn.
Hab ich auch schon so umgesetzt. Macht Update/Upgrades halt viel sicherer.
Ok, in dem Fall lass ich das Image besser in Ruhe.
@turricane und @mr44er
Hm, ok, wenn ich das via Grub Variablen/Anweisungen nicht hin bekomme,
schau ich mir die bootstrap Variante mal an.
Ich bin in FreeBSD/BSD absoluter Neuling. Ich arbeite seit den 90'iger mit
Linux, und seit bestimmt über 20 Jahren mit Debian....
Die OPNsense gefällt mir sehr gut, deshalb stelle ich all meine Firewalls darauf um,
aber dafür muss ich mich im OS nicht wirklich auskennen. Trotzdem will ich das natürlich,
aber halt erst, wenn ich Zeit dafür finde....

@Andy_m4
Ja, ich verstehe jetzt was du meinst. Selbst wenn er das rootfs gemountet bekommt und bootet,
denkt das os ja immer noch, es ist auf einer kompletten Disk, und nicht nur innerhalb einer Partition.

Ach schade, das wäre zu einfach gewesen....

Ok, dann mal sorry für das Wort 'gebastel'....
Dann läuft es wohl auf ein Versuch hinaus, FreeBSD in die sda2 Partition zu installieren und dann
OPNsens dazu zu debootstrappen....
Ich hab ja FreeBSD bzw. generell bsd noch nie installiert, das wird spannend.
Vlt. wird es Zeit, sich mal mehr mit bsd auseinanderzusetzen.

Ich danke euch auf jeden Fall schon mal, für den interessanten Austausch hier :-)
Ist echt klasse !
 
Zurück
Oben