Проблема /etc

kaztost
Сообщения: 148
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 12 окт 2017, 22:43

Одной из проблем при установке Entware на андроид-устройстве является то, что в отличие от обычных Linux-систем, в андроиде отсутствуют файлы /etc/passwd, /etc/group, /etc/shell,/etc/resolv.conf и другие. Более того, в целях обратной совместимости /etc является симлинком на /system/etc. А /system является разделом по умолчанию монтируемым только для чтения. В некоторых случаях на устройстве отсутствует вообще какая-то возможность модификации этого раздела (команда mount -o remount,rw /system не проходит, а если модифицировать /system каким-то другим способом, то система не загрузится вообще). Отчасти проблема решается установкой патченной Entware-ng или альтернативной Entware3x. Но это не решает проблему в целом, например для полноценной работы нужно создавать файл или симлинк /system/etc/resolv.conf. Иначе энтварные программы не смогут резолвить URL-адреса. Конечно, "в нормально настроенной системе данный файл не нужен: запросы будут обрабатываться сервером на локальном хосте", но в данном случае занимать чем-либо 53-й порт локалхоста чревато - если включить штатный андроидовский режим модема, то андроид попадает в вечный цикл в связи с невозможностью запустить свой dnsmasq.

Поэтому думаю, что лучшее универсальное решение названной проблемы - удаление симлинка/etc в процессе запуска и замена его на симлинк на другую директорию с симлинками, указывающими на одноименные объекты в /system/etc. Ну и туда же мы сможем добавить симлинки на /opt/etc/passwd, /opt/etc/group, /opt/etc/shell, /opt/etc/resolv.conf. Например, выполняем:

~ # mkdir /data/local/etc
~ # chmod 755 /data/local/etc
~ # chcon u:object_r:system_file:s0 /data/local/etc
~ # for i in $(ls /system/etc); do ln -s /system/etc/$i /data/local/etc/$i; done
~ # ln -s /opt/etc/resolv.conf /data/local/etc/resolv.conf
~ # ln -s /opt/etc/passwd /data/local/etc/passwd
~ # ln -s /opt/etc/group /data/local/etc/group
~ # ln -s /opt/etc/shells /data/local/etc/shells

и помещаем команды

rm /etc
ln -s /data/local/etc /etc

в автозагрузку. Тогда и Entware-ng можно ставить не патченную, и раздел /system не трогать.

kaztost
Сообщения: 148
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 25 янв 2018, 19:01

После некоторых размышлений подумал, что для андроида все эти костыли, изложенные выше, - действительно костыли. Разработчики андроида монтируют /system только на чтение, а /etc резервируют для симлинка на /system/etc. Без лишней необходимости оба этих факта лучше на андроиде не менять (на некоторых устройствах /system вообще может не перемонтироваться в rw).

В общем, собрал пока новый патченный libc для Entware-ng, где /etc глобально заменен на /opt/etc. Все равно из используемых в энтвари etc-конфигов для андроида единственным актуальным является /etc/hosts, но даже его замена в энтвари на /opt/etc/hosts по моему дает лишь некоторые удобства. Апплеты бизибокса adduser и passwd тоже по идее надо патчить, но думаю пока можно обойтись подменой этих симлинков на старый патченный busybox. Ставить пакет надо либо вручную, либо удалив предварительно /opt/var/opkg-lists/packages по причине несовпадения md5-сумм с оргиналом. О своих проблемах я изложил здесь. Даже где сабверсию поменять, не вижу.

После установки этого модифицированного libc программы ping, wget, opkg, ssh начинают резолвить имена через /opt/etc/resolv.conf. Но чисто теоретически какой-нибудь другой пакет может обращаться к /etc/resolv.conf напрямую, минуя библиотечные функции из libc.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1546
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 25 янв 2018, 21:17

kaztost писал(а):Источник цитаты В общем, собрал пока новый патченный libc для Entware-ng

