В Android 6.0 ввели функцию, позволяющую отформатировать карту памяти так, чтобы она являлась не отдельным хранилищем, а придатком ко внутренней памяти. Это позволяет избежать путаницы с двумя хранилищами данных, особенно при ручной установке некоторых не всегда честно купленных крупных приложений, поставляемых по частям. Однако есть один нюанс: при этом всём нам наглухо блокируют доступ к карте напрямую. Хочешь что-то передать на устройство — используй MTP со всеми вытекающими, вроде скорости передачи файлов, сравнимой с прогулочным шагом контуженной черепахи. Карту теперь не только к ПК через кабель напрямую нельзя подключить: её и из выключенного телефона через кардридер просто так не смонтируешь, ведь она отформатирована в нечто неизвестное ни науке, ни нашим компьютерам.


Но ведь правила созданы для того, чтобы их нарушать? Давайте попробуем обойти это бессовестное ограничение.


Способ первый, простой: adb push/pull


Рекомендуется для ежедневного использования. Судя по всему, даже не требует рут. Всё, что понадобится — это ADB. Те, кто в курсе, могут пролистать до второго способа.


С передачей всё просто: первый аргумент — откуда, второй аргумент — куда. /sdcard — то место, куда на Андроиде монтируется доступное пользователю хранилище, т.е. корневой каталог штатного файлового менеджера почти любого девайса на Андроиде.


$ adb push chunk.bin /sdcard
chunk.bin: 1 file pushed. 4.8 MB/s (44040192 bytes in 8.667s)

Получение — аналогично:


$ adb pull /sdcard/chunk.bin chunk2.bin
/sdcard/chunk.bin: 1 file pulled. 16.0 MB/s (44040192 bytes in 2.627s)
$ cmp chunk.bin chunk2.bin

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


Способ второй, интересный: ручное монтирование зашифрованных разделов


На этот раз нам понадобятся root-доступ к смартфону и ПК с системой на базе Linux.


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


$ parted /dev/mmcblk0 print
Model: SD SD32G (sd/mmc)
Disk /dev/mmcblk0: 31.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name            Flags
 1      1049kB  17.8MB  16.8MB  fat32        android_meta
 2      17.8MB  31.2GB  31.2GB               android_expand

Отлично, хотя бы таблица разделов имеется.


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


Вторая часть зловещего плана — ключ. Да-да, данные зашифрованы: не просто ж так parted не смог обнаружить на целевом разделе ФС. С ключом всё почти так же просто: хранится он на нашем Android-девайсе в двоичном файлике по адресу /data/misc/vold/expand_PARTUUID.key, где PARTUUID — это UUID шифрованного раздела в нижнем регистре без разделителей. Рут нам понадобится как раз для того, чтобы добраться до этого файла через нечитаемый для всех, кроме рута, каталог /data/misc/vold.


$ partuuid=$(lsblk /dev/mmcblk0p2 -o PARTUUID | tail -1 | tr -d '-')
$ adb root
$ adb pull /data/misc/vold/expand_$partuuid.key magic.key
/data/misc/vold/expand_9d292da2b76a9179118aaa217f23e4a7.key: 1 file pulled. 0.0 MB/s (16 bytes in 0.110s)

Готово. 128 бит заветной информации.


Заключительная часть Мерлезонского балета — подключение раздела. Сделаем это стандартным линуксовским dm-crypt, который, собственно, и самим Андроидом используется.


К сожалению, я не знаю, какой именно метод шифрования используется Андроидом, поэтому понадеюсь на пресвятой дефолт, оставив --cipher неуказанным.


$ cryptsetup open --type plain --key-file=magic.key --key-size=128 /dev/mmcblk0p2 dm-magic

На меня не ругаются, это хорошо. Монтируем.


