linux之命名空间

1. 什么是命名空间

Linux中的命名空间(namespaces)是一种轻量级的虚拟化技术(ps:docker就是依赖这个原理实现的),让进程看起来像是在自己的独立系统中运行,也就是说进程只能看到相同命名空间内的进程和资源,而看不到其他命名空间的资源。

Linux的命名空间包括以下几种类型:

  • Mount namespaces:在不同的Mount namespaces中,进程可以看到不同的文件系统层次结构。
  • PID namespaces:在不同的PID namespaces中,进程有自己的PID空间,允许在每个命名空间中都有一个PID为1的进程。ps:PID=1的进程通常为init进程
  • Network namespaces:提供独立的网络设备、IP地址、路由表等。
  • Interprocess Communication (IPC) namespaces:隔离对IPC的访问,例如消息队列、信号量等。
  • UTS namespaces:隔离主机名和域名。
  • User namespaces:隔离用户和用户组ID,允许在用户空间转换用户ID和组ID。

一个Linux进程在一个或多个命名空间中执行,通过这种技术,可以实现容器(如Docker等)的隔离,让容器中的进程只能看到容器内的资源,而看不到机器上的其他资源,这样就提供了一种安全和隔离的运行环境。

2. 进程如何跟命名空间关联起来的

在 Linux 中,刚创建的进程会继承创建它的进程的所有命名空间。但是,你可以用一些系统调用来改变一个已存在进程的命名空间关联,或者在创建新进程时指定其命名空间。

创建新命名空间的主要方法是用 clone() 系统调用。clone()fork()exec() 的更通用版本,它在创建新进程的同时还支持更多的定制选项。其中有几个选项可以用来创建新的命名空间,如 CLONE_NEWPIDCLONE_NEWNETCLONE_NEWUSER 等。

pid_t pid = clone(child_func, child_stack, CLONE_NEWPID | CLONE_NEWNET | SIGCHLD, NULL);

在上面的代码中,clone() 创建了一个新的进程,并且这个新进程拥有自己的 PID 和网络命名空间。

如果你要改变一个已存在进程的命名空间,你可以使用 setns() 系统调用。每个命名空间在 /proc 文件系统中都有一个对应的文件描述符。你可以打开一个命名空间的文件描述符,然后用 setns() 把进程关联到那个命名空间。

int fd = open("/proc/<PID>/ns/net", O_RDONLY);  // 打开另一个命名空间
setns(fd, CLONE_NEWNET);  // 把当前进程关联到另一个网络命名空间

请注意,要修改进程的命名空间需要适当的权限。一般来说,你需要 root 权限才能执行这些操作。

3. linux中进程如何定位自己的命名空间

每个进程都可以通过查阅 /proc 文件系统下特定的信息,来找到其所在的各种命名空间。在 /proc 文件系统中,每个进程都有一个唯一数字ID对应的目录(即进程ID),里面包含了该进程的各种信息。其中,ns 目录包含了该进程所在命名空间的链接。

比如说,你想查询进程ID为1234的进程所在的各种命名空间,你可以查看 /proc/1234/ns 目录下的内容:

ls -l /proc/1234/ns

输出例子:

total 0
lrwxrwxrwx 1 root root 0 Apr 17 12:00 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 Apr 17 12:00 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Apr 17 12:00 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Apr 17 12:00 net -> net:[4026531957]</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的命名空间是一种隔离机制,可以将进程隔离到独立的环境中,包括网络、文件系统、进程等。在Linux中,可以使用命令行工具来切换命名空间。 1. 列出当前系统中的所有命名空间类型 ``` lsns ``` 2. 创建一个新的命名空间 ``` unshare [options] [command [arguments...]] ``` 这个命令会创建一个新的命名空间,并在其中执行指定的命令。可以使用多个选项来指定要创建的命名空间类型,如: ``` unshare --mount --uts --ipc --net --pid --fork bash ``` 这个命令会创建一个新的命名空间,并在其中启动一个新的bash shell。其中,--mount选项表示要创建一个新的文件系统命名空间,--uts选项表示要创建一个新的主机名和域名命名空间,--ipc选项表示要创建一个新的IPC命名空间,--net选项表示要创建一个新的网络命名空间,--pid选项表示要创建一个新的进程命名空间,--fork选项表示要在新的命名空间中启动一个新的进程。 3. 切换到另一个命名空间 ``` ip netns exec <namespace> <command> ``` 这个命令会在指定的网络命名空间中执行指定的命令。其中,<namespace>是要切换到的命名空间的名称,<command>是要在命名空间中执行的命令。 例如,要在名为netns1的网络命名空间中执行ping命令,可以使用以下命令: ``` ip netns exec netns1 ping 8.8.8.8 ``` 这个命令会在netns1命名空间中执行ping命令,并将结果返回到当前的命名空间中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值