Entware без папки /opt (в chroot среде)

Используем пакеты, расширяющие возможности оборудования
Аватара пользователя
Zyxmon
Администратор
Сообщения: 1885
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 19 янв 2022, 21:46

Подготовка
Как то мы всем говорим, что для установки Entware нужна папка /opt с правами на запись, расположенная на файловой системе, где возможны символические ссылки. На самом деле не обязательно устанавливать Entware в /opt, можно выполнять сервисы Entware в chroot среде имея при этом доступ к файловой системе всего устройства. Вначале я описал в этом посте установку на Android 10 tv приставку с magisk в качестве рута и суперразделом, в этом случае нельзя создавать папки и файлы в корневой файловой системе. Установка была довольно сильно ориентирована на устройство. В настоящее время скрипт установки одинаков для всех устройств, он работает и на android и на НАСе (проверял на Qnap).
В основе установки лежит специальная версия busybox со встроенной утилитой установки (параметр --install), собранная статически и поэтому работающая на всех устройствах с заданной при сборки архитектурой. Скрипт установки (install_entware_chroot.sh) и такая версия busybox выложены для скачивания в папке http://bin.entware.net/armv7sf-k3.2/installer/chroot/ (для armv7).
Итак скрипт установки с комментариями. Предполагается, что пользователь разместит скрипт и бинарник busybox в одной папке на устройстве и запустит скрипт командой `sh <path_to_install_entware_chroot.sh> <папка_для_установки_entware>`

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

#!/bin/sh

if [ -n "$1" ]
then
    CHROOT_DIR=$1
else
    echo "Usage: $0 <directory_to _install_entware>"
    exit 1
fi

#Подмонтируем виртуальные ядерные ФС
for dir in dev dev/pts proc sys; do
    mkdir -p $CHROOT_DIR/$dir
    mount -o bind /$dir $CHROOT_DIR/$dir
    sleep 1
done

#папки для установки busybox
mkdir -p $CHROOT_DIR/bin
mkdir -p $CHROOT_DIR/sbin

#скрипт и busybox могут быть на файловой системе, смонтированной с noexec, а вот на $CHROOT_DIR execution bit должен поддерживаться

cp `dirname $0`/busybox $CHROOT_DIR/bin/
chmod +x $CHROOT_DIR/bin/busybox

#установка busybox (создание симлинков) - делаем в среде chroot
PATH=/bin:/sbin $CHROOT_DIR/bin/busybox chroot $CHROOT_DIR /bin/busybox --install -s

#для дальнейшего нам потребуются в chroot файлы /etc/resolv.conf и /etc/hosts
#их можно или скопировать с папки /etc устройства или создать так:
mkdir -p $CHROOT_DIR/etc
echo 'nameserver 8.8.8.8' > $CHROOT_DIR/etc/resolv.conf
echo 'nameserver 8.8.4.4' >> $CHROOT_DIR/etc/resolv.conf
echo '127.0.0.1  localhost' > $CHROOT_DIR/etc/hosts


echo "После успешной 'установки' busybox можно из chroot среды установить Entware."
echo "Для того, чтобы оказаться в chroot среде выполните:"
echo ""
echo "PATH=/opt/bin:/opt/sbin:/bin:/sbin $CHROOT_DIR/bin/busybox chroot $CHROOT_DIR /bin/sh"
echo ""
echo "В chroot среде выполните:"
echo "wget http://bin.entware.net/armv7sf-k3.2/installer/alternative.sh -O /installer.sh"
echo ""
echo "Затем установите Entware:"
echo "sh /installer.sh"

Скрипт небольшой, можно все команды ввести руками по одной. Собственно нужно создать папки dev, dev/pts, sys, proc в выбранной для установки Entware папки, подмонтирвать в них (mount -o bind) папки (linux ядра)устройства. Создать папки /bin и /sbin /etc и пару фалов в выбранной для установки Entware папки. Скопировать busybox в папку bin и запустить (уже в среде chroot) busybox с параметрами `--install -s`.
Если все пройдет без ошибок, то будет подготовлена chroot среда, в которой стандартными способами можно установить Entware.
Примерный лог установки

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

