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

เชี่ยวชาญ KVM: คู่มือผู้เชี่ยวชาญสำหรับ Common Issues & Troubleshooting

เมื่อสักพักก่อน ผมให้ Xen troubleshooting articles สองชิ้น ซึ่ง discuss (อภิปราย) common problems ที่คุณอาจเจอเมื่อพยายาม provision (จัดเตรียม) environment ด้วย Xen technology วันนี้เราจะทำสิ่งเดียวกันกับ KVM

ส่วนตัวผมคิดว่า KVM far more elegant (ซับซ้อนน้อยกว่า/เรียบง่ายกว่า) เมื่อพูดถึง Python vomit verbosity (ความ冗长ของ Python) และ overall complexity แตคุณยังคงเจอ ugly errors บางครั้งที่ทำให้ชีวิตยากขึ้น Tutorial นี้จะสอนคุณ workaround (แก้ไขชั่วคราว/หลีกเลี่ยง) พวกมัน identify (ระบุ) possible configuration และ setup conflicts และ variety ของ neat tricks (เทคนิคน่าสนใจ) ติดตามมา

Tip 1: Bridge networking interface ไม่แสดง

สมมติคุณอยากใช้ custom bridge device ที่สร้างชื่อ br0 อย่างไรก็ตาม เมื่อพยายาม setup network และทำให้ guests ใช้ specific interface มันไม่แสดงใน dropdown menu ใน Virtual Machine Manager รูปด้านล่างแสดง exact opposite (ตรงข้าม) แต่ลองจินตนาการว่า desired device ไม่อยู่ใน list of available adapters นี่อาจเกิดขึ้น และผมเคยเห็น Trust me on this one (เชื่อผมซิ) citizens of the Internet

เชี่ยวชาญ KVM: คู่มือผู้เชี่ยวชาญสำหรับ Common Issues & Troubleshooting

Solution (วิธีแก้) very simple - manually edit configuration file สำหรับ domain ของคุณ By default KVM stores files ใน two locations คือ /etc/kvm/vm หรือ /etc/libvirt/qemu ดังนั้นคุณ most likely (น่าจะ) หา XML files ได้ที่นั่น เปิด relevant file และ manually change bridged adapter details ภายใต้ <source bridge> ปิดไฟล์ start VM และ enjoy

<interface type='bridge'>
<source bridge='br0'/>
<mac address='52:54:00:0d:e6:4a'/>
</interface>

Tip 2: Biosdevname & no network

Biosdevname คือ utility ที่พยายาม assign (กำหนด) BIOS-given names ให้ devices preserving (รักษา) commonality และ simplifying (ลดความซับซ้อน) logic ของ hardware administration โดยเฉพาะ network devices หากคุณมีหลายตัว พร้อม unique capabilities หรือ functions คุณจะยากที่จะ identify (ระบุ) ด้วย generic ethX names แต่ถ้าถูก given unique strings คุณจะแยก 1Gbps และ 10Gbps adapters ได้ง่ายขึ้น Naturally (โดยธรรมชาติ) นี่ mostly useful (มีประโยชน์มาก) สำหรับ enterprise systems เพราะ people at home (คนที่บ้าน) hardly ever (เกือบไม่เคย) มี dilemma (ดิเลมมา/ความยากลำบาก) นี้

อย่างไรก็ตาม side effect (ผลข้างเคียง) ของ biosdevname คือ หากใช้ภายใน guest OSs ใน KVM-created VMs คุณอาจ end up without network (จบไม่มี network) เพราะ virtualized devices จะได้ physical names ที่ not quite match (ไม่ตรงกันพอ)

มี several ways workaround หนึ่ง บาง versions ของ utility สามารถ detect (ตรวจจับ) ได้ว่าถูก invoke (เรียกใช้) ภายใน virtual environment และจะ exit โดยไม่ทำ changes อีกหนึ่งคือ pass kernel argument ใน GRUB menu; biosdevname=0 จะ disable utility จากการรัน

Option ที่สามคือ hack udev rules ที่ใช้ assign names ให้ network cards ตัวอย่าง rudimentary (ขั้นพื้นฐาน/ไม่สมบูรณ์) นี่ design สำหรับ machine ที่มี single network adapter ดังนั้นคุณจะต้องการ more dynamic logic สำหรับ multiple cards หรือ ตามที่ commented text บอก คุณจะต้อง create single separate line สำหรับแต่ละ rule

เชี่ยวชาญ KVM: คู่มือผู้เชี่ยวชาญสำหรับ Common Issues & Troubleshooting

คุณสามารถทำ manual change เพื่อได้ classic assignment:

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

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

# PCI device ...
SUBSYSTEM=="net", ACTION=="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth_biosname"

# PCI device ...
SUBSYSTEM=="net", ACTION=="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth0"

คุณจะได้ rules ต่างกันขึ้นอยู่กับ virtual hardware ที่คุณใช้ใน VMs เช่น คุณอาจเลือก Realtek, e1000 หรือ virtio virtual hardware ทำให้ได้ strings อื่นๆ โปรดระวังและ ensure (ให้แน่ใจ) ว่า match solution กับ specific environment ของคุณ

Tip 3: Domain already exists

เกิดอะไรขึ้นหากคุณพยายาม define new domain และมัน already exists (มีอยู่แล้ว) ยกเว้นคุณมีปัญหาหา configuration file หรือ declaration ไม่เจอ virsh list ไม่มี virt-manager ไม่ show ที่ไหนเลย ทำไง?

