首頁 > 後端開發 > Golang > 為什麼從 Go 呼叫 setns 對 mnt 命名空間回傳 EINVAL?

為什麼從 Go 呼叫 setns 對 mnt 命名空間回傳 EINVAL?

Mary-Kate Olsen
發布: 2024-11-03 14:30:03
原創
721 人瀏覽過

Why Does Calling setns from Go Return EINVAL for mnt Namespaces?

從Go 調用setns 返回mnt 命名空間的EINVAL

問題:

Go 代碼無法使用setns 呼叫進入mnt 命名空間,導致EINVAL 錯誤。儘管 C 程式碼中的呼叫相同,但 Go 實作會產生一致的錯誤。

調查:

  • 確認C 和Go 程式碼在libc 中相同地呼叫setns .
  • 將問題簡化為簡化的程式碼範例以隔離問題。

解決方案:

在 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板