А мы, например, скоро обновим glibc 2.25 на 2.26. Что произойдет c установленным таким android при `opkg update| opkg upgrade`. Такие фокусы нужно делать только со сборкой всего и вся и репой с другим URL.
Одна из идей Entware-3x - универсальность. Один дистрибутив и для android, и для keenetic (там похожая на android ситуация) и для , скажем, dd-wrt, и для NAS от qnap.

kaztost
Сообщения: 148
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 25 янв 2018, 22:05

Zyxmon писал(а):Источник цитаты скоро обновим glibc 2.25 на 2.26

Ну это же в Entware-3x. А в Entware-ng (для которого я патчил) до сих пор glibc 2.23. У меня, например, на большинстве андроид-устройств Entware-3x не пойдет. Если выйдет там новый несовместимый glibc - придется заново собирать и ставить новый патченный.
Я не против (и даже за) универсальности. Но я за глобальную замену /etc на /opt/etc в этом glibc. В конце концов симлинки /opt/etc/file на /etc/file для устройств с уже имеющимся /etc/file проще сделать (в общем случае), чем в обратную сторону. Да и мое более чем годовое тестирование патченным вами glibc не вызвало каких-либо проблем. Думаю не будет проблем и с /opt/etc/resolv.conf и прочим. То же самое и c Entware-3x. По мне тамошние патчи недопатченны. Ну как альтернативный вариант можно сделать два исключающих друг друга glibc (андроидный и неандроидный). На остальные пакеты это не должно никак отразится. На всякий пожарный можно в скрипте установки ставить для нужных конфигов симлинки /opt/etc/file на /etc/file, если /etc/file существует.

kaztost
Сообщения: 148
Зарегистрирован: 16 июл 2017, 23:29

Сообщение kaztost » 05 фев 2018, 11:55

Глобальные etc-патчи glibc:
1) для armv7 Entware-ng: ссылка
2) для armv8 Entware-3x: ссылка

anpaza
Сообщения: 9
Зарегистрирован: 24 ноя 2018, 00:14

Сообщение anpaza » 24 ноя 2018, 01:41

Привет!

Получил удовольствие от чтения раздела :) К сожалению, вопрос настолько узкоспециализированный, что получился "театр одного актёра" :)

Тем не менее, рискну подхватить неупавшее знамя.

Надеюсь, никто не станет спорить, что патчить исходники - это фу. Я уж молчу про патчить libc. Нужно искать экологически чистые альтернативы, чтобы entware работал "нативно", не спотыкаясь об убогую файловую систему андроида, и не было нужды делать отдельную ветку entware под него. Предложу, например, такой подход.

Код: Выделить всё

[3|zap@zap|~]ssh atv # моя Android TV приставка
/storage/emulated/0 $ su
root@q201:/ # ls -la /etc/
-rw-r--r-- root     root       151225 1970-01-01 03:00 NOTICE.html.gz
[всякая андроидная кака пропущена]

root@q201:/ # ls -la /opt/etc/
-rw-rw---- root     root            0 2018-11-24 00:34 this_is_opt_etc
[это типа кошерный etc который должен встать в корень]

root@q201:/ # /opt/bin/unshare -m
root@q201:/ # /opt/bin/mount --bind /opt/etc /etc
root@q201:/ # ls -la /etc/
-rw-rw---- root     root            0 2018-11-24 00:34 this_is_opt_etc
[бах! и мы в хопре]


При этом ведроидные программы, и даже новые сессии ssh по-прежнему видят "старый" /etc, который симлинк на /system.

В скобках замечу, что mount --bind /opt/etc на симлинк /etc это, наверное, не лучшая идея - есть смысл заменить симлинк тоже на mount --bind /system/etc /etc (при старте системы), чтобы "слишком умные" программы случайно не заменили симлинк в полном имени файла и не получили в итоге опять /system/etc/... (как, например, при попытке readlink -f /etc/passwd).

