2015年2月24日 星期二

幫 qemu 虛擬機與 host 分享檔案的 「目錄任意門」 9p

哆啦A夢的任意門 用 qemu-kvm 啟動虛擬機, 要如何讓 host 與 guest 彼此交換資料檔? 因為 host 與 guest 之間已有網路相通 (請在 guest 下: route -nifconfig -a 查看) 所以最簡單的方式, 就是在 host 或 guest 架 openssh-server 然後再另一頭用 ssh 連線或 scp 傳檔。 不過如果 host 與 guest 兩處都有軟體需要輪流去讀寫某個檔案, 或是 host 有某個很大的唯讀檔要分享給 guest, 那麼 ssh 或 scp 可能就比較不適合了。 就像... 如果你有哆啦A夢的任意門, 還會想要經常搬動大家具嗎? 9p 網路檔案系統 類似 qemu 虛擬機的 host 與 guest 之間的目錄任意門, 或是說它類似網路芳鄰, 可以把 host 的一個目錄分享給 guest。

為簡單起見, 以下假設用 阿貴版 finnix live CD 啟動 guest。 比方說, host 上面的 /dl/iso 目錄底下有很多 iso 映象檔要分享給 guest。 iso 檔很大, 又是唯讀的, 此時最適合用 9p 網路檔案系統。 啟動 guest 的時候要多加一個 -virtfs 的選項:

kvm -m 1024 -virtfs local,path=/dl/iso,security_model=passthrough,readonly,mount_tag=iso_imgs -cdrom .../finnix-xyz.iso &

進入 guest 之後, 就可以這樣掛載:

mkdir /mnt/iso
mount -t 9p -o trans=virtio iso_imgs /mnt/iso
  1. 請把 /dl/iso 改成你要分享的目錄; 而 iso_imgs 則是你自己隨意取的代號, 兩側一致就好, 這樣 guest 才能稱呼 「host 分享給我的那個目錄」, 以便用於 mount 指令。
  2. 如果 guest 也需要寫入該目錄的檔案, 就不要加 「,readonly」。
  3. security_model: 對於 「只讀不寫」 或是 「寫入既有檔案」 而言, 這裡填 mapped 或 passthrough , 效果一樣。 當 guest 會在共享目錄建立新檔案時, 兩者才有差。 詳見 這篇公告。 (我沒認真研究。)
  4. [2015/7/25: 我在 lubuntu 15.04 的 host 上面跑 antix 13.2 的 guest, 沒有設 readonly, 結果 host 的檔案系統就 GG 了。 (是的, guest 有先很小心地先正常關機。) 總之建議一般人一定要用 readonly 選項比較安全。]

也可以在 guest 的 /etc/fstab 裡面加上一列, 這樣未來開機時就會自動掛載:

iso_imgs /mnt/iso 9p trans=virtio,ro 0 1

更完整的解釋, 請見 Qemu 9p Setup KVM: Example Sharing Host files with the Guest

這裡拿 「分享 iso 檔」 當做範例, 是有原因的... 這樣才能獲得 qemu-kvm 的五層祝福!

沒有留言:

張貼留言