Linux Botas

Acontece que não há muito no processo de inicialização:

1. Um carregador de inicialização encontra a imagem do kernel no disk, carrega-o na memória e inicia-o.
2. O kernel inicializa os dispositivos e seus drivers.
3. O kernel monta o arquivo raizsystem.
4. O kernel inicia um programa chamado init.
5. init coloca o resto dos processos em movimento.
6. Os últimos processos que o init inicia como parte da sequência de inicialização permitem que você faça login.

Identificar cada estágio do processo de inicialização é inestimável para corrigir problemas de inicialização e compreender o system como um todo. Para começar, concentre-se no carregador de boot, que é a tela inicial ou prompt que você recebe depois que o computador faz seu autoteste de inicialização, perguntando qual operação system para correr. Depois de fazer uma escolha, o carregador de inicialização executa o Linux kernel, entregando o controle do system para o kernel.

Há uma discussão detalhada do kernel em outro lugar neste livro, do qual este artigo foi extraído. Este artigo cobre o estágio de inicialização do kernel, o estágio em que o kernel imprime um monte de mensagens sobre o hardware presente no system. O kernel inicia o init logo após exibir uma mensagem proclamando que o kernel montou o arquivo raizsystem:

VFS: montado raiz (arquivos ext2system) somente leitura.

Logo depois, você verá uma mensagem sobre o início do init, seguido por system mensagens de inicialização do serviço e, finalmente, você obtém algum tipo de prompt de login.

NOTA : On Red Hat Linux, a nota de inicialização é especialmente óbvia, porque ela lhe dá as boas-vindas ao Red Hat Linux. ” Todas as mensagens posteriores mostram sucesso ou falha entre colchetes no lado direito da tela.

A maior parte deste capítulo trata do init, porque é a parte da seqüência de inicialização onde você tem mais controle.
o init

Não há nada de especial no init. É um programa como qualquer outro no Linux system, e você o encontrará em / sbin junto com outros system binários. O objetivo principal do init é iniciar e parar outros programas em uma seqüência particular. Tudo que você precisa saber é como essa sequência funciona.

Existem algumas variações diferentes, mas a maioria Linux distribuições usam o System Estilo V discutido aqui. Algumas distribuições usam uma versão mais simples que se assemelha ao BSD init, mas é improvável que você encontre isso.

Runlevels

A qualquer momento em um Linux system, um determinado conjunto básico de processos está em execução. Este estado do machine é chamado de nível de execução e é denotado por um número de 0 a 6. O system passa a maior parte do tempo em um único nível de execução. No entanto, quando você fecha o machine desativado, o init muda para um nível de execução diferente a fim de encerrar o system serviços de forma ordenada e para dizer ao kernel para parar. Ainda outro nível de execução é para usuário único mode, discutido posteriormente.

A maneira mais fácil de controlar os níveis de execução é examinar o arquivo de configuração init, /etc/inittab. Procure uma linha como a seguinte:

ID: 5: initdefault:

Esta linha significa que o default nível de execução no system é 5. Todas as linhas no arquivo inittab assumem este formato, com quatro campos separados por dois-pontos na seguinte ordem:
# Um identificador único (uma string curta, como id no exemplo anterior)
# O (s) número (s) de nível de execução aplicável
# A ação que o init deve realizar (no exemplo anterior, a ação é definir o default nível de execução para 5)
# Um comando para executar (opcional)

Não há comando a ser executado no init anteriordefault exemplo porque um comando não faz sentido no contexto de configuração do default runlevel. Olhe um pouco mais abaixo no inittab, até ver uma linha como esta:

5: 5: aguarde: /etc/rc.d/rc 5

Esta linha aciona a maior parte do system configuração e serviços por meio dos diretórios rc * .d e init.d. Você pode ver que o init está configurado para executar um comando chamado /etc/rc.d/rc 5 quando no nível de execução 5. A ação de espera diz quando e como o init executa o comando: execute rc 5 uma vez quando enternível de execução 5 e, em seguida, aguarde a conclusão desse comando antes de fazer qualquer outra coisa.

Existem várias ações diferentes em addação para o initdefault e espere, especialmente no que diz respeito ao gerenciamento de energia, e a página de manual inittab (5) informa tudo sobre eles. Os que você provavelmente encontrará são explicados nas seções a seguir.

reaparecimento

A ação respawn faz com que o init execute o comando a seguir e, se o comando terminar de ser executado, execute-o novamente. É provável que você veja algo semelhante a esta linha em seu arquivo inittab:

1: 2345: respawn: / sbin / mingetty tty1

Os programas getty fornecem solicitações de login. A linha anterior é para o primeiro console virtual (/ dev / tty1), aquele que você vê quando pressiona ALT-F1 ou CONTROL-ALT-F1. A ação respawn traz o prompt de login de volta depois que você sai.

