理解uts namespace

uts(UNIX Time-Sharing System) namespace可隔离hostname和NIS Domain name资源,使得一个宿主机可拥有多个主机名或Domain Name。换句话说,可让不同namespace中的进程看到不同的主机名。

例如,使用unshare命令(较新版本Linux内核还支持nscreate命令)创建一个新的uts namespace:

# -u或--uts表示创建一个uts namespace
# 这个namespace中运行/bin/bash程序
$ hostname
longshuai-vm      # 当前root namespace的主机名为longshuai-vm
$ sudo unshare -u /bin/bash
root@longshuai-vm:/home/longshuai#   # 进入了新的namespace中的shell# 其主机名初始时也是longshuai-vm,# 其拷贝自上级namespace资源

上面指定运行的是/bin/bash程序,这会进入交互式模式,当执行exit时,bash退出,回到当前的namespace中。也可以指定在namespace中运行其他程序,例如unshare -u sleep 3表示在uts namespace中睡眠3秒后退出并回到当前namespace。

因为是uts namespace,所以可在此namespace中修改主机名:

# 修改该namespace的主机名为ns1
# 修改后会立即生效,但不会显示在当前Shell提示符下
# 需重新加载Shell环境
root@longshuai-vm:/home/longshuai# hostname ns1
root@longshuai-vm:/home/longshuai# hostname
ns1
root@longshuai-vm:/home/longshuai# exec $SHELL
root@ns1:/home/longshuai#

namespace中修改的主机名不会直接修改主机名配置文件(如/etc/hostname),而是修改内核属性/proc/sys/kernel/hostname:

root@ns1:/home/longshuai# cat /proc/sys/kernel/hostname
ns1
root@ns1:/home/longshuai# cat /etc/hostname
longshuai-vm

创建了新的namespace并在其中运行/bin/bash进程后,再去关注一下进程关系:

# ns1中的bash进程PID
root@ns1:/home/longshuai# echo $$
14279# bash进程(PID=14279)和grep进程运行在ns1 namespace中,
# 其父进程sudo(PID=14278)运行在ns1的上级namespace即root namespace中
root@ns1:/home/longshuai# pstree -p | grep $$|-sshd(10848)---bash(10850)---sudo(14278)---bash(14279)-+-grep(14506)# 运行在ns1中当前bash进程(PID=14279)的namespace
root@ns1:/home/longshuai# ls -l /proc/14279/ns
lrwxrwxrwx ... cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx ... ipc -> 'ipc:[4026531839]'
lrwxrwxrwx ... mnt -> 'mnt:[4026531840]'
lrwxrwxrwx ... net -> 'net:[4026531992]'
lrwxrwxrwx ... pid -> 'pid:[4026531836]'
lrwxrwxrwx ... pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx ... user -> 'user:[4026531837]'
lrwxrwxrwx ... uts -> 'uts:[4026532588]'  # 注意这一行,和sudo进程的uts inode不同# 父进程sudo(PID=14278)不在ns1中,它的namespace信息
root@ns1:/home/longshuai# ls -l /proc/14278/ns
lrwxrwxrwx ... cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx ... ipc -> 'ipc:[4026531839]'
lrwxrwxrwx ... mnt -> 'mnt:[4026531840]'
lrwxrwxrwx ... net -> 'net:[4026531992]'
lrwxrwxrwx ... pid -> 'pid:[4026531836]'
lrwxrwxrwx ... pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx ... user -> 'user:[4026531837]'
lrwxrwxrwx ... uts -> 'uts:[4026531838]'   # 注意这一行,和PID=1的uts inode相同

回到创建uts namespace时敲下的unshare命令:

sudo unshare -u /bin/bash

从进程关系...---sudo(14278)---bash(14279)可知两个进程PID是连续的,说明unshare程序对应的进程被/bin/bash程序通过execve()替换了。

详细的过程如下:「sudo进程运行在当前namespace中,它将fork一个新进程来运行unshare程序,unshare程序加载完成后,将创建一个新的uts namespace,unshare进程自身将加入到这个uts namespace中,unshare进程内部再exec加载/bin/bash,于是unshare进程被替换为/bin/bash进程,/bin/bash进程也将运行在uts namespace中」

当namespace中的/bin/bash进程退出,该namespace中将没有任何进程,该namespace将自动销毁。注意,在默认情况下,namespace中必须要有至少一个进程,否则将被自动被销毁。但也有一些手段可以让namespace持久化,即使已经没有任何进程在其中运行。

如果在ns1中再创建一个namespace ns2,这个ns2初始时将共享ns1的其他资源并拷贝ns1的主机名资源,其初始主机名也为ns1。

$ sudo unshare -u /bin/bash    # 在root namespace环境下创建一个namespace
root@longshuai-vm:/home/longshuai# hostname ns1 # 修改主机名为ns1
root@longshuai-vm:/home/longshuai# hostname
ns1# 在ns1中创建一个namespace
############ 注意没有sudo
root@longshuai-vm:/home/longshuai# unshare -u /bin/bash
root@ns1:/home/longshuai# hostname    # 初始主机名拷贝自上级namespace的主机名ns1
ns1
root@ns1:/home/longshuai# hostname ns2
root@ns1:/home/longshuai# hostname  # 修改主机名为ns2
ns2
root@ns1:/home/longshuai# exit
exitroot@longshuai-vm:/home/longshuai# hostname  # ns2修改主机名不影响ns1
ns1
root@longshuai-vm:/home/longshuai# exit
exit[~]->$ hostname      # ns1修改主机名不影响root namespace
longshuai-vm

