initramfs fürs OE 2.0

  • Hi !


    Wie versprochen ist dieser Tread jetzt dafür da, um im ersten Schritt mal den Jumpin'Jack Flash initramfs Patch auch ins OE 2.0 einbinden zu können.


    Wir können hier aber auch im Anschluss über die ganzen zusätzlichen Funktionen die sich dadurch ergeben diskutieren und wenn Ihr motiviert seit, dann könnt Ihr natürlich auch eigene initramfs Patches entwickeln oder Euch auch an externen initramfs.cpio.gz versuchen (weil Jumpin' Jack Flash unterstützt auch das Chainen von initramfs mit dem initrd=/initramfs.cpio.gz Kernel Parameter)


    Die erste Frage ist soll ich Euch zuerst zum Lernen wie es geht ein initramfs ins OE einzubinden die manuelle Anleitung posten oder wollt Ihr es gleich mit dem Patch probieren ?


    >>>> Diese Frage ist schon entschieden, weiter unten im Thread findet Ihr beides als Anhang.


    Ich poste Euch halt mal als erste reply zu diesem Thread das derzeitige README.TXT wie man wenn man das kinit als binary hat dieses im OE 2.0 so einbindet das dieses auch in ein initramfs cpio file kommt und zum Kernel dazu gelinked wird. Inputs und Verbesserungsvorschläge sind natürlich willkommen !


    Die zweite Frage (die auch an DMM geht) wäre ob man nicht wenigstens das chainen in ein initramfs.cpio.gz das ausserhalb des Kernel liegt fix in den OE 2.0 Kernel einbauen sollte.


    Weil die normalen initramfs sind meistens shellscript basierend und damit ziemlich fett und daher auf einer Dreambox im Kernel selbst nicht wirklich sinnvoll.


    Ich habe mir ja die Arbeit gemacht alles in ein einziges statisch gegen die klibc gelinktes kinit binary zu machen und damit das ganze trotz einer Menge an Funktionen in ein binary mit nur 64k quetschen zu können.


    Aber das wird wohl eher die Ausnahme sein das jemand so pervers ist :smiling_face:


    LG
    gutemine

    5 Mal editiert, zuletzt von Lost in Translation ()

  • +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    How to enable gutemine's Jumpin'Jack Flash initramfs Kernel in your image
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    First you need the initramfs*.tar.gz File which contains this README.TXT


    Second you need an up-to-date OE 2.0 environment of the experimental branch for you Dreambox,
    and an image for the wanted Dreambox has to be allready built so that all needed
    packages are already present and working.


    Unpack the initramfs*.tar.gz with tar -xvzf initramfs.*.tar.gz to get this README.TXT
    and the initramfs init binary.


    First you have to check the kernel config by looking
    into the defconfig file of the kernel:


    Got to this directory and adapt the defconfig file (replace dmXXXX with your boxtype and instead of
    opendreambox use the full path to you OE 2.0 opendreambox directory)


    cd opendreambox/meta-bsp/dmXXXX/recipes/linux/linux-dreambox-3.2


    In your defconfig there should be already this:


    CONFIG_BLK_DEV_LOOP=y


    change from =2 to =8 the following line below:


    CONFIG_BLK_DEV_LOOP_MIN_COUNT=8


    finally this should be be added:


    CONFIG_BLK_DEV_INITRD=y
    CONFIG_INITRAMFS_SOURCE=""


    This are all the needed changes for your kernel config !!!


    Next you have to adapt all the gen_initramfs_list.sh


    Go to the following directory:


    cd opendreambox/tmp/work/dmXXXX-oe-linux


    Then use the below find command to get a list off all 3 locations of this script:


    find . -name gen_initramfs_list.sh
    ./linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/sysroot-destdir/kernel/scripts/gen_initramfs_list.sh
    ./linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/image/kernel/scripts/gen_initramfs_list.sh
    ./linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/linux-3.2/scripts/gen_initramfs_list.sh


    The first time it is recommended to change all 3 of them.


    Change the following routine in this script:


    list_default_initramfs() {
    # echo usr/kinit/kinit
    :
    }


    default_initramfs() {
    cat <<-EOF >> ${output}
    # This is a very simple, default initramfs


    dir /dev 0755 0 0
    nod /dev/console 0600 0 0 c 5 1
    dir /root 0700 0 0
    # file /kinit usr/kinit/kinit 0755 0 0
    # slink /init kinit 0755 0 0
    EOF
    }


    You simply remove the # from 3 lines in the shellscript so that the initramfs gets included during the kernel build:


    list_default_initramfs() {
    echo usr/kinit/kinit
    :
    }


    default_initramfs() {
    cat <<-EOF >> ${output}
    # This is a very simple, default initramfs


    dir /dev 0755 0 0
    nod /dev/console 0600 0 0 c 5 1
    dir /root 0700 0 0
    file /kinit usr/kinit/kinit 0755 0 0
    slink /init kinit 0755 0 0
    EOF
    }



    Then you change directory to the following path of your OE:


    cd opendreambox/tmp/work/dmXXXX-oe-linux/linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/linux-3.2/usr


    There you have to do the following task:


    mkdir kinit
    cd kinit
    cp /your_path_with_the_extracted_init/kinit kinit
    chmod 755 kinit


    This is the staging area for the initramfs. Jumpin'Jack Flash doesn't need
    any more (device) files there.


    Alternatively you could use the initramfs.patch file for doing all these above changes to the
    script and the kinit directory.


    Then you are already finished with your preparation, move one directory up
    and remove the vmlinux kernel file to make sure that it is re-compiled and
    then start the re-compile:


    cd ..
    rm vmlinux
    rm vmlinux.o


    Then make sure that all steps are re-run by deleting the stamps for the linux-dreambox-3.2* tasks.
    This is needed only the first time:


    cd opendreambox/tmp/stamps/dmXXXX-oe-linux
    rm linux-dreambox-3.2*


    Then simply re-run the build tasks for the linux kernel:


    cd opendreambox
    source bitbake.env


    cd build/dmXXXX


    Then you re-build to check if everything still works and you didn't do any mistake during the
    above changes:


    bitbake linux-dreambox-3.2


    If the above still works, it should be sufficient to just re-run the compile step if you replace for example
    the init binary with a newer one:


    bitbake -f -c compile linux-dreambox-3.2


    Please check in another terminal windows if after the do_unpack phase the gen*.sh script at
    opendreambox/tmp/work/dmXXXX-oe-linux/linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/linux-3.2/scripts
    till has the 3 # removed, if not then remove them quickly that it will be patched
    when the compilation phase runs of the above bitbake. This happens only if you did
    the removing of the stamps files as described above, because then the sources
    will be re-copied and if you did the changes manually instead of using the
    initramfs.patch file they will get lost.


    You were successfull when an initramfs_data.cpio file with about 64k shows up in the
    opendreambox/tmp/work/dmXXXX-oe-linux/linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/linux-3.2/usr directory.


    You can check this by typing:


    ls -alh opendreambox/tmp/work/dmXXXX-oe-linux/linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/linux-3.2/usr


    If the bitbake -f -c compile linux-dreambox-3.2 runs trough without errors you have build successfully a linux
    kernel for your dreambox with the Jumpin 'Jack Flash initramfs kernel.


    You can check this by typing:


    cd opendreambox/tmp/work/dmXXXX-oe-linux/linux-dreambox/linux-dreambox-3.2-r7.11-bsp1/linux-3.2


    ls -al vmlinux


    For verification you may check if this vmlinux kernel contains the initramfs code:


    strings vmlinux | grep initra


    This should give the following output:


    init/initramfs.c
    <6>Trying to unpack rootfs image as initramfs...
    <6>rootfs image is not initramfs (%s); looks like an initrd
    Jumpin'Jack Flash initramfs by gutemine
    initramfs.cpio


    You can now compress this vmlinux file with gzip vmlinux to get a
    vmlinux.gz that you can directly put in the /boot directoy of your dreambox.


    Don't forget a mount -o remount,rw /boot so that the directory is writeable.


    OR you can now build an entire image with make image which
    would produce an nfi imagefile already containing the enhanced kernel.


    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Have fun building Kernels and Images with Jumpin'Jack Flash initramfs
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Einmal editiert, zuletzt von Lost in Translation ()

  • Nötig ist relativ, der initramfs Patch benötigt schon das /dev/loop0 um das von root=XXXX gewünschte zu mounten, falls dann noch jemand LowFAT oder BarryAllen im Einsatz hat welche /dev/loop1 verwenden sind schon alle 2 Loop devices die sonst im Kernel fix mitgebaut werden weg.


    Insofern wären um den ursprünglichen Zustand zu haben wenigstens 4 nötig, aber ich war halt großzügig und habe gleich die vollen 8 spendiert.


    Wenn Ihr es fix in die defconfig machen wollt würde aber auch 3 ausreichen damit wenigstens fürs Betriebsystem wenn man von Hand mountet das losetup noch ein freies anzeigt ohne das man sich mit mknod weitere anlegt.


    Ich missbrauche die loop devices ja so ähnlich wie Eure /dev/discs/xxx links, nur meine funktionieren das immer das gewünschte rootdevice auf der selben loop liegt.


    Nicht ganz im Sinne des Erfinders, aber nachdem ich mir den code aus dem init der 7025 geborgt habe funktioniert das erschreckend stabil.


    Damit kann man ganz ohne udev und devfs oder ähnlichem völlig dynamisch das root device der selben loop zuordnen und fürs Betriebsystem sieht das dann immer gleich aus. Dadurch geht das dann immer und überall, egal ob devfs, udev, mdev, devtmpfs,.... später dann beim booten verwendet werden.


    Und viel flotter ist es auch :smiling_face:


    Aber Feedback zum HowTo ist natürlich wilkommen, so Sachen wie das gen*.sh gleich überall anzupassen (obwohl nur Kopien des selben files) oder die stamps zu löschen sind nicht die feine Englische Art, aber ich brauchte eben eine Variante wo man schnell den Linux kernel beliebig oft bauen kann, und direkt das vmlinux per FTP auf die box schieben um zu testen ob das neu compilierte kinit funktioniert.


    Und nachdem ich kinit auf der box im Squeez gegen die klibs baue lässt sich das meiste dort direkt debuggen, nur machen Sachen gehen halt nur beim Booten zu testen.


    PS: Falls interesse an einem reinen dummy initramfs zum chainen in ein externes besteht kann ich Euch aber gerne den code dafür rausschneiden, aber zuerst muss mal das volle initramfs wieder stabil im OE 2.0 funktionieren, inklusive alle Funktionen.


    PPS: Im OE 1.6 war ja ein leeres Dummy initramfs verbaut daher muss man im 2.0 halt die entsprechenden config parameter wieder in die defconfig machen, wobei solange kein kinit da ist und das gen*.sh script gepatched wurde stören die parameter auch nicht wirklich weil der kernel dann halt so wie im OE 1.6 einfach weiterbootet wenn er kein initramfs.cpio im kernel binary findet.


    gutenacht
    gutemine

    7 Mal editiert, zuletzt von Lost in Translation ()

  • Nachdem keine weiteren inputs zu meinem Kochrezept gekommen sind findet Ihr hier im Anhang die entsprechenden files sowie ein do_diff.sh das den initramfs patch für das diff des initramfs buildscript und das kinit directory erstellt.


    Das kinit binary is also Teil des patches aber auch im patched/usr/kinit directory zu finden falls es wer erstmal wie im README.TXT beschrieben erstmals von Hand in die Buildumgebung einbauen will.


    Wenn Ihr rausfindent wie man das Patchfile ins OE 'richtig' einbindet so das der patch automatisch eingebunden wird wäre mir sehr geholfen, weil ich würde gerne das Wochenende nutzen um andere Sachen zum Laufen zu bringen.


    Falls nötig könnt Ihr natürlich auch die directory struktur und das do_diff.sh anpassen um das Patchfile ans OE anzupassen, was ich Euch ins tar.gz gepackt habe ist leicht angepasst nur einfach die Version die den OE 1.6 patch produziert hat. Diese Variante die adenin mir gemacht hat um Patches für die Imagebauer zu produzieren hat bis jetzt gute Dienste geleistet, und ich denke das es auch im 2.0 OE funktionieren müsste.


    PS: Falls es Sinn macht könnte man natürlich auch die defconfig Anpassungen für den kernel in den Patch aufnehmen.


    PPS: Der Patch sollte im Idealfall für alle Boxen funktionieren für die es das OE 2.0 gibt, das kinit binary sollte so clever sein die boxspezifischen Unterschiede richtig zu handhaben, nur den code für die 7025 habe ich rausgeschmissen, dort hat das labelmounten weil eh nur die CF sinvoll verwendebar war nie richtig Sinn gemacht.


    LG
    gutemine

  • Ihr sollt es aber nicht nur runterladen sondern auch berichten ob man so den Kernel mit initramfs patch bauen kann und wenn Ihr Euch besser auskennt mithelfen rauszufinden wie man den patch wieder sauber ins OE 2.0 einbindet.


    Und bezüglich der Anzahl der Loop devices habe ich mich jetzt entschieden es andersrum zu machen - Ihr könnt das auf 2 im defconfig Lassen, und immer wenn sich eines meiner Tools eines davon krallt legt es ein zusätzliches an, damit die freien loopdevices sozusagen nie weniger werden. Ich denke so ist das am flexibelsten und man muss weniger anpassen.

    Einmal editiert, zuletzt von Lost in Translation ()

  • Hi !


    nachdem das Jumpin'Jack Flash initramfs Patch jetzt schon > 20x runtergeladen wurde wollte ich nachfragen ob Ihr alle das binary von Hand so wie in meinem Readme beschrieben eingebaut habt oder wenn es geschafft hat wer den Patch direkt zu verwenden, dann wäre es nett wenn ihr postet wie und wo genau damit ich das readme ergänzen kann und sich die Anderen leichter damit tun.


    LG


    gutemine

  • Na gut wenigstens im OoZooN Baord hat jemand geantwortet:


    if you are interested i used your initramfs.patch directly by placing it in the linux-dreambox_3.2.bb at ...\opendreambox\tmp\work\dmXXXX-oe-linux\linux-dreambox\linux-dreambox-3.2-r8.13-bsp1\linux-3.2\


    Code
    SRC_URI = " \ ${KERNELORG_MIRROR}/linux/kernel .... 
    ..... 
    file://initramfs.patch 
    file://defconfig \


    and i did manually the defconfig edition.


    Keine Ahnung warum das damals bei mir nicht funktioniert hat. Wenn ich Zeit habe werde ich das noch ins readme.txt einfügen.

  • Wenn man sich in seinem lokalen OE einen eigenen Layer eingerichtet hat (was man tun sollte) muss man nix an den original Files rumpatchen.
    Mann fügt es einfach über ein linux-dreambox_3.2.bbappend dazu:


    SRC_URI += "file://initramfs.patch \
    "


    Dann noch eine angepasste defconfig in den eigenen Layer mit reinlegen und die bbbappend erweitern:


    FILESEXTRAPATHS_prepend := "${THISDIR}/${MACHINE_ARCH}:"


    Dann kann man noch eine eigene Version anhängen wenn man mag:


    PR .= "-eigeneversion1"


    Das kann man sich schön abschauen im meta-bsp Layer. Dort macht DMM das genauso um den Kernel anzupassen.
    Mann muss eben nur drauf achten das der eigene Layer die höchste Prio hat damit er auch beachtet wird.

  • Danke, schön langsam kommt Licht in die Sache :smiling_face:


    Wobei letzendlich hilft das nur den Imagebauern das initramfs möglicht einfach einbauen zu können.


    Hoffentlich gibt es bald entsprechende Images, weil ohne Labelmount wird es kein Dumbo oder LowFAT 2.0 geben.


    Nur im Freeze habe ich mich noch durchgeschummelt :smiling_face:

  • initramfs Patch 3.3 mit dem neuen README und hoffentlich wieder funktionierendem Labelmounten auch in den aktuellen 2.0 Kerneln ist jetzt weiter oben im Thread.


    Der block2mtd Support kommt erst in der nächsten Version, erst müssen die Leute berichten ob rambo 0.9.1 mit dem im Kernel embedded block2mtd Treiber funktioniert.