
Como todos sabemos, quando reiniciamos, desligamos ou inicializamos um sistema, alguma mensagem será impressa na tela, aqui está uma captura:
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
É 3467
um programa Olá Mundo, 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 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, 0
e 1
não 2
existe .
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 init
e 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, /proc
estejam 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
init
o 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
/proc
receberia um descritor de arquivo, tentaria procurá-lo e/proc
retornaria um descritor de arquivo…)./proc
é apenas uma visão, só é necessária para processos que reportam outros processos. - O descritor de arquivo 255
ls
em 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
- Quando o kernel for iniciado,
init
ele conectará seu stdin, stdout, stderr à tela (um dispositivo tty, que é renderizado na tela) ou a algum outro lugar. init
é o processo1
(no seu sistemasystemd
).