Como todos sabemos, quando reinicializamos, desligamos ou iniciamos um sistema, alguma mensagem será impressa na tela, aqui está uma captura:
Meu sistema é o Ubuntu 16.04, eu sei que essas mensagens de log acima vêm do systemd.
No meu entendimento, 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
O 3467
é um programa hello-world, não sei o que 225
é mas sei disso 0
, 1
e 2
são entrada padrão, saída padrão e erro padrão.
Então, eu tenho uma pergunta: 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, 0
e 1
não 2
existe .
Então, por que a mensagem vinda do systemd pode ser impressa na tela? O kernel pode 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?
A inicialização e o desligamento são amplamente conduzidos no espaço do usuário, não pelo kernel. Assim que o kernel termina de inicializar, ele procura
init
e inicia isso, como um processo normal, com os descritores de arquivo padrão apontando para o console. Portantoinit
(no seu caso, o script initramfs e depois o systemd) pode gravar em sua saída padrão e o que quer que ele escreva aparecerá na tela (ou onde quer que a saída do console esteja configurada para aparecer). Este continua sendo o caso até que o kernel seja desligado ou reinicializado, o que acontece depois que o espaço do usuário foi desligado (e depois que todos os logs de desligamento foram gravados no console).Como um aparte, note que
/proc
é apenas um meio de acessar certas informações mantidas pelo kernel; essas informações existem/proc
, estejam montadas ou não.Observe também que
não é necessariamente verdade — muitos sistemas agora inicializam e desligam sem mostrar logs, então não podemos presumir que “todos nós sabemos”.
Uma resposta curta, para esclarecer alguns mal-entendidos.
init
o primeiro processo do usuário./proc
ser retornado um descritor de arquivo, tente procurá-lo em/proc
um descritor de arquivo…)./proc
é apenas uma visualização, é necessária apenas para processos que relatam outros processos.ls
seu exemplo é do diretório/proc/3467/fd
:ls
tem que abrir o diretório, então esperamos um descritor de arquivo extra. Temos um extra, então é isso./proc/fd/1
etc apontam para outros dispositivos. por exemplo1 -> /dev/pts/3
. Faça umls -l /proc/self/fd
init
, ele conectará seu stdin, stdout, stderr à tela (um dispositivo tty, que é renderizado na tela) ou em outro lugar.init
é processo1
(No seu sistemasystemd
).