[SOLVED] Grub2 Installation in CF Image Datei

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

[SOLVED] Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 16.01.2014 10:15:57

Hallo,

bin nun schon seit Tagen daran, mir das erste Mal ein Debian System (7.3) gescripted zusammenzustellen für ein Image, welches für einen Embeded PC mit CF-Karte gedacht ist. Jetzt häng ich am entscheidenen Moment, das Image (mit dd erstellt, 2 Partitionen) mit Grub2 bootable zu machen. Ich möchte das System nicht direkt auf die CF Karte installieren, sondern mir ein Image erstellen, dass ich für mehere PCs verwenden kann.

Auf meinem System ist das Image als loopdevice eingebunden und mountbar (/dev/loop0 --kxpart--> /dev/mapper/loop0p1 & /dev/mapper/loop0p2).
Die Installation von Grub mittels grub-install schlug bisher fehl, da es sich am device /dev/mapper/loop0p1 gestört hat. Gottseidank habe ich dann diese Seite gefunden (http://superuser.com/questions/130955/h ... n-img-file) auf der Grubs Probleme mit gemappten devices beschrieben sind. Der dort empfohlene Weg /dev/mapper/loop0p1 nochmals als /dev/loop1 einzubinden klappt bei mir dann auch. Grub wird in den MBR meines Images installiert. Allerdings kommt jetzt ein neues Problem hinzu:

update-grub erstellt mir eine grub.cfg mit folgenden Einträgen die leider wieder die loop devices enthalten. Wenn das Image auf der CF Karte im Embedded PC steckt, gibt es diese natürlich nicht mehr. Darum die Frage nach Tipps wie ich dieses umgehen kann. Unter /etc/grub.d/ gibt es verschiedene Template scripts die von update-grub verwendet werden. Ich möchte natürlich, dass im Betrieb nach einem kernel Update wieder die korrekten menuentries in der grub.cfg erscheinen. Wie kann ich also Einfluss auf die dort erstellen Einträge nehmen oder ist mein ganzer Ansatz schon falsch?
menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-486' --class debian --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod ext2
set root='(/dev/loop1)'
search --no-floppy --fs-uuid --set=root 400a2d3f-eed4-4386-bcad-54580ac3b616
loopback loop1 /mapper/loop0p1
set root=(loop1)

echo 'Loading Linux 3.2.0-4-486 ...'
linux /boot/vmlinuz-3.2.0-4-486 root=UUID=400a2d3f-eed4-4386-bcad-54580ac3b616 ro quiet
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.2.0-4-486
}
menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-486 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod ext2
set root='(/dev/loop1)'
search --no-floppy --fs-uuid --set=root 400a2d3f-eed4-4386-bcad-54580ac3b616
loopback loop1 /mapper/loop0p1
set root=(loop1)

echo 'Loading Linux 3.2.0-4-486 ...'
linux /boot/vmlinuz-3.2.0-4-486 root=UUID=400a2d3f-eed4-4386-bcad-54580ac3b616 ro single
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.2.0-4-486
}
Zuletzt geändert von DiscoBoy am 28.01.2014 22:39:52, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Grub2 Installation in CF Image Datei

Beitrag von smutbert » 16.01.2014 11:27:16

Ich bezweifle, dass das überhaupt ein Problem sein wird:
set root='(/dev/loop1)'
search --no-floppy --fs-uuid --set=root 400a2d3f-eed4-4386-bcad-54580ac3b616
Die erste Zeile ist klar, sie erklärt das später nicht mehr vorhandene loop-device zum root-Gerät/Verzeichnis, aber die darauffolgende Zeile setzt das root-Gerät/Verzeichnis noch einmal neu und zwar anhand der Dateisystem-UUID, die sich durch das übertragen des Images ja nicht ändern sollte.

