aufs文件系统

89 篇文章 1 订阅
84 篇文章 4 订阅

http://aufs.sourceforge.net/ linux 内核版本对应aufs版本说明

aufs是一种实现了联合挂载(union mount)的文件系统,同unionfs类似,它能够将不同类型的文件系统透明地层叠在一起,实现一个高效的分层文件系统。说白了aufs就是能将不同的目录挂载到某一目录下,并将各个源目录下的内容联合到目标目录下,这里每个源目录对应aufs中的一层,用户在目标目录读写时,感觉不到此目录是联合而来的。aufs中的每一层都可以有不同的权限(只读,读写),这个特性使得它在很多开源项目中有应用,比如Knoppix,Live CD, Docker等等。

Linux上unionfs的实现依托了VFS设计的灵活性,从架构上看,它在VFS的下层,在具体文件系统(如ext3, ext4等)的上层。系统调用read()/write()落在VFS上,VFS找到待操作文件的inode(unionfs inode),经过unionfs的路由后找到真实文件的inode,执行操作。这是一个hook的过程。具体实现可以参考这两篇关于unionfs实现的文章:Part1, Part2。

aufs默认没有合入内核,据说被拒绝多次,此生无望。debian下可以通过apt安装:

#apt-cache search aufs
#apt-get install -y aufs-tools
#dpkg -l | grep aufs-tools
ii aufs-tools 1:4.1+20161219-1 amd64 Tools to manage aufs filesystems

#mkdir tes1 tes2 tes3
#echo “0000000000” > tes1/te.txt
#echo “22222222222” > tes2/te2.txt
#tree 可查看树状图

#sudo /bin/mount -t aufs -o dirs=./tes1:./tes2 aufs ./tes3

aufs里每个源目录都是一个branch,挂载过程就是对不同branch进行联合操作,当不同分支内容相同时,上层覆盖下层。mount命令中,-t表示目标文件系统类型,-o表示挂载参数, none表示挂载的不是设备文件。这些都是mount命令的参数。br是aufs的参数,表示分支,多个分支之间用冒号(:)分隔,由于分支之间在逻辑上是层叠的,因此声明在前的表示逻辑上层,声明在后的表示逻辑上层,示例中a目录覆盖b目录。mount命令执行后,当前文件系统状态如下:

#mount -v
aufs on /home/user/temp/tes3 type aufs (rw,relatime,si=9f93b5fe71432108)
同时使用tree 查看可见,tes1,tes2目录的内容都被联合到tes3目录下,此时tes3目录就是一个aufs文件系统类型的挂载点,从df命令也可以验证。

linux kernel versionaufs version
4.14 and later**aufs5 Currently aufs5 supports these kernels. aufs4 Currently aufs4 supports these kernels.见下方的4.14版本及以上linux内核版本支持aufs4以及aufs5的状态图
4.9 … 4.13aufs4 ----Unsupported since Aug 2018
4.4 … 4.8aufs4— Unsupported since Sep 2017
4.1 … 4.3aufs4 —Unsupported since Mar 2017
4.0aufs4— Unsupported since Aug 2016
3.18 … 3.19aufs3 —Unsupported since Aug 2016
3.14 … 3.17aufs3 Unsupported since Oct 2015
3.9 … 3.13aufs3 Unsupported since Jan 2015
3.2, 3.2.x, 3.4 and 3.8aufs3 Unsupported since Nov 2013
3.6 and 3.7aufs3 Unsupported since Aug 2013
3.0, 3.1, 3.3 and 3.5aufs3 Unsupported since Apr 2013
2.6.35 … 2.6.39aufs2.2 Unsupported since Oct 2012
2.6.31 … 2.6.34-aufs2.1 Unsupported since Aug 2011-
2.6.27 … 2.6.30aufs2 Unsupported since Sep 2010 Started in Feb 2009
2.6.25 … 2.6.27aufs1(fs/aufs25)
2.6.16 … 2.6.24aufs1(fs/aufs) Started late in 2005 and made widely public in early summer in2006
2.6.15 and earlieraufs1(fs/aufs) Untested, but some of users tried and succeeded
Note1: aufs1 is NOT maintained since Jan 2009.Note2: packages called aufs2-base were temporary trasition releases and are NOT maintained either.

