如果您使用的是 Linux 机器并且拥有激活了用户配额的文件系统,则可以通过以下命令检查quotacheck
是否可以通过绑定挂载访问这些文件(如果这些绑定挂载的源和目标都位于quotacheck
访问的文件系统上):
# we assume /home has active user-quota
repquota /home # check used quota before changes
mkdir /home/test_user/dir
mkdir /home/other_dir
mount -o bind /home/test_user/dir /home/other_dir
head -c1000000 /dev/urandom > /home/test_user/dir/test
chown test_user /home/test_user/dir/test
repquota /home # repquota now reports 1000000 bytes more for test_user
# umount /home/test_user/dir # possible solution
quotaoff -a
quotacheck -vuam
quotaon -a
# mount -o bind /home/test_user/dir /home/other_dir # possible solution
repquota /home # repquota now reports 2000000 bytes more for test_user
我能想到的唯一解决方案是umount
在执行之前将所有目录绑定挂载quotacheck
,然后重新挂载它们。还有其他解决方案吗?从绑定挂载的目录中删除usrquota
-option 似乎不起作用(不奇怪,不必费心解释)。并且quotacheck
似乎无法排除某些目录的访问(手册页未提及任何相关选项)。顺便说一句,我在 Debian 8(内核 3.16.0,配额 4.01)上对此进行了测试。
澄清:除了绑定挂载之外,其下的所有内容/home
都属于单个文件系统。
答案1
事实证明,quotacheck 中有一个错误。我提交了一个补丁来修复它,但不知道何时(甚至是否)会发布包含该补丁的新版本的配额。直接将文件附加到我的答案似乎是不可能的,所以我不会在这里发布补丁。但如果有人感兴趣,请发表评论,我会将补丁作为代码块发布。
编辑:我的补丁没有被接受,因为它与主题无关。当使用该EXT2_DIRECT
选项编译并在 ext 文件系统上使用时,quotacheck 已经能够在 bind-mounts 存在的情况下正常工作。不幸的是,一个错误阻止它在 ext4 文件系统上运行,作者现在已经修复了这个问题(git://git.code.sf.net/p/linuxquota/code 中的提交 2b3795805c8d1bd8873b046508777fa6e9a5c83d)。
答案2
你有一个非常有趣的问题。看起来没有任何选项可以quotacheck
忽略目录。你可能需要更改配额检查作业并为每个卷运行它,忽略绑定的卷。你可以使用findmnt
以下命令获取绑定卷的列表:
findmnt | awk '$2 ~ /\[.*\]$/'
因此你的 cron 任务可能类似于
findmnt --noheadings --raw | awk '$2 !~ /\[.*\]$/ {print$1}' | while read FS ; do quotacheck -vum $FS ; done
这看起来不是一种非常优雅的方法,并且我相信如果绑定挂载位于您要检查的目录中,它将不起作用,但不幸的是我不知道另一种提供要忽略的目录列表的方法。
答案3
事实证明,当前稳定的 Debian(stretch)也存在此错误。幸运的是,重新编译“quota”包并修补它很容易:
# follow this tutorial: https://wiki.debian.org/BuildingTutorial#Rebuild_without_changes
apt-get source quota
apt-get build-dep quota
apt-get install devscripts
cd quota-4.03/
# this package uses "quilt" for patches, follow a different tutorial for "quilt":
# https://wiki.debian.org/UsingQuilt#Using_quilt_with_Debian_source_packages
export QUILT_PATCHES=debian/patches
export QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
quilt push -a
quilt new quotacheck_ext4_direct.diff
quilt add quotacheck.c
vi quotacheck.c
# https://marc.info/?l=fedora-extras-commits&m=147878735423631&w=2
# add "!strcmp(mnt->me_type, MNTTYPE_EXT4)"
quilt refresh
quilt pop -a
# return to the original tutorial: https://wiki.debian.org/BuildingTutorial#Rebuild_without_changes
dch -n # enter something in the changelog
debuild -b -uc -us
差异文件应如下所示:
$ cat debian/patches/quotacheck_ext4_direct.diff
Index: quota-4.03/quotacheck.c
===================================================================
--- quota-4.03.orig/quotacheck.c
+++ quota-4.03/quotacheck.c
@@ -959,7 +959,7 @@ Please stop all programs writing to file
start_scan:
debug(FL_VERBOSE | FL_DEBUG, _("Scanning %s [%s] "), mnt->me_devname, mnt->me_dir);
#if defined(EXT2_DIRECT)
- if (!strcmp(mnt->me_type, MNTTYPE_EXT2) || !strcmp(mnt->me_type, MNTTYPE_EXT3) || !strcmp(mnt->me_type, MNTTYPE_NEXT3)) {
+ if (!strcmp(mnt->me_type, MNTTYPE_EXT2) || !strcmp(mnt->me_type, MNTTYPE_EXT3) || !strcmp(mnt->me_type, MNTTYPE_NEXT3) || !strcmp(mnt->me_type, MNTTYPE_EXT4)) {
if ((failed = ext2_direct_scan(mnt->me_devname)) < 0)
goto out;
}
最后,使用安装新包dpkg -i
并强制重新计算配额。