Linux namespace概述
操作系統(tǒng)通過虛擬內(nèi)存技術(shù),使得每個用戶進(jìn)程都認(rèn)為自己擁有所有的物理內(nèi)存,這是操作系統(tǒng)對內(nèi)存的虛擬化。操作系統(tǒng)通過分時調(diào)度系統(tǒng),每個進(jìn)程都能被【公平地】調(diào)度執(zhí)行,即每個進(jìn)程都能獲取到CPU,使得每個進(jìn)程都認(rèn)為自己在進(jìn)程活動期間擁有所有的CPU時間,這是操作系統(tǒng)對CPU的虛擬化。
從這兩種虛擬化方式可推知,當(dāng)使用某種虛擬化技術(shù)去管理進(jìn)程時,進(jìn)程會認(rèn)為自己擁有某種物理資源的全部。
虛擬內(nèi)存和分時系統(tǒng)均是對「物理資源」進(jìn)行虛擬化,其實操作系統(tǒng)中還有很多「非物理資源」,比如用戶權(quán)限系統(tǒng)資源、網(wǎng)絡(luò)協(xié)議棧資源、文件系統(tǒng)掛載路徑資源等。通過Linux的namespace功能,可以對這些非物理全局資源進(jìn)行虛擬化。
Linux namespace是在當(dāng)前運行的系統(tǒng)環(huán)境中創(chuàng)建(隔離)另一個進(jìn)程的運行環(huán)境出來,并在此運行環(huán)境中將一些必要的系統(tǒng)全局資源進(jìn)行【虛擬化】。進(jìn)程可以運行在指定的namespace中,因此,namespace中的每個進(jìn)程都認(rèn)為自己擁有所有這些虛擬化的全局資源。
目前,Linux已經(jīng)支持8種全局資源的虛擬化(每種資源都是隨著Linux內(nèi)核版本的迭代而逐漸加入的,因此有些內(nèi)核版本可能不具備某種namespace):
-
cgroup namespace:該namespace可單獨管理自己的cgroup
-
ipc namespace:該namespace有自己的IPC,比如共享內(nèi)存、信號量等
-
network namespace:該namespace有自己的網(wǎng)絡(luò)資源,包括網(wǎng)絡(luò)協(xié)議棧、網(wǎng)絡(luò)設(shè)備、路由表、防火墻、端口等
-
mount namespace:該namespace有自己的掛載信息,即擁有獨立的目錄層次
-
pid namespace:該namespace有自己的進(jìn)程號,使得namespace中的進(jìn)程PID單獨編號,比如可以PID=1
-
time namespace:該namespace有自己的啟動時間點信息和單調(diào)時間,比如可設(shè)置某個namespace的開機(jī)時間點為1年前啟動,再比如不同的namespace創(chuàng)建后可能流逝的時間不一樣
-
user namespace:該namespace有自己的用戶權(quán)限管理機(jī)制(比如獨立的UID/GID),使得namespace更安全
-
uts namespace:該namepsace有自己的主機(jī)信息,包括主機(jī)名(hostname)、NIS domain name
用戶可以同時創(chuàng)建具有多種資源類型的namespace,比如創(chuàng)建一個同時具有uts、pid和user的namespace。
理解Linux namespace
用戶可以創(chuàng)建指定類型的namespace并將程序放入該namespace中運行,這表示從當(dāng)前的系統(tǒng)運行環(huán)境中隔離一個進(jìn)程的運行環(huán)境,在此namespace中運行的進(jìn)程將認(rèn)為自己享有該namespace中的獨立資源。
實際上,即使用戶沒有手動創(chuàng)建Linux namespace,Linux系統(tǒng)開機(jī)后也會創(chuàng)建一個默認(rèn)的namespace,稱為「root namespace」,所有進(jìn)程默認(rèn)都運行在root namespace中,每個進(jìn)程都認(rèn)為自己擁有該namespace中的所有系統(tǒng)全局資源。
回顧一下Linux的開機(jī)啟動流程,內(nèi)核加載成功后將初始化系統(tǒng)運行環(huán)境,這個運行環(huán)境就是root namespace環(huán)境,系統(tǒng)運行環(huán)境初始化完成后,便可以認(rèn)為操作系統(tǒng)已經(jīng)開始工作了。
「每一個namespace都基于當(dāng)前內(nèi)核」,無論是默認(rèn)的root namespace還是用戶創(chuàng)建的每一個namespace,都基于當(dāng)前內(nèi)核工作。所以可以認(rèn)為namespace是內(nèi)核加載后啟動的一個特殊系統(tǒng)環(huán)境,用戶進(jìn)程可以在此環(huán)境中獨立享用資源。更嚴(yán)格地說,「root namespace直接基于內(nèi)核,而用戶創(chuàng)建的namespace運行環(huán)境基于當(dāng)前所在的namespace」。之所以用戶創(chuàng)建的namespace不直接基于內(nèi)核環(huán)境,是因為每一個namespace可能都會修改某些運行時內(nèi)核參數(shù)。
比如,用戶創(chuàng)建的uts namespace1中修改了主機(jī)名為ns1,然后在namespace1中創(chuàng)建uts namespace2時,namespace2默認(rèn)「將共享namespace1的其他資源并拷貝namespace1的主機(jī)名資源」,因此namespace2的主機(jī)名初始時也是ns1。當(dāng)然,namespace2是隔離的,可以修改其主機(jī)名為ns2,這不會影響其他namespace,修改后,將只有namespace2中的進(jìn)程能看到其主機(jī)名為ns2。
可以通過如下方式查看某個進(jìn)程運行在哪一個namespace中,即該進(jìn)程享有的獨立資源來自于哪一個namespace。
#?ls?-l?/proc/<PID>/ns $?ls?-l?/proc/$$/ns?|?awk?'{print?$1,$(NF-2),$(NF-1),$NF}' 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]$?sudo?ls?-l?/proc/1/ns?|?awk?'{print?$1,$(NF-2),$(NF-1),$NF}' 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]這些文件表示當(dāng)前進(jìn)程打開的namespace資源,每一個文件都是一個軟鏈接,所指向的文件是一串格式特殊的名稱。冒號后面中括號內(nèi)的數(shù)值表示該namespace的inode。如果不同進(jìn)程的namespace inode相同,說明這些進(jìn)程屬于同一個namespace。
從結(jié)果上來看,每個進(jìn)程都運行在多個namespace中,且pid=1和pid=$$(當(dāng)前Shell進(jìn)程)兩個進(jìn)程的namespace完全一樣,說明它們運行在相同的環(huán)境下(root namespace)
總結(jié)
以上是生活随笔為你收集整理的Linux namespace概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle的buffercache
- 下一篇: 沟通linux与windows的wine