Linux-nsenter命令使用 – 记忆角落

Linux-nsenter命令使用

/ 0评 / 0

linux-nsenter命令使用

简介

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。

用途

一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等,这就给调试容器网络带来相当大的困扰:只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间使用宿主机的命令调试容器网络。

用法

[root@nacos1 ~]# nsenter --help

用法:
 nsenter [options] <program> [<argument>...]

Run a program with namespaces of other processes.

选项:
 -t, --target <pid>     要获取名字空间的目标进程
 -m, --mount[=<file>]   enter mount namespace #进入mount命令空间。如果指定了file,则进入file的命令空间
 -u, --uts[=<file>]     enter UTS namespace (hostname etc) #进入uts命令空间。如果指定了file,则进入file的命令空间
 -i, --ipc[=<file>]     enter System V IPC namespace # 进入ipc命令空间。如果指定了file,则进入file的命令空间
 -n, --net[=<file>]     enter network namespace # 进入net命令空间。如果指定了file,则进入file的命令空间
 -p, --pid[=<file>]     enter pid namespace # 进入pid命令空间。如果指定了file,则进入file的命令空间
 -U, --user[=<file>]    enter user namespace # 进入user命令空间。如果指定了file,则进入file的命令空间
 -S, --setuid <uid>     set uid in entered namespace # 设置运行程序的uid
 -G, --setgid <gid>     set gid in entered namespace # 设置运行程序的gid
     --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          执行 <程序> 前不 fork
 -Z, --follow-context   set SELinux context according to --target PID

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

更多信息请参阅 nsenter(1)。

安装

util-linux 是一个开放源码的软件包,是一个对任何 Linux 系统的基本工具套件。含有一些标准 Unix 工具,如 login。
util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息。

yum安装

yum install -y util-linux

示例

运行一个openjdk:8-jdk-alpine容器,查看该容器的pid:

# 查询容器的pid
[root@nacos1 ~]# docker inspect -f {{.State.Pid}} 61716a014554
26654

# 使用nsenter命令进入该容器的网络命令空间
[root@nacos1 ~]# nsenter -n -t26654

[root@nacos1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2277: eth0@if2278: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

[root@nacos1 ~]# exit
登出

在Kubernetes中,在得到容器pid之前还需获取容器的ID,可以使用如下命令获取

kubectl get pod test -o yaml |grep containerID
  - containerID: docker://2bdaa26f378b8162482f94bbee636c09fd9c31e6c365e3af595ef4c32346b16b

发表评论

您的电子邮箱地址不会被公开。