一,namespace是什么?

namespace 是 Linux 内核用来隔离内核资源的方式。
它是对全局系统资源的封装隔离,
处于不同 namespace 的进程拥有独立的全局系统资源,
改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,
对其他 namespace 中的进程没有影响
 
每个namespace下的资源对于其他namespace下的资源是透明的,不可见的。
从操作系统角度看,可以出现多个相同pid的进程,
由于它们属于不同的namespace,所以进程之间并不冲突。
从用户角度看,只能看到属于用户自己namespace下的资源,
例如:ps命令只能列出自己namespace下的进程。
 

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,namespace的用途?

当前linux内核中提供了7类namespace,分别用于:
 
Cgroup   :Cgroup 根目录 
IPC        :System V IPC/POSIX 消息队列 
Network :网络设备/协议栈/端口
Mount    :挂载点 
PID        :进程ID 
User      :用户和group ID 
UTS       :Hostname和NIS域名
 

三,查看一个进程所属的namespace

1,得到一个nginx进程的id
[root@blog ~]# ps auxfww | grep nginx:
root 491 0.0 0.0 71028 3368 ? Ss May18 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx
nginx 492 0.0 0.0 102496 7036 ? S May18 0:00 \_ nginx: worker process
nginx 493 0.0 0.0 102764 7496 ? S May18 0:00 \_ nginx: worker process
nginx 494 0.0 0.0 102496 5856 ? S May18 0:00 \_ nginx: worker process
我们选择492这个进程
 
2,查看492这个进程的namespace
[root@blog ~]# ls /proc/492/ns/
cgroup ipc mnt net pid pid_for_children user uts
 
3,这些namespace文件的类型是符号链接
[root@blog ns]# ll /proc/492/ns/
total 0
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 mnt -> 'mnt:[4026532277]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 net -> 'net:[4026531992]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 user -> 'user:[4026531837]'
lrwxrwxrwx 1 nginx nginx 0 Jun 15 13:32 uts -> 'uts:[4026531838]’
链接文件的内容的格式为 xxx:[inode number]。
 xxx 是 namespace 的类型,
inode number 用来标识一个 namespace,
 

四,查看一个进程的mnt namespace信息

1,mnt namespace的挂载点信息,记录在下面的3个文件中
[root@blog ns]# ll /proc/492/mount*
-r--r--r-- 1 nginx nginx 0 Jun 13 23:23 /proc/492/mountinfo
-r--r--r-- 1 nginx nginx 0 Jun 13 23:23 /proc/492/mounts
-r-------- 1 nginx nginx 0 Jun 13 23:23 /proc/492/mountstats
mnt namespace的作用:隔离mount point,
每个mnt namespace内的文件结构可以单独进行修改,互不影响
 
2,我们做一个试验验证mnt namespace:
先创建两个目录,下面各创建一个文件:
[root@localhost ~]# mkdir /root/hosta
[root@localhost ~]# touch /root/hosta/a.txt
[root@localhost ~]# mkdir /root/hostb
[root@localhost ~]# touch /root/hostb/b.txt 
查看当前的mnt目录:
[root@localhost ~]# ls /mnt
hgfs
新开启两个终端:
在终端a中进行如下操作:
创建新的mount namespace和uts namespace,并运行bash
[root@localhost ~]# unshare --mount --uts bash
修改主机名为hosta
[root@localhost ~]# hostname hosta && exec bash
查看当前进程中mnt和uts两个namespace的inode number
#$$:当前的进程id
[root@hosta ~]# readlink /proc/$$/ns/{mnt,uts}
mnt:[4026532774]
uts:[4026532775]
挂载hosta目录到mnt下
[root@hosta ~]# mount --bind hosta/ /mnt/
[root@hosta ~]# ls /mnt
a.txt
3,回到最早的localhost终端中查看:
[root@localhost ~]# ls /mnt
hgfs
/mnt目录下的内容没有变,说明localhost终端与 hosta终端的mount namespace是成功隔离的
 
在终端b中进行以下操作:
创建新的mount namespace和uts namespace,并运行bash
[root@localhost ~]# unshare --mount --uts bash
修改主机名为hostb
[root@localhost ~]# hostname hostb && exec bash
查看当前进程中mnt和uts两个namespace的inode number
#$$:当前的进程id
[root@hostb ~]# readlink /proc/$$/ns/{mnt,uts}
mnt:[4026532706]
uts:[4026532707]
挂载hostb目录到mnt下
[root@hostb ~]# mount --bind hostb/ /mnt/
[root@hostb ~]# ls /mnt
b.txt

五,测试pid namespace

#—fork:以unshare的子进程来启动bash
[root@localhost ~]# unshare --pid --uts --mount --fork bash
修改hostname,作为标识
[root@localhost ~]# hostname hosta && exec bash
[root@hosta ~]# echo $$
1
当前的进程id是1
#-p:显示pid
#-l: 显示长的行(不按COLUMNS这个环境变量去截取宽度)
[root@hosta ~]# pstree -pl
systemd(1)─┬─ModemManager(871)─┬─{ModemManager}(911)
│ └─{ModemManager}(924)
├─NetworkManager(867)─┬─dhclient(993)
│ ├─{NetworkManager}(915)
│ └─{NetworkManager}(925)
用pstree可以看到:pid为1的进程是systemd
这是因为这里的proc是unshare给带来的mount namespace的/proc
包括查看ns下的inode number也是如此,
[root@hosta ~]# readlink /proc/$$/ns/{pid,uts,mnt}
pid:[4026531836]
uts:[4026531838]
mnt:[4026531840]
需要重新挂载/proc
[root@hosta liuhongdi]# mount --types proc proc /proc/
[root@hosta liuhongdi]# pstree -pl
bash(1)───pstree(70)
说明:如果用unshare启动bash时,加 --mount-proc 参数,则不需要重新挂载/proc
 
