ค้นหาเว็บไซต์

วิธีตรวจสอบและแก้ไขปัญหาการบู๊ตใน Linux


ระบบ Linux บูตเร็วมากจนเอาต์พุตส่วนใหญ่เลื่อนเร็วเกินไปที่จะอ่านข้อความ (แสดงบริการที่กำลังเริ่มต้น) ที่ส่งไปยังคอนโซล ดังนั้นการสังเกตปัญหา/ข้อผิดพลาดในการบู๊ตจึงกลายเป็นเรื่องท้าทายสำหรับเรา

ในบทความนี้ เราจะอธิบายโดยย่อเกี่ยวกับขั้นตอนต่างๆ ในกระบวนการบูทระบบ Linux จากนั้นเรียนรู้วิธีสร้างและแก้ไขปัญหาการบูทด้านล่าง: ในแง่ของไฟล์ที่ต้องตรวจสอบหรือคำสั่งเพื่อดูข้อความบูทระบบ

สรุปกระบวนการบูต Linux

โดยสรุป เมื่อเรากดปุ่ม เปิดเครื่อง BIOS (Basic Input Output System) โปรแกรมที่รวมอยู่ในเมนบอร์ดจะ >POST (การทดสอบตัวเองเมื่อเปิดเครื่อง) – โดยที่ฮาร์ดแวร์ เช่น ดิสก์, RAM (หน่วยความจำเข้าถึงโดยสุ่ม), แป้นพิมพ์ ฯลฯ จะถูกสแกน ในกรณีที่มีข้อผิดพลาด (ฮาร์ดแวร์หายไป/ทำงานผิดปกติ) จะมีการรายงานบนหน้าจอ

ในระหว่าง POST BIOS จะค้นหาอุปกรณ์สำหรับบูต ซึ่งเป็นดิสก์ที่จะเริ่มทำงาน (โดยปกติจะเป็นฮาร์ดดิสก์ตัวแรก อย่างไรก็ตาม เราอาจกำหนดค่าให้เป็น DVD, USB , การ์ดเครือข่าย ฯลฯ แทน)

จากนั้นระบบจะเชื่อมต่อกับดิสก์และค้นหา Master Boot Record (ขนาด 512 ไบต์) ซึ่งเก็บบูตโหลดเดอร์ (ขนาด 446 ไบต์) และพื้นที่ส่วนที่เหลือจะเก็บข้อมูลเกี่ยวกับพาร์ติชันของดิสก์ (สูงสุดสี่) และ MBR นั้นเอง

การอ่านที่แนะนำ: 4 ตัวโหลดบูต Linux ที่ดีที่สุด

บูตโหลดเดอร์จะระบุและชี้ไปที่ รวมทั้งโหลด เคอร์เนล และไฟล์ initrd (ดิสก์ RAM การเริ่มต้น – ช่วยให้เคอร์เนลเข้าถึงระบบไฟล์รูทที่เมาท์และโมดูล/ไดรเวอร์ที่จัดเก็บไว้ใน / lib) ซึ่งโดยทั่วไปจะถูกจัดเก็บไว้ในไดเร็กทอรี /boot ของระบบไฟล์

หลังจากโหลดเคอร์เนลแล้ว เคอร์เนลจะดำเนินการ init (หรือ systemd บน Linux distros รุ่นใหม่) ซึ่งเป็นกระบวนการแรกด้วย PID 1 ซึ่งจะเริ่มต้นกระบวนการอื่นๆ ทั้งหมดบนระบบ นอกจากนี้ยังเป็นกระบวนการสุดท้ายที่จะดำเนินการเมื่อปิดระบบ

วิธีค้นหาปัญหาการบูต Linux หรือข้อความแสดงข้อผิดพลาด

ดังที่เราได้กล่าวไปแล้ว กระบวนการบูตของ Linux เกิดขึ้นอย่างรวดเร็วจนเราไม่สามารถอ่านเอาต์พุตส่วนใหญ่ที่ส่งไปยังคอนโซลได้อย่างชัดเจนด้วยซ้ำ

ดังนั้นการจดบันทึกปัญหา/ข้อผิดพลาดในการบู๊ตจึงจำเป็นต้องให้ผู้ดูแลระบบตรวจสอบไฟล์สำคัญบางไฟล์ร่วมกับคำสั่งเฉพาะ และสิ่งเหล่านี้ได้แก่:

/var/log/boot.log – บันทึกข้อความการบูตระบบ

นี่อาจเป็นไฟล์แรกที่คุณต้องการดู เพื่อดูข้อมูลทั้งหมดที่เกิดขึ้นระหว่างการบูตระบบ

แทนที่จะพยายามอย่างหนักเพื่อติดตามผลลัพธ์บนหน้าจอระหว่างการบู๊ต เราสามารถดูไฟล์นี้หลังจากกระบวนการบู๊ตเสร็จสิ้น เพื่อช่วยเราระบุและแก้ไขปัญหา/ข้อผิดพลาดในการบู๊ต

เราใช้คำสั่ง cat เพื่อจุดประสงค์ดังต่อไปนี้ (ด้านล่างเป็นตัวอย่างของไฟล์นี้):

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

จากผลลัพธ์ด้านบน เราจะเห็นว่ามีปัญหาในการบู๊ตที่ระบุโดยบรรทัดด้านล่าง

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

