日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux Namespace系列(01):Namespace概述

發(fā)布時(shí)間:2025/1/21 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Namespace系列(01):Namespace概述 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Namespace是對(duì)全局系統(tǒng)資源的一種封裝隔離,使得處于不同namespace的進(jìn)程擁有獨(dú)立的全局系統(tǒng)資源,改變一個(gè)namespace中的系統(tǒng)資源只會(huì)影響當(dāng)前namespace里的進(jìn)程,對(duì)其他namespace中的進(jìn)程沒(méi)有影響。

下面的所有例子都在ubuntu-server-x86_64 16.04下執(zhí)行通過(guò)

Linux內(nèi)核支持的namespaces

目前,Linux內(nèi)核里面實(shí)現(xiàn)了7種不同類型的namespace。

名稱 宏定義 隔離內(nèi)容 Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6) IPC CLONE_NEWIPC System V IPC, POSIX message queues (since Linux 2.6.19) Network CLONE_NEWNET Network devices, stacks, ports, etc. (since Linux 2.6.24) Mount CLONE_NEWNS Mount points (since Linux 2.4.19) PID CLONE_NEWPID Process IDs (since Linux 2.6.24) User CLONE_NEWUSER User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) UTS CLONE_NEWUTS Hostname and NIS domain name (since Linux 2.6.19)

注意: 由于Cgroup namespace在4.6的內(nèi)核中才實(shí)現(xiàn),并且和cgroup v2關(guān)系密切,現(xiàn)在普及程度還不高,比如docker現(xiàn)在就還沒(méi)有用它,所以在namespace這個(gè)系列中不會(huì)介紹Cgroup namespace。

查看進(jìn)程所屬的namespaces

系統(tǒng)中的每個(gè)進(jìn)程都有/proc/[pid]/ns/這樣一個(gè)目錄,里面包含了這個(gè)進(jìn)程所屬namespace的信息,里面每個(gè)文件的描述符都可以用來(lái)作為setns函數(shù)(后面會(huì)介紹)的參數(shù)。

#查看當(dāng)前bash進(jìn)程所屬的namespace dev@ubuntu:~$ ls -l /proc/$$/ns total 0 lrwxrwxrwx 1 dev dev 0 7月 7 17:24 cgroup -> cgroup:[4026531835] #(since Linux 4.6) lrwxrwxrwx 1 dev dev 0 7月 7 17:24 ipc -> ipc:[4026531839] #(since Linux 3.0) lrwxrwxrwx 1 dev dev 0 7月 7 17:24 mnt -> mnt:[4026531840] #(since Linux 3.8) lrwxrwxrwx 1 dev dev 0 7月 7 17:24 net -> net:[4026531957] #(since Linux 3.0) lrwxrwxrwx 1 dev dev 0 7月 7 17:24 pid -> pid:[4026531836] #(since Linux 3.8) lrwxrwxrwx 1 dev dev 0 7月 7 17:24 user -> user:[4026531837] #(since Linux 3.8) lrwxrwxrwx 1 dev dev 0 7月 7 17:24 uts -> uts:[4026531838] #(since Linux 3.0)
  • 上面每種類型的namespace都是在不同的Linux版本被加入到/proc/[pid]/ns/目錄里去的,比如pid namespace是在Linux 3.8才被加入到/proc/[pid]/ns/里面,但這并不是說(shuō)到3.8才支持pid namespace,其實(shí)pid namespace在2.6.24的時(shí)候就已經(jīng)加入到內(nèi)核了,在那個(gè)時(shí)候就可以用pid namespace了,只是有了/proc/[pid]/ns/pid之后,使得操作pid namespace更方便了
  • 雖然說(shuō)cgroup是在Linux 4.6版本才被加入內(nèi)核,可是在Ubuntu 16.04上,盡管內(nèi)核版本才4.4,但也支持cgroup namespace,估計(jì)應(yīng)該是Ubuntu將4.6的cgroup namespace這部分代碼patch到了他們的4.4內(nèi)核上。
  • 以ipc:[4026531839]為例,ipc是namespace的類型,4026531839是inode number,如果兩個(gè)進(jìn)程的ipc namespace的inode number一樣,說(shuō)明他們屬于同一個(gè)namespace。這條規(guī)則對(duì)其他類型的namespace也同樣適用。
  • 從上面的輸出可以看出,對(duì)于每種類型的namespace,進(jìn)程都會(huì)與一個(gè)namespace ID關(guān)聯(lián)。

跟namespace相關(guān)的API

和namespace相關(guān)的函數(shù)只有三個(gè),這里簡(jiǎn)單的看一下,后面介紹UTS namespace的時(shí)候會(huì)有詳細(xì)的示例

clone: 創(chuàng)建一個(gè)新的進(jìn)程并把他放到新的namespace中

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);flags: 指定一個(gè)或者多個(gè)上面的CLONE_NEW*(當(dāng)然也可以包含跟namespace無(wú)關(guān)的flags), 這樣就會(huì)創(chuàng)建一個(gè)或多個(gè)新的不同類型的namespace, 并把新創(chuàng)建的子進(jìn)程加入新創(chuàng)建的這些namespace中。

setns: 將當(dāng)前進(jìn)程加入到已有的namespace中

int setns(int fd, int nstype);fd: 指向/proc/[pid]/ns/目錄里相應(yīng)namespace對(duì)應(yīng)的文件,表示要加入哪個(gè)namespacenstype:指定namespace的類型(上面的任意一個(gè)CLONE_NEW*):1. 如果當(dāng)前進(jìn)程不能根據(jù)fd得到它的類型,如fd由其他進(jìn)程創(chuàng)建,并通過(guò)UNIX domain socket傳給當(dāng)前進(jìn)程,那么就需要通過(guò)nstype來(lái)指定fd指向的namespace的類型2. 如果進(jìn)程能根據(jù)fd得到namespace類型,比如這個(gè)fd是由當(dāng)前進(jìn)程打開的,那么nstype設(shè)置為0即可

unshare: 使當(dāng)前進(jìn)程退出指定類型的namespace,并加入到新創(chuàng)建的namespace(相當(dāng)于創(chuàng)建并加入新的namespace)

int unshare(int flags);flags:指定一個(gè)或者多個(gè)上面的CLONE_NEW*,這樣當(dāng)前進(jìn)程就退出了當(dāng)前指定類型的namespace并加入到新創(chuàng)建的namespace

clone和unshare的區(qū)別

clone和unshare的功能都是創(chuàng)建并加入新的namespace, 他們的區(qū)別是:

  • unshare是使當(dāng)前進(jìn)程加入新的namespace
  • clone是創(chuàng)建一個(gè)新的子進(jìn)程,然后讓子進(jìn)程加入新的namespace,而當(dāng)前進(jìn)程保持不變

其它

當(dāng)一個(gè)namespace中的所有進(jìn)程都退出時(shí),該namespace將會(huì)被銷毀。當(dāng)然還有其他方法讓namespace一直存在,假設(shè)我們有一個(gè)進(jìn)程號(hào)為1000的進(jìn)程,以ipc namespace為例:

  • 通過(guò)mount --bind命令。例如mount --bind /proc/1000/ns/ipc /other/file,就算屬于這個(gè)ipc namespace的所有進(jìn)程都退出了,只要/other/file還在,這個(gè)ipc namespace就一直存在,其他進(jìn)程就可以利用/other/file,通過(guò)setns函數(shù)加入到這個(gè)namespace
  • 在其他namespace的進(jìn)程中打開/proc/1000/ns/ipc文件,并一直持有這個(gè)文件描述符不關(guān)閉,以后就可以用setns函數(shù)加入這個(gè)namespace。
  • 參考

    • https://segmentfault.com/a/1190000006908272
    • overview of Linux namespaces
    • Namespaces in operation, part 1: namespaces overview

    總結(jié)

    以上是生活随笔為你收集整理的Linux Namespace系列(01):Namespace概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。