讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux CRI-O 的 pinns 与用户 namespace 隔离增强

秋墨同学_7270

秋墨同学_7270

发布时间:2026-02-15 10:44:03

|

166人浏览过

|

来源于php中文网

原创

pinns 是 CRI-O 默认的轻量级容器用户命名空间初始化工具,专为解决 unshare 在嵌套 user namespace、uid/gid 映射传递及与 runc 协作时序上的缺陷而设计。

linux cri-o 的 pinns 与用户 namespace 隔离增强

pinns 是什么,为什么 CRI-O 会用它而不是直接调用 unshare

pinns 是 CRI-O 默认使用的轻量级容器命名空间初始化工具,专为用户命名空间(userns)隔离设计。它不替代 unshare,而是补足其在多层级 user namespace 场景下的缺陷:比如嵌套 user namespace 创建、uid/gid 映射传递、以及与 runc 的协作时机控制。

常见错误现象是手动替换 pinns 为 unshare --user --map-root-user 后,容器启动失败并报 operation not permitted —— 这是因为 unshare 没有处理 CRI-O 要求的「先建 user ns、再进新 ns、最后 exec runc」这一精确时序。

  • pinns 会在 fork 出子进程后立刻 drop capabilities,再进入新 user namespace,避免 capability 污染
  • 它读取 CRI-O 传入的 --uid-map 和 --gid-map 参数,生成符合内核要求的映射格式,unshare 不支持原生解析这些参数
  • 当启用 userns-remap 且 host 用户被映射到非 0 uid 时,pinns 会自动跳过 setuid/setgid 调用,而 unshare 可能因权限不足卡死

如何确认 pinns 正在生效,以及它是否真在用 user namespace

最直接的办法是进容器查 /proc/self/status 中的 Uid: 和 Gid: 行,并比对 /proc/self/ns/user 的 inode —— 如果 uid 显示非 0 但进程能访问 /etc/passwd,说明 user namespace 已启用且 pinns 成功完成了映射。

验证步骤:

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 启动一个带 securityContext.runAsUser: 1001 的 Pod,确保 CRI-O 配置了 userns_mode = "auto"
  • 进容器执行 cat /proc/self/status | grep -E "Uid|Gid",输出应类似 Uid: 1001 1001 1001 1001
  • 执行 ls -l /proc/self/ns/user,若显示 user:[4026532728] 这类非默认编号,说明已进入独立 user namespace
  • 检查 CRI-O 日志:journalctl -u crio | grep pinns,应看到类似 execing pinns with args [... --uid-map 0:1001:1 ...]

启用 user namespace 后,哪些操作会突然失败

不是所有系统调用都能跨 user namespace 无缝工作。典型失效点集中在需要内核级权限或全局资源访问的地方:

  • 挂载 tmpfs 或 overlayfs 时,若未显式指定 uid=/gid=,内核可能拒绝创建,因为当前 user namespace 没有对 host rootfs 的写权限
  • sethostname() 失败并报 EPERM:即使容器里是 root,user namespace 中的 root 并不等价于 host root,无法修改 UTS namespace
  • 使用 memfd_create() + seccomp 组合时,某些 seccomp 规则因 capability 检查逻辑变化而误判,需额外添加 CAP_SYS_ADMIN 到 bounding set
  • SELinux 标签继承异常:如果 host 使用 kernel.sched_autogroup_enabled=1,user namespace 内进程可能无法正确继承 context,需在 pod annotation 中显式设 container.apparmor.security.beta.kubernetes.io/pod: runtime/default

pinns 的配置项和兼容性边界

CRI-O 不直接暴露 pinns 参数,所有控制都通过 /etc/crio/crio.conf 中的 [crio.runtime] 段落完成。关键配置只有两个:

  • userns_mode = "auto":CRI-O 自动为每个容器分配独立 user namespace,pinns 接收映射规则并执行
  • userns_mode = "host":完全绕过 pinns,此时 runc 直接运行,无 user namespace 隔离

注意:CRI-O v1.26+ 要求内核 ≥ 5.12 才能稳定支持嵌套 user namespace + pinns;低于该版本时,若开启 userns_mode = "auto",pinns 可能静默降级为 host 模式,且日志中仅提示 falling back to host userns,容易被忽略。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

650

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

533

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

303

2025.11.27

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.12.07

Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务
Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务

Golang云原生微服务Kubernetes (K8s) 是指 使用 Go 语言(Golang)编写的云原生微服务,并利用 Kubernetes 平台进行容器化部署、自动化管理、弹性伸缩和高效编排的一整套现代应用架构方案。

116

2025.12.22

Go云原生应用与Kubernetes服务部署实战
Go云原生应用与Kubernetes服务部署实战

本专题围绕 Go 语言在云原生环境中的应用展开,讲解容器化部署、Kubernetes 编排、服务发现、健康检查与弹性扩缩容机制。通过真实云端案例,帮助开发者构建可扩展的云原生微服务架构。

208

2026.06.29

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4310

2023.06.21

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn