liunx uts命名空间
UTS 命名空间是 Linux 内核 Namespace(命名空间)的一个子系统,主要用来完成对容器 HOSTNAME 和 domain 的隔离,同时保存内核名称、版本、以及底层体系结构类型等信息。
UTS 命名空间是扁平化的结构,不同的命名空间之间没有层级关系。
Uts 命名空间的用来隔离系统的这些信息,使得用户在容器中查看到的信息是当前容器的系统、版本,不同于主机的,内核通过 uts_namespace 对当前系统中多个容器的这些信息进行统一管理,每一个容器对应有一个自己的 uts_namespace,用来隔离容器的内核名称、版本等信息,不同容器查看到的都是属于自己的信息,相互间不能查看
查看当前状态的进程树
启一个终端查看
[root@k8s-nginx1 ~]# pstree -pl systemd(1)─┬─NetworkManager(793)─┬─{NetworkManager}(816)│ └─{NetworkManager}(818) ├─agetty(803) ├─auditd(765)───{auditd}(766) ├─crond(798) ├─dbus-daemon(788) ├─irqbalance(796) ├─lvmetad(613) ├─master(1283)─┬─pickup(4030) │ └─qmgr(1285) ├─nginx(1114)───nginx(1115) ├─polkitd(791)─┬─{polkitd}(809)│ ├─{polkitd}(810)│ ├─{polkitd}(811)│ ├─{polkitd}(812)│ ├─{polkitd}(815)│ └─{polkitd}(820) ├─rngd(794) ├─rsyslogd(1027)─┬─{rsyslogd}(1131)│ └─{rsyslogd}(1132) ├─sshd(1029)───sshd(4052)───bash(4054)───pstree(4088) ├─systemd-journal(588) ├─systemd-logind(792) ├─systemd-udevd(617) └─tuned(1023)─┬─{tuned}(1552)├─{tuned}(1553)├─{tuned}(1555)└─{tuned}(1556)
查看当前进程的 uts,$$ 表示当前进程的 PID,这里等同于 4054
使用 readlink 查看 namespace 的 inode number
[root@k8s-nginx1 ~]# readlink /proc/$$/ns/uts /proc/4054/ns/uts uts:[4026531838] uts:[4026531838]
查看当前进程的 hostname
[root@k8s-nginx1 ~]# hostname k8s-nginx1
创建新的 uts namespace 查看当前状态进程树
[root@k8s-nginx1 ~]# unshare --uts bash [root@k8s-nginx1 ~]# pstree -pl systemd(1)─┬─NetworkManager(793)─┬─{NetworkManager}(816)│ └─{NetworkManager}(818) ├─agetty(803) ├─auditd(765)───{auditd}(766) ├─crond(798) ├─dbus-daemon(788) ├─irqbalance(796) ├─lvmetad(613) ├─master(1283)─┬─pickup(4030) │ └─qmgr(1285) ├─nginx(1114)───nginx(1115) ├─polkitd(791)─┬─{polkitd}(809)│ ├─{polkitd}(810)│ ├─{polkitd}(811)│ ├─{polkitd}(812)│ ├─{polkitd}(815)│ └─{polkitd}(820) ├─rngd(794) ├─rsyslogd(1027)─┬─{rsyslogd}(1131)│ └─{rsyslogd}(1132) ├─sshd(1029)───sshd(4052)───bash(4054)───bash(4091)───pstree(4100)# 比上面多出一个 bash(4091) ├─systemd-journal(588) ├─systemd-logind(792) ├─systemd-udevd(617) └─tuned(1023)─┬─{tuned}(1552)├─{tuned}(1553)├─{tuned}(1555)└─{tuned}(1556)
4054 与 4091 的 uts inode number 不同,说明这两个线程处在不同的 namespace
[root@k8s-nginx1 ~]# readlink /proc/$$/ns/uts /proc/4091/ns/uts uts:[4026532430] uts:[4026532430]
设置当前进程的 hostname
新的 hostname 不会立即生效,执行 exec bash,使用新 bash 取代当前 bash,使 hostname 生效
[root@k8s-nginx1 ~]# hostname namespace-01 [root@k8s-nginx1 ~]# exec bash [root@namespace-01 ~]# hostname namespace-01
另启一个终端
查看进程树
[root@k8s-nginx1 ~]# pstree -pl systemd(1)─┬─NetworkManager(793)─┬─{NetworkManager}(816)│ └─{NetworkManager}(818) ├─agetty(803) ├─auditd(765)───{auditd}(766) ├─crond(798) ├─dbus-daemon(788) ├─irqbalance(796) ├─lvmetad(613) ├─master(1283)─┬─pickup(4030) │ └─qmgr(1285) ├─nginx(1114)───nginx(1115) ├─polkitd(791)─┬─{polkitd}(809)│ ├─{polkitd}(810)│ ├─{polkitd}(811)│ ├─{polkitd}(812)│ ├─{polkitd}(815)│ └─{polkitd}(820) ├─rngd(794) ├─rsyslogd(1027)─┬─{rsyslogd}(1131)│ └─{rsyslogd}(1132) ├─sshd(1029)───sshd(4052)─┬─bash(4054)───bash(4091) │ └─bash(4115)───pstree(4130) ├─systemd-journal(588) ├─systemd-logind(792) ├─systemd-udevd(617) └─tuned(1023)─┬─{tuned}(1552)├─{tuned}(1553)├─{tuned}(1555)└─{tuned}(1556)
查看当前 uts 进程
[root@k8s-nginx1 ~]# readlink /proc/$$/ns/uts /proc/4115/ns/uts uts:[4026531838] uts:[4026531838]
查看当前进程的 hostname
[root@k8s-nginx1 ~]# hostname k8s-nginx1
创建新的 uts namespace 查看进程树
[root@k8s-nginx1 ~]# unshare --uts bash [root@k8s-nginx1 ~]# pstree -pl systemd(1)─┬─NetworkManager(793)─┬─{NetworkManager}(816)│ └─{NetworkManager}(818) ├─agetty(803) ├─auditd(765)───{auditd}(766) ├─crond(798) ├─dbus-daemon(788) ├─irqbalance(796) ├─lvmetad(613) ├─master(1283)─┬─pickup(4030) │ └─qmgr(1285) ├─nginx(1114)───nginx(1115) ├─polkitd(791)─┬─{polkitd}(809)│ ├─{polkitd}(810)│ ├─{polkitd}(811)│ ├─{polkitd}(812)│ ├─{polkitd}(815)│ └─{polkitd}(820) ├─rngd(794) ├─rsyslogd(1027)─┬─{rsyslogd}(1131)│ └─{rsyslogd}(1132) ├─sshd(1029)───sshd(4052)─┬─bash(4054)───bash(4091) │ └─bash(4115)───bash(4133)───pstree(4142)# 新的进程 4133 ├─systemd-journal(588) ├─systemd-logind(792) ├─systemd-udevd(617) └─tuned(1023)─┬─{tuned}(1552)├─{tuned}(1553)├─{tuned}(1555)└─{tuned}(1556)
查看当前进程的 uts
[root@k8s-nginx1 ~]# readlink /proc/$$/ns/uts /proc/4133/ns/uts uts:[4026532431] uts:[4026532431]
[root@k8s-nginx1 ~]# hostname namespace-02 [root@k8s-nginx1 ~]# exec bash [root@namespace-02 ~]# hostname namespace-02
三个 namespace 之间设置的 hostname 互不影响,所有进程退出之后,namespace 将被自动删除,inode number 回收利用
使用 exit 退出 namespace
[root@namespace-02 ~]# hostname namespace-02 [root@namespace-02 ~]# exit exit [root@k8s-nginx1 ~]#
[root@k8s-nginx1 ~]# pstree -pl systemd(1)─┬─NetworkManager(793)─┬─{NetworkManager}(816)│ └─{NetworkManager}(818) ├─agetty(803) ├─auditd(765)───{auditd}(766) ├─crond(798) ├─dbus-daemon(788) ├─irqbalance(796) ├─lvmetad(613) ├─master(1283)─┬─pickup(4030) │ └─qmgr(1285) ├─nginx(1114)───nginx(1115) ├─polkitd(791)─┬─{polkitd}(809)│ ├─{polkitd}(810)│ ├─{polkitd}(811)│ ├─{polkitd}(812)│ ├─{polkitd}(815)│ └─{polkitd}(820) ├─rngd(794) ├─rsyslogd(1027)─┬─{rsyslogd}(1131)│ └─{rsyslogd}(1132) ├─sshd(1029)───sshd(4052)─┬─bash(4054)───bash(4091) │ └─bash(4115)───pstree(4165)# 进程 4133 已经没有了 ├─systemd-journal(588) ├─systemd-logind(792) ├─systemd-udevd(617) └─tuned(1023)─┬─{tuned}(1552)├─{tuned}(1553)├─{tuned}(1555)└─{tuned}(1556)
[root@k8s-nginx1 ~]# readlink /proc/$$/ns/uts /proc/4133/ns/uts uts:[4026531838]
[root@k8s-nginx1 ~]# nsenter --target 4091 --uts bash [root@namespace-01 ~]# readlink /proc/$$/ns/uts uts:[4026532430] [root@namespace-01 ~]# hostname namespace-01 [root@namespace-01 ~]#