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

การแก้ไขปัญหา KVM ทั่วไป

ย้อนกลับไปก่อนหน้านี้ ฉันได้ให้บทความการแก้ไขปัญหา Xen แก่คุณสองบทความ ซึ่งกล่าวถึงปัญหาทั่วไปบางข้อที่คุณอาจพบเมื่อพยายามจัดเตรียมสภาพแวดล้อมของคุณโดยใช้เทคโนโลยี Xen วันนี้เราจะทำสิ่งเดียวกันกับ KVM

โดยส่วนตัวแล้ว ฉันคิดว่า KVM นั้นสวยงามกว่ามากเมื่อพูดถึง Python ที่เน้นการใช้คำฟุ่มเฟือยและความซับซ้อนโดยรวม แต่บางครั้งคุณก็ยังอาจพบข้อผิดพลาดที่น่าเกลียดซึ่งจะทำให้ชีวิตของคุณยากขึ้น บทช่วยสอนนี้จะสอนวิธีแก้ไขปัญหา วิธีการระบุข้อขัดแย้งในการกำหนดค่าและการตั้งค่าที่เป็นไปได้ และเคล็ดลับอื่นๆ ที่หลากหลาย หลังจากฉัน.

เคล็ดลับที่ 1:อินเทอร์เฟซเครือข่ายบริดจ์ไม่แสดงขึ้น

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

การแก้ไขปัญหา KVM ทั่วไป

วิธีแก้ไขนั้นง่ายมาก - แก้ไขไฟล์การกำหนดค่าสำหรับโดเมนของคุณด้วยตนเอง ตามค่าเริ่มต้น KVM จะจัดเก็บไฟล์ไว้ในสองตำแหน่ง ได้แก่ /etc/kvm/vm หรือ /etc/libvirt/qemu ดังนั้นคุณจึงมักพบไฟล์ XML ที่นั่น เปิดอันที่เกี่ยวข้องและเปลี่ยนรายละเอียดอะแด็ปเตอร์บริดจ์ด้วยตนเองภายใต้ <ซอร์สบริดจ์> ปิดไฟล์ เริ่มเครื่องเสมือนและเพลิดเพลิน

<ประเภทอินเทอร์เฟซ='บริดจ์'>
<ซอร์สบริดจ์='br0'/>
<ที่อยู่ mac='52:54:00:0d:e6:4a'/>

เคล็ดลับ 2:Biosdevname &ไม่มีเครือข่าย

Biosdevname เป็นโปรแกรมอรรถประโยชน์ที่พยายามกำหนดชื่อที่ BIOS ให้กับอุปกรณ์ รักษาความเหมือนกันและลดความซับซ้อนของตรรกะในการดูแลระบบฮาร์ดแวร์ โดยเฉพาะอย่างยิ่งกับอุปกรณ์เครือข่าย หากคุณมีหลายตัวที่มีความสามารถหรือฟังก์ชันเฉพาะตัว คุณจะพบว่าเป็นการยากที่จะระบุชื่อเหล่านั้นด้วยชื่อ ethX ทั่วไป แต่ถ้าพวกเขาได้รับสตริงที่ไม่ซ้ำกัน คุณจะแยกความแตกต่างของอแดปเตอร์ 1Gbps และ 10Gbps และอื่นๆ ในทำนองเดียวกันได้อย่างง่ายดาย โดยปกติแล้ว สิ่งนี้มีประโยชน์สำหรับระบบขององค์กรเป็นส่วนใหญ่ เนื่องจากคนที่อยู่ที่บ้านแทบจะไม่มีปัญหานี้เลย

อย่างไรก็ตาม ผลข้างเคียงของการใช้ biosdevname คือหากมีการใช้ภายในระบบปฏิบัติการทั่วไปในเครื่องเสมือนที่สร้างโดย KVM ของคุณ คุณอาจต้องจบลงโดยไม่มีเครือข่าย เนื่องจากอุปกรณ์เสมือนจริงจะได้รับชื่อจริงที่ไม่ตรงกัน

มีหลายวิธีที่คุณสามารถแก้ไขปัญหาได้ หนึ่ง ยูทิลิตีบางเวอร์ชันสามารถตรวจพบว่ากำลังถูกเรียกใช้งานภายในสภาพแวดล้อมเสมือนจริง และจะออกจากระบบโดยไม่มีการเปลี่ยนแปลงใดๆ อีกวิธีหนึ่งคือการส่งอาร์กิวเมนต์เคอร์เนลในเมนูด้วง biosdevname=0 จะปิดใช้งานยูทิลิตี้ไม่ให้ทำงาน

