* 註解:根據 Github Wiki記載,截至2023年,目前VirtIO-FS的開發狀態處於早期階段(Tech Preview),可能會有很多問題。
本文討論如何在安裝好Virt Manager + QEMU/KVM之後,給Linux宿主機與Windows虛擬機設定共享資料夾。
Virt Manager內建兩種目錄共享方式:
- VirtIO-FS:半虛擬化的目錄共享
- VirtIO-9P:移植自Plan 9的半虛擬化網路檔案系統
VirtIO-FS (virtiofs) 是專為分享本機檔案系統打造的半虛擬化技術,原理圖如下:
下面是「Linux宿主機KDiskMark讀取硬碟速度」與「Windows虛擬機Crystaldiskmark透過VirtIO-FS讀取硬碟速度」的比較。
論效能,VirtIO-FS檔案的傳輸速度高於VirtIO-9P,且勝過網路檔案系統(例如SSHFS、SAMBA、NFS、WebDAV),僅低於PCI-E硬碟直通。
相較VirtIO-9P僅支援Linux虛擬機,VirtIO-FS是跨平台的。不論是Windows還是Linux虛擬機,都可以使用VirtIO-FS與宿主機共享檔案。
測試環境#
- 宿主機系統:Ubuntu 24.04
- 虛擬機系統:Windows 11 23H2
- QEMU版本:6.0
- VirtIO驅動版本:0.1.240
1. 安裝QEMU/KVM與Virt Manager#
VirtIO-FS所需要的virtiofsd可以交給Libvirtd自動啟動。
請安裝套件:sudo apt install virtiofsd
然後參見 Ubuntu安裝Virt Manager
2. 新增VirtIO-FS共享目錄#
編輯虛擬機硬體,在分配記憶體的選單,點選啟用共享記憶體(Enable Shared Memory)
點選新增硬體 → 檔案系統,驅動程式選virtios-fs,源路徑選取要分享的Linux目錄(例如
/home/user/下載
),目標路徑隨意填寫host_shared
virtios-fs硬體裝置可以新增很多個,這樣Windows虛擬機就會將每個virtio-fs裝置視為不同的磁碟掛載。
3. 虛擬機內的操作#
Windows虛擬機#
安裝 WinFSP,這個軟體可以在Windows模擬FUSE檔案系統。
安裝Stable分支的 virtio驅動,下載
virtio-win-guest-tools.exe
並安裝重新啟動Windows虛擬機
搜尋並開啟Windows「服務」視窗,設定開機自動啟動VirtIO-FS Service (VirtoFsSvc)。再點選啟動。
這樣virtio-fs共享的資料夾應該就會出現在檔案總管的磁碟列表了,預設自動掛載在Z槽。
有時候virto-fs掛載的資料夾在Windows看來會變成唯讀模式,可能是VirtoFsSvc的bug。根據 Github issue的討論,請將該服務停用,改用批次檔來啟動VirtoFsSvc。或者嘗試在Windows安裝最新版的lastest-virtio套件。
還有,由於VirtIO-FS對各個檔案系統實作的差異,在virtio-fs掛載的資料夾執行exe程式可能會出問題,詳見 Github Discussion。
Linux虛擬機#
需要Linux 5.4以上核心才支援VirtIO-FS。
Linux虛擬機內可以直接用mount指令掛載VirtIO FS的目錄。
上面我們在Virt Manager填寫的目標路徑是host_shared
,那麼我們使用以下指令將其掛載到Linux虛擬機的/mnt/host_shared
目錄。
sudo mkdir /mnt/host_shared
sudo mount -t virtiofs host_shared /mnt/host_shared