4.14版本及以上linux内核版本支持aufs4以及aufs5的状态图:在这里插入图片描述
在这里插入图片描述

aufs manual for aufs5.x-rcN

Contributions

Aufs5 – advanced multi layered unification filesystem version 5.x
http://aufs.sf.net
Junjiro R. Okajima

  1. Introduction

In the early days, aufs was entirely re-designed and re-implemented
Unionfs Version 1.x series. Adding many original ideas, approaches,
improvements and implementations, it became totally different from
Unionfs while keeping the basic features.
Later, Unionfs Version 2.x series began taking some of the same
approaches to aufs1’s.
Unionfs was being developed by Professor Erez Zadok at Stony Brook
University and his team.

Aufs5 supports linux-v5.0 and later, If you want older kernel version
support,

  • for linux-v4.x series, try aufs4-linux.git or aufs4-standalone.git
  • for linux-v3.x series, try aufs3-linux.git or aufs3-standalone.git
  • for linux-v2.6.16 and later, try aufs2-2.6.git, aufs2-standalone.git
    or aufs1 from CVS on SourceForge.

Note: it becomes clear that “Aufs was rejected. Let’s give it up.”
According to Christoph Hellwig, linux rejects all union-type
filesystems but UnionMount.
http://marc.info/?l=linux-kernel&m=123938533724484&w=2

PS. Al Viro seems have a plan to merge aufs as well as overlayfs and
UnionMount, and he pointed out an issue around a directory mutex
lock and aufs addressed it. But it is still unsure whether aufs will
be merged (or any other union solution).
http://marc.info/?l=linux-kernel&m=136312705029295&w=1

  1. Features

  • unite several directories into a single virtual filesystem. The member
    directory is called as a branch.
  • you can specify the permission flags to the branch, which are ‘readonly’,
    ‘readwrite’ and ‘whiteout-able.’
  • by upper writable branch, internal copyup and whiteout, files/dirs on
    readonly branch are modifiable logically.
  • dynamic branch manipulation, add, del.
  • etc…

Also there are many enhancements in aufs, such as:

  • test only the highest one for the directory permission (dirperm1)
  • copyup on open (coo=)
  • ‘move’ policy for copy-up between two writable branches, after
    checking free space.
  • xattr, acl
  • readdir(3) in userspace.
  • keep inode number by external inode number table
  • keep the timestamps of file/dir in internal copyup operation
  • seekable directory, supporting NFS readdir.
  • whiteout is hardlinked in order to reduce the consumption of inodes
    on branch
  • do not copyup, nor create a whiteout when it is unnecessary
  • revert a single systemcall when an error occurs in aufs
  • remount interface instead of ioctl
  • maintain /etc/mtab by an external command, /sbin/mount.aufs.
  • loopback mounted filesystem as a branch
  • kernel thread for removing the dir who has a plenty of whiteouts
  • support copyup sparse file (a file which has a ‘hole’ in it)
  • default permission flags for branches
  • selectable permission flags for ro branch, whether whiteout can
    exist or not
  • export via NFS.
  • support /fs/aufs and /aufs.
  • support multiple writable branches, some policies to select one
    among multiple writable branches.
  • a new semantics for link(2) and rename(2) to support multiple
    writable branches.
  • no glibc changes are required.
  • pseudo hardlink (hardlink over branches)
  • allow a direct access manually to a file on branch, e.g. bypassing aufs.
    including NFS or remote filesystem branch.
  • userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX.
  • and more…

Currently these features are dropped temporary from aufs5.
See design/08plan.txt in detail.

  • nested mount, i.e. aufs as readonly no-whiteout branch of another aufs
    (robr)
  • statistics of aufs thread (/sys/fs/aufs/stat)

