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 論文

其他應用在以下論文中進行了描述

用法

用於遠端檔案伺服器

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/