ตัวเลือกที่สามคือการแฮ็คกฎ udev ที่ใช้ในการกำหนดชื่อให้กับการ์ดเครือข่าย นี่เป็นตัวอย่างพื้นฐานมาก อันนี้ออกแบบมาสำหรับเครื่องที่มีอะแดปเตอร์เครือข่ายเดียว ดังนั้นคุณจะต้องใช้ตรรกะแบบไดนามิกมากขึ้นสำหรับการ์ดหลายใบ หรือตามที่ข้อความแสดงความคิดเห็นระบุไว้ คุณจะต้องสร้างบรรทัดแยกต่างหากสำหรับแต่ละกฎ

การแก้ไขปัญหา KVM ทั่วไป

คุณสามารถทำการเปลี่ยนแปลงด้วยตนเองเพื่อรับการมอบหมายแบบคลาสสิก:

vi /etc/udev/rules.d/70-persistent-net.rules

แทนที่สตริง NAME จาก "eth_biosname" เป็น "ethX" หรืออะไรก็ได้ที่คุณต้องการ:

#อุปกรณ์ PCI ...
SUBSYSTEM=="net", ACTION="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth_biosname"

#อุปกรณ์ PCI ...
SUBSYSTEM=="net", ACTION="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth0"

คุณจะได้รับกฎที่แตกต่างกันขึ้นอยู่กับฮาร์ดแวร์เสมือนที่คุณใช้ในเครื่องเสมือนของคุณ ตัวอย่างเช่น คุณสามารถเลือกใช้ฮาร์ดแวร์เสมือน Realtek, e1000 หรือ virtio ซึ่งส่งผลให้มีสตริงอื่นๆ ให้ความสนใจและตรวจสอบให้แน่ใจว่าคุณจับคู่โซลูชันกับสภาพแวดล้อมเฉพาะของคุณ

เคล็ดลับ 3:มีโดเมนอยู่แล้ว

จะเกิดอะไรขึ้นหากคุณพยายามกำหนดโดเมนใหม่และโดเมนนั้นมีอยู่แล้ว ยกเว้นว่าคุณกำลังประสบปัญหาในการค้นหาไฟล์การกำหนดค่าหรือการประกาศ ไม่มีรายการ virsh ผู้จัดการ virt ไม่แสดงที่ใดก็ได้ แล้วคุณจะทำอย่างไร?

virsh กำหนด machine.xml
ข้อผิดพลาด:ไม่สามารถกำหนดโดเมนจาก machine.xml
ข้อผิดพลาด:การดำเนินการล้มเหลว:โดเมน 'เครื่อง' มีอยู่แล้ว
ด้วย 883ab02f-1a67-7430-ef9a-2b59af52210e7

คุณจะต้องค้นหาไฟล์การกำหนดค่าและลบออก จากนั้นเริ่มบริการ libvirtd ใหม่

อัพเดทb
ค้นหา machine.xml
rm <เส้นทางแบบเต็มไปยัง machine.xml>
/etc/init.d/libvirtd รีสตาร์ท

เคล็ดลับ 4:ข้อผิดพลาดภายในไม่พบกลุ่ม cgroup

ปัญหานี้อาจปรากฏขึ้นหลังจากรีสตาร์ท libvirtd เช่นในตัวอย่างด้านบน หรือไม่เกี่ยวข้องเลย ข้อความแสดงข้อผิดพลาดแบบเต็มอาจมีลักษณะดังนี้:

virsh สร้าง machine.xml
ข้อผิดพลาด:สร้างโดเมนจาก machine.xml ไม่สำเร็จ
ข้อผิดพลาด:ข้อผิดพลาดภายใน ไม่พบ cgroup สำหรับเครื่อง

สาเหตุของข้อผิดพลาดนี้อาจเกี่ยวข้องกับ systemd ตามที่ระบุไว้ในรายงาน Bugzilla แต่ก็สามารถเกิดขึ้นได้กับเครื่องดั้งเดิมของคุณที่ไม่ได้ใช้ระบบ systemd ในกรณีส่วนใหญ่ มันเป็นการแข่งขันที่ไม่ชัดเจนระหว่าง cgroups และ libvirtd ซึ่งเกิดจากบริการ libvirtd เกิดขึ้นก่อน cgroups ซึ่งเป็นหนึ่งใน cgroups ที่ถูกลบหรือไม่มีอยู่ตั้งแต่แรก

