此文章来源于 nscenter —mount=/proc/pid/ns/mnt 命令, 使用该命令容器可以进入宿主机的文件系统并执行宿主机的命令.
tty的一些了解
因好奇为什么可以进入宿主机的伪终端看了一些tty的历史, 建议回顾…
参考: http://www.linusakesson.net/programming/tty/index.php
tty原理图1:
Line discipline 提供一些默认的功能:
行编辑 通过缓存实现一些backspace, clear line操作; application可以选择cooked模式启用, raw模式禁用, 自己处理行编辑命令. 内核提供几个不同的line discipline, 只有一个用于串行设备.
Session management 用户对程序的控制如后台启动进程,杀死进程通过TTY driver实现.
TTY driver是一个被动对象, 通过进程或内核终端处理程序调用它, UART driver, line discipline和TTY driver构成TTY.
桌面Linux系统内控制台
通过终端的仿真提供伪TTY
Linux进程状态:
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
nsenter [options] [program [arguments]]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。
示例:
进入容器的网络: 执行成功
nsenter -n -t{pid}
进入容器的文件系统:执行失败
nsenter -m -t{pid}
容器进入宿主机 执行失败
# 将宿主机pid为1的mnt复制到容器中
nsenter --mount=mnt
下一步
对容器有进一步了解之后再进行探讨…
