Как использовать rsync для Android

Вопрос или проблема

Как подключиться к моему Android-устройству для синхронизации музыки (или других данных) с помощью rsync?

Использование rsync через MTP/usb

Это проще, чем многие говорят. Сначала обратите внимание, что при монтировании MTP через GVFS он будет доступен под. Вы можете принудительно это сделать, открыв телефон в графическом файловом менеджере (thunar/nautilus/и т.д.)

/run/user/$UID/gvfs

Переходите туда. Предполагая, что у вас одно MTP-устройство, это должно сработать:

$ cd /run/user/$UID/gvfs/mtp*

Найдите, куда вы хотите передать файлы, и затем rsync их туда

$ cd SanDisk\ SD\ card/Movies/

$ pwd # выводит "/run/user/1000/gvfs/mtp:host=%5Busb%3A003%2C096%5D/SanDisk SD card/Movies"

$ rsync --verbose --progress --omit-dir-times --no-perms --recursive --inplace ~/Videos/ ./

Опции rsync

  • --inplace: Настоятельно рекомендую использовать --inplace, без которого MTP может попытаться скопировать файл заново, а затем переименовать его в старое имя. Это может привести к копированию файла на SD-карту дважды: один раз для переноса MTP на SD-карту и ещё раз, потому что драйвер MTP может не поддерживать (mv), он может использовать (cp/rm) для безопасности.
  • читайте man rsync для описания --verbose, --progress, --recursive, но они в значительной степени само документированы.
  • --omit-dir-times --no-perms требуются, потому что MTP этого не поддерживает.

Использование sshelper

Я нашёл это решение:

  • Установите sshelper на устройство (не требуется рутированное устройство, доступно в Google Play Market)
  • В моей WLAN устройство называется “android”. Но вы можете использовать IP, если не можете задать устройству имя хоста.

Измените локальную конфигурацию ssh, чтобы изменить порт по умолчанию для хоста “android”

.ssh/config
host android
    Port 2222
  • Запустите sshelper на устройстве.
  • Подключите Android-устройство к вашей WLAN.

rsync -rvlc Music android:SDCardLink/

Обновление
Я предпочитаю -rvlc к -a, поскольку вы получите много предупреждений, потому что установка разрешений и временных меток не работает. Опция -c делает вторую синхронизацию намного быстрее.

Я предпочитаю -rvl --size-only к -a, поскольку вы получите много предупреждений, потому что установка разрешений и временных меток не работает. Опция --size-only делает вторую синхронизацию намного быстрее.

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

Ничто из вышеперечисленного не удовлетворяло то, что я искал. В частности, часть вопроса ОП: как я могу rsync свою музыку на мой Android? Ну, я взял части предложений из этих ответов и написал свой собственный Bash-скрипт:

#!/bin/bash

echo "Начинаю rsync с Android."

src_dir="/home/joshua/Music"
dst_dir="/run/user/$UID/gvfs/mtp:host=OnePlus_HD1925_SERIAL/Internal shared storage"
rsync --progress \
      --human-readable \
      --omit-dir-times \
      --no-perms \
      --recursive \
      --inplace \
      --size-only \
      --exclude="*.jpg" \
      --exclude="*.JPG" \
      --exclude="*.jpeg" \
      --exclude="*.JPEG" \
      --exclude="*.png" \
      --exclude="*.bmp" \
      --exclude="*.txt" \
      --exclude="*.pdf" \
      --delete \
      "$src_dir" "$dst_dir"

echo "Операция rsync завершена. Наслаждайтесь музыкой :)"

Я просто поместил это в ~/.local/bin, где у меня есть другие скрипты (на вашем компьютере эта директория, скорее всего, уже есть в пути PATH). Просто убедитесь, что режим передачи файлов включён и хранилище действительно смонтировано перед запуском. Ничего плохого не случится, если вы этого не сделаете: rsync просто начнёт ругаться.

Этот скрипт:

  • Учитывает, что Android не может сохранять метаданные стиля ext4 на файлах
  • действительно быстрее других вариантов в моем опыте, используя size-only
  • Исключает обложки альбомов и сканы, чтобы не заполонять файловую систему телефона 🙂
  • Действительно синхронизирует! Он удаляет данные, когда вы удаляете их из источника, как исправление метаданных песен и замена их правильным файлом вместо хранения двух копий.

Также, если вы выбрали этот ответ именно из-за тегов --exclude, вам может понадобиться способ очистки на вашем телефоне, если он уже синхронизировал кучу ненужных изображений:

# Удалить все *.jpg и *.JPG из текущей директории рекурсивно.
find . -iname *.jpg -exec rm {} \;

Резервное копирование rsync для Android может быть настроено для обратной синхронизации, то есть с устройства Linux на устройство Android.

С помощью LlamaLab Automate можно настроить автоматическую синхронизацию Android-устройства при определённых условиях, например:

  1. в 5 утра,
  2. когда телефон подключён к определённой сети Wi-Fi, и
  3. когда он заряжается.

Использование Termux

Termux приносит множество командных утилит Linux на Android, в том числе rsync и openssh.

Вы можете настроить SSH-сервер на вашем Android-устройстве, а затем использовать rsync через SSH, при условии, что ваш ПК и Android-устройство находятся в одной сети WLAN.

Вики Termux ясно объясняет шаги, необходимые для настройки SSH и использования rsync.

Краткое изложение:

  1. Настройка Termux

    • Установите Termux
    • Предоставьте Termux доступ к файловой системе (разрешение Storage) из настроек Android
    • Откройте Termux
    • Установите пароль
      $ passwd
      New password: 
      Retype new password: 
      New password was successfully set.
      
    • Обновите список пакетов
      $ apt update
      
    • При необходимости обновите имеющиеся пакеты (это решило проблему совместимости в моём случае)
      $ apt upgrade
      
  2. Настройте openssh

    • Установите openssh
      $ apt install openssh
      
    • Запустите SSH-демон
      $ sshd
      

      По умолчанию оно слушает на порту 8022.

  3. Установите rsync

    $ apt install rsync
    

Для начала вам нужно:

  • Ваше имя пользователя в Termux
    $ whoami
    u0_a223
    
  • IP-адрес Android-устройства
    $ ip -4 a | grep wlan0 | tail -1
        inet 192.168.1.101/16 brd 192.168.255.255 scope global wlan0
    

    в данном случае это 192.168.1.101.

Теперь вы можете делать почти всё с rsync. Например, если вы хотите скопировать директорию ~/Music с вашего ПК на Android-устройство в /sdcard, вы можете сделать что-то вроде:

$ rsync -e 'ssh -p 8022' -aP ~/Music [email protected]:/sdcard

Когда появится запрос пароля, введите тот, который вы установили ранее.

Я искал решение для синхронизации с Android на NAS для резервного копирования изображений.

Grsync, графическая версия rsync, сработала просто отлично.

К счастью, она также может синхронизировать на Android. Единственный минус — она не может сохранать временные метки, поэтому все переданные файлы будут иметь временные метки момента, когда они были синхронизированы.

    sudo apt install android-file-transfer
    sudo apt-get install grsync

Похоже, что ключ -a, который я использовал в командной строке для синхронизации с Android, не работает с MTP: когда я выберу “сохранять разрешения”, “сохранять владельца” и “сохранять группу” в grsync, ни один файл не будет передан.
По умолчанию, настройки grsync “сохранять время”, “Подробный вывод” и “Отображать выполнение передачи” просто работают.

Вывод grsync для командной строки С Android:

    rsync -r -t -v --progress -s /run/user/1000/gvfs/mtp\:host\=%5Busb%3A001%2C013%5D/Micro\ SD/test /home/FREENAS/

Вывод grsync для командной строки НА Android:

   rsync -r -v --progress -s /home/FREENAS/test /run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C013%5D/Micro\ SD/

где /run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C013%5D это точка монтирования моего Android-телефона.

Я знаю, что ОП хотел использовать rsync, но если идея заключается в синхронизации каталогов, я настоятельно рекомендую использовать syncthing. Много, много преимуществ:

  • он будет работать непрерывно, его не нужно запускать время от времени;
  • он будет синхронизировать многие разные папки с многими разными устройствами одновременно;
  • вы можете использовать syncthing как часть резервного решения для вашего телефона в два шага: (1) вы синхронизируете все важные данные с вашего телефона на внешний хост (2) вы настраиваете резервное решение на этом хосте.

