深入掌握 nsenter:Linux命名空间操作的利器

#作者:朱雷

文章目录

  • 1、简介
  • 2、功能与用途
    • 2.1. 核心功能
      • 2.1.1. 进入命名空间
      • 2.1.2. 支持多种命名空间
      • 2.1.3. 容器调试
  • 3、安装
    • 3.1. 依赖包
    • 3.2. 权限要求
    • 3.3. 命令用法与示例
      • 3.3.1. 基本语法
      • 3.3.2. 常用选项包括:
      • 3.3.3. 示例
  • 4、 应用场景与优势
    • 4.1. 容器调试
    • 4.2. 资源管理
    • 4.3. 简化操作
  • 5. 注意事项
  • 6、总结

1、简介

nsenter 是 Linux 系统中的一个命令行工具,用于进入指定进程的命名空间(namespace)中执行命令,常用于调试、管理和容器化环境中的资源隔离。nsenter 允许用户进入指定进程的命名空间(如 PID、网络、用户等),在该命名空间内执行命令。

2、功能与用途

2.1. 核心功能

2.1.1. 进入命名空间

通过指定目标进程的 PID 或容器 ID,进入其命名空间,执行命令(如查看网络信息、调试容器等)。

2.1.2. 支持多种命名空间

支持进入 PID、网络、用户、挂载、IPC 等命名空间,适用于容器、网络调试等场景。

2.1.3. 容器调试

常用于容器网络调试(如查看容器网络配置)、容器内命令执行(如执行 ip addr)。

3、安装

3.1. 依赖包

nsenter 通常位于 util-linux 包中,可通过 apt install util-linux 或源码安装。

3.2. 权限要求

通常需要 root 权限,部分场景(如进入容器)可能需要额外权限。

3.3. 命令用法与示例

3.3.1. 基本语法

Usage:nsenter [options] [<program> [<argument>...]]Run a program with namespaces of other processes.Options:-a, --all              enter all namespaces-t, --target <pid>     target process to get namespaces from-m, --mount[=<file>]   enter mount namespace-u, --uts[=<file>]     enter UTS namespace (hostname etc)-i, --ipc[=<file>]     enter System V IPC namespace-n, --net[=<file>]     enter network namespace-p, --pid[=<file>]     enter pid namespace-C, --cgroup[=<file>]  enter cgroup namespace-U, --user[=<file>]    enter user namespace-S, --setuid <uid>     set uid in entered namespace-G, --setgid <gid>     set gid in entered namespace--preserve-credentials do not touch uids or gids-r, --root[=<dir>]     set the root directory-w, --wd[=<dir>]       set the working directory-F, --no-fork          do not fork before exec'ing <program>-Z, --follow-context   set SELinux context according to --target PID-h, --help             display this help-V, --version          display version

3.3.2. 常用选项包括:

-a, --all              进入所有命名空间
-t, --target <pid>     从目标进程获取命名空间
-m, --mount[=<文件>]   进入挂载命名空间
-n, --net[=<文件>]     进入网络命名空间
-p, --pid[=<文件>]     进入进程ID命名空间
-C, --cgroup[=<文件>]  进入cgroup命名空间
-e, --env              继承目标进程的环境变量

3.3.3. 示例

进入进程 62117 的 PID 命名空间并执行uptime命令:

 [root@paas-node-111 ~]# nsenter -t 62117 -n uptime14:46:03 up 75 days, 18:52,  1 user,  load average: 4.49, 4.23, 4.61

进入容器网络命名空间执行ip 命令:

 [root@paas-node-111 ~]# nsenter -t 2579 -n ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.18.0.4/16 brd 172.18.255.255 scope global eth0valid_lft forever preferred_lft forever

查看docker 容器的pid:

[root@paas-node-111 ~]# docker inspect dcd2220e91b0|grep Pid
"Pid": 2579,
"PidMode": "",
"PidsLimit": null,

[root@paas-node-111 ~]# docker inspect -f {{.State.Pid}} dcd2220e91b0
2579

