成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Docker內核技術原理之Mount Namespace

云計算
容器里面每個容器都可以單獨掛載存儲,這就需要掛載隔離。Mount Namespace是Linux最早支持的命名空間,支持在不同的Namespace中可以看到不同的掛載視圖。

[[411078]]

上一篇文章介紹了UTS Namespace,容器里面每個容器都可以單獨掛載存儲,這就需要掛載隔離。Mount Namespace是Linux最早支持的命名空間,支持在不同的Namespace中可以看到不同的掛載視圖。

 

我們可以通過unshare分離出一個新的掛載空間,然后在這個新的mount空間內將/usr/bin目錄掛載到/mnt目錄下面,當exit退回后,mount失效了。如下所示。

  1. # unshare --mount 
  2. # mount --bind /usr/bin/ /mnt/ 
  3. # ls /mnt/cp 
  4. /mnt/cp 
  5. # exit 
  6. # ls /mnt/cp 
  7. ls: 無法訪問'/mnt/cp': 沒有那個文件或目錄 

其實,unshare --mount的本質就是clone的時候指定flag為CLONE_NEWNS,后續Demo原理類似。

內核原理

要理解Mount Namespace必須先了解mount原理,mount可以將一個文件系統掛載到另外一個文件系統下面。下圖是將一個文件系統掛載到根文件系統的”/home“路徑下面,mount的關系通過一個內核結構體 mount標識,mount結構體中核心的就是mnt_mountpoint指向掛載的目標路徑,在圖中就是根文件系統的/home路徑。

 

上圖中home有兩個dentry,一個是根文件系統下的dentry,它是目標掛載點,另外一個dentry是被掛載文件系統的dentry。譬如將一個掛載盤格式EXT4文件系統,那么這個dentry就掛載盤的根文件系統dentry。通過mount struct就可以將外部文件系統掛載到根文件系統上面。

每個mount struct里面都有一個mnt_namespace,它是一個指向掛載命令空間的指針,之前命名空間概述文章中介紹的ns_proxy也是指向這個mnt_namespace。這樣進程和它的掛載空間就可以關聯起來了。

Mount Namespace還有一個特殊的地方就是掛載傳播(mount propagation),掛載傳播是指由一個掛載對象的狀態變化導致的其它掛載對象的掛載與解除掛載動作的事件。針對容器這個場景就是,如果Docker內執行了一次掛載后,宿主機上是否能看到這個掛載,反過來,如果宿主機執行了某個掛載,容器內是否能看見。常見的有三種掛載方式:

共享關系(share relationship),如果兩個掛載對象具有共享關系,那么一個掛載對象中的掛載事件會傳播到另一個掛載對象,反之亦然。也就是說容器和宿主機的掛載會互相可見。

從屬關系(slave relationship),如果兩個掛載對象形成從屬關系,那么一個掛載對象中的掛載事件會傳播到另一個掛載對象,但是反過來不行;在這種關系中,從屬對象是事件的接收者。也就是說主機掛載容器可見,反過來不行。

私有關系(private relationship),之間互相不傳播,相互獨立。也就是說相互不可見。

實戰DEMO

在上面的程序中添加CLONE_NEWNS便可以創建一個新的Mount Namespace。代碼還是基于之前PID的代碼,加上CLONE_NEWNS。

  1. package main 
  2. import ( 
  3.     "fmt" 
  4.     "os" 
  5.     "os/exec" 
  6.     "syscall" 
  7. func main() { 
  8.     cmd := exec.Command("/bin/sh"
  9.  
  10.     cmd.Stdin = os.Stdin 
  11.     cmd.Stdout = os.Stdout 
  12.     cmd.Stderr = os.Stderr 
  13.  
  14.     cmd.Env = []string{"PS1=-[ns-process]- # "
  15.  
  16.     cmd.SysProcAttr = &syscall.SysProcAttr{ 
  17.         Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS, 
  18.     } 
  19.  
  20.     if err := cmd.Run(); err != nil { 
  21.         fmt.Printf("Error running the /bin/sh command - %s\n", err) 
  22.         os.Exit(1) 
  23.     } 

通過go run 直接運行后,執行文章最開始unshare的Demo。你會發現

[[411079]]

 

因為默認情況下掛載傳播是share共享,所以當我們在新的Mount Namespace執行掛載后,也會傳播到主機上面。我們可以在主機上面先將根目錄調整到私有掛載,這樣容器內的掛載就不會傳播到主機上面了。

  1. # mount --make-rprivate / 

 

上面的Demo也可以正常運行了。

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-07-10 08:29:13

Docker內核Namespace

2018-06-26 08:27:21

DRDS內核 列式存儲

2016-09-20 21:32:16

DockerLinux Names

2016-09-20 22:04:55

Docker Linux Names

2009-03-22 21:29:11

多核技術

2016-06-20 16:10:11

無內核技術Node.js

2023-08-10 14:02:15

2010-04-01 09:29:14

2020-11-17 09:09:55

Unity技術大會

2018-08-27 16:41:07

KPI技術人

2009-08-06 18:12:06

2017-01-12 19:15:03

Linux內核調試自構proc

2025-01-02 11:06:22

2021-02-20 20:51:24

工具內核kprobe

2018-10-08 09:00:58

考核技術人KPI

2009-03-18 13:10:59

多核服務器MIPS

2009-03-22 21:36:34

多核架構質變

2019-06-11 09:30:04

PKI密鑰網絡安全

2019-12-12 10:58:37

Docker容器引擎

2017-03-02 12:39:04

移動端iOS監控體系
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女视频一区二区三区 | 久久久精 | 亚洲成人精品久久久 | 日韩精品在线观看免费 | 一区二区三区精品 | 成人久久久 | 亚洲成人一区二区 | 天天av天天好逼 | 亚洲午夜网 | 欧美日韩三级在线观看 | 97超碰站 | 亚洲一区二区在线免费观看 | 日韩在线不卡视频 | 国产综合精品一区二区三区 | 色婷综合网 | 一区二区视频 | 国产亚洲精品久久久优势 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 91亚洲国产 | 91久久久久久久久 | 久久久久久久久久久丰满 | 青青草原综合久久大伊人精品 | av毛片在线播放 | 美女久久久 | 国产一区二区三区四区在线观看 | 日韩精品免费 | 亚洲欧洲视频 | 久色一区 | 亚洲国产免费 | 国产1页 | 欧美午夜精品理论片a级按摩 | 成人精品鲁一区一区二区 | 欧美日韩黄色一级片 | 日韩在线免费视频 | 91精品国产色综合久久 | 国产成人免费网站 | 成人午夜免费视频 | 欧美激情久久久久久 | 日韩毛片免费看 | 国产黄色在线观看 | 亚洲成人精品一区 |