$ mount /dev/mapper/dm-magic /mnt
$ ls -l /mnt
total 21
drwxrwx--x 33 alpha alpha 3488 Mar 16 08:51 app
drwxr-x--x  3 root  root  3488 Nov 29 00:34 local
drwxrwx---  4  1023  1023 3488 Nov 29 08:01 media
drwxrwx--t  3 alpha  9998 3488 Nov 30 03:02 misc
drwx--x--x  3 alpha alpha 3488 Nov 29 00:34 user
drwx--x--x  3 alpha alpha 3488 Nov 29 00:34 user_de

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


Если поковыряться по каталогам, можно увидеть данные приложений, хранящихся на карте памяти, а также непосредственно содержимое SD-карты, которое нам подсовывали в первом способе по адресу /sdcard. Его мы можем найти в каталоге /mnt/media/0.


На этом всё, приятного ковыряния.

Комментарии (54)


  1. DASM
    26.03.2018 17:01
    -1

    вот врать не надо, а? «сравнимой с прогулочным шагом контуженной черепахи. » — покажите реальные скорости с методикой проверки. Все нормально с МТР


    1. immaculate
      26.03.2018 17:06
      +2

      Почему врать? Я не автор статьи, у меня Linux и было уже 4-5 телефонов на Android. В связке Linux и Android, передача по MTP тупит просто ужасно. При этом сколько-нибудь большие файлы скорее всего не скопируются ни в одну сторону, процесс зависнет где-нибудь в самом начале, сколько не пытайся.

      Поэтому я тоже пользуюсь adb push/pull, или даже передаю файлы через Яндекс.Диск. Так что мой опыт полностью совпадает с опытом автора статьи.


    1. nidalee
      26.03.2018 22:39

      Вместо тысячи слов.
      Все три — отдельные ссылки.

      Воистину, все нормально с MTP. Даунгрейд шагает по планете огромными шагами…


      1. aamonster
        27.03.2018 01:13

        Мой личный опыт — mtp крайне печален, когда надо скопировать много файлов. Вроде это даже не противоречит вашим картинкам, если на них скорость передачи одного большого файла, но от этого не легче.


        1. evilrussian
          27.03.2018 09:24

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


          1. aamonster
            27.03.2018 09:33

            Ну, справедливости ради, MSD, с которым сравнивается по ссылкам nidalee, тоже не сахар: необходимость размонтировать том не радует.
            Надо будет попробовать adbfs.


          1. nlykl
            27.03.2018 16:46

            Это хорошо, если зависание. В некоторых линуксах при перемещении или переименовании данные вообще пропадают.


        1. nidalee
          27.03.2018 14:08

          Простите, это был сарказм.
          По MTP я всего один раз куда-то залезал — больше никогда.


      1. ntfs1984
        27.03.2018 12:50
        +1

        Снимите пожалуйста видео, как вы входите по MTP в папку DCIM с хотя бы полтыщей фоточек.

        А потом вставьте телефон с музычкой в среднестатистический телевизор или магнитолу в машине с поддержкой USB и MP3, и расскажете как оно.


        1. nidalee
          27.03.2018 14:08

          Выше ответил, неудачный сарказм был. Обеими руками против MTP. И да, тесты подтверждают, что он хуже.


          1. ntfs1984
            27.03.2018 14:18

            А, простите.
            У большинства людей просто сложилось четкое презрение к технологиям, которые в свою очередь требуют другие технологии которые поддерживаются 2.5 устройствами ))


    1. betrachtung
      27.03.2018 06:31

      MTP отучил меня от пиратской музыки, потому что оказалось проще заплатить за подписку на гуглплеймьюзик, чем кидать на телефон альбомы по MTP.
      MTP вынудил меня заплатить за большое облако, потому что скидывать с телефона фото оказалось удобнее через Яндекс.Диск.
      Мне иногда кажется (поправляю шапочку из фольги), что основная задача MTP — пересадить нас на облачные сервисы. По крайней мере, это единственная задача, с которой он справляется.


    1. antonn
      27.03.2018 12:44

      Дело не в скорости копирования, а в том, что для копирования последних пары фотографий на смартфоне MTP сначала должно построить дерево всех файлов в папке. Ну построило, вы скопировали файл, вышли на уровень выше, зашли обратно в папку с фотографиями — и оно опять начинает получать список файлов. Попробуете в другом окне открыть корень устройства MTP и получите ошибку типа «устройство занято». И хорошо если при этом не отвалится в первом окне скан директории.
      Про то, что отсутствует блочный доступ и нельзя воспользоваться программами для восстановления удаленных файлов (неоднократно пользовался, как для карты, так и для встроенной памяти в телефоне, на аппаратах постарше) вообще молчу.


  1. DASM
    26.03.2018 17:10

    тега перевод нет. у меня опыт противополжен, МТР — проще и быстрее


    1. cpcat
      26.03.2018 19:58
      +1

      Так у вас, наверное, Windows?


      1. betrachtung
        27.03.2018 06:23

        Не панацея. Я использовал MTP на Windows 7, Windows 10, всевозможных линуксах и паре старых версий макоси (тогда нужно было ещё и специальное приложение ставить — не знаю, как сейчас). На трёх, что ли, разных смартфонах.
        В Windows и Linux MTP работало, как говно. На маке — ещё хуже, насколько такое вообще возможно.
        Особенно обидно было, когда при попытке скопировать несколько десятков гигабайт файлов с Windows 7, когда копирование в очередной раз зависло (что для MTP является нормой: если кидаешь много папок, лучше кидать по одной, тогда будет ясно, на какой всё повисло), карта на 64 Гб просто померла и перешла в read only.


        1. valera5505
          27.03.2018 12:48

          не знаю, как сейчас

          Так же и работает оно по-прежнему отвратительно, хотя можно найти файловые менеджеры, которые поддерживают MTP по-своему, но с ними тоже не всё хорошо.


        1. Javian
          27.03.2018 19:43

          На OSX по прежнему жестко вмещается, если много файлов в каталоге.


    1. mike114
      26.03.2018 22:56

      У меня при попытке скопировать больше 250 (примерно) фотографий операция может длиться бесконечно, но главная проблема в том, что порой, если появляются фотографии, у которых разница в имени попадает на первую цифру даты (например, 20180316_212855.jpg и 20180326_212855.jpg), то копируется вторая фотография под именем первой. Дальше все зависит от того, попала ли вторая фотография в копируемый/перемещаемый массив. Если да, то процесс зависает (бесконечный прогресс), а после отмены действия MTP уже не работает. Если нет (ну или после переподключения телефона), то при последующем копировании появляется стандартный диалог с предложением перезаписать существующий файл, и, пока я не обнаружил пропажу нескольких фотографий, я действительно перезатирал их. Вот такой он, MTP.


    1. betrachtung
      27.03.2018 06:35

      Сейчас подключил LG G6 к ноутбуку с Windows 10. Папка с фото (менее тысячи файлов) читалась восемьдесят секунд. Это проще и быстрее чего? Скачивания через GPRS?


  1. Shadow_Moon
    26.03.2018 23:51

    есть ещё прекрасная программа airdroid. С её помощью можно заходить на телефон как на веб сервер и видны файлы телефона как их представляет андроид. Пользуюсь ей даже когда есть под рукой кабель.


    1. jrthwk
      27.03.2018 08:29

      Еще есть хорошая программа UMS Enabler


      1. LESHIY_ODESSA
        27.03.2018 13:31

        Да, есть такая программа, но я всё же отловил на ней такие же глюки как и под MTP (Android 4.4.2). Если в мобилке отредактировать .txt файл, а потом открыть его с компьютера, то файл не будет содержать последних изменений.
        А вот ниже приведенный пример с Total Commande и плагином выдает желаемый результат.


  1. dmitrodem
    27.03.2018 01:06

    зачем все это (ADB, MTP) гуглу? Чем не угодил старый добрый SSH? Как в той же Nokia N9.


    1. ntfs1984
      29.03.2018 19:51

      Разные назначения у них.
      ADB — независимый дебаггер. Софтина которая запускается на низком уровне, отлавливает и выполняет команды извне, вне зависимости от того, через какой интерфейс было подключение.

      SSH — всего лишь сетевой протокол, который сам по себе ничто без сторонних утилит.

      MTP — тупо протокол обмена файлами, еще и весьма туговатый, а посему не нужный, ибо есть USB drive. Но хипсторский тренд, и пофиг что 80% устройствами не понимается )


  1. Qwentor
    27.03.2018 01:48

    Для adb есть плагин для Total Commander — никакой тебе консоли, человеческое копирование. Как для Linux, правда, не знаю. Сомневаюсь что он подходит к какому-либо из аналогов типа Gnome Commander / Double Commander


    1. LESHIY_ODESSA
      27.03.2018 13:33

      Да, подтверждаю, плагин отличный — Android ADB 8.3


      1. Qwentor
        27.03.2018 14:07

        О! В описании как минимум, вижу, что в Double Commander под Linux тоже работает)


  1. Rast1234
    27.03.2018 03:54
    +1

    Уметь монтировать, конечно, прикольно, но для повседневных задач, к тому же без root, тягания карты и с низким порогом входа, остановился на FTP, и всем страдающим с mtp рекомендую.
    Просто ставим на устройство любой ftp-сервер из маркета, включаем когда надо передавать файлы. Идеальный мультиплатформенный клиент — FileZilla, ничего не потеряется и не побьется. Если смартфон умеет в usb tethering, скорость передачи по проводу близка к теоретически максимальной. Да, с оверхедом на tcp/ip стек.

    //ворчание в тему
    Каким образом можно было допустить во всемирный продакшн такое недоразумение как MTP я вообще не представляю. Никто, видать, не тесиировал передачу больше одного файла, как в андроиде, так и в винде и линуксе. Говнокодит кто-то там далеко, а стыдно мне: объяснять людям почему у них фотки не копируются и учить юзать ftp в 2018 году…


    1. h31
      27.03.2018 16:00

      Плюсую по поводу FTP. На некоторых телефонах есть даже встроенный сервер.


      По-моему, было бы идеально, если бы Гугл добавил бы в Android встроенный SMB-сервер, который активируется при подключении по USB. SMB поддерживается всеми осями, работает стабильно и быстро. Если разработчиков смущает нативный код в Samba, то есть реализации на Джаве. Не понимаю, что им помешало остановиться на таком варианте.


  1. Arxitektor
    27.03.2018 08:57

    Каким образом можно было допустить во всемирный продакшн такое недоразумение как MTP

    Это да просто какое-то жуткое недоразумение.
    У меня стандартный глюк через USB 3.0 не копируются куча файлов в папках типа электронных книг, через USB 2.0 все ок. Возможен конечно глюк железа.
    OS Переставлял толку нет. Куда делось старое и удобное подключение как обычного диска.?
    И можно ли его вернуть?


    1. jrthwk
      27.03.2018 10:56

      Нет. Гугль выпилил UMS решительно и официально. На некоторых устройствах его все-таки запилил обратно конкретный вендор, если повезло, но это против рекомендаций гугла.

      А так — есть программка для эмуляции UMS Enabler, можно еще ftp server pro или samba filesharing серверы запускать на устройстве.


    1. Gordon01
      27.03.2018 11:04

      > Куда делось старое и удобное подключение как обычного диска.?
      Убрали в 4.1 вроде. Оно отрубало флешку от самого андроида, приложения падали, было много проблем.


      1. nidalee
        27.03.2018 14:11

        Нет, еще в 5 точно было.


        1. Leeloush_Keer
          27.03.2018 16:44

          в 5.1 убрали, ЕМНИП.


          Старенький xperia Z обновил до 5.1 и всё… больше дебиан не видел флешку телефона.
          Так же боролся, всё глючело, долго копировалось, зависало, в итоге плюнул и юзал облака для передачи с/на телефон.


          1. Faramant
            28.03.2018 07:56

            В 5.1 все работает:


            1. Leeloush_Keer
              28.03.2018 10:33

              Проверил сейчас: v5.1.1 на выбор: Зарядка устройства через USB или Передача файлов (MTP).


      1. zikasak
        28.03.2018 14:27

        Убрали в 3.0 (насколько помню)
        Далее официально осталось в устройствах обновлённых с 2. И там, где производитель запилил обратно


  1. antonn
    27.03.2018 12:37
    +1

    Однако есть один нюанс: при этом всём нам наглухо блокируют доступ к карте напрямую. Хочешь что-то передать на устройство — используй MTP со всеми вытекающими, вроде скорости передачи файлов, сравнимой с прогулочным шагом контуженной черепахи. Карту теперь не только к ПК через кабель напрямую нельзя подключить

    Так они давно же выпилили MassStorage, теперь как карту не форматируй — андроид выдает доступ исключительно через ужасный MTP.


  1. YouHim
    27.03.2018 15:36

    А есть ли способ поднять FTP и подключиться к нему через мобильную сеть? Ни один из опробованных мной FTP серверов не смог подключиться.


    1. Skerrigan
      28.03.2018 09:54

      Я юзаю файловый менеджер со встроенным FTP — ES… для жадных знакомящихся есть нужные треды на 4pda.
      На стаце всегда запущен OpenServer с FTP так же.


      1. YouHim
        28.03.2018 10:14

        Имел ввиду наоборот. Запустить на телефоне а заходить с ПК. ПК за НАТом, на нем не получается сервер поднять.


        1. Skerrigan
          28.03.2018 10:31

          Я в пределах дома так же за NAT — и ничего, нет проблем. Мобильник видит комп по WiFi в одной сети. Можно же компу задать локальный статический IP.


          1. YouHim
            28.03.2018 10:35

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


            1. Skerrigan
              28.03.2018 10:55

              Верно подметили — виноват, не подумал о вашем варианте сразу (и предложил чепуху).


            1. Skerrigan
              28.03.2018 11:04

              Пардон за дабл-пост, но судя по всему ES умеет и поднимать сервак FTP. Ни разу не пробовал так делать, но может быть присмотритесь?


              1. YouHim
                28.03.2018 11:22

                Не смог найти сервер. Где его посмотреть?


            1. antonn
              28.03.2018 13:53

              FTP поднимает второе соединение для передачи данных (помимо дефолтного на 21 порту), и способ его использования заключается в механизме режима работы FTP — активный или пассивный. В первом случае второе соединение пытается подключиться к клиенту (и если клиент за NAT без инспекции протоколов — соединения не будет), во втором сервер инициализирует сокет и передает порт клиенту, чтобы тот сам произвел подключение. Полагаю что есть большая вероятность что ваша корпоративная сеть не позволит серверу из вне достучаться до ПК в активном режиме. А если ваша мобильная сеть так же NATит вас в интернет — клиент из корпоративной сети не подключится к серверу в сети опсоса.
              Потому остаются варианты типа ТимВьювера…


              1. YouHim
                28.03.2018 14:19

                В мобильной сети, похоже, реальный IP. Потому, что я могу телефон пинговать снаружи. Так же у меня есть как минимум две программы, с которыми я могу конектиться снаружи по IP. (программка с веб-мордой и сервер WebDAV). А вот почему это не работает с FTP?


                1. antonn
                  28.03.2018 15:07

                  А что именно в ошибках говорит ftp? Список файлов получает или даже входа нет? Может провайдер режет порт…


                  1. YouHim
                    28.03.2018 15:48

                    Не удалось установить соединение с «ECONNREFUSED — Соединение отклонено сервером».
                    Скорее всего действительно порт


  1. snuk182
    27.03.2018 16:49

    Может лучше SMB / FTP, если есть рут? SMB pаботает до седьмого андроида включительно, FTP работает везде.


  1. kolu4iy
    28.03.2018 00:05

    Мой лайфхак заключался в копировании тысяч файлов в обратном направлении. Ну то есть из es проводника допустим на nfs/smb шару. asb push все же не для ленивых, факт.


  1. wickated
    28.03.2018 11:51

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