版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
*LinuxNamespaces2知识目标了解命名空间基础了解命名空间的类型和工作机制了解网络命名空间的使用方法01能力目标掌握网络命名空间的使用命令了解命名空间实现机制能够说出命名空间的类型02学习目标3目录01LinuxNamespaces基础02LinuxNamespaces类型以及实现机制03LinuxNamespaces实现过程04网络命名空间常见命令401LinuxNamespaces基础LinuxNamespace是一种轻量级的虚拟化形式。操作系统在内存,CPU上,已经使用了虚拟化的技术,让每个进程都认为是自己独占了内存和CPU。但像存储、磁盘、信号等一些资源,操作系统并没有将其隔离开。namespace则是将这类资源也隔离开来。使得进程只能看到自己的资源视图。这个功能加上Cgroup,就可以实现一个轻量级的虚拟机(容器)。这对于提高主机资源利用率很有用。如果说KVM这类虚拟机是为了隔离,而容器技术更多是为了共享。LinuxNamespaces概念501LinuxNamespaces基础Linuxnamespace是Linux内核用来隔离内核资源的方式。通过namespace可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个namespace中。LinuxNamespaces实现目的601LinuxNamespaces基础相较于Unix系统中chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linuxnamespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等的隔离机制。LinuxNamespaces起源701LinuxNamespaces基础Linux在很早的版本中就实现了部分的namespace,比如内核2.4就实现了mountnamespace。大多数的namespace支持是在内核2.6中完成的,比如IPC、Network、PID、和UTS。还有个别的namespace比较特殊,比如User,从内核2.6就开始实现了,但在内核3.8中才宣布完成。同时,随着Linux自身的发展以及容器技术持续发展带来的需求,也会有新的namespace被支持,比如在内核4.6中就添加了Cgroupnamespace。LinuxNamespaces发展历程801LinuxNamespaces基础LinuxNamespaces提供一种全局系统资源的封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响。LinuxNamespaces总结9从Linux2.6.24版的内核开始,Linux就支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。02LinuxNamespaces类型以及实现机制10LinuxNamespaces机制提供一种资源隔离方案。PID、IPC、Network等系统资源不再是全局性的,而是属于某个特定的Namespace。每个namespace下的资源对于其他namespace下的资源都是透明,不可见的。02LinuxNamespaces类型以及实现机制LinuxNamespaces实现机制因此在操作系统层面上看,就会出现多个相同pid的进程。系统中可以同时存在两个进程号为0,1,2的进程,由于属于不同的namespace,所以它们之间并不冲突。而在用户层面上只能看到属于用户自己namespace下的资源,例如使用ps命令只能列出自己namespace下的进程。这样每个namespace看上去就像一个单独的Linux系统。11Linux提供了多个API用来操作namespace,它们是clone()、setns()和unshare()函数,主要是三个系统调用:clone()
–实现线程的系统调用,用来创建一个新的进程,并可以通过设计上述参数达到隔离。unshare()
–使某进程脱离某个namespace。setns()
–把某进程加入到某个namespace。02LinuxNamespaces类型以及实现机制12
为了确定隔离的到底是哪项namespace,在使用这些API时,通常需要指定一些调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS和CLONE_NEWCGROUP。02LinuxNamespaces类型以及实现机制CLONE_NEWIPC进程间通信(IPC)的命名空间,可以将SystemV的IPC和POSIX的消息队列独立出来CLONE_NEWNET网络命名空间,用于隔离网络资源(/proc/net、IP地址、网卡、路由等)CLONE_NEWNS挂载命名空间,进程运行时可以将挂载点与系统分离CLONE_NEWPID进程命名空间。空间内的PID独立分配CLONE_NEWUSER用户命名空间,同进程ID一样,用户ID和组ID在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的IDCLONE_NEWUTSUTS命名空间,主要目的是独立出主机名和网络信息服务(NIS)13对于内核来说,进程是由task_struct结构体来控制。所以Namespace肯定会和task_struct有关联。在task_struct中,定义了一个nsproxy的结构体指针,nsproxy则是定义namespace的结构体。02LinuxNamespaces类型以及实现机制Linux内核中namespace的结构体structnsproxy{atomic_tcount;structuts_namespace*uts_ns;structipc_namespace*ipc_ns;structmnt_namespace*mnt_ns;structpid_namespace*pid_ns;<strong>struct</strong>user_namespace*user_ns;structnet*net_ns;};14
'count'是task引用namspace的计数,这是通过nsproxy指向的计数。*nsproxy被共用所有namespace的tasks所共享。只要一个namespace被clone或者被使用,那么nsproxy就会被copy。02LinuxNamespaces类型以及实现机制Linux内核中namespace的结构体(1)uts_namespace结构体主要是包含了运行内核的名称、版本、底层体系结构类型等信息。UTS是UNIXTimesharingSystem的简称。(2)ipc_namespace指向保存在structipc_namespace中的所有与进程间通信(IPC)有关的信息。(3)mnt_namespace指向的是已经装载的文件系统的视图,在structmnt_namespace中给出。(4)pid_ns_for_children指向有关进程ID的信息,由structpid_namespace提供。(5)user_ns这个在新的3.8内核中实现。(6)structnet_ns包含所有网络相关的命名空间参数。
如果要同时隔离多个namespace,可以使用|(按位或)组合这些参数。1503LinuxNamespaces实现过程LinuxNamespace:Mount
Mountnamespace为进程提供独立的文件系统视图。简单点说就是,mountnamespace用来隔离文件系统的挂载点,这样进程就只能看到自己的mountnamespace中的文件系统挂载点。
进程的mountnamespace中的挂载点信息可以在/proc/[pid]/mounts、/proc/[pid]/mountinfo和/proc/[pid]/mountstats这三个文件中找到。每个mountnamespace都有一份自己的挂载点列表。当我们使用clone函数并传入CLONE_NEWNS标志创建新的mountnamespace时,新mountnamespace中的挂载点其实是从调用者所在的mountnamespace中拷贝的。但是在新的mountnamespace创建之后,这两个mountnamespace及其挂载点就基本上没啥关系了(除了sharedsubtree的情况),两个mountnamespace是相互隔离的。1603LinuxNamespaces实现过程LinuxNamespace:PID
PIDnamespace用来隔离进程的PID空间,使得不同PIDnamespace里的进程PID可以重复且互不影响。PIDnamesapce对容器类应用特别重要,可以实现容器内进程的暂停/恢复等功能,还可以支持容器在跨主机的迁移前后保持内部进程的PID不发生变化。
Linux下的每个进程都有一个对应的/proc/PID目录,该目录包含了大量的有关当前进程的信息。对一个PIDnamespace而言,/proc目录只包含当前namespace和它所有子孙后代namespace里的进程的信息。PIDnamespace的嵌套:PIDnamespace可以嵌套,也就是说有父子关系,除了系统初始化时创建的根PIDnamespace之外,其它的PIDnamespace都有一个父PIDnamespace。一个PIDnamespace的父是指:通过clone或unshare方法创建PIDnamespace的进程所在的PIDnamespace。1703LinuxNamespaces实现过程LinuxNamespace:IPC
IPCnamespace用来隔离SystemVIPC对象和POSIXmessagequeues。其中SystemVIPC对象包含共享内存、信号量和消息队列。Linux系统中默认自带了操作IPC资源的命令行工具,如ipcmk、ipcs和ipcrm等。我们可以使用这些工具创建、查看和删除IPC资源。过程:1.启动子进程命名空间;2.在子进程命名空间中创建IPC通道;3.在子进程中再启动一个子进程,并查看IPC;4.子命名空间的子命名空间查看不到上一层命名空间中的IPC通信;
1803LinuxNamespaces实现过程LinuxNamespace:UTS
UTSnamespace用来隔离系统的hostname以及NISdomainname。UTS据称是UNIXTime-sharingSystem的缩写。
Linuxhostname是用来标识一台主机的,比如登录时的提示,在Shell的提示符上,都可以显示出来,这样的话,使用者可以知道自己用的是哪台机器。NISdomainname在一些大型的网络中,会有很多的Linux主机,如果能够有一部账号主控服务器来管理网络中所有主机的账号。当其他的主机有用户登入的需求时,才到这部主控服务器上面请求相关的账号、密码等用户信息,如此一来,如果想要增加、修改、删除用户数据,只要到这部主控服务器上面处理即可。在Linux平台上,一般通过NetworkInformationServices(NISServer)创建的域(domain)来实现相关的功能。而主机的NISdomainname就是加入NISdomain的主机显示的NISdomain的名称(类似windows平台上使用域控制器创建的域名)1903LinuxNamespaces实现过程LinuxNamespace:User
Usernamespace是Linux3.8新增的一种namespace,用于隔离安全相关的资源,包括userIDsandgroupIDs,keys,和capabilities。
同样一个用户的userID和groupID在不同的usernamespace中可以不一样(与PIDnanespace类似)。换句话说,一个用户可以在一个usernamespace中是普通用户,但在另一个usernamespace中是超级用户。Usernamespace可以嵌套(目前内核控制最多32层),除了系统默认的usernamespace外,所有的usernamespace都有一个父usernamespace,每个usernamespace都可以有零到多个子usernamespace。当在一个进程中调用unshare或者clone创建新的usernamespace时,当前进程原来所在的usernamespace为父usernamespace,新的usernamespace为子usernamespace。2003LinuxNamespaces实现过程LinuxNamespace:Network
Networknamespace在逻辑上是网络堆栈的一个副本,它有自己的路由、防火墙规则和网络设备。默认情况下,子进程继承其父进程的networknamespace。也就是说,如果不显式创建新的networknamespace,所有进程都从init进程继承相同的默认networknamespace。
每个新创建的networknamespace默认有一个本地环回接口lo,除此之外,所有的其他网络设备(物理/虚拟网络接口,网桥等)只能属于一个networknamespace。ipnetns命令用来管理networknamespace。
2104网络命名空间常见命令Linuxipnetns命令ipnetns命令用来管理networknamespace。它可以创建命名的networknamespace,然后通过名字来引用networknamespace,所以使用起来很方便。ipnetns命令格式如下:ip[OPTIONS]netns{COMMAND|help}可以通过help命令查看ipnetns所有操作的帮助信息:2204网络命名空间常见命令创建命名的networknamespaceipnetnsaddNAME命令创建一个命名的networknamespace:2304网络命名空间常见命令显示所有命名的networknamespace根据约定,命名的networknamespace是可以打开的/var/run/netns/目录下的一个对象。比如有一个名称为net1的networknamespace对象,则可以由打开/var/run/netns/net1对象产生的文件描
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁省大连市西岗区重点中学2025-2026学年第二学期第一次阶段性考试初三语文试题含解析
- 项目研发高效承诺书范文9篇
- 能源使用与优化管理指南
- 企业售后服务流程标准化手册
- 履行岗位职责承诺责任书3篇范文
- 客户服务满意保证承诺书(3篇)
- 质量管理体系认证实施全面指导手册
- 企业团队建设活动策划实施模板
- 企业安全管理员安全防范与紧急处置指导书
- 供应商评价及合作策略管理工具
- 2026清醒的一代:Z世代主动定义的人生研究报告-
- 2026届北京市朝阳区高三上学期期末质量检测历史试题(含答案)
- 水泥生产线设备维护检修计划
- 发生食品安全事件后保障供餐的应急管理措施制度
- (正式版)DB44∕T 2786-2025 《旅居养老服务规范》
- 2026年安顺职业技术学院单招职业技能测试题库附答案
- 护理操作:静脉输液技巧
- DB37∕T 4855-2025 海洋污染物毒性分析用 模式鱼种 海水青鳉世代培育技术规范
- 银行长岗位面试问题集
- 合并经营协议书
- 2026年调解员岗位高频面试题
评论
0/150
提交评论