Pesquisa de site

Como determinar e corrigir problemas de inicialização no Linux


O sistema Linux inicializa tão rápido que a maior parte da saída rola muito rapidamente para ler o texto (mostrando os serviços sendo iniciados) enviado ao console. Portanto, observar problemas/erros de inicialização torna-se um pequeno desafio para nós.

Neste artigo, explicaremos brevemente os diferentes estágios do processo de inicialização de um sistema Linux e, em seguida, aprenderemos como estabelecer e descobrir os problemas de inicialização: em termos de arquivos a serem examinados ou comandos para visualizar mensagens de inicialização do sistema.

Resumo do processo de inicialização do Linux

Em resumo, assim que pressionamos o botão Ligar, o BIOS (Basic Input Output System) um programa integrado em uma placa-mãe executa um >POST (Power on Self Test) – onde hardware como discos, RAM (memória de acesso aleatório), teclado, etc. são verificados. Em caso de erro (hardware ausente/com defeito), ele é relatado na tela.

Durante o POST, o BIOS também procura pelo dispositivo de inicialização, o disco a partir do qual inicializar (geralmente o primeiro disco rígido, porém podemos configurá-lo para ser um DVD, USB , placa de rede, etc.).

Em seguida, o sistema se conectará ao disco e procurará o Master Boot Record (512 bytes de tamanho) que armazena o carregador de boot (446 bytes de tamanho) e o restante do espaço armazena informações sobre as partições do disco. (quatro no máximo) e o próprio MBR.

Leitura sugerida: 4 melhores carregadores de inicialização para Linux

O carregador de boot identificará e apontará, bem como carregará o Kernel e o arquivo initrd (disco ram de inicialização – fornece ao kernel acesso ao sistema de arquivos raiz montado e módulos/drivers armazenados em / lib), que geralmente são armazenados no diretório /boot do sistema de arquivos.

Após o kernel ser carregado, ele executa o init (ou systemd nas distribuições Linux mais recentes), o primeiro processo com PID 1, que por sua vez inicia todos os outros processos no sistema. É também o último processo a ser executado no desligamento do sistema.

Como descobrir problemas de inicialização ou mensagens de erro do Linux

Como mencionamos antes, os processos de inicialização do Linux acontecem tão rapidamente que nem conseguimos ler claramente a maior parte da saída enviada ao console.

Portanto, tomar nota dos problemas/erros de inicialização exige que um administrador do sistema examine determinados arquivos importantes em conjunto com comandos específicos. E estes incluem:

/var/log/boot.log – Registra mensagens de inicialização do sistema

Este é provavelmente o primeiro arquivo que você deseja examinar, para ver tudo o que aconteceu durante a inicialização do sistema.

Em vez de nos esforçarmos tanto para seguir a saída na tela durante a inicialização, podemos visualizar esse arquivo após a conclusão do processo de inicialização para nos ajudar a determinar e resolver problemas/erros de inicialização.

Usamos o comando cat para esse propósito da seguinte maneira (abaixo está um exemplo deste arquivo):

cat /var/log/boot.log
[  OK  ] Started Load/Save RF Kill Switch Status.
[ TIME ] Timed out waiting for device dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.device.
[DEPEND] Dependency failed for /dev/disk/by-uuid/53e41ce9-dc18-458c-bc08-584c208ed615.
[DEPEND] Dependency failed for Swap.
[  OK  ] Reached target System Initialization.
[  OK  ] Listening on UUID daemon activation socket.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Listening on CUPS Scheduler.
[  OK  ] Started Daily apt activities.
[  OK  ] Reached target Timers.
[  OK  ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[  OK  ] Started ACPI Events Check.
[  OK  ] Started Trigger resolvconf update for networkd DNS.
[  OK  ] Started CUPS Scheduler.
[  OK  ] Reached target Paths.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Listening on ACPID Listen Socket.
         Starting Console System Startup Logging...
[  OK  ] Listening on Cockpit Web Service Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
         Starting LSB: Set the CPU Frequency Scaling governor to "ondemand"...
[  OK  ] Started ACPI event daemon.
[  OK  ] Started mintsystem.service.
         Starting Detect the available GPUs and deal with any system changes...
         Starting LSB: daemon to balance interrupts for SMP systems...
         Starting Bluetooth service...
[  OK  ] Started ClamAV virus database updater.
         Starting LSB: Starts syslogd...
[  OK  ] Started Regular background program processing daemon.
         Starting Modem Manager...
         Starting Accounts Service...
......

Na saída acima, podemos ver que há problemas de inicialização indicados pelas linhas abaixo.

[DEPEND] Dependency failed for /dev/disk/by-uuid/53e41ce9-dc18-458c-bc08-584c208ed615.
[DEPEND] Dependency failed for Swap.

Problema: Problema com a partição swap; o sistema não conseguiu ler o arquivo/dispositivo/partição de troca ou ele não está presente.

Vamos verificar se o sistema está usando espaço de troca com comando livre.

free

total        used        free      shared  buff/cache   available
Mem:        3742792     2421060      433696      287376      888036      967000
Swap:             0           0           0

Alternativamente, podemos executar o comando swap para visualizar o resumo do uso do espaço de troca do sistema (não obteremos nenhuma saída).

swapon -s

Podemos resolver esse problema criando um espaço de troca no Linux.

Nota: O conteúdo deste arquivo é limpo no desligamento do sistema: novos dados são armazenados nele em uma nova inicialização.

/var/log/messages – Logs gerais do sistema

Este arquivo armazena mensagens gerais do sistema, incluindo as mensagens registradas durante a inicialização do sistema.

Para visualizá-lo, digite:

cat /var/log/messages
Jun  4 13:04:44 tecmint syslogd (GNU inetutils 1.9.4): restart
Jun  4 13:19:55 tecmint -- MARK --
Jun  4 13:39:55 tecmint -- MARK --
Jun  4 13:59:55 tecmint -- MARK --
Jun  4 14:19:55 tecmint -- MARK --
Jun  4 14:20:17 tecmint vmunix: [ 4945.388740] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.388837] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.388903] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.388930] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.389334] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.389402] pcieport 0000:00:1c.0: BAR 15: assigned [mem 0xdfa00000-0xdfbfffff 64bit pref]
.....

