Kako ugotoviti in odpraviti težave pri zagonu v sistemu Linux


Sistem Linux se zažene tako hitro, da se večina izhodnih datotek prehitro pomakne, da bi prebrala besedilo (ki prikazuje zagnane storitve), poslano na konzolo. Zato nam opazovanje težav/napak pri zagonu postane majhen izziv.

V tem članku bomo na kratko razložili različne stopnje zagonskega procesa sistema Linux, nato pa se naučili, kako vzpostaviti in priti do dna zagonskih težav: v obliki datotek, ki jih je treba preučiti, ali ukazov za ogled sistemskih zagonskih sporočil.

Povzetek zagonskega procesa Linuxa

Če povzamemo, ko pritisnemo gumb za vklop, program BIOS (osnovni vhodni izhodni sistem), integriran v matično ploščo, izvede POST (Power on Self Test) - kjer strojna oprema, kot so diski, RAM (pomnilnik z naključnim dostopom), tipkovnica, itd. so skenirani. V primeru napake (manjkajoča/nepravilno delujoča strojna oprema) se o tem obvesti na zaslonu.

Med POST-om BIOS išče tudi zagonsko napravo, disk s katerega se postavi (običajno prvi trdi disk, lahko pa ga nastavimo tako, da je DVD, USB, omrežna kartica itd.).

Nato se bo sistem povezal z diskom in poiskal glavni zagonski zapis (velikosti 512 bajtov), ki shrani zagonski nalagalnik (velikost 446 bajtov), preostali prostor pa informacije o particijah diska (največ štiri) in MBR sama.

Zagonski nalagalnik bo identificiral in kazal nanjo ter naložil jedro in datoteko initrd (inicializacijski ram disk - omogoča jedru dostop do nameščenega korenskega datotečnega sistema in modulov/gonilnikov, shranjenih v imeniku/lib), ki so običajno shranjeni v/zagonski imenik datotečnega sistema.

Po nalaganju jedra izvede init (ali systemd na novejših distribucijah Linuxa), prvi postopek s PID 1, ki nato zažene vse ostale procese v sistemu. To je tudi zadnji postopek, ki se izvede ob zaustavitvi sistema.

Kako najti težave z zagonom Linuxa ali sporočila o napakah

Kot smo že omenili, se zagonski procesi Linuxa hitro zgodijo, da ne moremo niti jasno prebrati večine izhodnih podatkov, poslanih na konzolo.

Zato upoštevanje težav/napak pri zagonu zahteva, da sistemski skrbnik skupaj z določenimi ukazi preuči nekatere pomembne datoteke. Sem spadajo:

To je verjetno prva datoteka, ki si jo želite ogledati, da si ogledate vse, kar se je razvilo med zagonom sistema.

Namesto da bi si med zagonom tako močno prizadevali slediti izpisu na zaslonu, si lahko po končanem zagonu ogledamo to datoteko, ki nam bo pomagala pri ugotavljanju in odpravljanju težav/napak pri zagonu.

Za ta namen uporabljamo ukaz cat (spodaj je vzorec te datoteke):

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

Iz zgornjega izhoda lahko vidimo, da obstajajo težave z zagonom, ki jih označujejo spodnje vrstice.

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

Težava: težava s swap particijo; sistem bodisi ni uspel prebrati izmenjalne datoteke/naprave/particije ali pa ni prisoten.

Preverimo, ali sistem uporablja swap prostor s prostim ukazom.

# free

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

Druga možnost je, da zaženemo ukaz swapon, da si ogledamo povzetek uporabe sistemskega prostora za zamenjavo (ne bomo dobili nobenega izhoda).

# swapon -s

To težavo lahko rešimo z ustvarjanjem prostora za zamenjavo v Linuxu.

Opomba: Vsebina te datoteke se ob zaustavitvi sistema počisti: v njej se ob novem zagonu shranijo novi podatki.

V tej datoteki so shranjena splošna sistemska sporočila, vključno s sporočili, ki so zabeležena med zagonom sistema.

Če si ga želite ogledati, vnesite:

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

Ker je ta datoteka lahko sorazmerno dolga, si jo lahko ogledamo na straneh z uporabo ukaza more (ki prikazuje celo odstotek), kot je ta.

# more /var/log/messages

Vsebina/var/log/messages za razliko od prejšnje datoteke ni izbrisana, ker ne vsebuje samo zagonskih sporočil, temveč tudi sporočila v zvezi z drugimi sistemskimi dejavnostmi. Tako se starejše datoteke stisnejo in shranijo v sistem za poznejši pregled, kot je prikazano spodaj.

# 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

Ukaz dmesg lahko prikaže operacije po zaključku zagonskega postopka, na primer možnosti ukazne vrstice, posredovane jedru; zaznane komponente strojne opreme, dogodki ob dodajanju nove naprave USB ali napake, kot je okvara NIC (kartica omrežnega vmesnika) in gonilniki poročajo, da v omrežju ni zaznana nobena povezava in še veliko več.

# 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 ([email ) (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
....

To je uporabno v večini trenutnih distribucij Linuxa, ki uporabljajo systemd: najnovejši upravitelj sistema in storitev. Pod njim se sistemsko beleženje izvaja prek komponente dnevnika - centraliziranega mesta za vsa sporočila, ki jih beležijo različne komponente.

Ta sporočila vključujejo jedrna in zagonska sporočila; sporočila iz syslog ali različnih storitev. Uporabljamo ga lahko za pregled zagonskih sporočil in ugotavljanje težav z zagonom, tako da preberemo izhodne podatke in določimo zanimive vrstice (napake opozarjajo rdeče črte, odvisno od nastavitev barve besedila terminala).

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

Zgoraj je primer izhoda ukaza, ki prikazuje napako, ki smo jo že ugotovili z ogledom /var/log/boot.log: napaka swap particije. Če si želite ogledati več izhodnih vrstic, preprosto pritisnite gumb [Enter].

Oglejte si tudi te koristne vodnike o zagonu sistema Linux in upravljanju storitev v zvezi s skupnimi upravitelji sistemov in storitev:

  1. Upravljanje procesov v RHEL 7: zagon, zaustavitev in vse vmes
  2. Upravljanje postopka zagona sistema in storitev (SysVinit, Systemd in Upstart)
  3. Zgodba za „init“ in „systemd“: zakaj je treba „init“ zamenjati z „systemd“

V tem članku smo na kratko razložili različne stopnje zagonskega sistema sistema Linux in se naučili, kako vzpostaviti in morda rešiti težave z zagonom. Če želite temu vodniku dodati kakršno koli misel, uporabite spodnji obrazec za komentar.