1. 程式人生 > >Docker基礎 文件系統之AUFS

Docker基礎 文件系統之AUFS

pac 引導 ted .html 必須 edi number 特性 etc

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

Storage driver

docker除了支持AUFS,還支持DeviceMapper等多種storage driver。

StorageDriver
OverlayFS: overlay or overlay2
AUFS : aufs
Btrfs : btrfs
Device Mapper: devicemapper
VFS : vfs
ZFS : zfs

什麽是AUFS

AUFS是一種Union File System, 它是Docker最早支持的storage driver。因為使用的時間也較長了,雖然還是不太習慣這個所謂的長的概念,docker從最初只支持AUFS一種,目前已經到支持上面6種FS,成長的速度飛快。最初使用docker的實踐者們已經在實際環境中開始使用AUFS了,而且也有較強的社區支持。

Linux的文件系統

Linux的文件系統一般由bootfs和rootfs組成。

技術分享圖片

類型說明
bootfs bootfs主要用於引導和加載內核,為什麽和filesystem有關呢,在引導之前需要mount文件系統,kernel加載之後就可以功成身退了。在作linux的系統引導盤或者進行恢復的時候,你能清晰地看到這一點,在前面其他的文章中已經有過講解,不再贅述。
rootfs 典型的linux啟動之後標準的/dev /proc /bin /etc /usr/ /tmp等等都被包含在rootfs中

簡單總結為bootfs在用linux的時候不出問題是意識不到的,rootfs在linux啟動之後我們無時無刻不在與之打交道。

AUFS的特點

簡單的來說,AUFS能將一臺機器上的多個目錄或文件,以聯合的方式提供統一視圖進行管理。下面是它的一些特點

  • 最早docker所支持的storage driver
  • 使用這種方式,container啟動速度較快
  • 存儲和內存的使用效率較高
  • 支持COW(copy-on-write)
  • 所有的文件和目錄以及掛載點都必須在同一臺機器上
  • AUFS遲遲不能加入到linux內核主線之中,目前流行的發型版只有ubuntu支持AUFS
  • docker的layer較深時效率較為低下
  • 因為AUFS是文件級別的動作方式,單個文件很大時,性能和效率不是特別理想

AUFS在docker中的使用

下面這張圖顯示了ubuntu的鏡像是如何用AUFS聯合到一起的。

技術分享圖片

AUFS把每個目錄都作為一個AUFS branch,整整齊齊的垛在一起,在最上面提供了一個統一的視圖union mount point進行管理。

Ubuntu下AUFS的演示

演示用ubuntu版本

root@ubuntu:~# uname -a
Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@ubuntu:~#
  • 1
  • 2
  • 3

事前準備

準備聯合用的目錄bootfs

root@ubuntu:~# mkdir -p /tmp/testrootfs/etc /tmp/testrootfs/bin /tmp/testrootfs/tmp /tmp/testrootfs/proc
root@ubuntu:~#
  • 1
  • 2
root@ubuntu:~# mkdir -p /tmp/testaufs/readonlydir
root@ubuntu:~# mkdir -p /tmp/testaufs/readwritedir/
root@ubuntu:~# touch /tmp/testaufs/readonlydir/readonlyfile.txt
root@ubuntu:~# touch /tmp/testaufs/readwritedir/readwritefile.txt
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5

準備掛載點

root@ubuntu:~# mkdir -p /tmp/aufsmnt
  • 1

掛載點事前確認

root@ubuntu:~# ll /tmp/aufsmnt
total 8
drwxr-xr-x  2 root root 4096 Sep 22 09:30 ./
drwxrwxrwt 17 root root 4096 Sep 22 09:30 ../
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5

掛載

使用AUFS進行掛載

root@ubuntu:/# mount -t aufs -o br=/tmp/testaufs/readonlydir=ro:/tmp/testrootfs=ro:/tmp/testaufs/readwritedir/=rw none /tmp/aufsmnt
root@ubuntu:/#
  • 1
  • 2
OptionOption說明
-t filesystem類型
-o mount傳遞給文件系統的參數
br 掛載對象的文件夾
ro/rw 指定文件的權限只讀和可讀寫
device 沒有設備所以用none表示

掛載後確認

total 24
drwxr-xr-x  8 root root 4096 Sep 22 09:29 ./
drwxrwxrwt 17 root root 4096 Sep 22 09:30 ../
drwxr-xr-x  2 root root 4096 Sep 22 09:26 bin/
drwxr-xr-x  2 root root 4096 Sep 22 09:26 etc/
drwxr-xr-x  2 root root 4096 Sep 22 09:26 proc/
-rw-r--r--  1 root root    0 Sep 22 09:29 readonlyfile.txt
-rw-r--r--  1 root root    0 Sep 22 09:29 readwritefile.txt
drwxr-xr-x  2 root root 4096 Sep 22 09:26 tmp/
root@ubuntu:/#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

確認只讀

root@ubuntu:/# echo "hello world" >/tmp/aufsmnt/readonlyfile.txt
-su: /tmp/aufsmnt/readonlyfile.txt: Read-only file system
root@ubuntu:/#
  • 1
  • 2
  • 3

ro方式的文件,是不能寫的

確認可寫

root@ubuntu:/# echo "hello world" > /tmp/aufsmnt/readwritefile.txt
root@ubuntu:/# cat /tmp/aufsmnt/readwritefile.txt
hello world
root@ubuntu:/#
  • 1
  • 2
  • 3
  • 4

rw方式的文件,是可寫的

耐著性子看完本篇之後,結合前面的一些namespace和cgroups的例子,再結合busybox這把小巧的武器,是不是突然發現只用linux內核功能也能做到docker雛形的特性了。雖然重復造輪子不是我們的目的,研究一下人家輪子的原理能拆能裝才是一個藍領工人應有的技能。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智能的隊伍中來!https://www.cnblogs.com/captainbed

Docker基礎 文件系統之AUFS