virsh define machine.xml
error: Failed to define domain from machine.xml
error: operation failed: domain 'machine' already exists
with uuid 883ab02f-1a67-7430-ef9a-2b59af52210e7

คุณต้องหา configuration file และ delete มัน แล้ว restart libvirtd service

updatedb
locate machine.xml
rm <full path to machine.xml>
/etc/init.d/libvirtd restart

Tip 4: Internal error Unable to find cgroup

ปัญหานี้อาจ manifest (แสดงออก) หลัง restart libvirtd เช่นตัวอย่างข้างต้น หรือ completely unrelated (ไม่เกี่ยวข้องเลย) Full error message อาจดูแบบนี้:

virsh create machine.xml
error: Failed to create domain from machine.xml
error: internal error Unable to find cgroup for machine

Reason (เหตุผล) ของ bug นี้อาจ related to systemd ตาม Bugzilla report แต่อาจเกิดบน pristine machines (เครื่องสะอาด/ติดตั้งใหม่) ที่ไม่ใช้ systemd ได้เช่นกัน ใน most cases (กรณีส่วนใหญ่) มันคือ very indelicate race (สภาวะแข่งขันที่ไม่ค่อยเป็นทางการ) ระหว่าง cgroups และ libvirtd เกิดจาก libvirtd service coming up ก่อน cgroups หนึ่งใน cgroups ถูกลบ หรือไม่ exist (ไม่มีอยู่) ตั้งแต่แรก

คุณสามารถ resolve ได้โดย edit libvirtd configuration /etc/libvirt/qemu.conf ภายในไฟล์นี้ คุณต้อง edit cgroups_controllers directive ให้ไม่ list cgroups ใดๆ ในกรณีนั้น libvirtd จะสามารถ run without them ได้

cgroups_controllers = [ ]

หลังจากนี้ restart libvirtd อีกครั้ง หรือทางเลือกคือ manual create necessary cgroups และ assign libvirtd process เข้า relevant subsystem

Tip 5: Virtual machine หายจาก VMM เมื่อ halt/reboot

นี่อาจเป็น very simple issue จริงๆ หลังจาก halt หรือ reboot VM VM console closes configurations ของคุณอยู่ที่นั่น แต่เป็น major inconvenience (ความไม่สะดวกใหญ่) เพราะคุณต้อง interfere (แทรกแซง) ใน machine management cycle

คุณต้องหา on_reboot clause ใน XML file ที่เกี่ยวข้องสำหรับ VM ของคุณ และ ensure (ให้แน่ใจ) ว่า action ตั้งเป็น restart แทน destroy นั่นคือ all there is to it (ทั้งหมดที่มี)

<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>

Tip 6: No reboot action; function is not supported

อีกครั้ง very related to previous tip หากคุณ specify reboot แทน restart คุณจะเรียนรู้ว่า invalid command ที่ KVM cannot execute อย่างไรก็ตาม คุณ most likely จะเห็น rather prolific error (ข้อผิดพลาดที่เยอะมาก/รวดเร็ว):

libvirtError: this function is not supported by the hypervisor: virDomainReboot

หากใช้ restart ทุกอย่างจะ well (ดี/ปกติ)

Tip 7: Bootloader error หลัง installation

บางครั้งคุณอาจเห็น GRUB error น่าจะเป็นหมายเลข 15 บน first reboot หลัง installation จาก external media source นี่อาจเกิดขึ้นหากคุณทิ้ง CD/DVD image attached ไว้ที่ VM และ selected เป็น first boot device ใน XML file ปัญหา similar to (คล้ายกับ) VirtualBox bug นี้ affecting some Linux distributions ตัวอย่าง:

root (hd0,1)
Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz

Error 15: File not found

Press any key to continue...

คุณสามารถ resolve ได้โดย unmount ISO image และ reboot guest ครั้งนี้ควร work well โปรดสังเกต issue จะไม่ manifest หากคุณ set hard disk เป็น first bootable device เพราะ KVM จะ automatically skip ไป second available source น่าจะเป็น PXE หรือ CD/DVD หากไม่หา valid partition table บน disk ซึ่งควรเป็น case หากคุณเพิ่ง install เท่านั้น

และผม guess (คาดเดา) เราจบที่นี่สำหรับวันนี้

อ่านเพิ่มเติม (More reading)

คุณอาจสนใจ KVM articles เพิ่มเติม:

KVM storage and network guides, plus bridged networking

KVM + Virtualbox side-by-side usage howto

KVM cloning guide

สรุป

Half a dozen tips (6 tips) สำหรับ first troubleshooting guide ไม่แย่เลย ผมคิด Tutorial นี้ focus บน bridged networking setup, working around biosdevname, cgroups + libvirtd problems, unregistering duplicate domains auto-created by virt-manager และ resolving guest OS restart woes (ปัญหา/ความยากลำบาก)

Most of the work ทำได้โดย editing configuration files และ restarting services เราไม่ rely (พึ่งพา) GUI เพราะ any action ที่ translate เป็น command line แล้วสามารถ scripted (เขียนสคริปต์) ได้ เพื่อ easier และ fully automated management อย่างไรก็ตาม ผมหวังว่าคุณชอบ หากมี ideas สำหรับ sequel (ตอนต่อไป) ping (ติดต่อ) ผม

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