Sincroniza SD externa a USB OTG **sin** usar una PC

Detalles del dispositivo

  • Moto X Play - Android 6.0.1, rooteado (raíz sin sistema)

  • SD externa Samsung de 64 GB

  • San Disk 128 GB USB : se envió con FAT 32 reformateado a exFAT ya que tengo carpetas> 4 GB en SD externa

Caso de uso

Sincronice todo el contenido de la tarjeta SD externa a USB (sincronización unidireccional sin eliminar el contenido de la tarjeta SD) en un horario semanal/bajo demanda, como copia de seguridad incremental sin usar una PC (tengo una, pero las razones para no querer usarla no son relevantes)

Otros detalles

  • Unidad USB reconocida por el dispositivo correctamente conectado por OTG estándar ( Configuración → Almacenamiento y USB )

  • Busybox instalado. Venía incluido con ROM Toolbox Pro. No lo he usado directamente. Si se va a instalar otra caja ocupada, está bien siempre que no entre en conflicto

  • Puntos de montaje como se muestra a continuación

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Cosas probadas

  • Búsqueda de aplicación fallida: no pude encontrar una aplicación que pueda hacer esto ( Folder Sync afirma pero no puede ver el USB)

  • Googleando alternativas

  • La automatización de MacroDroid falla, ya que la aplicación no puede ver el USB (se planteó esto en el foro de la aplicación)

Pregunta: ¿Cómo puedo hacer esto? estoy abierto a cualquier medio

Tenga en cuenta que tengo la intención de colocar una recompensa de 100 , cualquier respuesta que satisfaga las necesidades antes de publicar la recompensa se otorgará de manera similar (puede retrasar la publicación de la recompensa para asegurarme de obtener una solución)

Evite las soluciones que

  • no están probados; debería haberse probado en su dispositivo y en la configuración USB para darle credibilidad

  • Involucrar PC, subir a la nube, transferir a un servidor remoto, etc.

  • Referencias a afirmaciones de fuentes dudosas que no se pueden verificar

  • Involucrar el uso de administradores de archivos (obtuve resultados mixtos con estos, pero eso es para otra pregunta)

El objetivo de lo anterior no es disuadir soluciones sino desalentar intentos frívolos. Si necesita claridad, por favor pregunte

Discutí esta necesidad en el chat y algunos candidatos potenciales para la solución incluyeron BusyBox rsyncy Tasker . No sé nada de estos medios, así que proporcione detalles completos . Al ser una pregunta generosa (casi), espero poder implementarla de inmediato con éxito sin buscar aclaraciones.

(Al ser un dispositivo rooteado con root sin sistema, las soluciones que usan root están bien. Sin embargo, si se va a modificar el sistema operativo de alguna manera, resalte que systemless no lo permite, aunque hay una solución)

Estoy corto de tiempo y necesito hacer que esto funcione lo antes posible

Veré si puedo trabajar en algo cuando pueda :)
Ah, bastante bien :) No había revisado el chat.

Respuestas (2)

Como descubrimos la solución que ahora usa en el chat, esta respuesta debe cumplir con "ser probado", "no involucrar una PC o administrador de archivos" y "confiar en fuentes verificadas". Aunque mientras tanto se rsyncpublicó otra respuesta, también me pidió que presentara nuestra solución, así que aquí vamos:

El rsynccomando se puede usar para lograr eso. Teniendo en cuenta todos sus requisitos (incluidos los que se mencionan más adelante en el chat), la línea de comando se vería así:

rsync -a --delete /mnt/sdcard /mnt/usb

Explicaciones sobre el comando:

  • rsyncobviamente es el ejecutable/comando
  • -asignifica "archivo", es decir, mantener todos los atributos. Esto incluye la copia recursiva de contenidos (directorios, subdirectorios, archivos), el mantenimiento de sellos de archivos y la propiedad (este último generalmente requiere root), la conservación de permisos, etc. Para obtener más información, consulte ¿Qué es el modo de archivo en rsync? en nuestro sitio hermano.
  • --deletese encarga de eliminar archivos en el destino (aquí: /mnt/usb) que no están o ya no están disponibles en el origen (aquí: /mnt/sdcard)
  • los parámetros restantes especifican el origen desde el que copiar ( /mnt/sdcard) y el destino al que copiar ( /mnt/usb). Tenga en cuenta que especificamos ambos como directorios, por lo que todo el contenido, también los archivos ocultos, también deben incluirse (este último no lo haría si hubiéramos usado una máscara como /mnt/sdcard/*).
    Nota: asegúrese de especificar los puntos de montaje reales o al menos los directorios reales aquí (por ejemplo, no el /mnt/sdcardenlace simbólico como en el ejemplo), o podría simplemente copiar el enlace simbólico y pensar que eso es todo lo que quería :)

Es posible que desee probar primero lo anterior en una fuente pequeña para ver cómo funciona.


Ahora que se cubre el "cómo", queda la pregunta: ¿Dónde está rsync? Por lo general, no viene preinstalado en el dispositivo, y la mayoría de Busyboxes tampoco lo incluyen. Hubo una vez una aplicación en Playstore llamada rsync backup para Android , pero ya no está. Como señala este wiki , puede descargar directamente el rsyncbinario desde aquí ¹, luego enviarlo a su dispositivo Android e instalarlo. Suponiendo que haya empujado el binario a /mnt/sdcard:

su
mount -o remount,rw /system
cd /system/xbin
cp /mnt/sdcard/rsync .
chmod 755 /system/xbin/rsync
chown root.shell /system/xbin/rsync
mount -o remount,ro /system

Lo anterior debe hacerse en una aplicación de terminal o a través de adb shell.

Hecho y probado con éxito desde un indicador de shell, sigue siendo la cuestión de . Sé que puede ejecutar comandos de shell como root (en el pasado, esto se hacía simplemente prefijándolos con un signo de exclamación, hoy en día incluso podría haber una casilla de verificación para ello, no lo verifiqué por un tiempo), pero tu Macrodroid podría proporcionar eso también. Alternativamente, puede hacerlo a la manera de Unix/Linux y utilizar Cron, que es proporcionado por Busybox; para obtener más información, consulte: ¿Cómo usar crontab en Android?


Ver también:


¹ Por supuesto, también puede intentar encontrar la aplicación original en sitios como APKMirror o ApkPure, o descargar la aplicación desde aquí , pero primero tenía que instalar esa aplicación y luego tomar el binario de su directorio de datos /data/data/eu.kowalczuk.rsync4android/files/rsync, que encuentro un un poco inconveniente ;)

Gracias, la solución funcionó bien para mí. Un par de puntos que pueden ayudar a los lectores: 1. Probé con todas las versiones de Busybox, que están bien calificadas y ninguna de ellas tiene rsyncdisponible la versión pro de este (le envié un correo al desarrollador solicitándole que lo agregue), por lo que deja sin elección, pero otros medios (por cierto, no pude encontrar la aplicación en los sitios de renombre mencionados) 2. Automatización de la ejecución del comando a pedido / programación exitosa. Instrucciones aquí
3. TWRP podría ver la copia de seguridad en USB, por lo que presumiblemente debería ejecutarse bien 4. Lo mismo con TiBu, aunque esto requiere un poco de solución ( Ubicación de la carpeta de copia de seguridad> Proveedor de almacenamiento , haga clic en eso y elija las opciones según la versión de su sistema operativo) 5. Aunque no es un usuario de Windows, en aras de la exhaustividad, también puede considerar agregar la extensión de rsyncWindows, como lo hizo con Linux. Vi referencias. Agregaré más más adelante si puede ayudar a los lectores.
@beeshyams ptspts.blogspot.com/2015/03/… tiene instrucciones sobre dónde puede encontrar e instalar manualmente rsync para Android. Tendrás que ser un poco creativo ya que no quieres usar una PC. Recomiendo tratar de usar webget y Root Explorer para descargar, cambiar el nombre, configurar +x y mover el binario.
@ChrisOlin: Gracias y lo había visto antes, pero al no estar familiarizado con Linux, lo hice de la manera incómoda de descargar la aplicación y extraerla rsyncy compartirla con Izzy y él la incluyó en su respuesta. En notas al pie. Hacerlo se puede aprender, pero en un momento posterior, cuando el tiempo lo permita.
Actualización: TWRP verificado y se restaura bien desde OTG. TiBu se encuentra con problemas. Ve la carpeta copiada en el USB pero no puede seleccionar la restauración. Sin embargo, si creo una nueva carpeta de copia de seguridad en USB, se restaura. En caso de que se reemplace extSD, supongo que copiar la carpeta respaldada debería funcionar ya que todos los atributos y permisos están intactos
@beeshyams ¿Está utilizando el almacenamiento de DocumentProvider? Si es así y aún no funciona, es posible que SELinux esté impidiendo que Titanium Backup lea los medios de la unidad flash.
@ChrisOlin: desafortunadamente, ese no es el caso. Acabo de volver a comprobar que es Permisivo . Ver informes mixtos en la red, funciona para algunos, no para otros. No estoy seguro de por qué
@ChrisOlin: Además, como se mencionó, puedo crear y hacer una copia de seguridad desde una nueva carpeta de copia de seguridad, por lo que el acceso de lectura/escritura no es el problema.
Los contextos de SELinux se configuran de manera un poco diferente a los permisos de archivo tradicionales de Unix. Encontré ese problema exacto con SELinux que impide que Titanium Backup acceda a los datos de la copia de seguridad y cause exactamente el mismo problema que está describiendo.

Estar prevenido. No voy a brindarle detalles completos, principalmente porque lo que está solicitando es tan inespecífico y desagradable que la generosidad de esta pregunta no vale la pena gastar el tiempo para probar una solución para usted que no tengo forma de la garantía funcionará en su dispositivo. Puede ignorar mi consejo y sufrir o razonar cualquier dificultad a través del razonamiento crítico y Google. Si no te gustan estas opciones, siempre puedes ir a comprar un iPhone. Están diseñados para personas que quieren algo que "simplemente funcione". Si no puede dedicar tiempo a investigar o modificar una solución para que funcione para usted, es posible que Android no sea para usted.

Hay una variedad de maneras de lograr lo que está tratando de hacer. Podría decirse que el método más fácil y confiable es usar el software que se encuentra en la mayoría de los dispositivos Android de forma predeterminada, que es en lo que me enfocaré. Dado que está tratando de ejecutar algo en un horario regular, diría que la mejor solución sería usar cron. En ese sentido, eche un vistazo a este hilo de StackOverflow , ya que es específico para ejecutarlo en Android. Además, para que todos estemos en la misma página, cron es un programador de trabajos disponible en la mayoría (¿todos?) de los sistemas operativos similares a Unix, que incluye Android. Dado que no entró en detalles sobre cuándo exactamente desea que este trabajo comience semanalmente, le dejaré que configure el crontab (que está bien documentado en Internet yno es difícil ).

Esto se encargará de programar todo, pero el siguiente paso es averiguar cómo desea hacer una copia de seguridad de todo, que es una pregunta muy importante que no tenía muy clara. ¿Simplemente desea copiar datos nuevos/modificados en la tarjeta SD externa a la unidad flash o desea copias de seguridad completas de la tarjeta SD almacenada por fecha en la unidad flash? Estas son preguntas que debe resolver por sí mismo antes de pedir consejo a Internet.

Sin saber exactamente qué está tratando de lograr aquí, asumiré que el primer escenario funciona mejor. Dado que está copiando datos de nivel de archivo (opuesto al nivel de bloque), rsynces probablemente su mejor opción aquí. Es muy versátil y debería funcionar directamente sin necesidad de configurarlo. Ya deberías tenerlo disponible y si no lo tienes, se obtiene fácilmente a través de Busybox.

Suponiendo que los puntos de montaje permanezcan iguales, el comando que usaría para lograr esto sería: rsync -rlpt /mnt/media_rw/0000-0000 /mnt/media_rw/E82C-B290. Para su comodidad, he incluido una introducción a las banderas que utilicé a continuación:

-r, --recursive recurse a directorios

-l, --links copia enlaces simbólicos como enlaces simbólicos

-p, --perms conserva los permisos

-t, --times conserva los tiempos de modificación

También está la -abandera (abreviatura de modo de archivo ), pero hace un montón de otras cosas innecesarias en esta situación, como sincronizar uid/gid. En la mayoría de los escenarios de copia de seguridad, el uso -atendría sentido ya que desearía conservar la propiedad si tiene que restaurar desde sus copias de seguridad. Sin embargo, el almacenamiento SD externo usa FAT para su sistema de archivos, que no es compatible con los permisos de archivos de Unix. Si bien los archivos en su tarjeta SD externa tienen un conjunto de propietario/grupo, el sistema operativo los configura de forma estática. Si intenta cambiarlos, estoy bastante seguro de que obtendrá un error o fallará silenciosamente en segundo plano. Las banderas que utilicé hacen que este proceso sea mucho más eficiente, pero si por alguna razón quieres que rsync sincronice todas esas cosas adicionales, usa la bandera del modo de archivo en su lugar.

Entonces, ahora que tenemos el comando que necesita ejecutar, solo es cuestión de configurar el crontab y hacer que ejecute ese rsynccomando. Esta no es una solución muy elegante, pero funcionará. Si quisiera configurar algún tipo de registro ( Mike Rubel ha hecho mucho trabajo en el que podría inspirarse ), podría escribir un script de shell, ponerlo en el almacenamiento interno de su teléfono y hacer que cron ejecute el script de shell en lugar de el rsynccomando

Para hacer una copia de seguridad de todo manualmente fuera de cron, puede ejecutar ese comando rsync usando ConnectBot o cualquier otra aplicación que le brinde acceso de shell. Si planea hacerlo con frecuencia, podría ser más rápido colocar el comando en un archivo (p. ej backupsd.), chmod +xy colocarlo en una carpeta que también esté en la ruta del sistema (como /system/bin). De esta manera, puede escribir backupsden lugar de rsync -rlpt /mnt/media_rw/0000-0000 /mnt/media_rw/E82C-B290.

Esa fue básicamente la solución que resolví con el OP en el chat :) Solo una nota al margen: en lugar de -rlpt, simplemente use -a(modo de archivo), eso implica todos los demás interruptores :)
Abordé por qué no -ausé inmediatamente después del resumen de las banderas que usé y dejé que el OP decidiera. Claramente, las grandes mentes piensan igual.
Ah, lo siento Chris, me perdí esa parte. Pero para mí, la sincronización de UID/GID es una parte esencial, ya que la propiedad es relevante para que los propietarios puedan manejarla correctamente. Supongo que juegas con el hecho de que, aunque es cierto, eso no afecta la tarjeta SDC debido a FAT, lo cual estoy de acuerdo :) Sin embargo, es posible que hayas querido señalar tus razones en tu publicación :)
Haces un buen punto. No dije específicamente por qué no tiene sentido. Voy a editar y aclarar.
wtf con la bronca del párrafo al principio?