Crie e controle scripts de inicialização no BusyBox

11

Eu compilei um kernel Linux personalizado no BusyBox. O BusyBox initnão suporta níveis de execução. Quando o kernel é inicializado no BusyBox, ele primeiro executa o initque procura o nível de execução especificado em /etc/inittab. BusyBox initfunciona muito bem sem /etc/inittab. Quando não inittabé encontrado, ele tem o seguinte comportamento:

::sysinit:/etc/init.d/rcS

Esta parte é muito clara para mim, mas gostaria de saber como gerenciar daemons que iniciam a rede, criam portas seriais ou iniciam javaprocessos. Eu procurei nos scripts que residem, /etc/init.d/mas não entendo como gerenciá-los. Estou procurando um bom tutorial ou solução para controlar esses serviços eu mesmo sem uma ferramenta automatizada buildroot. Eu quero entender como esses scripts funcionam e como criar dispositivos /dev/(agora eu só tenho consolee ttyAM0).

Shantanu Banerjee
fonte

Respostas:

9

Para buildroot, todos os seus scripts devem ser colocados $path_to_buildroot/output/target/etc/init.dantes da imagem de construção. No meu caso, este diretório contém rcSe poucos scripts denominados S [0-99] script_name. Assim, você pode criar seu próprio script start \ stop.

rcS:

#!/bin/sh

# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
    *.sh)
        # Source shell script for speed.
        (
        trap - INT QUIT TSTP
        set start
        . $i
        )
        ;;
    *)
        # No sh extension, so fork subprocess.
        $i start
        ;;
    esac
done

e, por exemplo, S40network:

#!/bin/sh
#
# Start the network....
#

case "$1" in
  start)
    echo "Starting network..."
    /sbin/ifup -a
    ;;
  stop)
    echo -n "Stopping network..."
    /sbin/ifdown -a
    ;;
  restart|reload)
    "$0" stop
    "$0" start
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart}"
    exit 1
esac

exit $?
Renat Zaripov
fonte
S[0-99]script_nameA sintaxe do nome do arquivo será executada S10*antes S2*e interromperá o script.
Tim
@ Tim não necessariamente "quebra o script", apenas zero-pad. Claro S20*corre atrás S10*, se você quer algo para vir antes S10que você precisa para chamá-lo S01*, S02*etc. NBD.
thom_nic
5

É uma péssima idéia alterar seu fs na pasta "target". Isso ocorre porque as alterações output/target/não sobrevivem ao make cleancomando.

No manual buildroot, descreveu como fazê-lo corretamente

Você deve criar dir em algum lugar que sobreponha parcialmente o sistema de arquivos. Por exemplo, você pode criar o diretório "sua sobreposição" no diretório buildroot, onde você cria essa estrutura

your-overlay/etc/init.d/<any_file>

Então você deve definir o caminho para essa sobreposição em defconfig

System configuration > Root filesystem overlay directories

(ou encontre BR2_ROOTFS_OVERLAY)

Além disso, o caminho recomendado para essa sobreposição é board/<company>/<boardname>/rootfs-overlay

Kenjy Minamori
fonte
Configuração de exemplo ao usar Buildroot como um sub-módulo: github.com/cirosantilli/linux-kernel-module-cheat/blob/...
Ciro Santilli新疆改造中心法轮功六四事件
1
O OP está usando apenas o BusyBox e indica que ele deseja atingir seu objetivo sem construir raiz. Não vejo esta resposta relevante para a pergunta. É mais um comentário para a resposta aceita.
Tim