在 FreeBSD 中使用 rsync 通过 Samba 备份 Windows 托管的共享

在 FreeBSD 中使用 rsync 通过 Samba 备份 Windows 托管的共享

我正在尝试使用 rsync 从 FreeBSD8.2 框备份 Windows 托管的共享:

bash$ sudo -i
bash#  uname -a
FreeBSD zeus.companyname.gr 8.2-RELEASE ...amd64
bash# cat /root/.nsmbrc
...
[MACHINENAME:ADMINISTRATOR]
password=mysuperuncrackablepassword
bash# mount_smbfs -N -E utf-8:cp737 -I 192.168.0.2 //Administrator@machinename/f$ /iso1/
bash# ls -l -raw /iso1/prj/
ΠΡΟΕΤΟΙΜΑΣΙΑ ΔΕΔΟΜΕΝΩΝ ΠΑΡΕΛΘΟΝΤΩΝ ΕΤΩΝ
Πανεπιστήμιο - Προβολή, Δημοσιότητα

简单来说,我正确地看到了包含希腊字符的文件夹(特定于语言环境)。上面的列表来自 PuTTY 会话(即 SSH 会话),PuTTY 默认配置为翻译 UTF-8。

请注意,我没有触及语言环境:

bash# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

看上去一切还好。

但是,当我尝试从已挂载的文件夹进行 rsyncing 时,一些文件似乎消失了......

bash# rsync --inplace -rltvxp /iso1/ /backups/backup-machinename/
sending incremental file list
file has vanished: "/iso1/prj/..."

消息“文件已消失”意味着 rsync 调用了正确的系统调用来读取文件夹(我相信是 dir/dirent)的内容,并且当它稍后尝试读取其中一个包含的文件时,却没有找到它 - 即“open(2)”失败。

我检查了报告的文件:(a)它存在,(b)它具有全世界可读的权限。

然后我假设 cp737(希腊代码页)是问题所在,因此我再次安装...

bash$ mount_smbfs -N -E utf-8:utf-8 -I 192.168.0.2 //Administrator@machinename/f$ /iso1/

...也就是说,我在 Windows 端也使用了 utf-8。然而,当我再次尝试 rsync 时,它卡住了(!),CPU 利用率达到 100%... 使用 GDB 连接显示:

bash# gdb /usr/local/bin/rsync 3109
GNU gdb 6.1.1 [FreeBSD]
Attaching to program: /usr/local/bin/rsync, process 3109
Reading symbols from /lib/libc.so.7...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /libexec/ld-elf.so.1...(no debugging symbols found)...done.
Loaded symbols for /libexec/ld-elf.so.1
0x0000000800709c0a in getdirentries () from /lib/libc.so.7

...所以看起来 rsync 卡在等待 getdirentries 返回,或者每次调用 getdirentries 都要花费大量的时间......

有任何想法吗?

有人能做到我正在做的事情吗?例如,使用 FreeBSD 从通过 mount_smbfs 安装的 Windows 共享中 rsync 文件名中包含特定于语言环境的字符的文件?

PS 如果有人想知道我为什么要这样做,答案很简单:ZFS。

答案1

我不确定通过 samba 运行 rsync 是否是个好主意。我不知道 rsync 内部做了什么,但它可能会产生大量网络流量以检查哪些文件已更改。

还有一个 Windows 版本的 rsync,可以作为系统服务运行(http://www.brentnorris.net/rsyncntdoc.html)。这样,您就无需承担网络负载,而且由于它仅使用要备份的机器上的本地调用,因此它也可能修复上述问题。我使用此方法来备份用户的笔记本电脑。

相关内容