码迷,mamicode.com
首页 > 其他好文 > 详细

Docker基础 文件系统之AUFS

时间:2018-12-22 11:49:28      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:对象   root   问题   lin   one   dir   ubuntu   时间   ace   

为了更好的理解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

标签:对象   root   问题   lin   one   dir   ubuntu   时间   ace   

原文地址:https://www.cnblogs.com/firsttry/p/10159913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!