Извлеките резервные копии TWRP, сделанные с помощью adb

У меня смартфон Samsung Galaxy S2 GT-I9100 с LineageOS и TWRP. Каждую неделю я делаю резервную копию с помощью следующей команды:

adb backup -f twrp-20170322.ab --twrp boot data system

При желании я тоже могу использовать эту --compressопцию.

Есть ли способ извлечь twrp-20170322.abфайл резервной копии с помощью стандартных инструментов командной строки GNU/Linux? Я также рассмотрю возможность установки дополнительного программного обеспечения, если это необходимо, но оно должно быть бесплатным (как свобода).

Ссылки:

Ответы (3)

Я обнаружил, что файлы, сгенерированные TWRP .ab, отличаются от обычных adb backupфайлов, поэтому смещение отличается от обычных .abфайлов. Мне удалось проверить и извлечь файлы, используя (например, для проверки) следующую команду:

dd if=backup.ab bs=512 skip=1 | tar ft -

Судя по всему, заголовок может быть длиннее, но он должен быть выровнен с 512-байтовыми границами, поэтому просто поднимите skip=параметр, если он не может найти его сначала.

Обратите внимание, что формат файла определен в twadbstream.h , если вам нужно углубиться в это.

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

Я написал инструмент извлечения, используя twadbstream.h (спасибо @anarcat), который я использовал для успешного восстановления больших (~ 10 ГБ) резервных копий TWRP ADB с несколькими файловыми системами. twrpabx

Спасибо! Ваш инструмент работал у меня после применения этих исправлений, упомянутых в проблемах Github github.com/prudy/twrpabx/tree/img_and_issue4
@TrojanName удалось ли вам извлечь резервную копию нескольких разделов с помощью этих исправлений?
@SandroAntonucci Да, я думаю, что да

Если вы не защитили его паролем:

dd if=$1 bs=24 skip=1 | openssl zlib -d >${1%%.ab}.tar
  • ddэто «Дубликатор диска» (также известный как «разрушитель диска», если вы перепутаете его параметры с переключателем ifи of;)
  • bs=23советует использовать размер блока 24 байта, который нам нужен…
  • skip=1пропустить 1 блок из 24 байт ("Резервный заголовок")
  • вывод передается opensslдля обработки и распаковки
  • … и вывод из этого перенаправляется в архив

Оттуда вы должны знать свой путь: просто «распаковать» (извлечь) то, что вы хотите.

Почему он использует $1? Что ж, я скопировал эту строку из ab2tar, которая включена в мой маленький инструмент Adebar , который может вас заинтересовать: создает хорошую документацию устройства, сценарии резервного копирования и многое другое, все через ADB, используя только Bash 😇 Так что поместите эту строку в крошечный небольшой сценарий оболочки и назовите его:

ab2tar twrp-20170322.ab

Затем найдите twrp-20170322.tarрезультат. Конечно, это требует opensslустановки на вашем компьютере с Linux.

Я получаю следующее сообщение об ошибке: 140376894071512: ошибка: 29065064: библиотека (41): BIO_ZLIB_READ: ошибка раздувания zlib: c_zlib.c: 548: ошибка zlib: ошибка данных
Никогда такого не видел. Может быть, TWRP использует метод сжатия, отличный от стандартного ADB (я не смог найти подробностей об этом)? Или, как вы не указали --compressпри создании бэкапа, создает несжатые бэкапы? В последнем случае попробуйте не zlibуказывать параметр (или сделать наоборот и указать --compressпри создании бэкапа ;).
Я пробовал с: dd if=twrp-20170320.ab bs=24 skip=1 > twrp-20170320.tar (без вставки openssl). Но когда я пытаюсь просмотреть содержимое tar-архива с помощью tar -tf twrp-20170320.tar, я получаю: tar: Это не похоже на tar-архив; tar: переход к следующему заголовку; tar: выход со статусом сбоя из-за предыдущих ошибок
Есть причина не использовать эту --compressопцию с adb: она сжимает менее эффективно, чем xz. Я предпочитаю экономить как можно больше места. Но это не связано с моей первоначальной проблемой.
То, что я описал выше, отлично работает для «обычных» резервных копий ADB (я часто использую его для них и не использую --compressтам). Из вашего заявления ( adb backup …) я исходил из того же формата. Если вы просто используете другое сжатие, вы должны это учитывать. opensslнеобходим для расшифровки резервной копии, поэтому без этого вы не получите действительный файл .tar. Из ваших последних комментариев я бы предположил, что вы должны заменить zlibсоответствующую часть для xz. Кроме того, у меня нет идей, извините.
насколько я могу судить, эта процедура работает только с «обычными» (т.е. не TWRP) сгенерированными резервными копиями. когда TWRP отправляет поток, он шлепает сверху новый заголовок, который длиннее (512 байт). см. android.stackexchange.com/a/180402/158769 для решения, которое сработало для меня.
@anarcat Спасибо за указатель! Итак, мой подход по-прежнему действителен, нужно просто пропустить другой размер сектора — и можно ли пропустить весь материал openssl?
@ Иззи, ваш ответ для резервного копирования adb, не работает для резервного копирования TWRP. проверьте мой скрипт twab.sh
Umpf, так вы говорите, что adb backupздесь не создается «резервная копия ADB»? Это довольно запутанно.
он data.ext4.winс заголовком 1536 байт, но «разбит» на блоки данных. также он может содержать несколько разделов sourceforge.net/p/adbextractor/discussion/general/thread/…