sti6140d360:/ # sh /sdcard/Download/install_entware_chroot.sh /data/local/entware
После успешной 'установки' busybox можно из chroot среды установить Entware.
Для того, чтобы оказаться в chroot среде выполните:

PATH=/opt/bin:/opt/sbin:/bin:/sbin /data/local/entware/bin/busybox chroot /data/local/entware /bin/sh

В chroot среде выполните:
wget http://bin.entware.net/armv7sf-k3.2/installer/alternative.sh -O /installer.sh

Затем установите Entware:
sh /installer.sh

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

Сообщение Zyxmon » 19 янв 2022, 21:47

Установка
Собственно дальше можно ничего и не описывать. Скрипт в конце напишет команду, которую нужно выполнить, чтобы оказаться в chroot среде. Дальше с помощью wget скачиваем скрипт установки (альтернативный вариант alternative.sh для своей архитектуры), запускаем его, ставим нужные пакеты, пользуемся. Скрипт запуска таким образом установленной системы Entware я приведу в следующем посте. А пока несколько приемов и лайфхаков, которыми пользуюсь:

1. Для установки и при работе Еntware удобно, чтобы папка /opt/tmp была в памяти (в tmpfs), а /opt/var/run была бы ссылкой на эту папку.
Я выполняю (не важно до или после скачивания скрипта установки):

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

/ # wget http://bin.entware.net/armv7sf-k3.2/installer/alternative.sh -O /installer.sh
Connecting to bin.entware.net (188.114.97.2:80)
saving to '/installer.sh'
installer.sh         100% |*********************************************************************************************************************************************************************************************|  2765  0:00:00 ETA
'/installer.sh' saved
/ # mkdir -p /opt/tmp
/ # mount -t tmpfs tmpfs /opt/tmp
/ # sh /installer.sh

Выдача скрипта установки стандартная
log

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

