用rust-vmm打造未來的虛擬化架構
譯文【51CTO.com快譯】rust-vmm有助于在Rust虛擬機監控器之間共享核心虛擬化組件。
一年多以前,我們開始開發Firecracker,這是在KVM(基于內核的虛擬機)上運行的虛擬機監控器(VMM)。我們想創建一種迅速啟動虛擬機的輕量級VMM,內存占用少,從而打造高密度云環境。
我們開始通過分支Chrome OS VMM(CrosVM)來開發Firecracker,但由于我們針對不同的客戶使用場景,沒過多久就有了分歧。CrosVM在ChromeOS中提供Linux應用程序隔離,而Firecracker用于大規模運行多租戶工作負載。盡管我們現在走不同的道路,仍然擁有通用的虛擬化組件,比如基于KVM輸入/輸出控件(ioctls)的包裝器、最小的內核加載器以及使用Virtio設備模型。
考慮到這一點,我們開始考慮共享通用代碼的***方法。擁有共享的代碼庫可以提升這兩個項目的安全和質量標準。目前,修復安全漏洞需要重復的工作:將更改從一個項目移植到另一個項目,經歷不同的審核流程來合并更改。開源Firecracker后,我們接到了添加功能的請求,包括GPU支持和啟動bzImage文件。一些請求與Firecracker的目標不一致,卻是原本合情合理的使用場合,只是沒有找到適合實施的地方。
rust-vmm項目
rust-vmm項目于2018年12月問世,當時亞馬遜、谷歌、英特爾和Red Hat的員工開始討論共享虛擬化軟件包的***方式。在此過程中,更多的貢獻者加入了這項計劃。我們仍然處于這個過程的開始階段,只有一個組件發布到了Crates.io(Rust的軟件包注冊中心),另外幾個組件(比如Virtio設備、Linux內核加載器和KVM ioctls包裝器)正在開發中。兩個用Rust編寫的VMM正在積極開發中,構建其他專用VMM日益受到關注,rust-vmm是作為共享核心虛擬化組件的主機而誕生的。
rust-vmm的目標是使社區能夠創建自定義VMM,僅針對使用場合導入所需的構建模塊。我們決定將rust-vmm組織成一個多存儲庫項目,每個存儲庫對應一個獨立的虛擬化組件。每個單獨的構建模塊都在Crates.io上發布。
使用rust-vmm創建自定義VMM
下面討論的組件目前正在開發中。
圖1. 自定義rust-vmm組件
圖右側的每個框都是對應于一個軟件包(在Rust中名為crate)的GitHub存儲庫。一個crate的功能可以進一步分成多個模塊,比如virtio-devices。不妨看看這些組件及一些潛在的使用場合。
- KVM接口:在KVM上創建VMM需要可以從Rust調用KVM功能的接口。kvm-bindings crate代表面向KVM內核頭的Rust外部功能接口(FFI)。因為頭只包含結構和定義,我們還有基于KVM ioctls(kvm-ioctls)的包裝器,我們用它們來打開dev/kvm、創建虛擬機和創建vCPU等。
- Virtio設備和速率限制:Virtio擁有一套前后端架構。目前在rust-vmm中,前端實現在virtio-devices crate中,后端位于vhost軟件包中。Vhost支持用戶空間驅動程序和內核空間驅動程序,但用戶也可以將virtio-devices插入到自定義后端。virtio-bindings是使用Virtio Linux頭生成的Virtio設備的綁定。virtio-devices crate中的所有設備都使用條件編譯,作為模塊獨立導出。一些設備(比如block、net和vsock)在每秒I/O和帶寬方面支持速率限制。這可以通過使用rate-limiter crate中提供的功能來實現。
- kernel-loader負責將ELF內核映像的內容加載到訪客內存中。
比如說,假設我們想要構建一個自定義VMM,讓用戶可以創建和配置在KVM上運行的單個虛擬機。作為配置的一部分,用戶能夠指定內核映像文件、根文件系統、vCPU數量和內存大小。可以使用kvm-ioctls crate來實現虛擬機資源的創建和配置。可以使用kernel-loader將內核映像加載到訪客內存中,并且可以使用virtio-devices block模塊來指定根文件系統。我們的VMM所需的***一點是編寫VMM Glue,這個代碼負責將rust-vmm組件與VMM用戶接口集成起來,允許用戶創建和管理虛擬機。
原文標題:Building the virtualization stack of the future with rust-vmm,作者:Andreea Florescu
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】