1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Automatisches starten von Skripte bei Systemneustart

Dieses Thema im Forum "Odys Allgemein" wurde erstellt von RainerWP, 30.01.2012.

  1. RainerWP, 30.01.2012 #1
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Hi,

    es gibt ja immer wieder Situationen bei denen man aus verschiedensten Gründen etwas testen will (Module beim Start laden, Dienste starten etc.).
    Im Normalfall geht dies nur wenn die init.rc im boot.img oder system.img angepasst wird. Und das bedeutet jedesmal ein bischen Arbeit und flashen des Gerätes.
    In Anlehnung an das Verfahren der Kollegen die "optware" für Embedded Devices entwickeln habe ich mir für das Loox (oder auch andere Odys Geräte) folgendes ausgedacht.

    1. In jedes Custom Rom das hier entwickelt wird, wird die Datei rc.optware in /system/etc/init.d/ erstellt
    Inhalt:
    Code:
    #
    #        
    #        Starte Skripte in $OPTWAREINITD 
    #        Skripte werden in numerischer Reihenfolge ausgefuehrt
    #
    #        Datei mit dem Pfad zu dem optware Verzeichnis welches auf der SD-Karte liegt
    #
    OPTWAREDIR=`cat /sdcard/optware.ini`
    #
    #        init.d Verezeichnis
    #
    OPTWAREINITD=$OPTWAREDIR"/etc/init.d"
    #
    #        shell definieren
    #
    SH=/system/bin/sh
    if [ -d $OPTWARE ]
    then
            for script in $OPTWAREINITD/S??*
            do
                    [ ! -f "$script" ] && continue # Keine Symlink Dateien ausfuehren
                    $SH $script start        
            done
            #
            #        Symbolischen Link auf /opt setzen
            #        macht das Tippen einfacher :-)
            #
            if [ ! -d /opt ]
            then
                    /system/bin/busybox ln -s $OPTWAREDIR /opt        
            fi
    else
            #
            #        Kein optware Verzeichniss auf der SD-Karte vorhanden
            #
            exit
    fi
    
    2. In der init.rc der boot.img muss das Skript /system/etc/init.d/rc.optware aufgerufen werden.

    ---> Wer weiß an welcher Stelle dies geschehen muss ?

    3. Auf der SD-Karte liegt im Hauptverzeichniss die Datei optware.ini
    Inhalt:
    Code:
    /sdcard/optware
    
    Dieser Eintrag legt den Pfad zum optware Verzeichnis auf der SD-Karte fest.

    Ich habe bei mir z.B. folgende Struktur angelegt :

    Code:
    /sdcard/opt
    /sdcard/opt/etc
    /sdcard/opt/etc/init.d
    /sdcard/opt/usr
    /sdcard/opt/usr/local
    /sdcard/opt/usr/local/bin
    /sdcard/opt/usr/bin
    /sdcard/opt/var
    /sdcard/opt/var/log
    /sdcard/opt/module
    
    Wenn Punkt 1 - 3 erledigt sind werden jedesmal bei einem Neustart die entsprechenden Skripte ausgeführt.
    Hier ein Beispiel für das Modul "hubenable.ko" (/sdcard/opt/etc/init.d/S01usb-hub)

    Code:
    #!/system/bin/sh
    #
    #       Lade Modul "hubenable.ko"
    #
    get_status()
            {
            /system/bin/lsmod | /system/bin/grep "hubenable" > /dev/null
            STATUS=$?
    }
    start ()
            {
            get_status
            case $STATUS  in
                    1)
                            echo "Lade hubenable"
                            /system/bin/insmod /sdcard/opt/modules/hubenable.ko
                    ;;
                    0)
                    echo "Modul schon geladen"
                    ;;
            esac
    }
    stop()
            {
            get_status
            case $STATUS in
                    0)
                            echo "Entlade hubenable"
                            /system/bin/rmmod hubenable
                    ;;
                    1)
                            echo "Modul nicht geladen"
                    ;;
            esac
    }
    status()
            {
            get_status
            case $STATUS in
                    0)
                            echo "Modul geladen"
                    ;;
                    1)
                            echo "Modul nicht geladen"
                    ;;
            esac
    }
    force_reload()
            {
            stop
            start
    }
    
    case $1 in                                        
            start)                                    
                    start                             
            ;;                                        
            stop)                                     
                    stop                              
            ;;                                        
            status)                                   
                    status                            
            ;;            
            force_reload) 
                    force_reload
            ;;                  
            *)                  
                    echo "Usage: $0 start|stop|status|force_reload"
                    exit                                           
            ;;                                                     
    esac 
    
    Wäre toll wenn wir das für alle ROM hinkriegen würden :thumbsup:
    Wer hilft mit und bei was ?

    Bis dann................

    Rainer
     
  2. fluxflux, 30.01.2012 #2
    fluxflux

    fluxflux Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Frage: Warum /sdcard als Verzeichnis für Optware und nicht eine ext3-Partition? Wenn die SD-Karte entfernt wurde, dann laufen evtl. benötigte Skripte nicht mehr, richtig?

    /data wäre doch schreibbar, ext3 und für jeden zugänglich und es müsste nur die boot.img und nicht auch noch die system.img geändert werden!?

    Oder denke ich da komplett falsch?

    Thomas.
     
  3. RainerWP, 30.01.2012 #3
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Hi Thomas,

    Das ist richtig, daran habe ich in meiner Euphorie nicht gedacht :-(

    Auch der nicht ganz so gewiefte Benutzer ?

    Müsste die system.img nicht für das Skript /system/etc/init.d/rc.optware angepasst werden ?

    Let's talk about it :)

    Bis dann,

    Rainer
     
  4. wusel, 31.01.2012 #4
    wusel

    wusel Android-Experte

    Beiträge:
    656
    Erhaltene Danke:
    231
    Registriert seit:
    27.12.2011
    Hi Rainer,
    zunächst mal guter Ansatz, und schon komisch, aber genau damit war ich gestern auch ne Weile beschäftigt ... ;)
    ich habe mehrfach gelesen in anderen Foren dass einige ROMs eine /data/init.sh oder /data/userinit.sh unterstützen; ich denke wir sollten den gleichen Weg wählen; von da aus kann man dann immer noch solche Sachen treiben mit der SD-Card wie Du hier vorschlägst ...
    lasst uns ein cooles Plätzchen in einer der vorhandenen inits finden wo wir einfach testen ob /data/userinit.sh vorhanden und ausführbar ist, und dann starten ...
     
  5. RainerWP, 31.01.2012 #5
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Hi Wusel,

    Jupp, kein Problem, kommt ja drauf an was diese Skripte dann ausführen.
    Ich habe auf meinem System keine von den beiden Dateien.
    Ob dieses Skript dann rc.optware oder init.sh heißt ist eigentlich egal, hauptsache wir können dann über dieses Skript Dinge steuern :)

    Ich habe mal den Vorschlag von Thomas aufgegriffen und teste mal mit /data/opt . Das hat ja auch den Vorteil das die Skripte direkt ausgeführt werden können da /data ja ext3 ist.

    Bis dann.............

    Rainer
     
  6. RainerWP, 01.02.2012 #6
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Hi,

    da ja unser Lieblingsspielzeug auf Linux basiert, sollten wir uns ggf. an den Linux Filesystem Hierarchy Standard (FHS) halten. Siehe z.B. Verzeichnisstruktur
    und das würde bedeuten das solche Skripte in /etc/init.d/ liegen sollen.

    Bis dann...........

    Rainer
     
  7. wusel, 01.02.2012 #7
    wusel

    wusel Android-Experte

    Beiträge:
    656
    Erhaltene Danke:
    231
    Registriert seit:
    27.12.2011
    prinzipiell würde ich da ja zustimmen, aber andererseits bevorzuge ich dass /system RO gemountet bleibt fürs normale Benutzen ...
    daher währe ein Platz auf /data schon besser denke ich; außerdem könnte man das dann auch auf alle Systeme (also auch die mit cramfs) übertragen ...
     
    fluxflux bedankt sich.
  8. RainerWP, 01.02.2012 #8
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    ok, du hast gewonnen :)
     
  9. netlars, 02.02.2012 #9
    netlars

    netlars Fortgeschrittenes Mitglied

    Beiträge:
    339
    Erhaltene Danke:
    92
    Registriert seit:
    05.11.2011
    also ich würde da lieber /etc/init.d bevorzugen.
    Die Data Partition wird beim neuflashen formatiert und und die Verzeichnisse in Data werden durch die init.rc neu angelegt. Das würde heisen wenn man Module in das Image integrieren möchte, muss man die ja irgendwo hinterlegen und dann in die Data kopieren (Doppelter Speicher).

    /etc/init.d klingt vernünfitger für mich, da es ja auch linux standard ist.
     
  10. RainerWP, 02.02.2012 #10
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Hi,
    passiert das nicht auch mit /system ?

    Bis dann.........

    Rainer
     
  11. netlars, 02.02.2012 #11
    netlars

    netlars Fortgeschrittenes Mitglied

    Beiträge:
    339
    Erhaltene Danke:
    92
    Registriert seit:
    05.11.2011
    ja aber da kann ich standard module ja dann in das rom integrieren z.B. hubenable.ko

    die sind dann immer da und jeder kann was bei nem ext3 system.img selber hinzufügen

    alternative zusätzlich das opt verzeichniss in data anlegen, somit wäre es dann auch bei cramfs nutzbar
     
  12. ropa, 02.02.2012 #12
    ropa

    ropa Junior Mitglied

    Beiträge:
    29
    Erhaltene Danke:
    8
    Registriert seit:
    11.01.2012
    Hi Leute,

    ich habe eben erstmals erfolgreich das boot.img geaendert. Mit den Tools die
    PopEi im Thread "cRoms für den Odys Loox/Xpress mit suRoot und ext3/RW/FullRoot" beschrieben hat. Alles unter Linux. Klappt super. Ich habe jetzt ein
    init.sh das mir direkt beim booten ein eigenes user-defined script startet. Das liegt im Moment direkt unter /data. Ich werden damit jetzt fuers Erste
    etwas herum spielen, und mir dann den besten Platz dafuer ueberlegen.
    Wenn es meine Zeit erlaubt, schreibe ich einmal eine Zusammenfassung der benoetigten Schritte. Oder hat das schon einer von Euch gemacht ?
     
  13. RainerWP, 02.02.2012 #13
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    hast du nur das boot.img geflasht und wenn ja mit welchem Tool unter Linux.
    Habe mir das rkflashtool von xda heruntergeladen, kompiliert und getestet.
    Auslesen und Reboot funktioniert. Geflasht habe ich noch nicht, will ich heute abend ran.
    nö, noch nicht. Will erstmal testen und wir sollten auf einen gemeinsamen Nenner kommen wo was liegen sollte :)

    Danke für die Info, bis dann.........

    Rainer
     
  14. Oma7144, 02.02.2012 #14
    Oma7144

    Oma7144 Android-Guru

    Beiträge:
    2,914
    Erhaltene Danke:
    1,082
    Registriert seit:
    18.12.2011
    Wenn du das mal zusammenschreiben könntest, dann wäre das großartig!

    Ich würde dann lieber dem Vorschlag von fluxflux und netlars folgen und die generell nötigen Kernelmodule in der
    init.rd in dem boot.img hinterlegen. Für die etwas exotischeren Anwendungen dann noch den hook.

    :thumbup:
     
  15. fluxflux, 02.02.2012 #15
    fluxflux

    fluxflux Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    ropa bedankt sich.
  16. ropa, 02.02.2012 #16
    ropa

    ropa Junior Mitglied

    Beiträge:
    29
    Erhaltene Danke:
    8
    Registriert seit:
    11.01.2012
    Hi fluxflux,

    super, dann spar' ich mir das.

    Viele Gruesse
    ropa
     
  17. RainerWP, 05.02.2012 #17
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Hi,

    habe mir jetzt zum testen eine boot.img gebaut und geflashed.
    init.sh liegt in der boot.img im / Verzeichniss.
    Aus der init.sh wird /etc/init.d/rc.optware gestartet.
    Ich habe festgestellt das "/sdcard" noch nicht sofort zur Verfügung steht.
    Falls also jemand was mit /sdcard" machen möchte muss in dem Skript eine Warteschleife rein, etwa in der Art wie hier :
    Code:
    date=`date`
    /busybox echo "$date : Skript /etc/init.d/rc.test1 aus Abschnitt  boot  der init.rc wird gestartet" > /data/opt/var/log/start1.log
    echo "find /sdcard/ "  >> /data/opt/var/log/start1.log
    /busybox find /sdcard/ >> /data/opt/var/log/start1.log
    while :
    do
            date=`date`
            echo "$date : Warte auf /sdcard/opt" >> /data/opt/var/log/start1.log
            if  [ ! -d /sdcard/opt ]
            then
                    sleep 2
            else
                    echo "$date : /sdcard/opt gefunden" >> /data/opt/var/log/start1.log
                    exit
            fi
    done
    
    
    Output :
    Code:
    Sun Feb  5 13:57:40 UTC 2012 : Skript /etc/init.d/rc.test1 aus Abschnitt  boot  der init.rc wird gestartet
    find /sdcard/ 
    Sun Feb  5 13:57:40 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:42 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:44 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:46 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:48 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:50 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:52 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:54 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:56 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:57:58 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:58:00 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:58:02 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:58:05 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:58:07 UTC 2012 : Warte auf /sdcard/opt
    Sun Feb  5 13:58:07 UTC 2012 : /sdcard/opt gefunden
    
    Testweise habe ich das starten des Skriptes mal in den Abschnitt "on post-fs" der init.rc geschrieben, gleiches Ergebniss.
    Sonst fällt mir im Moment kein Abschnitt ein wo es hingehören könnte .
    Hier die verschiedenen Abschnitte der init.rc :


    Code:
    on early-init
    on init
    on fs
    on post-fs
    on boot
    on property:ro.secure=1
    on property:ro.kernel.qemu=1
    on property:persist.service.adb.enable=1
    on property:persist.service.adb.enable=0
    
    Bis dann............

    Rainer
     
  18. fluxflux, 05.02.2012 #18
    fluxflux

    fluxflux Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Und die init.sh wird aus der init.rc gestartet?

    So wie es ropa aufgezeigt hat?

    Thomas.
     
  19. RainerWP, 05.02.2012 #19
    RainerWP

    RainerWP Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    111
    Erhaltene Danke:
    17
    Registriert seit:
    09.01.2012
    Jupp,

    Code:
    service init_sh /init.sh
        user root
        oneshot
    
     
    fluxflux bedankt sich.
  20. netlars, 09.02.2012 #20
    netlars

    netlars Fortgeschrittenes Mitglied

    Beiträge:
    339
    Erhaltene Danke:
    92
    Registriert seit:
    05.11.2011
    helft mir mal bitte auf die Sprünge, bei meinem XPRESS werden die Scripte nicht ausgeführt bzw. mit Fehler abgebrochen?

    was mache ich falsch? Nutzt ihr noch die originale Busybox oder habt ihr die System eigene mit einer anderen ersetzt?

    MfG
     

Diese Seite empfehlen