INITCTL(5)

NOME
initctl - /run/initctl é um pipe nomeado que passa comandos ao init do SysV

RESUMO
/run/initctl

DESCRIÇÃO
Este documento descreve o canal de comunicação definido pelo SysV init em /run/initctl. Este pipe nomeado permite a programas com as permissões apropriadas (tipicamente os programas corridos pelo root têm acesso de leitura-escrita ao pipe) enviarem sinais ao programa init (PID 1). O manual do init tem, até recentemente, simplesmente dito que as pessoas que desejam perceber como enviar mensagens ao init devem ler o código fonte do programa init, mas isso não é geralmente prático. As mensagens enviadas para o pipe para falar com o init têm de ter um formato especial. Este formato está definido como uma estrutura C e a parte técnica é apresentada aqui: /*
 * Because of legacy interfaces, "runlevel" and "sleeptime"
 * aren't in a separate struct in the union.
 *
 * The weird sizes are because init expects the whole
 * struct to be 384 bytes.
 */ struct init_request {
        int magic; /* Magic number */
        int cmd; /* What kind of request */
        int runlevel; /* Runlevel to change to */
        int sleeptime; /* Time between TERM and KILL */
        union {
                struct init_request_bsd bsd;
                char data[368];
        } i; }; Vamos avançar pela estrutura de init_request uma linha de cada vez. A primeira variável, o número "mágico" tem de ser do valor 0x03091969. O program init então sabe que apenas programas com acesso de root que enviam este número mágico estão autorizados a comunicar com o init. A variável cmd é um valor na gama de 0-8 (actualmente). Esta variável cmd diz ao init o que queremos fazer. Aqui estão as opções possíveis: 1 - Define o runlevel actual, especificado pela variável runlevel. 2 - A energia vai falhar em breve (provavelmente bateria fraca), prepara para desligar. 3 - A energia está a falhar, desligar imediatamente. 4 - A energia está OK, cancelar o desligar. 6 - Define uma variável de ambiente a um valor a ser especificado na
    variável data com esta estrutura. Podem ser adicionadas outras opções cmd ao init mais tarde. Por exemplo, os valores de comando 0, 5 e 7 estão definidos mas actualmente não implementados. A variável runlevel irá especificar o runlevel para se mudar para (0-6). A variável sleeptime é usada quando queremos dizer ao init para mudar o tempo de espera entre enviar SIGTERM e SIGKILL durante o processo de encerramento. Ainda não está implementado alterar isto durante a execução. A variável data (na união) pode ser usada para passar dados diversos que o init pode precisar para processar o nosso pedido. Por exemplo, quando se definem variáveis de ambiente. Quando se define uma variável de ambiente através do pipe /run/initctl do init, a variável data deve ter o formato VARIÁVEL=VALOR. A string deve ser terminada com um caractere NULL.

EXEMPLOS
O seguinte exemplo de código C mostra como enviar um pedido de definição de variável de ambiente ao processo init usando o pipe /run/initctl. Este exemplo está simplificado e salta a verificação de erros. Um exemplo mais complexo pode ser encontrado na função init_setnv() do programa shutdown.c.
struct init_request     request;           /* structure defined above */
int                     fd;                /* file descriptor for pipe */
memset(&request, 0, sizeof(request));      /* initialize structure */
request.magic = 0x03091969;                /* magic number required */
request.cmd = 6;                           /* 6 is to set a variable */
sprintf(request.data, "VARIABLE=VALUE");   /* set VAR to VALUE in init */
if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0) /* open pipe for writing */
{
    size_t s  = sizeof(request);           /* size of structure to write */
    void *ptr = &request;                  /* temporary pointer */
    write(fd, ptr, s);                     /* send structure to the pipe */
    close(fd);                             /* close the pipe when done */
}

NOTAS
Normalmente o pipe /run/initctl seria apenas usado por programas de baixo-nível para pedir um encerramento relacionado com energia ou para mudar o runlevel, como o telinit faria. Na maioria do tempo não há necessidade de falar com o init diretamente, mas isto dá-nos uma aproximação extensiva de que o init pode ser ensinado a aprender mais comandos.

Os comandos passados pelo canal /run/initctl têm de ser enviados num formato binário específico e ter um tamanho específico. Estruturas de dados maiores ou que não usem o formato apropriado serão ignoradas. Tipicamente, apenas o root tem a habilidade de escrever no pipe initctl por razões de segurança.

O canal /run/initctl pode ser fechado ao se enviar ao init (PID 1) o sinal SIGUSR2. Isto fecha o pipe e deixa-o fechado. Isto pode ser útil para certificar que o init não deixa ficheiros abertos. No entanto, quando o pipe está fechado, o init não recebe mais sinais, tais como aqueles enviados pelo shutdown(8) ou telinit(8). Por outras palavras, se fecharmos o canal, o init não pode o seu runlevel diretamente. O canal pode ser reaberto ao enviar ao init (PID 1) o sinal SIGUSR1.

Se o canal /run/initctl estiver fechado então ainda deve ser possível desligar o sistema usando a bandeira -n do comando shutdown(8), mas isto nem sempre é limpo e não é recomendado.

FICHEIROS
/run/initctl /sbin/init

AUTOR
Jesse Smith (jsmith@resonatingmedia.com)

VEJA TAMBÉM
init(8)