From f8d13bbc415c8cb4e88329eb2e180b1b4240f9d1 Mon Sep 17 00:00:00 2001 From: bazz2 Date: Wed, 28 Jan 2015 14:10:07 +0800 Subject: [PATCH] [gbk->utf-8]Linux Namespaces --- translated/tech/20141204 Linux Namespaces.md | 72 ++++++++++---------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/translated/tech/20141204 Linux Namespaces.md b/translated/tech/20141204 Linux Namespaces.md index aae091f29c..522131a50b 100644 --- a/translated/tech/20141204 Linux Namespaces.md +++ b/translated/tech/20141204 Linux Namespaces.md @@ -1,32 +1,32 @@ -Linux 命名空间 +Linux 鍛藉悕绌洪棿 ================================================================================ -### 背景 ### +### 鑳屾櫙 ### -从2.6.24版的内核开始,Linux 就支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要考虑太多底层的虚拟化技术。 +浠2.6.24鐗堢殑鍐呮牳寮濮嬶紝Linux 灏辨敮鎸6绉嶄笉鍚岀被鍨嬬殑鍛藉悕绌洪棿銆傚畠浠殑鍑虹幇锛屼娇鐢ㄦ埛鍒涘缓鐨勮繘绋嬭兘澶熶笌绯荤粺鍒嗙寰楁洿鍔犲交搴曪紝浠庤屼笉闇瑕佽冭檻澶搴曞眰鐨勮櫄鎷熷寲鎶鏈 -- **CLONE_NEWIPC**: 进程间通信(IPC)的命名空间,可以将 SystemV 的 IPC 和 POSIX 的消息队列独立出来。 -- **CLONE_NEWPID**: 进程 ID 的命名空间,进程 ID 独立,意思就是命名空间内的进程 ID 可能会与命名空间外的进程 ID 冲突,于是命名空间内的进程 ID 映射到命名空间外时会使用另外一个进程 ID。比如说,命名空间内 ID 为1的进程,在命名空间外就是指 init 进程。 -- **CLONE_NEWNET**: 网络命名空间,用于隔离网络资源(/proc/net、IP 地址、网卡、路由等)。后台进程可以运行在不同命名空间内的相同端口上,用户还可以虚拟出一块网卡。 -- **CLONE_NEWNS**: 挂载命名空间,进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高。 -- **CLONE_NEWUTS**: UTS 命名空间,主要目的是独立出主机名和网络信息服务(NIS)。 -- **CLONE_NEWUSER**: 用户命名空间,同进程 ID 一样,用户 ID 和组 ID 在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID。 +- **CLONE_NEWIPC**: 杩涚▼闂撮氫俊(IPC)鐨勫懡鍚嶇┖闂达紝鍙互灏 SystemV 鐨 IPC 鍜 POSIX 鐨勬秷鎭槦鍒楃嫭绔嬪嚭鏉ャ +- **CLONE_NEWPID**: 杩涚▼ ID 鐨勫懡鍚嶇┖闂达紝杩涚▼ ID 鐙珛锛屾剰鎬濆氨鏄懡鍚嶇┖闂村唴鐨勮繘绋 ID 鍙兘浼氫笌鍛藉悕绌洪棿澶栫殑杩涚▼ ID 鍐茬獊锛屼簬鏄懡鍚嶇┖闂村唴鐨勮繘绋 ID 鏄犲皠鍒板懡鍚嶇┖闂村鏃朵細浣跨敤鍙﹀涓涓繘绋 ID銆傛瘮濡傝锛屽懡鍚嶇┖闂村唴 ID 涓1鐨勮繘绋嬶紝鍦ㄥ懡鍚嶇┖闂村灏辨槸鎸 init 杩涚▼銆 +- **CLONE_NEWNET**: 缃戠粶鍛藉悕绌洪棿锛岀敤浜庨殧绂荤綉缁滆祫婧愶紙/proc/net銆両P 鍦板潃銆佺綉鍗°佽矾鐢辩瓑锛夈傚悗鍙拌繘绋嬪彲浠ヨ繍琛屽湪涓嶅悓鍛藉悕绌洪棿鍐呯殑鐩稿悓绔彛涓婏紝鐢ㄦ埛杩樺彲浠ヨ櫄鎷熷嚭涓鍧楃綉鍗° +- **CLONE_NEWNS**: 鎸傝浇鍛藉悕绌洪棿锛岃繘绋嬭繍琛屾椂鍙互灏嗘寕杞界偣涓庣郴缁熷垎绂伙紝浣跨敤杩欎釜鍔熻兘鏃讹紝鎴戜滑鍙互杈惧埌 chroot 鐨勫姛鑳斤紝鑰屽湪瀹夊叏鎬ф柟闈㈡瘮 chroot 鏇撮珮銆 +- **CLONE_NEWUTS**: UTS 鍛藉悕绌洪棿锛屼富瑕佺洰鐨勬槸鐙珛鍑轰富鏈哄悕鍜岀綉缁滀俊鎭湇鍔★紙NIS锛夈 +- **CLONE_NEWUSER**: 鐢ㄦ埛鍛藉悕绌洪棿锛屽悓杩涚▼ ID 涓鏍凤紝鐢ㄦ埛 ID 鍜岀粍 ID 鍦ㄥ懡鍚嶇┖闂村唴澶栨槸涓嶄竴鏍风殑锛屽苟涓斿湪涓嶅悓鍛藉悕绌洪棿鍐呭彲浠ュ瓨鍦ㄧ浉鍚岀殑 ID銆 -本文用 C 语言介绍上述概念,因为演示进程命名空间的时候需要用到 C 语言。下面的测试过程在 Debian 6 和 Debian 7 上执行。首先,在栈内分配一页内存空间,并将指针指向内存页的末尾。这里我们使用 **alloca()** 函数来分配内存,不要用 malloc() 函数,它会把内存分配在堆上。 +鏈枃鐢 C 璇█浠嬬粛涓婅堪姒傚康锛屽洜涓烘紨绀鸿繘绋嬪懡鍚嶇┖闂寸殑鏃跺欓渶瑕佺敤鍒 C 璇█銆備笅闈㈢殑娴嬭瘯杩囩▼鍦 Debian 6 鍜 Debian 7 涓婃墽琛屻傞鍏堬紝鍦ㄦ爤鍐呭垎閰嶄竴椤靛唴瀛樼┖闂达紝骞跺皢鎸囬拡鎸囧悜鍐呭瓨椤电殑鏈熬銆傝繖閲屾垜浠娇鐢 **alloca()** 鍑芥暟鏉ュ垎閰嶅唴瀛橈紝涓嶈鐢 malloc() 鍑芥暟锛屽畠浼氭妸鍐呭瓨鍒嗛厤鍦ㄥ爢涓娿 void *mem = alloca(sysconf(_SC_PAGESIZE)) + sysconf(_SC_PAGESIZE); -然后使用 **clone()** 函数创建子进程,传入栈空间的地址 "mem",以及指定命名空间的标记。同时我们还指定“callee”作为子进程运行的函数。 +鐒跺悗浣跨敤 **clone()** 鍑芥暟鍒涘缓瀛愯繘绋嬶紝浼犲叆鏍堢┖闂寸殑鍦板潃 "mem"锛屼互鍙婃寚瀹氬懡鍚嶇┖闂寸殑鏍囪銆傚悓鏃舵垜浠繕鎸囧畾鈥渃allee鈥濅綔涓哄瓙杩涚▼杩愯鐨勫嚱鏁般 mypid = clone(callee, mem, SIGCHLD | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_FILES, NULL); -**clone** 之后我们要在父进程中等待子进程先退出,否则的话,父进程会继续运行下去,直到进程结束,留下子进程变成孤儿进程: +**clone** 涔嬪悗鎴戜滑瑕佸湪鐖惰繘绋嬩腑绛夊緟瀛愯繘绋嬪厛閫鍑猴紝鍚﹀垯鐨勮瘽锛岀埗杩涚▼浼氱户缁繍琛屼笅鍘伙紝鐩村埌杩涚▼缁撴潫锛岀暀涓嬪瓙杩涚▼鍙樻垚瀛ゅ効杩涚▼锛 while (waitpid(mypid, &r, 0) < 0 && errno == EINTR) { continue; } -最后当子进程退出后,我们会回到 shell 界面。 +鏈鍚庡綋瀛愯繘绋嬮鍑哄悗锛屾垜浠細鍥炲埌 shell 鐣岄潰銆 if (WIFEXITED(r)) { @@ -34,7 +34,7 @@ Linux } return EXIT_FAILURE; -上文介绍的 **callee** 函数功能如下: +涓婃枃浠嬬粛鐨 **callee** 鍑芥暟鍔熻兘濡備笅锛 static int callee() { @@ -47,7 +47,7 @@ Linux return ret; } -程序挂载 **/proc** 文件系统,设置用户 ID 和组 ID,值都为“u”,然后运行 **/bin/bash** 程序,[LXC][1] 是操作系统级的虚拟化工具,使用 cgroups 和命名空间来完成资源的分离。现在我们把所有代码放在一起,变量“u”的值设为65534,在 Debian 系统中,这是“nobody”和“nogroup”: +绋嬪簭鎸傝浇 **/proc** 鏂囦欢绯荤粺锛岃缃敤鎴 ID 鍜岀粍 ID锛屽奸兘涓衡渦鈥濓紝鐒跺悗杩愯 **/bin/bash** 绋嬪簭锛孾LXC][1] 鏄搷浣滅郴缁熺骇鐨勮櫄鎷熷寲宸ュ叿锛屼娇鐢 cgroups 鍜屽懡鍚嶇┖闂存潵瀹屾垚璧勬簮鐨勫垎绂汇傜幇鍦ㄦ垜浠妸鎵鏈変唬鐮佹斁鍦ㄤ竴璧凤紝鍙橀噺鈥渦鈥濈殑鍊艰涓65534锛屽湪 Debian 绯荤粺涓紝杩欐槸鈥渘obody鈥濆拰鈥渘ogroup鈥濓細 #define _GNU_SOURCE #include @@ -89,7 +89,7 @@ Linux return ret; } -执行以下命令来运行上面的代码: +鎵ц浠ヤ笅鍛戒护鏉ヨ繍琛屼笂闈㈢殑浠g爜锛 root@w:~/pen/tmp# gcc -O -o ns.c -Wall -Werror -ansi -c89 ns.c root@w:~/pen/tmp# ./ns @@ -101,18 +101,18 @@ Linux nobody 5 0.0 0.0 2784 1064 pts/1 R+ 21:21 0:00 ps auxw nobody@w:~/pen/tmp$ -注意上面的结果,UID 和 GID 被设置成 nobody 和 nogroup 了,特别是 ps 工具只输出两个进程,它们的 ID 分别是1和5(LCTT注:这就是上文介绍 CLONE_NEWPID 时提到的功能,在线程所在的命名空间内,进程 ID 可以为1,映射到命名空间外就是65534;而命名空间外的 ID 为1的进程一直是 init)。接下来轮到使用 ip netns 来设置网络的命名空间。第一步先确定当前系统没有命名空间: +娉ㄦ剰涓婇潰鐨勭粨鏋滐紝UID 鍜 GID 琚缃垚 nobody 鍜 nogroup 浜嗭紝鐗瑰埆鏄 ps 宸ュ叿鍙緭鍑轰袱涓繘绋嬶紝瀹冧滑鐨 ID 鍒嗗埆鏄1鍜5锛圠CTT娉細杩欏氨鏄笂鏂囦粙缁 CLONE_NEWPID 鏃舵彁鍒扮殑鍔熻兘锛屽湪绾跨▼鎵鍦ㄧ殑鍛藉悕绌洪棿鍐咃紝杩涚▼ ID 鍙互涓1锛屾槧灏勫埌鍛藉悕绌洪棿澶栧氨鏄65534锛涜屽懡鍚嶇┖闂村鐨 ID 涓1鐨勮繘绋嬩竴鐩存槸 init锛夈傛帴涓嬫潵杞埌浣跨敤 ip netns 鏉ヨ缃綉缁滅殑鍛藉悕绌洪棿銆傜涓姝ュ厛纭畾褰撳墠绯荤粺娌℃湁鍛藉悕绌洪棿锛 root@w:~# ip netns list Object "netns" is unknown, try "ip help". -这种情况下,你需要更新你的系统内核,以及 ip 工具。这里假设你的内核版高于2.6.24,ip 工具版本也差不多,高于2.6.24(LCTT注:ip 工具由 iproute 安装包提供,此安装包版本与内核版本相近)。更新好后,**ip netns list** 在没有命名空间存在的情况下不会输出任务信息。加个名为“ns1”的命名空间看看: +杩欑鎯呭喌涓嬶紝浣犻渶瑕佹洿鏂颁綘鐨勭郴缁熷唴鏍革紝浠ュ強 ip 宸ュ叿銆傝繖閲屽亣璁句綘鐨勫唴鏍哥増楂樹簬2.6.24锛宨p 宸ュ叿鐗堟湰涔熷樊涓嶅锛岄珮浜2.6.24锛圠CTT娉細ip 宸ュ叿鐢 iproute 瀹夎鍖呮彁渚涳紝姝ゅ畨瑁呭寘鐗堟湰涓庡唴鏍哥増鏈浉杩戯級銆傛洿鏂板ソ鍚庯紝**ip netns list** 鍦ㄦ病鏈夊懡鍚嶇┖闂村瓨鍦ㄧ殑鎯呭喌涓嬩笉浼氳緭鍑轰换鍔′俊鎭傚姞涓悕涓衡渘s1鈥濈殑鍛藉悕绌洪棿鐪嬬湅锛 root@w:~# ip netns add ns1 root@w:~# ip netns list ns1 -列出网卡: +鍒楀嚭缃戝崱锛 root@w:~# ip link list 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT @@ -120,7 +120,7 @@ Linux 2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 1000 link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff -创建新的虚拟网卡,加到命名空间。虚拟网卡需要成对创建,互相关联——想想交叉电缆吧: +鍒涘缓鏂扮殑铏氭嫙缃戝崱锛屽姞鍒板懡鍚嶇┖闂淬傝櫄鎷熺綉鍗¢渶瑕佹垚瀵瑰垱寤猴紝浜掔浉鍏宠仈鈥斺旀兂鎯充氦鍙夌數缂嗗惂锛 root@w:~# ip link add veth0 type veth peer name veth1 root@w:~# ip link list @@ -133,9 +133,9 @@ Linux 4: veth0: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether f2:f7:5e:e2:22:ac brd ff:ff:ff:ff:ff:ff -这个时候 **ifconfig** -a 命令也能显示新添加的 veth0 和 veth1 两块网卡。 +杩欎釜鏃跺 **ifconfig** -a 鍛戒护涔熻兘鏄剧ず鏂版坊鍔犵殑 veth0 鍜 veth1 涓ゅ潡缃戝崱銆 -很好,现在将这两份块网卡加到命名空间中去。注意一下,下面的 ip **netns exec** 命令用于将后面的命令在命名空间中执行(LCTT注:下面的结果显示了在 ns1 这个网络命名空间中,只存在 lo 和 veth1 两块网卡): +寰堝ソ锛岀幇鍦ㄥ皢杩欎袱浠藉潡缃戝崱鍔犲埌鍛藉悕绌洪棿涓幓銆傛敞鎰忎竴涓嬶紝涓嬮潰鐨 ip **netns exec** 鍛戒护鐢ㄤ簬灏嗗悗闈㈢殑鍛戒护鍦ㄥ懡鍚嶇┖闂翠腑鎵ц锛圠CTT娉細涓嬮潰鐨勭粨鏋滄樉绀轰簡鍦 ns1 杩欎釜缃戠粶鍛藉悕绌洪棿涓紝鍙瓨鍦 lo 鍜 veth1 涓ゅ潡缃戝崱锛夛細 root@w:~# ip link set veth1 netns ns1 root@w:~# ip netns exec ns1 ip link list @@ -144,21 +144,21 @@ Linux 3: veth1: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether d2:e9:52:18:19:ab brd ff:ff:ff:ff:ff:ff -这个时候 **ifconfig** -a 命令只能显示 veth0,不能显示 veth1,因为后者现在在 ns1 命名空间中。 +杩欎釜鏃跺 **ifconfig** -a 鍛戒护鍙兘鏄剧ず veth0锛屼笉鑳芥樉绀 veth1锛屽洜涓哄悗鑰呯幇鍦ㄥ湪 ns1 鍛藉悕绌洪棿涓 -如果想删除 veth1,可以执行下面的命令: +濡傛灉鎯冲垹闄 veth1锛屽彲浠ユ墽琛屼笅闈㈢殑鍛戒护锛 ip netns exec ns1 ip link del veth1 -为 veth0 分配 IP 地址: +涓 veth0 鍒嗛厤 IP 鍦板潃锛 ifconfig veth0 192.168.5.5/24 -在命名空间内为 veth1 分配 IP 地址: +鍦ㄥ懡鍚嶇┖闂村唴涓 veth1 鍒嗛厤 IP 鍦板潃锛 ip netns exec ns1 ifconfig veth1 192.168.5.10/24 up -在命名空间内外执行 ip addr **list** 命令: +鍦ㄥ懡鍚嶇┖闂村唴澶栨墽琛 ip addr **list** 鍛戒护锛 root@w:~# ip addr list 1: lo: mtu 65536 qdisc noqueue state UNKNOWN @@ -185,7 +185,7 @@ Linux inet6 fe80::10bd:b6ff:fe76:a6eb/64 scope link valid_lft forever preferred_lft forever -在命名空间内外查看路由表: +鍦ㄥ懡鍚嶇┖闂村唴澶栨煡鐪嬭矾鐢辫〃锛 root@w:~# ip route list default via 192.168.3.1 dev eth0 proto static @@ -194,7 +194,7 @@ Linux root@w:~# ip netns exec ns1 ip route list 192.168.5.0/24 dev veth1 proto kernel scope link src 192.168.5.10 -最后,将虚拟网卡连到物理网卡上,我们需要用到桥接。这里做的是将 veth0 桥接到 eth0,而 ns1 命名空间内则使用 DHCP 自动获取 IP 地址: +鏈鍚庯紝灏嗚櫄鎷熺綉鍗¤繛鍒扮墿鐞嗙綉鍗′笂锛屾垜浠渶瑕佺敤鍒版ˉ鎺ャ傝繖閲屽仛鐨勬槸灏 veth0 妗ユ帴鍒 eth0锛岃 ns1 鍛藉悕绌洪棿鍐呭垯浣跨敤 DHCP 鑷姩鑾峰彇 IP 鍦板潃锛 root@w:~# brctl addbr br0 root@w:~# brctl addif br0 eth0 @@ -209,7 +209,7 @@ Linux inet6 fe80::20c:29ff:fe65:259e/64 scope link valid_lft forever preferred_lft forever -为网桥 br0 分配的 IP 地址为192.168.3.122/24。接下来为命名空间分配地址: +涓虹綉妗 br0 鍒嗛厤鐨 IP 鍦板潃涓192.168.3.122/24銆傛帴涓嬫潵涓哄懡鍚嶇┖闂村垎閰嶅湴鍧锛 root@w:~# ip netns exec ns1 dhclient veth1 root@w:~# ip netns exec ns1 ip addr list @@ -221,17 +221,19 @@ Linux inet6 fe80::10bd:b6ff:fe76:a6eb/64 scope link valid_lft forever preferred_lft forever -现在, veth1 的 IP 被设置成 192.168.3.248/24 了。 +鐜板湪锛 veth1 鐨 IP 琚缃垚 192.168.3.248/24 浜嗐 -------------------------------------------------------------------------------- via: http://www.howtoforge.com/linux-namespaces -作者:[aziods][a] -译者:[bazz2](https://github.com/bazz2) -校对:[校对者ID](https://github.com/校对者ID) +浣滆咃細[aziods][a] +璇戣咃細[bazz2](https://github.com/bazz2) +鏍″锛歔鏍″鑰匢D](https://github.com/鏍″鑰匢D) -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出 +鏈枃鐢 [LCTT](https://github.com/LCTT/TranslateProject) 鍘熷垱缈昏瘧锛孾Linux涓浗](http://linux.cn/) 鑽h獕鎺ㄥ嚭 [a]:http://www.howtoforge.com/forums/private.php?do=newpm&u=138952 [1]:http://en.wikipedia.org/wiki/LXC + +