Я лично синхронизирую все важные данные с любого устройства, которым владею, как минимум на одно другое устройство, расположенное в физически разных местах; как минимум одно из этих устройств имеет диски RAID; я затем добавляю snapper на одно устройство, так что старые версии всех файлов сохраняются; или вы можете использовать функцию syncthing, чтобы достичь тех же результатов.

Последнее предупреждение. Если у вас закончится место на одном устройстве, это устройство остановит синхронизацию, но вы не получите никаких ошибок от него, поэтому вам следует проверять это время от времени. Если вы используете snapper, это довольно легко заполнить диски, ber wara.

Я попытался использовать rsync через MTP, но в моем случае скорость была действительно медленной. Если вы хотите попробовать это, вот предложение.
Мое решение основано на следующем источнике:

https://bbs.archlinux.org/viewtopic.php?id=261904

Я использую Kubuntu, поэтому в папке /run/user/1000/gvfs/ нет папки MTP.
Я скачал следующий пакет:

https://li.nux.ro/download/nux/dextop/el7/x86_64/simple-mtpfs-0.2-3.el7.nux.x86_64.rpm

Здесь находится исполняемый файл, который работал на Kubuntu 20.04. Вы можете найти его в папке bin и распаковать в папку.
К сожалению, на Plasma он может не монтировать устройство, пока не убьем определенный процесс. Затем вы можете использовать команду fuser.

Сначала необходимо найти ваше устройство с помощью команды lsusb:

$ lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 8087:0a2a Intel Corp. Bluetooth wireless interface
Bus 001 Device 011: ID 2717:ff48 Xiaomi Inc. Mi/Redmi series (MTP + ADB)
Bus 001 Device 003: ID 04f2:b3fd Chicony Electronics Co., Ltd HD WebCam (Asus N-series)
Bus 001 Device 006: ID 04fc:05d8 Sunplus Technology Co., Ltd Wireless keyboard/mouse
Bus 001 Device 004: ID 1bcf:08a0 Sunplus Innovation Technology Inc. Gaming mouse [Philips SPK9304]
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Здесь нам нужно скопировать MAC-адрес 2717:ff48 устройства Xiaomi.
Запустите следующие строки и замените 2717:ff48 на MAC-адрес вашего устройства:

DATA=`lsusb | grep '2717:ff48'`
echo $DATA
# Чтение номера шины:
BUS=`echo ${DATA:4:3}`
# Чтение номера устройства:
DEV=`echo ${DATA:15:3}`
# Убить процесс, использующий устройство (если есть)
fuser -k /dev/bus/usb/$BUS/$DEV

Затем вы можете запустить исполняемый файл и указать путь для монтирования папки:

./simple-mtpfs --device 1 /tmp/xiaomi

Однако, поскольку скорость была очень медленной, я просто отказался, использовал кардридер и синхронизировал файлы из локальной папки на USB-устройство. Возможно, это было самым простым вариантом.
В моем случае это лучший вариант, потому что целевая папка содержит несколько файлов, которые нужно удалить, и для увеличения срока службы SD-карты лучше не удалять и не создавать новые файлы, когда это не необходимо.

Мои два цента:

termux работает только для интегрированного хранилища и для определенной директории на внешних картах в недавних устройствах (у меня работает MIUI14) или с рутированными устройствами.

просто открыть MTP устройство в любом файловом менеджере, чтобы открыть терминал оттуда, не работало для меня (thunar)

директория /run/…, для gvfs была пустой для меня, несмотря на то, что устройство разблокировано и открыто в файловом менеджере

я решил это для себя, размонтировав MTP устройство (используя файловый менеджер) и перемонтировав его (используя jmtpfs)

Приложение foldersync может использовать протокол SFTP и очень настраиваемо. Работает как часы.

Я бы посоветовал избегать использования rsync через mtp (протокол передачи медиа) и использовать adbandroid debug bridge, если это возможно.

Сначала установите cli утилиту, скачайте её здесь
(в моём случае мне нужна была только утилита для командной строки, так как я не разрабатываю под Android)

Вот прямые шаги, в моем случае я на Linux:

$ curl -sSL https://dl.google.com/android/repository/platform-tools-latest-linux.zip-linux.zip -o platform-tools.linux.zip
$ unzip platform-tools.linux.zip
$ cd platform-tools/
$ ./adb --version
Android Debug Bridge version 1.0.41
Version 34.0.5-10900879
Installed as /path/to/adb
Running on Linux 5.18.10-76051810-generic (x86_64)