注意,即使root namespace当前用户为longshuai,但因为使用了sudo创建ns1,进入ns1后其用户名为root,所以在ns1中执行unshare命令创建新的namespace不需要再使用sudo。

$ echo $USER      # 当前root namespace的用户为longshuai
longshuai$ sudo unshare -u /bin/bash
root@longshuai-vm:/home/longshuai# echo $USER  # ns中的用户名变为root
root
root@longshuai-vm:/home/longshuai# id;echo $HOME;echo ~
uid=0(root) gid=0(root) groups=0(root)
/root
/root

Linux namespace之:uts namespace相关推荐

  1. linux uts namespace 提供了主机名和域名的隔离 docker中被用到

    UTS,UNIX Time-sharing System namespace提供了主机名和域名的隔离.能够使得子进程有独立的主机名和域名(hostname),这一特性在Docker容器技术中被用到,使 ...

  2. linux内核知识之namespace

    namespace概念: namespace是linux自带的功能用来隔离内核资源的机制,如进程pid,主机名与域名,网络设备端口等.什么是容器?容器其实就是一个虚拟化的独立的沙箱环境,和宿主机或者其 ...

  3. Linux ns 5. IPC Namespace 详解

    文章目录 1. 简介 2. 源码分析 2.1 copy_ipcs() 2.2 ipcget() 2.3 ipc_check_perms() 2.4 相关系统调用 参考文档: 1. 简介 进程间通讯的机 ...

  4. Linux ns 3. Mnt Namespace 详解

    1. 文件系统层次化 对 Linux 系统来说一切皆文件,Linux 使用树形的层次化结构来管理所有的文件对象. 完整的Linux文件系统,是由多种设备.多种文件系统组成的一个混合的树形结构.我们首先 ...

  5. linux下查看pid namespace的方法

    1)方法一 使用 lsns 查看 下面展示了当前系统中只有一个 pid namespace,其 inode 号是 4026531836,该 pid namespace 中的最小 pid 是 1,即 i ...

  6. python namespace,python命名空间(namespace)简单介绍

    python命名空间(namespace)简单介绍 发布时间:2020-09-08 07:20:33 来源:脚本之家 阅读:127 作者:人生与戏 命名空间: 每一个作用域变量存储的位置,或者解释为 ...

  7. Linux内核的namespace机制分析

    1.  Linux内核namespace机制 Linux Namespaces机制提供一种资源隔离方案.PID,IPC,Network等系统资源不再是全局性的,而是属于某个特定的Namespace.每 ...

  8. linux 命名空间Namespace机制【转】

    原文:http://blog.csdn.net/preterhuman_peak/article/details/40857117 Linux Namespaces机制提供一种资源隔离方案.PID,I ...

  9. Linux Namespace 入门系列:Namespace API

    Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法.用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认 ...

最新文章

  1. 二叉树的前序、中序、后序非递归遍历 python实现
  2. 低调的,我们改名字了!
  3. vs移植的.exe再编译无法更新_关于freetype的移植和其官方demos的使用总结
  4. 【Scratch】青少年蓝桥杯_每日一题_5.07_猜数字
  5. 静态链接库编写与使用(VC6)
  6. 深入了解回调函数Java
  7. CODEVS-2018-反病毒软件-线段树
  8. 不做CIO 就做首席架构师
  9. DBus glib 各数据类型接收与发送详解—C语言(3)
  10. jQuery.sap.declare(cus.crm.notes.ext.Component);
  11. 如何在SAP里创建configurable material物料主数据
  12. coursera 《现代操作系统》 -- 第五周 同步机制(1)
  13. python求矩阵的秩_Python 实现线性代数计算器
  14. NOI2018退役记
  15. Win10下安装Ubuntu16.04-空间不可用-个人志
  16. 百度坐标转换中文地址(百度地图JavaScript API逆地址解析 )
  17. 见缝插针的人_“见缝插针”的创意人生
  18. domian index域索引和全文索引
  19. 从西天取经的九九八十一难来看Java设计模式:模板方法模式
  20. php利用七牛云的对象存储完成图片上传-高效管理图片(用php搭建一个自己的图床) nice!!!

热门文章

  1. 算法导论 pdf_学习数据结构和算法最好的书是什么?
  2. 计算机科学是对描述和变换,对计算机科学发展的思考
  3. mysql索引和数据完整性答案_第5章MySQL索引与完整性约束.ppt
  4. java定时任务什么时间e结束_Java定时任务
  5. java web 润乾报表教程_润乾报表开发 基础教程.ppt
  6. 整活插件 炉石传说_酒馆战旗整活插件 免安装版
  7. 打乱 数字_崔召幼儿园中班悦享时光——亲子益智游戏数字配对
  8. oracle11g备份出错,Oracle 11g备份导入12c错误
  9. oracle olap报告,10g部署oracle olap组件
  10. python调用node_在node中执行python脚本