进入所有命名空间执行命令:

 [root@paas-node-111 ~]# nsenter -t 2579 -a freetotal        used        free      shared  buff/cache   available
Mem:        3963132     1819480      162336        6160     1981316     1835540
Swap:       4194300     1731000     2463300

在 K8s 中在得到容器 pid 之前还需获取容器的 ID
查看pod容器id:

[root@paas-node-111 ~]# kubectl describe pod redis-7d67bc68ff-pbzms|grep -i "container id"Container ID:   docker://1268be01dbf62a06a50415b4eb7d6cf3bd3be9f2dbf04c9ff765b1a6cad11fd0

[root@paas-node-111 ~]# kubectl get pod redis-7d67bc68ff-pbzms -o template --template='{{range .status.containerStatuses}}{{.containerID}}{{end}}'
docker://1268be01dbf62a06a50415b4eb7d6cf3bd3be9f2dbf04c9ff765b1a6cad11fd0

用pod容器id去获取容器的pid

docker ps|grep 1268be01
1268be01dbf6        5bb541ae990c                               "docker-entrypoint.s…"   2 weeks ago         Up 2 weeks                              k8s_redis_redis-7d67bc68ff-pbzms_default_f68a2459-26fc-4c5f-bfe5-6b5550c81ccc_1
[root@paas-node-113 ~]# docker inspect 1268be01 |grep -i "pid""Pid": 57968,"PidMode": "","PidsLimit": null,

默认使用docker exec 进入容器,容器并没有提供ping 命令:

[root@paas-node-113 ~]# docker exec -it 1268be01  bash
root@redis-7d67bc68ff-pbzms:/data# ping 10.148.55.111
bash: ping: command not found

此时,就可以使用 nsenter 命令进入容器的网络命名空间内,使用ping命令去执行。

[root@paas-node-113 ~]# nsenter -t 57968 -n ping 10.148.55.111
PING 10.148.55.111 (10.148.55.111) 56(84) bytes of data.
64 bytes from 10.148.55.111: icmp_seq=1 ttl=63 time=0.305 ms
64 bytes from 10.148.55.111: icmp_seq=2 ttl=63 time=0.361 ms
64 bytes from 10.148.55.111: icmp_seq=3 ttl=63 time=0.173 ms
^C
--- 10.148.55.111 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.173/0.279/0.361/0.081 ms

看下路由是否是走了容器的网络:

[root@paas-node-113 ~]# nsenter -t 57968 -n mtr 10.148.55.111

在这里插入图片描述
[root@paas-node-113 ~]# mtr 10.148.55.111
在这里插入图片描述
以上可以看到明显是进入容器网络命名空间后,路由多了一跳。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上信息可以看到,进入容器网络空间后,路由先到宿主机再由宿主机将数据包发送到目标地址:10.148.55.111

4、 应用场景与优势

4.1. 容器调试

在容器网络故障排查中,nsenter 可直接进入容器的网络命名空间执行命令(如 ip addrping),无需容器内安装基础工具。

4.2. 资源管理

用于调试进程隔离、资源隔离(如 PID、用户命名空间)。

4.3. 简化操作

相比 docker exec,nsenter 提供更灵活的命名空间控制,支持直接进入容器内部执行命令。

5. 注意事项

1、权限限制:部分操作(如进入容器)可能需要 root 权限或特定权限设置。
2、兼容性:nsenter 依赖 Linux 命名空间技术,适用于支持命名空间的 Linux 内核版本。

6、总结

nsenter 是 Linux 中用于命名空间管理和调试的工具,广泛应用于容器、网络调试和资源隔离场景。其核心功能是通过进入指定命名空间执行命令,支持多种命名空间类型和灵活的命令选项,是 Linux 系统管理和调试的重要工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96140.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu Qt x64平台搭建 arm64 编译套件

环境&#xff1a; 主机平台&#xff1a;Ubuntu22.04.5 x86_64 目标平台&#xff1a;IMX8QM Ubuntu22.04.5 arm64 Qt版本&#xff1a;Qt6.5.3 LST GUI实现&#xff1a;QML 一、获取Ubuntu22.04.5 x86_64 系统镜像文件 1、镜像下载与安装 使用国内镜像下载对应版本的Ubuntu镜像…

mysql第五天学习 Mysql全局优化总结

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 补充一点配置文件my.ini或my.cnf的全局参数&#xff1a; 假设服务器配置为&#xff1a; CPU&#xff1a;32核内存&#xff1a;64GDISK…

leetcode hot100 二叉搜索树

二叉搜索树的第k小的数class Solution:def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:# 二叉搜索树的中序遍历是 升序排列的&#xff0c; 求第k小的&#xff0c;即第k个数self.res []def fun(root):if not root:returnfun(root.left)if root:self.res.a…

从Sonnet到Opus:一次解决RAG知识库流式输出难题的探索

又到周末&#xff0c;还得消耗消耗 ➡️ anyrouter 上的Claude资源&#xff0c;万一哪天都不能用了&#xff0c;也是浪费。 2025/9/5&#xff0c;Claude AI 的母公司 Anthropic 发布了一项新政策&#xff1a;即日起&#xff0c;Anthropic将不再对中国控股公司及其海外子公司开放…

「数据获取」中国科技统计年鉴(1991-2024)Excel

02、数据详情数据名称&#xff1a;《中国科技统计年鉴》&#xff08;1991-2024年&#xff09;数据年份&#xff1a;1991-202403、数据截图 04、获取方式&#xff08;获取方式看绑定的资源&#xff09;

SimLingo:纯视觉框架下的自动驾驶视觉 - 语言 - 动作融合模型

摘要 本文深入探讨了 SimLingo&#xff0c;一个在自动驾驶领域具有开创性意义的视觉-语言-动作一体化模型。SimLingo 创新性地将自动驾驶、语言理解和指令感知控制整合到一个统一的纯摄像头框架中&#xff0c;显著提升了自动驾驶系统在复杂环境中的感知、决策与执行能力。该模…

第五十四天(SQL注入数据类型参数格式JSONXML编码加密符号闭合复盘报告)

#SQL注入产生原理&#xff1a; 代码中执行的SQL语句存在可控变量导致 #常见SQL注入的利用过程&#xff1a; 1、判断数据库类型 2、判断参数类型及格式 3、判断数据格式及提交 4、判断数据回显及防护 5、获取数据库名&#xff0c;表名&#xff0c;列名 5、获取对应数据及…

VMWare上搭建Hive集群

文章目录1. MySQL安装2. 安装Hive集群3. 使用Hive客户端4. 实战总结本实战在VMware上搭建Hive集群&#xff0c;集成MySQL作为元数据存储&#xff0c;完成Hive环境配置、元数据初始化及HDFS仓库目录创建&#xff0c;实现Hive on Hadoop的SQL查询能力&#xff0c;为大数据分析提供…

Android网络之WIFI技术网络模型概述

文章目录术语1、WLAN与WIFI2、802.11 WIFI无线网络标准演进3、WIFI5、WIFI6和WIFI7的最高速率对比4、WIFI网络中的各个角色&#xff08;元件&#xff09;1&#xff09;网络拓扑架构图5、802.11权威指南1&#xff09;OSI与TCP/IP2&#xff09;IEEE 802.11协议簇介绍3&#xff09…

游戏中的设计模式——第三篇 简单工厂模式

5. 简单工厂模式 5.1 简单工厂模式的定义 简单工厂模式的核心是定义一个创建对象的接口&#xff0c;将对象的创建和本身的业务逻辑分离&#xff0c;降低系统的耦合度&#xff0c;使得两个修改起来相对容易些&#xff0c;当以后实现改变时&#xff0c;只需要修改工厂类即可。 5.…

基于SVN搭建企业内部知识库系统实践

