後端工坊 2026 年 8 月 6 日

2026-08-06 — BPF 討論跨網路命名空間觀測,FUSE 拆傳輸層並試水 iomap 直通,C++26 反射印出任意型別

primary=https://lpc.events/event/17/contributions/1600/ primary=https://lwn.net/Articles/927354/ primary=https://lore.kernel.org/linux-fsdevel/20260416091658.462783-1-mszeredi@redhat.com/ primary=https://lwn.net/Articles/1030500/ primary=https://www.phoronix.com/news/FUSEX-File-System primary=https://accu.org/journals/overload/34/193/decock/ primary=https://isocpp.org/blog/2026/08/cpp-reflection-a-universal-printer-lieven-de-cock

讓 BPF 看穿其他網路命名空間

LSFMM+BPF 2026 · 2026-08-05

Isovalent 工程師 Jordan Rife 在 2026 年 5 月於克羅埃西亞札格雷布舉行的 LSFMM+BPF 高峰會上,提出讓具備權限的 BPF 程式列舉「另一個」網路命名空間裡 socket 的需求。這個場景來自 Cilium 在 Kubernetes 節點上想從 host 端直接檢視各 pod 的 network namespace,卻不想真的呼叫 setns() 切換進去。與會的核心開發者當場提出了好幾種替代做法。

背景:2023 年就提過的全域 socket iterator

這條線可以往前追到 2023 年 Linux Plumbers Conference,同樣任職 Isovalent 的 Aditi Ghag 提出的「Global BPF sockets iterator」構想。她當時點出的癥結是:使用者空間的 netns file descriptor 與核心內部的 netns cookie 之間並沒有對應關係,BPF 程式就算能用 bpf_get_netns_cookie() 取得目前 namespace 的識別碼,也無法反查或指定「別的」namespace。

現況:既有 iterator 都綁死在呼叫端的 namespace

核心裡的 bpf_iter/tcpbpf_iter/udp 這類 socket iterator,實作上是一組 kfunc trio(建構、取下一筆、釋放),但預設只走呼叫者當下所在的 network namespace。Rife 在會上討論的方向包括讓 iterator 額外接受目標 namespace 識別碼並在核心端做權限檢查,也有人提到參考 2023 年 Yafang Shao 那份「BPF namespace」RFC 的階層式可見性模型——讓父 namespace 能看到子 namespace 的物件,模仿 PID namespace 的做法。整場討論目前仍停在設計階段,沒有任何已送出的 patch series。

原始來源:LPC 2023 - Global BPF sockets iteratorLWN - bpf: Introduce BPF namespace


FUSE 大體檢:傳輸層拆分、iomap 直通與全新 fusex 分支

linux-fsdevel mailing list · 2026-08-05

FUSE 維護者 Miklos Szeredi 在 LSFMM+BPF 2026 高峰會的 BoF 上,交代了三條並行工作:傳輸層與檔案系統層拆分、藉 iomap 省去上呼叫的 I/O 直通,以及從零重寫的 fusex 分支。三者都指向同一個目標——讓 FUSE 撐得起正式的容器化檔案系統。

拆分傳輸層

Szeredi 於 2026-04-16 向 linux-fsdevel 發出 fuse: improve transport and fs layer separation 系列(訊息代碼 20260416091658.462783-1-mszeredi@redhat.com),基於 fuse-update-7.1 分支。32 個 commitfuse_conn 裡的傳輸層欄位切到新結構 fuse_chan,並以新增的 dev.h/args.h 當作兩層邊界,異動了 22 個檔案。

iomap 直通與 fusex

Darrick J. WongFUSE_IOMAP RFC 把 iomap_begin/iomap_end/ioend 包成三個 FUSE 指令,讓核心拿到 extent 對應後直接搬資料,目標是把 ext4 整個包進 FUSE 容器以隔開漏洞風險。這份仍標著「DO NOT MERGE THIS, STILL!」的 RFC 已有雛型效能數字:

操作型態相對原生效能
streaming direct I/O約 95%
streaming buffered I/O約 110%
random buffered I/O約 85%
random direct I/O約 80%

Szeredi 也在 mszeredi/fuse.git 開出 fusex 分支,拿掉非同步 FUSE_INIT、只留 no-open 模式,換上 FUSE_LOOKUP_ROOTFUSE_LOOKUPXFUSE_MKOBJXFUSE_SETSTATX 等新操作。這個分支讓大改動有塊乾淨地基能先行驗證,不必冒著弄壞既有 FUSE 程式碼的風險。

原始來源:linux-fsdevel - fuse transport/fs layer separationLWN - fuse fs-iomap for ext4Phoronix - FUSEX


C++26 反射初體驗:寫一個印得出任何型別的 Universal Printer

ACCU Overload 34(193) · 2026-08-05

ACCU 期刊 Overload 第 34 卷第 193 期刊出 Lieven de Cock 的文章,示範怎麼用 C++26 反射把「印出任意型別」寫成一份泛用工具,不必再為每個 struct 手刻 operator<<。isocpp.org 於 2026-08-05 轉載並推薦這篇文章。

核心作法:舉起與拼接

C++26 反射引入「舉起」運算子 ^^,把型別或成員從一般程式碼領域搬進反射領域,產生 std::meta::info;再用「拼接」運算子 [: :] 把資訊送回程式碼領域求值。de Cock 的 UniversalFormattertemplate for(出自另一份提案 P1306 的展開陳述式)對 nonstatic_data_members_of() 回傳的成員逐一展開,搭配 identifier_of() 取名稱、[: :] 取值。

涵蓋範圍

  • access_context::unchecked() 讀取私有成員
  • bases_of() 遞迴印出基底類別成員
  • enumerators_of() 把 enum 數值轉回名稱字串

文章裡所有範例都附上 Compiler Explorer 連結,讀者可以直接在瀏覽器裡跑一次反射展開的結果。

原始來源:ACCU Overload - C++ Reflection: a Universal Printerisocpp.org blog


End of article
0
Would love your thoughts, please comment.x
()
x