busybox & halt (long) - VYRESENO, NEPOCHOPENO

oldfrog na volny.cz oldfrog na volny.cz
Neděle Březen 16 03:59:19 CET 2003


> hraju si s vlastni minidistribuci zalozenou na Busyboxu.
> Pokud zadam prikaz "halt" nebo "poweroff" nebo poslu
> SIGUSR1,2 procesu init, dostanu hlasku:
>
>    The system is going down NOW!
>    Sending SIGTERM to all processes...
>    Sending SIGKILL to all processes...
>    The system si halted. Pres Reset or turn off power.
>    flushing ide devices: hda hdb
>    System halted.
>    Kernel panic: Attempted to kill init!
>
> Nelibi se mi ta panika na konci... Init pouzivam ten z Busyboxu,
> zjistil jsem, ze se vola funkce reboot(RB_HALT_SYSTEM); - ta
> vypise "System halted.", init prejde do nekonecne smysky a pak
> jadro zpanikari.


Nasel jsem na netu reseni: zavolat fork() a teprve z dcerineho procesu
zavolat reboot(RB_HALT_SYSTEM). Pokud by byl nekdo schopen
mi vysvetlit proc, byl byl opravdu rad. Kdyz uz jsem tomu venoval to
usili, kdyz uz to funguje - tak abych se z toho take poucil :-)).

Dobrou noc preje
OldFrog.



---priloha--originalni--cast--kodu--init.c--busybox-0.60.5---
        
sync();                                                                        
                                                                                       
        /* allow time for last message to reach serial console 
*/                      
        
sleep(2);                                                                      
                                                                                       
        if (sig == SIGUSR2 && kernelVersion >= 
KERNEL_VERSION(2,2,0))                  
                
init_reboot(RB_POWER_OFF);                                             
        
else                                                                           
                
init_reboot(RB_HALT_SYSTEM);                                           
                                                                                       
        
loop_forever();                                                                
---priloha--originalni--cast--kodu--init.c--busybox-0.60.5---


---priloha--zmenena--cast--kodu--init.c--busybox-0.60.5---
    sync();

    /* allow time for last message to reach serial console */
    sleep(2);

    if (sig == SIGUSR2 && kernelVersion >= KERNEL_VERSION(2,2,0)) {
        int i = fork();
        if ( i <  0 ) exit(1); /* we have trouble */
        if ( i == 0 ) init_reboot(RB_POWER_OFF); /* we are in child 
process */
        if ( i >  0 ) loop_forever(); /* we are in parent process */
    }
    else {
        int i = fork();
        if ( i <  0 ) exit(1); /* we have trouble */
        if ( i == 0 ) init_reboot(RB_HALT_SYSTEM); /* we are in child 
process */
        if ( i >  0 ) loop_forever(); /* we are in parent process */
    }
---priloha--zmenena--cast--kodu--init.c--busybox-0.60.5---




Další informace o konferenci Linux