Pesquisa de site

LFCS: Gerenciando processos e serviços de inicialização do sistema (SysVinit, Systemd e Upstart) - Parte 7


Há alguns meses, a Linux Foundation anunciou a certificação LFCS (Linux Foundation Certified Sysadmin), um programa novo e interessante cujo objetivo é permitir que indivíduos de todos os cantos do mundo obtenha certificação na execução de tarefas de administração de sistema básicas a intermediárias em sistemas Linux. Isto inclui o suporte a sistemas e serviços já em execução, juntamente com a descoberta e análise de problemas em primeira mão, além da capacidade de decidir quando levantar questões às equipes de engenharia.

O vídeo a seguir descreve uma breve introdução ao Programa de Certificação da Linux Foundation.

Esta postagem é a Parte 7 de uma série de 10 tutoriais, aqui nesta parte explicaremos como gerenciar processos e serviços de inicialização do sistema Linux, necessários para o exame de certificação LFCS.

Gerenciando o processo de inicialização do Linux

O processo de inicialização de um sistema Linux consiste em diversas fases, cada uma representada por um componente diferente. O diagrama a seguir resume brevemente o processo de inicialização e mostra todos os principais componentes envolvidos.

Quando você pressiona o botão Power na sua máquina, o firmware que está armazenado em um chip EEPROM na placa-mãe inicializa o POST ( Autoteste de inicialização) para verificar o estado dos recursos de hardware do sistema. Quando o POST terminar, o firmware então pesquisa e carrega o carregador de inicialização do 1º estágio, localizado no MBR ou no EFI partição do primeiro disco disponível e dá controle a ele.

Método MBR

O MBR está localizado no primeiro setor do disco marcado como inicializável nas configurações do BIOS e tem 512 bytes de tamanho.

  1. Primeiros 446 bytes: O bootloader contém código executável e texto de mensagem de erro.
  2. Próximos 64 bytes: A tabela de partição contém um registro para cada uma das quatro partições (primária ou estendida). Entre outras coisas, cada registro indica o status (ativo/não ativo), tamanho e setores inicial/final de cada partição.
  3. Últimos 2 bytes: O número mágico serve como uma verificação de validação do MBR.

O comando a seguir executa um backup do MBR (neste exemplo, /dev/sda é o primeiro disco rígido). O arquivo resultante, mbr.bkp pode ser útil caso a tabela de partição seja corrompida, por exemplo, tornando o sistema não inicializável.

Claro, para utilizá-lo mais tarde, se necessário, precisaremos salvá-lo e armazená-lo em outro lugar (como uma unidade USB, por exemplo). Esse arquivo nos ajudará a restaurar o MBR e nos ajudará novamente se, e somente se, não alterarmos o layout do disco rígido enquanto isso.

Backup MBR
dd if=/dev/sda of=mbr.bkp bs=512 count=1

Restaurando MBR
dd if=mbr.bkp of=/dev/sda bs=512 count=1

Método EFI/UEFI

Para sistemas que usam o método EFI/UEFI, o firmware UEFI lê suas configurações para determinar qual aplicativo UEFI deve ser iniciado e de onde (ou seja, em qual disco e partição o partição EFI está localizada).

Em seguida, o carregador de inicialização de 2º estágio (também conhecido como gerenciador de inicialização) é carregado e executado. GRUB [GRand Unified Boot] é o gerenciador de inicialização usado com mais frequência no Linux. Uma das duas versões distintas pode ser encontrada na maioria dos sistemas usados atualmente.

  1. Arquivo de configuração herdado do GRUB: /boot/grub/menu.lst (distribuições mais antigas, não suportadas por firmwares EFI/UEFI).
  2. Arquivo de configuração GRUB2: provavelmente, /etc/default/grub.

Embora os objetivos do exame LFCS não solicitem explicitamente conhecimento sobre os componentes internos do GRUB, se você for corajoso e puder se dar ao luxo de bagunçar seu sistema (você pode tentar primeiro em uma máquina virtual, por precaução), você precisa executar.

update-grub

Como root após modificar a configuração do GRUB para aplicar as alterações.

Basicamente, o GRUB carrega o kernel padrão e a imagem initrd ou initramfs. Em poucas palavras, initrd ou initramfs ajudam a realizar a detecção de hardware, o carregamento do módulo do kernel e a descoberta de dispositivos necessários para montar o sistema de arquivos raiz real.

