Estou tentando entender os níveis de execução no Unix, descobri que o nível de execução 6 é o estado de reinicialização. Então, tentei mudar para executar o nível 6 usando o comando telinit 6
e funcionou da mesma forma que reboot
no meu computador. Estou usando o Kali Linux, então o sudo não é necessário.
A alteração/troca de runelevels é apenas comandos para invocar algum processo? Quando estamos inicializando, reiniciando ou desligando, estamos apenas alterando os níveis de execução?
Existe um sistema init no Linux chamado SysVinit que é modelado a partir do sistema init do UNIX System V. Algumas versões do Linux ainda usam este sistema, mantêm a compatibilidade com ele, como SysVcompat do Systemd ou o substituíram em parte (sem sysvcompat, mas ainda usam scripts sysv como Debian) ou substituíram tudo junto, como sistemas Systemd "puros".
É o SysV que essencialmente implementa o conceito de níveis de execução. Os scripts são colocados em /etc/rc{runlevel}.d/ onde runlevel é o runlevel. O SysV também define o comportamento de ordenação padrão dos níveis de execução, incluindo para qual deles ir por padrão. Cada script em cada nível de execução é executado com suas funções de inicialização ou desligamento, dependendo se esse nível de execução está subindo ou descendo. Portanto, em um sistema sysvinit, sim, quando você inicializa seu primeiro /sbin/init em execução e esse programa subsequentemente executa as funções de inicialização de todos os scripts em cada nível de execução. Também devo apontar que você pode ter mais scripts instalados do que aqueles vinculados em /etc/rc* e é assim que você ativa e desativa os scripts e, portanto, os serviços que eles controlam.
Os sistemas que não usam o sysv não precisam fazer isso como o systemd. Simplificando, o systemd possui unidades que definem suas dependências, como outros serviços, pontos de montagem, temporizadores ou alvos como "network.target". Em vez de entrar em mais detalhes sobre o systemd, direi apenas que o systemd mantém total compatibilidade com os scripts sysv, mas não necessariamente com seus níveis de execução. Além disso, o init pode ser executado primeiro ou o systemd pode ser executado e depois executar todos os scripts do sysv. Ou sua distro pode ter substituído todos os seus scripts sysv por unidades systemd. A maioria das distros terá scripts de compatibilidade instalados para que coisas como
reboot
outelinit
funcionem através do systemd.No
init
sistema operacional baseado/sbin/telinit
está vinculado a/sbin/init
e nosystemed
sistema operacional baseado está vinculado a/sbin/systemed
. Portanto, é uma maneira de se comunicar cominit
ousystemed
software semelhante.O resultado de
telinit 6
ereboot
é o mesmo, mas eles realizam um pensamento diferente.Citando de http://www.tutorialspoint.com/unix_commands/init.htm
Portanto, mudar
runlevel
não é equivalente arebooting
oupower off
.No
init
SO baseadorunlevel
é mantido permanentemente por/etc/inittab
. Ao iniciar, o sistemainit
lê o arquivo para decidir quais grupos de processos iniciar. Um nível de execução 6 diz para não iniciar nenhum processo e reiniciar.Uma mudança
/etc/inittab
é permanente. Se o arquivo for modificadoinit
, o nível de execução será alterado na reinicialização e permanecerá nele até novas modificações do arquivo.O efeito
telinit
é único e sem reinicialização. Após a reinicializaçãoinit
, leia novamente/etc/inittab
e inicie o nível de execução de acordo.Agora, o nível de execução 6 diz
init
para matar todos os processos filhos e reiniciar. Comtelinit 6
init
mate todos os processos filhos e reinicie. Ao emitirreboot
o comando, o init faz o mesmo. Mas isso não significa que alterar o nível de execução é equivalente a reiniciar. Porque se você alterar o nível de execução do seu sistema para 6 permanentemente/etc/inittab
, ele continuará reiniciando.Se você usar
telinit 6
para reiniciar o sistema em vezreboot
de comandar, não fará nenhuma diferença.