Série RHCSA: Gerenciamento de Processos no RHEL 7: Inicialização, Desligamento e Tudo Mais Entre – Parte 5

Vamos começar este artigo com uma revisão geral e breve do que acontece desde o momento em que você pressiona o botão Power para ligar seu servidor RHEL 7 até ser apresentado com a tela de login em uma interface de linha de comando.

Linux Boot Process

Por favor, note que:

1. os mesmos princípios básicos se aplicam, com talvez pequenas modificações, a outras distribuições Linux também, e
2. a descrição a seguir não tem a intenção de representar uma explicação exaustiva do processo de inicialização, mas apenas os fundamentos.

Processo de inicialização do Linux

1. O POST (Power On Self Test) inicializa e realiza verificações de hardware.

2. Quando o POST termina, o controle do sistema é passado para o primeiro estágio do carregador de inicialização, que está armazenado no setor de inicialização de um dos discos rígidos (para sistemas mais antigos que usam BIOS e MBR), ou uma partição dedicada (U)EFI.

3. O primeiro estágio do carregador de inicialização então carrega o segundo estágio do carregador de inicialização, mais comumente GRUB (GRand Unified Boot Loader), que reside dentro de /boot, que por sua vez carrega o kernel e o sistema de arquivos inicial baseado em RAM (também conhecido como initramfs, que contém programas e arquivos binários que realizam as ações necessárias para, em última análise, montar o sistema de arquivos raiz real).

4. Somos apresentados com uma tela de inicialização que nos permite escolher um sistema operacional e um kernel para inicializar:

Boot Menu Screen

5. O kernel configura o hardware conectado ao sistema e, uma vez que o sistema de arquivos raiz tenha sido montado, inicia o processo com PID 1, que por sua vez inicializará outros processos e nos apresentará um prompt de login.

Observação: Se desejarmos fazer isso em um momento posterior, podemos examinar os detalhes desse processo usando o comando dmesg e filtrando sua saída usando as ferramentas que explicamos em artigos anteriores desta série.

Login Screen and Process PID

No exemplo acima, usamos o conhecido comando ps para exibir uma lista de processos atuais cujo processo pai (ou em outras palavras, o processo que os iniciou) é o systemd (o gerenciador de sistema e serviço para o qual a maioria das distribuições Linux modernas mudou) durante a inicialização do sistema:

# ps -o ppid,pid,uname,comm --ppid=1

Lembre-se de que a opção -o (abreviação de –format) permite que você apresente a saída do ps em um formato personalizado para atender às suas necessidades usando as palavras-chave especificadas na seção ESPECIFICADORES DE FORMATO PADRÃO em man ps.

Outro caso em que você desejará definir a saída do ps em vez de usar o padrão é quando precisa encontrar processos que estão causando uma carga significativa na CPU e/ou memória e classificá-los adequadamente:

# ps aux --sort=+pcpu              # Sort by %CPU (ascending)
# ps aux --sort=-pcpu              # Sort by %CPU (descending)
# ps aux --sort=+pmem              # Sort by %MEM (ascending)
# ps aux --sort=-pmem              # Sort by %MEM (descending)
# ps aux --sort=+pcpu,-pmem        # Combine sort by %CPU (ascending) and %MEM (descending)
Customize ps Command Output

Uma Introdução ao SystemD

Poucas decisões no mundo Linux causaram mais controvérsias do que a adoção do systemd pelas principais distribuições Linux. Os defensores do systemd citam como suas principais vantagens os seguintes fatos:

Leia também: A História por Trás de ‘init’ e ‘systemd’

1. O systemd permite que mais processamento seja feito em paralelo durante a inicialização do sistema (ao contrário do antigo SysVinit, que sempre tende a ser mais lento porque inicia processos um por um, verifica se um depende do outro e depois espera que os daemons sejam lançados para que mais serviços possam iniciar), e

2. Funciona como gerenciamento dinâmico de recursos em um sistema em execução. Assim, os serviços são iniciados quando necessário (para evitar o consumo de recursos do sistema se eles não estiverem sendo usados) em vez de serem lançados sem motivo válido durante a inicialização.

3. Compatibilidade com scripts SysVinit antigos.

O systemd é controlado pela utilidade systemctl. Se você vem de um ambiente SysVinit, é provável que esteja familiarizado com:

  1. a ferramenta service, que – nessas sistemas mais antigos – era usada para gerenciar scripts SysVinit, e
  2. a utilidade chkconfig, que servia para atualizar e consultar informações de runlevel para serviços do sistema.
  3. Desligar, que você deve ter usado várias vezes para reiniciar ou desligar um sistema em execução.

