Esta é uma pergunta que pode ser um pouco difícil de responder — dada a característica difusa deste tipo de software.
No sistema operacional Debian, que vem fazendo a transição desde a versão 7.0 Wheezy – e a deve concluir no 9.0 Stretch – a resposta pode não ser fácil.
Mesmo em outros sistemas operacionais, pode ser difícil obter respostas definitivas a este questionamento.
Este post pode não trazer respostas prontas para a pergunta, mas pode ajudar a investigar e, caso não resolva muita coisa para você, pelo menos espero ter sido útil sob de vista de aumentar o seu conhecimento sobre o sistema.
Como a maioria dos softwares, no Linux, é possível saber seu nome e versão, executando o binário acompanhado da opção ‘–version’.
No Debian 9, existe o init e o systemd. Mas só o último vai retornar algum valor interessante:
/sbin/init --version
/sbin/init: unrecognized option '--version'
Isto acontece por que este init é um link (atalho) para o systemd. Veja a prova:
ls -lah /sbin/init
lrwxrwxrwx 1 root root 20 Jul 8 08:04 /sbin/init -> /lib/systemd/systemd
Já que ficou claro, que temos o systemd instalado, veja como obter sua versão:
systemd --version
systemd 230 +PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
Como é possível observar, no meu sistema, o systemd instalado é a versão 230.
Parte da confusão, pode ser causada por este processo de transição atual. Muitos programas ainda dependem de chamar o “init” — e, por isso, pelo menos o nome tem que estar presente.
Use o comando ps, para determinar o aplicativo com o PID 1:
ps aux | head -n 5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 203156 7716 ? Ss 07:10 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 07:10 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 07:10 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 07:10 0:00 [kworker/0:0H]
Você pode obter o mesmo resultado no FreeBSD — e ambos os sistemas, tradicionalmente, usam inits bem diferentes:
ps -p 1
PID TT STAT TIME COMMAND 1 - ILs 0:00.48 /sbin/init --
A maior dificuldade é que você já precisa saber de antemão qual o sistema init usado, para saber onde encontrar o seu binário e, só então, inquirir sobre sua versão.
Mas é possível investigar o seu sistema para conseguir determinar uma quantidade maior de informações a este respeito.
Verifique no /proc
O sistema de arquivos /proc pode ter esta resposta.
Já escrevemos sobre como obter informações do sistema através do /proc, caso você queira se aprofundar mais no assunto.
A maneira de inquirir sobre o init, por este método, funciona assim:
sudo stat /proc/1/exe [sudo] senha para justincase:
E olhe o resultado, na primeira linha:
File: '/proc/1/exe' -> '/lib/systemd/systemd' Size: 0 Blocks: 0 IO Block: 1024 ligação simbólica Device: 4h/4d Inode: 137028 Links: 1 Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-08-12 10:44:18.292096235 -0300 Modify: 2016-08-12 10:44:18.256095478 -0300 Change: 2016-08-12 10:44:18.256095478 -0300 Birth: -
Como vimos, até agora, a presença do /sbin/init ou do /etc/init.d, não é indicativo suficiente para determinar qual o sistema usado — uma vez que sempre estará presente para manter compatibilidades, mesmo que seja apenas como um link.
Vamos abordar a questão de forma diferente. Nos tópicos, que seguem, vamos procurar especificamente pelos (mais usados) systemd, upstart, System 5 e o OpenRC.
Como detectar o System 5 init
No Debian, uma das formas de detectar (ironicamente) a ausência do System 5 init é estabelecer a ausência do /etc/inittab.
Observe, contudo que este é um efeito colateral da metodologia Debian de empacotar coisas como o /etc/inittab.
Mesmo que você desinstale o System 5 init, o /etc/inittab vai continuar aí, no seu sistema.
Ou seja, se o arquivo de configuração estiver aí, significa que o System 5 init está ou já esteve presente.
Como detectar o systemd
Além do método descrito, lá em cima, é possível detectar se ele está ativo no sistema através da existência do /run/systemd/system. Trata-se de um diretório, dentro do /run, usado pelo próprio systemd e criado na inicialização.
ls /run/systemd/
ask-password generator.late initctl netif seats system cgroups-agent inaccessible journal notify sessions transient generator inhibit machines private shutdown users
Esta checagem pode ser falha, caso você tenha o uselessd instalado — uma vez que ele cria os mesmos arquivos.
Como detectar o nosh
O system-manager ou gestor de sistemas do nosh, cria um diretório /run/system-manager, o que pode ser insuficiente para determinar que é ele mesmo quem está instalado no seu sistema.
Adicione a isto características que dificultam sua detecção:
- o projeto do gestor de sistemas do nosh não prevê a criação de pipes ou soquetes no sistema de arquivos. Além disto, não tem uma API RPC.
- Seu gestor de serviços, convencionalmente, tem uma soquete de API em /run/service-manager/control. Mas o que pode confundir você é que ele pode ser executado sob outro gestor de sistemas. Nesta situação, as informações podem levar conclusões equivocadas.
Como detectar o upstart
O initctl do upstart faz sua própria chamada de API sobre o D-Bus e a verificação oficial consiste em determinar se é possível rodar o initctl e se sua saída contém a string “upstart” em algum ponto (use o comando grep para encontrá-la).
Mas tal como no systemd:
- Não há garantia de que a API irá permanecer a mesma amanhã.
- Não há garantia de que algumas questões de compatibilidades irão permanecer ou não, no futuro.
Conclusão
O “jogo” ainda não está definido. Softwares desta categoria, mais do que nunca, estão em constante mudança e o que é verdadeiro hoje (veja a data deste post), pode ter significado nulo amanhã.
Se você tiver alguma dica, contudo, sobre o assunto, compartilhe com os leitores deste site, nos comentários.
3 replies on “Como verificar o init system instalado no meu sistema”
O comando pstree mostra o init usado pelo sistema.
Brabo, simples e direto. Valeu
Bastante esclarecedor o post.