คุณสามารถแก้ไขปัญหาได้โดยแก้ไขคอนฟิกูเรชัน libvirtd /etc/libvirt/qemu.conf ภายในไฟล์นี้ คุณต้องแก้ไขคำสั่ง cgroups_controllers เพื่อไม่ให้แสดงรายการ cgroups ใด ๆ ซึ่งในกรณีนี้ libvirtd จะทำงานได้โดยไม่ต้องใช้คำสั่งเหล่านี้

cgroups_controllers =[ ]

หลังจากนี้ คุณจะต้องรีสตาร์ท libvirtd อีกครั้ง อีกทางเลือกหนึ่ง คุณจะต้องสร้าง cgroups ที่จำเป็นด้วยตนเอง และกำหนดกระบวนการ libvirtd ลงในระบบย่อยที่เกี่ยวข้อง

เคล็ดลับ 5:เครื่องเสมือนหายไปจาก VMM เมื่อหยุด/รีบูต

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

คุณต้องค้นหา on_reboot clause ในไฟล์ XML ที่เกี่ยวข้องสำหรับเครื่องเสมือนของคุณ และตรวจสอบให้แน่ใจว่าการดำเนินการถูกตั้งค่าให้เริ่มต้นใหม่แทนที่จะทำลาย ไปเลย นั่นคือทั้งหมดที่มีไป

ทำลาย
รีสตาร์ท
ทำลาย

เคล็ดลับ 6:ไม่มีการรีบูต ไม่รองรับฟังก์ชัน

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

libvirtError:ไฮเปอร์ไวเซอร์ไม่รองรับฟังก์ชันนี้:virDomainReboot

หากคุณใช้การรีสตาร์ท ทุกอย่างจะดี

เคล็ดลับที่ 7:ข้อผิดพลาดของ Bootloader หลังการติดตั้ง

บางครั้ง คุณอาจเห็นข้อผิดพลาด GRUB ซึ่งน่าจะเป็นหมายเลข 15 ในการรีบูตครั้งแรกหลังจากการติดตั้งจากแหล่งสื่อภายนอก กรณีนี้อาจเกิดขึ้นได้หากคุณปล่อยให้อิมเมจซีดี/ดีวีดีต่ออยู่กับเครื่องเสมือนและเลือกเป็นอุปกรณ์สำหรับบู๊ตเครื่องแรกในไฟล์ XML ของคุณ ปัญหาคล้ายกับบั๊ก VirtualBox นี้ซึ่งส่งผลต่อการกระจาย Linux บางส่วน ตัวอย่างเช่น:

ราก (hd0,1)
ประเภทระบบไฟล์คือ ext2fs ประเภทพาร์ติชัน 0x83
เคอร์เนล /boot/vmlinuz

ข้อผิดพลาด 15:ไม่พบไฟล์

กดปุ่มใดก็ได้เพื่อดำเนินการต่อ...

คุณสามารถแก้ไขได้โดยการยกเลิกการต่อเชื่อมอิมเมจ ISO แล้วรีบูทเกสต์ คราวนี้น่าจะได้ผลดี โปรดทราบว่าปัญหาจะไม่ปรากฏหากคุณตั้งค่าฮาร์ดดิสก์ของคุณเป็นอุปกรณ์ที่สามารถบู๊ตเครื่องแรกได้ เนื่องจาก KVM จะข้ามไปยังแหล่งที่สองที่มีให้โดยอัตโนมัติ ซึ่งส่วนใหญ่น่าจะเป็น PXE หรือ CD/DVD หากไม่พบตารางพาร์ติชันที่ถูกต้องบนดิสก์ ซึ่งควรเป็นกรณีนี้หากคุณเพิ่งติดตั้งตอนนี้

และฉันคิดว่าเราเสร็จสิ้นที่นี่สำหรับวันนี้

อ่านเพิ่มเติม

คุณอาจสนใจบทความเกี่ยวกับ KVM เพิ่มเติม:

คู่มือพื้นที่เก็บข้อมูลและเครือข่าย KVM รวมถึงการเชื่อมต่อเครือข่ายแบบบริดจ์

วิธีใช้ KVM + Virtualbox แบบเคียงข้างกัน

คู่มือการโคลน KVM

สรุป

เคล็ดลับครึ่งโหลสำหรับคู่มือการแก้ไขปัญหาเบื้องต้น ฉันคิดว่าไม่เลว บทช่วยสอนนี้มุ่งเน้นไปที่การตั้งค่าเครือข่ายบริดจ์ การทำงานกับ biosdevname ปัญหา cgroups + libvirtd การยกเลิกการลงทะเบียนโดเมนที่ซ้ำกันซึ่งสร้างโดยอัตโนมัติโดย virt-manager และการแก้ปัญหาการรีสตาร์ทระบบปฏิบัติการของแขก

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

ไชโย