一、准备工作 CentOS 7 服务器&#xff1a;确保你有 root 或 sudo 权限&#xff0c;可以访问该服务器。Windows 客户端&#xff1a;你将需要在 Windows 上安装 TortoiseSVN 客户端来与 SVN 服务器交互。防火墙&#xff1a;确保你的防火墙已开放 3690 端口&#xff0c;用于 SVN…

SQL注入7----(盲注与回显)

一.前言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办&#xff1f;例如应用程序就会返回 一个"通用的"的页面&#xff0c;或者重定向一个通用页面&#xff08;可能为网站首页&#xff09;。这时&#xff0c;我们之前学习的SQL注入办 法就…

尚硅谷宋红康JVM全套教程(详解java虚拟机)

https://www.bilibili.com/opus/1071553679925968898 案例7&#xff1a;日均百万订单系统JVM参数设置 https://github.com/wei198621/jvm_by_atguigu https://github.com/xftxyz2001/atguigu-jvm/blob/main/JavaYouthdocsJVM/%E7%AC%AC1%E7%AB%A0-JVM%E4%B8%8EJava%E4%BD%…

鸿蒙NEXT开发实战:图片显示、几何图形与自定义绘制详解

探索HarmonyOS NEXT强大的图形渲染能力&#xff0c;从图片展示到自定义绘图 HarmonyOS NEXT作为华为自主研发的操作系统&#xff0c;为开发者提供了一套丰富而强大的图形渲染能力。无论是显示图片、绘制几何图形&#xff0c;还是实现复杂的自定义绘图&#xff0c;鸿蒙都提供了简…

python + Flask模块学习 2 接收用户请求并返回json数据

用到的模块还是flask&#xff0c;用到的类有Flask&#xff0c; request&#xff0c; jsonfiy &#x1f642; 目录 1、GET请求 2、POST请求 1、表单格式 2、json格式 就酱&#xff0c;也比较简单&#xff0c;下一篇说简单的授权&#xff0c;简单来说就是比如用户付费买了服…

国内外常用的免费BUG管理工具选型

帮助用户根据自身情况做决定&#xff0c;比如团队规模、技术能力、是否需要移动端支持等。避免只是罗列工具&#xff0c;而是提供实际选择的维度。 国内外常用的免费BUG管理工具选择非常丰富&#xff0c;从轻量级到功能全面型都有覆盖。我将它们分为几类&#xff0c;并详细介绍…

JavaScript的事件循环机制

1.事件循环的理解JavaScript是单线程的&#xff0c;意味着它一次只能执行一个任务。而事件循环就是去协调在JavaScript环境中运行的同步任务、异步任务(微任务、宏任务)的执行顺序的一种机制。它是 JavaScript 实现单线程非阻塞异步执行的核心。2.事件循环的执行顺序同步任务—…

数据结构——栈(Java)

目录 一定义. 入栈 出栈 二.栈与线性表的关系 三.栈的实现方式 四.链表实现栈 1.结点的API设计 2.栈的API设计 2.1栈的初始化设计 2.2元素入栈 2.3元素出栈 五.括号匹配问题 完整代码展示 答案 一定义. 栈是一种基于先进后出&#xff08;FILO&#xff09;的数据…

科研笔记:数学建模启发的课题研究方法

借鉴数学建模的思路解决科学问题或开展课题研究&#xff0c;核心是将实际问题抽象为数学框架&#xff0c;通过定量分析、逻辑推演和验证优化&#xff0c;实现对问题的精准描述、解释或预测。其本质是“从现实到数学&#xff0c;再从数学回归现实”的迭代过程&#xff0c;适用于…

Agent落地到底选择LangChain 还是 LangGraph

核心概念 LangChain:一个用于构建由大型语言模型驱动的应用程序的框架。它提供了大量的组件和现成的链,旨在简化和标准化应用程序与LLM交互的过程。 LangGraph:一个用于在LangChain之上构建有状态、多参与者的 工作流 的库。它特别擅长处理具有循环、分支和复杂协调的代理(…