Jam*_*ude 5 linux wireless-networking file-transfer sftp
这与问题 326211非常相似,但在这种情况下,LAN 是不稳定的 Wi-Fi 连接。
我需要在两台运行 Linux 的计算机之间传输大约 11 GiB 的文件(尽管其中一台可能会重新启动到 Windows。)它们的连接既缓慢又不稳定(由于 Linux 糟糕的 Wi-Fi 支持),但可移动媒体(例如闪存驱动器或外部硬盘驱动器)目前不是一种选择。
现在,我正在慢慢地通过 SFTP 一个一个地传输文件,但是我必须大约每 90 秒重新连接每台计算机,而且这些计算机之间的距离不是很近,所以这是不可行的。
这不是问题 30186 的重复;那个特别涉及 Windows 7,并且所有提议的解决方案都涉及封闭源代码、仅适用于 Windows 的程序(恕我直言,这些都是间谍软件,即使我信任它们,也全部不在桌面上——其中一台计算机仅适用于 Linux。)
LSe*_*rni 11
首先,我会尝试看看是否有可能使连接更稳定。除了文件传输之外,我认为使用每 90 秒断开一次的连接是不健康的。
一个简单的 USB WiFi 加密狗可以在那里创造奇迹(首先,调查实际上是哪个设备导致断开连接:主机 A、主机 B 还是接入点?
可能,Linux 与信号损失完全没有关系,而是 WiFi 不稳定性本身的问题。尝试将接入点锁定为较低的速度。即使是微不足道的 11 Mbps,如果坚如磐石,也会胜过不稳定的 54 Mbps 连接。并且很多时候,卡片会尝试更高的速度,即使在这种情况下,它们不可能提供。
如果您遇到每 90 秒断开并重新协商的连接,您最好的选择可能是rsync
将文件分成足够小的块以在重新协商之间进行过滤:
split -b 10000000 file.mp4
Run Code Online (Sandbox Code Playgroud)
将文件拆分为 N 个(例如)10 MiB 的块,称为xaa
, xab
, xac
... 复制完成后,您可以使用cat
.
另一种可能性是完全放弃 TCP 并使用基于 UDP 的协议,例如UDT或UFTP。
最后,您可以在一台机器上设置一个简单的 Web 服务器,并使用wget
或任何支持检索完整性、字节范围和自动重试的 HTTP 客户端来下载整个文件集(如果它们还没有,它会最好压缩一下)。
这需要更长的时间来设置,但它应该会自动进行并使用可用且经过测试和验证的软件(apache、wget)。
诚然,你需要确保脚本是同步的,否则你会浪费很多的连接时间,你也许可以玩无论是 iwconfig
或ifup/ifdown
以接入点强制的行为:
while true; do ifdown wlan0; ifup wlan0; sleep 90; done
Run Code Online (Sandbox Code Playgroud)
或者如果您想将其作为脚本运行(无论哪种方式都需要 root 访问权限,以运行 if* 命令):
#!/bin/sh
while true; do
echo "Going down..."
ifdown wlan0
echo "Coming up..."
ifup wlan0
echo "Ready"
sleep 90
done
Run Code Online (Sandbox Code Playgroud)
“睡眠 90 秒”的问题在于,除非路由器中确实出现了非常奇怪的燃烧错误,否则它的停留时间不会正好是 90 秒。所以我们浪费了很多时间,要么在 WiFi 运营商宕机时熬夜,要么在 WiFi 运营商可能熬夜时宕机。
所以假设路由器的 IP 为 192.168.0.1,在我们运行的两台 Linux 主机上
#!/bin/sh
IP=192.168.0.1
while true; do
if ( ping -f -c 3 -w 1 $IP | grep "0 received" > /dev/null ); then
ifdown wlan0
ifup wlan0
# Extra time: we MUST be sure the network is up!
sleep 5
fi
sleep 2
done
Run Code Online (Sandbox Code Playgroud)
该脚本将向路由器发送三个数据包。数据包很小,不会对带宽产生很大影响。一个丢失的数据包可能是偶然的,两个是巧合——三个丢失的数据包会触发 WLAN 电源循环。我们希望,这应该浪费不超过至多两个秒钟的每个周期(而不是最长90秒)的时间,从来没有触发功率循环,除非有必要。
不用说,必须在路由器上验证 PING 功能 - 如果路由器不响应 ping,或者在 TCP/UDP 负载下丢弃 ICMP(例如,由于协议优先级),则脚本的第二个版本可以执行弊大于利。
但现在我想起来了,你有没有尝试摆弄iwconfig
参数?例如灵敏度阈值:
sens 设置灵敏度阈值。这定义了卡对不良操作条件(低信号、干扰)的敏感程度。正值假定为硬件使用的原始值或百分比,负值假定为 dBm。
根据硬件实现,此参数可以控制各种功能。
在现代卡上,此参数通常控制切换/漫游阈值,即硬件与当前接入点保持关联的最低信号电平。当信号电平低于此阈值时,卡开始寻找新的/更好的接入点。某些卡可能会使用丢失信标的数量来触发此操作。对于高密度的接入点,较高的阈值可确保卡始终与最佳 AP 相关联,对于低密度的 AP,较低的阈值可最大限度地减少切换失败的次数。在更古老的卡上,此参数通常控制延迟阈值,硬件认为通道繁忙的最低信号电平。高于此阈值的信号电平使硬件禁止其自身的传输,而比此更弱的信号将被忽略并且硬件可以自由传输。这通常与接收阈值密切相关,接收阈值是硬件尝试接收数据包的最低信号电平。正确设置这些阈值可防止卡在背景噪声上浪费时间,同时仍接收微弱的传输。现代设计似乎可以自动控制这些阈值。
例子 :
Run Code Online (Sandbox Code Playgroud)iwconfig eth0 sens -80 iwconfig eth0 sens 2
使用 7zip 或 winrar 之类的东西来创建分割档案怎么样,比如每个 50MB。这样您就可以传输文件直到连接断开,但您不需要每次都从头开始。
# -mx0 indicates no compression to be used (quickest method)
7z a -mx0 -v50m video.7z myVideo.mp4
一旦所有文件传输(使用scp
或等效)只是重新组合和提取?您可能还会通过一次传输多个文件获得更好的速度。
——
编辑:我知道您说可移动媒体是不可能的,但是您能否从计算机 1 上卸下硬盘并完全插入计算机 2 以执行传输?
while ! rsync \
--bwlimit <KB/s value> \
-rP \
/path/to/directory_that_contain_the_data_to_be_transferred \
user@destination.host:/path/to/target_directory ; \
do sleep 90;
done
Run Code Online (Sandbox Code Playgroud)
取自https://patrick-nagel.net/blog/archives/434
你想把它放在一个 bash shell 脚本中。类似于以下内容
#!/bin/bash
while ! rsync \
--bwlimit <KB/s value> \
-rP \
/path/to/directory_that_contain_the_data_to_be_transferred \
user@destination.host:/path/to/target_directory; \
do sleep 90;
done
Run Code Online (Sandbox Code Playgroud)
您需要设置 ssh 密钥,如果您不知道该怎么做,这是另一个问题,但基本上是:
ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)
这将创建您的公钥/私钥对。将您的公钥复制到目标计算机,这样您就不必在每次连接断开时都使用密码凭据。
许多其他答案涉及将文件拆分为多个部分并添加完整性检查 - 这与 torrent 的工作方式非常相似。你可以使用类似 rtorrent 的东西吗?
http://libtorrent.rakshasa.no/
归档时间: |
|
查看次数: |
2293 次 |
最近记录: |