好的,所以我在地下室有一个小型的 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 yes
sshd_config
在and的所有实例中ssh_config
(服务器和 wsl)ServerAliveInterval 15
在所有情况下ssh_config
ServerAliveCountMax 3
在所有情况下ssh_config
ClientAliveInterval 600
在所有情况下sshd_config
ClientAliveCountMax 0
在所有情况下sshd_config
--timeout=600
rsync 标志sudo ufw disable
在 WSL 和远程服务器中禁用 UFW( )- 已禁用 Windows 防火墙
- 在路由器中明确转发 SSH 端口
- 确保 Windows 设置为私人连接,而不是公共连接
实际上,这些选项都没有改变 90 秒的超时时间,所以我想我可以向社区提出的下一个问题是……有人知道有什么可以默认为 90 秒超时吗?也许可以通过这种方式缩小范围
我已经开始在 reddit 上制作一份我认为已经完整的指南,所以我将在这里发布该指南,以便大家参考我目前的位置和我所做的事情。
开始 Reddit 帖子
好的,我能够让 Windows 在启动时提取更改。我在这里写一份指南主要是因为我知道我以后会再次需要它,而且我不想花一整天时间弄清楚我是怎么做到的哈哈
视窗
我们将备份到位于 Windows PC 上的外部驱动器,并且只要某个用户登录,备份就会开始。
我将备份驱动器更改为字母 Z,我不会在本指南中介绍如何执行此操作。
启动备份
- 导航到
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
并创建一个.bat
包含以下内容的新文件,可以是任何名称。当用户登录时,只要位于此文件夹中,
wsl -u root sudo service backup start
此文件就会自动启动。.bat
西弗吉尼亚海岸
为了防止密码提示:
sudo visudo /etc/sudoers.d/backup
并添加
%sudo ALL = (ALL) NOPASSWD: /usr/sbin/service backup start
确保 WSL 可以无密码 ssh 访问远程服务器(这意味着您可以从 WSL 通过 SSH 进入远程服务器而无需输入密码)。我也不会介绍如何设置主机密钥对验证。
创建服务
这将备份test
位于远程服务器主文件夹内的文件夹它将在端口 22 上运行,如果服务器上的文件被删除,下一次备份将从备份中删除文件。--delete
如果您不希望备份删除任何内容,请删除该参数。
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
.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,这可能会排除由任何高级/有缺陷的网络设备引起的任何其他问题。