Como este arquivo pode ser relativamente longo, podemos visualizá-lo em páginas usando o comando mais (que até mostra uma porcentagem) como este.

more /var/log/messages

O conteúdo de /var/log/messages, ao contrário do arquivo anterior, não é apagado porque não contém apenas mensagens de inicialização, mas também mensagens relativas a outras atividades do sistema. Assim, os arquivos mais antigos são compactados e mantidos no sistema para inspeção posterior, conforme mostrado abaixo.

ls -l message*

-rw-r--r-- 1 root root 1206127 Jun 10 14:20 messages
-rw-r--r-- 1 root root 1419494 Jun  4 13:00 messages.1
-rw-r--r-- 1 root root  153011 May 28 09:30 messages.2.gz

dmesg – Mostra mensagens do kernel

O comando dmesg pode mostrar operações após a conclusão do processo de inicialização, como opções de linha de comando passadas para o kernel; componentes de hardware detectados, eventos quando um novo dispositivo USB é adicionado ou erros como falha de NIC (placa de interface de rede) e os drivers não relatam nenhuma atividade de link detectada na rede e muito mais.

dmesg
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=57b36d48-1938-43c2-bf85-e97bc9f423ea ro quiet splash
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000008ffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000090000-0x00000000000bffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001fffffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000020000000-0x00000000201fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000020200000-0x0000000040003fff] usable
[    0.000000] BIOS-e820: [mem 0x0000000040004000-0x0000000040004fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000040005000-0x0000000080b2ffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000080b30000-0x0000000080d31fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000080d32000-0x00000000ce3eefff] usable
[    0.000000] BIOS-e820: [mem 0x00000000ce3ef000-0x00000000ce5eefff] type 20
[    0.000000] BIOS-e820: [mem 0x00000000ce5ef000-0x00000000daeeefff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000daeef000-0x00000000daf9efff] ACPI NVS
....

journalctl – Consultar conteúdo do Systemd Journal

Isso é útil na maioria das distribuições Linux atuais que usam o systemd: o mais novo gerenciador de sistemas e serviços. Nele, o registro do sistema é feito por meio do componente de diário – um local centralizado para todas as mensagens registradas por diferentes componentes.

Essas mensagens incluem mensagens de kernel e de inicialização; mensagens do syslog ou de vários serviços. Podemos usá-lo para revisar mensagens de inicialização e estabelecer problemas de inicialização lendo a saída e identificando linhas de interesse (erros apontados por linhas vermelhas dependendo das configurações de cor do texto do terminal).

journalctl
Jun 13 16:35:32 tecmint mtp-probe[963]: checking bus 2, device 5: "/sys/devices/pci0000:00/0000:00:1d.0/u
Jun 13 16:35:32 tecmint mtp-probe[963]: bus: 2, device: 5 was not an MTP device
Jun 13 16:35:54 tecmint systemd[1]: dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.
Jun 13 16:35:54 tecmint systemd[1]: Timed out waiting for device dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d
Jun 13 16:35:54 tecmint systemd[1]: Dependency failed for /dev/disk/by-uuid/53e41ce9-dc18-458c-bc08-584c2
Jun 13 16:35:54 tecmint systemd[1]: Dependency failed for Swap.
Jun 13 16:35:54 tecmint systemd[1]: swap.target: Job swap.target/start failed with result 'dependency'.
Jun 13 16:35:54 tecmint systemd[1]: dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.
Jun 13 16:35:54 tecmint systemd[1]: dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.
Jun 13 16:35:54 tecmint systemd[1]: Reached target System Initialization.
Jun 13 16:35:54 tecmint systemd[1]: Started ACPI Events Check.
Jun 13 16:35:54 tecmint systemd[1]: Listening on CUPS Scheduler.
Jun 13 16:35:54 tecmint systemd[1]: Starting Console System Startup Logging...
Jun 13 16:35:54 tecmint systemd[1]: Started Daily Cleanup of Temporary Directories.

A imagem acima é um exemplo da saída do comando mostrando um erro que já identificamos ao visualizar /var/log/boot.log: o erro da partição swap. Para visualizar mais linhas de saída, basta pressionar o botão [Enter].

Verifique também estes guias úteis sobre inicialização do sistema Linux e gerenciamento de serviços em relação aos gerenciadores de sistemas e serviços comuns:

  1. Gerenciamento de processos no RHEL 7: inicialização, desligamento e tudo mais
  2. Gerenciando processos e serviços de inicialização do sistema (SysVinit, Systemd e Upstart)
  3. A história por trás de ‘init’ e ‘systemd’: por que ‘init’ precisou ser substituído por ‘systemd’

Neste artigo, explicamos resumidamente os diferentes estágios do processo de inicialização do sistema Linux, bem como aprendemos como estabelecer e possivelmente resolver problemas de inicialização. Para adicionar alguma ideia a este guia, use o formulário de comentários abaixo.