ctrlem outro lugar

A ctrlação adicional controla o que o system faz quando você pressiona CONTROL-ALT-DELETE em um console virtual. Na maioria systems, este é algum tipo de comando de reinicialização usando o comando shutdown.

sisinite

A ação sysinit é a primeira coisa que o init deve ser executado ao iniciar, antes enterem qualquer runlevels.

Como os processos em níveis de execução começam

Agora você está pronto para aprender como iniciar o system serviços, pouco antes de permitir que você faça login. Lembre-se desta linha inittab anterior:

5: 5: aguarde: /etc/rc.d/rc 5

Esta pequena linha aciona muitos outros programas. rc significa comandos de execução, e você ouvirá as pessoas se referirem aos comandos como scripts, programas ou serviços. Então, onde estão esses comandos, afinal?

Para o nível de execução 5, neste exemplo, os comandos provavelmente estão em /etc/rc.d/rc5.d ou /etc/rc5.d. O nível de execução 1 usa rc1.d, o nível de execução 2 usa rc2.d e assim por diante. Você pode encontrar o seguinte items no diretório rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89etc
S20logoutdS89cron

O comando rc 5 inicia programas neste diretório de nível de execução executando os seguintes comandos:

Iniciar S10sysklogd
S12 início do kernel
S15netstd_init início
início S18netbase
...
S99sshd iniciar

Observe o argumento inicial em cada comando. O S em um nome de comando significa que o comando deve ser executado no início mode, e o número (00 a 99) determina onde na sequência rc inicia o comando.

Os comandos rc * .d geralmente são scripts de shell que iniciam programas em / sbin ou / usr / sbin. Normalmente, você pode descobrir o que um dos comandos realmente faz olhando para o script com less ou outro programa de pager.

Você pode iniciar um desses serviços manualmente. Por exemplo, se você deseja iniciar o programa do servidor da Web httpd manualmente, execute S99httpd start. Da mesma forma, se você precisar interromper um dos serviços quando o machine está ativado, você pode executar o comando no diretório rc * .d com o argumento stop (S99httpd stop, por exemplo).

Alguns diretórios rc*.d contêm comandos que começam com K (para "matar" ou parar mode). Nesse caso, rc executa o comando com o argumento stop em vez de start. É mais provável que você encontre comandos K ​​em níveis de execução que fecham o system para baixo.

Addserviços de instalação e remoção

Se você quiser add, exclua ou modifique serviços nos diretórios rc*.d, você precisa examinar mais de perto os arquivos internos. Uma longa lista revela uma estrutura como esta:

lrwxrwxrwx. . . S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx. . . S12kerneld -> ../init.d/kerneld
lrwxrwxrwx. . . S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx. . . S18netbase -> ../init.d/netbase
...

Os comandos em um diretório rc*.d são, na verdade, links simbólicos para arquivos em um diretório init.d, geralmente em /etc ou /etc/rc.d. Linux distribuições contêm esses links para que possam usar os mesmos scripts de inicialização para todos os níveis de execução. Esta convenção não é de forma alguma um requisito, mas muitas vezes torna a organização um pouco mais fácil.

Para evitar que um dos comandos no diretório init.d seja executado em um determinado nível de execução, você pode pensar em remover o link simbólico no diretório rc * .d apropriado. Isso funciona, mas se você cometer um erro e precisar colocar o link de volta no lugar, poderá ter problemas para lembrar o nome exato do link. Portanto, você não deve remover links nos diretórios rc * .d, mas sim, add um sublinhado (_) no início do nome do link como este:

mv S99httpd _S99httpd

Na hora da inicialização, rc ignora _S99httpd porque não começa com S ou K. Além disso, o nome original ainda é óbvio e você tem acesso rápido ao comando se estiver em apuros e precisar iniciá-lo manualmente.

Para add um serviço, você deve criar um script como os outros no diretório init.d e fazer um link simbólico no diretório rc * .d correto. A maneira mais fácil de escrever um script é examinar os scripts que já estão no init.d, fazer uma cópia de um que você entenda e modificar a cópia.

Quando addao iniciar um serviço, certifique-se de escolher um local apropriado na sequência de inicialização para iniciar o serviço. Se o serviço iniciar muito cedo, ele pode não funcionar devido à dependência de algum outro serviço. Para serviços não essenciais, a maioria systems administrators preferem números nos anos 90, depois da maioria dos serviços que vieram com o system.

Linux as distribuições geralmente vêm com um comando para habilitar e desabilitar serviços nos diretórios rc * .d. Por exemplo, no Debian, o comando é update-rc.d, e no Red Hat Linux, o comando é chkconfig. Interfaces gráficas de usuário também estão disponíveis. O uso desses programas ajuda a manter os diretórios de inicialização consistentes e ajuda nas atualizações.

