nsenter命令简单介绍

打印 上一主题 下一主题

主题 549|帖子 549|积分 1647

目录

一、简介

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。
用途
一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰:只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间使用宿主机的命令调试容器网络。
用法,查看帮助
  1. $ nsenter --help
  2. nsenter [options] [program [arguments]]
  3. options:
  4. -t, --target pid:指定被进入命名空间的目标进程的pid
  5. -m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
  6. -u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
  7. -i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
  8. -n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
  9. -p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
  10. -U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
  11. -G, --setgid gid:设置运行程序的gid
  12. -S, --setuid uid:设置运行程序的uid
  13. -r, --root[=directory]:设置根目录
  14. -w, --wd[=directory]:设置工作目录
  15. 如果没有给出program,则默认执行$SHELL。
复制代码
二、安装

util-linux 是一个开放源码的软件包,是一个对任何 Linux 系统的基本工具套件。含有一些标准 Unix 工具,如 login。
util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息。
1)源码安装
  1. $ cd /tmp;
  2. $ 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;
  3. $ ./configure  --without-ncurses
  4. $ make nsenter && sudo cp nsenter /usr/local/bin
复制代码
2)yum安装
  1. $ sudo yum install -y util-linux
复制代码
三、简单使用

1)示例1
查看docker 容器的pid
  1. $ docker inspect -f {{.State.Pid}} nginx
复制代码
然后,使用nsenter命令进入该容器的网络命令空间
  1. $ nsenter -n -t6700
  2. # 退出命名空间
  3. $ exit
复制代码

2)示例2
进入到docker命名空间目录下
  1. $ cd /run/docker/netns/
  2. $ ls -l
复制代码

查看busybox1容器的命名空间
  1. $ docker ps
  2. $ docker inspect bc5db459d077 | grep -i sandbox
  3. $ nsenter --net=/var/run/docker/netns/a5e6c4190230 sh
  4. $ iptables -nvL -t mangle
  5. $ ipvsadm -ln
复制代码

四、原理

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为例
  1. $ ls -l /proc/6700/ns
复制代码

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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表