ความแตกต่างระหว่าง KVM และ QEMU


138

ฉันได้อ่านเกี่ยวกับKVMและQemuบางครั้ง ณ ตอนนี้ฉันมีความเข้าใจที่ชัดเจนเกี่ยวกับสิ่งที่พวกเขาทำ

KVM รองรับการจำลองเสมือนสำหรับฮาร์ดแวร์เพื่อมอบประสิทธิภาพการทำงานใกล้เคียงกับระบบปฏิบัติการ Guest ในทางกลับกัน QEmu เลียนแบบระบบปฏิบัติการเป้าหมาย

สิ่งที่ฉันสับสนคือการประสานสองระดับนี้ ชอบ

  1. ใครเป็นผู้จัดการการแชร์ RAM และ / หรือหน่วยความจำ
  2. ใครเป็นผู้กำหนดการดำเนินงาน I / O

คำตอบ:


194

Qemu :

QEmu เป็นซอฟต์แวร์ที่สมบูรณ์และเป็นแบบสแตนด์อโลนของตัวเอง คุณใช้มันเพื่อเลียนแบบเครื่องจักรมันมีความยืดหยุ่นและพกพาได้มาก ส่วนใหญ่จะทำงานโดย 'recompiler' พิเศษที่แปลงรหัสไบนารี่ที่เขียนขึ้นสำหรับหน่วยประมวลผลที่กำหนดให้เป็นอีกอันหนึ่ง (เช่นเพื่อรันโค้ด MIPS บน PPC mac หรือ ARM ใน x86 PC)

เพื่อเลียนแบบมากกว่าตัวประมวลผล Qemu มีรายการตัวเลียนแบบอุปกรณ์ต่อพ่วงมากมาย: ดิสก์เครือข่าย VGA, PCI, USB, พอร์ตอนุกรม / พอร์ตขนาน ฯลฯ

KQemu :

ในกรณีเฉพาะที่ทั้งต้นทางและปลายทางเป็นสถาปัตยกรรมเดียวกัน (เช่นกรณีทั่วไปของ x86 บน x86) มันยังคงต้องแยกวิเคราะห์รหัสเพื่อลบ 'คำแนะนำพิเศษ' และแทนที่ด้วยบริบทสวิตช์ เพื่อให้มีประสิทธิภาพมากที่สุดใน x86 Linux มีโมดูลเคอร์เนลชื่อ KQemu ที่จัดการสิ่งนี้

ในฐานะที่เป็นโมดูลเคอร์เนล KQemu สามารถเรียกใช้งานโค้ดส่วนใหญ่ไม่เปลี่ยนแปลงโดยแทนที่เฉพาะคำแนะนำในระดับต่ำสุดเท่านั้น ในกรณีนั้น userspace Qemu ยังคงจัดสรร RAM ทั้งหมดสำหรับเครื่องที่จำลองและโหลดรหัส ข้อแตกต่างคือแทนที่จะทำการคอมไพล์โค้ดใหม่ซึ่งจะเรียก KQemu เพื่อสแกน / แก้ไข / เรียกใช้งาน การจำลองฮาร์ดแวร์ต่อพ่วงทั้งหมดทำใน Qemu

นี่เร็วกว่า Qemu ธรรมดามากเพราะรหัสส่วนใหญ่ไม่เปลี่ยนแปลง แต่ยังต้องเปลี่ยนรหัส ring0 (รหัสส่วนใหญ่ในเคอร์เนลของ VM) ดังนั้นประสิทธิภาพจึงยังคงลดลง

KVM :

KVM เป็นสองสิ่ง: อันดับแรกคือโมดูลเคอร์เนล Linux ซึ่งตอนนี้รวมอยู่ในการฉีดซึ่งจะเปลี่ยนโปรเซสเซอร์ให้อยู่ในสถานะ 'แขก' ใหม่ สถานะแขกมีชุดสถานะแหวนของตนเอง แต่คำแนะนำริง 0 ที่มีสิทธิใช้งานจะกลับไปที่รหัสไฮเปอร์ไวเซอร์ เนื่องจากเป็นโหมดตัวประมวลผลใหม่ของการประมวลผลจึงไม่จำเป็นต้องแก้ไขรหัสใด ๆ

นอกเหนือจากการเปลี่ยนสถานะของตัวประมวลผลแล้วเคอร์เนลโมดูลยังจัดการส่วนจำลองระดับต่ำบางส่วนเช่นการลงทะเบียน MMU (ใช้เพื่อจัดการ VM) และบางส่วนของฮาร์ดแวร์ที่จำลอง PCI

ประการที่สอง KVM เป็นทางแยกของ Qemu ที่ปฏิบัติการได้ ทั้งสองทีมทำงานอย่างแข็งขันเพื่อรักษาความแตกต่างอย่างน้อยและมีความก้าวหน้าในการลด ในที่สุดเป้าหมายคือ Qemu ควรทำงานได้ทุกที่และหากโมดูลเคอร์เนล KVM พร้อมใช้งานก็สามารถใช้งานได้โดยอัตโนมัติ แต่สำหรับอนาคตอันใกล้นี้ทีม Qemu มุ่งเน้นไปที่การจำลองฮาร์ดแวร์และการพกพาในขณะที่ KVM folks มุ่งเน้นไปที่โมดูลเคอร์เนล (บางครั้งย้ายส่วนเล็ก ๆ ของการจำลองที่นั่นถ้ามันปรับปรุงประสิทธิภาพ) และเชื่อมต่อกับส่วนที่เหลือของรหัสผู้ใช้

ไฟล์สั่งการ kvm-qemu ทำงานได้เหมือนปกติ Qemu: จัดสรรแรมโหลดรหัสและแทนที่จะคอมไพล์ใหม่หรือเรียก KQemu มันวางไข่เธรด (นี่เป็นสิ่งสำคัญ) เธรดเรียกใช้โมดูลเคอร์เนล KVM เพื่อสลับไปยังโหมดผู้เยี่ยมชมและดำเนินการเพื่อเรียกใช้โค้ด VM ในคำสั่งที่มีสิทธิพิเศษมันจะสลับกลับไปเป็นโมดูลเคอร์เนล KVM ซึ่งหากจำเป็นให้ส่งสัญญาณเธรด Qemu เพื่อจัดการกับการจำลองฮาร์ดแวร์ส่วนใหญ่

หนึ่งในสิ่งที่ดีของสถาปัตยกรรมนี้คือรหัสแขกถูกจำลองในเธรด posix ซึ่งคุณสามารถจัดการได้ด้วยเครื่องมือ Linux ปกติ หากคุณต้องการ VM ที่มี 2 หรือ 4 คอร์ kvm-qemu สร้างเธรด 2 หรือ 4 เธรดแต่ละตัวจะเรียกใช้โมดูลเคอร์เนล KVM เพื่อเริ่มการทำงาน การทำงานพร้อมกัน - ถ้าคุณมีแกนจริงเพียงพอหรือไม่ - หากไม่มี - จะถูกจัดการโดยตัวกำหนดตารางเวลาปกติของ Linux ทำให้รหัสมีขนาดเล็กและเซอร์ไพรซ์ จำกัด


3
และสำหรับผู้ที่ thouse กับฉันไม่ได้มี CPU ด้วยการสนับสนุน VT, ข่าวร้าย(ดีว่าอาจจะเรียกว่า«ข่าว») - KQEMU ไม่สนับสนุนในอูบุนตู KVM ไม่ทำงานกับ CPU หากไม่มีการสนับสนุน
Hi-Angel

100

เมื่อทำงานร่วมกัน KVM จะ จำกัด การเข้าถึง CPU และหน่วยความจำและ QEMU จำลองทรัพยากรฮาร์ดแวร์ (ฮาร์ดดิสก์วิดีโอ USB ฯลฯ ) เมื่อทำงานคนเดียว QEMU จะจำลองทั้ง CPU และฮาร์ดแวร์


9
@ คำตอบของ Javier นั้นมีรายละเอียดและควรเป็นคำตอบที่แน่นอน แต่คำตอบของคุณสามารถให้ฉันได้สองสามประโยคในสิ่งที่ฉันจำเป็นต้องรู้ดังนั้น +1 และขอบคุณ
Bill The Ape

-2

QEMU ช้าลงและ KVM พร้อมให้ความช่วยเหลือ QEMU เพื่อให้บรรลุความเร็วฮาร์ดแวร์อย่างรวดเร็วเพื่อให้ได้ประสิทธิภาพที่ดีที่สุดสำหรับระบบ QEMU คือ hypervisor / Emulator

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.