Linux namespace之:uts namespace
理解uts namespace
uts(UNIX Time-Sharing System) namespace可隔離hostname和NIS Domain name資源,使得一個(gè)宿主機(jī)可擁有多個(gè)主機(jī)名或Domain Name。換句話說,可讓不同namespace中的進(jìn)程看到不同的主機(jī)名。
例如,使用unshare命令(較新版本Linux內(nèi)核還支持nscreate命令)創(chuàng)建一個(gè)新的uts namespace:
#?-u或--uts表示創(chuàng)建一個(gè)uts?namespace #?這個(gè)namespace中運(yùn)行/bin/bash程序 $?hostname longshuai-vm??????#?當(dāng)前root?namespace的主機(jī)名為longshuai-vm $?sudo?unshare?-u?/bin/bash root@longshuai-vm:/home/longshuai#???#?進(jìn)入了新的namespace中的shell#?其主機(jī)名初始時(shí)也是longshuai-vm,#?其拷貝自上級namespace資源上面指定運(yùn)行的是/bin/bash程序,這會(huì)進(jìn)入交互式模式,當(dāng)執(zhí)行exit時(shí),bash退出,回到當(dāng)前的namespace中。也可以指定在namespace中運(yùn)行其他程序,例如unshare -u sleep 3表示在uts namespace中睡眠3秒后退出并回到當(dāng)前namespace。
因?yàn)槭莡ts namespace,所以可在此namespace中修改主機(jī)名:
#?修改該namespace的主機(jī)名為ns1 #?修改后會(huì)立即生效,但不會(huì)顯示在當(dāng)前Shell提示符下 #?需重新加載Shell環(huán)境 root@longshuai-vm:/home/longshuai#?hostname?ns1 root@longshuai-vm:/home/longshuai#?hostname ns1 root@longshuai-vm:/home/longshuai#?exec?$SHELL root@ns1:/home/longshuai#namespace中修改的主機(jī)名不會(huì)直接修改主機(jī)名配置文件(如/etc/hostname),而是修改內(nèi)核屬性/proc/sys/kernel/hostname:
root@ns1:/home/longshuai#?cat?/proc/sys/kernel/hostname ns1 root@ns1:/home/longshuai#?cat?/etc/hostname? longshuai-vm創(chuàng)建了新的namespace并在其中運(yùn)行/bin/bash進(jìn)程后,再去關(guān)注一下進(jìn)程關(guān)系:
#?ns1中的bash進(jìn)程PID root@ns1:/home/longshuai#?echo?$$ 14279#?bash進(jìn)程(PID=14279)和grep進(jìn)程運(yùn)行在ns1?namespace中, #?其父進(jìn)程sudo(PID=14278)運(yùn)行在ns1的上級namespace即root?namespace中 root@ns1:/home/longshuai#?pstree?-p?|?grep?$$|-sshd(10848)---bash(10850)---sudo(14278)---bash(14279)-+-grep(14506)#?運(yùn)行在ns1中當(dāng)前bash進(jìn)程(PID=14279)的namespace root@ns1:/home/longshuai#?ls?-l?/proc/14279/ns lrwxrwxrwx?...?cgroup?->?'cgroup:[4026531835]' lrwxrwxrwx?...?ipc?->?'ipc:[4026531839]' lrwxrwxrwx?...?mnt?->?'mnt:[4026531840]' lrwxrwxrwx?...?net?->?'net:[4026531992]' lrwxrwxrwx?...?pid?->?'pid:[4026531836]' lrwxrwxrwx?...?pid_for_children?->?'pid:[4026531836]' lrwxrwxrwx?...?user?->?'user:[4026531837]' lrwxrwxrwx?...?uts?->?'uts:[4026532588]'??#?注意這一行,和sudo進(jìn)程的uts?inode不同#?父進(jìn)程sudo(PID=14278)不在ns1中,它的namespace信息 root@ns1:/home/longshuai#?ls?-l?/proc/14278/ns lrwxrwxrwx?...?cgroup?->?'cgroup:[4026531835]' lrwxrwxrwx?...?ipc?->?'ipc:[4026531839]' lrwxrwxrwx?...?mnt?->?'mnt:[4026531840]' lrwxrwxrwx?...?net?->?'net:[4026531992]' lrwxrwxrwx?...?pid?->?'pid:[4026531836]' lrwxrwxrwx?...?pid_for_children?->?'pid:[4026531836]' lrwxrwxrwx?...?user?->?'user:[4026531837]' lrwxrwxrwx?...?uts?->?'uts:[4026531838]'???#?注意這一行,和PID=1的uts?inode相同回到創(chuàng)建uts namespace時(shí)敲下的unshare命令:
sudo?unshare?-u?/bin/bash從進(jìn)程關(guān)系...---sudo(14278)---bash(14279)可知兩個(gè)進(jìn)程PID是連續(xù)的,說明unshare程序?qū)?yīng)的進(jìn)程被/bin/bash程序通過execve()替換了。
詳細(xì)的過程如下:「sudo進(jìn)程運(yùn)行在當(dāng)前namespace中,它將fork一個(gè)新進(jìn)程來運(yùn)行unshare程序,unshare程序加載完成后,將創(chuàng)建一個(gè)新的uts namespace,unshare進(jìn)程自身將加入到這個(gè)uts namespace中,unshare進(jìn)程內(nèi)部再exec加載/bin/bash,于是unshare進(jìn)程被替換為/bin/bash進(jìn)程,/bin/bash進(jìn)程也將運(yùn)行在uts namespace中」。
當(dāng)namespace中的/bin/bash進(jìn)程退出,該namespace中將沒有任何進(jìn)程,該namespace將自動(dòng)銷毀。注意,在默認(rèn)情況下,namespace中必須要有至少一個(gè)進(jìn)程,否則將被自動(dòng)被銷毀。但也有一些手段可以讓namespace持久化,即使已經(jīng)沒有任何進(jìn)程在其中運(yùn)行。
如果在ns1中再創(chuàng)建一個(gè)namespace ns2,這個(gè)ns2初始時(shí)將共享ns1的其他資源并拷貝ns1的主機(jī)名資源,其初始主機(jī)名也為ns1。
$?sudo?unshare?-u?/bin/bash????#?在root?namespace環(huán)境下創(chuàng)建一個(gè)namespace root@longshuai-vm:/home/longshuai#?hostname?ns1?#?修改主機(jī)名為ns1 root@longshuai-vm:/home/longshuai#?hostname ns1#?在ns1中創(chuàng)建一個(gè)namespace ############?注意沒有sudo root@longshuai-vm:/home/longshuai#?unshare?-u?/bin/bash? root@ns1:/home/longshuai#?hostname????#?初始主機(jī)名拷貝自上級namespace的主機(jī)名ns1 ns1 root@ns1:/home/longshuai#?hostname?ns2 root@ns1:/home/longshuai#?hostname??#?修改主機(jī)名為ns2 ns2 root@ns1:/home/longshuai#?exit exitroot@longshuai-vm:/home/longshuai#?hostname??#?ns2修改主機(jī)名不影響ns1 ns1 root@longshuai-vm:/home/longshuai#?exit exit[~]->$?hostname??????#?ns1修改主機(jī)名不影響root?namespace longshuai-vm注意,即使root namespace當(dāng)前用戶為longshuai,但因?yàn)槭褂昧藄udo創(chuàng)建ns1,進(jìn)入ns1后其用戶名為root,所以在ns1中執(zhí)行unshare命令創(chuàng)建新的namespace不需要再使用sudo。
$?echo?$USER??????#?當(dāng)前root?namespace的用戶為longshuai longshuai$?sudo?unshare?-u?/bin/bash root@longshuai-vm:/home/longshuai#?echo?$USER??#?ns中的用戶名變?yōu)閞oot root root@longshuai-vm:/home/longshuai#?id;echo?$HOME;echo?~ uid=0(root)?gid=0(root)?groups=0(root) /root /root總結(jié)
以上是生活随笔為你收集整理的Linux namespace之:uts namespace的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 数据库误删除后的数据恢复操作
- 下一篇: 彻底卸载oracle