1. 程式人生 > 其它 >OverlayFS初識以及使用 DOCKER儲存驅動之OVERLAYFS簡介

OverlayFS初識以及使用 DOCKER儲存驅動之OVERLAYFS簡介

參考----> https://www.cnblogs.com/arnoldlu/p/13055501.html

 

測試環境:Linux al-B250-HD3 4.15.0-99-generic #100~16.04.1-Ubuntu SMP Wed Apr 22 23:56:30 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

1. OverlayFS介紹

OverlayFS是一種堆疊檔案系統,它依賴並建立在其它的檔案系統智商,不直接參與磁碟空間結構的劃分,僅將原來檔案系統中不同目錄和檔案進行“合併”。

因此OverlayFS更像是一個粘合劑,輸出多個檔案系統目錄的“合集”。

1.1 OverlayFS應用

1.1.1 Overlay Driver

1.1.2 Overlay Driver2

2. OverlayFS分析

2.1 核心配置開啟OverlayFS

File systems->Overlay filesystem support

 

2.2 OverlayFS架構分析

使能CONFIG_OVERLAY_FS之後,OverlayFS相關程式碼如下:

fs/overlayfs/
├── copy_up.c
├── dir.c
├── inode.c
├── Kconfig
├── Makefile
├── overlayfs.h
├── readdir.c
└── super.c

相關幫助檔案在Documentation/filesystems/overlayfs.txt。

3. OverlayFS掛載

掛載一個overlay檔案系統,可以通過mount -t overlay -o <options> overlay <mount point>來實現。

<mount point>是最終overlay的掛載點。

其中overlay的options有如下:

  • lowerdir=<dir>:指定使用者需要掛載的lower層目錄,lower層支援多個目錄,用“:”間隔,優先順序依次降低。最多支援500層。
  • upperdir=<dir>:指定使用者需要掛載的upper層目錄,upper層優先順序高於所有的lower層目錄。
  • workdir=<dir>:指定檔案系統掛載後用於存放臨時和間接檔案的工作基礎目錄。
  • default_permissions:
  • redirect_dir=on/off:開啟或關閉redirect directory特性,開啟後可支援merged目錄和純lower層目錄的rename/renameat系統呼叫。
  • index=on/off:開啟或關閉index特性,開啟後可避免hardlink copyup broken問題。

下面將lower和upper進行overlay,掛載到merge目錄,臨時workdir為work目錄。

  mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merge

 如下同樣將lower和upper進行overlay到merge,但是merge為只讀屬性。

mount -t overlay -o lowerdir=upper:lower overlay merge

4. OverlayFS使用

在使用如上mount進行OverlayFS合併之後,遵循如下規則:

  • lowerdir和upperdir兩個目錄存在同名檔案時,lowerdir的檔案將會被隱藏,使用者只能看到upperdir的檔案。
  • lowerdir低優先順序的同目錄同名檔案將會被隱藏。
  • 如果存在同名目錄,那麼lowerdir和upperdir目錄中的內容將會合並。
  • 當用戶修改mergedir中來自upperdir的資料時,資料將直接寫入upperdir中原來目錄中,刪除檔案也同理。
  • 當用戶修改mergedir中來自lowerdir的資料時,lowerdir中內容均不會發生任何改變。因為lowerdir是隻讀的,使用者想修改來自lowerdir資料時,overlayfs會首先拷貝一份lowerdir中檔案副本到upperdir中。後續修改或刪除將會在upperdir下的副本中進行,lowerdir中原檔案將會被隱藏。
  • 如果某一個目錄單純來自lowerdir或者lowerdir和upperdir合併,預設無法進行rename系統呼叫。但是可以通過mv重新命名。如果要支援rename,需要CONFIG_OVERLAY_FS_REDIRECT_DIR。

4.1 構建測試用例

通過下面的指令碼構建測試用例。

#!/bin/sh

create() {
  mkdir -p lower/common-dir lower/lower-dir upper/common-dir upper/upper-dir merge work
  touch lower/common-dir/lower-file lower/lower-dir/lower-file upper/common-dir/upper-file upper/upper-dir/upper-file
  echo "From lower." > lower/common-file
  echo "From upper." > upper/common-file
  echo "From lower." > lower/lower-file
  echo "From upper." > upper/upper-file

  mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merge
  #mount -t overlay -o lowerdir=upper:lower overlay merge
}

delete() {
  umount merge
  rm -rf lower upper merge work
}

case $1 in
  create)
    create
    ;;
  delete)
    delete
    ;;
esac

通過sudo ./overlayfs_test.sh create/delete建立測試環境或者清空。

如上的指令碼構建的OverlayFS結果如下:兩者共同目錄common-dir內容進行了合併;重複檔案common-file為uppderdir中的common-file。

 目錄結構如下:

