Cum să determinați și să remediați problemele de boot în Linux


Sistemul Linux pornește atât de repede încât cea mai mare parte a ieșirii defilează prea repede pentru a citi textul (care arată serviciile pornite) trimis către consolă. Prin urmare, observarea problemelor/erorilor de boot devine o mică provocare pentru noi.

În acest articol, vom explica pe scurt diferitele etape ale unui proces de pornire a sistemului Linux, apoi vom învăța cum să stabilim și să ajungem la fundul problemelor de boot: în termeni de fișiere pe care să le cercetăm sau comenzi pentru a vizualiza mesajele de pornire a sistemului.

Rezumatul procesului de pornire Linux

Pe scurt, odată ce apăsăm butonul Pornire, BIOS (Basic Input Output System), un program integrat într-o placă de bază, efectuează un >POST (Power on Self Test) – unde hardware-ul precum discuri, RAM (Random Access Memory), tastatură etc. sunt scanate. În cazul unei erori (hardware lipsă/funcționare defectuoasă), aceasta este raportată pe ecran.

În timpul POST, BIOS-ul caută, de asemenea, dispozitivul de pornire, discul de pe care să se instaleze (de obicei primul hard disk, totuși îl putem configura să fie un DVD, USB , placă de rețea etc.).

Apoi sistemul se va conecta la disc și va căuta Master Boot Record (512 bytes în dimensiune) care stochează bootloader-ul (446 bytes în dimensiune), iar restul spațiului stochează informații despre partițiile de disc. (patru maximum) și MBR-ul în sine.

Lectură recomandată: 4 cele mai bune încărcătoare de pornire Linux

Încărcătorul de pornire va identifica și va indica, precum și va încărca Kernel-ul și fișierul initrd (disc ram de inițializare – oferă acces kernel-ului la sistemul de fișiere rădăcină montat și la modulele/driverele stocate în / lib), care sunt în general stocate în directorul /boot al sistemului de fișiere.

După ce nucleul este încărcat, acesta execută init (sau systemd pe distribuțiile Linux mai noi), primul proces cu PID 1, care la rândul său pornește toate celelalte procese de pe sistem. Este, de asemenea, ultimul proces care trebuie executat la oprirea sistemului.

Cum să aflați problemele de boot Linux sau mesajele de eroare

După cum am menționat anterior, procesele de pornire Linux au loc rapid, încât nici măcar nu putem citi clar cea mai mare parte a ieșirii trimise către consolă.

Prin urmare, luarea în considerare a problemelor/erorilor de boot necesită un administrator de sistem să analizeze anumite fișiere importante împreună cu anumite comenzi. Și acestea includ:

/var/log/boot.log – Înregistrează mesajele de pornire a sistemului

Acesta este probabil primul fișier pe care doriți să îl căutați, pentru a vedea tot ce s-a desfășurat în timpul pornirii sistemului.

În loc să încercăm atât de mult să urmărim rezultatul de pe ecran în timpul pornirii, putem vizualiza acest fișier după finalizarea procesului de pornire pentru a ne ajuta în determinarea și rezolvarea problemelor/erorilor de boot.

Utilizăm comanda cat în acest scop, după cum urmează (mai jos este o mostră din acest fișier):

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

Din rezultatul de mai sus, putem vedea că există probleme de boot indicate de liniile de mai jos.

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

Problemă: problemă cu partiția de swap; sistemul fie nu a reușit să citească fișierul swap/dispozitivul/partiția, fie nu este prezent.

Să verificăm dacă sistemul folosește spațiu de swap cu comandă gratuită.

free

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

Alternativ, putem rula comanda swapon pentru a vedea rezumatul utilizării spațiului de schimb al sistemului (nu vom obține niciun rezultat).

swapon -s

Putem rezolva această problemă prin crearea unui spațiu de schimb în Linux.

Notă: conținutul acestui fișier este șters la închiderea sistemului: datele noi sunt stocate în el pe o nouă pornire.

/var/log/messages – Jurnalele generale ale sistemului

Acest fișier stochează mesajele generale ale sistemului, inclusiv mesajele care sunt înregistrate în timpul pornirii sistemului.

Pentru a o vizualiza, tastați:

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

Deoarece acest fișier poate fi relativ lung, îl putem vizualiza în pagini folosind comanda mai mult (care arată chiar și un procent) astfel.

more /var/log/messages

Conținutul /var/log/messages, spre deosebire de fișierul anterior, nu este șters, deoarece nu conține doar mesaje de pornire, ci și mesaje referitoare la alte activități ale sistemului. Prin urmare, fișierele mai vechi sunt comprimate și păstrate în sistem pentru inspecție ulterioară, așa cum se arată mai jos.

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 – Afișează mesajele Kernel

Comanda dmesg poate afișa operațiuni odată ce procesul de pornire s-a încheiat, cum ar fi opțiunile din linia de comandă transmise nucleului; Componentele hardware detectate, evenimentele la adăugarea unui nou dispozitiv USB sau erori precum eșecul NIC (Network Interface Card) și driverele raportează nicio activitate de legătură detectată în rețea și multe altele.

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 – Interogați conținutul Systemd Journal

Acest lucru este util în majoritatea distribuțiilor Linux actuale folosind systemd: cel mai nou manager de sistem și servicii. Sub acesta, înregistrarea sistemului se face prin componenta jurnal – o locație centralizată pentru toate mesajele înregistrate de diferite componente.

Aceste mesaje includ mesaje de kernel și de boot; mesaje de la syslog sau diverse servicii. Îl putem folosi pentru a revizui mesajele de pornire și pentru a stabili probleme de pornire citind rezultatul și identificând liniile de interes (erori semnalate prin linii roșii în funcție de setările de culoare a textului terminalului).

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.

Cele de mai sus este un exemplu de ieșire a comenzii care arată o eroare pe care am identificat-o deja prin vizualizarea /var/log/boot.log: eroarea partiției de swap. Pentru a vedea mai multe linii de ieșire, pur și simplu apăsați butonul [Enter].

Consultați, de asemenea, aceste ghiduri utile despre pornirea sistemului Linux și gestionarea serviciilor în legătură cu managerii obișnuiți de sistem și servicii:

  1. Managementul proceselor în RHEL 7: pornire, închidere și tot ce se află între ele
  2. Gestionarea procesului și serviciilor de pornire a sistemului (SysVinit, Systemd și Upstart)
  3. Povestea din spatele „init” și „systemd”: de ce „init” a trebuit să fie înlocuit cu „systemd”

În acest articol, am explicat pe scurt diferitele etape ale procesului de pornire a sistemului Linux și am învățat cum să stabilim și, eventual, să rezolvăm problemele de pornire. Pentru a adăuga orice gând la acest ghid, utilizați formularul de comentarii de mai jos.