90 秒后,从远程 Ubuntu 服务器到 Win11 上的 WSL 的 Rsync 失败,并显示“无法解释的错误(代码 255)”

90 秒后,从远程 Ubuntu 服务器到 Win11 上的 WSL 的 Rsync 失败,并显示“无法解释的错误(代码 255)”

好的,所以我在地下室有一个小型的 minecraft 服务器,运行 Ubuntu Server 22.04.3 LTS(GNU/Linux 5.15.0-87-generic x86_64)

我楼上有一台安装了 WSL 的 Windows 11 机器。一切都已最大程度更新。

我正在尝试这样做,当我启动 Windows PC 时,WSL 启动并执行 rsync,从小型服务器抓取所有内容并复制到我的 Win11 机器上的外部驱动器。我做到了!它起作用了!但连接在 90 秒后断开,我尝试了很多方法来修复它,但都失败了。

我尝试过的事情:

我正在使用

  • TCPKeepAlive yessshd_config在and的所有实例中ssh_config(服务器和 wsl)
  • ServerAliveInterval 15在所有情况下ssh_config
  • ServerAliveCountMax 3在所有情况下ssh_config
  • ClientAliveInterval 600在所有情况下sshd_config
  • ClientAliveCountMax 0在所有情况下sshd_config
  • --timeout=600rsync 标志
  • sudo ufw disable在 WSL 和远程服务器中禁用 UFW( )
  • 已禁用 Windows 防火墙
  • 在路由器中明确转发 SSH 端口
  • 确保 Windows 设置为私人连接,而不是公共连接

实际上,这些选项都没有改变 90 秒的超时时间,所以我想我可以向社区提出的下一个问题是……有人知道有什么可以默认为 90 秒超时吗?也许可以通过这种方式缩小范围

我已经开始在 reddit 上制作一份我认为已经完整的指南,所以我将在这里发布该指南,以便大家参考我目前的位置和我所做的事情。

开始 Reddit 帖子

好的,我能够让 Windows 在启动时提取更改。我在这里写一份指南主要是因为我知道我以后会再次需要它,而且我不想花一整天时间弄清楚我是怎么做到的哈哈

视窗

我们将备份到位于 Windows PC 上的外部驱动器,并且只要某个用户登录,备份就会开始。

我将备份驱动器更改为字母 Z,我不会在本指南中介绍如何执行此操作。

启动备份

  1. 导航到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
    并创建一个.bat包含以下内容的新文件,可以是任何名称。当用户登录时,只要位于此文件夹中,
    wsl -u root sudo service backup start
    此文件就会自动启动。.bat

西弗吉尼亚海岸

为了防止密码提示:

  1. sudo visudo /etc/sudoers.d/backup
    并添加
    %sudo ALL = (ALL) NOPASSWD: /usr/sbin/service backup start

  2. 确保 WSL 可以无密码 ssh 访问远程服务器(这意味着您可以从 WSL 通过 SSH 进入远程服务器而无需输入密码)。我也不会介绍如何设置主机密钥对验证。

创建服务

这将备份test位于远程服务器主文件夹内的文件夹它将在端口 22 上运行,如果服务器上的文件被删除,下一次备份将从备份中删除文件。--delete如果您不希望备份删除任何内容,请删除该参数。

  1. sudo vim /etc/systemd/system/backup.service

    并添加

     [Unit]
     Description=MyBackup
    
     [Service]
     User=<WSL Username Here, must be run as a user so rsync can use hostkey verification>
     ExecStart=/usr/bin/rsync --timeout=600 -arvz -e 'ssh -p 22' --progress --delete <remoteUser>@<remoteIP>:/home/<remoteHomeFolder>/test /mnt/z/ --log-file /mnt/z/rsync.log        
     Type=forking
    
     [Install]
     WantedBy=multi-user.target
    
  2. .bat运行此命令来加载我们的新服务,准备由文件启动
    sudo systemctl daemon-reload

这些更改完成后,我建议重新启动。如果你像我一样将驱动器号更改为备份,WSL 无论如何都不会识别新的驱动器号,直到你重新启动,通过重新启动你应该可以正确触发备份。

编辑:
显然这不是一个完整的解决方案,因为 rsync 在 90 秒后断开连接

2023/10/23 16:26:33 [467] rsync error: unexplained error (code 255) at rsync.c(713) [generator=3.2.7]
2023/10/23 16:26:33 [481] rsync error: received SIGUSR1 (code 19) at main.c(1613) [receiver=3.2.7]
2023/10/23 16:26:33 [467] rsync: [generator] write error: Broken pipe (32)

用谷歌搜索这个问题让我走进了死胡同。

结束 Reddit 帖子

就这样吧。我希望它足够详细,这个问题让我很紧张,我希望它能被解决。

答案1

感谢您提出这个问题;我很乐意思考这个问题。根据以下消息,我猜测这是 SSH 连接的问题:

unexplained error (code 255)- 可能意味着 SSH 正在告诉 rsync 连接失败?

write error: Broken pipe (32)- 这通常意味着连接已关闭,但我们仍在尝试写入它。

尝试更改命令以从 rsync 中删除多余的消息并专注于 SSH 调试:

rsync:删除-v--progress,也-r暗示了-a,并且-z在以太网上不是必需的。

SSH: 添加-vvv

例子: rsync -a -e 'ssh -vvv' --delete user@ipaddr:/src /dst --log-file rsync.log

如果失败,您可能需要启动WireShark以获取更多信息。您也可以尝试通过 进行连接wireguard,因为发送的流量将通过 UDP,这可能会排除由任何高级/有缺陷的网络设备引起的任何其他问题。

相关内容