├── lower
│   ├── common-dir
│   │   └── lower-file
│   ├── common-file
│   ├── lower-dir
│   │   └── lower-file
│   └── lower-file
├── merge
│   ├── common-dir
│   │   ├── lower-file
│   │   └── upper-file
│   ├── common-file
│   ├── lower-dir
│   │   └── lower-file
│   ├── lower-file
│   ├── upper-dir
│   │   └── upper-file
│   └── upper-file
├── overlayfs_test.sh
├── upper
│   ├── common-dir
│   │   └── upper-file
│   ├── common-file
│   ├── upper-dir
│   │   └── upper-file
│   └── upper-file
└── work
    └── work [error opening dir]

4.2 新增檔案或目錄

分別在merge下建立new-dir、new-file、common-dir/new-file、lower-dir/new-file。

1 2 sudo mkdir merge/new-dir sudo touch merge/new-file merge/common-dir/new-file merge/lower-dir/new-file

檢視結果如下:

.
├── lower
│   ├── common-dir
│   │   └── lower-file
│   ├── common-file
│   ├── lower-dir
│   │   └── lower-file
│   └── lower-file
├── merge
│   ├── common-dir
│   │   ├── lower-file
│   │   ├── new-file
│   │   └── upper-file
│   ├── common-file
│   ├── lower-dir
│   │   ├── lower-file
│   │   └── new-file
│   ├── lower-file
│   ├── new-dir
│   ├── new-file
│   ├── upper-dir
│   │   └── upper-file
│   └── upper-file
├── overlayfs_test.sh
├── upper
│   ├── common-dir
│   │   ├── new-file
│   │   └── upper-file
│   ├── common-file
│   ├── lower-dir
│   │   └── new-file
│   ├── new-dir
│   ├── new-file
│   ├── upper-dir
│   │   └── upper-file
│   └── upper-file
└── work
    └── work [error opening dir]

可以看出lower目錄沒有發生變化,在upper中新增lower-dir/new-file。其他所有的新增檔案也都在upper中。

4.3 修改檔案或目錄

修改common-dir/lower-file、common-dir/upper-file、lower-dir/lower-file、upper-dir/upper-file、重新命名lower-dir為new-dir。

vi將內容改成"new":
  merge/common-dir/upper-file
  merge/common-dir/lower-file
  merge/lower-dir/lower-file
  merge/upper-dir/upper-file
  merge/common-file

sudo mv merge/lower-dir merge/new-dir

結果如下:

.
├── lower
│   ├── common-dir
│   │   └── lower-file
│   ├── common-file
│   ├── lower-dir
│   │   └── lower-file
│   └── lower-file
├── merge
│   ├── common-dir
│   │   ├── lower-file
│   │   └── upper-file
│   ├── common-file
│   ├── lower-file
│   ├── new-dir
│   │   └── lower-file
│   ├── upper-dir
│   │   └── upper-file
│   └── upper-file
├── overlayfs_test.sh
├── upper
│   ├── common-dir
│   │   ├── lower-file
│   │   └── upper-file
│   ├── common-file
│   ├── lower-dir
│   ├── new-dir
│   │   └── lower-file
│   ├── upper-dir
│   │   └── upper-file
│   └── upper-file
└── work
    └── work [error opening dir]

同樣lower中檔案沒有發生修改,所有修改都在upper中產生。

其中修改了upper/common-dir/upper-file、common-file、upper-dir/upper-file,新增了common-dir/lower-file、new-dir/lower-file、lower-dir。

其中new-dir/lower-file是由lower-dir/lower-file檔案件重新命名而來的,新增lower-dir是一個特殊檔案。

c--------- 1 root root 0, 0 6月   8 14:17 upper/lower-dir

Overlayfs針對這種場景設計了一套“障眼法”——Whiteout檔案。Whiteout檔案在使用者刪除檔案時建立,用於遮蔽底層的同名檔案,同時該檔案在merge中是不可見的,所以使用者就看不到被刪除的檔案或目錄了。

whiteout檔案並非普通檔案,而是主次裝置號都為0的字元裝置(可以通過"mknod <name> c 0 0"命令手動建立),當用戶在merge中通過ls命令(將通過readddir系統呼叫)檢查父目錄的目錄項時,overlayfs會自動過過濾掉和whiteout檔案自身以及和它同名的lower層檔案和目錄,達到了隱藏檔案的目的,讓使用者以為檔案已經被刪除了。

4.4 刪除檔案或目錄

刪除所有merge中的目錄和檔案。

sudo rm -rf merge/*

結果如下:

.
├── lower
│   ├── common-dir
│   │   └── lower-file
│   ├── common-file
│   ├── lower-dir
│   │   └── lower-file
│   └── lower-file
├── merge
├── overlayfs_test.sh
├── upper
│   ├── common-dir
│   ├── common-file
│   ├── lower-dir
│   └── lower-file
└── work
    └── work [error opening dir]

可以看出所有upper中的目錄和檔案被刪除了,所有lower中目錄和檔案都有對應的whiteout對應檔案。

 

參考文件:《深入理解overlayfs(一):初識》、《深入理解overlayfs(二):使用與原理分析》、《OverlayFS》、《DOCKER儲存驅動之OVERLAYFS簡介》。