讓 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/tcp、bpf_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 iterator、LWN - 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 個 commit 把 fuse_conn 裡的傳輸層欄位切到新結構 fuse_chan,並以新增的 dev.h/args.h 當作兩層邊界,異動了 22 個檔案。
iomap 直通與 fusex
Darrick J. Wong 的 FUSE_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_ROOT、FUSE_LOOKUPX、FUSE_MKOBJX、FUSE_SETSTATX 等新操作。這個分支讓大改動有塊乾淨地基能先行驗證,不必冒著弄壞既有 FUSE 程式碼的風險。
原始來源:linux-fsdevel - fuse transport/fs layer separation、LWN - fuse fs-iomap for ext4、Phoronix - 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 的 UniversalFormatter 用template for(出自另一份提案 P1306 的展開陳述式)對 nonstatic_data_members_of() 回傳的成員逐一展開,搭配 identifier_of() 取名稱、[: :] 取值。
涵蓋範圍
- 用
access_context::unchecked()讀取私有成員 - 用
bases_of()遞迴印出基底類別成員 - 用
enumerators_of()把 enum 數值轉回名稱字串
文章裡所有範例都附上 Compiler Explorer 連結,讀者可以直接在瀏覽器裡跑一次反射展開的結果。
原始來源:ACCU Overload - C++ Reflection: a Universal Printer、isocpp.org blog