滴水恩情 发表于 2022-6-22 08:05:18

nsenter命令简单介绍

目录

[*]一、简介
[*]二、安装
[*]三、简单使用
[*]四、原理

一、简介

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

nsenter ]

options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

如果没有给出program,则默认执行$SHELL。二、安装

util-linux 是一个开放源码的软件包,是一个对任何 Linux 系统的基本工具套件。含有一些标准 Unix 工具,如 login。
util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息。
1)源码安装
$ cd /tmp;
$ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure--without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin2)yum安装
$ sudo yum install -y util-linux三、简单使用

1)示例1
查看docker 容器的pid
$ docker inspect -f {{.State.Pid}} nginx然后,使用nsenter命令进入该容器的网络命令空间
$ nsenter -n -t6700
# 退出命名空间
$ exithttps://img2022.cnblogs.com/blog/1601821/202206/1601821-20220605183206394-436084329.png
2)示例2
进入到docker命名空间目录下
$ cd /run/docker/netns/
$ ls -lhttps://img2022.cnblogs.com/blog/1601821/202206/1601821-20220605183216578-320406956.png
查看busybox1容器的命名空间
$ docker ps
$ docker inspect bc5db459d077 | grep -i sandbox
$ nsenter --net=/var/run/docker/netns/a5e6c4190230 sh
$ iptables -nvL -t mangle
$ ipvsadm -lnhttps://img2022.cnblogs.com/blog/1601821/202206/1601821-20220605183226109-379533413.png
四、原理

1)namespace
namespace是Linux中一些进程的属性的作用域,使用命名空间,可以隔离不同的进程。
Linux在不断的添加命名空间,目前有:

[*]mount:挂载命名空间,使进程有一个独立的挂载文件系统,始于Linux 2.4.19
[*]ipc:ipc命名空间,使进程有一个独立的ipc,包括消息队列,共享内存和信号量,始于Linux 2.6.19
[*]uts:uts命名空间,使进程有一个独立的hostname和domainname,始于Linux 2.6.19
[*]net:network命令空间,使进程有一个独立的网络栈,始于Linux 2.6.24
[*]pid:pid命名空间,使进程有一个独立的pid空间,始于Linux 2.6.24
[*]user:user命名空间,是进程有一个独立的user空间,始于Linux 2.6.23,结束于Linux 3.8
[*]cgroup:cgroup命名空间,使进程有一个独立的cgroup控制组,始于Linux 4.6
Linux的每个进程都具有命名空间,可以在/proc/PID/ns目录中看到命名空间的文件描述符。
以上面pid为例
$ ls -l /proc/6700/nshttps://img2022.cnblogs.com/blog/1601821/202206/1601821-20220605183241427-733026550.png
2)clone
clone是Linux的系统调用函数,用于创建一个新的进程。
clone和fork比较类似,但更为精细化,比如说使用clone创建出的子进程可以共享父进程的虚拟地址空间,文件描述符表,信号处理表等等。不过这里要强调的是,clone函数还能为新进程指定命名空间。
3)setns
clone用于创建新的命令空间,而setns则用来让当前线程(单线程即进程)加入一个命名空间。
4)nsenter
那么,最后就是nsenter了,nsenter相当于在setns的示例程序之上做了一层封装,使我们无需指定命名空间的文件描述符,而是指定进程号即可。

来源:https://www.cnblogs.com/liugp/p/16344594.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: nsenter命令简单介绍