UTS Namespace
基本信息
UTS(UNIX Time-Sharing System)命名空间是Linux内核的一个功能,提供了两个系统标识符的隔离:主机名和NIS(网络信息服务)域名。这种隔离允许每个UTS命名空间具有其独立的主机名和NIS域名,在容器化场景中特别有用,其中每个容器应该看起来像一个具有自己主机名的独立系统。
工作原理:
创建新的UTS命名空间时,它会从其父命名空间复制主机名和NIS域名。这意味着,在创建时,新命名空间与其父命名空间共享相同的标识符。但是,在命名空间内对主机名或NIS域名进行的任何后续更改都不会影响其他命名空间。
在UTS命名空间内,进程可以使用
sethostname()
和setdomainname()
系统调用更改主机名和NIS域名。这些更改仅在命名空间内部有效,不会影响其他命名空间或主机系统。进程可以使用
setns()
系统调用在命名空间之间移动,或者使用带有CLONE_NEWUTS
标志的unshare()
或clone()
系统调用创建新的命名空间。当进程移动到新的命名空间或创建一个时,它将开始使用与该命名空间关联的主机名和NIS域名。
实验:
创建不同的命名空间
命令行
sudo unshare -u [--mount-proc] /bin/bash
通过使用参数--mount-proc
挂载/proc
文件系统的新实例,确保新的挂载命名空间具有准确且独立的进程信息视图,特定于该命名空间。
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
检查您的进程位于哪个命名空间
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
查找所有 UTS 命名空间
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
进入 UTS 命名空间
nsenter -u TARGET_PID --pid /bin/bash
此外,只有root用户才能进入另一个进程命名空间。而且,没有指向它的描述符(如/proc/self/ns/uts
),你无法进入其他命名空间。
更改主机名
unshare -u /bin/bash
hostname newhostname # Hostname won't be changed inside the host UTS ns
参考资料
最后更新于