Wie Befehle ins initramfs einfügen?

Welches Modul/Treiber für welche Hardware, Kernel compilieren...
Antworten
Rechenknecht
Beiträge: 3
Registriert: 12.05.2009 13:14:36

Wie Befehle ins initramfs einfügen?

Beitrag von Rechenknecht » 12.05.2009 14:39:22

Hallo,
ich habe es nun endlich geschafft, dass fbsplash unter Debian Lenny läuft. Das Hintergrundbild im Verbose-Mode wird korrekt angezeigt aber ich bekomme während des Bootvorgangs ständig folgende Meldungen:

Code: Alles auswählen

/etc/init.d/splashutils: line 175: tail: command not found
/sbin/splash-functions.sh: line 276: pgrep: command not found
Ich habe versucht die Kommandos in die initramfs-Datei mit einem Hook-Script zu integrieren. Wenn ich die initramfs-Datei mit update-initramfs neu erzeuge und mir dann den Inhalt anzeigen lasse, befinden sich die Dateien im Ordner /usr/bin/ aber die Fehlermeldungen kommen nach einem Neustart immer noch.

Ich habe eine eigenständige boot-Partition (/dev/sda1), sodass fbsplash nicht auf die Befehle in /usr/bin/ auf der root-Partition (/dev/sda3) zugreifen kann, da diese Partition ja noch nicht gemountet ist. Deswegen der Versuch mit der initramfs-Datei.

Kann mir einer von euch sagen, ob der Weg über die initramfs richtig ist und wenn ja, was ich falsch mache?

Ich verwende die Kernel-Sourcen aus dem Debianpaket linux-source-2.6.26 und den Patch fbcondecor-2.6.26-lenny, gefunden bei www.kaddersche.de. Der Kernel wurde auf dem Debian-Way mit make-kpkg kompiliert.
Das Splashutils-Paket hab ich in der Version 1.5.4.2-1 von ftp.berlios.de installiert.

Und zur Kontrolle, dass ich auch mit dem richtigen initramfs boote, hier noch mein Eintrag in der menu.lst:

Code: Alles auswählen

title           Debian GNU/Linux, kernel 2.6.26-splash
root            (hd0,0)
kernel          /vmlinuz-2.6.26-splash root=/dev/sda3 rw vga=794 splash=verbose,theme:SG-Daedalus-1.0bs
initrd          /initrd.img-2.6.26-splash
Und hier noch das Hook-Script /etc/initramfs-tools/hooks/binaries_for_fbsplash zum einfügen der beiden Befehle in die initramfs-Datei:

Code: Alles auswählen

#!/bin/sh
# Hook-Script zum Laden der von Fbsplash benötigten Programme

PREREQ="lvm"
prereqs()
{
        echo "$PREREQ"
}

case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac

. /usr/share/initramfs-tools/hook-functions
# Begin real processing below this line

if [ -x "/usr/bin/pgrep" ]; then
        copy_exec /usr/bin/pgrep
fi

if [ -x "/usr/bin/tail" ]; then
        copy_exec /usr/bin/tail
fi

exit 0
Vielen Dank schon mal
Michael

Rechenknecht
Beiträge: 3
Registriert: 12.05.2009 13:14:36

Re: Wie Befehle ins initramfs einfügen?

Beitrag von Rechenknecht » 15.05.2009 10:41:45

Kann mir keiner von euch helfen?
Ich habe mir jetzt beim Booten mal die PATH-Variable anzeigen lassen. Da steht das Verzeichnis /usr/bin mit drin. Aber egal welchen Befehl ich über das Hook-Script hinzufüge, es erscheint immer "command not found" beim Booten bis die root-Partiton eingebunden wurde.

Ich habe die Befehle auch schon in das Verzeichnis /bin kopiert. Das selbe Problem. Das Hook-Script lädt auch von den Befehlen benötigte Abhängigkeiten/Libs ins initrd-image.

Jetzt bleibt eigentlich nur noch das Image mounten und die Befehle manuell kopieren. Aber laut Debiananleitung sollte die Sache über das Hook-Script funktionieren.

rhHeini
Beiträge: 2740
Registriert: 20.04.2006 20:44:10

Re: Wie Befehle ins initramfs einfügen?

