Сервер ADB не подтверждает, если он запущен внутри чрута / тюрьмы / эмуляции с помощью Linuxulator.

Вопрос или проблема

Я пытаюсь подключиться к своему мобильному телефону с помощью adb по wifi, используя Linuxulator, потому что хочу установить одно конкретное java-приложение, которое требует Linux для работы. Я уже использовал виртуализованный Linux с помощью bhyve, и это сработало. Но я предпочел бы сохранить немного памяти, попробовав использовать Linuxulator вместо запуска виртуальной машины, если это возможно. Я уже пытался запустить приложение, используя java, установленный нативно на FreeBSD, но это не сработало, потому что приложение не было предназначено для этого. Итак:

[root@noble /]==> adb connect 192.168.1.2:5555

* демон не запущен. запускаем его сейчас на порту 5037 *
не удается связать 'tcp:5037'
Сервер ADB не подтвердил
* не удалось запустить демон *
ошибка: не удается подключиться к демону

это ошибка, которую я получаю. Я не уверен, могу ли я использовать какой-то трюк или существует ли что-то, что я могу сделать, потому что Linuxulator не поддерживает это никоим образом. Вместо этого, если я запускаю его непосредственно на FreeBSD, это работает:

[root@marietto /home/marietto]==> adb connect 192.168.1.2:5555

* демон не запущен; запустим сейчас на tcp:5037
* демон успешно запущен
подключено к 192.168.1.2:5555

Проблема в том, что java-приложение не распознает, что сервер adb работает:

[root@noble /home/marietto/Desktop/Files/OS/Linux/Tools/DeskDockServer_1.3.0]==> java -jar DeskDockServer_1.3.0.jar

Программа: DeskDockServer 1.3.0
Система: Linux 5.15.0, amd64
JRE: 21.0.5+11-Ubuntu-1ubuntu124.04
AdbLocator: Найден ADB в окружении PATH
class com.floriandraschbacher.deskdockserver.Main: 
Используется ADB из /usr/bin/adb
ab@3f95b479: Ошибка получения устройств: 
Сервер ADB не подтвердил
q$b@31524dfb: Ошибка получения ADB-устройств: 
java.io.IOException: java.io.IOException: 
Сервер ADB не подтвердил

но это работает:

[root@noble /home/marietto/Desktop/Files/OS/Linux/Tools/DeskDockServer_1.3.0]==> ps ax

  PID TTY      STAT   TIME COMMAND
 6089 pts/0    R+     0:00 ps ax
 5979 pts/0    S      0:00 adb -P 5037 fork-server server
 5952 pts/0    S      0:00 /bin/zsh

Согласно этой теме:

https://forums.freebsd.org/threads/make-jail-available-to-bind-only-certain-ports.85609/

Я хочу создать Jail с публичным IP-адресом. Но поскольку у нас нехватка адресов IPv4, я хочу сделать так, чтобы jail мог связываться только с диапазоном портов (например, от 700 до 750). Я спросил в IRC и один из ответов заключался в том, чтобы использовать pf для NAT портов из/в jail.

это то, что я пытался сделать:

nano /etc/pf.conf

nat on $ext_if from 127.0.0.0/24 to any -> 192.168.1.2
rdr on $ext_if proto tcp from any to any port 5037:5555 -> 127.0.0.255

root@noble:/home/marietto/Desktop/Files/OS/Linux/Tools/DeskDockServer_1.3.0# ./adb connect 

* демон не запущен. запускаем его сейчас на порту 5037 *
* демон успешно запущен *
** демон все еще не запущен
ошибка: не удается подключиться к демону

root@noble:/home/marietto/Desktop/Files/OS/Linux/Tools/DeskDockServer_1.3.0# ps ax

  PID TTY      STAT   TIME COMMAND
 8759 pts/2    R+     0:00 ps ax
 8758 pts/2    S      0:00 adb -P 5037 fork-server server
 8739 pts/2    S      0:00 /bin/bash

но это не сработало:

