Qual é a diferença entre esses comandos para derrubar um servidor Linux?

65

Leitura "Qual é a diferença entre os comandos Halt e Shutdown?" , Geralmente tenho uma ideia do que o comando shutdown faz, com ou sem as opções -h / -r.

O comando "halt" desliga o sistema para executar o nível 0 do sistema.

O comando "shutdown" executa o desligamento do sistema para executar o nível 1 sem o comando -h ou -r.

E o comando "poweroff" entra no nível de execução 0 ou 1? Essa é a única diferença principal entre esses três comandos?

Win.T
fonte
Relacionadas askubuntu.com/q/578144/216503
heemayl
Estas são algumas das coisas que diferem significativamente, por exemplo, Solaris e FreeBSD. (Lá eles normalmente (quase) imediatamente parar / desligar o servidor, sem alterar os níveis de execução para encerrar o material em primeiro lugar)
Gert van den Berg

Respostas:

120

E agora, o sistema responde.

Você está usando, de acordo com a tag da sua pergunta, o Red Hat Enterprise Linux. Desde a versão 7, isso usou o systemd. Nenhuma das outras respostas está correta para o mundo do systemd; nem são algumas das suposições da sua pergunta.

  • Esqueça os níveis de execução ; eles existem, mas apenas como calços de compatibilidade. A documentação do systemd afirma que o conceito é "obsoleto". Se você está começando a aprender essas coisas em um sistema operacional systemd, não comece por aí.
  • Esqueça a página de manual que marcelm citou; não é do conjunto de ferramentas certo e é uma descrição do comando de outro conjunto de ferramentas, incorreto para o systemd. É o haltcomando dos initutilitários "System 5" da van Smoorenburg .
  • Ignore as declarações às quais /sbin/halté um link simbólico /sbin/reboot; isso não é verdade com o systemd. Não há nenhum rebootprograma separado .
  • Ignore as instruções que haltou rebootinvocam um shutdownprograma com argumentos de linha de comando; eles também não são verdadeiros com o systemd. Não há nenhum shutdownprograma separado .

Todo conjunto de ferramentas de gerenciamento do sistema tem sua versão desses utilitários. systemd, arrivista, nosh , van Smoorenburg inite BSD inittodos têm a sua própria halt, poweroffe assim por diante. Em cada uma delas, sua mecânica é um pouco diferente. O mesmo acontece com as páginas de manual.

No conjunto de ferramentas systemd halt, poweroff,reboot , telinit, e shutdownsão todos os links simbólicos para /bin/systemctl. Eles são todos os calços compatibilidade com versões anteriores, que são simplesmente atalhos para invocar interface de linha de comando primário de systemd: systemctl. Todos eles mapeiam (e de fato são) o mesmo programa único . (Por convenção, o shell diz a que nome foi chamado.)

destinos, não níveis de execução

A maioria desses comandos são atalhos para dizer ao systemd, usando systemctl, para isolar um destino específico . O isolamento é explicado na systemctlpágina de manual (qv), mas, para os fins desta resposta, pode ser considerado como iniciar um alvo e parar qualquer outro. Os destinos padrão usados ​​no systemd estão listados na systemd.specialpágina de manual (8).

Os diagramas na bootuppágina de manual (7) no conjunto de ferramentas systemd, em particular o último, mostram que existem três destinos "finais" relevantes aqui:

  • halt.target- Depois que o sistema atingir o estado de isolar completamente esse destino, ele terá chamado a reboot(RB_HALT_SYSTEM)chamada de sistema. O kernel terá tentado entrar em um programa de monitoramento de ROM ou simplesmente interrompido a CPU (usando qualquer mecanismo apropriado para isso).
  • reboot.target- Depois que o sistema atingir o estado de isolar completamente esse destino, ele terá chamado a reboot(RB_AUTOBOOT)chamada de sistema (ou o equivalente à linha de comando mágica). O kernel terá tentado acionar uma reinicialização.
  • poweroff.target- Depois que o sistema atingir o estado de isolar completamente esse destino, ele terá chamado a reboot(RB_POWER_OFF)chamada de sistema. O kernel terá tentado remover a energia do sistema, se possível.

Essas são as coisas em que você deve pensar como o sistema final declara, não executar níveis. Observe no diagrama que o próprio sistema systemd de destino codifica coisas que são, em outros sistemas, implícitas e não explícitas: como a noção de que cada um desses destinos finais abrange o shutdown.targetdestino, de modo que se descreve serviços que devem ser interrompidos antes do desligamento por tê-los em conflito com o shutdown.targetalvo.

systemctltenta enviar solicitações para systemd-logindquando o usuário que chama não é o superusuário. Ele também passa os desligamentos atrasados ​​para systemd-shutdownd. E algumas atalhos acionam wallnotificações. Essas complexidades à parte, que tornariam essa resposta várias vezes mais longa, supondo que você seja o superusuário no momento e não solicite uma ação agendada:

  • systemctl isolate halt.target tem as taquigrafia:
    • shutdown -H now
    • systemctl halt
    • simples sem adornos halt
  • systemctl isolate reboot.target tem as taquigrafia:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • simples sem adornos reboot
  • systemctl isolate poweroff.target tem as taquigrafia:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • simples sem adornos poweroff
  • systemctl isolate rescue.target tem as taquigrafia:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target tem as taquigrafia:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target tem a abreviação:
    • telinit 5

Após analisar as várias sintaxes diferentes da linha de comando, todas elas acabam nos mesmos caminhos de código dentro do systemctlprograma.

