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