From 5774bab43a1946acd8440ad759eb6cc26335e64c Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Sun, 23 Aug 2009 20:43:48 +0200 Subject: new package aufs2-util Since the aufs2 utilities seem to be available only via git, copy the current state into the src/ directory, with the samples/ directory removed. The files were intentionally left untouched, so custom changes are still kept in patch files for easier upstream sending. Using do-extract to copy the sources to the working directory has the downside of having to define an empty do-configure target (as this is not needed) but allows for using update-patches just like with any other package (which is not the case if the copying is done in a do-configure target). --- package/Config.in | 1 + package/Makefile | 1 + package/aufs2-util/Config.in | 9 + package/aufs2-util/Makefile | 33 + package/aufs2-util/patches/patch-Makefile | 33 + package/aufs2-util/src/COPYING | 340 ++++++ package/aufs2-util/src/Makefile | 103 ++ package/aufs2-util/src/README | 46 + package/aufs2-util/src/au_util.h | 67 ++ package/aufs2-util/src/aubrsync | 304 ++++++ package/aufs2-util/src/auchk | 130 +++ package/aufs2-util/src/aufs.in.5 | 1684 +++++++++++++++++++++++++++++ package/aufs2-util/src/aufs.shlib | 83 ++ package/aufs2-util/src/auplink.c | 64 ++ package/aufs2-util/src/br.c | 172 +++ package/aufs2-util/src/c2sh.c | 42 + package/aufs2-util/src/c2tmac.c | 44 + package/aufs2-util/src/compat.h | 34 + package/aufs2-util/src/mount.aufs.c | 255 +++++ package/aufs2-util/src/mtab.c | 216 ++++ package/aufs2-util/src/plink.c | 356 ++++++ package/aufs2-util/src/proc_mnt.c | 85 ++ package/aufs2-util/src/rdu.c | 749 +++++++++++++ package/aufs2-util/src/umount.aufs | 31 + 24 files changed, 4882 insertions(+) create mode 100644 package/aufs2-util/Config.in create mode 100644 package/aufs2-util/Makefile create mode 100644 package/aufs2-util/patches/patch-Makefile create mode 100644 package/aufs2-util/src/COPYING create mode 100644 package/aufs2-util/src/Makefile create mode 100644 package/aufs2-util/src/README create mode 100644 package/aufs2-util/src/au_util.h create mode 100755 package/aufs2-util/src/aubrsync create mode 100755 package/aufs2-util/src/auchk create mode 100644 package/aufs2-util/src/aufs.in.5 create mode 100644 package/aufs2-util/src/aufs.shlib create mode 100644 package/aufs2-util/src/auplink.c create mode 100644 package/aufs2-util/src/br.c create mode 100644 package/aufs2-util/src/c2sh.c create mode 100644 package/aufs2-util/src/c2tmac.c create mode 100644 package/aufs2-util/src/compat.h create mode 100644 package/aufs2-util/src/mount.aufs.c create mode 100644 package/aufs2-util/src/mtab.c create mode 100644 package/aufs2-util/src/plink.c create mode 100644 package/aufs2-util/src/proc_mnt.c create mode 100644 package/aufs2-util/src/rdu.c create mode 100755 package/aufs2-util/src/umount.aufs (limited to 'package') diff --git a/package/Config.in b/package/Config.in index f9ea0273b..c0cb91511 100644 --- a/package/Config.in +++ b/package/Config.in @@ -48,6 +48,7 @@ source "package/vim/Config.in" endmenu menu "Filesystem utilities" +source "package/aufs2-util/Config.in" source "package/dosfstools/Config.in" source "package/e2fsprogs/Config.in" source "package/fuse/Config.in" diff --git a/package/Makefile b/package/Makefile index 40850c724..9597d5269 100644 --- a/package/Makefile +++ b/package/Makefile @@ -27,6 +27,7 @@ package-$(ADK_PACKAGE_ARPD) += arpd package-$(ADK_PACKAGE_ARPWATCH) += arpwatch package-$(ADK_PACKAGE_ASTERISK) += asterisk package-$(ADK_COMPILE_ATFTP) += atftp +package-$(ADK_PACKAGE_AUFS_UTIL) += aufs2-util package-$(ADK_PACKAGE_AUTOSSH) += autossh package-$(ADK_COMPILE_AVAHI) += avahi package-$(ADK_COMPILE_AXTLS) += axtls diff --git a/package/aufs2-util/Config.in b/package/aufs2-util/Config.in new file mode 100644 index 000000000..4e3b34dcc --- /dev/null +++ b/package/aufs2-util/Config.in @@ -0,0 +1,9 @@ +config ADK_PACKAGE_AUFS_UTIL + prompt "aufs2-util........................ aufs2 utilities" + tristate + default n + select ADK_KPACKAGE_KMOD_AUFS_FS + help + Utilities for use with aufs2. + + http://aufs.sf.net diff --git a/package/aufs2-util/Makefile b/package/aufs2-util/Makefile new file mode 100644 index 000000000..4457775b9 --- /dev/null +++ b/package/aufs2-util/Makefile @@ -0,0 +1,33 @@ +# This file is part of the OpenADK project. OpenADK is copyrighted +# material, please see the LICENCE file in the top-level directory. + +include $(TOPDIR)/rules.mk + +PKG_NAME:= aufs2-util +PKG_VERSION:= 130809 +PKG_RELEASE:= 1 +PKG_DESCR:= aufs2 utilities +PKG_SECTION:= admin +PKG_URL:= http://aufs.sf.net/ + +NO_DISTFILES:= 1 + +include $(TOPDIR)/mk/package.mk + +$(eval $(call PKG_template,AUFS_UTIL,${PKG_NAME},${PKG_VERSION}-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION})) + +MAKE_FLAGS+= KDIR=${LINUX_DIR} +BUILD_STYLE= auto +INSTALL_STYLE= auto + +do-extract: + mkdir -p ${WRKBUILD} + ${CP} ./src/* ${WRKBUILD}/ + +do-configure: + +#post-install: +# $(INSTALL_DIR) $(IDIR_BASH)/bin +# $(INSTALL_BIN) $(WRKINST)/usr/bin/bash $(IDIR_BASH)/bin/ + +include ${TOPDIR}/mk/pkg-bottom.mk diff --git a/package/aufs2-util/patches/patch-Makefile b/package/aufs2-util/patches/patch-Makefile new file mode 100644 index 000000000..5cfb193c3 --- /dev/null +++ b/package/aufs2-util/patches/patch-Makefile @@ -0,0 +1,33 @@ + - explicitly use the host cc to compile c2sh and c2tmac + (using per-target local variable assignments is an elegant + way for not having to define explicit rules for the targets) + - dont try setting owner and group of installed files +--- aufs2-util-130809.orig/Makefile 2009-08-13 14:59:49.000000000 +0200 ++++ aufs2-util-130809/Makefile 2009-08-23 18:05:03.909726416 +0200 +@@ -54,6 +54,11 @@ ${Dummy}: ${LibSoObj} + ${LibSo}: ${Dummy} + ln -f $< $@ + ++c2sh c2tmac: CC = ${HOSTCC} ++c2sh c2tmac: CFLAGS="-I${KDIR}/include" ++c2sh c2tmac: LDFLAGS= ++c2sh c2tmac: CPPFLAGS= ++ + etc_default_aufs: c2sh aufs.shlib + ${RM} $@ + echo '# aufs variables for shell scripts' > $@ +@@ -86,12 +91,12 @@ install_ulib: File = ${LibSo} + install_ulib: Tgt = ${DESTDIR}/ulib + install_sbin install_ubin install_man install_ulib: ${File} + install -d ${Tgt} +- install -m 755 -o root -g root -p ${Opt} ${File} ${Tgt} ++ install -m 755 -p ${Opt} ${File} ${Tgt} + install_etc: File = etc_default_aufs + install_etc: Tgt = ${DESTDIR}/etc/default/aufs + install_etc: ${File} + install -d $(dir ${Tgt}) +- install -m 644 -o root -g root -p -T ${File} ${Tgt} ++ install -m 644 -p -T ${File} ${Tgt} + + # do not inlcude install_ulib here + install: install_man install_sbin install_ubin install_etc diff --git a/package/aufs2-util/src/COPYING b/package/aufs2-util/src/COPYING new file mode 100644 index 000000000..f90922eea --- /dev/null +++ b/package/aufs2-util/src/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/package/aufs2-util/src/Makefile b/package/aufs2-util/src/Makefile new file mode 100644 index 000000000..c7aacfc14 --- /dev/null +++ b/package/aufs2-util/src/Makefile @@ -0,0 +1,103 @@ + +# Copyright (C) 2005-2009 Junjiro Okajima +# +# This program, aufs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +ifndef KDIR +KDIR = /lib/modules/$(shell uname -r)/build +endif + +CFLAGS += -I${KDIR}/include +CFLAGS += -O -Wall + +Cmd = umount.aufs auchk aubrsync +Man = aufs.5 +Etc = etc_default_aufs +Bin = auplink mount.aufs #auctl +BinObj = $(addsuffix .o, ${Bin}) +LibSo = libau.so +LibSoObj = rdu.o +LibSoHdr = compat.h +LibUtil = libautil.a +LibUtilObj = proc_mnt.o br.o plink.o mtab.o +LibUtilHdr = au_util.h + +all: ${Man} ${Bin} ${Etc} #${LibSo} + +${Bin}: LDFLAGS += -static -s +${Bin}: LDLIBS = -L. -lautil +${BinObj}: %.o: %.c ${LibUtilHdr} ${LibUtil} + +${LibUtilObj}: %.o: %.c ${LibUtilHdr} +${LibUtil}: ${LibUtil}(${LibUtilObj}) + +${LibSoObj}: CFLAGS += -fPIC +${LibSoObj}: %.o: %.c ${LibSolHdr} + +# in order to reuse the default rule +Dummy = $(basename $(word 1,${LibSoObj})) +${Dummy}: LDFLAGS += --shared +${Dummy}: LDLIBS += -ldl -lpthread +${Dummy}: ${LibSoObj} +${LibSo}: ${Dummy} + ln -f $< $@ + +etc_default_aufs: c2sh aufs.shlib + ${RM} $@ + echo '# aufs variables for shell scripts' > $@ + ./c2sh >> $@ + echo >> $@ + sed -e '0,/^$$/d' aufs.shlib >> $@ + +aufs.5: aufs.in.5 c2tmac + ${RM} $@ + ./c2tmac > $@ + awk '{ \ + gsub(/\140[^\047]*\047/, "\\[oq]&\\[cq]"); \ + gsub(/\\\[oq\]\140/, "\\[oq]"); \ + gsub(/\047\\\[cq\]/, "\\[cq]"); \ + gsub(/\047/, "\\[aq]"); \ + print; \ + }' aufs.in.5 >> $@ + chmod a-w $@ + +.INTERMEDIATE: c2sh c2tmac + +install_sbin: File = mount.aufs umount.aufs auplink +install_sbin: Tgt = ${DESTDIR}/sbin +install_ubin: File = auchk aubrsync #auctl +install_ubin: Tgt = ${DESTDIR}/usr/bin +install_man: File = aufs.5 +install_man: Tgt = ${DESTDIR}/usr/share/man/man5 +install_ulib: Opt = -s +install_ulib: File = ${LibSo} +install_ulib: Tgt = ${DESTDIR}/ulib +install_sbin install_ubin install_man install_ulib: ${File} + install -d ${Tgt} + install -m 755 -o root -g root -p ${Opt} ${File} ${Tgt} +install_etc: File = etc_default_aufs +install_etc: Tgt = ${DESTDIR}/etc/default/aufs +install_etc: ${File} + install -d $(dir ${Tgt}) + install -m 644 -o root -g root -p -T ${File} ${Tgt} + +# do not inlcude install_ulib here +install: install_man install_sbin install_ubin install_etc + +clean: + ${RM} ${Man} ${Bin} ${Etc} ${LibUtil} ${LibSo} *~ + ${RM} ${BinObj} ${LibUtilObj} ${LibSoObj} ${Dummy} + +-include priv.mk diff --git a/package/aufs2-util/src/README b/package/aufs2-util/src/README new file mode 100644 index 000000000..1e1f45422 --- /dev/null +++ b/package/aufs2-util/src/README @@ -0,0 +1,46 @@ + +Utilities for aufs2 +http://aufs.sf.net +J. R. Okajima + +These utilities are always necessary for aufs2. +If you forget to install them, your aufs may not work correctly. +And these are not for aufs1 essentially, except aubrsync. See below in +detail. + +Makefile in this tree has some customizable make-variables. +- KDIR + specify your kernel source path if necessary +- DESTDIR + specify your install path if necessary. + some commands have to be installed under /sbin. + +o /sbin/mount.aufs, /sbin/umount.aufs + Helpers for util-linux-ng package. You should NOT invoke them + manually. Just install them by "make install". + +o /sbin/auplink + Handles aufs pseudo-link at remount/unmount time. You can invoke it + manually at anytime. + +o /usr/bin/auchk + Similar to generic fsck. Checks whether a branch is healthy or not + from aufs's point of view. + +o /usr/bin/aubrsync + Move files from the upper writable branch to the lower branch. + If you use this script with aufs1, then you need to install aufs.shlib + to /usr/lib/aufs.shlib. Currently only the 20080211 version is tested + for aufs1. + The development of this script is sponcered by ASUSTek Computer Inc. + (http://www.asus.com/). + Kindly they agreed that I keep my aufs work as free software as it has + been. + +o /etc/default/aufs + A library for shell scripts. + + +# Local variables: ; +# mode: text; +# End: ; diff --git a/package/aufs2-util/src/au_util.h b/package/aufs2-util/src/au_util.h new file mode 100644 index 000000000..21b965510 --- /dev/null +++ b/package/aufs2-util/src/au_util.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2005-2009 Junjiro Okajima + * + * This program, aufs is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __AUFS_UTIL_H__ +#define __AUFS_UTIL_H__ + +#include +#include + +/* + * error_at_line() is decleared with (__printf__, 5, 6) attribute, + * and our compiler produces a warning unless args is not given. + * __VA_ARGS__ does not help the attribute. + */ +#define AuFin(fmt, args...) \ + error_at_line(errno, errno, __FILE__, __LINE__, fmt, ##args) + +#ifdef DEBUG +#define MTab "/tmp/mtab" +#else +#define MTab "/etc/mtab" +#endif + +/* proc_mounts.c */ +struct mntent; +int au_proc_getmntent(char *mntpnt, struct mntent *rent); + +/* br.c */ +int au_br(char ***br, int *nbr, struct mntent *ent); + +/* plink.c */ +enum { + AuPlink_FLUSH, + AuPlink_CPUP, + AuPlink_LIST +}; +int au_plink(char cwd[], int cmd, int begin_maint, int end_maint); +void au_plink_maint(char *path); + +/* mtab.c */ +void au_print_ent(struct mntent *ent); +int au_update_mtab(char *mntpnt, int do_remount, int do_verbose); + +#define _Dpri(fmt, ...) printf("%s:%d:" fmt, \ + __func__, __LINE__, ##__VA_ARGS__) +#ifdef DEBUG +#define Dpri(fmt, ...) _Dpri(fmt, ##__VA_ARGS__) +#else +#define Dpri(fmt, ...) do { } while(0) +#endif + +#endif /* __AUFS_UTIL_H__ */ diff --git a/package/aufs2-util/src/aubrsync b/package/aufs2-util/src/aubrsync new file mode 100755 index 000000000..54adac9cb --- /dev/null +++ b/package/aufs2-util/src/aubrsync @@ -0,0 +1,304 @@ +#!/bin/sh + +# Copyright (C) 2005-2009 Junjiro Okajima +# +# This program, aufs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +# +# The development of this script is sponcered by ASUSTek Computer Inc. +# Kindly they agreed that I keep my aufs work as free software as it has +# been. +# + +set -eu +#set -x + +me=$(basename $0) +EEcho() # str +{ + echo ${me}: $@ 1>&2 +} + +f=/sbin/mount.aufs +test ! -x $f && EEcho $f is not installed && exit 1 + +# special handling for backward compatibility. +# +# aufs in the donated eeepc is aufs1 20080211 without CONFIG_AUFS_COMPAT. +# /etc/default/aufs was introduced in aufs1 20080922. +# shwh/noshwh was introduced in aufs1 20080310 with CONFIG_AUFS_SHWH. +# noshwh became always available regardless CONFIG_AUFS_SHWH in aufs1 20081117. + +noshwh=1 +AUFS_VERSION=20080211 +f=/etc/default/aufs +if [ -s $f ] +then + . $f +else + echo ${me}: warning, broken $f, assuming aufs is $AUFS_VERSION + f=/usr/lib/aufs.shlib + test ! -s $f && EEcho $f is not installed && exit 1 + . $f + + case $AUFS_VERSION in + 200*) # aufs1 + test $AUFS_VERSION -lt 20081117 && noshwh=0 + ;; + esac + AUFS_SUPER_MAGIC=1635083891 + AUFS_SUPER_MAGIC_HEX=0x61756673 + AUFS_WH_PFX=.wh. + AUFS_WH_PFX2=.wh..wh. + AUFS_WH_DIROPQ=.wh..wh..opq +fi + +######################################## + +_Rsync="rsync --exclude=lost+found" +Rsync="$_Rsync -aHSx --devices --specials --delete-before" +Copy="$Rsync" +Move="$Copy" +RsyncWh="$_Rsync -ptgoHx" + +FindForRm() # rw +{ + echo "find \"$1\" -xdev -depth \( + \( ! -type d + \( -name $AUFS_WH_DIROPQ + -o ! -name ${AUFS_WH_PFX2}\* \) \) + -o \( -type d + ! -name ${AUFS_WH_PFX2}\* + ! -wholename \"$1\" + ! -wholename \"$1/lost+found\" \) + \) -print0" +} + +MoveWh() # rw ro+wh +{ + cd "$1" + find . -xdev -name ${AUFS_WH_PFX}\* ! -name ${AUFS_WH_PFX2}\* \ + -printf '%P\n' | + while read wh + do + f=$(echo "$wh" | sed -e ' + s/^'${AUFS_WH_PFX}'// + t + s:/'${AUFS_WH_PFX}':/: + ') + test -e "$dst/$f" || echo "$wh" + done | + # -v + $RsyncWh --files-from=- ./ "$2" + cd "$OLDPWD" +} + +copy() +{ + $Copy $@ "$mntpnt"/ "$dst" +} + +_move() +{ + set +x + test $hinotify -ne 1 && echo ${me}: warning, -i is not specified + src_is_nfs=0 + test $(stat -f -c %T "$src") = nfs && src_is_nfs=1 + set $quiet + + $Move $@ && + eval $(FindForRm "$src") | + { + if [ $src_is_nfs -eq 1 ] + then + mount -o remount "$mntpnt" + mount -o remount "$src" + fi + xargs -r0 rm -fr #-v + } +} + +move() +{ + _move $@ "$mntpnt"/ "$dst" +} + +move_with_wh() +{ + { + set +x + MoveWh "$src" "$dst" + set $quiet + } && + move --exclude=${AUFS_WH_PFX}\* +} + +# backward compatibility +move_w() +{ + move_with_wh $@ +} + +Usage() +{ + t=$(FindForRm src_branch | sed -e ' + s/"//g + $b + s/$/ \\/') + + cat <<- EOF + $me Options move | move_with_wh | copy \\ + mntpnt src_branch dst_branch [ options for rsync ] + + generic form: + $me [ -w | --wh ] [ -i | --inotify ] Options \\ + mntpnt cmd [ parameters for cmd ] + + Options: + [ -n | --dry_run ] + [ -q | --quiet ] + + The dst_branch must be mounted as writable. + During the operation, the mntpnt is set readonly. + If you are opening a file for writing on the writable branch, + you need to close the file before invoking this script. + The -w or --wh option requires CONFIG_AUFS_SHWH enabled. + The -i or --inotify option requires CONFIG_AUFS_HINOTIFY enabled. + + 'copy' is a shortcut for + $me mntpnt \\ + $Copy mntpnt/ dst_branch + 'move' is a shortcut for + $me mntpnt \\ + "$Move \\ + mntpnt/ dst_branch && \\ + $t |\\ + xargs -r0 rm -fr" + Note: in most cases, you will need '-i' option, and + find(1) is invoked by $me only when rsync(1) + succeded. + 'move_with_wh' is a simple variation of 'move' which moves + whiteouts separately before the actual 'move'. + + If you execute this script under linux-2.6.24 or earlier, the + kernel may produce a harmless warning "inotify.c:NNN + set_dentry_child_flags()". The message was already removed in + linux-2.6.25. + + examples: + - Copy and reflect all the modification (modifed files, newly + created and removed ones) in the upper branch to the lower + branch. This operation is for aufs which has only 2 branches, + and mainly for a system shutdown script. + All files on the upper branch remain. + + $ sudo $me copy /your/aufs /your/upper_branch /your/lower_branch + + - Like above (2 branches), move and reflect all modifications + from upper to lower. Almost all files on the upper branch will + be removed. You can still use this aufs after the + operation. But the inode number may be changed. If your + application which depends upon the inode number was running at + that time, it may not work correctly. + + $ sudo $me move /your/aufs /your/upper_branch /your/lower_branch + EOF + +# - Like above (2 branches), generate a new middle layer like a +# snapshot including whiteouts and make the upper_branch almost +# empty, but untouch the lower_branch. +# +# $ img=/hda1/a.ext2 +# $ dd if=/dev/zero of=\$img bs=4k count=1k +# $ mkfs -t ext2 -F \$img +# $ sudo mount -o rw,loop \$img /your/new_branch +# $ sudo mount -o remount,ins:1:/your/new_branch=ro+wh /your/aufs +# $ sudo $me _move /your/aufs /your/upper_branch /your/lower_branch \\ +# "--remove-source-files \\ +# --exclude=$AUFS_WH_BASE \\ +# --exclude=$AUFS_WH_PLINKDIR \\ +# --exclude=$AUFS_WH_TMPDIR \\ +# /your/upper_branch/ /your/new_branch; \\ +# mount -o remount,ro /your/new_branch" +# EOF +} + +######################################## + +wh=0 +hinotify=0 +quiet=-x +dry_run= +cmd= +cmd_opts= +for i +do + case $i in + -w|--wh) wh=1;; + -i|--inotify) hinotify=1;; + -n|--dry_run) dry_run=echo;; + -q|--quiet) quiet=+x;; + -h|--help) Usage; exit 0;; + --) shift; break;; + *) break;; + esac + shift +done + +test $# -lt 2 && Usage 1>&2 && exit 1 +case "$1" in +_move|move|copy|move_w|move_with_wh) + test $# -lt 4 && Usage 1>&2 && exit 1 + cmd=$1 + SetDir mntpnt "$2" + SetDir src "$3" + SetDir dst "$4" + shift 4 + wh=0 + ;; +*) + SetDir mntpnt "$1" + cmd="$2" + shift 2 + ;; +esac +cmd_opts="$@" + +case $(stat -f -c %T "$mntpnt") in +aufs|UNKNOWN*${AUFS_SUPER_MAGIC_HEX}*) ;; +*) + EEcho "$mntpnt" is not aufs + exit 1 + ;; +esac + +cur_opts=$(MntOpts "$mntpnt") +test ! "$cur_opts" && +EEcho bad /proc/mounts or "$mntpnt" is not mounted && +exit 1 +cur_opts="udba=reval,noshwh,$cur_opts" +test $noshwh -eq 0 && cur_opts=$(echo $cur_opts | sed -e 's/,noshwh//') + +# force flushing the pusedo-links +tmp_opts="remount,ro,udba=reval,noshwh" +test $noshwh -eq 0 && tmp_opts=$(echo $tmp_opts | sed -e 's/,noshwh//') +test $wh -eq 1 && tmp_opts="$tmp_opts,shwh" +test $hinotify -eq 1 && tmp_opts="$tmp_opts,udba=inotify" + +# here we go +trap "$dry_run mount -o remount,$cur_opts \"$mntpnt\"" EXIT +set $quiet +$dry_run mount -o $tmp_opts "$mntpnt" +eval "$dry_run $cmd $cmd_opts" diff --git a/package/aufs2-util/src/auchk b/package/aufs2-util/src/auchk new file mode 100755 index 000000000..26a3d8027 --- /dev/null +++ b/package/aufs2-util/src/auchk @@ -0,0 +1,130 @@ +#!/bin/sh - + +# Copyright (C) 2005-2009 Junjiro Okajima +# +# This program, aufs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +set -eu +#set -x + +EEcho() # str +{ + echo $0: $@ 1>&2 +} + +f=/etc/default/aufs +. $f + +Usage() +{ + echo $0 writable_branch '[...]' +} + +Pass() # title +{ + pass=$(($pass + 1)) + EEcho \[Pass $pass\] $@ +} + +Remove() # file +{ + if [ -d "$1" ] + then + rm -ir "$1" || : + else + rm -v "$1" || : + fi +} + +for i +do + EEcho Checking "$i" for aufs + + cd "$i" + case $(stat -f -c %T .) in + aufs|UNKNOWN*${AUFS_SUPER_MAGIC_HEX}*) + EEcho $i must not be aufs + cd $OLDPWD + continue + ;; + esac + + ######################################## + pass=0 + Pass Illegal whiteout + find . -name '.wh.*' ! -name '.wh..wh.*' -printf '%h\0%f\0' | + xargs -r0n2 | + while read dir wh + do + #echo \""$dir"\" \""$wh"\" + base=$(echo "$wh" | cut -c5-) + test ! -e "$dir/$base" && continue + + ls -ld "$dir/$wh" "$dir/$base" + read -p 'Which to remove [whiteout/real/skip]? ' ans \ + < /dev/tty > /dev/tty 2>&1 + case "$ans" in + [wW]*) Remove "$dir/$wh" || :;; + [rR]*) Remove "$dir/$base" || :;; + *) echo skipped;; + esac + done + + ######################################## + Pass Remained pseudo-links + did=0 + for plink in ${AUFS_WH_PLINKDIR}/* + do + test ! -e "$plink" && break + if [ -d "$plink" ] + then + EEcho illegal "$plink" + continue + fi + + did=1 + #ls -l "$plink" || : + find . -inum $(basename "$plink" | cut -f2 -d .) -ls || : + done + if [ $did -ne 0 ] + then + cat <<- EOF + They will be maintained at remount or umount time, + if you installed aufs helper scripts (See README + in detail). + If "$i" is not a writeble branch of CURRENTLY mounted + aufs, you need to maintain them by yourself. + EOF + fi + + ######################################## + Pass Remained temp files + for tmp in ${AUFS_WH_TMPDIR}/* + do + test ! -e "$tmp" && break + if [ -d "$tmp" ] + then + EEcho illegal "$tmp" + continue + fi + + ls -l "$tmp" || : + rm -i "$tmp" || : + done + + # nothing to do for xinodir + + cd $OLDPWD +done diff --git a/package/aufs2-util/src/aufs.in.5 b/package/aufs2-util/src/aufs.in.5 new file mode 100644 index 000000000..0cbb14487 --- /dev/null +++ b/package/aufs2-util/src/aufs.in.5 @@ -0,0 +1,1684 @@ +.\".so aufs.tmac +. +.eo +.de TQ +.br +.ns +.TP \$1 +.. +.de Bu +.IP \(bu 4 +.. +.ec +.\" end of macro definitions +. +.\" ---------------------------------------------------------------------- +.TH aufs 5 \*[AUFS_VERSION] Linux "Linux Aufs User's Manual" +.SH NAME +aufs \- advanced multi layered unification filesystem. version \*[AUFS_VERSION] + +.\" ---------------------------------------------------------------------- +.SH DESCRIPTION +Aufs is a stackable unification filesystem such as Unionfs, which unifies +several directories and provides a merged single directory. +In the early days, aufs was entirely re-designed and re-implemented +Unionfs Version 1.x series. After +many original ideas, approaches and improvements, it +becomes totally different from Unionfs while keeping the basic features. +See Unionfs Version 1.x series for the basic features. +Recently, Unionfs Version 2.x series begin taking some of same +approaches to aufs's. + +.\" ---------------------------------------------------------------------- +.SH MOUNT OPTIONS +At mount-time, the order of interpreting options is, +.RS +.Bu +simple flags, except xino/noxino and udba=inotify +.Bu +branches +.Bu +xino/noxino +.Bu +udba=inotify +.RE + +At remount-time, +the options are interpreted in the given order, +e.g. left to right. +.RS +.Bu +create or remove +whiteout-base(\*[AUFS_WH_BASE]) and +whplink-dir(\*[AUFS_WH_PLINKDIR]) if necessary +.RE +. +.TP +.B br:BRANCH[:BRANCH ...] (dirs=BRANCH[:BRANCH ...]) +Adds new branches. +(cf. Branch Syntax). + +Aufs rejects the branch which is an ancestor or a descendant of another +branch. It is called overlapped. When the branch is loopback-mounted +directory, aufs also checks the source fs-image file of loopback +device. If the source file is a descendant of another branch, it will +be rejected too. + +After mounting aufs or adding a branch, if you move a branch under +another branch and make it descendant of another branch, aufs will not +work correctly. +. +.TP +.B [ add | ins ]:index:BRANCH +Adds a new branch. +The index begins with 0. +Aufs creates +whiteout-base(\*[AUFS_WH_BASE]) and +whplink-dir(\*[AUFS_WH_PLINKDIR]) if necessary. + +If there is the same named file on the lower branch (larger index), +aufs will hide the lower file. +You can only see the highest file. +You will be confused if the added branch has whiteouts (including +diropq), they may or may not hide the lower entries. +.\" It is recommended to make sure that the added branch has no whiteout. + +Even if a process have once mapped a file by mmap(2) with MAP_SHARED +and the same named file exists on the lower branch, +the process still refers the file on the lower(hidden) +branch after adding the branch. +If you want to update the contents of a process address space after +adding, you need to restart your process or open/mmap the file again. +.\" Usually, such files are executables or shared libraries. +(cf. Branch Syntax). +. +.TP +.B del:dir +Removes a branch. +Aufs does not remove +whiteout-base(\*[AUFS_WH_BASE]) and +whplink-dir(\*[AUFS_WH_PLINKDIR]) automatically. +For example, when you add a RO branch which was unified as RW, you +will see whiteout-base or whplink-dir on the added RO branch. + +If a process is referencing the file/directory on the deleting branch +(by open, mmap, current working directory, etc.), aufs will return an +error EBUSY. +. +.TP +.B mod:BRANCH +Modifies the permission flags of the branch. +Aufs creates or removes +whiteout-base(\*[AUFS_WH_BASE]) and/or +whplink-dir(\*[AUFS_WH_PLINKDIR]) if necessary. + +If the branch permission is been changing `rw' to `ro', and a process +is mapping a file by mmap(2) +.\" with MAP_SHARED +on the branch, the process may or may not +be able to modify its mapped memory region after modifying branch +permission flags. +Additioanlly when you enable CONFIG_IMA (in linux-2.6.30 and later), IMA +may produce some wrong messages. But this is equivalent when the +filesystem is changed `ro' in emergency. +(cf. Branch Syntax). +. +.TP +.B append:BRANCH +equivalent to `add:(last index + 1):BRANCH'. +(cf. Branch Syntax). +. +.TP +.B prepend:BRANCH +equivalent to `add:0:BRANCH.' +(cf. Branch Syntax). +. +.TP +.B xino=filename +Use external inode number bitmap and translation table. +When CONFIG_AUFS_EXPORT is enabled, external inode generation table too. +It is set to +/\*[AUFS_XINO_FNAME] by default, or +\*[AUFS_XINO_DEFPATH]. +Comma character in filename is not allowed. + +The files are created per an aufs and per a branch filesystem, and +unlinked. So you +cannot find this file, but it exists and is read/written frequently by +aufs. +(cf. External Inode Number Bitmap, Translation Table and Generation Table). + +If you enable CONFIG_SYSFS, the path of xino files are not shown in +/proc/mounts (and /etc/mtab), instead it is shown in +/fs/aufs/si_/xi_path. +Otherwise, it is shown in /proc/mounts unless it is not the default +path. +. +.TP +.B noxino +Stop using external inode number bitmap and translation table. + +If you use this option, +Some applications will not work correctly. +.\" And pseudo link feature will not work after the inode cache is +.\" shrunk. +(cf. External Inode Number Bitmap, Translation Table and Generation Table). +. +.TP +.B trunc_xib +Truncate the external inode number bitmap file. The truncation is done +automatically when you delete a branch unless you do not specify +`notrunc_xib' option. +(cf. External Inode Number Bitmap, Translation Table and Generation Table). +. +.TP +.B notrunc_xib +Stop truncating the external inode number bitmap file when you delete +a branch. +(cf. External Inode Number Bitmap, Translation Table and Generation Table). +. +.TP +.B create_policy | create=CREATE_POLICY +.TQ +.B copyup_policy | copyup | cpup=COPYUP_POLICY +Policies to select one among multiple writable branches. The default +values are `create=tdp' and `cpup=tdp'. +link(2) and rename(2) systemcalls have an exception. In aufs, they +try keeping their operations in the branch where the source exists. +(cf. Policies to Select One among Multiple Writable Branches). +. +.TP +.B verbose | v +Print some information. +Currently, it is only busy file (or inode) at deleting a branch. +. +.TP +.B noverbose | quiet | q | silent +Disable `verbose' option. +This is default value. +. +.TP +.B sum +df(1)/statfs(2) returns the total number of blocks and inodes of +all branches. +Note that there are cases that systemcalls may return ENOSPC, even if +df(1)/statfs(2) shows that aufs has some free space/inode. +. +.TP +.B nosum +Disable `sum' option. +This is default value. +. +.TP +.B dirwh=N +Watermark to remove a dir actually at rmdir(2) and rename(2). + +If the target dir which is being removed or renamed (destination dir) +has a huge number of whiteouts, i.e. the dir is empty logically but +physically, the cost to remove/rename the single +dir may be very high. +It is +required to unlink all of whiteouts internally before issuing +rmdir/rename to the branch. +To reduce the cost of single systemcall, +aufs renames the target dir to a whiteout-ed temporary name and +invokes a pre-created +kernel thread to remove whiteout-ed children and the target dir. +The rmdir/rename systemcall returns just after kicking the thread. + +When the number of whiteout-ed children is less than the value of +dirwh, aufs remove them in a single systemcall instead of passing +another thread. +This value is ignored when the branch is NFS. +The default value is \*[AUFS_DIRWH_DEF]. +.\" . +.\" .TP +.\" .B rdcache=N +. +.TP +.B rdblk=N +Specifies a size of internal VDIR block which is allocated at a time in +byte. +The VDIR block will be allocated several times when necessary. If your +directory has millions of files, you may want to expand this size. +The default value is defined as \*[AUFS_RDBLK_DEF]. +The size has to be lager than NAME_MAX (usually 255) and kmalloc\-able +(the maximum limit depends on your system. at least 128KB is available +for every system). +Whenever you can reset the value to default by specifying rdblk=def. +(cf. Virtual or Vertical Directory Block). +. +.TP +.B rdhash=N +Specifies a size of internal VDIR hash table which is used to compare +the file names under the same named directory on multiple branches. +The VDIR hash table will be allocated in readdir(3)/getdents(2), +rmdir(2) and rename(2) for the existing target directory. If your +directory has millions of files, you may want to expand this size. +The default value is defined as \*[AUFS_RDHASH_DEF]. +The size has to be lager than zero, and it will be multiplied by 4 or 8 +(for 32\-bit and 64\-bit respectively, currently). The result must be +kmalloc\-able +(the maximum limit depends on your system. at least 128KB is available +for every system). +Whenever you can reset the value to default by specifying rdhash=def. +(cf. Virtual or Vertical Directory Block). +. +.TP +.B plink +.TQ +.B noplink +Specifies to use `pseudo link' feature or not. +The default is `plink' which means use this feature. +(cf. Pseudo Link) +. +.TP +.B clean_plink +Removes all pseudo-links in memory. +In order to make pseudo-link permanent, use +`auplink' utility just before one of these operations, +unmounting aufs, +using `ro' or `noplink' mount option, +deleting a branch from aufs, +adding a branch into aufs, +or changing your writable branch as readonly. +If you installed both of /sbin/mount.aufs and /sbin/umount.aufs, and your +mount(8) and umount(8) support them, +`auplink' utility will be executed automatically and flush pseudo-links. +(cf. Pseudo Link) +. +.TP +.B udba=none | reval | inotify +Specifies the level of UDBA (User's Direct Branch Access) test. +(cf. User's Direct Branch Access and Inotify Limitation). +. +.TP +.B diropq=whiteouted | w | always | a +Specifies whether mkdir(2) and rename(2) dir case make the created directory +`opaque' or not. +In other words, to create `\*[AUFS_WH_DIROPQ]' under the created or renamed +directory, or not to create. +When you specify diropq=w or diropq=whiteouted, aufs will not create +it if the +directory was not whiteouted or opaqued. If the directory was whiteouted +or opaqued, the created or renamed directory will be opaque. +When you specify diropq=a or diropq==always, aufs will always create +it regardless +the directory was whiteouted/opaqued or not. +The default value is diropq=w, it means not to create when it is unnecessary. +If you define CONFIG_AUFS_COMPAT at aufs compiling time, the default will be +diropq=a. +You need to consider this option if you are planning to add a branch later +since `diropq' affects the same named directory on the added branch. +. +.TP +.B warn_perm +.TQ +.B nowarn_perm +Adding a branch, aufs will issue a warning about uid/gid/permission of +the adding branch directory, +when they differ from the existing branch's. This difference may or +may not impose a security risk. +If you are sure that there is no problem and want to stop the warning, +use `nowarn_perm' option. +The default is `warn_perm' (cf. DIAGNOSTICS). +. +.TP +.B shwh +.TQ +.B noshwh +By default (noshwh), aufs doesn't show the whiteouts and +they just hide the same named entries in the lower branches. The +whiteout itself also never be appeared. +If you enable CONFIG_AUFS_SHWH and specify `shwh' option, aufs +will show you the name of whiteouts +with keeping its feature to hide the lowers. +Honestly speaking, I am rather confused with this `visible whiteouts.' +But a user who originally requested this feature wrote a nice how-to +document about this feature. See Tips file in the aufs CVS tree. + +.\" ---------------------------------------------------------------------- +.SH Module Parameters +.TP +.B nwkq=N +The number of kernel thread named \*[AUFS_WKQ_NAME]. + +Those threads stay in the system while the aufs module is loaded, +and handle the special I/O requests from aufs. +The default value is \*[AUFS_NWKQ_DEF]. + +The special I/O requests from aufs include a part of copy-up, lookup, +directory handling, pseudo-link, xino file operations and the +delegated access to branches. +For example, Unix filesystems allow you to rmdir(2) which has no write +permission bit, if its parent directory has write permission bit. In aufs, the +removing directory may or may not have whiteout or `dir opaque' mark as its +child. And aufs needs to unlink(2) them before rmdir(2). +Therefore aufs delegates the actual unlink(2) and rmdir(2) to another kernel +thread which has been created already and has a superuser privilege. + +If you enable CONFIG_SYSFS, you can check this value through +/module/aufs/parameters/nwkq. + +. +.TP +.B brs=1 | 0 +Specifies to use the branch path data file under sysfs or not. + +If the number of your branches is large or their path is long +and you meet the limitation of mount(8) ro /etc/mtab, you need to +enable CONFIG_SYSFS and set aufs module parameter brs=1. + +When this parameter is set as 1, aufs does not show `br:' (or dirs=) +mount option through /proc/mounts (and /etc/mtab). So you can +keep yourself from the page limitation of +mount(8) or /etc/mtab. +Aufs shows branch paths through /fs/aufs/si_XXX/brNNN. +Actually the file under sysfs has also a size limitation, but I don't +think it is harmful. + +There is one more side effect in setting 1 to this parameter. +If you rename your branch, the branch path written in /etc/mtab will be +obsoleted and the future remount will meet some error due to the +unmatched parameters (Remember that mount(8) may take the options from +/etc/mtab and pass them to the systemcall). +If you set 1, /etc/mtab will not hold the branch path and you will not +meet such trouble. On the other hand, the entries for the +branch path under sysfs are generated dynamically. So it must not be obsoleted. +But I don't think users want to rename branches so often. + +If CONFIG_SYSFS is disable, this parameter is always set to 0. +. +.TP +.B sysrq=key +Specifies MagicSysRq key for debugging aufs. +You need to enable both of CONFIG_MAGIC_SYSRQ and CONFIG_AUFS_DEBUG. +Currently this is for developers only. +The default is `a'. +. +.TP +.B debug= 0 | 1 +Specifies disable(0) or enable(1) debug print in aufs. +This parameter can be changed dynamically. +You need to enable CONFIG_AUFS_DEBUG. +Currently this is for developers only. +The default is `0' (disable). + +.\" ---------------------------------------------------------------------- +.SH Entries under Sysfs and Debugfs +See linux/Documentation/ABI/*/{sys,debug}fs-aufs. + +.\" ---------------------------------------------------------------------- +.SH Branch Syntax +.TP +.B dir_path[ =permission [ + attribute ] ] +.TQ +.B permission := rw | ro | rr +.TQ +.B attribute := wh | nolwh +dir_path is a directory path. +The keyword after `dir_path=' is a +permission flags for that branch. +Comma, colon and the permission flags string (including `=')in the path +are not allowed. + +Any filesystem can be a branch, But some are not accepted such like +sysfs, procfs and unionfs. +If you specify such filesystems as an aufs branch, aufs will return an error +saying it is unsupported. + +Cramfs in linux stable release has strange inodes and it makes aufs +confused. For example, +.nf +$ mkdir -p w/d1 w/d2 +$ > w/z1 +$ > w/z2 +$ mkcramfs w cramfs +$ sudo mount -t cramfs -o ro,loop cramfs /mnt +$ find /mnt -ls + 76 1 drwxr-xr-x 1 jro 232 64 Jan 1 1970 /mnt + 1 1 drwxr-xr-x 1 jro 232 0 Jan 1 1970 /mnt/d1 + 1 1 drwxr-xr-x 1 jro 232 0 Jan 1 1970 /mnt/d2 + 1 1 -rw-r--r-- 1 jro 232 0 Jan 1 1970 /mnt/z1 + 1 1 -rw-r--r-- 1 jro 232 0 Jan 1 1970 /mnt/z2 +.fi + +All these two directories and two files have the same inode with one +as their link count. Aufs cannot handle such inode correctly. +Currently, aufs involves a tiny workaround for such inodes. But some +applications may not work correctly since aufs inode number for such +inode will change silently. +If you do not have any empty files, empty directories or special files, +inodes on cramfs will be all fine. + +A branch should not be shared as the writable branch between multiple +aufs. A readonly branch can be shared. + +The maximum number of branches is configurable at compile time (127 by +default). + +When an unknown permission or attribute is given, aufs sets ro to that +branch silently. + +.SS Permission +. +.TP +.B rw +Readable and writable branch. Set as default for the first branch. +If the branch filesystem is mounted as readonly, you cannot set it `rw.' +.\" A filesystem which does not support link(2) and i_op\->setattr(), for +.\" example FAT, will not be used as the writable branch. +. +.TP +.B ro +Readonly branch and it has no whiteouts on it. +Set as default for all branches except the first one. Aufs never issue +both of write operation and lookup operation for whiteout to this branch. +. +.TP +.B rr +Real readonly branch, special case of `ro', for natively readonly +branch. Assuming the branch is natively readonly, aufs can optimize +some internal operation. For example, if you specify `udba=inotify' +option, aufs does not set inotify for the things on rr branch. +Set by default for a branch whose fs-type is either `iso9660', +`cramfs' or `romfs' (and `squashfs' for linux\-2.6.29 and later). + +When your branch exists on slower device and you have some +capacity on your hdd, you may want to try ulobdev tool in ULOOP sample. +It can cache the contents of the real devices on another faster device, +so you will be able to get the better access performance. +The ulobdev tool is for a generic block device, and the ulohttp is for a +filesystem image on http server. +If you want to spin down your hdd to save the +battery life or something, then you may want to use ulobdev to save the +access to the hdd, too. +See $AufsCVS/sample/uloop in detail. + +.SS Attribute +. +.TP +.B wh +Readonly branch and it has/might have whiteouts on it. +Aufs never issue write operation to this branch, but lookup for whiteout. +Use this as `=ro+wh'. +. +.TP +.B nolwh +Usually, aufs creates a whiteout as a hardlink on a writable +branch. This attributes prohibits aufs to create the hardlinked +whiteout, including the source file of all hardlinked whiteout +(\*[AUFS_WH_BASE].) +If you do not like a hardlink, or your writable branch does not support +link(2), then use this attribute. +But I am afraid a filesystem which does not support link(2) natively +will fail in other place such as copy-up. +Use this as `=rw+nolwh'. +Also you may want to try `noplink' mount option, while it is not recommended. + +.\" .SS FUSE as a branch +.\" A FUSE branch needs special attention. +.\" The struct fuse_operations has a statfs operation. It is OK, but the +.\" parameter is struct statvfs* instead of struct statfs*. So almost +.\" all user\-space implementation will call statvfs(3)/fstatvfs(3) instead of +.\" statfs(2)/fstatfs(2). +.\" In glibc, [f]statvfs(3) issues [f]statfs(2), open(2)/read(2) for +.\" /proc/mounts, +.\" and stat(2) for the mountpoint. With this situation, a FUSE branch will +.\" cause a deadlock in creating something in aufs. Here is a sample +.\" scenario, +.\" .\" .RS +.\" .\" .IN -10 +.\" .Bu +.\" create/modify a file just under the aufs root dir. +.\" .Bu +.\" aufs acquires a write\-lock for the parent directory, ie. the root dir. +.\" .Bu +.\" A library function or fuse internal may call statfs for a fuse branch. +.\" The create=mfs mode in aufs will surely call statfs for each writable +.\" branches. +.\" .Bu +.\" FUSE in kernel\-space converts and redirects the statfs request to the +.\" user\-space. +.\" .Bu +.\" the user\-space statfs handler will call [f]statvfs(3). +.\" .Bu +.\" the [f]statvfs(3) in glibc will access /proc/mounts and issue +.\" stat(2) for the mountpoint. But those require a read\-lock for the aufs +.\" root directory. +.\" .Bu +.\" Then a deadlock occurs. +.\" .\" .RE 1 +.\" .\" .IN +.\" +.\" In order to avoid this deadlock, I would suggest not to call +.\" [f]statvfs(3) from fuse. Here is a sample code to do this. +.\" .nf +.\" struct statvfs stvfs; +.\" +.\" main() +.\" { +.\" statvfs(..., &stvfs) +.\" or +.\" fstatvfs(..., &stvfs) +.\" stvfs.f_fsid = 0 +.\" } +.\" +.\" statfs_handler(const char *path, struct statvfs *arg) +.\" { +.\" struct statfs stfs +.\" +.\" memcpy(arg, &stvfs, sizeof(stvfs)) +.\" +.\" statfs(..., &stfs) +.\" or +.\" fstatfs(..., &stfs) +.\" +.\" arg->f_bfree = stfs.f_bfree +.\" arg->f_bavail = stfs.f_bavail +.\" arg->f_ffree = stfs.f_ffree +.\" arg->f_favail = /* any value */ +.\" } +.\" .fi + +.\" ---------------------------------------------------------------------- +.SH External Inode Number Bitmap, Translation Table and Generation Table (xino) +Aufs uses one external bitmap file and one external inode number +translation table files per an aufs and per a branch +filesystem by default. +Additionally when CONFIG_AUFS_EXPORT is enabled, one external inode +generation table is added. +The bitmap (and the generation table) is for recycling aufs inode number +and the others +are a table for converting an inode number on a branch to +an aufs inode number. The default path +is `first writable branch'/\*[AUFS_XINO_FNAME]. +If there is no writable branch, the +default path +will be \*[AUFS_XINO_DEFPATH]. +.\" A user who executes mount(8) needs the privilege to create xino +.\" file. + +If you en