再次查看ns下的inode number,也可以正确显示了
[root@hosta liuhongdi]# readlink /proc/$$/ns/{pid,uts,mnt}
pid:[4026532779]
uts:[4026532778]
mnt:[4026532777]
 

六,查看linux的版本:

[root@node1 ~]# more /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@node1 ~]# uname -r
4.18.0-147.el8.x86_64

linux(centos8):使用namespace做资源隔离的更多相关文章

  1. linux(centos8):使用cgroups做资源限制

    一,什么是cgroups? 1,cgroups是资源的控制组,它提供了一套机制用于控制一组特定进程对资源的使用.     cgroups绑定一个进程集合到一个或多个限制资源使用的子系统上. 2, cg ...

  2. Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案

    注:本文以hadoop-2.5.0-cdh5.3.2为例进行说明.   Hadoop Yarn的资源隔离是指为运行着不同任务的“Container”提供可独立使用的计算资源,以避免它们之间相互干扰.目 ...

  3. Hystrix系列-5-Hystrix的资源隔离策略

    转自:https://blog.csdn.net/liuchuanhong1/article/details/73718794 Hystrix的资源隔离策略有两种,分别为:线程池和信号量. 说到资源隔 ...

  4. 服务容错保护断路器Hystrix之八:Hystrix资源隔离策略

    在一个基于微服务的应用程序中,您通常需要调用多个微服务完成一个特定任务.不使用舱壁模式,这些调用默认是使用相同的线程来执行调用的,这些线程Java容器为处理所有请求预留的.在高服务器请求的情况下,一个 ...

  5. 利用yarn多队列实现hadoop资源隔离

    大数据处理离不开hadoop集群的部署和管理,对于本来硬件资源就不多的创业团队来说,做好资源的共享和隔离是很有必要的,毕竟不像BAT那么豪,那么怎么样能把有限的节点同时分享给多组用户使用而且互不影响呢 ...

  6. 资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统

    资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是资源隔离 资源隔离是指为不同任务提供可独立使用的计算资源以 ...

  7. Docker 容器资源隔离 namespace(十)

    目录 一.简介 Linux Namespace的6大类型 二.Mount Namespace 三.IPC Namespace 四.Network Namespace 五.UTS Namespace 六 ...

  8. docker容器技术基础之linux cgroup、namespace

    一.开头 接触过docker的同学多多少少听过这样一句话"docker容器通过linux namespace.cgroup特性实现资源的隔离与限制".今天我们来尝试学习一下这两个东 ...

  9. linux中的namespace

         本文将就namespace这个知识点,进行简单的归纳总结,力求通俗易通.在资料汇总的过程中,参考了许多网上的博客资料,在文章尾部给出相关链接.      namespace,命名空间,从名字 ...

随机推荐

  1. 基于Socket的编程

    2020/7/5 客户端步骤: 1.创建Socket. 根据指定服务端的IP地址或者端口号构造Socket类对象: Socket socket  =  new  Socket(InetAddress. ...

  2. vue简单案例_动态添加删除用户数据

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Nginx反代MogileFS集群

    上一篇博文我们主要聊了下分布式文件系统MogileFS的组件以及部署使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13677279.html:今天我们主要 ...

  4. LevelDb 101学习

    转自http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html LevelDb日知录之一:LevelDb 101 说起LevelDb也许 ...

  5. Linux 命令: sed

    sed -- sed 命令对于Linux系统来说,在命令行修改,操作文本是非常的方便. 特别是批量的修改某些字符等,是非常省时省力的,非常适合在自动化的脚本中去应用. 如下的几个小例子: 1)如何删除 ...

  6. 文档驱动 —— 表单组件(六):基于AntDV的Form表单的封装,目标还是不写代码

    开源代码 https://github.com/naturefwvue/nf-vue3-ant 也不知道大家是怎么写代码的,这里全当抛砖引玉 为何封装? AntDV非常强大,效果也非常漂亮,功能强大, ...

  7. GitBook 3.2.3入门

    简介 GitBook 是一个基于 Node.js 的命令行工具,可使用 GitHub / Git.Markdown.AsciiDoc来制作精美的电子书.GitBook 可以将文档作为静态网站或电子书( ...

  8. SpringBoot-03-JSR303数据校验和多环境切换

    3.3 JSR303数据校验 先看如何使用 ​ Springboot中可以用@Validated来校验数据,如果数据异常则统一抛出异常,方便异常中心统一处理. ​ 这里我们写个注解让name只支持Em ...

  9. GAN在seq2seq中的应用 Application to Sequence Generation

    Improving Supervised Seq-to-seq Model 有监督的 seq2seq ,比如机器翻译.聊天机器人.语音辨识之类的 . 而 generator 其实就是典型的 seq2s ...

  10. spring-boot-route(四)全局异常处理

    在开发中,我们经常会使用try/catch块来捕获异常进行处理,如果有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候我们可以使用全局异常处理.这样就不用在代码中写 ...