Beitrag von rhHeini » 02.06.2009 20:27:37

Wenn ich mich nicht ganz irre müssen alle Daten die initramfs braucht in /boot zu finden sein. Alles andere ist solange nicht zugreifbar bis die Partition gemountet ist.

Mfg rh

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie Befehle ins initramfs einfügen?

Beitrag von habakug » 02.06.2009 21:26:03

Hallo!

Du solltest dem copy_exec noch sagen wohin kopiert werden soll, z.B.:

Code: Alles auswählen

if [ -x "/usr/bin/pgrep" ]; then
        copy_exec /usr/bin/pgrep /usr/bin
fi
Gruß, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Benutzeravatar
TBT
Beiträge: 923
Registriert: 18.06.2003 08:39:36
Kontaktdaten:

Re: Wie Befehle ins initramfs einfügen?

Beitrag von TBT » 02.06.2009 23:02:34

http://www.php2all.de/tutorialpage-46-a ... eugen.html

obiges ist für diskless Clients,
auf dein Problem bezogen müssten deine Hooks/Skripte also nach

/etc/initramfs-tools/[hooks|scripts]/

kopiert werden, und dann ein update-initramfs ;)

Rechenknecht
Beiträge: 3
Registriert: 12.05.2009 13:14:36

Re: Wie Befehle ins initramfs einfügen?

Beitrag von Rechenknecht » 05.06.2009 18:27:37

Erstmal danke für die Antworten, aber das hat leider noch nicht zur Lösung geführt.

@rhHeini:
So ganz sehe ich beim Thema initramfs noch nicht durch, aber ich dachte so ein initrd-Image stellt alle für den Bootvorgang benötigten Dateien zur Verfügung, so dass diese Dateien vor dem Mounten der root-Partition verwendet werden können.
Das initrd-Image wird doch vor dem Booten als eine Art Partition gemountet so dass der Kernel auf die Module und Befehle in dieser "init"-Partition zugreifen kann. Also sollte das fbsplash-Script während des Bootvorgangs die Befehle pgrep und tail, die ich in das initrd-Image integriert habe, doch auf dieser "init"-Partition finden. Oder liege ich da jetzt komplett falsch? :oops:

@habakug:
Habe in /usr/share/initramfs-tools/hook-functions gelesen dass copy_exec als Zielverzeichnis das Verzeichnis der Quelldatei verwendet, wenn kein Ziel angegeben wurde. Als ich mir den Inhalt des initrd-Images angeschaut hatte, waren die Dateien auch in dem korrekten Verzeichnis vorhanden. Habe jetzt nochmal das Ziel für den Kopiervorgang in das Hook-Script eingetragen. Leider hat das nichts geändert.

Auszug aus /etc/initramfs-tools/hooks/binaries_for_fbsplash

Code: Alles auswählen

if [ -x "/usr/bin/pgrep" ]; then
        copy_exec /usr/bin/pgrep /bin/pgrep
fi

if [ -x "/usr/bin/tail" ]; then
        copy_exec /usr/bin/tail /bin/tail
fi
@TBT:
Dein Link zeigt wie man ein Modul zum initrd-Image hinzufügt. Leider kenne ich mich mit Modulen überhaupt nicht aus. Ich weiß nicht welches Modul ich zum Testen mal laden könnte und wie ich dann während des Bootvorgangs den Zugriff auf dieses Modul testen kann.
Ein Script in /etc/initramfs-tools/hooks habe ich schon angelegt. Es heißt "binaries_for_fbsplash". Den Inhalt habe ich schon zu Beginn des Themas gepostet. Ein update-initramfs hab ich natürlich auch ausgeführt. Das Script läuft auch sauber durch und kopiert die Dateien pgrep und tail in das initrd-Image. Hab mir den Inhalt des Images anzeigen lassen und die beiden Befehle waren in dem angegebenen Ordner zu finden.

Hier mal die Ausgabe von update-initramfs:

Code: Alles auswählen

rechenknecht:/boot# update-initramfs -k 2.6.26-splash -c -v
update-initramfs: Generating /boot/initrd.img-2.6.26-splash
...
Calling hook binaries_for_fbsplash
Adding binary /usr/bin/pgrep
Adding library /lib/libproc-3.2.7.so
Adding binary /usr/bin/tail
Building cpio /boot/initrd.img-2.6.26-splash.new initramfs
Und hier der relevante Inhalt von /boot/initrd.img-2.6.26-splash

