Ricerca nel sito web

Come determinare e risolvere i problemi di avvio in Linux


Il sistema Linux si avvia così velocemente che la maggior parte dell'output scorre troppo velocemente per leggere il testo (che mostra i servizi in fase di avvio) inviato alla console. Pertanto osservare i problemi/errori di avvio diventa una piccola sfida per noi.

In questo articolo spiegheremo brevemente le diverse fasi del processo di avvio di un sistema Linux, quindi impareremo come stabilire e andare a fondo dei problemi di avvio: in termini di file da esaminare o comandi per visualizzare i messaggi di avvio del sistema.

Riepilogo del processo di avvio di Linux

In sintesi, una volta premuto il pulsante di Accensione, il BIOS (Basic Input Output System) un programma integrato in una scheda madre esegue un >POST (Power on Self Test) – dove vengono scansionati hardware come dischi, RAM (memoria ad accesso casuale), tastiera, ecc. In caso di errore (hardware mancante/malfunzionante), viene segnalato sullo schermo.

Durante il POST, il BIOS cerca anche il dispositivo di avvio, il disco da cui eseguire l'avvio (di solito il primo disco rigido, ma possiamo configurarlo come un DVD, USB , Scheda di rete ecc. invece).

Quindi il sistema si collegherà al disco e cercherà il Master Boot Record (dimensione 512 byte) che memorizza il boot loader (dimensione 446 byte) e il resto dello spazio memorizza informazioni sulle partizioni del disco (quattro al massimo) e lo stesso MBR.

Lettura consigliata: 4 migliori boot loader Linux

Il boot loader identificherà e punterà a, oltre a caricare, il Kernel e il file initrd (disco ram di inizializzazione – fornisce al kernel l'accesso al file system root montato e ai moduli/driver archiviati in / lib), che generalmente sono memorizzati nella directory /boot del filesystem.

Dopo che il kernel è stato caricato, esegue init (o systemd sulle distribuzioni Linux più recenti), il primo processo con PID 1, che a sua volta avvia tutti gli altri processi sul sistema. È anche l'ultimo processo da eseguire allo spegnimento del sistema.

Come scoprire problemi di avvio di Linux o messaggi di errore

Come accennato in precedenza, i processi di avvio di Linux avvengono rapidamente al punto che non riusciamo nemmeno a leggere chiaramente la maggior parte dell'output inviato alla console.

Pertanto, prendere nota dei problemi/errori di avvio richiede che un amministratore di sistema esamini determinati file importanti insieme a comandi particolari. E questi includono:

/var/log/boot.log – Registra i messaggi di avvio del sistema

Questo è probabilmente il primo file che vuoi esaminare, per vedere tutto ciò che è accaduto durante l'avvio del sistema.

Invece di sforzarsi di seguire l'output sullo schermo durante l'avvio, possiamo visualizzare questo file al termine del processo di avvio per aiutarci a determinare e risolvere problemi/errori di avvio.

Usiamo il comando cat a tale scopo come segue (di seguito è riportato un esempio di questo file):

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...
......

Dall'output sopra, possiamo vedere che c'è un problema di avvio indicato dalle righe seguenti.

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

Problema: problema con la partizione di swap; il sistema non è riuscito a leggere il file/dispositivo/partizione di swap oppure non è presente.

Controlliamo se il sistema utilizza lo spazio di swap con il comando libero.

free

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

In alternativa, possiamo eseguire il comando swapon per visualizzare il riepilogo dell'utilizzo dello spazio di swap del sistema (non otterremo alcun output).

swapon -s

Possiamo risolvere questo problema creando uno spazio di swap in Linux.

Nota: il contenuto di questo file viene cancellato allo spegnimento del sistema: i nuovi dati vengono memorizzati al suo interno al nuovo avvio.

/var/log/messages – Registri generali di sistema

Questo file memorizza i messaggi generali del sistema, inclusi i messaggi registrati durante l'avvio del sistema.

Per visualizzarlo digitare:

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]
.....

Dato che questo file può essere relativamente lungo, possiamo visualizzarlo in pagine utilizzando il comando more (che mostra anche una percentuale) come questo.

more /var/log/messages

Il contenuto di /var/log/messages a differenza del file precedente non viene cancellato allo spegnimento perché non contiene solo messaggi di avvio ma anche messaggi riguardanti altre attività del sistema. Pertanto i file più vecchi vengono compressi e conservati nel sistema per un controllo successivo, come mostrato di seguito.

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 i messaggi del kernel

Il comando dmesg può mostrare le operazioni una volta completato il processo di avvio, come le opzioni della riga di comando passate al kernel; componenti hardware rilevati, eventi quando viene aggiunto un nuovo dispositivo USB o errori come il guasto della NIC (scheda di interfaccia di rete) e i driver non segnalano alcuna attività di collegamento rilevata sulla rete e molto altro ancora.

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: interroga il contenuto del journal Systemd

Ciò è utile nella maggior parte delle distribuzioni Linux attuali che utilizzano systemd: il sistema più recente e il gestore dei servizi. Sotto di esso, la registrazione del sistema viene effettuata tramite il componente journal, una posizione centralizzata per tutti i messaggi registrati dai diversi componenti.

Questi messaggi includono messaggi del kernel e di avvio; messaggi da syslog o vari servizi. Possiamo usarlo per rivedere i messaggi di avvio e stabilire problemi di avvio leggendo l'output e identificando le linee di interesse (errori segnalati da linee rosse a seconda delle impostazioni del colore del testo del terminale).

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.

Quanto sopra è un esempio dell'output del comando che mostra un errore che abbiamo già identificato visualizzando /var/log/boot.log: l'errore della partizione di swap. Per visualizzare più righe di output, è sufficiente premere il pulsante [Invio].

Dai un'occhiata anche a queste utili guide sull'avvio del sistema Linux e sulla gestione dei servizi in relazione ai comuni gestori di sistemi e servizi:

  1. Gestione dei processi in RHEL 7: avvio, arresto e tutto il resto
  2. Gestione del processo e dei servizi di avvio del sistema (SysVinit, Systemd e Upstart)
  3. La storia dietro "init" e "systemd": perché "init" doveva essere sostituita con "systemd"

In questo articolo, abbiamo spiegato in breve le diverse fasi del processo di avvio del sistema Linux e abbiamo imparato come stabilire ed eventualmente risolvere i problemi di avvio. Per aggiungere qualsiasi pensiero a questa guida, utilizza il modulo di commento qui sotto.