1. 程式人生 > >mount --bind和硬連線的區別

mount --bind和硬連線的區別

大家知道,hard link無法連線目錄,而symbolic link雖然可以連線目錄,但在有些程式裡對符號連線的支援並不好,這個時候我們可以通過mount --bind命令來將兩個目錄連線起來

如題

如上圖,新建兩個目錄   /test1    /test2    ,可以發現兩個目錄的inode號不同

如題

將兩個目錄bind起來  ,會發現inode號全部變成 之前  /test1 的inode號了,所以

mount --bind命令是將前一個目錄掛載到後一個目錄上,所有對後一個目錄的訪問其實都是對前一個目錄的訪問

看起來,mount --bind命令和硬連線很像,都是連線到同一個inode上面,只不過hard link無法連線目錄,而mount --bind命令彌補了這個缺陷,所以很多人將這個命令理解為針對目錄的硬連線

但這種想法是錯的!

因為這兩者的系統執行原理是不一樣的。

當mount --bind命令執行後,Linux將會把被掛載目錄的目錄項(也就是該目錄檔案的block,記錄了下級目錄的資訊)遮蔽,在本例裡就是 /test2 的下級路徑被隱藏起來了(注意,只是隱藏不是刪除,資料都沒有改變,只是訪問不到了)

同時,核心將掛載目錄(本例裡是 /test1)的目錄項記錄在記憶體裡的一個s_root物件裡

在mount命令執行時,VFS會建立一個vfsmount物件,這個物件裡包含了整個檔案系統所有的mount資訊,其中也會包括本次mount中的資訊,這個物件是一個HASH值對應表(HASH值通過對路徑字串的計算得來),表裡就有 /test1 到 /test2 兩個目錄的HASH值對應關係

命令執行完後,當訪問 /test2下的檔案時,系統會告知 /test2 的目錄項被遮蔽掉了,自動轉到記憶體裡找VFS,通過vfsmount瞭解到 /test2 和 /test1 的對應關係,從而讀取到 /test1 的inode,這樣在 /test2 下讀到的全是 /test1 目錄下的檔案

由上述過程可知,mount --bind 和硬連線的重要區別有:

1.mount --bind連線的兩個目錄的inode號碼並不一樣,只是被掛載目錄的block被遮蔽掉,inode被重定向到掛載目錄的inode(被掛載目錄的inode和block依然沒變

2.兩個目錄的對應關係存在於記憶體裡,一旦重啟掛載關係就不存在了

具體關於mount  --bind命令的執行流程,資料結構請參考以下文章

感謝瑞風輕拂大大的精彩分享!

相關推薦

mount --bind連線區別

大家知道,hard link無法連線目錄,而symbolic link雖然可以連線目錄,但在有些程式裡對符號連線的支援並不好,這個時候我們可以通過mount --bind命令來將兩個目錄連線起來 如上圖,新建兩個目錄   /test1    /test2    ,可以發現

Linux 中 ln 軟連線(-s) 連線(-d) 的區別

軟連線 先說軟連線,一個認為這個比較好理解,一個也是因為柿子專挑軟的捏啊,哈哈,建立一個軟連線的命令: 【ln -s 原始檔名 軟連線檔名】 使用ls命令檢視檔案資訊可以驗證一下,對檔案和目錄都可以建立軟連線 在網上看到很多人說快捷方式這個比喻,個人認

Linux VFS-連線連線區別

1.inode節點 Linux VFS其中有一個物件是索引節點,它記錄了與具體檔案相關的資訊,儲存在磁碟上,與磁碟上的檔案控制塊相對應。它用索引節點號進行標識,與資料區相對應,兩個不同的資料區的inode節點號一定不相同。 得用ls -il 可以檢視inode節點號,如下所示: 4251

SQL 內連線連線區別

資料庫的資料: 資料分級: 100 定義的是鎖,110 定義的是門鎖,111定義的是門鎖的種類例如光交門鎖。 那麼 門鎖的種類就是110~190  9 種,具體細分,鎖的種類就是總共:9*9=81種。夠用了。 這種型別的表,適合做自連線。 左外連結:連線2次。左側的資

jquery繫結事件 bindon的區別

bind和on都是給元素繫結事件用的,其最大的區別就是事件冒泡 事件冒泡也是委託事件的原型,事件委託就是子類的事情委託給父類的去做 最直觀的區別就是on繫結比bind繫結多一個引數'childSelector' 語法 $(selector).on(event,childSelecto

連線連線區別優缺點

TCP與UDP  udp:面向無連線的通訊協議,資料包括目的埠資訊和源埠資訊 優點:面向無連線,操作簡單,要求系統資源較少,速度快,由於不需要連線,可進行廣播發送 缺點:傳送資料之前不需要與對方建立連線,接收到資料時也不需要傳送確認訊號,傳送端不知道接收端是否正確接接收,不會重

軟中斷中斷區別

軟中斷: 1、程式設計異常通常叫做軟中斷; 2、軟中斷是通訊程序之間用來模擬硬中斷的 一種訊號通訊方式; 3、 中斷源發中斷請求或軟中斷訊號後,CPU或接收程序在適當的時機自動進行中斷處理或完成軟中斷訊號對應的功能; 4、軟中斷是軟體實現的中斷,也就是程式執行時其他程式對它的中斷

BindEval的區別

  <asp:TemplateField HeaderText="年齡">                            

string函字串字元連線區別

在測試字串和字元連線,發現了一個小細節: 當字串和字元連線時,用+符號進行連線,會按照順序依次連線,達到預期的結果。 當字串和字元連線時,如果是用的+=符號進行連線,後面跟上多個字元將會先計算他們的ASCII碼和再與字串進行連線。 具體情況可以參看下面的示例進行體會:

TCP(HTTP)長連線連線區別怎樣維護長連線

一、HTTP協議和TCP協議 HTTP的長連線和短連線本質上是TCP長連線和短連線。HTTP屬於應用層協議,在傳輸層使用TCP協議,在網路層使用IP協議。IP協議主要解決網路路由和定址問題,TCP協議

mysql 資料庫查詢語句 左外連線 右外連線 連線區別

 左外連結查詢:A  left join  B  on  conidtion  where condition       用A表 的全部資料去匹配 B表 B表無匹配資料時用null代替                       左聯左不丟資料  右外連線查詢:A  ri

ubuntu建立軟連結連線

一、具體用法     ln-s 原始檔 目標檔案    當我們需要在不同的目錄,用到相同的檔案時,我們不需要在每一個需要的目錄下都放一個必須相同的檔案,我們只要在某個固定的目錄,放上該檔案,然後在其它的目錄下用ln命令連結(link)它就可以,不必重複的佔用磁碟空間,只生成

jQuery中bindlive的區別

原文地址:http://blog.sina.com.cn/s/blog_4a60ba9c01013rgu.html Jquery中繫結事件有三種方法:以click事件為例    (1)target.click(function(){});    (2)target.

Jquery繫結事件(bindlive的區別

Jquery中繫結事件有三種方法:以click事件為例    (1)target.click(function(){});    (2)target.bind("click",function(){}

js中call、bindapply的區別

相似之處: 如果你要傳遞的引數不多,則可以使用fn.call(thisObj, arg1, arg2 ...) 如果你

Linux中連結連線區別以及建立

硬連結:已存在的檔案的一個別名,當原始檔刪除時仍可使用,且inode可共享,僅檔名不同的檔案,硬連結的建立會使連結數加1。 軟連線:符號連結,也就是快捷方式,不共享inode,有自己的inode,可對不存在的檔案建立軟連結,建立時連結數不加一,當原始檔刪除時,則

Linux中軟連線(Symbolic Link)連結(Hard Link)的區別(轉)

Linux連結分兩種,一種被稱為硬連結(Hard Link),另一種被稱為符號連結(Symbolic Link)。預設情況下,ln命令產生硬連結。--硬連線硬連線指通過索引節點來進行連線。在Linux的檔案系統中,儲存在磁碟分割槽中的檔案不管是什麼型別都給它分配一個編號,稱為索引節點號(Inode Inde

Linux中軟連線連結的區別

什麼是連結? 連結簡單說實際上是一種檔案共享的方式,是 POSIX 中的概念,主流檔案系統都支援連結檔案。 它是用來幹什麼的? 你可以將連結簡單地理解為 Windows 中常見的快捷方式(或是 OS X 中的替身),Linux 中常用它來解決一些庫版本的問題,通常也

詳解Linux系統中軟連線連結的區別與聯絡

Linux 系統中有軟連線和硬連結兩種特殊的“檔案”。 其中軟連線實際上可以看作是Windows中的快捷方式,而硬連結則可以看作類似於一個檔案的 “指標”(也不完全相同) 。 建立方法都很簡單: 1. 軟連線(符號連結) ln -s   source  target  2

linux 軟連線連結的區別

4點不同 : (1)軟連線可以 跨檔案系統 ,硬連線不可以 。實踐的方法就是用共享檔案把windows下的 aa.txt文字文件連線到linux下/root目錄 下 bb,cc . ln -s aa.txt /root/bb 連線成功 。ln aa.txt /root/bb