Далее, чтобы не делать каждый раз unshare а затем mount --bind, необходим некий аналог init для нашего "линдроида" или "ентдроида", если угодно. Всё равно при инициализации "линукса внутри андроида" имеется необходимость произвести определённые манипуляции. После этого он может запустить уже "нативный" /opt/sbin/init или systemd и пустить запуск сервисов на самотёк. При этом, если зайти через sshd, попадём в "ентдроидное" окружение с "правильным" etc и так далее. А если войти через андроидного инвалидного dropbear (по умолчанию он на порту 6022, вроде), то попадём в "родной ведроид".

В отличие от chroot подхода, здесь нет необходимости перемонтировать всякие /sys /dev /proc и так далее. Есть некоторая засада с /dev/log, о которой писал kaztost, но это частный случай.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1546
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 ноя 2018, 09:40

anpaza писал(а):Источник цитаты и не было нужды делать отдельную ветку entware под него.

А это сейчас и не делается.

anpaza
Сообщения: 9
Зарегистрирован: 24 ноя 2018, 00:14

Сообщение anpaza » 24 ноя 2018, 10:51

Zyxmon писал(а):Источник цитаты
А это сейчас и не делается.

Дык, потому и не делается. И огромная работа, проведённая kaztost, доступна лишь из закромов этого форума, куда выйти не так-то просто.

Моя цель - скрестить ужа с ежом, и натянуть "родной" Entware на андроид так, чтобы это не доставляло неудобств ни тому, ни другому. Для этого буду писать андроидный инсталлятор Entware (подобно тому, как существует аналогичный софт для busybox, lineage, twrp итп). Поставил в два клика и всё работает. Туда же хочу сделать менеджер пакетов (оболочку для opkg). Ставишь любые пакеты не задумываясь - подходят ли они к андроиду или нет, и какие ещё манипуляции потом придётся делать чтобы оно заработало.

Кстати, не подскажете - есть ли способ собирать ipk вне дерева OpenWRT/Entware? Всё-таки сборка через него неудобна, слишком долго думает, исходники нужно складывать в targz, да и когда сам разрабатываешь пакет, хочется из своего рабочего git репозитория сразу сделать make ipk и не париться.

Ах да, ещё одно. Насколько я понял, Entware собирается без языковой поддержки? Это засада, андроидным устройствам эти крохи экономии уже ни к чему, а вот дружественности интерфейса убавляют изрядно. Возможно, на втором этапе придётся сделать отдельный репозиторий с поддержкой gconv, gettext, /usr/share/locale и всего такого прочего.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1546
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 ноя 2018, 11:15

anpaza писал(а):Источник цитаты Дык, потому и не делается.

Давайте так, специальная версия Entware была нужна только для Entware-ng. Начиная с Entware-3x репозиторий и фактически установочный скрипт - общие. Насчет универсальности - по моему опыту для Android это малореально.
Наиболее универсальный способ ИМХО через имиджи, я собирал их более года назад для 3x, для текущей версии Entware их нет. См - http://www.zyxmon.org/2017/07/16/entwar ... -konspekt/
Поддержка локалей есть, частичная. На уровне libc - есть, на уровне бинарников обычно нет. Переписывать тысячи Makefile из Openwrt это не наш путь. Из опыта (с 2014 года) - отклонения от решений OpenWRT выскакивают боком при обновлении. У нас их мало, десяток-два. А опыт у нас в Entware немалый.
Способ сборки пакетов нам известен один и он описан в wiki на гитхабе - https://github.com/Entware/Entware/wiki ... om-sources

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1546
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 ноя 2018, 15:00

anpaza писал(а):Источник цитаты есть смысл заменить симлинк тоже на mount --bind /system/etc /etc (при старте системы)

Если не ошибаюсь, это делалось в установочном скрипте Entware и Entware-ng на Zyxel Keenetic с ndms v1. Точно не помню, но могу найти. Может на Zyxware.... Все работало без проблем.


Вернуться в «Entware на Android»

Кто сейчас на конференции

Всего 3 посетителя :: 1 зарегистрированный, 0 скрытых и 2 гостя (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: CommonCrawl [Bot] и 2 гостя