丝袜人妻一区二区三区_少妇福利无码视频_亚洲理论片在线观看_一级毛片国产A级片

當(dāng)前位置:首頁 > 話題廣場 > 歷史專區(qū) > 明朝

#NAME?專題之Linux操作系統(tǒng)中的namespace是個什么鬼

第一次了解Docker后,筆者希望通過了解docker背后的技術(shù)原理來深入學(xué)習(xí)和使用docker。以下幾篇文章簡要介紹了Linux namespace的概念和基本用法。

namespace 的概念

namespace 是 linux 內(nèi)核用來隔離內(nèi)核資源的方式。通過 namespace 可以讓一些進程只能看到與自己相關(guān)的一部分資源,而另外一些進程也只能看到與它們自己相關(guān)的資源,這兩撥進程根本就感覺不到對方的存在。具體的實現(xiàn)方式是把一個或多個進程的相關(guān)資源指定在同一個 namespace 中。

Linux namespaces 是對全局系統(tǒng)資源的一種封裝隔離,使得處于不同 namespace 的進程擁有獨立的全局系統(tǒng)資源,改變一個 namespace 中的系統(tǒng)資源只會影響當(dāng)前 namespace 里的進程,對其他 namespace 中的進程沒有影響。

namespace 的用途

可能絕大多數(shù)的使用者和我一樣,是在使用 docker 后才開始了解 Linux 的 namespace 技術(shù)的。實際上,Linux 內(nèi)核實現(xiàn) namespace 的一個主要目的就是實現(xiàn)輕量級虛擬化(容器)服務(wù)。在同一個 namespace 下的進程可以感知彼此的變化,而對外界的進程一無所知。這樣就可以讓容器中的進程產(chǎn)生錯覺,認為自己置身于一個獨立的系統(tǒng)中,從而達到隔離的目的。也就是說 linux 內(nèi)核提供的 namespace 技術(shù)為 docker 等容器技術(shù)的出現(xiàn)和發(fā)展提供了基礎(chǔ)條件。

我們可以從 docker 實現(xiàn)者的角度考慮該如何實現(xiàn)一個資源隔離的容器。比如是不是可以通過 chroot 命令切換根目錄的掛載點,從而隔離文件系統(tǒng)。為了在分布式的環(huán)境下進行通信和定位,容器必須要有獨立的 IP、端口和路由等,這就需要對網(wǎng)絡(luò)進行隔離。同時容器還需要一個獨立的主機名以便在網(wǎng)絡(luò)中標(biāo)識自己。接下來還需要進程間的通信、用戶權(quán)限等的隔離。最后,運行在容器中的應(yīng)用需要有進程號(PID),自然也需要與宿主機中的 PID 進行隔離。也就是說這六種隔離能力是實現(xiàn)一個容器的基礎(chǔ),讓我們看看 linux 內(nèi)核的 namespace 特性為我們提供了什么樣的隔離能力:

上表中的前六種 namespace 正是實現(xiàn)容器必須的隔離技術(shù),至于新近提供的 Cgroup namespace 目前還沒有被 docker 采用。相信在不久的將來各種容器也會添加對 Cgroup namespace 的支持。

namespace 的發(fā)展歷史

Linux 在很早的版本中就實現(xiàn)了部分的 namespace,比如內(nèi)核 2.4 就實現(xiàn)了 mount namespace。大多數(shù)的 namespace 支持是在內(nèi)核 2.6 中完成的,比如 IPC、Network、PID、和 UTS。還有個別的 namespace 比較特殊,比如 User,從內(nèi)核 2.6 就開始實現(xiàn)了,但在內(nèi)核 3.8 中才宣布完成。同時,隨著 Linux 自身的發(fā)展以及容器技術(shù)持續(xù)發(fā)展帶來的需求,也會有新的 namespace 被支持,比如在內(nèi)核 4.6 中就添加了 Cgroup namespace。

Linux 提供了多個 API 用來操作 namespace,它們是 clone()、setns() 和 unshare() 函數(shù),為了確定隔離的到底是哪項 namespace,在使用這些 API 時,通常需要指定一些調(diào)用參數(shù):CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和 CLONE_NEWCGROUP。如果要同時隔離多個 namespace,可以使用 | (按位或)組合這些參數(shù)。同時我們還可以通過 /proc 下面的一些文件來操作 namespace。下面就讓讓我們看看這些接口的簡要用法。

查看進程所屬的 namespace