Uma vez que o sistema de arquivos raiz real esteja ativo, o kernel executa o gerenciador de sistema e serviço (init ou systemd, cuja identificação do processo ou PID é sempre 1) para iniciar o processo normal do usuário. processo de inicialização espacial para apresentar uma interface de usuário.

Tanto init quanto systemd são daemons (processos em segundo plano) que gerenciam outros daemons, como o primeiro serviço a iniciar (durante a inicialização) e o último serviço a terminar (durante o desligamento).

Iniciando serviços (SysVinit)

O conceito de níveis de execução no Linux especifica diferentes maneiras de usar um sistema, controlando quais serviços estão em execução. Em outras palavras, um nível de execução controla quais tarefas podem ser realizadas no estado de execução atual=nível de execução (e quais não podem).

Tradicionalmente, esse processo de inicialização era realizado com base em convenções originadas no System V UNIX, com o sistema executando coleções de scripts que iniciam e param serviços conforme a máquina entra em um nível de execução específico (que, em outras palavras, , é um modo diferente de executar o sistema).

Dentro de cada nível de execução, serviços individuais podem ser configurados para execução ou para serem encerrados se estiverem em execução. As versões mais recentes de algumas distribuições importantes estão se afastando do padrão System V em favor de um novo serviço e gerenciador de sistema chamado systemd (que significa system daemon), mas geralmente suporta comandos sysv para fins de compatibilidade. Isso significa que você pode executar a maioria das ferramentas init sysv conhecidas em uma distribuição baseada em systemd.

Leia também: Por que ‘systemd’ substitui ‘init’ no Linux

Além de iniciar o processo do sistema, o init consulta o arquivo /etc/inittab para decidir qual nível de execução deve ser inserido.

Runlevel

Descrição

0

Pare o sistema. O nível de execução 0 é um estado de transição especial usado para desligar o sistema rapidamente.

1

Também apelidado de s ou S, esse nível de execução às vezes é chamado de modo de manutenção. Quais serviços, se houver, são iniciados neste nível de execução variam de acordo com a distribuição. É normalmente usado para manutenção de sistema de baixo nível que pode ser prejudicada pela operação normal do sistema.

2

Multi usuário. Em sistemas Debian e derivados, este é o nível de execução padrão e inclui -se disponível- um login gráfico. Em sistemas baseados em Red-Hat, este é o modo multiusuário sem rede.

3

Em sistemas baseados em Red-Hat, este é o modo multiusuário padrão, que executa tudo, exceto o ambiente gráfico. Este nível de execução e os níveis 4 e 5 geralmente não são usados em sistemas baseados em Debian.

4

Normalmente não utilizado por padrão e, portanto, disponível para personalização.

5

Em sistemas baseados em Red-Hat, modo multiusuário completo com login GUI. Este nível de execução é semelhante ao nível 3, mas com um login GUI disponível.

6

Reinicie o sistema.

Para alternar entre os níveis de execução, podemos simplesmente emitir uma alteração no nível de execução usando o comando init: init N (onde N é um dos níveis de execução listados acima). Observe que esta não é a maneira recomendada de levar um sistema em execução para um nível de execução diferente porque não avisa os usuários logados existentes (fazendo com que eles percam o trabalho e os processos sejam encerrados de forma anormal).

Em vez disso, o comando shutdown deve ser usado para reiniciar o sistema (que primeiro envia uma mensagem de aviso para todos os usuários logados e bloqueia quaisquer logins adicionais; em seguida, sinaliza o init para alternar os níveis de execução); entretanto, o nível de execução padrão (aquele em que o sistema inicializará) deve ser editado primeiro no arquivo /etc/inittab.

Por esse motivo, siga estes passos para alternar corretamente entre os níveis de execução. Como root, procure a seguinte linha em /etc/inittab.

id:2:initdefault:

e altere o número 2 para o nível de execução desejado com seu editor de texto preferido, como o vim (descrito em Como usar o editor vi/vim no Linux – Parte 2 desta série).

Em seguida, execute como root.

shutdown -r now

Esse último comando reiniciará o sistema, fazendo com que ele inicie no nível de execução especificado durante a próxima inicialização, e executará os scripts localizados em /etc/rc[runlevel].d diretório para decidir quais serviços devem ser iniciados e quais não devem. Por exemplo, para o nível de execução 2 no sistema a seguir.

Gerenciar serviços usando chkconfig

