此文章来源于 nscenter —mount=/proc/pid/ns/mnt 命令, 使用该命令容器可以进入宿主机的文件系统并执行宿主机的命令.

tty的一些了解

因好奇为什么可以进入宿主机的伪终端看了一些tty的历史, 建议回顾…

参考: http://www.linusakesson.net/programming/tty/index.php

tty原理图1:
image.png

Line discipline 提供一些默认的功能:

  1. 行编辑 通过缓存实现一些backspace, clear line操作; application可以选择cooked模式启用, raw模式禁用, 自己处理行编辑命令. 内核提供几个不同的line discipline, 只有一个用于串行设备.

  2. Session management 用户对程序的控制如后台启动进程,杀死进程通过TTY driver实现.

TTY driver是一个被动对象, 通过进程或内核终端处理程序调用它, UART driver, line discipline和TTY driver构成TTY.

桌面Linux系统内控制台
image.png

通过终端的仿真提供伪TTY

Linux进程状态:
image.png

D 不可中断睡眠(waiting for some event) R runing or runnable(on run queue) S 中断睡眠(waiting for some event or signal) T 被作业控制信号或由于调试器在跟踪而停止 Z 僵尸态 已停止但没有被父进程回收

回到正题, 对该命令的一些思考

命名空间 : 命名空间就相当于一个作用域, 不同命名空间是互相隔离的, 命名空间的一个用例就是docker的容器.

进程的命令空间:
查看/proc/pid/ns/可以看到相应的命名空间

mount 挂载命名空间, 进程具有独立的文件系统
ipc ipc命名空间, 可用于进程间的通信如消息队列
uts 使进程具有独立的hostname和domainname
net 网络命名空间, 进程单独的协议栈
pid pid命名空间
user user命名空间
cgroup 单独的cgroup组

语法:
参考: https://www.cnblogs.com/Wshile/p/12596617.html

  1. nsenter [options] [program [arguments]]
  2. options:
  3. -t, --target pid:指定被进入命名空间的目标进程的pid
  4. -m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
  5. -u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
  6. -i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
  7. -n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
  8. -p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
  9. -U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
  10. -G, --setgid gid:设置运行程序的gid
  11. -S, --setuid uid:设置运行程序的uid
  12. -r, --root[=directory]:设置根目录
  13. -w, --wd[=directory]:设置工作目录
  14. 如果没有给出program,则默认执行$SHELL

示例:
进入容器的网络: 执行成功

nsenter -n -t{pid}

进入容器的文件系统:执行失败

nsenter -m -t{pid}

容器进入宿主机 执行失败

# 将宿主机pid为1的mnt复制到容器中
nsenter --mount=mnt

下一步

对容器有进一步了解之后再进行探讨…