Теперь подключите телефон через USB и активируйте отладку по USB в параметрах разработчика в настройках Android

Проверьте, что ваш телефон подключен

$ ./adb devices -l
List of devices attached
....REDACTED....         device usb:1-1 product:...REDACTED... model:...REDACTED... device:...REDACTED... transport_id:1

Теперь вы можете копировать локальный контент на телефон с помощью команды push

Вот информация о команде

 push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE
     копировать локальные файлы/директории на устройство
     --sync: только переносить файлы, которые новее на хосте, чем на устройстве
     -n: тестирование без реального переноса: копировать файлы на устройство без записи в файловую систему
     -z: включить сжатие с указанным алгоритмом (any/none/brotli/lz4/zstd)
     -Z: отключить сжатие

Вот пример вызова команды

$ ./adb push /path/from/your/local/ /path/on/your/phone

В моем случае пример /path/on/your/phone/.../ выглядит как /storage/emulated/0/.../

Я получил информацию из этого комментария на Reddit и этой части документации Android.

Вы можете использовать приложение rsync server на Android, доступное на F-Droid.
Смотрите: https://github.com/ktsr42/RsyncServerApp

.

Ответ или решение

Конечно, подключение Android-устройства к рабочему процессу с помощью утилиты rsync может оказаться несколько сложной задачей, однако она становится вполне решаемой при правильной организации и знании нюансов интеграции. Разберем теоретическую составляющую и различные способы реализации, чтобы вы могли выбрать наиболее подходящий метод.

Теория

rsync — это утилита для синхронизации файлов и каталогов между двумя источниками. Работает с минимальной передачей данных, что позволяет ускорять процессы и экономить сетевое окружение. Наиболее часто используется для резервного копирования данных или синхронизации между различными устройствами.

Трудности возникают, когда мы работаем с Android-устройствами благодаря особенностям их файловой системы. Стандартные методы подключения через MTP (протокол передачи мультимедиа) могут не поддержать функции rsync такие, как сохранение метаданных файлов, времени добавления и исправление прав доступа.

Пример

Рассмотрим несколько подходов к использованию rsync для передачи файлов на Android-устройство.

1. Использование MTP/GVFS для работы с rsync

Самый простой способ — использование подключения через MTP. Библиотеки, такие как GVFS, являются частью многих дистрибутивов Linux и позволяют просматривать содержимое устройства Android в файловых системах, как это делают такие менеджеры, как Nautilus или Thunar.

Пример:

  1. Подключите Android устройство через USB и откройте его в файловом менеджере.
  2. Переместитесь в каталог /run/user/$UID/gvfs/ (где $UID — ID текущего пользователя в системе).
  3. Используйте команду rsync для передачи файлов на устройство:
    rsync --verbose --progress --omit-dir-times --no-perms --recursive --inplace ~/Videos/ "/run/user/1000/gvfs/mtp:host=%5Busb%3A003%2C096%5D/Internal shared storage/Movies/"

    Важно использовать опцию --inplace, чтобы избежать избыточного копирования файлов.

2. Использование SSHelper

SSHelper — удобное приложение для Android, которое запускает SSH-сервер на вашем устройстве, что позволяет использовать rsync через SSH.

  1. Установите приложение SSHelper из Google Play.
  2. Настройте конфигурационный файл SSH на вашем ПК для подключения к Android:
    Host android
       Port 2222
  3. Запустите SSHelper и подключите устройство к одной сети Wi-Fi с вашим ПК.
  4. Воспользуйтесь командой для синхронизации:
    rsync -rvlc Music android:SDCardLink/

3. Использование Termux

Termux предоставляет командную среду Linux на Android, где можно запустить rsync и openssh напрямую.

  1. Установите Termux и предоставьте ему доступ к файловой системе.
  2. Установите rsync и openssh через команду:
    apt install rsync openssh
  3. Настройте SSH-сервер и используйте rsync через SSH аналогично предыдущему примеру.

Применение

Каждый из приведенных подходов имеет свои нюансы и выбирается в зависимости от ваших возможностей и требований:

  • MTP удобен для простых переносов данных, но имеет ограничения в сохранении метаданных.
  • SSHelper и Termux предоставляют более гибкие и мощные возможности с использованием сети и SSH, но требуют дополнительных настроек.

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

Оцените материал
Добавить комментарий

Капча загружается...