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 ~]#