v9fs:適用於 Linux 的 Plan 9 資源共享¶
關於¶
v9fs 是 Plan 9 9p 遠端檔案系統協議的 Unix 實現。
此軟體最初由 Ron Minnich <rminnich@sandia.gov> 和 Maya Gokhale 開發。Greg Watson <gwatson@lanl.gov> 和最近的 Eric Van Hensbergen <ericvh@gmail.com>、Latchesar Ionkov <lucho@ionkov.net> 和 Russ Cox <rsc@swtch.com> 進行了額外的開發。
有關 9p 客戶端的 Linux 實現和應用的最好的詳細說明,請參見 USENIX 論文
其他應用在以下論文中進行了描述
XCPU & 叢集 http://xcpu.org/papers/xcpu-talk.pdf
KVMFS:KVM 的控制檔案系統 http://xcpu.org/papers/kvmfs.pdf
CellFS:Cell BE 的新程式設計模型 http://xcpu.org/papers/cellfs-talk.pdf
PROSE I/O:使用 9p 啟用應用程式分割槽 http://plan9.escet.urjc.es/iwp9/cready/PROSE_iwp9_2006.pdf
VirtFS:一種虛擬化感知檔案系統傳遞 https://kernel.linux.club.tw/doc/ols/2010/ols2010-pages-109-120.pdf
用法¶
用於遠端檔案伺服器
mount -t 9p 10.10.1.2 /mnt/9
用於 Plan 9 From User Space 應用程式 (https://9fans.github.io/plan9port/)
mount -t 9p `namespace`/acme /mnt/9 -o trans=unix,uname=$USER
用於在帶有 virtio 傳輸的 QEMU 主機上執行的伺服器
mount -t 9p -o trans=virtio <mount_tag> /mnt/9
其中 mount_tag 是伺服器為每個匯出的掛載點生成的標記。客戶端將每個 9P 匯出視為具有關聯“mount_tag”屬性的 virtio 裝置。可透過讀取 /sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag 檔案來檢視可用的掛載標記。
USBG 用法¶
要在執行時透過 gadget 掛載 USB 主機上可訪問的 9p FS
mount -t 9p -o trans=usbg,aname=/path/to/fs <device> /mnt/9
要將 9p FS 作為根檔案系統掛載在透過 gadget 可訪問的 USB 主機上
root=<device> rootfstype=9p rootflags=trans=usbg,cache=loose,uname=root,access=0,dfltuid=0,dfltgid=0,aname=/path/to/rootfs
其中 <device> 是 usb gadget 傳輸關聯的標記。它由 configfs 例項名稱定義。
USBG 示例¶
USB 主機匯出檔案系統,而 USB 裝置端的 gadget 使其可掛載。
Diod (9pfs 伺服器) 和轉發器位於開發主機上,實際儲存根檔案系統。該 gadget 在嵌入式板上啟動期間(或之後)初始化。然後,轉發器將在 USB 總線上找到它並開始轉發請求。
在這種情況下,9p 請求來自裝置並由主機處理。原因是 USB 裝置埠通常在 PC 上不可用,因此在另一個方向上的連線將不起作用。
使用 usbg 傳輸時,目前沒有能夠處理來自 gadget 驅動程式的請求的原生 usb 主機服務。為此,我們必須使用 tools/usb 中的額外 python 工具 p9_fwd.py。
只需啟動支援 9pfs 的網路伺服器,例如 diod/nfs-ganesha,例如
$ diod -f -n -d 0 -S -l 0.0.0.0:9999 -e $PWD
如果存在多個 usbg gadget,可以選擇掃描匯流排以查詢其路徑
$ python $kernel_dir/tools/usb/p9_fwd.py list
Bus | Addr | Manufacturer | Product | ID | Path
--- | ---- | ---------------- | ---------------- | --------- | ----
2 | 67 | unknown | unknown | 1d6b:0109 | 2-1.1.2
2 | 68 | unknown | unknown | 1d6b:0109 | 2-1.1.3
然後啟動 python 傳輸
$ python $kernel_dir/tools/usb/p9_fwd.py --path 2-1.1.2 connect -p 9999
之後,可以按照上述方式使用 gadget 驅動程式。
一種用例是在嵌入式 Linux 裝置開發期間將其用作 NFS 根啟動的替代方案。
選項¶
trans=name
選擇一個替代傳輸。目前有效的選項是
unix
指定命名管道掛載點
tcp
指定常規 TCP/IP 連線
fd
用於傳遞檔案描述符以進行連線(請參見 rfdno 和 wfdno)
virtio
連線到下一個可用的 virtio 通道(來自帶有 trans_virtio 模組的 QEMU)
rdma
連線到指定的 RDMA 通道
usbg
連線到指定的 usb gadget 通道
uname=name
嘗試以遠端伺服器上的使用者身份掛載的使用者名稱。伺服器可能會覆蓋或忽略此值。某些使用者名稱可能需要身份驗證。
aname=name
aname 指定伺服器提供多個匯出的檔案系統時要訪問的檔案樹。
cache=mode
指定快取策略。預設情況下,不使用任何快取。可以按位掩碼或使用預先存在的常用“快捷方式”來指定模式。位掩碼描述如下:(未指定的位保留)
0b00000000
停用所有快取,停用 mmap
0b00000001
啟用檔案快取
0b00000010
啟用元資料快取
0b00000100
回寫行為(相對於直寫)
0b00001000
鬆散快取(與伺服器沒有顯式一致性)
0b10000000
啟用 fscache 以進行持久快取
當前快捷方式及其關聯的位掩碼為
none
0b00000000(不快取)
readahead
0b00000001(僅預讀檔案快取)
mmap
0b00000101(預讀 + 回寫檔案快取)
loose
0b00001111(非一致性檔案和元資料快取)
fscache
0b10001111(持久鬆散快取)
注意:目前僅測試了這些快捷方式的操作模式,因此不確定其他位模式組合是否有效。正在進行對更好快取支援的工作。
重要提示:鬆散快取(以及目前的 fscache)不一定會驗證伺服器上的快取值。換句話說,不能保證伺服器上的更改會反映在客戶端系統上。只有在具有獨佔掛載並且伺服器不會在您下面修改檔案系統的情況下才使用此操作模式。
debug=n
指定除錯級別。除錯級別是一個位掩碼。
0x01
顯示詳細的錯誤訊息
0x02
開發人員除錯 (DEBUG_CURRENT)
0x04
顯示 9p 跟蹤
0x08
顯示 VFS 跟蹤
0x10
顯示編組除錯
0x20
顯示 RPC 除錯
0x40
顯示傳輸除錯
0x80
顯示分配除錯
0x100
顯示協議訊息除錯
0x200
顯示 Fid 除錯
0x400
顯示資料包除錯
0x800
顯示 fscache 跟蹤除錯
rfdno=n
用於使用 trans=fd 進行讀取的檔案描述符
wfdno=n
用於使用 trans=fd 進行寫入的檔案描述符
msize=n
用於 9p 資料包有效負載的位元組數
port=n
連線到遠端伺服器上的埠
noextend
強制傳統模式(沒有 9p2000.u 或 9p2000.L 語義)
version=name
選擇 9P 協議版本。有效選項為
9p2000
傳統模式(與 noextend 相同)
9p2000.u
使用 9P2000.u 協議
9p2000.L
使用 9P2000.L 協議
dfltuid
嘗試以特定 uid 掛載
dfltgid
嘗試以特定 gid 掛載
afid
安全通道 - 由 Plan 9 身份驗證協議使用
nodevmap
不對映特殊檔案 - 將它們表示為普通檔案。這可用於在主機之間共享裝置/命名管道/套接字。此功能將在以後的版本中擴充套件。
directio
繞過所有讀/寫操作的頁面快取
ignoreqv
忽略 qid.version==0 作為忽略快取的標記
noxattr
不在此掛載上提供 xattr 功能。
access
- 有四種訪問模式。
- user
如果使用者首次嘗試訪問 v9fs 檔案系統上的檔案,v9fs 會為該使用者傳送一個附加命令 (Tattach)。這是預設模式。
- <uid>
只允許 uid=<uid> 的使用者訪問掛載的檔案系統上的檔案
- any
v9fs 執行單次附加並將所有操作作為一名使用者執行
- clien
在 9p 客戶端上基於 ACL 的訪問檢查以進行訪問驗證
cachetag
用於使用指定的持久快取的快取標記。現有快取會話的快取標記可以在 /sys/fs/9p/caches 中列出。(僅適用於 cache=fscache)
行為¶
本節旨在描述可能與本地檔案系統行為不同的 9p“怪癖”。
在檔案上設定 O_NONBLOCK 將使客戶端讀取在伺服器返回某些資料時儘早返回,而不是嘗試用請求的位元組數或檔案結尾填充讀取緩衝區。
資源¶
協議規範在 github 上維護:http://ericvh.github.com/9p-rfc/
9p 客戶端和伺服器實現列在 http://9p.cat-v.org/implementations 上
LLNL 正在開發 9p2000.L 伺服器,可以在 http://code.google.com/p/diod/ 找到
使用者和開發人員郵件列表可透過 sourceforge 上的 v9fs 專案獲得 (http://sourceforge.net/projects/v9fs)。
新聞和其他資訊在 Wiki 上維護。(http://sf.net/apps/mediawiki/v9fs/index.php)。
錯誤報告最好透過郵件列表發出。
有關 Plan 9 作業系統的資訊,請檢視 http://plan9.bell-labs.com/plan9
有關 Plan 9 from User Space(移植到 Linux/BSD/OSX/等的 Plan 9 應用程式和庫)的資訊,請檢視 https://9fans.github.io/plan9port/