Linux tux

Como verificar o init system instalado no meu sistema

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.
screenshot google search

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

screenshot ls systemd run
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.

Referências

http://unix.stackexchange.com/questions/196166/how-to-find-out-if-a-system-uses-sysv-upstart-or-systemd-initsystem.

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia. Fã de séries, como "Rick and Morty" e "BoJack Horseman". Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *