Skip to content

Virtualization และ PCI Passthrough คืออะไร?

Platform Virtualization เป็นเทคนิคเกี่ยวกับการแชร์ฮาร์ดแวร์ ระหว่างระบบปฏิบัติการตั้งแต่สองระบบขึ้นไปเพื่อการใช้ทรัพยากรอย่างมีประสิทธิภาพมากขึ้น แต่คำว่าแพลตฟอร์มมีความหมายมากกว่าโปรเซสเซอร์: มันยังรวมถึงองค์ประกอบสําคัญอื่น ๆ ที่ประกอบกันเป็นแพลตฟอร์มรวมถึงที่เก็บข้อมูลเครือข่ายและทรัพยากรฮาร์ดแวร์อื่น ๆ ทรัพยากรฮาร์ดแวร์บางอย่างสามารถนำมา virtualize ได้อย่างง่ายดาย เช่น โปรเซสเซอร์หรือ storage แต่ทรัพยากรฮาร์ดแวร์อื่นๆ นั้นทำได้ยากกว่ามาก เช่น Video Card หรือพอร์ตอนุกรม Peripheral Component Interconnect (PCI) passthrough ก็คือวิธีการหนึ่งซึ่งทำให้การแชร์ทรัพยากรซึ่งเคยไปเป็นไม่ได้หรือยากลำบากนั้น มีประสิทธิภาพมากขึ้น ซึ่งเราจะได้ไปเรียนรู้กัน

การจําลองอุปกรณ์ในระบบ virtualization

อย่าลืมว่าอุปกรณ์ในเครื่องเครื่องหนึ่งก็จะมีอยู่แค่ชิ้นเดียวอย่างที่ท่านได้ทราบ และ ก่อนจะใช้งานจะต้องทำการ virtualize อุปกรณ์เหล่านั้น งั้นเรามาเรียนรู้กันก่อนว่าการ emulate หรือจำลองใน hypervisor นั้นจะมีอยู่ 2 วิธีคือ การ emulate ภายใน hypervisor และ วิธีการที่ 2 คือ การ emulate ภายนอก hypervisor (hypervisor-external application)

Device emulation ภายใน hypervisor เรียกว่ามันเป็นวิธีพื้นฐานเลยก็ว่าได้

การจําลองอุปกรณ์ภายในไฮเปอร์ไวเซอร์เป็นวิธีการทั่วไปที่นํามาใช้ภายในผลิตภัณฑ์ เช่นใน ESXi โดยระบบในรุ่นนี้ไฮเปอร์ไวเซอร์มีการจําลองอุปกรณ์ทั่วไปที่ guest os ต่างๆสามารถแชร์ได้รวมถึงดิสก์เสมือนอะแดปเตอร์เครือข่ายเสมือนและองค์ประกอบแพลตฟอร์มที่จําเป็นอื่น ๆ รุ่นนี้แสดงในรูปที่ 1

Virtualization and PCI passthrough-1

รูป 1 การจําลองอุปกรณ์แบบภายใน hypervisor

วิธีการจำลองอุปกรณ์แบบที่ 2 เราจะเรียกมันว่า user space device emulation และวิธีการทำงานก็เป็นไปตามชื่อมันเลยคือมันจะย้ายการจำลองขึ้นอยู่ใน user-space หรือซอฟต์แวร์แทน เช่นสิ่งที่เกิดขึ้นใน QEMU โมเดลนี้มีประโยชน์เนื่องจากการจําลองอุปกรณ์ไม่ขึ้นกับไฮเปอร์ไวเซอร์ดังนั้นจึงสามารถใช้ร่วมกันระหว่างไฮเปอร์ไวเซอร์ได้ นอกจากนี้ยังอนุญาตให้มีการจําลองอุปกรณ์ โดยไม่ต้องสร้างภาระให้กับไฮเปอร์ไวเซอร์ (ซึ่งทํางานในสถานะที่มีสิทธิพิเศษ privileged mode) ด้วยฟังก์ชันนี้

Virtualization and PCI passthrough-2

รูป 2 การจําลองอุปกรณ์ในส่วนของ user-space

การจําลองอุปกรณ์จากไฮเปอร์ไวเซอร์ไปยัง user-space มีข้อดีบางประการที่แตกต่างกัน ข้อได้เปรียบที่สําคัญที่สุดเกี่ยวข้องกับสิ่งที่เรียกว่า TCB หรือ trusted computing based ที่จะทำให้ความปลอดภัยนั้นดีขึ้นมาก เพราะไม่ต้องไปยุ่งกับสิทธิ์ระดับสูงใน hypervisor

อีกรูปแบบหนึ่งในการจําลองอุปกรณ์ที่ใช้ไฮเปอร์ไวเซอร์คือ paravirtualized ซึ่งในรูปแบบนี้ hypervisor จะมี driver สำหรับ hardware อยู่ส่วนหนึ่ง และ จะทำการ ใส่ driver อีกส่วนหนึ่งไว้ใน guest os เพื่อให้ทำงานประสานงาน เราจึงเรียกมันว่า paravirtualized ซึ่งแน่นอว่า หลักการนี้ จะเป็นที่จะต้องมีซอฟต์แวร์ส่วนหนึ่งเพื่อให้ guest os นั้นสื่อสารกับ hypervisor ได้อย่างมีประสิทธิภาพ เช่น driver ที่เรียกว่า VMware paravirtualized SCSI, KVM VirtIO

Device Passthrough

ดังที่คุณเห็นในการจําลองอุปกรณ์ทั้งสองแบบที่กล่าวไปข้างต้น ล้วนมีราคาที่ต้องจ่ายสําหรับอุปกรณ์ที่ใช้ร่วมกัน ไม่ว่าการจําลองอุปกรณ์จะดําเนินการในไฮเปอร์ไวเซอร์หรือใน user-space ภายใน VM อิสระ ค่าใช้จ่ายมีอยู่ ค่าใช้จ่ายนี้คุ้มค่าตราบใดที่อุปกรณ์จําเป็นต้องแชร์โดยระบบปฏิบัติการของแขกหลายระบบ หากไม่จําเป็นต้องแชร์แสดงว่ามีวิธีการแชร์อุปกรณ์ที่มีประสิทธิภาพมากกว่า

ดังนั้นจึงเป็นที่มาของ device passthrough ซึ่งก็คือการ by passing นั่นเอง จาก hardware โดยตรงขึ้นไปยัง Guest OS ซึ่งเรามาดูวิธีการเหล่านี้กัน

Virtualization and PCI passthrough-3

รูปที่ 3 device passthrough

สําหรับประสิทธิภาพการทํางานแบบแทบจะเหมือน hardware โดยตรง สามารถทําได้โดยใช้การ passthrough เหมาะอย่างยิ่งสําหรับแอปพลิเคชันเครือข่าย (หรือแอปพลิเคชันที่มีดิสก์ I/O สูง) ที่ไม่ได้ใช้การจําลองเสมือนเนื่องจาก interrupt และประสิทธิภาพการทํางานลดลงผ่านไฮเปอร์ไวเซอร์ (ไปยังไดรเวอร์ในไฮเปอร์ไวเซอร์หรือผ่านไฮเปอร์ไวเซอร์ไปยังการจําลองพื้นที่ผู้ใช้) แต่การกําหนดอุปกรณ์ให้กับ Guest OS ก็มีประโยชน์เช่นกันเมื่อไม่สามารถแชร์อุปกรณ์เหล่านั้นได้ ตัวอย่างเช่นหากระบบ VGA Card หลายตัวอะแดปเตอร์เหล่านั้นสามารถส่งผ่านไปยัง Guest OS แต่ละตัวได้

การสนับสนุนฮาร์ดแวร์สําหรับการทำ passthrough

ทั้ง Intel และ AMD ให้การสนับสนุนการ passthrough อุปกรณ์ในสถาปัตยกรรมโปรเซสเซอร์ที่ใหม่กว่า Intel เรียกตัวเลือก Virtualization Technology สําหรับ Directed I/O (VT-d) ในขณะที่ AMD หมายถึง I/O Memory Management Unit (IOMMU) ในแต่ละกรณี CPU ใหม่มีวิธีการ map addressทางกายภาพของ PCI กับที่อยู่เสมือนของ Guest OS เมื่อการแมปนี้เกิดขึ้นฮาร์ดแวร์จะดูแลการ Access  (และการป้องกัน) และระบบปฏิบัติการของ Guest OS สามารถใช้อุปกรณ์ได้ราวกับว่าเป็นระบบที่ไม่ใช่ระบบเสมือนจริง นอกเหนือจากการทํา map เข้ากับ Guest กับหน่วยความจําทางกายภาพแล้วยังมีการแยกเพื่อให้ Guest OS อื่น ๆ (หรือไฮเปอร์ไวเซอร์) ถูกกีดกันไม่ให้เข้าถึง ซีพียู Intel และ AMD มีฟังก์ชันการจําลองเสมือนมากขึ้น

นวัตกรรมอื่นที่ช่วยลดการ interrupt ระหว่าง VM จํานวนมากเรียกว่า Message Signaled Interrupts (MSI) MSI จะเปลี่ยนการ interrupt เป็นข้อความที่จําลองเสมือนได้ง่ายขึ้น (ปรับขนาดเป็นหลายพัน interrupt แต่ละรายการ) MSI มีให้บริการตั้งแต่ PCI เวอร์ชัน 2.2 แต่ยังมีอยู่ใน PCI Express (PCIe) ซึ่งช่วยให้ Fabric สามารถปรับขนาดไปยังอุปกรณ์จํานวนมากได้ MSI เหมาะอย่างยิ่งสําหรับการจําลองเสมือน I/O เนื่องจากช่วยให้สามารถแยกแหล่ง interruptได้

ปัญหาเกี่ยวกับการทำ passthrough

ปัญหาอย่างหนึ่งที่เกิดขึ้นกับการส่งผ่านอุปกรณ์คือเมื่อจําเป็นต้องมีการ Live Migration  ซึ่ง VM ซึ่ง hypervisor จะต้องสนับสนุนเทคนิคการทำ PCI hot-plug ด้วย หรือ การนำมันออกและนำเข้าจาก hypervisor

ขั้นตอนถัดไปในการทำ I/O Virtualization

การจําลองเสมือนในระดับ I/O เกิดขึ้นจริงในวันนี้ ตัวอย่างเช่น PCIe มีการรองรับการ virtualized ผ่านสิ่งที่เรียกว่า Single-Root I/O Virtualization (SR-IOV) เทคโนโลยีเวอร์ชวลไลเซชันนี้ (สร้างขึ้นผ่าน PCI-Special Interest Group หรือ PCI-SIG) ให้การจําลองเสมือนของอุปกรณ์ของ PCI โดยเฉพาะอย่างยิ่งใน Network Interface Card หรือพูดง่ายๆ ก็คือ Ethernet หรือ Network Card เพื่อให้ Guest OS เข้าถึงได้ผ่าน logical ID ซึ่งก่อนหน้านี้ นั้นหากเราทำ passthrough ให้กับอุปกรณ์ใดนั้น มันก็จะสามารถใช้งานได้ผ่าน Guest OS ตัวเดียว เพราะเท่ากับว่าเป็นการจอง PCI ตัวเดียวไปเลย

เทคโนโลยี Virtualization  อยู่กับเรามาแล้วประมาณ 50 ปีแล้ว แต่ถ้าพูดถึงเทคโนโลยีที่เข้ามาช่วยให้การ virtualize นั้นเหมือนทำงานบน hardware จริงๆ มาขึ้นนั้นเกิดขึ้นเมื่อประมาณ 10 ปีที่ผ่านมานี่เอง แต่ ความก้าวหน้าเพิ่มขึ้นเป็นทวีคูณในทุกๆ ด้าน