日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Docker內(nèi)核技術(shù)原理之Mount Namespace

docker內(nèi)核技術(shù)原理之Mount Namespace

作者:云技術(shù)趣談 2021-07-14 10:33:22

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

創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的10年時間我們累計服務(wù)了上千家以及全國政企客戶,如成都崗?fù)?/a>等企業(yè)單位,完善的項目管理流程,嚴(yán)格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致稱揚。

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

我們可以通過unshare分離出一個新的掛載空間,然后在這個新的mount空間內(nèi)將/usr/bin目錄掛載到/mnt目錄下面,當(dāng)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的本質(zhì)就是clone的時候指定flag為CLONE_NEWNS,后續(xù)Demo原理類似。

內(nèi)核原理

要理解Mount Namespace必須先了解mount原理,mount可以將一個文件系統(tǒng)掛載到另外一個文件系統(tǒng)下面。下圖是將一個文件系統(tǒng)掛載到根文件系統(tǒng)的”/home“路徑下面,mount的關(guān)系通過一個內(nèi)核結(jié)構(gòu)體 mount標(biāo)識,mount結(jié)構(gòu)體中核心的就是mnt_mountpoint指向掛載的目標(biāo)路徑,在圖中就是根文件系統(tǒng)的/home路徑。

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

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

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

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

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

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

實戰(zhàn)DEMO

在上面的程序中添加CLONE_NEWNS便可以創(chuàng)建一個新的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 直接運行后,執(zhí)行文章最開始unshare的Demo。你會發(fā)現(xiàn)

因為默認(rèn)情況下掛載傳播是share共享,所以當(dāng)我們在新的Mount Namespace執(zhí)行掛載后,也會傳播到主機上面。我們可以在主機上面先將根目錄調(diào)整到私有掛載,這樣容器內(nèi)的掛載就不會傳播到主機上面了。

  
 
 
 
  1. # mount --make-rprivate / 

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


新聞名稱:Docker內(nèi)核技術(shù)原理之Mount Namespace
文章路徑:
http://www.dlmjj.cn/article/cojeosc.html