Mit root-Gerät/Verzeichnis ist das Dateisystem gemeint, auf dem der /grub-Ordner mit der grub.cfg liegt. Das ganze soll den Start von grub wohl etwas fehlertoleranter machen, für den Fall, dass die UUID plötzlich (nach einem Restore aus einem Backup) nicht mehr stimmen sollte, schlägt zwar die zweite Zeile fehl, aber dank der ersten Zeile ist trotzdem das richtige root-Gerät/Verzeichnis gesetzt.
Das würde dann bei dir natürlich nicht mehr funktionieren.


Du verwendest grub-pc?
Willst du dann später Updates/Anpassungen ganz normal in das von der Karte laufende System einspielen oder nicht?

Benutzeravatar
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Grub2 Installation in CF Image Datei

Beitrag von smutbert » 16.01.2014 11:31:30

Noch eine andere Idee:
Wie wäre es mit einem Umweg über ein raw-Image in qemu(-kvm) oder einer anderen Virtualisierungssoftware, dann merkt grub gar nicht, dass es auf einem Image installiert wird…

DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

Re: Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 16.01.2014 11:33:11

Laut 3. und 4. Zeile wird dann aber dennoch wieder das loop device als root gesetzt, oder?
set root='(/dev/loop1)'
search --no-floppy --fs-uuid --set=root 400a2d3f-eed4-4386-bcad-54580ac3b616
loopback loop1 /mapper/loop0p1
set root=(loop1)
Ja, ich verwende grub-pc und möchte später ganz normal über apt-get upgrade Updates einspielen in das System, auch Kernel Updates...was ja dann triggert das update-grub wieder ausgeführt wird (Hier sagt mir grub-pc bei der INstallation "Removing update-grub hooks from /etc/kernel-img.conf in favour of /etc/kernel/ hooks."

DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

Re: Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 16.01.2014 11:39:07

smutbert hat geschrieben:Noch eine andere Idee:
Wie wäre es mit einem Umweg über ein raw-Image in qemu(-kvm) oder einer anderen Virtualisierungssoftware, dann merkt grub gar nicht, dass es auf einem Image installiert wird…
Das heisst dann ein Virtuelles System installieren mit einem normalen Debian Image? und dieses später auf CF Karte? Bisher bin ich mit meinem Ansatz sehr glücklich, vor allem mit debootstrap --variant=minbase um das System sehr schlank zu halten...

Benutzeravatar
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Grub2 Installation in CF Image Datei

Beitrag von smutbert » 16.01.2014 12:04:08

Ok, das mit dem Loopback Devices stimmt, ich glaube da durchschaue ich dein Setup und das Verhalten von grub-install nicht ganz…

Das mit der Virtualisierung stell' ich mir so vor:
Du legst dir eine virtuelle Maschine, zB mit Debianaqemu (das habe ich oft für ähnliche Dinge verwendet) an und erstellst dort ein (raw-)Festplattenimage in der Größe der CF-Karte und weiters irgendein virtuelles Medium, von dem du Starten kannst, zB eine iso-Datei mit einem Live-Linux/Debian/Ubuntu/grml/…

Und dann machst du vom Live-System genau das, was du jetzt auch gemacht hast, nur ohne Umweg über Loopback-Devices.
Das raw-Image kannst du hinterher von deinem normalen System aus einfach mit dd auf die CF-Karte schreiben.
DiscoBoy hat geschrieben:[…]
Ja, ich verwende grub-pc und möchte später ganz normal über apt-get upgrade Updates einspielen in das System, auch Kernel Updates...was ja dann triggert das update-grub wieder ausgeführt wird (Hier sagt mir grub-pc bei der INstallation "Removing update-grub hooks from /etc/kernel-img.conf in favour of /etc/kernel/ hooks."
Das habe ich gefragt, weil ich gedacht habe, du könntest ja auch, die grub-Konfigurationsdatei von Hand korrigieren oder schlimmstenfalls über die Grub-Kommandozeile starten und dann vom, von der CF-Karte laufenden, System die Konfigurationsdatei neu schreiben lassen.

So einfach ist das aber wahrscheinlich nicht, weil grub außer der Konfigurationsdatei auch noch eine "eingebettete" Konfiguration besitzt, die ihm zuerst einmal sagt, wo er überhaupt nach der grub.cfg suchen soll. Da stehen womöglich die selben 4 Zeilen drin wie in der grub.cfg und ich weiß nicht wie man das korrigieren könnte. Ich habe ein Zeiterl gebraucht bis ich grub da einigermaßen durchschaut habe [1] :oops: (und das ist noch dazu für grub-efi, wo man sich wenigstens die Datei, in der grub steht, ganz bequem anschauen kann)

D.h. du müsstest wahrscheinlich zuerst einmal vom grub-rescue-mode in die normale Kommandozeile kommen [2] und dann das System von der Grub-Kommandozeile starten [3], um dann vom laufenden System aus grub neu zu installieren und die Konfigurationsdatei ebenfalls neu schreiben zu lassen.
Den ersten Teil der Unannehmlichkeiten könntest du dir ersparen, wenn du von einem USB-Stick oder einer CD mit Grub das System startest


[1] http://forums.debian.net/viewtopic.php?f=10&t=89875
[2] http://www.it-muecke.de/grub-rescue
[3] http://answers.oreilly.com/topic/44-how ... and-shell/

DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

Re: Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 16.01.2014 12:14:34

Ich habe im Internet ein paar Anleitungen zu virtuellen images gesehen aber mit dem Hinweis dass ich das nicht verwenden soll, aufrund (...?).
Eigentlich wird es überall mit eingelegter CF-Karte beschrieben (z.B. hier wiki.ubuntuusers.de/Alix/CF-Bootmedium_erstellen). Da steht dann auch nur grub-install nach /dev/sdc anstatt /dev/sda damit man sich sein HOST System nicht zerschiesst und dann nachträglich in die device.map Datei wieder /dev/sda reinschreiben weil die CF Karte ja das einzige Drive im PC später sein wird. Nur blöd, dass update-grub über die loopdevices stolpert und irgendwie nichts brauchbares in die grub.cfg reinschreibt.

Mein neue Idee ist jetzt aber mir mein eigenes Grub Script zu schreiben in /etc/grub.d, welches mir dann an erster Stelle einen richtigen menuentry einfügt :-)

Hoffe das klappt so, sollte aber auch bei zukünftigen Kernel updates immer wieder eine richtige grub.cfg rausspucken!

Danke schon mal für deine Antworten!

Beispiel:
#!/bin/sh -e
echo "Adding my custom Linux to GRUB 2"
cat << EOF
menuentry "My custom Linux" {
set root=(hd0,5)
linux /boot/vmlinuz
initrd /boot/initrd.img
}
EOF

Benutzeravatar
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Grub2 Installation in CF Image Datei

Beitrag von smutbert » 16.01.2014 16:51:42

Wieso du grub nicht einfach nach der Debianinstallation und dem Kopieren auf die Speicherkarte direkt auf die Speicherkarte installieren willst, weiß ich eh nicht… :)
…aber dein Plan könnte auch wegen der eingebetteten Konfiguration, die ich erwähnt habe, schief gehen.