Para ativar ou desativar os serviços do sistema na inicialização, usaremos o comando chkconfig no CentOS/openSUSE e sysv-rc-conf no Debian e derivados. Esta ferramenta também pode nos mostrar qual é o estado pré-configurado de um serviço para um nível de execução específico.

Leia também: Como interromper e desativar serviços indesejados no Linux

Listando a configuração de nível de execução para um serviço.

chkconfig --list [service name]
chkconfig --list postfix
chkconfig --list mysqld

Na imagem acima podemos ver que o postfix está configurado para iniciar quando o sistema entra nos níveis de execução 2 até 5, enquanto o mysqld estará em execução por padrão para os níveis de execução 2 a 4. Agora suponha que este não seja o comportamento esperado.

Por exemplo, precisamos ativar o mysqld para o nível de execução 5 também e desativar o postfix para os níveis de execução 4 e 5. Aqui está o que faríamos em cada caso (executar o seguindo comandos como root).

Habilitando um serviço para um nível de execução específico
chkconfig --level [level(s)] service on
chkconfig --level 5 mysqld on
Desabilitando um serviço para níveis de execução específicos
chkconfig --level [level(s)] service off
chkconfig --level 45 postfix off

Agora realizaremos tarefas semelhantes em um sistema baseado em Debian usando sysv-rc-conf.

Gerenciar serviços usando sysv-rc-conf

Configurar um serviço para iniciar automaticamente em um nível de execução específico e impedir que ele seja iniciado em todos os outros.

1. Vamos usar o seguinte comando para ver quais são os níveis de execução onde mdadm está configurado para iniciar.

ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

2. Usaremos sysv-rc-conf para evitar que o mdadm seja iniciado em todos os níveis de execução, exceto 2. Basta marcar ou desmarcar (com a barra de espaço) conforme desejado (você pode mover para cima, para baixo, para a esquerda e para a direita com as teclas de seta).

sysv-rc-conf

Em seguida, pressione q para sair.

3. Reiniciaremos o sistema e executaremos novamente o comando do PASSO 1.

ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

Na imagem acima podemos ver que mdadm está configurado para iniciar apenas no nível de execução 2.

E quanto ao systemd?

systemd é outro serviço e gerenciador de sistema que está sendo adotado por diversas distribuições Linux importantes. Seu objetivo é permitir que mais processamentos sejam feitos em paralelo durante a inicialização do sistema (ao contrário do sysvinit, que sempre tende a ser mais lento porque inicia um processo por vez, verifica se um depende do outro e espera por daemons para serem iniciados para que mais serviços possam ser iniciados) e para servir como um gerenciamento dinâmico de recursos para um sistema em execução.

Assim, os serviços são iniciados quando necessário (para evitar o consumo de recursos do sistema) em vez de serem iniciados sem um motivo sólido durante a inicialização.

Visualizando o status de todos os processos em execução em seu sistema, tanto os serviços systemd nativos quanto os SysV, execute o seguinte comando.

systemctl

A coluna LOAD mostra se a definição da unidade (consulte a coluna UNIT, que mostra o serviço ou qualquer coisa mantida pelo systemd) foi carregada corretamente, enquanto o ACTIVE< As colunas e SUB mostram o status atual de tal unidade.

Exibindo informações sobre o status atual de um serviço

Quando a coluna ATIVO indica que o status de uma unidade é diferente de ativo, podemos verificar o que aconteceu usando.

systemctl status [unit]

Por exemplo, na imagem acima, media-samba.mount está em estado de falha. Vamos correr.

systemctl status media-samba.mount

Podemos ver que media-samba.mount falhou porque o processo de montagem no host dev1 não conseguiu encontrar o compartilhamento de rede em //192.168.0.10/gacanepa.

Iniciando ou interrompendo serviços

Assim que o compartilhamento de rede //192.168.0.10/gacanepa estiver disponível, vamos tentar iniciar, parar e finalmente reiniciar a unidade media-samba.mount. Após realizar cada ação, vamos executar systemctl status media-samba.mount para verificar seu status.

systemctl start media-samba.mount
systemctl status media-samba.mount
systemctl stop media-samba.mount
systemctl restart media-samba.mount
systemctl status media-samba.mount

Habilitando ou desabilitando um serviço para iniciar durante a inicialização

Em systemd você pode ativar ou desativar um serviço durante a inicialização.

systemctl enable [service] 		# enable a service 
systemctl disable [service] 		# prevent a service from starting at boot

