Вопрос или проблема
Как подключиться к моему 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-устройства при определённых условиях, например:
- в 5 утра,
- когда телефон подключён к определённой сети Wi-Fi, и
- когда он заряжается.
Использование Termux
Termux приносит множество командных утилит Linux на Android, в том числе rsync
и openssh
.
Вы можете настроить SSH-сервер на вашем Android-устройстве, а затем использовать rsync
через SSH, при условии, что ваш ПК и Android-устройство находятся в одной сети WLAN.
Вики Termux ясно объясняет шаги, необходимые для настройки SSH и использования rsync
.
Краткое изложение:
-
Настройка Termux
- Установите Termux
- Предоставьте Termux доступ к файловой системе (разрешение
Storage
) из настроек Android - Откройте Termux
- Установите пароль
$ passwd New password: Retype new password: New password was successfully set.
- Обновите список пакетов
$ apt update
- При необходимости обновите имеющиеся пакеты (это решило проблему совместимости в моём случае)
$ apt upgrade
-
Настройте
openssh
- Установите openssh
$ apt install openssh
- Запустите SSH-демон
$ sshd
По умолчанию оно слушает на порту
8022
.
- Установите openssh
-
Установите
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
(протокол передачи медиа) и использовать adb
– android 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.
Пример:
- Подключите Android устройство через USB и откройте его в файловом менеджере.
- Переместитесь в каталог
/run/user/$UID/gvfs/
(где$UID
— ID текущего пользователя в системе). - Используйте команду
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.
- Установите приложение SSHelper из Google Play.
- Настройте конфигурационный файл SSH на вашем ПК для подключения к Android:
Host android Port 2222
- Запустите SSHelper и подключите устройство к одной сети Wi-Fi с вашим ПК.
- Воспользуйтесь командой для синхронизации:
rsync -rvlc Music android:SDCardLink/
3. Использование Termux
Termux предоставляет командную среду Linux на Android, где можно запустить rsync
и openssh
напрямую.
- Установите Termux и предоставьте ему доступ к файловой системе.
- Установите
rsync
иopenssh
через команду:apt install rsync openssh
- Настройте SSH-сервер и используйте
rsync
через SSH аналогично предыдущему примеру.
Применение
Каждый из приведенных подходов имеет свои нюансы и выбирается в зависимости от ваших возможностей и требований:
- MTP удобен для простых переносов данных, но имеет ограничения в сохранении метаданных.
- SSHelper и Termux предоставляют более гибкие и мощные возможности с использованием сети и SSH, но требуют дополнительных настроек.
С этими инструментами работа с rsync
на устройстве Android становится понятной и эффективной. Выбор метода зависит от ваших задач и предпочтений, а знание нюансов позволит избежать многих распространенных проблем.