Notas:

  • O comportamento tradicional do sem opção shutdown nowtem sido mudar para o modo de usuário único . Este não é o caso do systemd. rescue.target- o modo de usuário único sendo renomeado para modo de recuperação no systemd - não pode ser acessado com o shutdowncomando
  • telinit realmente não totalmente ignorar todos aqueles e links simbólicos no sistema de arquivos que as páginas do manual descrever. Os mapeamentos citados anteriormente são conectados ao programa em uma tabela.runlevelN.targetdefault.targetsystemctl
  • systemd não tem noção de um nível de execução atual . A operação desses comandos não depende de nenhum "se você estiver no nível de execução N ".
  • A --forceopção para o halt, reboote poweroffcomandos é o mesmo que dizer --force --forceaos systemctl halt, systemctl reboote systemctl poweroffcomandos. Isso faz com que systemctltente ligar reboot()diretamente. Normalmente, apenas tenta isolar alvos.
  • telinitnão é o mesmo que init. São programas diferentes no mundo sistêmico, sendo este último outro nome para o systemdprograma, não para o systemctlprograma. O systemdprograma não é necessariamente compilado com nenhuma compatibilidade de van Smoorenburg e, em alguns sistemas operacionais do sistema, reclama de ter sido chamado incorretamente se alguém tentar .init N

Leitura adicional

JdeBP
fonte
11
Isso é muito genérico para a maioria dos sistemas Linux modernos. Por exemplo, respostas wiert.me/2012/12/30/… Depois de todos esses anos pensando, finalmente entendo o que está acontecendo e por quê.
Jeroen Wiert Pluimers
systemctl rebootdeve ser equivalente a systemctl start reboot.target --job-mode=replace-irreversible. Usar qualquer outro modo de trabalho é menos robusto. unix.stackexchange.com/questions/381739/…
sourcejedi
11
Eu li toda a sua resposta e absorvi o que pude. Uma pergunta permanece, a mesma que eu vim aqui, é systemctl reboota maneira "segura" de reinicializar, por exemplo, init 6qual é a maneira que, de outra forma, seria reiniciar com segurança?
Brian Thomas
25
  • haltinstrui o hardware a parar todas as funções da CPU , mas o deixa em um estado ligado. Isso geralmente significa que alguém precisa reiniciar ou desligar a máquina manualmente pressionando o botão liga / desliga. A maneira específica de conseguir isso é específica da arquitetura, mas, por exemplo, o conjunto de instruções x86 fornece as HLTinstruções que interrompem a unidade central de processamento (CPU) até que a próxima interrupção externa seja acionada.

  • poweroff, como halt, interrompe a CPU, mas também envia um sinal de hardware ACPI que instruirá o sistema a iniciar com um desligamento completo e imediato. Isso é aproximadamente equivalente a pressionar o botão liga / desliga em um computador desktop típico.

Ambos halte poweroffsão geralmente links simbólicos para o rebootexecutável, que normalmente irá invocar a shutdownferramenta com os argumentos apropriados ( -h, -Pou r), dependendo se halt, poweroffou rebootfoi usado para invocar a ferramenta. No entanto, quando a --forceopção for passada para rebootou no nível de execução 0 ou 6, reboota reboot()chamada do sistema será chamada com o próprio código de comando apropriado.

Thomas Nyman
fonte
Thomas, muito obrigado por explicar. Estou interessado em saber o que é fazer um #init 0, não há muitas diferenças, certo?
Win.T
@ Win.T Mudar para o nível de execução 0 usando, por exemplo, /sbin/init 0ou /sbin/telinit 0deve ser o mesmo que interromper o sistema, embora as etapas específicas tomadas dependam do sistema init em questão, como System-V init , upstart ou systemd . Se você estiver executando o RHEL, estará usando o systemd.
Thomas Nyman
4
Nota para si mesmo: sempre que alguém reclamar de uma chamada arcana da API do Win32, mostre a ele a reinicialização (2).
usar o seguinte comando
@immibis Mas a reinicialização é propositalmente misteriosa. Requer as bandeiras mágicas para que seja muito difícil fazer por acidente.
Kevin Cox
4
@ KevinCox Esse é o argumento para exigir bandeiras mágicas. Não é o argumento para aceitar 4 valores diferentes para magic2, nem para se comportar de maneira diferente dentro de um espaço de nome PID, nem para agrupar várias operações pouco relacionadas (como definir o comportamento de reinicialização no Ctrl-Alt-Delete) em uma função.
precisa saber é o seguinte
1

halt, poweroffE shutdown -hsão completamente equivalentes. De fato, parada e desligamento não fazem nada além de chamar shutdown -h. Na página de manual de interrupção / desligamento:

Se parar ou reiniciar for chamado quando o sistema não estiver no nível de execução 0 ou 6, ou seja, quando estiver executando normalmente, o encerramento será invocado (com o sinalizador -h ou -r). Para mais informações, consulte a página de manual shutdown (8).

O desligamento prossegue para desligar o sistema alternando para o nível de execução 0.

Parada e desligamento (e reinicialização) desempenham uma função dupla; quando executados no processo de desligamento (ou seja, no nível de execução 0 ou 6), eles executam as operações de baixo nível necessárias para parar, desligar ou reiniciar fisicamente a máquina, conforme descrito em outra resposta.

marcelm
fonte
2
Qual versão do RHEL você está usando? Normalmente, há uma diferença entre parada e desligamento (embora, por algum tempo, isso não acontecesse em muitas distribuições, mas isso era um bug).
de Bruno