從Go 調用setns 返回mnt 命名空間的EINVAL
問題:
Go 代碼無法使用setns 呼叫進入mnt 命名空間,導致EINVAL 錯誤。儘管 C 程式碼中的呼叫相同,但 Go 實作會產生一致的錯誤。
調查:
解決方案:
在 Go 中,必須執行 setns在 Go 運行時執行緒啟動之前的單執行緒上下文中。這是因為 setns 作用於呼叫線程,將其連接到命名空間。
使用 CGO 建構函數技巧的替代解決方案:
加入 __attribute__((constructor)) 巨集到一個 C 函數,讓它在 Go 初始化之前執行。這允許在 Go 線程啟動之前輸入命名空間,從而解決問題。
更新:
Linux 核心郵件清單對話確認了多執行緒進程無法執行的限制與新的掛載命名空間重新關聯。這需要呼叫者命名空間中的 CAP_SYS_CHROOT 和 CAP_SYS_ADMIN 功能以及目標命名空間中的 CAP_SYS_ADMIN 功能。
以上是為什麼從 Go 呼叫 setns 對 mnt 命名空間回傳 EINVAL?的詳細內容。更多資訊請關注PHP中文網其他相關文章!