A tabela a seguir mostra as semelhanças entre o uso dessas ferramentas legadas e systemctl:

Legacy tool Systemctl equivalent Description
service name start systemctl start name Start name (where name is a service)
service name stop systemctl stop name Stop name
service name condrestart systemctl try-restart name Restarts name (if it’s already running)
service name restart systemctl restart name Restarts name
service name reload systemctl reload name Reloads the configuration for name
service name status systemctl status name Displays the current status of name
service –status-all systemctl Displays the status of all current services
chkconfig name on systemctl enable name Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory.
chkconfig name off systemctl disable name Disables name to run on startup as specified in the unit file (the file to which the symlink points)
chkconfig –list name systemctl is-enabled name Verify whether name (a specific service) is currently enabled
chkconfig –list systemctl –type=service Displays all services and tells whether they are enabled or disabled
shutdown -h now systemctl poweroff Power-off the machine (halt)
shutdown -r now systemctl reboot Reboot the system

Systemd também introduziu os conceitos de unidades (que podem ser um serviço, um ponto de montagem, um dispositivo ou um soquete de rede) e alvos (que é como o systemd gerencia o início de vários processos relacionados ao mesmo tempo e pode ser considerado – embora não igual – como o equivalente aos níveis de execução em sistemas baseados em SysVinit.

Resumindo

Outras tarefas relacionadas com o gerenciamento de processos incluem, mas não estão limitadas a, a capacidade de:

1. Ajustar a prioridade de execução no que diz respeito ao uso de recursos do sistema de um processo:

Isto é realizado através do utilitário renice, que altera a prioridade de agendamento de um ou mais processos em execução. Em termos simples, a prioridade de agendamento é um recurso que permite ao kernel (presente nas versões => 2.6) alocar recursos do sistema conforme a prioridade de execução atribuída (também conhecida como “nice”, em uma faixa de -20 a 19) de um determinado processo.

A sintaxe básica do renice é a seguinte:

# renice [-n] priority [-gpu] identifier

Na instrução genérica acima, o primeiro argumento é o valor de prioridade a ser usado, enquanto o outro argumento pode ser interpretado como IDs de processo (que é a configuração padrão), IDs de grupo de processo, IDs de usuário ou nomes de usuário. Um usuário normal (exceto o root) só pode modificar a prioridade de agendamento de um processo que ele ou ela possui e apenas aumentar o nível de gentileza (o que significa usar menos recursos do sistema).

Process Scheduling Priority
2. Matar (ou interromper a execução normal) de um processo conforme necessário:

Em termos mais precisos, matar um processo significa enviar a ele um sinal para terminar sua execução graciosamente (SIGTERM=15) ou imediatamente (SIGKILL=9>) através dos comandos kill ou pkill.

A diferença entre essas duas ferramentas é que a primeira é usada para encerrar um processo específico ou um grupo de processos inteiro, enquanto a segunda permite fazer o mesmo com base no nome e em outros atributos.

Além disso, o pkill vem junto com o pgrep, que mostra os PIDs que serão afetados caso o pkill seja usado. Por exemplo, antes de executar:

# pkill -u gacanepa

Pode ser útil ver de relance quais são os PIDs pertencentes a gacanepa:

# pgrep -l -u gacanepa
Find PIDs of User

Por padrão, tanto o kill quanto o pkill enviam o sinal SIGTERM para o processo. Como mencionamos anteriormente, este sinal pode ser ignorado (enquanto o processo termina sua execução ou permanentemente), então quando você realmente precisa parar um processo em execução com um motivo válido, você precisará especificar o sinal SIGKILL na linha de comando:

# kill -9 identifier               # Kill a process or a process group
# kill -s SIGNAL identifier        # Idem
# pkill -s SIGNAL identifier       # Kill a process by name or other attributes 

Conclusão

Neste artigo, explicamos o básico do processo de inicialização em um sistema RHEL 7 e analisamos algumas das ferramentas disponíveis para ajudá-lo a gerenciar processos usando utilitários comuns e comandos específicos do systemd.

Observe que esta lista não pretende cobrir todos os detalhes deste tópico, então sinta-se à vontade para adicionar suas próprias ferramentas e comandos preferidos a este artigo usando o formulário de comentários abaixo. Perguntas e outros comentários também são bem-vindos.

Source:
https://www.tecmint.com/rhcsa-exam-boot-process-and-process-management/