O processo de habilitar ou desabilitar um serviço para iniciar automaticamente na inicialização consiste em adicionar ou remover links simbólicos no diretório /etc/systemd/system/multi-user.target.wants.

Alternativamente, você pode descobrir o status atual de um serviço (habilitado ou desabilitado) com o comando.

systemctl is-enabled [service]

Por exemplo,

systemctl is-enabled postfix.service

Além disso, você pode reiniciar ou desligar o sistema com.

systemctl reboot
systemctl shutdown

Subir na vida

Upstart é um substituto baseado em eventos para o daemon /sbin/init e nasceu da necessidade de iniciar serviços apenas quando eles são necessários (também supervisionando-os enquanto eles estão em execução) e manipulando eventos conforme eles ocorrem, superando assim o sistema sysvinit clássico baseado em dependências.

Foi originalmente desenvolvido para a distribuição Ubuntu, mas é usado no Red Hat Enterprise Linux 6.0. Embora fosse planejado para ser adequado para implantação em todas as distribuições Linux como um substituto para o sysvinit, com o tempo ele foi ofuscado pelo systemd. Em 14 de fevereiro de 2014, Mark Shuttleworth (fundador da Canonical Ltd.) anunciou que versões futuras do Ubuntu usariam o systemd como o daemon de inicialização padrão.

Como o script de inicialização do SysV para sistema é tão comum há muito tempo, um grande número de pacotes de software inclui scripts de inicialização do SysV. Para acomodar esses pacotes, o Upstart fornece um modo de compatibilidade: ele executa scripts de inicialização SysV nos locais habituais (/etc/rc.d/rc?.d, /etc/init.d/ rc?.d, /etc/rc?.d ou um local semelhante). Assim, se instalarmos um pacote que ainda não inclui um script de configuração do Upstart, ele ainda deverá ser iniciado da maneira usual.

Além disso, se tivermos instalado utilitários como chkconfig, você poderá usá-los para gerenciar seus serviços baseados em SysV, assim como faríamos em sistemas baseados em sysvinit.

Os scripts Upstart também suportam iniciar ou interromper serviços com base em uma variedade maior de ações do que os scripts de inicialização SysV; por exemplo, o Upstart pode iniciar um serviço sempre que um dispositivo de hardware específico estiver conectado.

Um sistema que usa Upstart e seus scripts nativos substitui exclusivamente o arquivo /etc/inittab e os diretórios de script de inicialização SysV específicos do nível de execução por .conf scripts no diretório /etc/init.

Esses scripts *.conf (também conhecidos como definições de tarefas) geralmente consistem no seguinte:

    1. Descrição do processo.
    2. Níveis de execução onde o processo deve ser executado ou eventos que devem acioná-lo.
    3. Níveis de execução onde o processo deve ser interrompido ou eventos que devem interrompê-lo.
    4. Opções.
    5. Comando para iniciar o processo.

Por exemplo,

My test service - Upstart script demo description "Here goes the description of 'My test service'" author "Dave Null <[email >"
Stanzas

#
Stanzas define when and how a process is started and stopped
See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
When to start the service
start on runlevel [2345]
When to stop the service
stop on runlevel [016]
Automatically restart process in case of crash
respawn
Specify working directory
chdir /home/dave/myfiles
Specify the process/command (add arguments if needed) to run
exec bash backup.sh arg1 arg2

Para aplicar as alterações, você precisará informar ao upstart para recarregar sua configuração.

initctl reload-configuration

Em seguida, inicie seu trabalho digitando o seguinte comando.

sudo start yourjobname

Onde yourjobname é o nome do trabalho que foi adicionado anteriormente com o script yourjobname.conf.

Um guia de referência mais completo e detalhado do Upstart está disponível no site do projeto no menu “Cookbook”.

Resumo

É necessário ter conhecimento do processo de inicialização do Linux para ajudá-lo nas tarefas de solução de problemas, bem como na adaptação do desempenho do computador e da execução de serviços às suas necessidades.

Neste artigo analisamos o que acontece desde o momento em que você pressiona o botão Power para ligar a máquina até obter uma interface de usuário totalmente operacional. Espero que você tenha aprendido a lê-lo tanto quanto eu ao prepará-lo. Sinta-se à vontade para deixar seus comentários ou perguntas abaixo. Estamos sempre ansiosos para ouvir nossos leitores!