วิธีตรวจสอบและแก้ไขปัญหาการบู๊ตใน 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 และการจัดการบริการที่เกี่ยวข้องกับระบบทั่วไปและผู้จัดการบริการ:
- การจัดการกระบวนการใน RHEL 7: การบูต การปิดระบบ และทุกสิ่งในระหว่างนั้น
- การจัดการกระบวนการและบริการการเริ่มต้นระบบ (SysViit, Systemd และ Upstart)
- เรื่องราวเบื้องหลัง 'init' และ 'systemd': เหตุใด 'init' จึงจำเป็นต้องแทนที่ด้วย 'systemd'
ในบทความนี้ เราได้อธิบายโดยสรุปเกี่ยวกับขั้นตอนต่างๆ ในกระบวนการบูตระบบ Linux ตลอดจนเรียนรู้วิธีการสร้างและอาจแก้ไขปัญหาการบู๊ต หากต้องการเพิ่มความคิดเห็นใดๆ ลงในคู่มือนี้ ให้ใช้แบบฟอร์มความคิดเห็นด้านล่าง