假设我以“elem_###”的形式创建一系列目录,其中 ### 是从 001 到 454 的整数,如下所示:
$ dirs=$(seq -felem_%03.0f 454 | tr '\n' ' ')
$ mkdir ${dirs}
然后我使用这些目录来lowerdir
安装overlayfs
:
$ dirs=${dirs::-1}
$ mkdir mountpoint
# mount overlay -t overlay mountpoint -o lowerdir=${dirs// /:}
# umount mountpoint
效果很好。但是,如果我这样做:
$ mkdir elem_455
# mount overlay -t overlay mountpoint -o lowerdir=${dirs// /:}:elem_455
mount: /home/username/dir/mountpoint: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.
$ dmesg | tail
(...)
[ 1541.668221] overlayfs: empty lowerdir
(...)
它失败。
所以,发生的事情是这样的:在第一次尝试中,选项字符串的长度是 4094 个字符,而在第二次尝试中,长度是 4103。此外,根据错误判断,字符串被剪切为 4095 个字符。
当然,
$ getconf PAGE_SIZE
4096
因此选项字符串显然仅限于内存页面大小减一。是 Linux 内核施加的限制还是mount
程序本身的限制?有什么办法解决这个问题吗?
答案1
一种想法是将部分目录聚合到中间的overlayfs层中。然后,我们可以将它们聚合到最终的挂载点。
# mount overlay -t overlay dummy1 -o lowerdir=${dirs// /:}
# mount overlay -t overlay dummy2 -o lowerdir=${dirs// /:}
# ...
# mount overlay -t overlay mountpoint -o lowerdir=dummy1:dummy2:...