root@noble:/home/marietto/Desktop/Files/OS/Linux/Tools/DeskDockServer_1.3.0# java -jar DeskDockServer_1.3.0.jar 

2024-11-22 17:33:02.348   Программа: DeskDockServer 1.3.0
2024-11-22 17:33:02.348   Система: Linux 5.15.0, amd64
2024-11-22 17:33:02.348   JRE: 21.0.5+11-Ubuntu-1ubuntu124.04
2024-11-22 17:33:02.469   AdbLocator: Найден ADB в окружении PATH
2024-11-22 17:33:02.469   class com.floriandraschbacher.deskdockserver.Main: Используется ADB из /usr/bin/adb
2024-11-22 17:33:02.508   ab@c703a44: Ошибка получения устройств: Сервер ADB не подтвердил
2024-11-22 17:33:02.508   q$b@2b7d5ba: Ошибка получения ADB-устройств: java.io.IOException: java.io.IOException: 
Сервер ADB не подтвердил127.0.0.255192.168.1.2:5555

Ответ или решение

Проблема с ADB в окружении Linuxulator: причины и возможные решения

Ваша ситуация с ADB (Android Debug Bridge), работающим в среде Linuxulator, нарушает стандартное поведение данного инструмента. Давайте детально разберемся с возникшими проблемами и потенциальными решениями.

1. Проблемы с стартом ADB сервера

Сначала стоит рассмотреть сообщение об ошибке:

ADB server didn't ACK

Это указывает на то, что ADB сервер не может корректно запуститься или не может установить соединение. Основные проблемы связаны с разрешениями, конфигурацией сетевой подсистемы или особенностями работы оболочки Linuxulator в FreeBSD.

2. Причины возникновения ошибки

2.1 Ограничения chroot и jail

Когда вы запускаете ADB в контексте chroot или jail, приложению могут быть недоступны необходимые ресурсы или сетевые настройки. ADB использует TCP-порт 5037 для связи, и если у него нет прав на привязку к этому порту, вы получите ошибку.

2.2 Установки PF (Packet Filter)

Вы упомянули, что пробовали использовать PF для настройки NAT. Определение NAT и перенаправления портов в вашем pf.conf может быть сложным, особенно если учесть, что ADB ожидает, что он будет запускаться в контексте сети, разрешающей соединения на определенный порт.

3. Подходы к решению проблемы

3.1 Проверка прав и конфигураций

  • Убедитесь, что вы запускаете ADB с соответствующими правами. В некоторых случаях ADB требует root-доступа.
  • Проверьте конфигурацию безопасности jail. Убедитесь, что ваш jail может привязываться к порту 5037.

3.2 Модификация конфигурации PF

Используйте более простое правило NAT без ограничений:

nat on $ext_if from 127.0.0.0/24 to any -> 192.168.1.2
rdr on $ext_if proto tcp from any to 192.168.1.2 port 5037 -> 127.0.0.1

Также обратите внимание на корректность прав на порты и убедитесь, что PF активирован и перезапущен после изменений в конфигурации.

3.3 Использование явной настройки ADB

Вместо запуска ADB через системный механизм, попробуйте запустить его с явным указанием используемого порта:

adb -P 5037 start-server

И затем попробуйте выполнить команду подключения:

adb connect 192.168.1.2:5555

4. Тестирование и отладка

  • После внесения изменений необходимо протестировать, запустив adb devices, чтобы убедиться, что сервер ADB функционирует корректно и обнаруживает устройства.
  • Чтобы проверить, работает ли сервер на нужном порту, вы можете использовать команду netstat или ss:
netstat -an | grep 5037

Заключение

Работа с ADB через Linuxulator может быть сложной из-за особенностей управления сетью и окружением jail в FreeBSD. Однако, следуя описанным шагам и проверяя каждую из подсистем, вы сможете определить источник проблемы и восстановить функциональность ADB. Если проблемы сохраняются, возможно стоит рассмотреть вариант с использованием виртуальной машины с более полным Linux-окружением и совместимостью, как в случае с bhyve.

Оцените материал
Добавить комментарий

Капча загружается...