nsenter命令工具介绍与使用

简介

nsenter 是一个命令行工具,通常用于在 Linux 上与命名空间 (namespace) 进行交互。它允许用户进入一个或多个命名空间,使得你可以在这些命名空间中执行命令。这个工具非常适合在容器化环境中使用,尤其是与 Docker、LXC 和其他容器技术相结合。它位于util-linux包中。

安装util-linux

yum install -y util-linux

基本概念(原理)

在 Linux 中,命名空间是一种用于隔离进程的机制。它们确保进程只看到它们所属的资源。常见的命名空间类型包括:

• Mount namespace:影响文件系统的挂载点。

• PID namespace:隔离进程ID。

• Network namespace:允许进程拥有自己的网络栈。

• User namespace:隔离用户和组ID。

• IPC namespace:影响进程间通信。

nsenter 允许你进入这些命名空间中的任意一个,能够使你在特定的环境中执行命令。

基本使用

nsenter OPTIONS --target --mount --uts --ipc --net --pid

【选项】:

○ --target :指定你要进入的进程 ID (PID) 的目标。

○ --mount:进入挂载命名空间。

○ --uts:进入 UTS 命名空间(用于主机名和域名)。

○ --ipc:进入 IPC 命名空间。

○ --net:进入网络命名空间。

○ --pid:进入 PID 命名空间。

○ --user:进入用户命名空间。

○ --preserve-credentials:保留用户凭据。

使用案例

  1. 进入容器进程的网络命名空间

    命令 实例

    docker inspect <container_id> --format='{{json .State.Pid}}' root@cnbhw-pcp-10-25-16-87 docker# docker inspect ccde03c23434 --format '{{.State.Pid}}'

    102893

    nsenter -n -t nsenter --net -t 102893

    ip a 容器进程102893的网络命名空间

    exit 退出容器PID的网络命名空间

    ip a 容器宿主机的网路的网络命名空间

  2. 假设你有一个正在运行的容器,其主进程的 PID 为 102893,你可以使用以下命令进入该进程的命名空间并获得一个 shell。

    这将启动一个新的 Bash shell,并使你进入与 PID 12345 相同的命名空间。

    nsenter --target 102893 --mount --uts --ipc --net --pid -- /bin/bash

    root@ccde03c23434:/# hostname #进入了容器的IPC空间

    ccde03c23434

    root@ccde03c23434:/# exit

    exit

    root@cnbhw-pcp-10-25-16-87 \~# hostname #会到了宿主机的命名空间

    cnbhw-pcp-10-25-16-87

使用 Tips

• 权限问题:需要具备相应的权限(如 root)才能使用 nsenter 进入指定的命名空间。

• 调试容器:如果你的进程在容器内部崩溃,承载在容器中的 nsenter 能帮助你获得更多的信息。

• 多命名空间:可以同时进入多个命名空间,提供更好的调试环境。

• 使用 pgrep 命令:结合 pgrep 命令可以方便地找到运行中程序的 PID,将其直接传给 nsenter。

• 监控工具:在进入命名空间后,可以使用诸如 top、htop、ps 等监控工具来观察该命名空间内的活动。

相关推荐
tangwangbi1 小时前
Linux 系统配置文件:/etc/profile、~/.bashrc 和 ~/.bash_profile 三者之间的区别与作用
linux·运维·bash
蜀道山老天师2 小时前
Shell Bash变量与运算符(含条件测试与流程控制)
linux·运维·bash
Mr.朱鹏2 小时前
Linux 服务器 LVM 根分区在线动态扩容
linux·服务器·数据库
mengge.cloud2 小时前
存储技术基础小白教程
linux·运维·服务器·wpf·存储
tang777893 小时前
反爬虫场景下代理IP池的动态扩容与失效IP自动清理方案实现
linux·服务器·网络·爬虫代理·住宅代理ip
新时代牛马4 小时前
Linux 系统调用与IPC 完整篇:从syscall 入口、VDSO 到pipe/shm/futex 选型
linux·运维·服务器
fpcc5 小时前
计算机原理—Linux是如何加载可执行文件到内存
linux
野熊佩骑5 小时前
Kubernetes实战系列文章(三) 之 K8S运维常用命令
linux·运维·docker·微服务·云原生·容器·kubernetes
码农客栈5 小时前
linux 设备树下的 platform 驱动编写
linux
小HANN6 小时前
Linux建站实战:CentOS7+LNMP 从零部署 ECShop 开源电商系统
linux·运维·服务器·经验分享