- Вопрос или проблема
- Ответ или решение
- 1. Проблемы с стартом ADB сервера
- 2. Причины возникновения ошибки
- 2.1 Ограничения chroot и jail
- 2.2 Установки PF (Packet Filter)
- 3. Подходы к решению проблемы
- 3.1 Проверка прав и конфигураций
- 3.2 Модификация конфигурации PF
- 3.3 Использование явной настройки ADB
- 4. Тестирование и отладка
- Заключение
Вопрос или проблема
Я пытаюсь подключиться к своему мобильному телефону с помощью 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.