rsync 手册页显示“多播传输协议可用于同时将批量更新文件并行传输到许多主机,而不是单独向每个主机发送相同的数据。” 但我找不到任何有关如何做到这一点的信息。任何人都可以回复一个如何执行此操作的示例或提供该信息的 URL?
首先,我承认这些不是口是心非的最新版本。客户端在各种操作系统版本上运行服务器,我们目前从系统存储库安装 duply 和 duplicity。我进行了搜索,但没有发现任何迹象表明这是在更新版本中修复的问题。如果有人可以告诉我它是,我们将更新系统以安装这些软件包的更新版本。但在投入精力之前,我宁愿确定地知道。
我们使用 duplicity 备份文件,由 duply 管理,并通过 cron 运行。在运行完整备份时,我们托管设施的维护活动使接收服务器脱机。后来,当试图从该备份恢复以准备替换该服务器时,我发现备份已损坏,在维护期间有几个 0 字节文件。我没有收到来自 cron 的关于错误的电子邮件,记录的输出显示虽然 rsync 报告错误,但口是心非没有识别错误(“错误 0”):
Start duply v1.11, time is 2022-12-30 02:00:01.
Using profile '/etc/duply/sites'.
Using installed duplicity version 0.7.06, python 2.7.12, gpg 1.4.20 (Home: ~/.gnupg), awk '
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)', grep 'grep (GNU grep) 2.25', bash
'4.3.48(1)-release (x86_64-pc-linux-gnu)'.
Checking TEMP_DIR '/tmp' is a folder and writable (OK)
Test - En/Decryption skipped. (Testing disabled)
--- Start running command PRE at 02:00:02.363 ---
Skipping n/a script '/etc/duply/sites/pre'.
--- Finished state OK at 02:00:02.415 - Runtime 00:00:00.051 ---
--- Start running command BKP at 02:00:02.433 ---
Attempt 1 failed. BackendException: Error running 'rsync -e 'ssh -oBatchMode=yes' /tmp/duplicity-upULdT-tempdir/mktemp-i_a13g-605 USER@SERVER:PATH/sites/duplicity-full.20221230T070002Z.vol604.difftar.gpg': returned 255, with output:
packet_write_wait: Connection to 12.34.567.890 port 22: Broken pipe
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
--------------[ Backup Statistics ]--------------
StartTime 1672383612.11 (Fri Dec 30 02:00:12 2022)
EndTime 1672388712.14 (Fri Dec 30 03:25:12 2022)
ElapsedTime 5100.03 (1 hour 25 minutes)
SourceFiles 21623
SourceFileSize 18523309075 (17.3 GB)
NewFiles 21623
NewFileSize 18523309075 (17.3 GB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 21623
RawDeltaSize 18514613173 (17.2 GB)
TotalDestinationSizeChange 17904721458 (16.7 GB)
Errors 0
-------------------------------------------------
--- Finished state OK at 03:25:32.689 - Runtime 01:25:30.256 ---
--- Start running command POST at 03:25:32.700 ---
Skipping n/a script '/etc/duply/sites/post'.
--- Finished state OK at 03:25:32.715 - Runtime 00:00:00.014 ---
损坏的文件:
-rw------- 1 backup adm 26268756 Dec 30 03:08 duplicity-full.20221230T070002Z.vol597.difftar.gpg
-rw------- 1 backup adm 0 Dec 30 03:08 duplicity-full.20221230T070002Z.vol598.difftar.gpg
-rw------- 1 backup adm 0 Dec 30 03:08 duplicity-full.20221230T070002Z.vol599.difftar.gpg
-rw------- 1 backup adm 0 Dec 30 03:08 duplicity-full.20221230T070002Z.vol600.difftar.gpg
-rw------- 1 backup adm 0 Dec 30 03:08 duplicity-full.20221230T070002Z.vol601.difftar.gpg
-rw------- 1 backup adm 0 Dec 30 03:08 duplicity-full.20221230T070002Z.vol602.difftar.gpg
-rw------- 1 backup adm 0 Dec 30 03:08 duplicity-full.20221230T070002Z.vol603.difftar.gpg
-rw------- 1 backup adm 26281466 Dec 30 03:22 duplicity-full.20221230T070002Z.vol604.difftar.gpg
将来可以做些什么来防止这种情况发生?我不介意备份因服务器问题而失败。我确实想知道它失败了,所以我可以处理它。我查看了 duply、duplicity 和 rsync 页面,但看不到任何其他选项来指定会影响它。
tl; dr:我想要rsync
一个目录到它自己的后代,然后rsync
将所述后代返回到原始目录——包括两个方向的删除和排除。
在你问一个明显的问题之前,“你为什么要这样做?” 或指出另一种方法会有多好,这是业务需求。这不是我的选择,我知道风险,所以放纵我。我不打算进一步证明这种方法的合理性。?
细节:
我想要rsync
一个目录到它自己的后代 - 即,它“下面”或“内部”的目录,例如,然后将后代的更改同步回原始目录,例如parent
to ,包括删除和两个方向的排除。在视觉上,我需要这样做:parent/child
parent/child
parent
parent -> parent/child
parent <- parent/child
困难在于...
- 从祖先到后代时防止无限递归
- 将后代同步回其祖先时,不会在操作中删除源文件(表现为“文件已消失”错误)
- 始终尊重例外情况
我使用以下命令在每个午夜运行一个 rsync 任务:
rsync -ahzP --stats --update --delete-before --delete-excluded --exclude "*.log" --exclude temp /mnt/raid/ /mnt/backups > /root/ext_backup.log 2>&1
/mnt/backups是一个 NFS 挂载。
备份过程顺利运行了大约半小时,然后我收到以下错误:
rsync: [receiver] write failed on "/my/file": Input/output error (5)
rsync: [receiver] chown "/my/file" failed: Permission denied (13)
rsync error: error in file IO (code 11) at receiver.c(378) [receiver=3.2.3]
rsync: [sender] write error: Broken pipe (32)
可能是什么问题呢?
我为我的 Proxmox 主机制作了一个脚本,以将其每日备份复制到另一台机器(运行 Windows Server 2019)。
该脚本挂载 CIFS 共享并运行以下 rsync 命令:
rsync -aqzP --delete --delete-excluded /mnt/raid/ /mnt/backups --exclude "*.log"
它运行了大约 6 分钟,然后当它尝试复制vzdump-qemu-100-2021_05_16-00_00_03.vma.zst
文件时,它会抛出一个错误:
rsync: [receiver] close failed on "/mnt/backups/backups/dump/.vzdump-qemu-100-2021_05_16-00_00_03.vma.zst.nrDEvQ": Broken pipe (32)
rsync error: error in file IO (code 11) at receiver.c(871) [receiver=3.2.3]
rsync: [sender] write error: Broken pipe (32)
可能是什么问题呢?
在 Windows 机器上,有复制所需的所有空间。
我在端口 873 上侦听了 rsyncd 版本 3.1.2,我想限制连接到我的客户端下载我的文件的带宽。我在配置文件中都添加了 bwlimit :
uid = nobody
gid = nogroup
[data]
path = /var/data/files/
comment = Repo
read only = yes
bwlimit = 10
并在守护进程配置文件上尝试过
[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf
[Service]
ExecStart=/usr/bin/rsync --daemon --no-detach --bwlimit=10
[Install]
WantedBy=multi-user.target
在任何一种情况下,当我的客户端连接到 rsync 以下载文件时,每个日志都会忽略该参数:
Dec 29 08:27:12 pubserver systemd[1]: Started fast remote file copy program daemon.
Dec 29 08:27:12 pubserver rsyncd[32533]: rsyncd version 3.1.2 starting, listening on port 873
Dec 29 08:29:42 pubserver rsyncd[1534]: Unknown Parameter encountered: "bwlimit"
Dec 29 08:29:42 pubserver rsyncd[1534]: IGNORING unknown parameter "bwlimit"
Dec 29 08:29:42 pubserver rsyncd[1534]: connect from workspace (10.155.120.1)
Dec 29 08:29:42 pubserver rsyncd[1534]: rsync on repo/ from workspace (10.155.120.1)
Dec 29 08:29:42 pubserver rsyncd[1534]: building file list
Dec 29 08:29:44 pubserver rsyncd[1534]: sent 17567 bytes received 72 bytes total size 16787953
有没有办法使这个限制起作用?或者,如果不再支持 bwlimit,如何减慢/限制 rsync 连接?
我需要通过多个跳转主机将文件从远程主机同步到我的本地机器。我想使用共享 SSH 连接,这样我就不必在某些跳转主机上多次提交 2FA。
这个想法是我创建一个主连接
ssh user@jumphost01
然后是其他连接
ssh -J user@jumphost01,user@jumphost02 root@target01
...
共享连接控制文件~/.ssh/
如下
control:target01:22:root
control:jumphost01:22:user
control:jumphost02:22:user
现在我希望我可以使用 rsync 远程文件
rsync -azv -e 'ssh -o ControlMaster=auto' root@target:/somePath/someFile someFile
or
rsync -azv root@target:/somePath/someFile someFile
or
rsync -azv -e 'ssh -F /root/.ssh/config' root@target:/somePath/someFile someFile
但我收到 rsync 错误
receiving incremental file list
someFile
WARNING: someFile failed verification -- update discarded (will try again).
someFile
ERROR: someFile failed verification -- update discarded.
sent 68 bytes received 317 bytes 770.00 bytes/sec
total size is 305 speedup is 0.79
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1819) [generator=3.2.3]
rsync 能够连接到目标,但文件传输不成功。
rsync 版本
local machine - rsync version 3.2.3 protocol version 31
target machine - rsync version 3.2.3 protocol version 31
TLDR;
我在没有 SSH 主连接的情况下测试了 rsync 命令
rsync -azv -e 'ssh -J user@jumphost01,user@jumphost02' root@target01:someFile .
One-time password (OATH) for `user':
Password:
receiving incremental file list
someFile
WARNING: someFile failed verification -- update discarded (will try again).
someFile
ERROR: someFile failed verification -- update discarded.
sent 68 bytes received 2,767 bytes 195.52 bytes/sec
total size is 18,976 speedup is 6.69
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1819) [generator=3.2.3]
并且仍然得到相同的错误。
rsync:[generator] 设置权限失败:不支持操作 (95)
我正在运行 ubuntu 21.10 并面临与上述链接相同的问题,但无法遵循解决方案步骤,例如安装 libssl-dev 会给我以下错误:
[~/tmp/rsync-be3d6c0fbbd07781bbae6261cda109f8f08c031b]# apt install libssl-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Suggested packages:
libssl-doc
E: Sub-process returned an error code
由于声誉低,我也无法在那里发表评论(提问),我需要运行我的 rsync,有没有办法降级到 3.1.3-8 或更简单的解决方案?
谢谢你。
我正在使用rsync
增量备份,使用--link-dest
指向上一个备份的选项,以便未更改的文件硬链接到那里。
这是有效的,但不适用于所有文件。例如,我在备份中有一个目录,其中包含三年多未修改的文件。但出于某种奇怪的原因,只有其中一些是硬链接。
不方便的是,较大的文件都是副本(即只有一个指向该文件的链接,通过 检查ls -l
)。但是对于一些较小的文件也是如此,而且确实一些硬链接文件比一些复制的文件大。
似乎没有任何模式可以让我预测哪些将是副本以及哪些硬链接。文件名长度和文件大小似乎无关紧要,修改日期也是如此:在复制和硬链接列表中都有所有这些。也就是说,文件在多个备份中似乎确实是一致的,因此一次备份发生的情况似乎也发生在下一次备份中。
是否有文件的某些属性(技术或其他),某些功能会导致rsync
复制它而不是硬链接它?
编辑1:提到“属性”让我想知道是否有一些ls -l
没有列出的属性可能会产生影响,但是lsattr
在源目录中执行表明所有文件都具有相同的属性。
编辑 2:我之前说过(现在已删除)权限都是一样的,但这是错误的。目标(备份)目录中的权限相同。我正在使用--perms
(保留权限),所以我不知道为什么没有保留权限。我以前也以非 root 用户身份运行,但现在我尝试以 root 身份运行以防万一,但仍然没有保留权限,这可能是某些文件看起来已经更改的原因 - 文件没有't 但它的权限显然有(至少,与以前的备份相比,它的权限不正确)。
编辑 3:我现在认为这与我的 CIFS 服务器有关。mount.cifs
手册页中有关于该file_mode
选项的内容:“如果服务器不支持 CIFS Unix 扩展,则会覆盖默认文件模式。” 当我运行mount
不带参数的命令来列出挂载时,列出的选项包括file_mode=0755
以及dir_mode=0755
与我看到的内容相关联。我不能chmod
在挂载上的文件,因此那些最初没有0755
权限的文件被视为已更改,因此被再次复制 - 由于挂载而再次在备份中获得错误的权限。
我的 WSL Ubuntu 上有一个备份脚本,我手动使用它来将我的 linux 系统备份到 USB 驱动器(安装在 WSL 上的 NTFS 卷)。
我遇到了 --link-dest 的问题,这是我以前在其他备份脚本中没有遇到过的;但是我已经有一段时间没有用 bash 写过任何东西了。
rsync --progress -rlDvuRH --modify-window=1 link-dest=$LAST/ -e "ssh -i /home/username/.ssh/id_rsa" --exclude='*home/.ecryptfs*' --exclude='*files_trashbin*' --exclude='*files_version*' root@hostname:{/var/www/,/root/,/home/,/etc/,/mnt/nfs/,/mnt/backupstore/} /home/username/rsync-backup/$DATE/
$LAST 是最后一个成功的备份目标目录,当我将它回显到控制台时,这个变量可以正常工作。
这给了我错误:Unexpected remote arg: root@hostname:/var/www/
如果我使用确切的一些 rsync 命令,但没有 --link-dest 参数;完全没有问题,它会进行完整备份。我在看什么?是不是我使用的 {} 符号与 --l 有一些奇怪的交互