DICA: Um dos mais comuns Linux installproblemas de ação é um servidor XFree86 configurado incorretamente que liga e desliga, tornando o system inutilizável em consoles. Para interromper esse comportamento, inicialize em usuário único mode e altere seu nível de execução ou serviços de nível de execução. Procure algo que contenha xdm, gdm ou kdm em seus diretórios rc*.d ou em /etc/inittab.

Controlando o init

Ocasionalmente, você precisa dar um pequeno chute no init para dizer a ele para mudar os níveis de execução, para reler o arquivo inittab ou apenas para shut down que o system. Porque o init é sempre o primeiro processo em um system, seu ID de processo é sempre 1.

Você pode controlar o init com telinit. Por exemplo, se você deseja alternar para o nível de execução 3, use este comando:

telin 3

Ao alternar os níveis de execução, o init tenta eliminar quaisquer processos que não estejam no arquivo inittab para o novo nível de execução. Portanto, você deve ter cuidado ao alterar os níveis de execução.

Quando você precisa add ou remover trabalhos de reaparecimento ou fazer qualquer outra alteração no arquivo inittab, você deve informar ao init sobre a alteração e fazer com que ele releia o arquivo. Algumas pessoas usam kill -HUP 1 para dizer ao init para fazer isso. Este método tradicional funciona na maioria das versões do Unix, desde que você o digite corretamente. No entanto, você também pode executar este comando telinit:

telinit q

Você também pode usar telinit s para mudar para monousuário mode.

Desligando

o init também controla como o system desliga e reinicia. A maneira correta de shut down a Linux machine é usar o comando shutdown.

Existem duas maneiras básicas de usar o desligamento. Se você parar o system, fecha o macmine e mantenha-o baixo. Para tornar o macPara parar imediatamente, use este comando:

shutdown-h now

Na maioria modern machines com versões razoavelmente recentes de Linux, uma parada corta a energia para o machine. Você também pode reiniciar o machine. Para uma reinicialização, use -r em vez de -h.

O processo de desligamento leva vários segundos. Você nunca deve reiniciar ou desligar um machine durante esta fase.

No exemplo anterior, agora é a hora de shut down. Este argumento é obrigatório, mas existem muitas maneiras de especificá-lo. Se você quer o machine para cair em algum momento no futuro, uma maneira é usar + n, onde n é o número de minutos que o desligamento deve esperar antes de fazer seu trabalho. Para outro options, veja a página de manual de desligamento (8).

Para tornar o system reinicie em 10 minutos, execute este comando:

desligamento -r +10

On Linux, o desligamento notifica qualquer pessoa conectada que o machine está caindo, mas faz pouco trabalho real. Se você especificar um horário diferente de agora, o desligamento criará um arquivo chamado /etc/nologin. Quando este arquivo está presente, o system proíbe logins de qualquer pessoa, exceto o superusuário.

Quando system o tempo de desligamento finalmente chega, desligamento diz ao init para mudar para o nível de execução 0 para uma parada e o nível de execução 6 para uma reinicialização. Quando init enterNo nível de execução 0 ou 6, ocorre todas as opções a seguir, que você pode verificar observando os scripts dentro de rc0.d e rc6.d:

1. O init elimina todos os processos possíveis (como faria ao alternar para qualquer outro nível de execução).

# Os comandos iniciais rc0.d / rc6.d são executados, travando system arquivos no lugar e fazendo outras preparações para o desligamento.
# Os próximos comandos rc0.d/rc6.d desmontam todos os arquivossystems diferente da raiz.
# Outros comandos rc0.d/rc6.d remontam o arquivo raizsystem somente leitura.
# Ainda mais comandos rc0.d/rc6.d gravam todos os dados armazenados em buffer no arquivosystem com o programa de sincronização.
# Os comandos rc0.d / rc6.d finais dizem ao kernel para reinicializar ou parar com o programa de reinicialização, parada ou desligamento.

Os programas de reinicialização e parada se comportam de maneira diferente para cada nível de execução, podendo causar confusão. por default, esses programas chamam o desligamento com -r ou -h options, mas se o system já está no nível de execução de interrupção ou reinicialização, os programas dizem ao kernel para desligar-se imediatamente. Se você realmente deseja fechar seu macpara desligar com pressa (desconsiderando qualquer possível dano de um desligamento desordenado), use a opção -f.

Apaixonado por tecnologia, escrevo com prazer no StealthSettings.com desde 2006. Tenho uma ampla experiência em sistemas operacionais: macOS, Windows e Linux, assim como em linguagens de programação e plataformas de blogs (WordPress) e para lojas online (WooCommerce, Magento, PrestaShop).

Deixe um comentário