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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux命名空间(namespace)学习(一)

發布時間:2023/12/18 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux命名空间(namespace)学习(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于linux命名空間網絡上有很多是關于docker 的,也有關于linux的專門的linux的namespace介紹的,沒有專門介紹Linux命名空間的應用的。所以我想先介紹一下linux命名空間的應用,然后再介紹linux內核對于命名空間的管理方式。好了,廢話不多說先上原理吧。
命名空間在linux中是實現資源隔離的一種手段,也是輕量級虛擬化的一種手段??梢詫崿F多個用戶,也可以實現多個網絡設備訪問(虛擬化網絡),但是實體網絡卻只有一個。資源隔離意味著比如不通PID命名空間看到的PID進程是不一樣的,不通命名空間看到的IPC通信是不一樣的。
命名空間分類:

1. UTS命名空間2.IPC命名空間;3.PID命名空間;4.文件命名空間;5.網絡命名空間;6.用戶命名空間;

本博客會先在用戶用戶命名空間的使用方式上介紹前四種命名空間;
代碼如下:
<ipc_clone.c>

#define _GNU_SOURCE #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <sched.h> #define STACK_SIZE (1024*1024)static char container_stack[STACK_SIZE]; const char * args = "/bin/bash";int contain_func(void * arg) {printf("this is in %s, and pid : %d \n", __func__, getpid());sethostname("alexander", 10);system("mount -t proc proc /proc");execv(args, arg);printf("this is in %s end\n", __func__);return 1; }int main(void) {int clone_pid = clone(contain_func, container_stack + STACK_SIZE,CLONE_NEWPID | CLONE_NEWUTS| CLONE_NEWIPC|CLONE_NEWNS |SIGCHLD , NULL);waitpid(clone_pid, NULL, 0);printf("this is in %s\n", __func__);return 0; }

**

UTS命名空間

**
操作如下:
1.啟動UTS命名空間進程,在進程內把UTS的名字命名為alexander;
2.在進程內啟動了bash進程,查看子進程UTS命名空間,為alexander;
3.退出子進程,子命名空間不存在;
4.查看主命名空間,為系統的hostname(ubuntu)
結果如下:

root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# gcc ipc_clone.c -o clone root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone this is in contain_func, and pid : 1 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# hostname alexander root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit exit this is in main root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# hostname ubuntu root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone#

**

IPC命名空間

**
操作過程如下:

1. 啟動子進程命名空間;2. 在子進程命名空間中創建IPC通道;3. 在子進程中再啟動一個子進程,并查看IPC;4. 子命名空間的子命名空間中查看不到上一層命名空間中的IPC通信;

操作如下:

root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone this is in contain_func, and pid : 1 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q------ Message Queues -------- key msqid owner perms used-bytes messages root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcmk -Q Message queue id: 0 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q------ Message Queues -------- key msqid owner perms used-bytes messages 0x5f9a3379 0 root 644 0 0 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone this is in contain_func, and pid : 1 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q------ Message Queues -------- key msqid owner perms used-bytes messages root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit exit this is in main root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q------ Message Queues -------- key msqid owner perms used-bytes messages 0x5f9a3379 0 root 644 0 0 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcrm 0x5f9a3379 ipcrm: unknown argument: 0x5f9a3379 usage: ipcrm [ [-q msqid] [-m shmid] [-s semid][-Q msgkey] [-M shmkey] [-S semkey] ... ] root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcrm -Q 0x5f9a3379 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q------ Message Queues -------- key msqid owner perms used-bytes messages root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit exit this is in main

**

PID命名空間

**
操作過程如下:

1.啟動子進程命名空間; 2.查看子進程命名空間中的進程; 3.查看子進程命名空間中的proc文件系統

操作如下:

root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone this is in contain_func, and pid : 1 root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.0 5748 1956 pts/15 S 04:35 0:00 [bash] root 13 0.0 0.0 5216 1144 pts/15 R+ 04:35 0:00 ps aux root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 04:35 pts/15 00:00:00 [bash] root 14 1 0 04:35 pts/15 00:00:00 ps -ef root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ls /proc/ 1 cgroups diskstats fs kallsyms kpageflags misc pagetypeinfo slabinfo sysvipc version_signature 15 cmdline dma interrupts kcore latency_stats modules partitions softirqs timer_list vmallocinfo acpi consoles driver iomem keys loadavg mounts sched_debug stat timer_stats vmstat asound cpuinfo execdomains ioports key-users locks mpt schedstat swaps tty zoneinfo buddyinfo crypto fb ipmi kmsg mdstat mtrr scsi sys uptime bus devices filesystems irq kpagecount meminfo net self sysrq-trigger version root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit exit this is in main

**

總結

**

上述子命名空間中的操作主要由如下關鍵宏操作:
CLONE_NEWPID:創建PID命名空間
CLONE_NEWUTS:創建UTS命名空間;
CLONE_NEWIPC:創建新的IPC命名空間;
CLONE_NEWNS:創建新的文件系統命名空間;
注意:
在創建新的IPC命名空間過程中必須指定創建文件系統命名空間,并且掛載新的proc文件系統,否則會使用上一層命名空間中的proc文件系統,這樣顯示的PID(無論是ps 命令還是top命令)就如上一層命名空間中顯示的PID一樣的。

總結

以上是生活随笔為你收集整理的linux命名空间(namespace)学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。