精华内容
下载资源
问答
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和...在前面的文章中,我们曾经体验过如何使用chroot和LXC,在接下来几篇文章中,我们将会使用unshare命令来演示Linux内核命名空间到底是怎么玩的。

    作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。在前面的文章中,我们曾经体验过如何使用chroot和LXC,在本文中我们将会使用unshare命令来演示Linux内核的MNT Namespace是如何动作的。

    Namespace的历史

    Namespace并不是Linux才推出的东西,早在很久之前,Unix上就有类似的东西,而HPUX和Solaris商用的Conatiner更是以前就有推出。而在Linux的2.6之后的版本Namespace就逐步的被加了进来。

    Linux Namespace的6大类型

    项番类型功能说明
    No.1MNT Namespace提供磁盘挂载点和文件系统的隔离能力
    No.2IPC Namespace提供进程间通信的隔离能力
    No.3Net Namespace提供网络隔离能力
    No.4UTS Namespace提供主机名隔离能力
    No.5PID Namespace提供进程隔离能力
    No.6User Namespace提供用户隔离能力

    Ubuntu版本

    root@ubuntu:~# uname -a
    Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    root@ubuntu:~#

    事前确认

    确认当前进程PID

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~#

    确认当前进程的各个namespace

    root@ubuntu:~# ls -l /proc/$$/ns
    total 0
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 cgroup -> cgroup:[4026531835]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 ipc -> ipc:[4026531839]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 mnt -> mnt:[4026531840]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 net -> net:[4026531957]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 pid -> pid:[4026531836]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 uts -> uts:[4026531838]
    root@ubuntu:~#

    内容说明

    项番内容说明
    No.1linux会在/proc下创建所对应的进程相关的信息,ns则为Namespace的信息
    No.2$$为当前进程PID,/proc/$$/ns下的Namespace的个数回随着Linux内核的高低不同显示的个数不同,因为Linux所支持的Namespace不是一次到位的
    No.3mnt:[4026531840],不同的Namespace都有不同的编号,比如32968的mnt的namespace的编号就是4026531840
    No.4关于Cgroup会单独在后面进行说明

    没有隔离的mount

    首先我们来看一下没有隔离的mount是怎样动作的,为了简单起见使用tmpfs这种基于内存的文件系统来模拟。

    事前准备

    root@ubuntu:~# mkdir /tmp/testnoisolation

    mount tmpfs

    root@ubuntu:~# mount -t tmpfs tmpfs /tmp/testnoisolation
    root@ubuntu:~# cd /tmp/testnoisolation
    root@ubuntu:/tmp/testnoisolation# 

    创建文件

    root@ubuntu:/tmp/testnoisolation# touch aaa bbb ccc ddd
    root@ubuntu:/tmp/testnoisolation# ll
    total 4
    drwxrwxrwt  2 root root  120 Sep 15 10:56 ./
    drwxrwxrwt 13 root root 4096 Sep 15 10:55 ../
    -rw-r--r--  1 root root    0 Sep 15 10:56 aaa
    -rw-r--r--  1 root root    0 Sep 15 10:56 bbb
    -rw-r--r--  1 root root    0 Sep 15 10:56 ccc
    -rw-r--r--  1 root root    0 Sep 15 10:56 ddd
    root@ubuntu:/tmp/testnoisolation#

    确认

    在新起一个终端来确认目录/tmp/testnoisolation的信息

    admin01@ubuntu:~$ echo $$
    33414
    admin01@ubuntu:~$ ls -l /tmp/testnoisolation
    total 0
    -rw-r--r-- 1 root root 0 Sep 15 10:56 aaa
    -rw-r--r-- 1 root root 0 Sep 15 10:56 bbb
    -rw-r--r-- 1 root root 0 Sep 15 10:56 ccc
    -rw-r--r-- 1 root root 0 Sep 15 10:56 ddd
    admin01@ubuntu:~$

    有隔离的mount

    事前准备

    root@ubuntu:~# mkdir /tmp/testisolation

    使用unshare隔离mnt namespace

    虽然也可以使用Linux内核提供的系统函数写简单的程序来实现,但是多少有点喧宾夺主的感觉。linux已经提供了非常贴心的unshare命令,只需要下面一行语句我们就能重新启动一个bash的进程,而在其中的mnt namespace是被隔离的。

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~# unshare --mount /bin/bash
    root@ubuntu:~#

    好像没有任何变化,其实这个已经不是刚才我们的32968进程了,而是一个新的进程,通过确认$$就能确认

    root@ubuntu:~# echo $$
    33447
    root@ubuntu:~#

    再来确认一下,33447和32968两个进程的关系,我们能清楚地看到这是父子关系的两个进程,虽然都是bash

    admin01@ubuntu:~$ ps -ef |grep 32968 |grep -v grep
    root      32968  32967  0 10:16 pts/0    00:00:00 -su
    root      33447  32968  0 11:09 pts/0    00:00:00 /bin/bash
    admin01@ubuntu:~$ pstree 32968
    bashqqqbash
    admin01@ubuntu:~$

    mount tmpfs

    root@ubuntu:~# echo $$
    33447
    root@ubuntu:~# mount -t tmpfs tmpfs /tmp/testisolation
    root@ubuntu:~# cd /tmp/testisolation
    root@ubuntu:/tmp/testisolation#

    创建文件

    root@ubuntu:/tmp/testisolation# touch aaa bbb ccc ddd
    root@ubuntu:/tmp/testisolation# ll
    total 4
    drwxrwxrwt  2 root root  120 Sep 15 11:15 ./
    drwxrwxrwt 14 root root 4096 Sep 15 11:02 ../
    -rw-r--r--  1 root root    0 Sep 15 11:15 aaa
    -rw-r--r--  1 root root    0 Sep 15 11:15 bbb
    -rw-r--r--  1 root root    0 Sep 15 11:15 ccc
    -rw-r--r--  1 root root    0 Sep 15 11:15 ddd
    root@ubuntu:/tmp/testisolation#

    确认

    在新起一个终端来确认目录/tmp/testisolation的信息,没有任何信息。

    admin01@ubuntu:~$ ll /tmp/testisolation
    total 8
    drwxr-xr-x  2 root root 4096 Sep 15 11:02 ./
    drwxrwxrwt 14 root root 4096 Sep 15 11:02 ../
    admin01@ubuntu:~$

    新mnt Namespace编号

    /proc/$$/ns下面会列出当前的namespace信息,我们来看看一下这个使用unshare隔离了mnt namespace的信息

    root@ubuntu:~# ls -l /proc/33447/ns
    total 0
    lrwxrwxrwx 1 root root 0 Sep 15 11:25 cgroup -> cgroup:[4026531835]
    lrwxrwxrwx 1 root root 0 Sep 15 11:11 ipc -> ipc:[4026531839]
    lrwxrwxrwx 1 root root 0 Sep 15 11:11 mnt -> mnt:[4026532506]
    lrwxrwxrwx 1 root root 0 Sep 15 11:11 net -> net:[4026531957]
    lrwxrwxrwx 1 root root 0 Sep 15 11:11 pid -> pid:[4026531836]
    lrwxrwxrwx 1 root root 0 Sep 15 11:11 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Sep 15 11:11 uts -> uts:[4026531838]
    root@ubuntu:~#

    与之前进行比较,我们可以清晰地发现,除了mnt的namespace编号从4026531840变为4026532506之外,其余都没有改变。这也是使用unshare -m或者unshare –mnt所实现的隔离,创建了新的namespace。

    和chroot的比较

    在比较原始的chroot中,画地为牢之后,是无法挣脱其所指定的根的,虽然有效但是略显粗暴。而namespace则自由的多,起码可以自由的动作,当然不只是这一点区别,但是这一点是最为直观能看出来的

    root@ubuntu:/tmp/testisolation# pwd
    /tmp/testisolation
    root@ubuntu:/tmp/testisolation# cd ../testnoisolation/
    root@ubuntu:/tmp/testnoisolation# ll
    total 4
    drwxrwxrwt  2 root root  120 Sep 15 10:56 ./
    drwxrwxrwt 14 root root 4096 Sep 15 11:17 ../
    -rw-r--r--  1 root root    0 Sep 15 10:56 aaa
    -rw-r--r--  1 root root    0 Sep 15 10:56 bbb
    -rw-r--r--  1 root root    0 Sep 15 10:56 ccc
    -rw-r--r--  1 root root    0 Sep 15 10:56 ddd
    root@ubuntu:/tmp/testnoisolation#

    其他相关

    内容URL
    docker基础:从chroot理解namespace的隔离http://blog.csdn.net/liumiaocn/article/details/52388793
    在CentOS7上使用LXC管理容器http://blog.csdn.net/liumiaocn/article/details/52348219
    如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers)http://blog.csdn.net/liumiaocn/article/details/52337479
    展开全文
  • 记得看《深入Linux内核架构》时,里面有讲到关于命名空间的概念,但是现在却基本上弯光了,唉。所以今天特意自己翻看一下内核4.2代码,整理一下命名空间中关于pid管理的部分,等什么时候有空了,再去翻看那本著作吧...

    记得看《深入Linux内核架构》时,里面有讲到关于命名空间的概念,但是现在却基本上弯光了,唉。所以今天特意自己翻看一下内核4.2代码,整理一下命名空间中关于pid管理的部分,等什么时候有空了,再去翻看那本著作吧(写的比较乱〒_〒)。
    命名空间的概念网上有很多,关于pid管理的话,大致思想应该就是各个task_struct的pid在各自的命名空间里面是唯一的,但是在全局不唯一。
    通过一个函数find_task_by_vpid(pid_t vnr),就可以知道一个pid怎么联系到自己命名空间里面的task_struct结构体:

    参数pid_t定义为(其实就是int):

    27 typedef int             __kernel_pid_t;
    21 typedef __kernel_pid_t          pid_t;

    那么这个pid_t是放在哪的呢?

    1344 struct task_struct {
    ......
    1444         pid_t pid;
    ......
    1474         struct pid_link pids[PIDTYPE_MAX];
    ......
    }

    其中,struct pid_link是一个很重要的结构,定义为:

    69 struct pid_link
     70 {
     71         struct hlist_node node;
     72         struct pid *pid;
     73 };

    struct pid_link的结构体成员struct pid定义则为:

     57 struct pid
     58 {
     59         atomic_t count;
     60         unsigned int level;
     61         /* lists of tasks that use this pid */
     62         struct hlist_head tasks[PIDTYPE_MAX];
     63         struct rcu_head rcu;
     64         struct upid numbers[1];
     65 }

    该结构体成员struct upid定义为:

     50 struct upid {
     51         /* Try to keep pid_chain in the same cacheline as nr for find_vpid */
     52         int nr;
     53         struct pid_namespace *ns;
     54         struct hlist_node pid_chain;
     55 };

    struct upid包含了该task_struct所属的命名空间结构体struct pid_namespace。
    现在看看find_task_by_vpid具体实现:

    460 struct task_struct *find_task_by_vpid(pid_t vnr)
    461 {
    462         return find_task_by_pid_ns(vnr, task_active_pid_ns(current));
    463 }

    其中task_active_pid_ns(current)是找到当前进程所属的命名空间:

    546 struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)
    547 {
    548         return ns_of_pid(task_pid(tsk));
    549 }
    /*调用的函数*/
    1833 static inline struct pid *task_pid(struct task_struct *task)
    1834 {
    1835         return task->pids[PIDTYPE_PID].pid;
    1836 }
    134 static inline struct pid_namespace *ns_of_pid(struct pid *pid)
    135 {
    136         struct pid_namespace *ns = NULL;
    137         if (pid)
    138                 ns = pid->numbers[pid->level].ns;
    139         return ns;
    140 }

    从上面的函数可知:命名空间的结构体信息就放在task->pids[PIDTYPE_PID].pid->numbers[pid->level].ns。
    找到命名空间就调用函数find_task_by_pid_ns()在该命名空间里面查找该pid的值:

    452 struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns)
    453 {
    /*判读调用该函数时是否持有rcu_read_lock锁*/
    454         rcu_lockdep_assert(rcu_read_lock_held(),
    455                            "find_task_by_pid_ns() needs rcu_read_lock()"
    456                            " protection");
    457         return pid_task(find_pid_ns(nr, ns), PIDTYPE_PID);
    458 }
    /*调用函数*/
    /*该函数根据传入的nr值和ns值,找到其所属的struct pid*/
    366 struct pid *find_pid_ns(int nr, struct pid_namespace *ns)
    367 {
    368         struct upid *pnr;
    369 
    /*遍历pid_hash链表,找到一个struct upid,其nr为传入的pid值,ns为传入的命名空间*/
    370         hlist_for_each_entry_rcu(pnr,
    371                         &pid_hash[pid_hashfn(nr, ns)], pid_chain)
    372                 if (pnr->nr == nr && pnr->ns == ns)
    /*找到对应的struct upid后,因为它是在pid的numbers[ns->level]中,
    所以使用container_of宏可以找到所属的struct pid结构体*/
    373                         return container_of(pnr, struct pid,
    374                                         numbers[ns->level]);
    375 
    376         return NULL;
    377 }
    /*根据前面找到的strcut pid得到task_strcut结构体*/
    435 struct task_struct *pid_task(struct pid *pid, enum pid_type type)
    436 {
    437         struct task_struct *result = NULL;
    438         if (pid) {
    439                 struct hlist_node *first;
    /*取hash链表pid->tasks[type]的第一个元素*/
    /*这里有些疑惑,如果链表元素不止一个,那返回值不是不唯一了么???
    我个人觉得和当前进程的命名空间的struct pid的level有关,因为一个任务
    可以处于不同命名空间中,但是其命名空间结构体信息和nr值是不一样,但是任
    务的结构体信息是一样的,对于这些结构体,都放在pid->tasks[type]链表
    中,因为取任何一个task_struct都是符合要求的。感觉如果只取第一个元素
    的话,可以用别的task_struct先放在链表首部,实现暂时取代原来那个任务
    的作用,不知道是不是有这种做法。什么时候看书了,明白了,再来写吧。*/
    
    440                 first = rcu_dereference_check(hlist_first_rcu(&pid->tasks[type]),
    441                                               lockdep_tasklist_lock_is_held());
    /*这边可以娶到task_struct,是因为attch_pid函数将其挂上去的*/
    442                 if (first)
    443                         result = hlist_entry(first, struct task_struct, pids[(type)].node);
    444         }
    445         return result;
    446 }
    /*attach_pid函数如下*/
    389 void attach_pid(struct task_struct *task, enum pid_type type)
    390 {
    391         struct pid_link *link = &task->pids[type];
    392         hlist_add_head_rcu(&link->node, &link->pid->tasks[type]);
    393 }
    /*关于一个任务在不同的命名空间中都有对应的信息的代码片段如下*/
    297 struct pid *alloc_pid(struct pid_namespace *ns)
    {
    ......
    /从当前命名空间往父命名空间,循环分配nr和ns*/
    312         for (i = ns->level; i >= 0; i--) {
    313                 nr = alloc_pidmap(tmp);
    314                 if (IS_ERR_VALUE(nr)) {
    315                         retval = nr;
    316                         goto out_free;
    317                 }
    318 
    319                 pid->numbers[i].nr = nr;
    320                 pid->numbers[i].ns = tmp;
    321                 tmp = tmp->parent;
    322         }
    ......
    /*这里把upid加入hash链表pid_hash[]*/
    338         for ( ; upid >= pid->numbers; --upid) {
    339                 hlist_add_head_rcu(&upid->pid_chain,
    340                                 &pid_hash[pid_hashfn(upid->nr, upid->ns)]);
    341                 upid->ns->nr_hashed++;
    342         
    }
    ......
    }

    一些结构示意图(摘自《深入Linux内核架构》):
    这里写图片描述
    这里写图片描述

    展开全文
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...

    作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。
    在本文中我们将会使用unshare命令来演示Linux内核的user Namespace是如何动作的。

    Namespace的历史

    Namespace并不是Linux才推出的东西,早在很久之前,Unix上就有类似的东西,而HPUX和Solaris商用的Conatiner更是以前就有推出。而在Linux的2.6之后的版本Namespace就逐步的被加了进来。

    Linux Namespace的6大类型

    项番类型功能说明
    No.1MNT Namespace提供磁盘挂载点和文件系统的隔离能力
    No.2IPC Namespace提供进程间通信的隔离能力
    No.3Net Namespace提供网络隔离能力
    No.4UTS Namespace提供主机名隔离能力
    No.5PID Namespace提供进程隔离能力
    No.6User Namespace提供用户隔离能力

    Ubuntu版本

    root@ubuntu:~# uname -a
    Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    root@ubuntu:~#

    事前确认

    确认当前进程PID

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~#

    确认当前进程的各个namespace

    root@ubuntu:~# ls -l /proc/$$/ns
    total 0
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 cgroup -> cgroup:[4026531835]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 ipc -> ipc:[4026531839]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 mnt -> mnt:[4026531840]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 net -> net:[4026531957]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 pid -> pid:[4026531836]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 uts -> uts:[4026531838]
    root@ubuntu:~#

    内容说明

    项番内容说明
    No.1linux会在/proc下创建所对应的进程相关的信息,ns则为Namespace的信息
    No.2$$为当前进程PID,/proc/$$/ns下的Namespace的个数回随着Linux内核的高低不同显示的个数不同,因为Linux所支持的Namespace不是一次到位的
    No.3user:[4026531837],不同的Namespace都有不同的编号,比如32968的user的namespace的编号就是4026531837
    No.4关于Cgroup会单独在后面进行说明

    事前确认

    确认当前进程PID

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~#

    使用unshare隔离user namespace

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~# unshare --user /bin/bash
    nobody@ubuntu:~$

    user的namespace的隔离倒是非常清晰,而且进程号也发生了变化

    nobody@ubuntu:~$ echo $$
    34626
    nobody@ubuntu:~$

    缺省的会映射到65534的用户名,可以通过做user mapping作进一步的设定,这里不再赘述。

    nobody@ubuntu:~$ id
    uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
    nobody@ubuntu:~$

    新user Namespace编号

    nobody@ubuntu:~ echo 34626nobody@ubuntu:  ls -l /proc/$$/ns
    total 0
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 cgroup -> cgroup:[4026531835]
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 ipc -> ipc:[4026531839]
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 mnt -> mnt:[4026531840]
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 net -> net:[4026531957]
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 pid -> pid:[4026531836]
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 user -> user:[4026532506]
    lrwxrwxrwx 1 nobody nogroup 0 Sep 15 16:02 uts -> uts:[4026531838]
    nobody@ubuntu:~$

    其他相关

    内容URL
    在CentOS7上使用LXC管理容器http://blog.csdn.net/liumiaocn/article/details/52348219
    如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers)http://blog.csdn.net/liumiaocn/article/details/52337479
    展开全文
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...

    作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。
    在本文中我们将会使用unshare命令来演示Linux内核的uts Namespace是如何动作的。

    Namespace的历史

    Namespace并不是Linux才推出的东西,早在很久之前,Unix上就有类似的东西,而HPUX和Solaris商用的Conatiner更是以前就有推出。而在Linux的2.6之后的版本Namespace就逐步的被加了进来。

    Linux Namespace的6大类型

    项番类型功能说明
    No.1MNT Namespace提供磁盘挂载点和文件系统的隔离能力
    No.2IPC Namespace提供进程间通信的隔离能力
    No.3Net Namespace提供网络隔离能力
    No.4UTS Namespace提供主机名隔离能力
    No.5PID Namespace提供进程隔离能力
    No.6User Namespace提供用户隔离能力

    Ubuntu版本

    root@ubuntu:~# uname -a
    Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    root@ubuntu:~#

    事前确认

    确认当前进程PID

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~#

    确认当前进程的各个namespace

    root@ubuntu:~# ls -l /proc/$$/ns
    total 0
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 cgroup -> cgroup:[4026531835]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 ipc -> ipc:[4026531839]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 mnt -> mnt:[4026531840]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 net -> net:[4026531957]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 pid -> pid:[4026531836]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Sep 15 10:23 uts -> uts:[4026531838]
    root@ubuntu:~#

    内容说明

    项番内容说明
    No.1linux会在/proc下创建所对应的进程相关的信息,ns则为Namespace的信息
    No.2$$为当前进程PID,/proc/$$/ns下的Namespace的个数回随着Linux内核的高低不同显示的个数不同,因为Linux所支持的Namespace不是一次到位的
    No.3uts:[4026531838],不同的Namespace都有不同的编号,比如32968的uts的namespace的编号就是4026531838
    No.4关于Cgroup会单独在后面进行说明

    事前确认

    确认到当前hostname

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~# hostname
    ubuntu
    root@ubuntu:~#

    使用unshare隔离uts namespace

    root@ubuntu:~# echo $$
    32968
    root@ubuntu:~# unshare --uts /bin/bash
    root@ubuntu:~#

    好像没有任何变化,其实这个已经不是刚才我们的32968进程了,而是一个新的进程,通过确认$$就能确认

    root@ubuntu:~# echo $$
    34046
    root@ubuntu:~#

    再来确认一下,34046和32968两个进程的关系,我们能清楚地看到这是父子关系的两个进程,虽然都是bash

    admin01@ubuntu:~$ ps -ef |grep 32968 |grep -v grep
    root      32968  32967  0 10:16 pts/0    00:00:00 -su
    root      34046  32968  0 14:20 pts/0    00:00:00 /bin/bash
    admin01@ubuntu:~$ pstree 32968
    bashqqqbash
    admin01@ubuntu:~$

    确认

    在被隔离了net namespace的bash中确认hostname

    root@ubuntu:~# echo $$
    34046
    root@ubuntu:~# hostname
    ubuntu
    root@ubuntu:~#

    修改hostname

    root@ubuntu:~# echo $$
    34046
    root@ubuntu:~# hostname liumiaocn
    root@ubuntu:~# hostname
    liumiaocn
    root@ubuntu:~#

    另起一个终端确认hostname是否被修改

    admin01@ubuntu:~$ echo $$
    33414
    admin01@ubuntu:~$ hostname
    ubuntu
    admin01@ubuntu:~$

    未被修改,所以hostname被修正的范围仅限于新做出的uts namespace中

    新uts Namespace编号

    /proc/$$/ns下面会列出当前的namespace信息,我们来看看一下这个使用unshare隔离了uts namespace的信息

    root@ubuntu:~# echo $$
    34046
    root@ubuntu:~# ll /proc/$$/ns
    total 0
    dr-x--x--x 2 root root 0 Sep 15 14:21 ./
    dr-xr-xr-x 9 root root 0 Sep 15 14:21 ../
    lrwxrwxrwx 1 root root 0 Sep 15 14:25 cgroup -> cgroup:[4026531835]
    lrwxrwxrwx 1 root root 0 Sep 15 14:21 ipc -> ipc:[4026531839]
    lrwxrwxrwx 1 root root 0 Sep 15 14:21 mnt -> mnt:[4026531840]
    lrwxrwxrwx 1 root root 0 Sep 15 14:21 net -> net:[4026531957]
    lrwxrwxrwx 1 root root 0 Sep 15 14:21 pid -> pid:[4026531836]
    lrwxrwxrwx 1 root root 0 Sep 15 14:21 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Sep 15 14:21 uts -> uts:[4026532506]
    root@ubuntu:~#

    与之前进行比较,我们可以清晰地发现,除了uts的namespace编号之外,其余都没有改变。

    其他相关

    内容URL
    在CentOS7上使用LXC管理容器http://blog.csdn.net/liumiaocn/article/details/52348219
    如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers)http://blog.csdn.net/liumiaocn/article/details/52337479
    展开全文
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,466
精华内容 22,186
关键字:

linux内核命名空间

linux 订阅