手把手做網(wǎng)站友情鏈接檢測(cè)659292
Linux Namespace
linux Namespace用于隔離一系列的系統(tǒng)資源,例如pid,userid,netword等,借助于Linux Namespace,可以實(shí)現(xiàn)容器的基本隔離。
Namespce介紹
Namespace類型 | 系統(tǒng)調(diào)用參數(shù) | 作用 |
---|---|---|
Mount Namespace | CLONE_NEWNS | 隔離掛載點(diǎn)視圖,簡(jiǎn)單來說隔離了mount命令 |
UTS Namespace | CLONE_NEWUTS | 隔離hostname |
IPC Namespace | CLONE_NEWIPC | 隔離ipc與message queue |
PID Namespace | CLONE_NEWPID | 隔離進(jìn)程PID |
Network Namespace | CLONE_NEWNET | 隔離network |
User Namespace | CLONE_NEWUSER | 隔離userid和groupid |
下面我們用Go程序創(chuàng)建一個(gè)隔離的進(jìn)程
package main ? import ("os""os/exec""syscall" ) ? func main() {cmd := exec.Command("bash")cmd.SysProcAttr = &syscall.SysProcAttr{Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS |syscall.CLONE_NEWUSER | syscall.CLONE_NEWNET,}cmd.Stdin = os.Stdincmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrif err := cmd.Run(); err != nil {panic(err)} ? }
我們可以通過一些命令來查看我們確實(shí)處于在了新的Namespace中,當(dāng)然,因?yàn)槲覀兪褂昧?code>CLONE_NEWUSER參數(shù),這讓我們?cè)贜amespace中失去了用戶身份,我們不能以root用戶進(jìn)行操作,如果要以root身份驗(yàn)證其他Namespace,需要?jiǎng)h除CLONE_NEWUSER
,然后以root身份運(yùn)行程序。
這里我們可以簡(jiǎn)單驗(yàn)證PID Namespace,可以看到PID為1,隔離了PID
echo $$ 1
驗(yàn)證User Namespace
id uid=65534(nobody) gid=65534(nogroup) 組=65534(nogroup)