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