Features or just an idea in the future (see also design/*.txt),

  • reorder the branch index without del/re-add.
  • permanent xino files for NFSD
  • an option for refreshing the opened files after add/del branches
  • light version, without branch manipulation. (unnecessary?)
  • copyup in userspace
  • inotify in userspace
  • readv/writev
  1. Download

There are three GIT trees for aufs5, aufs5-linux.git,
aufs5-standalone.git, and aufs-util.git. Note that there is no “5” in
“aufs-util.git.”
While the aufs-util is always necessary, you need either of aufs5-linux
or aufs5-standalone.

The aufs5-linux tree includes the whole linux mainline GIT tree,
git://git.kernel.org/…/torvalds/linux.git.
And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot
build aufs5 as an external kernel module.
Several extra patches are not included in this tree. Only
aufs5-standalone tree contains them. They are described in the later
section “Configuration and Compilation.”

On the other hand, the aufs5-standalone tree has only aufs source files
and necessary patches, and you can select CONFIG_AUFS_FS=m.
But you need to apply all aufs patches manually.

You will find GIT branches whose name is in form of “aufs5.x” where “x”
represents the linux kernel version, “linux-5.x”. For instance,
“aufs5.0” is for linux-5.0. For latest “linux-5.x-rcN”, use
“aufs5.x-rcN” branch.

o aufs5-linux tree
$ git clone --reference /your/linux/git/tree
git://github.com/sfjro/aufs5-linux.git aufs5-linux.git

  • if you don’t have linux GIT tree, then remove “–reference …”
    $ cd aufs5-linux.git
    $ git checkout origin/aufs5.0

Or You may want to directly git-pull aufs into your linux GIT tree, and
leave the patch-work to GIT.
$ cd /your/linux/git/tree
$ git remote add aufs5 git://github.com/sfjro/aufs5-linux.git
$ git fetch aufs5
$ git checkout -b my5.0 v5.0
$ (add your local change…)
$ git pull aufs5 aufs5.0

  • now you have v5.0 + your_changes + aufs5.0 in you my5.0 branch.
  • you may need to solve some conflicts between your_changes and
    aufs5.0. in this case, git-rerere is recommended so that you can
    solve the similar conflicts automatically when you upgrade to 5.1 or
    later in the future.

o aufs5-standalone tree
$ git clone git://github.com/sfjro/aufs5-standalone.git aufs5-standalone.git
$ cd aufs5-standalone.git
$ git checkout origin/aufs5.0

o aufs-util tree
$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git

  • note that the public aufs-util.git is on SourceForge instead of
    GitHUB.
    $ cd aufs-util.git
    $ git checkout origin/aufs5.0

Note: The 5.x-rcN branch is to be used with `rc’ kernel versions ONLY.
The minor version number, ‘x’ in ‘5.x’, of aufs may not always
follow the minor version number of the kernel.
Because changes in the kernel that cause the use of a new
minor version number do not always require changes to aufs-util.

Since aufs-util has its own minor version number, you may not be
able to find a GIT branch in aufs-util for your kernel’s
exact minor version number.
In this case, you should git-checkout the branch for the
nearest lower number.

For (an unreleased) example:
If you are using “linux-5.10” and the “aufs5.10” branch
does not exist in aufs-util repository, then “aufs5.9”, “aufs5.8”
or something numerically smaller is the branch for your kernel.

Also you can view all branches by
$ git branch -a

  1. Configuration and Compilation

Make sure you have git-checkout’ed the correct branch.

For aufs5-linux tree,

  • enable CONFIG_AUFS_FS.
  • set other aufs configurations if necessary.

For aufs5-standalone tree,
There are several ways to build.

  • apply ./aufs5-kbuild.patch to your kernel source files.
  • apply ./aufs5-base.patch too.
  • apply ./aufs5-mmap.patch too.
  • apply ./aufs5-standalone.patch too, if you have a plan to set
    CONFIG_AUFS_FS=m. otherwise you don’t need ./aufs5-standalone.patch.
  • copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your
    kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild.
  • enable CONFIG_AUFS_FS, you can select either
    =m or =y.
  • and build your kernel as usual.
  • install the built kernel.
  • install the header files too by “make headers_install” to the
    directory where you specify. By default, it is $PWD/usr.
    “make help” shows a brief note for headers_install.
  • and reboot your system.
  • module only (CONFIG_AUFS_FS=m).
  • apply ./aufs5-base.patch to your kernel source files.
  • apply ./aufs5-mmap.patch too.
  • apply ./aufs5-standalone.patch too.
  • build your kernel, don’t forget “make headers_install”, and reboot.
  • edit ./config.mk and set other aufs configurations if necessary.
    Note: You should read $PWD/fs/aufs/Kconfig carefully which describes
    every aufs configurations.
  • build the module by simple “make”.
  • you can specify ${KDIR} make variable which points to your kernel
    source tree.
  • install the files
    • run “make install” to install the aufs module, or copy the built
      $PWD/aufs.ko to /lib/modules/… and run depmod -a (or reboot simply).
    • run “make install_headers” (instead of headers_install) to install
      the modified aufs header file (you can specify DESTDIR which is
      available in aufs standalone version’s Makefile only), or copy
      $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever
      you like manually. By default, the target directory is $PWD/usr.
  • no need to apply aufs5-kbuild.patch, nor copying source files to your
    kernel source tree.

Note: The header file aufs_type.h is necessary to build aufs-util
as well as “make headers_install” in the kernel source tree.
headers_install is subject to be forgotten, but it is essentially
necessary, not only for building aufs-util.
You may not meet problems without headers_install in some older
version though.

And then,

  • read README in aufs-util, build and install it
  • note that your distribution may contain an obsoleted version of
    aufs_type.h in /usr/include/linux or something. When you build aufs
    utilities, make sure that your compiler refers the correct aufs header
    file which is built by “make headers_install.”
  • if you want to use readdir(3) in userspace or pathconf(3) wrapper,
    then run “make install_ulib” too. And refer to the aufs manual in
    detail.

There several other patches in aufs5-standalone.git. They are all
optional. When you meet some problems, they will help you.

  • aufs5-loopback.patch
    Supports a nested loopback mount in a branch-fs. This patch is
    unnecessary until aufs produces a message like “you may want to try
    another patch for loopback file”.
  • proc_mounts.patch
    When there are many mountpoints and many mount(2)/umount(2) are
    running, then /proc/mounts may not show the all mountpoints. This
    patch makes /proc/mounts always show the full mountpoints list.
    If you don’t want to apply this patch and meet such problem, then you
    need to increase the value of ‘ProcMounts_Times’ make-variable in
    aufs-util.git as a second best solution.
  • vfs-ino.patch
    Modifies a system global kernel internal function get_next_ino() in
    order to stop assigning 0 for an inode-number. Not directly related to
    aufs, but recommended generally.
  • tmpfs-idr.patch
    Keeps the tmpfs inode number as the lowest value. Effective to reduce
    the size of aufs XINO files for tmpfs branch. Also it prevents the
    duplication of inode number, which is important for backup tools and
    other utilities. When you find aufs XINO files for tmpfs branch
    growing too much, try this patch.
  • lockdep-debug.patch
    Because aufs is not only an ordinary filesystem (callee of VFS), but
    also a caller of VFS functions for branch filesystems, subclassing of
    the internal locks for LOCKDEP is necessary. LOCKDEP is a debugging
    feature of linux kernel. If you enable CONFIG_LOCKDEP, then you will
    need to apply this debug patch to expand several constant values.
    If don’t know what LOCKDEP is, then you don’t have apply this patch.
  1. Usage

At first, make sure aufs-util are installed, and please read the aufs
manual, aufs.5 in aufs-util.git tree.
$ man -l aufs.5

And then,
$ mkdir /tmp/rw /tmp/aufs

mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs

Here is another example. The result is equivalent.

mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs

Or

mount -t aufs -o br:/tmp/rw none /tmp/aufs

mount -o remount,append:${HOME} /tmp/aufs

Then, you can see whole tree of your home dir through /tmp/aufs. If
you modify a file under /tmp/aufs, the one on your home directory is
not affected, instead the same named file will be newly created under
/tmp/rw. And all of your modification to a file will be applied to
the one under /tmp/rw. This is called the file based Copy on Write
(COW) method.
Aufs mount options are described in aufs.5.
If you run chroot or something and make your aufs as a root directory,
then you need to customize the shutdown script. See the aufs manual in
detail.

Additionally, there are some sample usages of aufs which are a
diskless system with network booting, and LiveCD over NFS.
See sample dir in CVS tree on SourceForge.

  1. Contact

When you have any problems or strange behaviour in aufs, please let me
know with:

  • /proc/mounts (instead of the output of mount(8))
  • /sys/module/aufs/*
  • /sys/fs/aufs/* (if you have them)
  • /debug/aufs/* (if you have them)
  • linux kernel version
    if your kernel is not plain, for example modified by distributor,
    the url where i can download its source is necessary too.
  • aufs version which was printed at loading the module or booting the
    system, instead of the date you downloaded.
  • configuration (define/undefine CONFIG_AUFS_xxx)
  • kernel configuration or /proc/config.gz (if you have it)
  • behaviour which you think to be incorrect
  • actual operation, reproducible one is better
  • mailto: aufs-users at lists.sourceforge.net

Usually, I don’t watch the Public Areas(Bugs, Support Requests, Patches,
and Feature Requests) on SourceForge. Please join and write to
aufs-users ML.

  1. Acknowledgements

Thanks to everyone who have tried and are using aufs, whoever
have reported a bug or any feedback.

Especially donators:
Tomas Matejicek(slax.org) made a donation (much more than once).
Since Apr 2010, Tomas M (the author of Slax and Linux Live
scripts) is making “doubling” donations.
Unfortunately I cannot list all of the donators, but I really
appreciate.
It ends Aug 2010, but the ordinary donation URL is still available.
http://sourceforge.net/donate/index.php?group_id=167503
Dai Itasaka made a donation (2007/8).
Chuck Smith made a donation (2008/4, 10 and 12).
Henk Schoneveld made a donation (2008/9).
Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10).
Francois Dupoux made a donation (2008/11).
Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public
aufs2 GIT tree (2009/2).
William Grant made a donation (2009/3).
Patrick Lane made a donation (2009/4).
The Mail Archive (mail-archive.com) made donations (2009/5).
Nippy Networks (Ed Wildgoose) made a donation (2009/7).
New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11).
Pavel Pronskiy made a donation (2011/2).
Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy
Networks (Ed Wildgoose) made a donation for hardware (2011/3).
Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and
11).
Sam Liddicott made a donation (2011/9).
Era Scarecrow made a donation (2013/4).
Bor Ratajc made a donation (2013/4).
Alessandro Gorreta made a donation (2013/4).
POIRETTE Marc made a donation (2013/4).
Alessandro Gorreta made a donation (2013/4).
lauri kasvandik made a donation (2013/5).
“pemasu from Finland” made a donation (2013/7).
The Parted Magic Project made a donation (2013/9 and 11).
Pavel Barta made a donation (2013/10).
Nikolay Pertsev made a donation (2014/5).
James B made a donation (2014/7 and 2015/7).
Stefano Di Biase made a donation (2014/8).
Daniel Epellei made a donation (2015/1).
OmegaPhil made a donation (2016/1, 2018/4).
Tomasz Szewczyk made a donation (2016/4).
James Burry made a donation (2016/12).
Carsten Rose made a donation (2018/9).
Porteus Kiosk made a donation (2018/10).

Thank you very much.
Donations are always, including future donations, very important and
helpful for me to keep on developing aufs.


If you are an experienced user, no explanation is needed. Aufs is
just a linux filesystem.

Enjoy!

Local variables: ;

mode: text;

End: ;

aufs-util.git tree
README in aufs-util
Contributions
Michael S. Zick wrote good examples, and made them public.
aufs2-util.git tree (obsolete)
README in aufs2-util
Reports around aufs2
PDF Filesystems in LiveCD
Samples in aufs2-util
cluster aufs for cluster
brsync rsync between aufs branches
shwh Show Whiteout mode
auroot chroot-ed/jail environment for internet
auware aufs for VMware Appliance
vserver aufs for Linux-VServer
logrow expand the size of the mounted loopback block device
uloop loopback block device in userspace
Aufs1 (obsoleted)
README for aufs1
aufs.5 for aufs1
tips from users
history of aufs1

参考资料:
http://ju.outofmemory.cn/entry/111456

因为在mount br参数里没加读写权限,默认情况下最上层分支可读写,其他层只读,所以,在uniondir目录下创建3.txt,实际上会创建到最上层分支里(a目录):

#echo 3 > /root/test/uniondir/3.txt
#tree .
.
├── a
│ ├── 1.txt
│ └── 3.txt
├── b
│ └── 2.txt
└── uniondir
├── 1.txt
├── 2.txt
└── 3.txt

因为读写权限的不同,修改1.txt和2.txt内容对a、b的影响也不同:

#echo ‘add sth’ >> /root/test/uniondir/1.txt
#echo ‘add sth’ >> /root/test/uniondir/2.txt
#tree .
.
├── a
│ ├── 1.txt
│ ├── 2.txt
│ └── 3.txt
├── b
│ └── 2.txt
└── uniondir
├── 1.txt
├── 2.txt
└── 3.txt
#cat /root/test/a/1.txt

add sth
#cat /root/test/a/2.txt

add sth
#cat /root/test/b/2.txt

可见,对可读写分支(目录a),修改直接作用到分支上;而对于只读分支(目录b),修改操作会触发一次写时复制(COW, Copy On Write),即先将待修改文件从目录b复制到目录a,然后在目录a修改相应文件。注意写时复制机制可能在修改大文件时带来性能损耗,虽然每个文件最多只会复制一次。

最后验证下aufs文件系统的删除操作:

#rm /root/test/uniondir/*
#tree .
.
├── a
├── b
│ └── 2.txt
└── uniondir

所有的删除操作也都是在最上层的可读写层进行,目录b因为是只读层,所以不受影响。但是为什么最终的uniondir目录中不见2.txt文件呢?因为最上层对它进行了遮挡:

#ls -al /root/test/a
drwxr-xr-x 4 root root 4096 Jan 17 20:08 .
drwxr-xr-x 5 root root 4096 Jan 17 19:20 …
-r–r--r-- 2 root root 0 Jan 17 19:27 .wh.2.txt

aufs通过在上层加“.wh.+文件/目录名”的特殊标记来遮挡下层的文件。

  1. aufs在mount的时候可以指定每个分支的读写权限。比如:

#mount -t aufs -o br=a=rw:b=rw:c=ro none /root/test/uniondir

这个挂载选项指定了a分支和b分支为可读写,c目录为只读。每个分支的读写权限记录在/sys/fs/aufs/si_XXX/brNNN文件里,这里,XXX可从mount -v命令中得到,NNN从0开始,表示第一层,往上递增,依次类推。

#ls /sys/fs/aufs/si_73990447c8980254/
br0 br1 br2 xi_path
#cat /sys/fs/aufs/si_73990447c8980254/br*
/root/test/a=rw
/root/test/b=rw
/root/test/c=ro

当有两个及以上的读写层时,在aufs挂载目录中新建文件就会涉及到源目录的选择策略问题,aufs提供了create配置参数,可以指定各种策略(round-robin(rr), most−free−space(mfs), etc),默认情况下只会写到第一层可写层。另外,经过测试发现,aufs文件系统最上层一定是要可读写的,否则会造成此文件系统只读。

  1. aufs支持udba参数,用于配置是否监听源目录(branch)的变化。如果需要源目录的修改实时反应到挂载目录,设置挂载参数-o udba=reval,如果对源目录的修改不需反应到挂载目录,设置挂载参数-o udba=none。默认为reval。

aufs出于某些原因会限制层叠的分支数量,debian里默认是127层(早期是42层)。首先,层数越多,效率肯定越低。另一方面,由于/proc和sysfs文件系统中有单个文件4k大小的限制,所以依赖于此的的aufs元信息写入就会受影响,无论层次太多还是分支名称过长,都很容易达到这个限制(brs参数为0时,aufs会将所有的分支信息写入到/proc/mount文件里)。要突破这个限制,可以选择重新编译aufs模块,enable CONFIG_SYSFS和设置brs参数为1(貌似debian下的aufs包默认就是开启此功能的),并且设置合适的编译参数(kconfig中CONFIG_AUFS_BRANCH_MAX_32767=y),这种绕过的方法未经测试,理论上应该可行。

拓展阅读:

  1. aufs manpage. http://aufs.sourceforge.net/aufs3/man.html
  2. aufs changelog. http://aufs.sourceforge.net/
  3. aufs tutorial. http://www.thegeekstuff.com/2013/05/linux-aufs/
    ==============================================================
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值