Nur so nebenbei: Was für einen Sinn die device.map noch haben soll, weiß ich nicht. Oft genug ist es bei mehreren Platten und Controllern im System Zufall, welche Platte sda, sdb,… wird und dann stimmt der Inhalt der Datei die halbe Zeit sowieso nicht.

DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

Re: Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 16.01.2014 17:04:15

Weil ich momentan mein Image schon in einem virtuellen Debian unter Windows :-( erstelle. Ausserdem möchte ich das Image dann auf mehrere Rechner deployen und mit einem POST-Installation script den Rest auf den einzelnen PCs konfigurieren. Das Image möchte ich auch als Datei archivieren, etc. Es spricht also vieles für den gewählten Ansatz.

Über den Sinn der device.map frage ich mich ganz ehrlich auch, aber es gibt in den EndPCs nur eine CF Karte und da ist /dev/sda schon sicher.

Übringes: Mit einem manipulierten menuentry bootet das Image auch schon von einer CF-Karte aus. Grub Installation ist damit als nicht das Problem, sondern nur die grub.cfg und update-grub. Bin noch am durchwursteln wie man ein dynamisches Grub script baut.

Benutzeravatar
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Grub2 Installation in CF Image Datei

Beitrag von smutbert » 16.01.2014 17:21:30

Ok, in der Zwischenzeit habe ich eine kurze Anleitung gebastelt, wie man eine statische Grubkonfiguration verwenden könnte, zT ist das jetzt zwar hinfällig, aber vielleicht ist doch noch ein Teil hilfreich:
Wenn du aber eine statische Grubkonfiguration willst, die nicht automatisch aktualisiert werden soll und du dich außerdem doch mit dem Gedanken anfreunden kannst grub zum Schluß direkt auf die Karte zu installieren, habe ich noch eine Variante für dich:
  • Du erstellst auf deinem Image eine eigene kleine ext2/3/4 (oder fat) Partition (irgendein simples Dateisystem — 10MB sollten schon genügen) alleine für grub und den Rest partitionierst du so wie du willst bzw. es gewohnt bist. Wobei du für /boot eigentlich keine eigene Partition mehr brauchst.
  • Du installierst dein System auf das Image. Die grub-Pakete brauchst du dabei gar nicht zu installieren bzw. wenn sie (wegen der recommends) installiert werden, kannst du sie gleich wieder deinstallieren.
    Stattdessen schlagen ich vor später die grub-Dateien von deinem laufenden System zu verwenden. (Voraussetzung dafür ist, dass es ebenfalls grub-pc verwendet.)
  • Du erstellst auf dem Image eine /etc/kernel-img.conf mit dem Inhalt (oder editierst eine bereits vorhandene kernel-img.conf)

    Code: Alles auswählen

    do_symlinks = yes
    relative_links = yes
    link_in_boot = yes
    
    Das sorgt dafür, dass in /boot die symbolischen Links vmlinuz und initrd.img erstellt werden, die auf den aktuellen Kernel und die aktuelle initrd zeigen und nach einem Kernelupdate zusätzlich noch vmlinuz.old und initrd.img.old, die auf den vorigen Kernel und die vorige initrd verweisen. Nachdem die Datei erst nachträglich erstellt worden ist, sind die Links zu dem Zeitpunkt noch nicht vorhanden, also entweder legst du sie manuell an oder installierst den Kernel (apt-get --reinstall install linux-image-…) neu, damit sie automatisch angelegt werden und das Ergebnis zB so aussieht:

    Code: Alles auswählen

    $ ls -al /boot/
    total 37760
    drwxr-xr-x 1 root root      454 Jan 12 13:27 .
    drwxr-xr-x 1 root root      132 Jan  7 12:05 ..
    -rw-r--r-- 1 root root   149026 Dec 29 21:31 config-3.12-1-amd64
    lrwxrwxrwx 1 root root       23 Dec 22 15:20 initrd.img -> initrd.img-3.12-1-amd64
    -rw-r--r-- 1 root root 13890272 Dec 30 14:41 initrd.img-3.12-1-amd64
    -rw-r--r-- 1 root root  2319932 Dec 29 21:31 System.map-3.12-1-amd64
    lrwxrwxrwx 1 root root       20 Dec 22 15:20 vmlinuz -> vmlinuz-3.12-1-amd64
    -rw-r--r-- 1 root root  2843920 Dec 29 21:21 vmlinuz-3.12-1-amd64
    
  • Auf der grub-Partition legst du ein Verzeichnis namens grub an und schreibst dort eine möglichst übersichtliche grub.cfg hinein, etwa

    Code: Alles auswählen

    insmod part_msdos
    insmod ext2
    insmod png
    insmod gzio
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
    loadfont /grub/unicode.pf2
    set locale_dir=/grub/locale
    set lang=en_US
    insmod gettext
    terminal_output gfxterm
    
    #background_image /grub/grub.png
    set color_normal=white/black
    set color_highlight=black/white
    
    set timeout=2
    
    set root='(hd0,msdos1)'
    search --no-floppy --label --set=root —DEBIAN-LABEL—
    search --no-floppy --fs-uuid --set=root —DEBIAN-UUID—
    
    menuentry 'Debian GNU/Linux' {
            linux   /boot/vmlinuz root=UUID=—DEBIAN-UUID— ro quiet
            initrd  /boot/initrd.img
    }
    
    menuentry 'Debian GNU/Linux (old kernel)' {
            linux   /boot/vmlinuz.old root=UUID=—DEBIAN-UUID— ro quiet
            initrd  /boot/initrd.img.old
    }
    
    Auch die Grubmodule (*.mod) und die Schrift unicode.pf2 musst du in dieses Verzeichnis kopieren (also ziemlich alle Dateien aus /usr/share/grub und /usr/lib/grub/???/). Am einfachsten ist es einfach den komplette Inhalt des Verzeichnisses /boot/grub aus dem laufenden System hinüberzukopieren.

    Außer natürlich grub.cfg, die wir schon haben und device.map, die sowieso nicht stimmen würde.

    —DEBIAN-UUID— und —DEBIAN-LABEL— stehen für die Dateisystemlabels bzw. UUIDs der Debian-/-Partition. In dem Beispiel habe ich (Gerät,Partition), UUID und LABEL sogar dreifach gemoppelt.

    Aber du solltest die Konfiguration überhaupt noch einmal überprüfen (und vielleicht auch mit der grub.cfg aus dem laufenden System vergleichen), weil es zwar im Wesentlichen eine Kopie meiner eigenen Konfiguration ist, aber ich auch einiges anpassen musste, ua weil ich grub-efi verwende.
  • Schließlich schreibst du nur noch das Image auf die Karte und installierst noch grub in den MBR der Speicherkarte, wobei du außer dem Zielgerät auch noch die gemountete Grub-Partition auf der Karte angeben musst:

    Code: Alles auswählen

    grub-install --boot-directory=/mnt/cfcard /dev/sdx
Das sollte es gewesen sein. So ähnlich habe ich es schon oft gemacht, weil mich das ständige Updaten der grub.cfg genervt hat und weil man es so einrichten kann, dass grub unabhängig von der UUID des /-Dateisystems funktioniert (ich verwende dazu lieber die Dateisystemlabels).

DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

Re: Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 16.01.2014 18:23:46

Danke für die Anleitung! Eine Sache die mir glaub mir weiterhilft ist das search in der grub.cfg nach dem partition label. ICh verwende nämlich auch lieber label und lege mir ein "09_custom_boot" in /etc.grub.d ab, welches mir dann immer vor den anderen Einträgen einen weiteren menuentry anlegt.

DiscoBoy
Beiträge: 162
Registriert: 19.11.2004 18:17:34

Re: Grub2 Installation in CF Image Datei

Beitrag von DiscoBoy » 28.01.2014 22:39:36

Nur zur Info:
Mit
menuentry "Debian GNU/Linux" {
set root="(hd0,1)"
search --no-floppy --label rootfs --set=root
echo "Loading Linux ..."
linux /vmlinuz root=LABEL=rootfs ro console=ttyS0,38400n8 reboot=bios elevator=noop ide_core.ignore_cable=0
echo "Loading initial ramdisk ..."
initrd /initrd.img
funktioniert es!

Antworten