位置: 编程技术 - 正文

详解Linux中的命名空间 (linux命令的含义)

编辑:rootadmin

推荐整理分享详解Linux中的命名空间 (linux命令的含义),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux命名命令,linux常用命名,linux命令叫什么,linux的命名规则,linux的命名规则,linux常见命名,linux命名命令,linux中的命令及含义,内容如对您有帮助,希望把文章链接给更多的朋友!

背景

从Linux 2.6.版的内核开始,Linux 就支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。

CLONE_NEWIPC: 进程间通信(IPC)的命名空间,可以将 SystemV 的 IPC 和 POSIX 的消息队列独立出来。 CLONE_NEWPID: 进程命名空间。空间内的PID 是独立分配的,意思就是命名空间内的虚拟 PID 可能会与命名空间外的 PID 相冲突,于是命名空间内的 PID 映射到命名空间外时会使用另外一个 PID。比如说,命名空间内第一个 PID 为1,而在命名空间外就是该 PID 已被 init 进程所使用。 CLONE_NEWNET: 网络命名空间,用于隔离网络资源(/proc/net、IP 地址、网卡、路由等)。后台进程可以运行在不同命名空间内的相同端口上,用户还可以虚拟出一块网卡。 CLONE_NEWNS: 挂载命名空间,进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高。 CLONE_NEWUTS: UTS 命名空间,主要目的是独立出主机名和网络信息服务(NIS)。 CLONE_NEWUSER: 用户命名空间,同进程 ID 一样,用户 ID 和组 ID 在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID。

下面我们介绍一下进程命名空间和网络命名空间。进程命名空间

本文用 C 语言介绍上述概念,因为演示进程命名空间的时候需要用到 C 语言。下面的测试过程在 Debian 6 和 Debian 7 上执行。首先,在栈内分配一页内存空间,并将指针指向内存页的末尾。这里我们使用 alloca() 函数来分配内存,不要用 malloc() 函数,它会把内存分配在堆上。

复制代码代码如下: void *mem = alloca(sysconf(_SC_PAGESIZE)) + sysconf(_SC_PAGESIZE);

然后使用 clone() 函数创建子进程,传入我们的子栈空间地址 "mem",并指定命名空间的标记。同时我们还指定“callee”作为子进程运行的函数。

复制代码代码如下:mypid = clone(callee, mem, SIGCHLD | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_FILES, NULL);

clone 之后我们要在父进程中等待子进程先退出,否则的话,父进程会继续运行下去,并马上进程结束,留下子进程变成孤儿进程:

复制代码代码如下:while (waitpid(mypid, &r, 0) < 0 && errno == EINTR) { continue; }

最后当子进程退出后,我们会回到 shell 界面,并返回子进程的退出码。

复制代码代码如下:if (WIFEXITED(r)) { return WEXITSTATUS(r); } return EXIT_FAILURE;

上文介绍的 callee 函数功能如下:

复制代码代码如下:static int callee() { int ret; mount("proc", "/proc", "proc", 0, ""); setgid(u); setgroups(0, NULL); setuid(u); ret = execl("/bin/bash", "/bin/bash", NULL); return ret; }

程序挂载了 /proc 文件系统,设置用户 ID 和组 ID,值都为“u”,然后运行 /bin/bash 程序,LXC 是一个操作系统级的虚拟化工具,使用 cgroups 和命名空间来完成资源的分离。现在我们把所有代码放在一起,变量“u”的值设为,在 Debian 系统中,这是“nobody”和“nogroup”:

复制代码代码如下:#define _GNU_SOURCE #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/mount.h> #include <grp.h> #include <alloca.h> #include <errno.h> #include <sched.h> static int callee(); const int u = ; int main(int argc, char *argv[]) { int r; pid_t mypid; void *mem = alloca(sysconf(_SC_PAGESIZE)) + sysconf(_SC_PAGESIZE); mypid = clone(callee, mem, SIGCHLD | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_FILES, NULL); while (waitpid(mypid, &r, 0) < 0 && errno == EINTR) { continue; } if (WIFEXITED(r)) { return WEXITSTATUS(r); } return EXIT_FAILURE; } static int callee() { int ret; mount("proc", "/proc", "proc", 0, ""); setgid(u); setgroups(0, NULL); setuid(u); ret = execl("/bin/bash", "/bin/bash", NULL); return ret; }

执行以下命令来运行上面的代码:

复制代码代码如下:root@w:~/pen/tmp# gcc -O -o ns.c -Wall -Werror -ansi -c ns.c root@w:~/pen/tmp# ./ns nobody@w:~/pen/tmp$ id uid=(nobody) gid=(nogroup) nobody@w:~/pen/tmp$ ps auxw USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND nobody 1 0.0 0.0 pts/1 S : 0: /bin/bash nobody 5 0.0 0.0 pts/1 R+ : 0: ps auxw nobody@w:~/pen/tmp$

注意上面的结果,UID 和 GID 被设置成 nobody 和 nogroup 了,特别是 ps 工具只输出两个进程,它们的 ID 分别是1和5(LCTT注:这就是上文介绍 CLONE_NEWPID 时提到的功能,在线程所在的命名空间内,进程 ID 可以为1,映射到命名空间外是另外一个 PID;而命名空间外的 ID 为1的进程一直是 init)。网络命名空间

接下来轮到使用 ip netns 来设置网络的命名空间。第一步先确定当前系统没有命名空间:

复制代码代码如下:root@w:~# ip netns list Object "netns" is unknown, try "ip help".

如果报了上述错误,你需要更新你的系统内核,以及 ip 工具程序。这里假设你的内核版高于2.6.,ip 工具版本也差不多,高于2.6.(LCTT注:ip 工具由 iproute 安装包提供,此安装包版本与内核版本相近)。更新好后,ip netns list 在没有命名空间存在的情况下不会输出任务信息。加个名为“ns1”的命名空间看看:

复制代码代码如下:root@w:~# ip netns add ns1 root@w:~# ip netns list ns1

详解Linux中的命名空间 (linux命令的含义)

列出网卡:

复制代码代码如下:root@w:~# ip link list 1: lo: mtu qdisc noqueue state UNKNOWN mode DEFAULT link/loopback ::::: brd ::::: 2: eth0: mtu qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen link/ether :0c::::9e brd ff:ff:ff:ff:ff:ff

创建新的虚拟网卡,并加到命名空间。虚拟网卡需要成对创建,互相关联——就像交叉电缆一样:

复制代码代码如下:root@w:~# ip link add veth0 type veth peer name veth1 root@w:~# ip link list 1: lo: mtu qdisc noqueue state UNKNOWN mode DEFAULT link/loopback ::::: brd ::::: 2: eth0: mtu qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen link/ether :0c::::9e brd ff:ff:ff:ff:ff:ff 3: veth1: mtu qdisc noop state DOWN mode DEFAULT qlen link/ether d2:e9::::ab brd ff:ff:ff:ff:ff:ff 4: veth0: mtu qdisc noop state DOWN mode DEFAULT qlen link/ether f2:f7:5e:e2::ac brd ff:ff:ff:ff:ff:ff

这个时候 ifconfig -a 命令也能显示新添加的 veth0 和 veth1 两块网卡。

很好,现在将这两份块网卡加到命名空间中去。注意一下,下面的 ip netns exec 命令用于将后面的命令在命名空间中执行(LCTT注:下面的结果显示了在 ns1 这个网络命名空间中,只存在 lo 和 veth1 两块网卡):

复制代码代码如下: root@w:~# ip link set veth1 netns ns1 root@w:~# ip netns exec ns1 ip link list 1: lo: mtu qdisc noop state DOWN mode DEFAULT link/loopback ::::: brd ::::: 3: veth1: mtu qdisc noop state DOWN mode DEFAULT qlen link/ether d2:e9::::ab brd ff:ff:ff:ff:ff:ff

这个时候 ifconfig -a 命令只能显示 veth0,不能显示 veth1,因为后者现在在 ns1 命名空间中。

