1. 程式人生 > >Linux檔案系統之aufs

Linux檔案系統之aufs

aufs的全稱是advanced multi-layered unification filesystem,主要功能是把多個資料夾的內容合併到一起,提供一個統一的檢視,主要用於各個Linux發行版的livecd中,以及docker裡面用來組織image。

據說由於aufs程式碼的可維護性不好(程式碼可讀性和註釋不太好),所以一直沒有被合併到Linux核心的主線中去,不過有些發行版的kernel裡面維護的有該檔案系統,比如在ubuntu 16.04的核心程式碼中,就有該檔案系統。

本篇所有例子都在ubuntu-server-x86_64 16.04下執行通過

檢查系統是否支援aufs

在使用aufs之前,可以通過下面的命令確認當前系統是否支援aufs,如果不支援,請自行根據相應發行版的文件安裝

#下面的命令如果沒有輸出,表示核心不支援aufs
#由於ubuntu 16.04的核心中已經將aufs編譯進去了,所以預設就支援
[email protected]:~$ grep aufs /proc/filesystems
nodev   aufs
#這裡nodev表示該檔案系統不需要建在裝置上

注意:有些Linux發行版可能將aufs編譯成了模組,所以雖然這裡顯示核心不支援,但其實後面的命令都能正常執行

掛載aufs

選擇好相應的引數(參考幫助文件),呼叫mount命令即可,示例如下

# mount -t aufs -o br=./Branch-0:./Branch-1:./Branch-2
 none ./MountPoint
  • -t aufs: 指定掛載型別為aufs

  • -o br=./Branch-0:./Branch-1:./Branch-2: 表示將當前目錄下的Branch-0,Branch-1,Branch-2三個資料夾聯合到一起

  • none:aufs不需要裝置,只依賴於-o br指定的資料夾,所以這裡填none即可

  • ./MountPoint:表示將最後聯合的結果掛載到當前的MountPoint目錄下,然後我們就可以往這個目錄裡面讀寫檔案了

假設Branch-0裡面有檔案001.txt、003.txt,Branch-1裡面有檔案001.txt、003.txt、004.txt,Branch-2裡面有檔案002.txt、003.txt。

mount完成後,得到的結果將會如下圖所示

              /*001.txt(b0)表示Branch-0的001.txt檔案,其它的以此類推*/
           +-------------+-------------+-------------+-------------+
MountPoint | 001.txt(b0) | 002.txt(b2) | 003.txt(b0) | 004.txt(b1) |    
           +-------------+-------------+-------------+-------------+
                  ↑             ↑             ↑             ↑
                  ||||
           +-------------+-------------+-------------+-------------+
Branch-0   |   001.txt   ||   003.txt   ||
           +-------------+-------------+-------------+-------------+
Branch-1   |   001.txt   ||   003.txt   |   004.txt   |
           +-------------+-------------+-------------+-------------+
Branch-2   ||   002.txt   |   003.txt   ||
           +-------------+-------------+-------------+-------------+

聯合之後,在MountPoint下將會看到四個檔案,分別是Branch-0下的001.txt、003.txt,Branch-1下的04.txt,以及Branch-2下的002.txt。

  • branch是aufs裡面的概念,其實一個branch就是一個目錄,所以上面的Branch-0,1,2就是三個目錄

  • branch是有index的,index越小的branch會放在最上面,如果多個branch裡面有同樣的檔案,只有index最小的那個branch下的檔案才會被訪問到

  • MountPoint就是最後這三個目錄聯合後掛載到的位置,訪問這個目錄下的檔案都會經過aufs檔案系統,換句話說,直接訪問Branch-0,1,2這三個目錄的話,aufs是不知道的

注意:並不是所有檔案系統裡的目錄都能作為aufs的branch,目前aufs不支援的有:btrfs aufs eCryptfs

讀這些檔案的時候訪問的是最上層的檔案,但如果要寫這些檔案呢?或者在掛載點下建立新的檔案呢?請看下面的示例

只讀掛載

掛載時,可以指定每個branch的讀寫許可權,如果不指定的話,第一個目錄將會是可寫的,其它的目錄是隻讀的,在實際使用時,最好是顯示的指定每個branch的讀寫屬性,這樣大家都一眼就能看懂。這裡先演示一下只讀掛載:

#準備相應的目錄和檔案
[email protected]:~$ mkdir /tmp/aufs && cd /tmp/aufs
[email protected]:/tmp/aufs$ mkdir dir0 dir1 root
[email protected]:/tmp/aufs$ echo dir0 > dir0/001.txt
[email protected]:/tmp/aufs$ echo dir0 > dir0/002.txt
[email protected]:/tmp/aufs$ echo dir1 > dir1/002.txt
[email protected]:/tmp/aufs$ echo dir1 > dir1/003.txt
#最後用tree命令來看看最終的目錄結構
[email protected]:/tmp/aufs$ tree
.
├── dir0
│   ├── 001.txt
│   └── 002.txt
├── dir1
│   ├── 002.txt
│   └── 003.txt
└── root

#通過指定ro引數來讓兩個branch都為只讀
[email protected]:/tmp/aufs$ sudo mount -t aufs -o br=./dir0=ro:./dir1=ro none ./root
#聯合後最終的root目錄下將看到三個檔案
[email protected]:/tmp/aufs$ ls root/
001.txt  002.txt  003.txt
#其中002.txt的內容是dir0中的002.txt的內容,說明dir0的index要比dir1的index小
[email protected]:/tmp/aufs$ cat root/002.txt
dir0

#由於是隻讀掛載,所以touch失敗
[email protected]:/tmp/aufs$ touch root/001.txt
touch: cannot touch 'root/001.txt': Read-only file system
[email protected]:/tmp/aufs$ touch root/003.txt
touch: cannot touch 'root/003.txt': Read-only file system

#但是我們可以跳過root目錄來修改001.txt和003.txt,
#因為跳過了root目錄,所以就不受aufs控制
[email protected]:/tmp/aufs$ touch dir0/001.txt
[email protected]:/tmp/aufs$ touch dir1/003.txt

#我們還能在下面的目錄中建立新的檔案
[email protected]:/tmp/aufs$ touch dir1/004.txt
#新建立的檔案能及時的反應到掛載點上去
[email protected]:/tmp/aufs$ ls ./root/
001.txt  002.txt  003.txt  004.txt

#刪除該檔案,以免影響後續的演示
[email protected]:/tmp/aufs$ rm ./dir1/004.txt

從上面的演示可以看出,我們可以跳過掛載點直接讀寫底層的目錄,這樣就不受aufs的控制,但我們修改的內容(dir1裡面建立的004.txt)還是能在掛載點下看到,這是因為aufs在訪問檔案時,預設的做法是如果最上層目錄裡面沒這個檔案,就一層一層的往下找,所以下層有變動的話,aufs會自動發現。控制這種行為的引數為“udba”,有興趣可以參考幫助文件

由於訪問一個檔案時需要一級一級往下找,所以如果聯合的目錄(層級)過多的話,會影響效能

讀寫掛載

如果聯合的資料夾有寫的許可權,那麼所有的修改都會寫入可寫的那個資料夾,如果可寫的資料夾有多個,那麼寫入哪個資料夾就依賴於相應的策略,有round-robin、最多剩餘空間等,詳情請參考幫助文件中的“create”引數,這裡不做介紹。

[email protected]:/tmp/aufs$ sudo umount ./root
#dir0具有讀寫許可權,dir1為只讀許可權
[email protected]:/tmp/aufs$ sudo mount -t aufs -o br=./dir0=rw:./dir1=ro none ./root
[email protected]:/tmp/aufs$ echo "root->write" >> ./root/001.txt
[email protected]:/tmp/aufs$ echo "root->write" >> ./root/002.txt
[email protected]:/tmp/aufs$ echo "root->write" >> ./root/003.txt
[email protected]:/tmp/aufs$ echo "root->write" >> ./root/005.txt

#跟開始前相比,dir0目錄下多了003.txt和005.txt,其它的保持不變
[email protected]:/tmp/aufs$ ls ./root/
001.txt  002.txt  003.txt  005.txt
[email protected]:/tmp/aufs$ ls ./dir0/
001.txt  002.txt  003.txt  005.txt
[email protected]:/tmp/aufs$ ls ./dir1/
002.txt  003.txt

#再來看看內容,dir1裡面的內容保持不變
[email protected]:/tmp/aufs$ cat ./dir1/002.txt
dir1
[email protected]:/tmp/aufs$ cat ./dir1/003.txt
dir1

#dir0下的檔案內容都變了
[email protected]:/tmp/aufs$ cat ./dir0/001.txt
dir0
root->write
[email protected]:/tmp/aufs$ cat ./dir0/002.txt
dir0
root->write
[email protected]:/tmp/aufs$ cat ./dir0/003.txt
dir1
root->write
[email protected]:/tmp/aufs$ cat ./dir0/005.txt
root->write
  • 當建立一個新檔案的時候,新的檔案會寫入具有rw許可權的那個目錄,如果有多個目錄具有rw許可權,那麼依賴於掛載時配置的的建立策略

  • 當修改一個具有rw許可權目錄下的檔案時,直接修改該檔案

  • 當修改一個只有ro許可權目錄下的檔案時,aufs會先將該檔案拷貝到一個rw許可權的目錄裡面,然後在上面進行修改,這就是所謂的COW(copy on write),拷貝的速度依賴於底層branch所在的檔案系統。

從上面可以看出,COW對於大檔案來說,效能還是很低的,同時也會佔用很多的空間,但由於只需要在第一次修改的時候拷貝一次,所以很多情況下還是能接受。

刪除檔案

刪除檔案時,如果該檔案只在rw目錄下有,那就直接刪除rw目錄下的該檔案,如果該檔案在ro目錄下有,那麼aufs將會在rw目錄裡面建立一個.wh開頭的檔案,標識該檔案已被刪除

#通過aufs刪除所有檔案
[email protected]:/tmp/aufs$ rm ./root/001.txt ./root/002.txt ./root/003.txt ./root/005.txt

#dir0下的檔案全被刪除了,但dir1目錄下的檔案沒動
[email protected]:/tmp/aufs$ tree
.
├── dir0
├── dir1
│   ├── 002.txt
│   └── 003.txt
└── root

#通過-a引數來看看dir0目錄下的內容
#可以看到aufs為002.txt和003.txt新建了兩個特殊的以.wh開頭的檔案,
#用來表示這兩個檔案已經被刪掉了
#這裡其他.wh開頭的檔案都是aufs用到的一些屬性檔案
[email protected]:/tmp/aufs$ ls ./dir0/ -a
.  ..  .wh.002.txt  .wh.003.txt  .wh..wh.aufs  .wh..wh.orph  .wh..wh.plnk

結束語

這裡只介紹了aufs的基本功能,其它的高階配置項沒有涉及,比如動態的增加和刪除branch等。

使用aufs時,建議參考livecd及docker的使用方式,就是將所有的目錄都以只讀的方式和一個支援讀寫的空目錄聯合起來,這樣所有的修改都會存到那個指定的空目錄中,不用之後刪除掉那個目錄就可以了,並且在使用的過程中不要繞過aufs直接操作底層的branch,也不要動態的增加和刪除branch,如果把使用場景弄得太複雜,由於aufs裡面的細節很多,很有可能會由於對aufs的理解不深而踩坑。

參考

相關推薦

Linux檔案系統aufs

aufs的全稱是advanced multi-layered unification filesystem,主要功能是把多個資料夾的內容合併到一起,提供一個統一的檢視,主要用於各個Linux發行版的livecd中,以及docker裡面用來組織image。 據說由於auf

linux 檔案系統superblock

為了實際測試這個pagecache和對裸盤操作的區別,我一不小心敲錯命令,將一個磁碟的super_block給抹掉了,全是0, dd if =/dev/zero of=/dev/sda2 bs=4096 count=1 seek=2234789 2234789是我的某個測試檔案的

Linux檔案系統許可權體系

目錄 ①檔案屬性mode 什麼是檔案的許可權: >>>Linux一切皆檔案,多個使用者登入作業系統,系統有預設檔案,root檔案,每個使用者也有自己的檔案,此時需要對檔案系統進行       

Linux檔案系統使用者與組管理

目錄 ①使用者與組管理之重要檔案 (1)/etc/passwd (2)/etc/shadow (3)/etc/login.defs (4)/etc/skel (目錄) (5)/etc/de

Linux檔案系統壓縮資料&歸檔資料(打包)

目錄 ①Linux檔案壓縮工具 工具 檔案拓展名 gzip .gz bzip2 .bz2 zip

Docker基礎 檔案系統AUFS

為了更好的理解docker,除了namespace和cgroups之外,在docker中如何進行儲存檔案也是需要進行進一步理解的。在docker中叫做storage driver,在本文中將會介紹一下docker最早支援的storage driver的AUFS,並在ubuntu上簡單模擬AUFS

Linux檔案系統hard link&symbol link

引自:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/ 這個圖很清楚的表示出硬連結和軟連結的方式。 1.硬連結:

Linux檔案系統FHS

一、FSH簡介     FHS是Filesystem Hierarchy Standard的縮寫,目前絕大多數Linux版本採用這種檔案組織形式 二 、FSH下的標準目錄簡介     1./boot:引導檔案存放目錄,核心檔案(vmlinuz)、引導載入器(b

linux檔案系統mount流程分析

本質上,Ext3 mount的過程實際上是inode被替代的過程。例如,/dev/sdb塊裝置被mount到/mnt/alan目錄。那麼mount這個過程所需要解決的問題就是將/mnt/alan的dentry目錄項所指向的inode遮蔽掉,然後重新定位到/dev/sdb所

Docker基礎:檔案系統AUFS

為了更好的理解docker,除了namespace和cgroups之外,在docker中如何進行儲存檔案也是需要進行進一步理解的。在docker中叫做storage driver,在本文中將會介紹

Linux檔案系統元資料

日誌檔案系統(journaling file systems)可防止系統崩潰時導致的資料不一致問題。對檔案系統元資料(metadata)的更改都被儲存在一份單獨的日誌裡,當發生系統崩潰時可以根據日誌正確地恢復資料。除此

linux檔案系統Inode

檔名 -> inode -> device block  轉自:http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一、inode是什麼? 理解inode,要從檔案儲存說起。 檔

linux檔案系統i節點詳解

0塊:引導塊,每塊1024B 1塊:超級塊 2塊:i節點點陣圖 3塊:邏輯塊點陣圖 4...18:i節點區塊 19塊:資料塊,剛好和Linux檔案系統分析之二中提到的資料塊開始於第19塊吻合。 下面分析第一個i節點,它位於塊號為4的塊中,即是第五塊了。 00001000h: ED 41 00 00 80

Linux 檔案系統入門必看!

在 Linux 中,最直觀、最可見的部分就是 `檔案系統(file system)`。下面我們就來一起探討一下關於 Linux 中國的檔案系統,系統呼叫以及檔案系統實現背後的原理和思想。這些思想中有一些來源於 MULTICS,現在已經被 Windows 等其他作業系統使用。Linux 的設計理念就是 `小的就

Linux系統"皮毛系列"(二) Linux檔案系統的簡介

一、Linux檔案系統 1、檔案系統簡介 Linux系統的理念是:一切都是檔案。 其實這個是Unix系統的哲學思想,而Linux是由Unix系統而來,所以也繼承了這個思想: Unix系統把一切資源都看作是檔案,包括硬體裝置。硬體所形成的檔案,通常稱為裝置檔案。這樣使用者

Linux檔案系統分析二(超級塊,i節點點陣圖和邏輯塊點陣圖)

第二個扇區和第一個扇區一樣屬於引導塊,這裡就不列舉出其內容了,這裡的一塊是兩個扇區即1024B。接下來的一塊就是大名鼎鼎的超級塊了。其內容如下:00000400h: E0 01 A0 05 01 00 01 00 13 00 00 00 00 1C 08 10 ; ??..

Linux---cifs檔案系統samba的安裝配置及共享目錄

CIFS是一種通用網路檔案系統,主要用於網路裝置之間的檔案共享。CIFS可以在linux系統和windows系統之間共享檔案,因此這種檔案系統主要用於客戶端是windows系統。提供CIFS的服務是SAMBA,下文將介紹SAMBA服務的一些配置以及用法。

linux記憶體檔案系統指南

記憶體檔案系統使用及示例:ramdisk, ramfs, tmpfs  第一部分 在Linux中可以將一部分記憶體mount為分割槽來使用,通常稱之為RamDisk。  RamDisk有三種實現方式:  第一種就是傳統意義上的,可以格式化,然後載入。  這在Linux核心2.0/2.2就已經支援,其不足之

Linux檔案系統(五)---三大緩衝區buffer塊緩衝區

在檔案系統中,有三大緩衝為了提升效率:inode緩衝區、dentry緩衝區、塊緩衝。 (核心:2.4.37) 二、塊buffer緩衝區 0、整體來說,Linux 檔案緩衝區分為page cache和buffer cache,每一個 page cache 包含若

Linux檔案系統--AUFS

Linux檔案系統–AUFS 檢查是否支援aufs 由於aufs的可維護性差,所以許多Linux的發行版本並沒有將aufs編譯進核心中,使用如下命令檢視是夠支援aufs。(Ubuntu 16.04) [email protected]:~$ gre