Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เครื่องเสมือน

แก้ไข VirtualBox Guest Additions Build Errors: คู่มือแก้ปัญหาแบบขั้นตอน

ก่อนอื่น หัวข้อบทความนี้สัญญามากมาย มาลดขอบเขตและปรับ expectations ให้เหมาะสม จุดเริ่มต้นคือ คุณเคยใช้ VirtualBox และติดตั้ง Guest Additions ใน Linux VMs ของคุณ ตอนนี้ เพราะเหตุผลบางอย่าง VirtualBox service ไม่รันใน guest OS แล้ว หากพยายามติดตั้ง modules อีกครั้ง จะได้ weird failure (ความล้มเหลวแปลกๆ) ชี้ไปที่ bad kernel configuration, missing sources และ headers และปัญหาแบบนั้น แต่นี่ทั้งหมด ไม่มีความหมาย (make sense) เลย

คุณมี kernel sources และ headers ที่ถูกต้อง แต่เพราะเหตุผลบางอย่าง VirtualBox ไม่เห็นพวกมัน และดังนั้น compilation ของ main kernel module จึง fail ซึ่งส่งผลต่อการทำงานของ VMs ของคุณ อีกทั้งสิ่งนี้เกิดขึ้นเกือบ random และบางครั้งมาหลัง kernel updates ด้วยทุกอย่างนี้ในใจ เราจะพยายามแก้ปัญหาด้วย tricks ที่เรียบง่ายและสะอาด

ปัญหาที่เผชิญ (Problem at hand)

มาสาธิตด้วย CentOS VM คุณมี build tools ที่จำเป็นทั้งหมด และเราทำ exercise นี้หลายครั้งแล้ว รวมถึงตอนพยายาม setup Nvidia drivers สำหรับ OS นี้ same drill applies (ขั้นตอนเดียวกันใช้ได้) แต่แม้คุณจะรัน distros อื่น กระบวนการได้ tools และ software ที่ถูกต้องเพื่อ compile ก็คล้ายกันมาก เมื่อจับคอนเซปต์ได้ ก็ easy peasy (ง่ายมาก) อย่างไรก็ตาม ขณะ building modules (<mount>/VBoxLinuxAdditions.run) คำสั่ง fail:

Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If
the following module compilation fails then this could be the
reason. The missing package can be probably installed with
yum install kernel-devel-...

Building the main Guest Additions module [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)

แต่ถ้าพยายามติดตั้ง package ที่ขาดหายไปดูเหมือนจะขาด:

Package kernel-devel-... already installed and latest version
Nothing to do

วิธีแก้ (Solution)

เราต้อง consult (ปรึกษา) logs และนี่คือ troubleshooting exercise ที่ยอดเยี่ยม ควรช่วยคุณฝึกทักษะ Linux problem solving ซึ่งเป็น ultimate mission (ภารกิจสุประวัติ) ที่นี่ Dedoimedo เปิด log file และมองเข้าไป ควรเริ่มจากล่างขึ้นบน ด้วย last error และพยายามหาว่าเกิดอะไรขึ้น หนึ่งใน notable errors (ข้อผิดพลาดที่โดดเด่น) จะเป็น:

Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=<directory> and run Make again. Stop.

น่าสนใจ VirtualBox จริงๆไม่เห็น kernel sources ของเรา มาแก้แล้วรันคำสั่งอีกครั้งดูว่าแก้ปัญหาที่เผชิญได้หรือไม่

export KERN_DIR=/usr/src/kernels/`uname -r`

ยังไม่ดี เราต้องหา error อื่น ดูกลับไปที่ installation problem script จะ complain (บ่น) เกี่ยวกับ headers มากกว่า sources หมายความว่า issue ของเราอาจอยู่ที่อื่น และ browse ผ่าน logs อีกครั้ง พร้อม extra insight (ข้อมูลเชิงลึกเพิ่มเติม) หนึ่งในบรรทัด - ไม่สนใจ kernel version เฉพาะเจาะจง มันไม่สำคัญ

grep: /lib/modules/3.10.0-123.20.1.el7.x86_64/build/include/
linux/version.h: No such file or directory

ดูเหมือน weird bug (บั๊กแปลก) เพราะเรารู้ว่ามี headers อยู่แล้ว จาก yum command คืนค่า ถ้าเรา cd เข้าไปใน /lib/modules directory สำหรับ running kernel ด้วยตัวเอง เราจะเห็นว่าเราเจอ broken symbolic link

link build ชี้ไปที่ relative path ซึ่งไม่ใช่ good idea (ไอเดียที่ดี) และดังนั้น VirtualBox จึงหา expected software ไม่เจอ เราจะแก้โดยใช้ absolute path และหลีกเลี่ยง issue ทั้งหมด

cd /lib/modules/`uname -r`/
ln -sf /usr/src/kernels/3.10.63-11.el7.x86_64 build

ตอนนี้ symbolic links ถูกแก้แล้ว:

และเราสามารถ compile ได้อย่างมีความสุข:

สรุป

เราถึงจุดสิ้นสุดของ tutorial แล้ว นั้นเล็กน้อย wiser (ฉลาดขึ้น), smarter (อัจฉริยะขึ้น), more relaxed (ผ่อนคลายขึ้น), happier (มีความสุขขึ้น) ปัญหาแบบนี้สามารถทำให้คนบ้าจริงๆ เพราะมี false positive symptoms (อาการปลอม) หลายสิบอย่าง ที่อาจก่อให้เกิด errors คล้ายกัน แต่ถ้าเรา exclude (ตัดออก) build issues จำได้ว่าเคยทำงานได้ดี แล้วเราสามารถลืมเรื่อง VirtualBox vs. kernel incompatibility และมองที่อื่น

ในกรณีของเรา badly implemented symbolic link (symbolic link ที่ถูก implement อย่างแย่) คือ source [sic] (แหล่งที่มา - มีการเล่นคำปัน) ของปัญหาทั้งหมด เหตุผลที่เป็นเช่นนั้น ผมไม่แน่ใจ หรือว่าทำไมมันเปลี่ยน แต่บาง installed packages อาจเปลี่ยนมัน หรือบางอย่างในระบบตัดสินใจ misbehave (ทำงานผิดปกติ) สิ่งสำคัญคือเราเข้าใจ workflow และสามารถ trace back (ย้อนกลับ) และแก้ไขปัญหาได้ Awesome เหรอ? ว่างั้น guide ของเราเสร็จสมบูรณ์ Enjoy (เพลิดเพลินไป)

ขอแสดงความนับถือ