ปัญหา: ปัญหาเกี่ยวกับพาร์ติชั่นสลับ; ระบบไม่สามารถอ่านไฟล์สลับ/อุปกรณ์/พาร์ติชั่น หรือไม่มีอยู่

ตรวจสอบว่าระบบใช้พื้นที่สว็อปพร้อมคำสั่งฟรีหรือไม่

free

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

หรือเราอาจเรียกใช้ คำสั่ง swapon เพื่อดูสรุปการใช้พื้นที่สว็อปของระบบ (เราจะไม่ได้รับผลลัพธ์ใดๆ)

swapon -s

เราสามารถแก้ไขปัญหานี้ได้โดยการสร้างพื้นที่สว็อปใน Linux

หมายเหตุ: เนื้อหาของไฟล์นี้จะถูกล้างเมื่อปิดระบบ: ข้อมูลใหม่จะถูกเก็บไว้ในนั้นในการบูตครั้งใหม่

/var/log/messages – บันทึกระบบทั่วไป

ไฟล์นี้จัดเก็บข้อความระบบทั่วไป รวมถึงข้อความที่บันทึกไว้ระหว่างการบูตระบบ

หากต้องการดู ให้พิมพ์:

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

เนื่องจากไฟล์นี้อาจมีความยาวค่อนข้างมาก เราจึงสามารถดูได้ในหน้าต่างๆ โดยใช้ คำสั่งเพิ่มเติม (ซึ่งแสดงเปอร์เซ็นต์ด้วยซ้ำ) เช่นนี้

more /var/log/messages

เนื้อหาของ /var/log/messages ซึ่งแตกต่างจากไฟล์ก่อนหน้านี้จะไม่ถูกล้างการปิดระบบ เนื่องจากไม่ได้มีเพียงข้อความสำหรับบูตเท่านั้น แต่ยังมีข้อความที่เกี่ยวข้องกับกิจกรรมของระบบอื่น ๆ ด้วยเช่นกัน ไฟล์เก่าๆ จะถูกบีบอัดและเก็บไว้ในระบบเพื่อตรวจสอบในภายหลัง ดังภาพด้านล่าง

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 – แสดงข้อความเคอร์เนล

คำสั่ง dmesg สามารถแสดงการทำงานได้เมื่อกระบวนการบู๊ตเสร็จสิ้น เช่น ตัวเลือกบรรทัดคำสั่งที่ส่งผ่านไปยังเคอร์เนล ตรวจพบส่วนประกอบฮาร์ดแวร์ เหตุการณ์เมื่อมีการเพิ่มอุปกรณ์ USB ใหม่ หรือข้อผิดพลาด เช่น ความล้มเหลวของ NIC (การ์ดอินเทอร์เฟซเครือข่าย) และไดรเวอร์รายงานว่าไม่พบกิจกรรมการเชื่อมโยงบนเครือข่าย และอื่นๆ อีกมากมาย

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 – เนื้อหาแบบสอบถามของ Systemd Journal

สิ่งนี้มีประโยชน์ใน Linux distros ปัจจุบันส่วนใหญ่ที่ใช้ systemd: ระบบใหม่ล่าสุดและตัวจัดการบริการ ภายใต้หัวข้อดังกล่าว การบันทึกระบบจะดำเนินการผ่านส่วนประกอบบันทึกประจำวัน ซึ่งเป็นตำแหน่งรวมศูนย์สำหรับข้อความทั้งหมดที่บันทึกโดยส่วนประกอบต่างๆ

ข้อความเหล่านี้รวมถึงข้อความเคอร์เนลและบูต ข้อความจาก syslog หรือบริการต่างๆ เราสามารถใช้เพื่อตรวจสอบข้อความการบูตและสร้างปัญหาการบูตโดยการอ่านเอาต์พุตและระบุบรรทัดที่น่าสนใจ (ข้อผิดพลาดชี้ให้เห็นด้วยเส้นสีแดงขึ้นอยู่กับการตั้งค่าสีข้อความของเทอร์มินัล)

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.

ด้านบนนี้คือตัวอย่างเอาต์พุตคำสั่งที่แสดงข้อผิดพลาดที่เราระบุแล้วโดยการดู /var/log/boot.log: ข้อผิดพลาดของพาร์ติชัน swap หากต้องการดูบรรทัดเอาต์พุตเพิ่มเติม เพียงกดปุ่ม [Enter]

นอกจากนี้ ลองอ่านคำแนะนำที่เป็นประโยชน์เหล่านี้เกี่ยวกับการบูตระบบ Linux และการจัดการบริการที่เกี่ยวข้องกับระบบทั่วไปและผู้จัดการบริการ:

  1. การจัดการกระบวนการใน RHEL 7: การบูต การปิดระบบ และทุกสิ่งในระหว่างนั้น
  2. การจัดการกระบวนการและบริการการเริ่มต้นระบบ (SysViit, Systemd และ Upstart)
  3. เรื่องราวเบื้องหลัง 'init' และ 'systemd': เหตุใด 'init' จึงจำเป็นต้องแทนที่ด้วย 'systemd'

ในบทความนี้ เราได้อธิบายโดยสรุปเกี่ยวกับขั้นตอนต่างๆ ในกระบวนการบูตระบบ Linux ตลอดจนเรียนรู้วิธีการสร้างและอาจแก้ไขปัญหาการบู๊ต หากต้องการเพิ่มความคิดเห็นใดๆ ลงในคู่มือนี้ ให้ใช้แบบฟอร์มความคิดเห็นด้านล่าง