有人知道是否有可能有一个小型的 Linux 文件系统显然无限的(或者非常大的)自由空间?
我们有一个带有许多文件系统的 Samba 服务器,所有这些文件系统都可从一个小型“根”文件系统访问,该文件系统仅包含指向实际文件系统的符号链接(我们在 Samba 中使用宽链接)。此“根”文件系统上永远不会存放任何数据,只有符号链接。
问题在于,smb 客户端(windows/mac)会检查共享(“root”)的大小,如果大小不够,就会拒绝将数据复制到那里,即使在实际位置(即符号链接指向的位置)有足够的空间。
据我所知,Samba 无法伪造磁盘空间,但也许某些文件系统可以?这里有人有什么建议吗?
答案1
您可以使用 Samba 的全局选项之一来解决此问题,如前所述这里。该网页明确指出:
此全局选项用于错误确定磁盘上剩余可用空间的系统。到目前为止,唯一确认需要设置此选项的系统是 Ultrix。此选项没有默认值,这意味着 Samba 已经知道如何自行计算可用磁盘空间,并且结果被认为是可靠的。您可以按如下方式覆盖它:
[global]
dfree command = /usr/local/bin/dfree
此选项应指向一个脚本,该脚本应返回块中的总磁盘空间以及可用块的数量。Samba 文档建议使用以下可用脚本:
#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$4}'
只需确保修改上述脚本以包含所有不同的文件系统,并且它返回合并所有文件系统的总和。或者,您希望使用的特定文件系统。
答案2
#!/bin/bash
disks=()
disks+=('/dev/disk/by-label/usb_4tb_wd')
disks+=('/dev/mapper/centos-root')
# http://superuser.com/questions/965321/linux-presenting-a-larger-than-real-file-system
# Filesystem 1K-blocks Used Available Use% Mounted on
# /dev/sdb1 3845532688 2577688240 1072495968 71% /mnt/usb_4tb_wd
# 3845532688 1072495968
df_total=0
df_available=0
for disk in "${disks[@]}" ; do
((df_total = df_total + $(df $disk | tail -1 | awk '{print $2}') ))
((df_available = df_available + $(df $disk | tail -1 | awk '{print $4}') ))
done
echo "$df_total $df_available"
exit 0
答案3
这两个答案都正确,但必须明确列出要总计的每个文件系统似乎很愚蠢。在您的 samba 文件全局部分中包含 dfree 命令。https://www.oreilly.com/openbook/samba/book/ch08_06.html
[global]
dfree command = /usr/local/bin/dfree
dfree 命令的位置为:
#!/bin/bash
[ "$1" = "." ] && dir="$(pwd)" || dir="$1"
df --output="target"| \
grep -P "^\\Q${dir%/}\\E/." | \
xargs -d '\n' \
df --output="size" --output="avail" --total "$dir" | \
tail -1
简单解释一下。第一个 df 命令只是查找挂载点的名称。我们使用 perl 表达式 grep 过滤列表,以便我们的文件名可以包含句点和其他特殊字符。然后将该列表发送到 xargs 命令。因此,我们可以将正确转义为 shell 参数的名称传递给执行总计的 dfree 命令。最后一个 tail 命令是让我们只显示总计。
注意:Linux 文件名中包含换行符和回车符是合法的。但我没有尝试在此脚本中支持此类文件名。这也可能不计算使用 --bind 选项挂载的目录
关于更普遍的问题,你能伪造一个比 Linux 中实际拥有的更大的文件系统吗?当然。最简单的方法之一是通过以下方式在 ext4 文件系统上创建文件系统映像:
dd if=/dev/zero of=myimage.img bs=4K count=10485760 status=progress
mkfs -t ext4 myimage.img
您现在有一个 10 GiB 的文件系统。但是,如果您使用 du -sk 检查,您会发现它只使用了磁盘上该空间的一小部分,直到您真正开始填满为止。
您可以使用 lvm 的精简配置。