Kā noteikt un novērst sāknēšanas problēmas Linux


Linux sistēma tiek sākta tik ātri, ka lielākā daļa izvades ritina pārāk ātri, lai nolasītu konsolē nosūtīto tekstu (parādot, ka tiek sākti pakalpojumi). Tāpēc sāknēšanas problēmu/kļūdu novērošana mums kļūst par nelielu izaicinājumu.

Šajā rakstā mēs īsi izskaidrosim dažādus Linux sistēmas sāknēšanas procesa posmus, pēc tam uzzināsim, kā izveidot un nokļūt sāknēšanas problēmu apakšā: runājot par failiem, kurus meklēt vai komandas, lai skatītu sistēmas sāknēšanas ziņojumus.

Linux sāknēšanas procesa kopsavilkums

Kopumā, nospiežot ieslēgšanas pogu, mātesplatē integrētā programma BIOS (Basic Input Output System) veic POST (Power on Self Test) - kur aparatūra, piemēram, diski, RAM (brīvpiekļuves atmiņa), tastatūra, utt. tiek skenēti. Kļūdas gadījumā (trūkst/darbojas nepareizi aparatūra), par to tiek ziņots ekrānā.

POST laikā BIOS meklē arī sāknēšanas ierīci, disku, no kura var augt (parasti pirmais cietais disks, tomēr mēs tā vietā varam konfigurēt to kā DVD, USB, tīkla karti utt.).

Tad sistēma izveidos savienojumu ar disku un meklēs galveno sāknēšanas ierakstu (512 baitu lielumā), kurā tiek glabāts sāknēšanas iekrāvējs (446 baitu lielumā), bet pārējā vietā tiek saglabāta informācija par diska nodalījumiem (maksimums četri) un MBR pati.

Sāknēšanas iekrāvējs identificēs un norādīs, kā arī ielādēs kodolu un initrd failu (inicializācijas ram disks - nodrošina kodola piekļuvi uzstādītajai saknes failu sistēmai un moduļiem/draiveriem, kas glabājas/lib direktorijā), kas parasti tiek glabāti mapē/failu direktorijas sāknēšanas direktoriju.

Pēc kodola ielādes tas izpilda init (vai systemd jaunākos Linux distros), pirmo procesu ar PID 1, kas savukārt sāk visus pārējos sistēmas procesus. Tas ir arī pēdējais process, kas jāveic, izslēdzot sistēmu.

Kā uzzināt Linux sāknēšanas problēmas vai kļūdu ziņojumus

Kā jau minējām iepriekš, Linux sāknēšanas procesi notiek ātri, un mēs pat nevaram skaidri nolasīt lielāko daļu konsolei nosūtīto izvadi.

Tāpēc, ievērojot sāknēšanas problēmas/kļūdas, sistēmas administrators prasa izpētīt dažus svarīgus failus kopā ar konkrētām komandām. Tie ietver:

Tas, iespējams, ir pirmais fails, kuru vēlaties apskatīt, lai apskatītu visu, kas notika sistēmas palaišanas laikā.

Tā vietā, lai sāknēšanas laikā tik ļoti censtos sekot ekrāna izvadei, mēs varam skatīt šo failu pēc sāknēšanas procesa beigām, lai palīdzētu mums noteikt un atrisināt sāknēšanas problēmas/kļūdas.

Šim nolūkam mēs izmantojam kaķu komandu šādi (zemāk ir šī faila paraugs):

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

No iepriekš minētās izejas mēs varam redzēt, ka ir sāknēšanas problēmas, kas norādītas zemāk esošajās līnijās.

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

Jautājums: Problēma ar maiņas nodalījumu; vai nu neizdevās nolasīt mijmaiņas failu/ierīci/nodalījumu, vai arī tā nav.

Pārbaudīsim, vai sistēma izmanto apmaiņas vietu ar bezmaksas komandu.

# free

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

Varat arī palaist komandu swapon, lai skatītu sistēmas mijmaiņas vietas izmantošanas kopsavilkumu (mēs nesaņemsim nevienu rezultātu).

# swapon -s

Mēs varam atrisināt šo problēmu, izveidojot mijmaiņas vietu Linux.

Piezīme. Šī faila saturs tiek dzēsts, kad sistēma tiek izslēgta: tajā tiek saglabāti jauni dati jaunā boot.

Šajā failā tiek glabāti vispārīgi sistēmas ziņojumi, ieskaitot ziņojumus, kas tiek reģistrēti sistēmas sāknēšanas laikā.

Lai to apskatītu, ierakstiet:

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

Tā kā šis fails var būt samērā garš, mēs varam to skatīt lapās, izmantojot šādu komandu vairāk (kas pat parāda procentus).

# more /var/log/messages

Atšķirībā no iepriekšējā faila/var/log/messages saturs netiek dzēsts, jo tas satur ne tikai sāknēšanas ziņojumus, bet arī ziņojumus par citām sistēmas darbībām. Tātad vecāki faili tiek saspiesti un saglabāti sistēmā, lai tos vēlāk pārbaudītu, kā parādīts zemāk.

# 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

Komanda dmesg var parādīt darbības, tiklīdz sāknēšanas process ir pabeigts, piemēram, komandrindas opcijas, kas nodotas kodolam; konstatēti aparatūras komponenti, notikumi, pievienojot jaunu USB ierīci, vai tādas kļūdas kā NIC (tīkla interfeisa kartes) kļūme, un draiveri ziņo, ka tīklā nav konstatēta saites darbība un vēl daudz vairāk.

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

Tas ir noderīgi lielākajā daļā pašreizējo Linux distros, izmantojot systemd: jaunāko sistēmu un pakalpojumu pārvaldnieku. Saskaņā ar to sistēmas reģistrēšana tiek veikta, izmantojot žurnāla komponentu - centralizētu vietu visiem ziņojumiem, kurus reģistrējuši dažādi komponenti.

Šie ziņojumi ietver kodola un sāknēšanas ziņojumus; ziņas no syslog vai dažādiem pakalpojumiem. Mēs varam to izmantot, lai pārskatītu sāknēšanas ziņojumus un noteiktu sāknēšanas problēmas, lasot izvadi un identificējot interesējošās līnijas (kļūdas, uz kurām norāda sarkanās līnijas atkarībā no termināla teksta krāsu iestatījumiem).

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

Iepriekš minēts komandas izvades paraugs, kurā parādīta kļūda, kuru mēs jau esam identificējuši, apskatot /var/log/boot.log: mijmaiņas nodalījuma kļūda. Lai skatītu vairāk izvades līniju, vienkārši nospiediet pogu [Enter].

Apskatiet arī šīs noderīgās rokasgrāmatas par Linux sistēmas sāknēšanas un pakalpojumu pārvaldību saistībā ar parastajiem sistēmu un pakalpojumu pārvaldniekiem:

  1. Procesu pārvaldība RHEL 7: sāknēšana, izslēgšana un viss starp tiem
  2. Sistēmas startēšanas procesa un pakalpojumu pārvaldība (SysVinit, Systemd un Upstart)
  3. Stāsts aiz ‘init’ un ‘systemd’: kāpēc ‘init’ bija jāaizstāj ar ‘systemd’

Šajā rakstā mēs īsi izskaidrojām dažādus Linux sistēmas sāknēšanas procesa posmus, kā arī uzzinājām, kā izveidot un, iespējams, atrisināt sāknēšanas problēmas. Lai pievienotu domas šai rokasgrāmatai, izmantojiet zemāk esošo komentāru veidlapu.