Code: Alles auswählen

rechenknecht:/tmp/initrd# zcat /boot/initrd.img-2.6.26-splash | cpio -i
rechenknecht:/tmp/initrd# ls -l bin
insgesamt 1108
-rwxr-xr-x 1 root root 376108  5. Jun 15:37 busybox
-rwxr-xr-x 1 root root   2252  5. Jun 15:37 cat
-rwxr-xr-x 1 root root    608  5. Jun 15:37 chroot
-rwxr-xr-x 1 root root   4812  5. Jun 15:37 cpio
-rwxr-xr-x 1 root root   3292  5. Jun 15:37 dd
-rwxr-xr-x 1 root root    740  5. Jun 15:37 dmesg
-rwxr-xr-x 1 root root    432  5. Jun 15:37 false
-rwxr-xr-x 1 root root   3244  5. Jun 15:37 fstype
-rwxr-xr-x 1 root root  26548  5. Jun 15:37 gunzip
-rwxr-xr-x 1 root root    828  5. Jun 15:37 halt
-rwxr-xr-x 1 root root   1296  5. Jun 15:37 insmod
-rwxr-xr-x 1 root root  10460  5. Jun 15:37 ipconfig
-rwxr-xr-x 1 root root   6672  5. Jun 15:37 kbd_mode
-rwxr-xr-x 1 root root    700  5. Jun 15:37 kill
-rwxr-xr-x 1 root root   1008  5. Jun 15:37 ln
-rwxr-xr-x 1 root root  35048  5. Jun 15:37 loadkeys
-rwxr-xr-x 1 root root   4404  5. Jun 15:37 minips
-rwxr-xr-x 1 root root   1676  5. Jun 15:37 mkdir
-rwxr-xr-x 1 root root   1396  5. Jun 15:37 mkfifo
-rwxr-xr-x 1 root root   1532  5. Jun 15:37 mknod
-rwxr-xr-x 1 root root   1696  5. Jun 15:37 mount
-rwxr-xr-x 1 root root   6560  5. Jun 15:37 nfsmount
-rwxr-xr-x 1 root root    888  5. Jun 15:37 nuke
-rwxr-xr-x 1 root root  12968  5. Jun 15:37 pgrep
-rwxr-xr-x 1 root root    584  5. Jun 15:37 pivot_root
-rwxr-xr-x 1 root root    828  5. Jun 15:37 poweroff
-rwxr-xr-x 1 root root    680  5. Jun 15:37 readlink
-rwxr-xr-x 1 root root    828  5. Jun 15:37 reboot
-rwxr-xr-x 1 root root   3116  5. Jun 15:37 resume
-rwxr-xr-x 1 root root   1868  5. Jun 15:37 run-init
-rwxr-xr-x 1 root root 376108  5. Jun 15:37 sh
-rwxr-xr-x 1 root root  53828  5. Jun 15:37 sh.shared
-rwxr-xr-x 1 root root    588  5. Jun 15:37 sleep
-rwxr-xr-x 1 root root    440  5. Jun 15:37 sync
-rwxr-xr-x 1 root root  45060  5. Jun 15:37 tail
-rwxr-xr-x 1 root root    428  5. Jun 15:37 true
-rwxr-xr-x 1 root root    800  5. Jun 15:37 umount
-rwxr-xr-x 1 root root   1552  5. Jun 15:37 uname
-rwxr-xr-x 1 root root  26548  5. Jun 15:37 zcat
Ich wollte mal wissen welche Dateien während des Bootens vorhanden sind, also habe ich den Befehl ls -l /bin/p* in das Script /etc/init.d/splashutils eingefügt. Im boot-Log stand nach dem Neustart dann folgendes:

Code: Alles auswählen

