Como um log pode ser impresso para exibição durante o desligamento, reinicialização ou inicialização?

Como um log pode ser impresso para exibição durante o desligamento, reinicialização ou inicialização?

Como todos sabemos, quando reiniciamos, desligamos ou inicializamos um sistema, alguma mensagem será impressa na tela, aqui está uma captura:

insira a descrição da imagem aqui

Meu sistema é Ubuntu 16.04, sei que essas mensagens de log acima vêm do systemd.

Pelo que entendi, um processo de usuário normal pode imprimir coisas na tela porque o sistema fornece três descritores de arquivo: 0, 1 e 2. Podemos encontrá-los em /proc/<PID>/fd/. Aqui está um exemplo:

root@X86-Xenial-6:~# ls /proc/3467/fd
0  1  2  255

É 3467um programa Olá Mundo, não sei o que 225é, mas sei disso 0, 1e 2são entrada padrão, saída padrão e erro padrão.

Então, eu tenho uma dúvida: quando o sistema começa a desligar, reiniciar ou inicializar, o processo do usuário não foi criado ou foi destruído, o que significa que /proc/não existe mais, neste caso, 0e 1não 2existe .

Então, por que a mensagem vinda do systemd pode ser impressa na tela? O kernel poderia imprimir coisas porque controla a tela imediatamente, mas não acho que o systemd pertença ao kernel, então como ele poderia imprimir coisas na tela também? Que tipo de função ou API é usada?

Responder1

A inicialização e o desligamento são realizados em grande parte no espaço do usuário, não pelo kernel. Assim que o kernel terminar de inicializar, ele procura inite inicia isso, como um processo normal, com os descritores de arquivo padrão apontando para o console. Portanto init(no seu caso, o script initramfs e depois o systemd) pode gravar em sua saída padrão e tudo o que ele gravar aparecerá na tela (ou onde quer que a saída do console esteja configurada para aparecer). Isso continua sendo o caso até que o kernel seja encerrado ou reinicializado, o que acontece após o encerramento do espaço do usuário (e após todos os logs de desligamento terem sido gravados no console).

À parte, observe que /procé apenas um meio de acessar certas informações mantidas pelo kernel; essas informações existem, /procestejam montadas ou não.

Observe também que

Como todos sabemos, quando reiniciamos, desligamos ou inicializamos um sistema, alguma mensagem será impressa na tela

não é necessariamente verdade — muitos sistemas agora inicializam e desligam sem mostrar logs, então não podemos presumir que “todos nós sabemos”.

Responder2

Uma resposta curta, para esclarecer alguns mal-entendidos.

  • O processo é feito no espaço do usuário: especificamente inito primeiro processo do usuário.
  • Você não precisa de /proc para que existam descritores de arquivo. Se a única maneira de acessar descritores de arquivo fosse através de um arquivo, como você acessaria um descritor de arquivo? (você abriria o arquivo e /procreceberia um descritor de arquivo, tentaria procurá-lo e /procretornaria um descritor de arquivo…). /procé apenas uma visão, só é necessária para processos que reportam outros processos.
  • O descritor de arquivo 255 lsem seu exemplo é do diretório /proc/3467/fd: lstem que abrir o diretório, então esperamos um descritor de arquivo extra. Temos um extra, então é isso.
  • /proc/fd/1etc apontam para outros dispositivos. por exemplo 1 -> /dev/pts/3. Faça umls -l /proc/self/fd
  • Quando o kernel for iniciado, initele conectará seu stdin, stdout, stderr à tela (um dispositivo tty, que é renderizado na tela) ou a algum outro lugar.
  • inité o processo 1(no seu sistema systemd).

informação relacionada