Info: Checking for prerequisites and creating folders...
Warning: Folder /opt exists!
Warning: Folder /opt/tmp exists!
Warning: If something goes wrong please clean /opt folder and try again.
Info: Opkg package manager deployment...
Connecting to bin.entware.net (188.114.96.2:80)
saving to '/opt/bin/opkg'
opkg                 100% |*********************************************************************************************************************************************************************************************|  734k  0:00:00 ETA
'/opt/bin/opkg' saved
Connecting to bin.entware.net (188.114.96.2:80)
saving to '/opt/etc/opkg.conf'
opkg.conf            100% |*********************************************************************************************************************************************************************************************|   171  0:00:00 ETA
'/opt/etc/opkg.conf' saved
Info: Basic packages installation...
Downloading http://bin.entware.net/armv7sf-k3.2/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
Installing busybox (1.34.1-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/busybox_1.34.1-1_armv7-3.2.ipk
Installing libgcc (8.4.0-11) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libgcc_8.4.0-11_armv7-3.2.ipk
Installing libc (2.27-11) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libc_2.27-11_armv7-3.2.ipk
Installing libssp (8.4.0-11) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libssp_8.4.0-11_armv7-3.2.ipk
Installing libpthread (2.27-11) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libpthread_2.27-11_armv7-3.2.ipk
Installing librt (2.27-11) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/librt_2.27-11_armv7-3.2.ipk
Installing libubox (2021-11-20-cce5e351-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libubox_2021-11-20-cce5e351-1_armv7-3.2.ipk
Installing libjson-c (0.15-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libjson-c_0.15-2_armv7-3.2.ipk
Installing jsonfilter (2018-02-04-c7e938d6-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/jsonfilter_2018-02-04-c7e938d6-1_armv7-3.2.ipk
Configuring libgcc.
Configuring libc.
Configuring libpthread.
Configuring libssp.
Configuring librt.
Configuring libubox.
Configuring libjson-c.
Configuring jsonfilter.
Configuring busybox.
Installing entware-opt (227000-3) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-opt_227000-3_all.ipk
Installing libstdcpp (8.4.0-11) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libstdcpp_8.4.0-11_armv7-3.2.ipk
Installing entware-release (1.0-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-release_1.0-2_all.ipk
Installing zoneinfo-asia (2021e-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-asia_2021e-1_armv7-3.2.ipk
Installing zoneinfo-europe (2021e-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-europe_2021e-1_armv7-3.2.ipk
Installing findutils (4.8.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/findutils_4.8.0-1_armv7-3.2.ipk
Installing terminfo (6.2-3) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/terminfo_6.2-3_armv7-3.2.ipk
Installing libpcre (8.45-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libpcre_8.45-2_armv7-3.2.ipk
Installing grep (3.7-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/grep_3.7-2_armv7-3.2.ipk
Installing locales (2.27-9) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/locales_2.27-9_armv7-3.2.ipk
Installing opkg (2021-06-13-1bf042dd-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/opkg_2021-06-13-1bf042dd-1_armv7-3.2.ipk
Installing entware-upgrade (1.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-upgrade_1.0-1_all.ipk
Configuring terminfo.
Configuring libpcre.
Configuring grep.
Configuring locales.
Entware uses separate locale-archive file independent from main system
Creating locale archive /opt/usr/lib/locale/locale-archive
Adding en_EN.UTF-8
Adding ru_RU.UTF-8
You can download locale sources from http://bin.entware.net/other/i18n_glib227.tar.gz
You can add new locales to Entware using /opt/bin/localedef.new
Configuring entware-upgrade.
Upgrade operations are not required.
Configuring opkg.
Configuring zoneinfo-europe.
Configuring zoneinfo-asia.
Configuring libstdcpp.
Configuring entware-release.
Configuring findutils.
Configuring entware-opt.
Info: Congratulations!
Info: If there are no errors above then Entware was successfully initialized.
Info: Add /opt/bin & /opt/sbin to $PATH variable
Info: Add "/opt/etc/init.d/rc.unslung start" to startup script for Entware services to start
Info: Use ssh server from Entware for better compatibility.
Info: Found a Bug? Please report at https://github.com/Entware/Entware/issues
Свернуть

После установки я выполняю

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

/ # rmdir /opt/var/run
/ # ln -s /opt/tmp /opt/var/run

Для того, чтобы папка /opt/tmp всегда была в памяти после запуска Entware, я помещаю скрипт http://bin.entware.net/armv7sf-k3.2/ins ... /S00tmpdir в папку /opt/etc/init.d (детали опускаю, скрипт должен иметь флаг выпролнения).

2. Установка редактора nano (или mc) и dropbear стандартна, после установки запускаем dropbear:
(Примечание: если нужно запустить dropbear на нестандартном порте - отредактируйте файл `/opt/etc/config/dropbear.conf`

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

opkg install mc
opkg install dropbear
/opt/etc/init.d/S51dropbear start

из chroot среды не выходим, дальнейшие операции удобнее сделать в ssh сессии.

3. Соединяемся с устройством по протоколу ssh. Пароль 12345.
Меняем пароль командой passwd на свой.
Редактируем файл профиля

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

~ # cat /opt/etc/profile
#!/bin/sh

# Please note it's not a system-wide settings, it's only for a current
# terminal session. Point your f\w (if necessery) to execute /opt/etc/profile
# at console logon.

export PATH=/opt/bin:/opt/sbin:/bin:/sbin
export TMPDIR=/opt/tmp
export TERMINFO=/opt/share/terminfo
export TERM=xterm
export TMP=/opt/tmp
export TEMP=/opt/tmp
unset LD_PRELOAD
unset LD_LIBRARY_PATH
alias mc="mc -c"

# You may define localization
export LANG='ru_RU.UTF-8'
export LC_ALL='ru_RU.UTF-8'
#export LANG='en_US.UTF-8'
#export LC_ALL='en_US.UTF-8'

Я поменял задание PATH, добавил переменную среды TMPDIR, локаль в конце файла.
Стоит также задать свою временную зону, например

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

ln -sf /opt/share/zoneinfo/Europe/Moscow  /opt/etc/localtime

У Вас могут быть свои рецепты первоначальной настройки Entware.
Теперь выходим из ssh сессии и продолжаем с среде chroot

4. В chroot среде останавливаем dropbear, отмонтируем /opt/tmp, набираем exit и возвращаемся в операционную систему устройства.

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

/opt/etc/init.d/S51dropbear  stop
umount /opt/tmp
exit


5. Можно (но необязательно) проверить еще раз, что все работает. Запустим теперь не /bin/sh, а скрипт `/opt/etc/init.d/rc.unslung start`. Проверяем опять вход по ssh, выходим из ssh. После проверки запускаем в chroot `/opt/etc/init.d/rc.unslung stop`

6. Размонтируем ядерные системы ядра (это в операционной системе устройства)

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

umount <директория_entware>/sys
umount <директория_entware>/proc
umount <директория_entware>/dev/pts
umount <директория_entware>/dev

В следующем сообщение о запуске Entware после запуска устройства.

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

Сообщение Zyxmon » 19 янв 2022, 21:47

Запуск установленной системы Entware
Для запуска установленной системы Entware нужно выполнить скрипт, который я опишу чуть позже. Для автоматического запуска Entware нужно найти способ запуска скрипта после запуска и загрузки устройства. Для НАСов такой способ найти легко. Для роутеров асус он описан. Для android с рутовым доступом это либо папка init.d или (magisk) папка /data/adb/service.d. Для других устройств - ищите. Если такого способа нет, скрипт придется запускать вручную.
Способов выполнения скрипта при окончании работы устройства часто нет, или они неизвестны. Именно поэтому стоит сделать так, что папка Entware /opt/run находилась в tmpfs (в памяти). Если это не так, что часто после перезагрузки устройства некоторые сервисы (тот же dropbear) не будут стартовать, тк. в файловой системе останутся pid файлы и их нужно будет удалять руками.

Итак скрипт запуска можно скачать по ссылке - http://bin.entware.net/armv7sf-k3.2/ins ... /99entware
Перед тем, как его запускать, следует его отредактировать. Может быть придется поменять шебанг для android.
Точно нужно в начале файла задать папку, в которыу вы установили Entware, задав строку

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

CHROOT_DIR=/data/local/entware

Тут я использовал папку установки из предыдущего поста.
Если нужно, чтобы в Entware были доступны папки операционной системы устройства следует определить список EXTRA_DIRS. Для Androd что-нибудь подобное

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

EXTRA_DIRS="/system /apex/com.android.runtime /product /vendor /data /mnt /storage /storage/emulated"

Этот список задается в двух местах - в функции start и функции stop (в обратном порядке).
Собственно на этом все! :D

Voxel
Сообщения: 150
Зарегистрирован: 29 фев 2016, 13:34

Сообщение Voxel » 20 янв 2022, 22:20

Идея интересная... Сразу наталкивает на неожиданные мысли. Надо продумать практическое применение.
Продолжайте, сэр.

Voxel.

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

Сообщение Zyxmon » 25 янв 2022, 16:10

Voxel писал(а):Источник цитаты Надо продумать практическое применение.

Придумали?
На вскидку - установка на устройства без папки /opt, установка нескольких версий Entware на одно устройство, установка на устройства с папкой /opt, которую использует прошивка (есть такие роутеры asus, на них entware устанавливали только с прошивкой мерлина, где /opt не используется).
Описанный способ устанавливает абсолютно одинаковые версии Entware на разные устройства, ведь бинарники прошивки устройства внутри chroot среды не используются.

И еще несколько слов о busybox, который использовался. Это тот же busybox, что и в Entware, но собранный статически, и с функцией install (CONFIG_FEATURE_INSTALLER=y). Как оказалось, если использовать glibc - апплет wget может не работать (цитирую)
There are known issues with DNS functionality in statically-linked glibc programs (like busybox in this case), because libnss must be dynamically loaded. Building a uClibc toolchain and linking busybox against that would resolve this.

Поэтому собирался musl вариант.

Voxel
Сообщения: 150
Зарегистрирован: 29 фев 2016, 13:34

Сообщение Voxel » 25 янв 2022, 21:36

Zyxmon писал(а):Источник цитаты Придумали?
На вскидку - установка на устройства без папки /opt, установка нескольких версий Entware на одно устройство, установка на устройства с папкой /opt, которую использует прошивка (есть такие роутеры asus, на них entware устанавливали только с прошивкой мерлина, где /opt не используется).

Еще обдумываю. Думаю для своих пользователей. Там в некоторых Нетгировских устройствах уже используется /opt на внутренней части флеш-памяти для (пардон муа) совершенно дебильных печенюшек от Нетгира. Типа заманивание особыми фичами, чтобы покупали эти девайсы. Я пока использовал символьные линки в /opt для Entware-овских /bin /etc /home /lib и т.д. на USB, чтобы не расходовать внутренний флеш (ограничен). Тут некоторое противоречие: я типа терпеть ненавижу эти плюшки и добавил возможность их неиспользования (disable) в самых первых версиях. И тогда некоторое несоответствие. Тогда делаю саму автоматом /opt символьным линком на USB. Чуть геморройно. Тут возникают с твоим предложением дополнительные идеи унификации и избавления от геморра.

Как говорится, энивэй, биг сенкс за идею и зарядку для мозга.

Voxel.

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

Сообщение Zyxmon » 25 янв 2022, 21:59

Voxel для Ваших целей проще будет реализовать тот вариант установки, который был описан ранее. Он стерт, не сохранен.
Ну а для остальных - ссылка на "билдрут", которым собираю busybox используемый в (на мой взгляд красивой) установке - https://github.com/zyxmon/Entware-musl (вдруг, кто захочет собрать).

yozhig
Сообщения: 2
Зарегистрирован: 29 янв 2022, 07:16

Сообщение yozhig » 29 янв 2022, 07:21

Zyxmon писал(а):Источник цитаты Запустим теперь не /bin/sh, а скрипт `/opt/etc/rc.unslung start`. Проверяем опять вход по ssh, выходим из ssh. После проверки запускаем в chroot `/opt/etc/rc.unslung stop`

Здравствуйте! Поправка: /opt/etc/init.d/rc.unslung start и /opt/etc/init.d/rc.unslung stop

А так, всё успешно установилось! Приставка X96 x4 на amlogic s905x4, с андроид 11. Скрипт автозагрузки поместил в /data/adb/service.d (magisk был предварительно установлен). Сразу после запуска есть доступ по ssh.
Ушел тестировать дальше...

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

Сообщение Zyxmon » 29 янв 2022, 10:03

yozhig, спасибо за правильное исправление. Выше подправил.

Несколько замечаний по поводу Android с magisk и суперразделом. Для модификации readonly файловой системы magisk использует оверлейную файловую систему, которая монтируется поверх /systen /vendor /product - так вот при монтировании этих разделов с помощью `mount -o bind` для Entware система Entware видит исходные варианты этих разделов без оверлея magisk. Если написано непонятно - сами увидите и поймете.

yozhig
Сообщения: 2
Зарегистрирован: 29 янв 2022, 07:16

Сообщение yozhig » 29 янв 2022, 12:15

Zyxmon писал(а):Источник цитаты Для установки и при работе Еntware удобно, чтобы папка /opt/tmp была в памяти (в tmpfs), а /opt/var/run была бы ссылкой на эту папку.

С этой фишкой появилась проблема.
smbd вроде и стартует OK, но по факту не работает, так как сыпет в логе:
log.smbd
smbd version 4.14.7 started.
Copyright Andrew Tridgell and the Samba Team 1992-2021
[2022/01/29 17:45:33.620880, 0] ../../lib/util/util.c:338(directory_create_or_exist_strict)
invalid permissions on directory '/opt/var/run/samba/ncalrpc': has 0777 should be 0755
Свернуть

Меняю вручную права директории ncalrpc на 755. После этого можно перезапустить /opt/etc/init.d/S91smb restart, и он нормально стартует. (!) Но после перезагрузки устройства всё повторяется - директория /opt/var/run/samba/ncalrpc снова с правами 777, и smbd не работает.
Забавно, что рядом директория nmbd создается с правильными правами 755.

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

/opt/var # cd run
/opt/tmp # cd samba
/opt/tmp/samba # ls -l
drwxrwxrwx    3 root     root            60 Jan 29 18:08 ncalrpc
drwxr-xr-x    2 root     root            60 Jan 29 18:08 nmbd


Если не делать run ссылкой на /opt/tmp, то директория ncalrpc создается верно, с правами 755.

Копаю дальше, пока не знаю откуда ноги растут


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

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

Всего 4 посетителя :: 1 зарегистрированный, 0 скрытых и 3 гостя (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

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