Expertus metuit
Подключение android-девайса кабелем через USB-tethering
2015-07-30 14:43
Теги: linux, android

В современном андроиде версии 4 или выше через кабель невозможно нормально добраться до главного раздела, так как доступ к нему открыт только через глючный и тормозной MTP, а с линуксом ещё хуже — там вообще нет нормальной поддержки MTP.

Многие выкручиваются так: поднимают на девайсе какой-нибудь сервер (обычно FTP), а дальше к нему подключаются через Wi-Fi; затем можно через любой FTP-клиент копировать файлы с девайса и назад. Есть и недостатки: не очень безопасно и часто очень медленно.

Но выход есть и называется он USB-tethering.

Коротко о методе:

  1. устанавливаем на девайс FTP-сервер (можете взять любой по вкусу в маркете);
  2. подключаем девайс USB-кабелем к компьютеру;
  3. включаем на телефоне USB-tethering;
  4. на компьютере запускаем FTP-клиент и подключаемся к узлу с адресом 192.168.42.129;
  5. поработали — отключаем USB-tethering на телефоне;
  6. выдёргиваем кабель.

Теперь подробности.

По умолчанию в Debian/Ubuntu уже включена поддержка сетевых USB-адаптеров; в других системах, возможно, придётся что-то пересобрать или установить нужные драйверы.

Сначала включаем USB-tethering на телефоне (эта опция доступна только после подключения кабелем к компьютеру): SettingsWireless & NetworksMore...Tethering & portable supportUSB tethering.

После этого на компьютере должен появиться новый сетевой адаптер с именем типа usb0. Его нужно сконфигурировать на использование DHCP и обычно он получает адрес из подсети 192.168.42.0/24 (это жёстко прошито в коде андроида), при этом адрес самого девайса/телефона тоже фиксированный — 192.168.42.129 — он выступает в роли шлюза.

Дальше с компьютера лезем по адресу телефона до FTP-сервера и копируем что нужно. Так как это кабель, копирование идёт исключительно быстро.

Есть и подводные камни. Например, такое подключение может вам легко сломать резолвинг адресов, прописав всякую херню в /etc/resolv.conf (об этом можно прочитать здесь, самый простой способ — сделать заранее chattr +i /etc/resolv.conf, чтобы фатально запретить запись в этот файл, но вы должны чётко понимать, что делаете), может какие-нибудь маршруты похерить. Ещё вариант решения — отказаться от автоматической конфигурации сети и прописать её для устройства вручную, об этом написано чуть ниже.

Теоретически метод может работать с Windows (но я не проверял). С MacOS X по умолчанию работать точно не будет, нужна установка стороннего драйвера, например, этого.

А теперь об этом подробнее.

Я предполагаю, что вы не пользуетесь network manager, а конфигурите сеть вручную из консоли. Все инструкции для ubuntu/debian.

На современных дистрибутивах драйвер присваивает USB-девайсу имя не usb0, а что-то типа enx010203040506 (цифры означают MAC-адрес сетевого устройства, в данном случае это 01:02:03:04:05:06) или enp0s20u3. Посмотреть, какое имя назначилось сетевому девайсу после включения tethering, можно командой ip:

# ip a
................
8: enx010203040506: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff

Или через dmesg (интерфейсу назначилось имя enp0s20u3):

# dmesg
...
[606354.326192] usb 3-3: New USB device found, idVendor=18d1, idProduct=4ee3
[606354.326193] usb 3-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[606354.326194] usb 3-3: Product: Nexus 5
[606354.326194] usb 3-3: Manufacturer: LGE
[606354.326195] usb 3-3: SerialNumber: 0101010101010101
[606354.344775] usbcore: registered new interface driver cdc_ether
[606354.346537] rndis_host 3-3:1.0 usb0: register 'rndis_host' at usb-0000:00:14.0-3, RNDIS device, 4e:8c:c4:61:f0:f7
[606354.346582] usbcore: registered new interface driver rndis_host
[606354.348156] rndis_host 3-3:1.0 enp0s20u3: renamed from usb0

Сначала случай, когда сетевому интерфейсу назначается имя вида enx010203040506. Для каждого вашего андроидного девайса имя интерфейса будет своим, и для каждого такого имени нужно добавить отдельную секцию в файл /etc/network/interfaces. Вот как это выглядит:

allow-hotplug enx010203040506
iface enx010203040506 inet static
    address 192.168.42.56
    netmask 255.255.255.0

Если же интерфейсу назначается имя типа enp0s20u3, оно будет разным при подключении к разным USB-портам, при этом будет одинаковым для всех USB-девайсов, которые к этому порту подключаются. Можно для конкретного телефона назначить выделенное имя интерфейса через udev-правила. Создаём файл /etc/udev/rules.d/10-android.rules, добавляем в него такую строчку для каждого телефона:

SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="0101010101010101", NAME="usbnexus"

Значение поля ATTRS{serial} берём из dmesg:

[606354.326195] usb 3-3: SerialNumber: 0101010101010101

В поле NAME прописываем желаемое имя девайса.

После изменений нужно перезагрузить udev:

sudo udevadm control --reload-rules && sudo udevadm trigger

Теперь в /etc/network/interfaces прописываем:

allow-hotplug usbnexus
iface usbnexus inet static
    address 192.168.42.56
    netmask 255.255.255.0

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

Если теперь включить tethering на подключенном USB-кабелем девайсе, то интерфейс автоматически и правильно сконфигурится. Обратите внимание, что мы явно указываем параметры сети, а не пользуемся DHCP, так как нам нужен не полноценный tethering, а лишь линк до девайса, без смены дефолтного шлюза и DNS-серверов.

  • Обновлено 2015-09-20: добавлена секция про ручное конфигурирование через /etc/network/interfaces
  • Обновлено 2017-01-27: добавлено информации про новые системы

Комментарии

еее | 2016-10-12 в 11:33

"прописав всякую херню"

Это обязательно - изъясняться на жаргоне маргиналов?

Текст комментария (разметка: *курсив*, **полужирная**, [ссылка](http://example.com) или <http://example.com> ещё)
Имя (обязательно, 50 символов или меньше)
Email, на который получать ответы (не будет опубликован)
Веб-сайт
© 2006—2016 Sergey Stolyarov | Работает на Pyrone