站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        你必須了解Linux的命名空間

        本篇文章給大家?guī)砹岁P于linux命名空間的相關知識,命名空間提供了虛擬化的一種輕量級形式,使得我們可以從不同的方面來查看運行系統(tǒng)的全局屬性,希望對大家有幫助。

        你必須了解Linux的命名空間

        一、基本概念

        ??命名空間(Linux namespace)是linux內核針對實現(xiàn)容器虛擬化映入的一個特性。我們創(chuàng)建的每個容器都有自己的命名空間,運行在其中的應用都像是在獨立的操作系統(tǒng)中運行一樣,命名空間保證了容器之間互不影響。

        ??Linux的命名空間機制提供了一種資源隔離的解決方案。PID,IPC,Network等系統(tǒng)資源不再是全局性的,而是屬于特定的Namespace。Namespace是對全局系統(tǒng)資源的一種封裝隔離,使得處于不同namespace的進程擁有獨立的全局系統(tǒng)資源,改變一個namespace中的系統(tǒng)資源只會影響當前namespace里的進程,對其他namespace中的進程沒有影響。

        ??傳統(tǒng)上,在Linux以及其他衍生的UNIX變體中,許多資源是全局管理的。例如,系統(tǒng)中的所有進程按照慣例是通過PID標識的,這意味著內核必須管理一個全局的PID列表。而且,所有調用者通過uname系統(tǒng)調用返回的系統(tǒng)相關信息(包括系統(tǒng)名稱和有關內核的一些信息)都是相同的。用戶ID的管理方式類似,即各個用戶是通過一個全局唯一的UID號標識。

        ??全局ID使得內核可以有選擇地允許或拒絕某些特權。雖然UID為0的root用戶基本上允許做任何事,但其他用戶ID則會受到限制。例如UID為n的用戶,不允許殺死屬于用戶m的進程( m≠ n)。但這不能防止用戶看到彼此,即用戶n可以看到另一個用戶m也在計算機上活動。只要用戶只能操縱他們自己的進程,這就沒什么問題,因為沒有理由不允許用戶看到其他用戶的進程。

        ??但有些情況下,這種效果可能是不想要的。如果提供Web主機的供應商打算向用戶提供Linux計算機的全部訪問權限,包括root權限在內。傳統(tǒng)上,這需要為每個用戶準備一臺計算機,代價太高。使用KVM或VMWare提供的虛擬化環(huán)境是一種解決問題的方法,但資源分配做得不是非常好。計算機的各個用戶都需要一個獨立的內核,以及一份完全安裝好的配套的用戶層應用。

        ??命名空間提供了一種不同的解決方案,所需資源較少。在虛擬化的系統(tǒng)中,一臺物理計算機可以運行多個內核,可能是并行的多個不同的操作系統(tǒng)。而命名空間則只使用一個內核在一臺物理計算機上運作,前述的所有全局資源都通過命名空間抽象起來。這使得可以將一組進程放置到容器中,各個容器彼此隔離。隔離可以使容器的成員與其他容器毫無關系。但也可以通過允許容器進行一定的共享,來降低容器之間的分隔。例如,容器可以設置為使用自身的PID集合,但仍然與其他容器共享部分文件系統(tǒng)。

        二、實現(xiàn)

        ??命名空間的實現(xiàn)需要兩個部分:每個子系統(tǒng)的命名空間結構,將此前所有的全局組件包裝到命名空間中;將給定進程關聯(lián)到所屬各個命名空間的機制。

        ??子系統(tǒng)此前的全局屬性現(xiàn)在封裝到命名空間中,每個進程關聯(lián)到一個選定的命名空間。每個可以感知命名空間的內核子系統(tǒng)都必須提供一個數(shù)據(jù)結構,將所有通過命名空間形式提供的對象集中起來。 struct nsproxy用于匯集指向特定于子系統(tǒng)的命名空間包裝器的指針。在文件nsproxy.h中有:

        /*  * A structure to contain pointers to all per-process  * namespaces - fs (mount), uts, network, sysvipc, etc.  *  * The pid namespace is an exception -- it's accessed using  * task_active_pid_ns.  The pid namespace here is the  * namespace that children will use.  *  * 'count' is the number of tasks holding a reference.  * The count for each namespace, then, will be the number  * of nsproxies pointing to it, not the number of tasks.  *  * The nsproxy is shared by tasks which share all namespaces.  * As soon as a single namespace is cloned or unshared, the  * nsproxy is copied.  */struct nsproxy { 	atomic_t count; 	struct uts_namespace *uts_ns; 	struct ipc_namespace *ipc_ns; 	struct mnt_namespace *mnt_ns; 	struct pid_namespace *pid_ns_for_children; 	struct net 	     *net_ns; 	struct time_namespace *time_ns; 	struct time_namespace *time_ns_for_children; 	struct cgroup_namespace *cgroup_ns;};

        ??當前內核的以下范圍可以感知到命名空間

        ??1、 UTS命名空間包含了運行內核的名稱、版本、底層體系結構類型等信息。 UTS是UNIXTimesharing System的簡稱。

        ??2、保存在struct ipc_namespace中的所有與進程間通信( IPC)有關的信息。

        ??3、 已經裝載的文件系統(tǒng)的視圖,在struct mnt_namespace中給出。

        ??4、 有關進程ID的信息,由struct pid_namespace提供。

        ??5、 struct user_namespace保存的用于限制每個用戶資源使用的信息。

        ??6、struct net_ns包含所有網(wǎng)絡相關的命名空間參數(shù)。

        ??當我討論相應的子系統(tǒng)時,會介紹各個命名空間容器的內容。在由于在創(chuàng)建新進程時可使用fork建立一個新的命名空間,因此必須提供控制該行為的適當?shù)臉酥尽C總€命名空間都有一個對應的標志,在sched.h文件內:

        #define CLONE_NEWCGROUP		0x02000000	/* New cgroup namespace */ #define CLONE_NEWUTS		0x04000000	/* New utsname namespace */ #define CLONE_NEWIPC		0x08000000	/* New ipc namespace */ #define CLONE_NEWUSER		0x10000000	/* New user namespace */ #define CLONE_NEWPID		0x20000000	/* New pid namespace */ #define CLONE_NEWNET		0x40000000	/* New network namespace */

        ??不同類型的命名空間的作用:

        ??IPC:用于隔離進程間通訊所需的資源( System V IPC, POSIX message queues),PID命名空間和IPC命名空間可以組合起來用,同一個IPC名字空間內的進程可以彼此看見,允許進行交互,不同空間進程無法交互

        ??Network:Network Namespace為進程提供了一個完全獨立的網(wǎng)絡協(xié)議棧的視圖。包括網(wǎng)絡設備接口,IPv4和IPv6協(xié)議棧,IP路由表,防火墻規(guī)則,sockets等等。一個Network Namespace提供了一份獨立的網(wǎng)絡環(huán)境,就跟一個獨立的系統(tǒng)一樣。

        ??Mount:每個進程都存在于一個mount Namespace里面,??mount Namespace為進程提供了一個文件層次視圖。如果不設定這個flag,子進程和父進程將共享一個mount Namespace,其后子進程調用mount或umount將會影響到所有該Namespace內的進程。如果子進程在一個獨立的mount Namespace里面,就可以調用mount或umount建立一份新的文件層次視圖。

        ??PID::linux通過命名空間管理進程號,同一個進程,在不同的命名空間進程號不同!進程命名空間是一個父子結構,子空間對于父空間可見。

        ??User:用于隔離用戶

        ??UTS:用于隔離主機名

        ??每個進程都關聯(lián)到自身的命名空間視圖,在任務定義的結構體task_struct中有如下定義:

        struct task_struct {.../* 命名空間 */struct nsproxy *nsproxy;...}

        ??因為使用了指針,多個進程可以共享一組子命名空間。這樣,修改給定的命名空間,對所有屬于該命名空間的進程都是可見的。
        ??init_nsproxy定義了初始的全局命名空間,其中維護了指向各子系統(tǒng)初始的命名空間對象的指針。在kernel/nsproxy.c文件內有

        struct nsproxy init_nsproxy = { 	.count			= ATOMIC_INIT(1), 	.uts_ns			= &init_uts_ns,#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC) 	.ipc_ns			= &init_ipc_ns,#endif 	.mnt_ns			= NULL, 	.pid_ns_for_children	= &init_pid_ns,#ifdef CONFIG_NET 	.net_ns			= &init_net,#endif#ifdef CONFIG_CGROUPS 	.cgroup_ns		= &init_cgroup_ns,#endif#ifdef CONFIG_TIME_NS 	.time_ns		= &init_time_ns, 	.time_ns_for_children	= &init_time_ns,#endif};

        三、UTS命名空間

        ??UTS命名空間幾乎不需要特別的處理,因為它只需要簡單量,沒有層次組織。所有相關信息都匯集到下列結構的一個實例中。在utsname.h文件內:

        struct uts_namespace { 	struct new_utsname name; 	struct user_namespace *user_ns; 	struct ucounts *ucounts; 	struct ns_common ns;} __randomize_layout;

        ??uts_namespace所提供的屬性信息本身包含在struct new_utsname中:

        struct oldold_utsname { 	char sysname[9]; 	char nodename[9]; 	char release[9]; 	char version[9]; 	char machine[9];};#define __NEW_UTS_LEN 64struct old_utsname { 	char sysname[65]; 	char nodename[65]; 	char release[65]; 	char version[65]; 	char machine[65];};struct new_utsname { 	char sysname[__NEW_UTS_LEN + 1]; 	char nodename[__NEW_UTS_LEN + 1]; 	char release[__NEW_UTS_LEN + 1]; 	char version[__NEW_UTS_LEN + 1]; 	char machine[__NEW_UTS_LEN + 1]; 	char domainname[__NEW_UTS_LEN + 1];}

        ??各個字符串分別存儲了系統(tǒng)的名稱( Linux…)、內核發(fā)布版本、機器名,等等。使用uname工具可以取得這些屬性的當前值,也可以在/proc/sys/kernel/中看到

        z@z-virtual-machine:~$ cat /proc/sys/kernel/ostype Linux z@z-virtual-machine:~$ cat /proc/sys/kernel/osrelease5.3.0-40-generic

        ??初始設置保存在init_uts_ns中,在init/version.c文件內:

        struct uts_namespace init_uts_ns = { 	.ns.count = REFCOUNT_INIT(2), 	.name = { 		.sysname	= UTS_SYSNAME, 		.nodename	= UTS_NODENAME, 		.release	= UTS_RELEASE, 		.version	= UTS_VERSION, 		.machine	= UTS_MACHINE, 		.domainname	= UTS_DOMAINNAME, 	}, 	.user_ns = &init_user_ns, 	.ns.inum = PROC_UTS_INIT_INO,#ifdef CONFIG_UTS_NS 	.ns.ops = &utsns_operations,#endif};

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 日本精品自产拍在线观看中文| 1000部精品久久久久久久久 | 熟女精品视频一区二区三区 | 亚洲精品欧美日韩| 欧美精品黑人粗大免费| 久久久久久久久久久免费精品| 99久久99这里只有免费的精品| 亚洲中文久久精品无码ww16| 国产乱人伦精品一区二区在线观看| 98视频精品全部国产| 日本一卡精品视频免费| 欲帝精品福利视频导航| 青青久久精品国产免费看| 国产精品无码免费播放| 91午夜精品亚洲一区二区三区 | 国产精品久久久久天天影视| 精品久久无码中文字幕| 无码精品人妻一区二区三区人妻斩 | 麻豆国产高清精品国在线| 99热亚洲精品6码| 国产精品视频免费观看| 91原创国产精品| 国产精品原创巨作av女教师| 久久水蜜桃亚洲av无码精品麻豆| 无码人妻精品一区二区三 | 国产精品极品| 国产A∨国片精品一区二区 | 97久久久久人妻精品专区| 国产网红无码精品视频| 日本内射精品一区二区视频| 久久精品九九亚洲精品| 欧洲精品色在线观看| 久久精品无码午夜福利理论片 | 国内精品久久久久久99蜜桃| 久久精品人人做人人妻人人玩| 久久99精品久久久久久久久久| 久久精品国产清高在天天线| 久久久无码人妻精品无码 | 日本VA欧美VA精品发布| 色国产精品一区在线观看| 日韩精品久久久肉伦网站 |