文章目录
- PID namespace
- 代码
- mountnamespace
- 通俗理解
- 代码
PID namespace
每个命名空间都有独立的PID空间,即每个命名空间的进程都由一开始分配。
新建立的进程内部进程ID为1
代码
package main
import (
"log"
"os/exec"
"os"
"syscall"
)
func main(){
cmd:=exec.Command("sh")
cmd.SysProcAttr=&syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID,}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run();err!=nil{
log.Fatal(err)
}
}
mountnamespace
NEWNS ( New Namespace的缩写)
mount namespace 是 Linux 系统中的一个概念,它是 Linux 命名空间(namespace)的一种。命名空间是 Linux 内核的一种特性,它可以将系统的某些部分(如进程、网络、用户 ID、文件系统等)隔离开来,使得在命名空间内部的进程看起来就像是在一个独立的系统中一样。
mount namespace 就是用来隔离文件系统挂载点(mount points)的。每个 mount namespace 都有自己的一套挂载点,这些挂载点对其他的 mount namespace 是不可见的。这意味着在一个 mount namespace 中挂载或卸载文件系统不会影响到其他的 mount namespace。
举个例子,假设你在一个大楼里(这个大楼就像是一个 Linux 系统),每个人都有自己的房间(每个房间就像是一个 mount namespace)。在你的房间里,你可以挂上你喜欢的画(就像在你的 mount namespace 中挂载文件系统),并且你可以随时更换或者取下这些画(就像在你的 mount namespace 中卸载文件系统)。但是,你在自己房间中挂上的画,其他人在他们的房间里是看不到的(这就是 mount namespace 的隔离特性)。同样,其他人在他们的房间里挂上的画,你也是看不到的。
这种特性在很多场合都非常有用,比如在创建容器(如 Docker)时。每个容器都有自己的 mount namespace,这样它就可以有自己的文件系统,而不会影响到宿主机或者其他的容器。
proc 是 Linux 系统中的一个特殊文件系统,也被称为 procfs 或者 proc 文件系统。它并不像传统的文件系统那样存储在硬盘上,而是存在于内存中。proc 文件系统是 Linux 内核的一部分,它为用户空间的程序提供了一个接口来访问内核空间的数据。
proc 文件系统通常被挂载到 /proc 目录。在这个目录下,你可以看到许多文件和目录,它们都是由内核实时生成的,反映了系统的当前状态。例如:
/proc/[pid]:每个正在运行的进程都有一个对应的目录,其中 pid 是进程的 ID。在这个目录下,你可以找到关于这个进程的许多信息,例如它的内存使用情况、打开的文件、运行状态等。
/proc/meminfo:这个文件包含了关于系统内存使用情况的信息。
/proc/cpuinfo:这个文件包含了关于 CPU 的信息。
mount -t proc proc /proc
这个命令是用来在 Linux 系统中挂载 proc 文件系统的。让我们逐步解析这个命令:
- mount:这是用来挂载文件系统的命令。
- -t proc:这是指定要挂载的文件系统类型,这里是 proc。
- proc:这是要挂载的文件系统的设备或文件,对于 proc 文件系统,这个参数通常也是 proc。
- /proc:这是挂载点,即挂载后访问文件系统的路径。
- proc 文件系统是一个伪文件系统,它是内核用来向用户空间程序提供系统信息的一种方式。它包含了大量的信息,例如进程信息(每个进程在 /proc 下有一个以其 PID 命名的目录)、内存信息、硬件配置等。
当你执行 mount -t proc proc /proc 命令后,你就可以通过访问 /proc 目录来获取这些信息了。例如,你可以通过读取 /proc/cpuinfo 文件来获取 CPU 的信息,或者通过读取 /proc/meminfo 文件来获取内存的信息。
通俗理解
首先,你可以把 mount 命令理解为一种“连接”或者“接入”的操作。就像你有一台电视和一个游戏机,你想玩游戏,你需要把游戏机接入电视,这样你就能在电视上玩游戏了。在这个例子中,mount 命令就像是把游戏机接入电视的操作。
然后,-t proc 是告诉 mount 命令我们要接入的是什么类型的“游戏机”,在这个例子中,就是 proc 类型的文件系统。
接下来,proc 是我们要接入的“游戏机”,在这个例子中,就是 proc 文件系统。
最后,/proc 是我们要把“游戏机”接入的电视的接口,也就是挂载点。
所以,mount -t proc proc /proc 命令的意思就是把 proc 文件系统(游戏机)接入到 /proc 目录(电视的接口)。
那么,proc 文件系统是什么呢?它其实是一个特殊的文件系统,它并不像硬盘或者 CD 那样存储真实的文件,而是提供了一种访问系统信息的方式。你可以把它想象成一个“魔法游戏机”,当你把它接入电视后,你可以在电视上看到各种系统信息,比如 CPU 的状态、内存的使用情况等。
例如,你可以通过读取 /proc/cpuinfo(在电视上选择“CPU 信息”菜单)来查看 CPU 的信息,或者通过读取 /proc/meminfo(在电视上选择“内存信息”菜单)来查看内存的信息。
在 mount -t proc proc /proc 这条命令中,-t proc 指定了我们要挂载的文件系统类型,这里是 proc。你可以把 -t proc 理解为我们告诉 mount 命令:“我们要挂载的是一个类型为 proc 的文件系统”。
接下来的 proc 是一个特殊的设备名,它表示 proc 文件系统本身。因为 proc 文件系统是一个虚拟的文件系统,它并不像硬盘或 CD 那样有一个物理设备,所以这里的设备名也就是 proc。
所以,mount -t proc proc /proc 这条命令的意思就是:“挂载一个类型为 proc 的文件系统,该文件系统的设备名为 proc,并把它挂载到 /proc 目录”。proc 是一个特殊的文件系统,它是 Linux 内核的一部分并且存在于内存中,不同于传统的文件系统如 ext4、xfs 等存储在硬盘上。它并没有一个具体的物理位置。
proc 文件系统提供了一个接口,使得用户空间的程序可以访问内核空间的数据。当你查看 /proc 目录时,你看到的所有文件和信息都是由内核实时生成的。例如,/proc/[pid] 目录包含了关于 pid 对应的进程的信息,/proc/meminfo 文件包含了内存使用情况的信息,等等。
因此,当我们说 “挂载 proc 文件系统到 /proc 目录” 时,我们实际上是在创建一个接口,使得我们可以通过访问 /proc 目录来获取内核的信息。
代码
package main
import (
"os/exec"
"os"
"syscall"
"log"
)
func main(){
cmd:=exec.Command("sh")
cmd.SysProcAttr=&syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWUTS|syscall.CLONE_NEWNS,}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run();err!=nil{
log.Fatal(err)
}
}