Fri Jun  5 15:34:44 2009: lrwxrwxrwx 1 root root    16 Dec 11 15:59 /bin/pidof -> ../sbin/killall5
Fri Jun  5 15:34:44 2009: -rwsr-xr-x 1 root root 30788 Dec 10  2007 /bin/ping
Fri Jun  5 15:34:44 2009: -rwsr-xr-x 1 root root 26616 Dec 10  2007 /bin/ping6
Fri Jun  5 15:34:44 2009: -rwxr-xr-x 1 root root 75724 Jan 11 22:49 /bin/ps
Fri Jun  5 15:34:44 2009: -rwxr-xr-x 1 root root 26800 Apr  4  2008 /bin/pwd
Es sind also während des Bootens (vor und nach dem Mounten der Platten) ganz andere Befehle in /bin vorhanden als im initrd-Image.
Muss ich noch irgendetwas machen, damit die Befehle aus dem initrd-Image während des Bootens verfügbar sind? Vielleicht ein boot-Script in /etc/initramfs-tools/scripts/?

Eins ist auch noch komisch. Die /boot-Partition ist auf /dev/sda1, es wird aber erst /dev/sda3 (root-Partition) gemountet und später im Bootvorgang werden dann die anderen Platten (darunter auch /dev/sda1) gemountet. Liegt wohl am Eintrag in /boot/grub/menu.lst. Hoffe mal das ist so korrekt. :?

Auszug aus dem boot-Log mit den Befehlen df -h und mount im Script /etc/init.d/splashutils:

Code: Alles auswählen

Fri Jun  5 13:55:39 2009: ********df -h*************
Fri Jun  5 13:55:39 2009: Filesystem            Size  Used Avail Use% Mounted on
Fri Jun  5 13:55:39 2009: /dev/sda3              28G  399M   26G   2% /
Fri Jun  5 13:55:39 2009: tmpfs                1014M     0 1014M   0% /lib/init/rw
Fri Jun  5 13:55:39 2009: udev                   10M  100K   10M   1% /dev
Fri Jun  5 13:55:39 2009: tmpfs                1014M     0 1014M   0% /dev/shm
Fri Jun  5 13:55:39 2009: ********mount*************
Fri Jun  5 13:55:39 2009: /dev/sda3 on / type ext3 (rw,errors=remount-ro)
Fri Jun  5 13:55:39 2009: tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
Fri Jun  5 13:55:39 2009: proc on /proc type proc (rw,noexec,nosuid,nodev)
Fri Jun  5 13:55:39 2009: sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
Fri Jun  5 13:55:39 2009: procbususb on /proc/bus/usb type usbfs (rw)
Fri Jun  5 13:55:39 2009: udev on /dev type tmpfs (rw,mode=0755)
Fri Jun  5 13:55:39 2009: tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
Fri Jun  5 13:55:39 2009: devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
Fri Jun  5 13:55:39 2009: *********************
Fri Jun  5 13:55:39 2009: Mounting local filesystems...done.
Fri Jun  5 13:55:39 2009: Activating swapfile swap...done.
Fri Jun  5 13:55:39 2009: ********df -h*************
Fri Jun  5 13:55:39 2009: Filesystem            Size  Used Avail Use% Mounted on
Fri Jun  5 13:55:39 2009: /dev/sda3              28G  399M   26G   2% /
Fri Jun  5 13:55:39 2009: tmpfs                1014M     0 1014M   0% /lib/init/rw
Fri Jun  5 13:55:39 2009: udev                   10M  100K   10M   1% /dev
Fri Jun  5 13:55:39 2009: tmpfs                1014M     0 1014M   0% /dev/shm
Fri Jun  5 13:55:39 2009: /dev/sda1             274M   79M  181M  31% /boot
Fri Jun  5 13:55:39 2009: /dev/sda8             184G   99G   76G  57% /home
Fri Jun  5 13:55:39 2009: /dev/sda7             1.9G   35M  1.8G   2% /tmp
Fri Jun  5 13:55:39 2009: /dev/sda5              46G  3.6G   40G   9% /usr
Fri Jun  5 13:55:39 2009: /dev/sda6              33G   26G  5.0G  84% /var
Fri Jun  5 13:55:39 2009: ********mount*************
Fri Jun  5 13:55:39 2009: /dev/sda3 on / type ext3 (rw,errors=remount-ro)
Fri Jun  5 13:55:39 2009: tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
Fri Jun  5 13:55:39 2009: proc on /proc type proc (rw,noexec,nosuid,nodev)
Fri Jun  5 13:55:39 2009: sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
Fri Jun  5 13:55:39 2009: procbususb on /proc/bus/usb type usbfs (rw)
Fri Jun  5 13:55:39 2009: udev on /dev type tmpfs (rw,mode=0755)
Fri Jun  5 13:55:39 2009: tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
Fri Jun  5 13:55:39 2009: devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
Fri Jun  5 13:55:39 2009: /dev/sda1 on /boot type ext3 (rw)
Fri Jun  5 13:55:39 2009: /dev/sda8 on /home type ext3 (rw)
Fri Jun  5 13:55:39 2009: /dev/sda7 on /tmp type ext3 (rw)
Fri Jun  5 13:55:39 2009: /dev/sda5 on /usr type ext3 (rw)
Fri Jun  5 13:55:39 2009: /dev/sda6 on /var type ext3 (rw)
Fri Jun  5 13:55:39 2009: *********************
Ich hoffe ihr habt noch paar Tricks parat. :)

