我在 Debian 机器上运行 Samba 服务器。它运行良好;Windows 可以正常读取和写入它,但有一个问题。
我通过 Samba 共享的文件夹 (/var/samba) 存储在我的主驱动器上,这是一个旧的 40GB IDE 驱动器。该文件夹内有指向我系统上其他文件夹的符号链接,其中 2 个实际上位于我的 1TB SATA 驱动器上。
在 Windows 中,我将 Samba 共享映射到驱动器号,它显示只剩余 9GB(这是服务器根驱动器(40GB 驱动器)上剩余的空间量)。
我可以让 Samba 报告剩余的可用空间量不同吗?我试图将 Windows 备份到与 1TB 驱动器符号链接的文件夹之一中(是的,该驱动器上有足够的剩余空间),但 Windows 不允许我这样做,因为它认为剩余的可用空间不足。
答案1
我真的不知道除了作假。
从链接文章中复制。
在 smb.conf 中,将 dfree 命令设置为脚本。该参数需要一个命令,该命令将返回块的总数,然后返回可用的块数。samba 文档建议如下:
[global]
dfree command = /usr/local/bin/dfree
脚本 /usr/local/bin/dfree
#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$4}'
以下内容是直接从https://web.archive.org/web/20150410132141/http://www.subvs.co.uk/faking_available_disk_space_samba它是原始网页地址的复制品,以便未来的互联网访问者可以访问。https://m.xkcd.com/979/的确。
伪造 Samba 上的可用磁盘空间
我在一台即将报废的 Exchange 服务器上运行 exmerge,而我能找到的唯一可以存放导出的 pst 文件的地方是一台老旧的、工作量不足的 ubuntu 服务器。它有所需的可用空间,因此只需对 smb.conf 进行一些更改,它就可以运行了。第一次运行很顺利,但过了一会儿,我想再次运行它。如果与它导出的邮箱相匹配的 pst 文件已经存在,Exmerge 将进行某种同步,因此当它说需要 60G 时,它实际上并没有这样做,因为已经有 59G 了。
当然,除非有足够的空间进行完全导出,否则它将拒绝运行(除非有一个“强制”开关,我不知道?)。samba 出现了,还有一个实际上不是为这项工作而制作但工作完美的命令:dfree 命令。这将让您欺骗连接的机器,让它们相信您有您想要的任何磁盘空间。
该参数需要一个命令,该命令将返回块的总数以及可用的块数。samba 文档建议如下:
#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$4}'
然后在你的 smb.conf 中:
[global]
dfree command = /usr/local/bin/dfree
当然现在您可以选择如何伪造 samba 报告的可用磁盘空间,您可以使该命令只是 cat 一个带有您想要的数字的文本文件,或者更简单,只是使它看起来像一个魔术磁盘,具有相同的总空间和可用空间量:
#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$2}'
通过巧妙地更改命令,它会将可用空间报告为与总空间相同。这样可能不是一个好主意,但在紧急情况下它确实很有用!
答案2
设置确实是解决这个问题的办法,但不幸的是dfree command
,smb.conf
这是文档截至 2023 年 5 月,数据并不准确。
- 正如@Hashbrown 在评论中指出的那样,共享的路径并未作为被调用脚本的参数给出。
$1
始终为“。”。 - 也无法为脚本提供自定义参数。
- 但是,Samba 从共享目录调用脚本,因此如果需要,脚本可以
$PWD
根据所需的共享选择其操作。 - 该设置通常不应放在
[global]
部分中,而应放在需要它的共享部分中。因此其他共享将使用默认机制来返回大小。
因此,如果您在单个 Samba 共享下安装了不同的磁盘,则需要确定要报告该共享的大小并定义执行此操作的脚本。
这是一个例子,在单个共享下安装了 2 个不同的磁盘。
$ tree /mnt
/mnt
└── myshare
├── disk1
└── disk2
在“smb.conf”中:
[myshare]
comment = Share with 2 mounted disks
path = /mnt/myshare
;# ... other share settings ...
dfree command = /usr/local/bin/my_dfree.sh
在my_dfree.sh
脚本中,选择要返回哪个磁盘的大小,然后回显该磁盘的总块数和可用块数:
#!/bin/bash
diskA="$PWD/disk1"
diskB="$PWD/disk2"
# get total number of blocks and free blocks
# into arrays sizesA and sizesB
sizesA=( $( df $diskA | tail -1 | awk '{print $2,$4}' ) )
sizesB=( $( df $diskB | tail -1 | awk '{print $2,$4}' ) )
# return sizes of the disk with smaller free space left
if (( ${sizesA[1]} <= ${sizesB[1]} )); then
echo "${sizesA[@]}"
else
echo "${sizesB[@]}"
fi