從版本號為 3.8 的內(nèi)核開始,/proc/[pid]/ns 目錄下會包含進程所屬的 namespace 信息,使用下面的命令可以查看當(dāng)前進程所屬的 namespace 信息:

$ ll /proc/$$/ns

首先,這些 namespace 文件都是鏈接文件。鏈接文件的內(nèi)容的格式為 xxx:[inode number]。其中的 xxx 為 namespace 的類型,inode number 則用來標(biāo)識一個 namespace,我們也可以把它理解為 namespace 的 ID。如果兩個進程的某個 namespace 文件指向同一個鏈接文件,說明其相關(guān)資源在同一個 namespace 中。

其次,在 /proc/[pid]/ns 里放置這些鏈接文件的另外一個作用是,一旦這些鏈接文件被打開,只要打開的文件描述符(fd)存在,那么就算該 namespace 下的所有進程都已結(jié)束,這個 namespace 也會一直存在,后續(xù)的進程還可以再加入進來。

除了打開文件的方式,我們還可以通過文件掛載的方式阻止 namespace 被刪除。比如我們可以把當(dāng)前進程中的 uts 掛載到 ~/uts 文件:

$ touch ~/uts $ sudo mount --bind /proc/$$/ns/uts ~/uts

使用 stat 命令檢查下結(jié)果:

很神奇吧,~/uts 的 inode 和鏈接文件中的 inode number 是一樣的,它們是同一個文件。

clone() 函數(shù)

我們可以通過 clone() 在創(chuàng)建新進程的同時創(chuàng)建 namespace。clone() 在 C 語言庫中的聲明如下:

/* Prototype for the glibc wrapper function */ #define _GNU_SOURCE #include <; int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

實際上,clone() 是在 C 語言庫中定義的一個封裝(wrapper)函數(shù),它負責(zé)建立新進程的堆棧并且調(diào)用對編程者隱藏的 clone() 系統(tǒng)調(diào)用。Clone() 其實是 linux 系統(tǒng)調(diào)用 fork() 的一種更通用的實現(xiàn)方式,它可以通過 flags 來控制使用多少功能。一共有 20 多種 CLONE_ 開頭的 falg(標(biāo)志位) 參數(shù)用來控制 clone 進程的方方面面(比如是否與父進程共享虛擬內(nèi)存等),下面我們只介紹與 namespace 相關(guān)的 4 個參數(shù):

  • fn:指定一個由新進程執(zhí)行的函數(shù)。當(dāng)這個函數(shù)返回時,子進程終止。該函數(shù)返回一個整數(shù),表示子進程的退出代碼。
  • child_stack:傳入子進程使用的棧空間,也就是把用戶態(tài)堆棧指針賦給子進程的 esp 寄存器。調(diào)用進程(指調(diào)用 clone() 的進程)應(yīng)該總是為子進程分配新的堆棧。
  • flags:表示使用哪些 CLONE_ 開頭的標(biāo)志位,與 namespace 相關(guān)的有CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和 CLONE_NEWCGROUP。
  • arg:指向傳遞給 fn() 函數(shù)的參數(shù)。

在后續(xù)的文章中,我們主要通過 clone() 函數(shù)來創(chuàng)建并演示各種類型的 namespace。

setns() 函數(shù)

通過 setns() 函數(shù)可以將當(dāng)前進程加入到已有的 namespace 中。setns() 在 C 語言庫中的聲明如下:

#define _GNU_SOURCE #include <; int setns(int fd, int nstype);

和 clone() 函數(shù)一樣,C 語言庫中的 setns() 函數(shù)也是對 setns() 系統(tǒng)調(diào)用的封裝:

  • fd:表示要加入 namespace 的文件描述符。它是一個指向 /proc/[pid]/ns 目錄中文件的文件描述符,可以通過直接打開該目錄下的鏈接文件或者打開一個掛載了該目錄下鏈接文件的文件得到。
  • nstype:參數(shù) nstype 讓調(diào)用者可以檢查 fd 指向的 namespace 類型是否符合實際要求。若把該參數(shù)設(shè)置為 0 表示不檢查。

前面我們提到:可以通過掛載的方式把 namespace 保留下來。保留 namespace 的目的是為以后把進程加入這個 namespace 做準(zhǔn)備。在 docker 中,使用 docker exec 命令在已經(jīng)運行著的容器中執(zhí)行新的命令就需要用到 setns() 函數(shù)。為了把新加入的 namespace 利用起來,還需要引入 execve() 系列的函數(shù)(筆者在 《Linux 創(chuàng)建子進程執(zhí)行任務(wù)》一文中介紹過 execve() 系列的函數(shù),有興趣的同學(xué)可以前往了解),該函數(shù)可以執(zhí)行用戶的命令,比較常見的用法是調(diào)用 /bin/bash 并接受參數(shù)運行起一個 shell。

