文件系統之初始共享子樹

文件系統

什麼是udev機制?

我們都知道在Linux中一切都是文件,添加的設備都會在/dev/目錄下有一個唯一的文件與之對應,在Linux的早期版本中/dev包含了系統所有可能的條目,即使某些設備實際並未與系統連接,這意味着/dev會包含數以千計的未使用設備項,從而導致了兩個缺點,其一,對於需要掃描該目錄內容的應用而言,降低了程序的執行速度;其二,根據該目錄下的內容無法發現系統實際存在哪些設備。Linux2.6運用udev程序解決了上述問題,udev 以守護進程的形式運行,通過偵聽內核發出來的uevent來管理 /dev目錄下的設備文件,可以動態的創建設備文件,還可以自定義設備的命名規則

能否在多個掛載點掛載相同的設備?

內核版本在2.4之前,一個文件系統只能掛載於單個掛載點,從內核版本2.4開始,可以將一個文件系統掛載於文件系統內的多個位置。由於每個掛載點下的目錄子樹內容都相同,在一個掛載點下對目錄子樹所做的改變,同樣見諸於其它掛載點。

[root@localhost data]# mkdir /data/mnt1
[root@localhost data]# mkdir /data/mnt2
[root@localhost data]# mount /dev/sdb1 /data/mnt1/
[root@localhost data]# mount /dev/sdb1 /data/mnt2/
[root@localhost data]# ls /data/mnt1/
1.c  data  ls  new_data
[root@localhost data]# ls /data/mnt2
1.c  data  ls  new_data
[root@localhost data]# touch /data/mnt1/test
[root@localhost data]# ls /data/mnt2
1.c  data  ls  new_data  test

什麼是綁定掛載?

始於內核版本2.4,Linux支持了創建綁定掛載,綁定掛載是指在文件系統層級的另一處掛載目錄或文件,這將導致文件或目錄在兩處同時可見,綁定掛載類似於硬鏈接,但是存在兩個方面的差異:

  • 綁定掛載可以跨越多個文件系統掛載點
  • 可針對目錄執行綁定掛載
[root@localhost bind]# mkdir mnt1 mnt2
[root@localhost bind]# touch mnt1/zzz
[root@localhost bind]# mount --bind mnt1 mnt2           //進行目錄的綁定掛載
[root@localhost bind]# ls mnt2/
zzz

[root@localhost bind]# touch test1 test2        
[root@localhost bind]# echo "1111" > test1 
[root@localhost bind]# mount --bind test1 test2         //進行文件的綁定掛載
[root@localhost bind]# cat test2 
1111

什麼是共享子樹(shared subtree)的概念?

自Linux版本2.4.19以後,內核支持針對每個進程的掛載命名空間,這意味着每個進程都可能擁有屬於自己的一組文件系統掛載點。比如在進程A的視角下,只能看到/dev/sda1掛載到/根目錄下,在進程B的視角下,只能看到/dev/sda2掛載到/home根目錄下。在支持了這個特性後就需要考慮下面一個場景:一個進程想要有自己的掛載命名空間,但是仍然想訪問CD-ROM所在的掛載點,這個掛載點是在初始的掛載空間中的。其它的掛載空間是看不到這個掛載點的,因此共享子樹語義提供了必要的機制來完成上面的這個場景。共享子樹提供了四個不同的掛載標誌來支持。

  • shared mount MS_SHARED
    shared mount掛載可以將一個掛載點複製多份,並且後續在任何拷貝的掛載點中再次掛載都會被傳播到其他副本。
[root@localhost ~]# mount --make-shared /data/              //設置/data掛載點爲shared mount
[root@localhost ~]# mkdir /tmp/data
[root@localhost ~]# mount --bind /data/ /tmp/data/          //進行復制
[root@localhost ~]# ls /data/
test1  test2
[root@localhost ~]# ls /tmp/data/
test1  test2
[root@localhost ~]# touch /data/aaa                         //兩個掛載點共享同一份內容,相互影響
[root@localhost ~]# ls /tmp/data/
aaa  test1  test2
[root@localhost ~]# mkdir /tmp/data/mnt                     //創建一個新的目錄
[root@localhost ~]# mount /dev/sdb1 /tmp/data/mnt/          //創建新的掛載點
[root@localhost ~]# ls /tmp/data/mnt/               
1.c  data  ls  new_data
[root@localhost ~]# ls /data/mnt/                           //發現後續新創建的掛載點也會變成shared mount
1.c  data  ls  new_data
  • slave mount MS_SLAVE
    slave mount掛載可以將一個掛載點複製多份,但是後續在任何拷貝的掛載點中再次掛載不會被傳播到其他副本。並且卸載事件也不會傳播到其他掛載點,但是如果是在master掛載點上進行掛載,那麼這個事件會被傳播到所有的slave mount。
[root@localhost /]# mount --make-shared /data/              //slave mount需要有一個master mount,並且master必須是shared mount
[root@localhost /]# mount --bind /data/ /tmp/data/  
[root@localhost /]# mount --make-slave /tmp/data/           //設置爲slave mount
[root@localhost /]# mount /dev/sdb1 /tmp/data/mnt/          //掛載事件並不傳播
[root@localhost /]# ls /tmp/data/mnt/
1.c  data  ls  new_data
[root@localhost /]# ls /data/mnt/
[root@localhost /]# touch /data/zzz                         //共享同一份數據
[root@localhost /]# ls /tmp/data/
aaa  mnt  test1  test2  zzz
[root@localhost data]# unmount /tmp/data/mn1                //卸載
[root@localhost data]# mount /dev/sdb1 /data/mnt/           //在master mount進行掛載
[root@localhost data]# ls /data/mnt/
1.c  data  ls  new_data
[root@localhost data]# ls /tmp/data/mnt/                    //發現會傳播到slave mount
1.c  data  ls  new_data
  • private mount MS_PRIVATE
    private mount掛載,這和早期的mount是一樣的,也是某些系統的默認掛載類型,可以進行綁定掛載,但是無論在哪個掛載點再次掛載,都不會進行掛載事件的轉發和傳播。
[root@localhost data]# mount --make-private /data/          //設置private mount
[root@localhost data]# mount --bind /data/ /tmp/data/       //進行綁定掛載
[root@localhost data]# mount /dev/sdb1 /data/mnt/           //再次掛載
[root@localhost data]# ls /data/mnt/                    
1.c  data  ls  new_data
[root@localhost data]# ls /tmp/data/mnt/                    //沒有傳播到其他的掛載點
[root@localhost data]# 
  • unbindable mount MS_UNBINDABLE
    無法進行綁定掛載,一個設備只能掛載到一個掛載點。
root@localhost:~# mount --make-unbindable /data
root@localhost:~# mount --bind /data/ /tmp/data
mount: wrong fs type, bad option, bad superblock on /data,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
root@localhost:~#

Documentation/sharedsubtree.txt
文件系統與文件屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章