如果想删除 veth0/veth1,可以执行下面的命令:

复制代码代码如下:ip netns exec ns1 ip link del veth1

我们可以为 veth0 分配 IP 地址:

复制代码代码如下: ifconfig veth0 ..5.5/

在命名空间内为 veth1 分配 IP 地址:

复制代码代码如下:ip netns exec ns1 ifconfig veth1 ..5./ up

在命名空间内外执行 ip addr list 命令:

复制代码代码如下:root@w:~# ip addr list 1: lo: mtu qdisc noqueue state UNKNOWN link/loopback ::::: brd ::::: inet .0.0.1/8 scope host lo inet6 ::1/ scope host valid_lft forever preferred_lft forever 2: eth0: mtu qdisc pfifo_fast state UNKNOWN qlen link/ether :0c::::9e brd ff:ff:ff:ff:ff:ff inet ..3./ brd ..3. scope global eth0 inet6 fe::c:ff:fe:e/ scope link valid_lft forever preferred_lft forever 6: veth0: mtu qdisc pfifo_fast state UP qlen link/ether :b2:c7:bd:c9: brd ff:ff:ff:ff:ff:ff inet ..5.5/ brd ..5. scope global veth0 inet6 fe::b2:c7ff:febd:c/ scope link valid_lft forever preferred_lft forever root@w:~# ip netns exec ns1 ip addr list 1: lo: mtu qdisc noop state DOWN link/loopback ::::: brd ::::: 5: veth1: mtu qdisc pfifo_fast state UP qlen link/ether :bd:b6::a6:eb brd ff:ff:ff:ff:ff:ff inet ..5./ brd ..5. scope global veth1 inet6 fe::bd:b6ff:fe:a6eb/ scope link valid_lft forever preferred_lft forever

在命名空间内外查看路由表:

复制代码代码如下:root@w:~# ip route list default via ..3.1 dev eth0 proto static ..3.0/ dev eth0 proto kernel scope link src ..3. ..5.0/ dev veth0 proto kernel scope link src ..5.5 root@w:~# ip netns exec ns1 ip route list ..5.0/ dev veth1 proto kernel scope link src ..5.

最后,将虚拟网卡连到物理网卡上,我们需要用到桥接。这里做的是将 veth0 桥接到 eth0,而 ns1 命名空间内则使用 DHCP 自动获取 IP 地址:

复制代码代码如下:root@w:~# brctl addbr br0 root@w:~# brctl addif br0 eth0 root@w:~# brctl addif br0 veth0 root@w:~# ifconfig eth0 0.0.0.0 root@w:~# ifconfig veth0 0.0.0.0 root@w:~# dhclient br0 root@w:~# ip addr list br0 7: br0: mtu qdisc noqueue state UP link/ether :0c::::9e brd ff:ff:ff:ff:ff:ff inet ..3./ brd ..3. scope global br0 inet6 fe::c:ff:fe:e/ scope link valid_lft forever preferred_lft forever

为网桥 br0 分配的 IP 地址为..3./。接下来为命名空间分配地址:

复制代码代码如下:root@w:~# ip netns exec ns1 dhclient veth1 root@w:~# ip netns exec ns1 ip addr list 1: lo: mtu qdisc noop state DOWN link/loopback ::::: brd ::::: 5: veth1: mtu qdisc pfifo_fast state UP qlen link/ether :bd:b6::a6:eb brd ff:ff:ff:ff:ff:ff inet ..3./ brd ..3. scope global veth1 inet6 fe::bd:b6ff:fe:a6eb/ scope link valid_lft forever preferred_lft forever

现在, veth1 的 IP 被设置成 ..3./ 了。

详解Linux中的"... is not in the sudoers file”错误问题 sudo是一个允许特定的用户组用另一个用户(典型的是root)的特权来运行一个命令。sudo有详细的日志功能,并且提供了对用户可通过sudo来运行哪些命令的

