Лучший способ передачи файлов по нестабильной локальной сети?

5

Это очень похоже на вопрос 326211 , но в этом случае ЛВС является нестабильным соединением Wi-Fi.

Мне нужно передать около 11 ГБ файлов между двумя компьютерами, оба работают под управлением Linux (хотя один из них может быть перезагружен в Windows.) Их соединение является медленным и нестабильным (из-за ужасной поддержки Wi-Fi в Linux), но сменным носителем (таким как флэш-накопитель или внешний жесткий диск) в настоящее время недоступен.

Прямо сейчас я медленно пересылаю файлы по одному через SFTP, но мне приходится переподключать каждый компьютер примерно каждые 90 секунд, и компьютеры находятся не очень близко друг к другу, поэтому это невозможно.

Это не дубликат Вопроса 30186; что конкретно касается Windows 7, и все предлагаемые решения включают программы с закрытым исходным кодом, предназначенные только для Windows (все они являются шпионскими программами IMHO, и все они не обсуждаются, даже если я им доверяю - один из компьютеров предназначен только для Linux).

JamesTheAwesomeDude
источник
5
С каких это пор поддержка Wi-Fi в Linux "ужасна"? У меня никогда не было проблем.
Snapshoe
1
@snapshoe Так как я попробовал 4 разных адаптера Wi-Fi, а самый стабильный перегревается каждые 90 секунд во время интенсивного использования! И это ПОСЛЕ обновления драйвера ... Я едва мог загрузить новую версию, и даже с моим 10-мегабитным DSL, мой Wi-Fi, как правило, является критической точкой. Я знаю, что все всегда говорят, что в Linux есть отличная поддержка Wi-Fi, но это совсем не мой опыт. Что касается нескольких адаптеров Wi-Fi, которые Ubuntu поддерживает «из коробки», то ни один из них даже близко не сравнится с такой скоростью и стабильностью, которую они достигают в Windows.
JamesTheAwesomeDude
2
почему sneakernet не вариант? en.wikipedia.org/wiki/Sneakernet это круто! используйте флэш-накопитель USB на 16 Гб. или используйте filezilla с открытым исходным кодом с опцией автоматического повторного подключения (повтор).
JP Hellemons
Memory Stick, HTH :)
Ardesco
@snapshoe: Многие многие ноутбуки имеют беспроводные карты , которые нуждаются в проприетарных драйверов , которые не установлены в ОС.
Медив

Ответы:

8

Как насчет использования чего-то вроде 7zip или winrar для создания разделенных архивов, скажем, по 50 МБ каждый. Таким образом, вы можете передавать файлы до тех пор, пока не разорвется соединение, но вам не нужно каждый раз начинать с нуля.

# -mx0 indicates no compression to be used (quickest method)
7z a -mx0 -v50m video.7z myVideo.mp4

После того, как все файлы переданы (используя scpили эквивалентные) просто рекомбинировать и извлечь? Вы, вероятно, также получите лучшую скорость передачи нескольких файлов одновременно.

-

РЕДАКТИРОВАТЬ : Я знаю, что вы сказали, что съемных носителей не может быть и речи, но не могли бы вы удалить жесткий диск из компьютера 1 и просто подключить к компьютеру 2 для выполнения передачи?

Джеймс
источник
Близко ... но не игра в кости. Файлы представляют собой видео в формате MP4, и каждый из них длится около 30 минут (~ 190 МБ), поэтому каждый метод сжатия ДОБАВЛЯЕТ около 2 МБ .. +1 за изобретательность, хотя!
JamesTheAwesomeDude
1
Я не говорю, чтобы сжать это - просто разделить это, чтобы предотвратить перезапуск всей передачи, когда соединение разрывается. Думаю, вы упускаете суть.
Джеймс
2
А ну понятно. Извините, да, я действительно упустил момент. Но тогда было бы намного проще просто использовать splitи cat, и, возможно, tarзаранее, чтобы получить все файлы в один большой блок.
LSerni
1
Расскажите мне больше об этой splitкоманде ... похоже, это может быть дроид, которого я ищу ...
JamesTheAwesomeDude
11