Freundliche Grüße
Michael

Benutzeravatar
Wobbex
Beiträge: 55
Registriert: 07.11.2005 19:26:16

Re: Wie Befehle ins initramfs einfügen?

Beitrag von Wobbex » 09.06.2009 15:02:06

Rechenknecht hat geschrieben:Ich wollte mal wissen welche Dateien während des Bootens vorhanden sind, also habe ich den Befehl ls -l /bin/p* in das Script /etc/init.d/splashutils eingefügt.
Zu dem Zeitpunkt ist doch die Bootpartition bereits gemountet: Du siehst also dessen Dateien.
Rechenknecht hat geschrieben:Eins ist auch noch komisch. Die /boot-Partition ist auf /dev/sda1, es wird aber erst /dev/sda3 (root-Partition) gemountet und später im Bootvorgang werden dann die anderen Platten (darunter auch /dev/sda1) gemountet. Liegt wohl am Eintrag in /boot/grub/menu.lst. Hoffe mal das ist so korrekt. :?
Die "initrd.img" liegt auf der Rootpartition also muß diese zuerst gemountet werden. Woher das Bios den Bootsektor (GRUB) liest spielt hier AFAIK keine Rolle.
Rechenknecht hat geschrieben:Ich hoffe ihr habt noch paar Tricks parat. :)
Warum entpackst, editierst, packst du die initrd.img nicht manuell?
siehe zB. http://forum.ubuntuusers.de/topic/initr ... einhaengen
No Vista, I'm not an ox!

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Wie Befehle ins initramfs einfügen?

Beitrag von Spasswolf » 09.06.2009 16:18:03

Wobbex hat geschrieben: Die "initrd.img" liegt auf der Rootpartition also muß diese zuerst gemountet werden.
Wie kommst du denn darauf?

Benutzeravatar
KBDCALLS
Moderator
Beiträge: 22451
Registriert: 24.12.2003 21:26:55
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Re: Wie Befehle ins initramfs einfügen?

Beitrag von KBDCALLS » 09.06.2009 18:49:35

Sind die Dateien wirklich in der Intramfs gelandet ?

Man legt einen symbolischen Link auf die Ramdisk an , dann läßt sie sich mit dem MC von innen ansehen.


Der Link muß die Endung .cpio gaben
Was haben Windows und ein Uboot gemeinsam?
Kaum macht man ein Fenster auf, gehen die Probleme los.

EDV ist die Abkürzung für: Ende der Vernunft

Bevor du einen Beitrag postest:
  • Kennst du unsere Verhaltensregeln
  • Lange Codezeilen/Logs gehören nach NoPaste, in Deinen Beitrag dann der passende Link dazu.

Benutzeravatar
Wobbex
Beiträge: 55
Registriert: 07.11.2005 19:26:16

Re: Wie Befehle ins initramfs einfügen?

Beitrag von Wobbex » 09.06.2009 19:15:20

Wobbex hat geschrieben: Die "initrd.img" liegt auf der Rootpartition also muß diese zuerst gemountet werden.
Das war zu schnell geschossen. Natürlich kann die initrd.img genauso wie die vmlinuz auch auf der Bootpartition oder wo anders sein. Nur gilt die Partition woher Grub (oder ein anderer Bootloader) diese Dateien liest dann hernach nicht als gemountete Partition.
No Vista, I'm not an ox!

Antworten