Linux分辨电脑是否有USB 3.0接口的命令行 由于USB3.0传输文件的速度快于USB2.0,所以现在很多电脑都配置了USB3.0接口,那么要怎么分辨自己的电脑是否有USB3.0接口呢?Linux系统只需一条命令就能检

Unix卸载gdb调试工具出现问题的解决方法 Unix系统通过命令能够卸载安装的程序,但有用户在用makeuninstall命令卸载gdb调试工具时出现了问题,卸载失败,下面小编就教大家Unix如何卸载gdb调试工

标签: linux命令的含义

本文链接地址:https://www.jiuchutong.com/biancheng/366183.html 转载请保留说明!

上一篇:在Ubuntu系统上安装KDE图形化界面的教程(ubuntu安装指南)

下一篇:详解Linux中的"... is not in the sudoers file”错误问题(linux %1)

  • 知道税负率和收入怎么算进项
  • 测绘费开票需备注吗
  • 什么样的个体需要纳税
  • 社保当月增员次月扣费
  • 个人独资企业可以投资有限公司吗
  • 所得税季报利润总额
  • 一般纳税人核定征收申请条件
  • 免抵退税的计算数据
  • 购买方退货的会计处理
  • 企业收到的政府补贴,怎么入账
  • 出口退税需要货代提供什么资料
  • 企业年金税前扣除标准表
  • 分公司的人员构成
  • 工程预付款需要监理审批吗
  • 个人建筑安装如何交税
  • 应交增值税计提表表格
  • 房租发票9%还是5%
  • 教育费附加减免性质代码
  • 分公司的发票可以由总公司开吗
  • 当月计提当月缴纳的增值税还用结转吗
  • 金蝶k3购货发票怎么点击记账
  • 收到专用发票的会计分录
  • 出口0税率是免抵退还是免税
  • 样品寄送时运费支付的对策
  • 没有原始凭证可以审计吗
  • 电脑开始菜单在右边怎么调回来
  • 新版edge浏览器设置背景图片
  • 股权转让协议的注意事项
  • 跨年冲减无发票怎么入账
  • 非经营业务
  • win7系统安装包多大
  • 永久性差异会计分录
  • 销售点的增值税计算公式
  • 小微企业应纳税所得额300万所得税
  • thinkphp怎么用
  • 增值税抵扣新政策
  • 什么是工资薪金所得
  • 餐饮业开具增值税专用发票
  • python jsdom
  • 小规模纳税人企业所得税2023
  • 怎么向银行申请贷款
  • 中药资源与开发跨专业考研
  • 金蝶财务软件库存商品数量金额再那查看
  • 银行开户有几种账户
  • 什么样的差旅费津贴可以税前扣除
  • 个人社保信息变更流程
  • 财务报告与财务思维
  • mysql查询时间段的交集数据
  • 企业所得税和个人所得税怎么算
  • 残疾人报税怎么报
  • 电子税务局是指什么意思
  • 接受投资的固定资产按什么入账
  • 企业预缴增值税税率
  • 进项税额不得从销项税额中抵扣项目是什么意思
  • 自产自用的产品增值税怎么算
  • 减免及返还增值税怎么算
  • 购买不良债权如何追偿
  • 公司赠送客户礼品怎么做账
  • 存货科目包括哪几类
  • 建账的要点及应注意的问题
  • sql server日期函数有哪些
  • 怎么去掉0前面的逗号
  • 升级win8.1 64位系统后无法玩剑灵怎么办?win8.1系统无法玩剑灵的解决方法
  • 巧用护手霜保养皮衣
  • ipad和iPhone的mac地址区别
  • 不会安装系统怎么安装
  • usrmlnka.exe - usrmlnka进程是什么意思
  • 使用标准用户帐号的方法
  • 命令行sudo无效
  • unity移动端教程
  • 删除rpm安装包
  • python中判断
  • javascript模块化规范
  • 安卓手机自定义ua
  • koa nodejs
  • arraylist100扩充几次
  • 扣缴义务人怎么改不过来呢
  • 安徽省渔业管理办法第十条规定
  • 个税扣款怎么查询
  • 广东省国家税务总局电子税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设