unshare() 函數(shù) 和 unshare 命令

通過 unshare 函數(shù)可以在原進程上進行 namespace 隔離。也就是創(chuàng)建并加入新的 namespace 。unshare() 在 C 語言庫中的聲明如下:

#define _GNU_SOURCE #include <; int unshare(int flags);

和前面兩個函數(shù)一樣,C 語言庫中的 unshare() 函數(shù)也是對 unshare() 系統(tǒng)調(diào)用的封裝。調(diào)用 unshare() 的主要作用就是:不啟動新的進程就可以起到資源隔離的效果,相當(dāng)于跳出原先的 namespace 進行操作。

系統(tǒng)還默認提供了一個叫 unshare 的命令,其實就是在調(diào)用 unshare() 系統(tǒng)調(diào)用。下面的 demo 使用 unshare 命令把當(dāng)前進程的 user namespace 設(shè)置成了 root:

總結(jié)

namespace 是 linux 內(nèi)核提供的特性,為虛擬化而生。隨著 docker 的誕生引爆了容器技術(shù),也把長期在后臺默默奉獻的 namespace 技術(shù)推到了大家的面前。筆者試圖通過對 namespace 技術(shù)的學(xué)習(xí)和理解來加深對容器技術(shù)的認識,所以接下來會通過文章記錄學(xué)習(xí) namespace 的點點滴滴,希望能和同學(xué)們一起進步。

本文作者: sparkdev 原文地址:

1.《#NAME?專題之Linux操作系統(tǒng)中的namespace是個什么鬼》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《#NAME?專題之Linux操作系統(tǒng)中的namespace是個什么鬼》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/lishi/2043199.html

上一篇

【12星座誰最會穿越到明朝】專題淺談十二星座之天蝎座!以及庚子年天蝎座大概運勢!

下一篇

1595年明朝皇帝專題之明朝主要史書匯總(簡介)

【#NAME?】專題VLOOKUP又失靈?避免這四種錯誤類型

  • 【#NAME?】專題VLOOKUP又失靈?避免這四種錯誤類型
  • 【#NAME?】專題VLOOKUP又失靈?避免這四種錯誤類型
  • 【#NAME?】專題VLOOKUP又失靈?避免這四種錯誤類型
#NAME?專題之Excel提示“NAME?”錯誤信息 Excel提示錯誤信息的解決方法

#NAME?專題之Excel提示“NAME?”錯誤信息 Excel提示錯誤信息的解決方法

#NAME?相關(guān)介紹,Excel提示“#NAME?”錯誤消息如何解決Excel提示錯誤消息 Excel經(jīng)常顯示錯誤的值信息,如#DIV/O。#NUM!等等,這是什么原因?那該怎么解決呢?接下來,會計網(wǎng)絡(luò)編制介紹了在Exce...

#NAME?看這里!錯誤代碼“NAME?”怎么解決

#NAME?看這里!錯誤代碼“NAME?”怎么解決

#NAME?相關(guān)介紹,[計算機報紙在線]在Excel(2003/2007)中寫表格時經(jīng)常使用一些函數(shù)和公式,如果使用不當(dāng),將返回一些錯誤代碼。 例如“#NAME?”,這個故障怎么解決? 情況1:在公式中使用了Excel無法...

關(guān)于#NAME?我想說最全有關(guān)公式問題

關(guān)于#NAME?我想說最全有關(guān)公式問題

#NAME?相關(guān)介紹,作為官方介紹的第一篇,請耐心閱讀個人認為包含公式的所有問題,差不多2000字,純打,如果可能的話。也可以發(fā)表評論,發(fā)表很多意見。 1 公式(函數(shù))的插入 公式是對工作表中的值進行計算的等式,始終以等號...

#NAME?專題之最全有關(guān)公式問題

#NAME?專題之最全有關(guān)公式問題

#NAME?相關(guān)介紹,作為官方介紹的第一篇,請耐心閱讀個人認為包含公式的所有問題,差不多2000字,純打,如果可能的話。也可以發(fā)表評論,發(fā)表很多意見。 1 公式(函數(shù))的插入 公式是對工作表中的值進行計算的等式,始終以等號...