Прежде всего, я попробую посмотреть, можно ли сделать соединение более стабильным. Помимо передачи файлов, я не думаю, что полезно работать с соединением, которое прерывается каждые 90 секунд.

Простой USB USB-ключ может творить чудеса (во-первых, выяснить, какое устройство на самом деле вызывает отключение: хост A, хост B или точка доступа?

Возможно, Linux не имеет ничего общего с потерей сигнала, но это скорее вопрос WiFi нестабильности таковому . Попробуйте заблокировать точку доступа на более низкой скорости. Даже мизерная скорость 11 Мбит / с, если она надежна, превзойдет слабое соединение со скоростью 54 Мбит / с. И очень часто карты будут пытаться увеличить скорость, даже если, учитывая ситуацию, они не смогут доставить .

Если вы застряли с соединением, которое прерывается и пересматривается каждые 90 секунд, лучше всего подойдет rsyncили разбить файлы на достаточно маленькие кусочки для фильтрации между повторными переговорами:

split -b 10000000 file.mp4

будет разделить этот файл на N куски (скажу) 10 МиБа каждый, называется xaa, xab, xac... После завершения копирования, вы можете собрать куски с другой стороны , используя cat.

Другая возможность может состоять в том, чтобы вообще отказаться от TCP и использовать протокол на основе UDP, например UDT или UFTP .

Наконец, вы можете установить простой веб-сервер на одном компьютере и использовать wgetили любой HTTP-клиент, поддерживающий целостность поиска, диапазон байтов и автоматическую повторную попытку, чтобы загрузить весь набор файлов (что, если их еще нет, было бы лучше сжать).

Это дольше для установки, но затем оно должно продолжаться автоматически и использует доступное и проверенное и проверенное программное обеспечение (apache, wget).

Приходите снова - ушли снова - Финнеган

Предполагая, что вам необходимо убедиться, что сценарии синхронизированы, или вы потратите много времени на соединение, вы, вероятно, можете поиграть с одним из них iwconfig или ifup/ifdownзаставить его работать так:

while true; do ifdown wlan0; ifup wlan0; sleep 90; done

или если вы хотите запустить его в виде скрипта (для запуска команд if * все равно потребуется root-доступ):

#!/bin/sh
while true; do
    echo "Going down..."
    ifdown wlan0
    echo "Coming up..."
    ifup wlan0
    echo "Ready"
    sleep 90
done

(Надеюсь) лучший способ

Проблема со сном 90 секунд заключается в том, что, если что-то действительно странно не работает в маршрутизаторе, время его работы не будет точно равным 90 секундам. Таким образом, мы тратим много времени на то, чтобы оставаться на ногах, когда оператор Wi-Fi не работает, или на спаде, когда оператор Wi-Fi мог оставаться на связи.

Итак, допустим, что маршрутизатор имеет 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

Этот сценарий будет снимать три пакета в направлении маршрутизатора. Пакеты довольно малы и не сильно влияют на пропускную способность. Один отброшенный пакет может быть случайным, два совпадением - три отброшенных пакета запускают цикл питания WLAN. Надеемся, что это должно тратить не более двух секунд на цикл (вместо 90 секунд) и никогда не запускать цикл питания, если в этом нет необходимости.

Само собой разумеется, что функциональность PING должна быть проверена на маршрутизаторе - если маршрутизатор не отвечает на запросы ping или отбрасывает ICMP, когда находится под нагрузкой TCP / UDP (например, из-за приоритетов протокола), тогда вторая версия сценария может выполнить гораздо больше вреда, чем пользы.

Но теперь, когда я думаю об этом, вы пытались поиграться с iwconfigпараметрами? Например порог чувствительности:

Sens Установите порог чувствительности. Это определяет, насколько чувствительна карта к плохим условиям работы (низкий уровень сигнала, помехи). Положительные значения предполагаются как необработанные значения, используемые аппаратными средствами, или в процентах, отрицательные значения принимаются как дБм.

В зависимости от аппаратной реализации этот параметр может управлять различными функциями.

На современных картах этот параметр обычно контролирует порог хэндовера / роуминга, самый низкий уровень сигнала, для которого аппаратное обеспечение остается связанным с текущей точкой доступа. Когда уровень сигнала становится ниже этого порога, карта начинает искать новую / лучшую точку доступа. Некоторые карты могут использовать количество пропущенных маяков, чтобы вызвать это. Для высокой плотности точек доступа более высокий порог гарантирует, что карта всегда ассоциируется с лучшей точкой доступа, а для низкой плотности точек доступа более низкий порог минимизирует количество неудачных передач обслуживания. На более старых картах этот параметр обычно управляет порогом отсрочки, самым низким уровнем сигнала, для которого аппаратное обеспечение считает канал занятым. Уровни сигналов выше этого порога заставляют аппаратное обеспечение блокировать его собственную передачу, тогда как слабые сигналы игнорируются, и аппаратное обеспечение может свободно передавать. Обычно это тесно связано с порогом приема, самым низким уровнем сигнала, для которого аппаратное обеспечение пытается принять пакет. Правильная установка этих пороговых значений не дает карте тратить время на фоновый шум, в то же время получая слабые передачи. Современный дизайн, кажется, контролирует эти пороги автоматически.

Пример :

   iwconfig eth0 sens -80
   iwconfig eth0 sens 2
LSerni
источник
Соединения для обоих устройств нестабильны на регулярной основе. Маршрутизатор, который я использую, тоже очень старый. Выполняемая передача переживет повторное соединение Wi-Fi с полностью неповрежденными файлами (полностью = контрольные суммы совпадают), но когда Wi-Fi умирает, фактической ошибки нет (ни на одном хосте); это просто перестает работать . Так что простой сценарий оболочки для отключения + повторного подключения Wi-Fi будет делать каждые 90 секунд.
JamesTheAwesomeDude
Я никогда не сталкивался с такой ситуацией, но попробуйте с помощью этого простого сценария и посмотрите, как это происходит. Я думаю, что должен быть способ заставить эту сеть вести себя должным образом или, по крайней мере, не так ужасно, хотя.
LSerni
5
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

взято с https://patrick-nagel.net/blog/archives/434

Вы хотели бы поместить это в скрипт оболочки bash. что-то вроде следующего

#!/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

вам нужно настроить ssh-ключи, это еще один вопрос, если вы не знаете, как это сделать, но это в основном:

ssh-keygen -t rsa

это создаст вашу пару открытых / закрытых ключей. Скопируйте ваш открытый ключ на конечный компьютер, чтобы вам не приходилось использовать парольные учетные данные при каждом разрыве соединения.

ekeyser
источник
о.0 Итак ... я запускаю это как сценарий оболочки? Нужно ли устанавливать для этого дополнительную программу? Будет ли это работать, если соединение слишком нестабильно для передачи одного файла за один раз? Это было примерно так же полезно, как ответ только по ссылке ... Мне действительно нужно больше информации.
JamesTheAwesomeDude
Если вы используете Linux, то вам, вероятно, не нужно устанавливать никаких дополнительных программ. Все, что вам нужно, это rsync, ssh, ssh-keygen, которые обычно устанавливаются по умолчанию.
ekeyser
5

Многие другие ответы включают в себя разбиение файла на части и добавление проверки целостности - это довольно похоже на работу торрентов. Не могли бы вы использовать что-то вроде рторрента?

http://libtorrent.rakshasa.no/

user3490
источник
вероятно, проще просто использовать BitTorrent Sync, которая делает то же самое labs.bittorrent.com/experiment/sync.html
Джеймс
Интересно, я не знал об этом.
user3490