Ошибка при формировании корневой файловой системы

Запустил контейнер командой
WBDEV_TARGET=stretch-armhf ./wbdev

В контейнере выполнил
cd rootfs
./create_rootfs.sh 6x

На этом этапе скрипт хочет sudo, которого в контейнере, насколько вижу, нет, но не в этом проблема

После получения и извлечения кучи библиотек получил ошибку:
Copy qemu to rootfs
modprobe: ERROR: …/libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file ‘/lib/modules/5.4.0-47-generic/modules.dep.bin’
modprobe: FATAL: Module binfmt_misc not found in directory /lib/modules/5.4.0-47-generic
Delete unused locales
Second debootstrap stage
chroot: failed to run command ‘/debootstrap/debootstrap’: Exec format error
Error in /home/*****/wbdev/go/src/github.com/contactless/image/rootfs/rootfs_env.sh:48. ‘chroot ${ROOTFS} “$@”’ exited with status 0
Call tree:
1: ./create_rootfs.sh:199 chr(…)
Exiting with status 1

В файловой системе образа вообще нет /lib/modules

Как исправить ошибку и, таки, собрать корневую ФС?

Выкачиваю свежий и воспроизвожу.

Собственно “create_rootfs.sh” испоьзуется только при создании самого контейнера, посмортрите в https://wirenboard.com/wiki/Сборка образов прошивки
И извините за долгое ожидание.

Так и цель была - создать свой образ, с нужным набором программ и настройками. Для этого, как я понимаю, необходимо, в том числе, модифицировать корневую ФС. Настройки можно задать, меняя данные в /rootfs, а как установить дополнительные пакеты, чтобы они тоже попали на образ?

Заходим в контейнер (предварительно лучше отключить автоудаление контейнера убрав в строке “docker run” файла wbdev ключ “–rm”).
Устанавливаем пакеты. Потом - уже - собираем. Все “корни” - уже лежат в контейнере.

так, стоп.

create_rootfs совершенно не обязательно выполнять внутри нашего докер-контейнера.

Если запускаете внутри докер-контейнера, то запускайте командой “wbdev root” - это запустит не виртуализованный дебиан просто. Но большого смысла в том, чтобы запускать это в контейнере, нет.

Хорошо, чтобы не описывать это все словами, приведите, пожалуйста полную последовательность команд для сборки образа на последние версии контроллера с добавленной в образ утилитой netcat, например. Считаем, что репозиторий склонирован, мы в его корне. Хочется иметь возможность ее повторить. Сейчас в вики только пятая версия с которой поменялось слишком много, включая имена файлов

Итак, инструкция в вики:
https://wirenboard.com/wiki/Сборка_образов_прошивки#.D0.A1.D0.B1.D0.BE.D1.80.D0.BA.D0.B0_.D0.BE.D0.B1.D1.80.D0.B0.D0.B7.D0.B0_.D0.B4.D0.BB.D1.8F_.D0.B7.D0.B0.D0.B3.D1.80.D1.83.D0.B7.D0.BA.D0.B8_.D0.BD.D0.B0_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80
Надо переписать, да.

git clone https://github.com/wirenboard/wirenboard
cd wirenboard

Выкачан свежий wbdev у меня он лежит в ~/wirenboard/wbdev

Есть два способа собрать образ.

Первый: Внутри образа
Запускаем, без параметров первый раз, пусть качает:

./wbdev

Пользователь на хост-системе sysadmin, поменяйте под своего.
Установим цель и поправим права

export WBDEV_TARGET=stretch-armhf
~/wirenboard/wbdev root bash -c "chown -R sysadmin:sysadmin ."

Запускаем для “чистого” образа, если нужен БЕЗ модификаций:

WBDEV_TARGET=stretch-armhf ./wbdev root bash -c "apt-get update; \
  apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils; \
  ls /rootfs; \
  rm -rf /rootfs/$WBDEV_TARGET; \
  ls /rootfs; \
  mount -t devtmpfs none /dev; \
  rm -rf ./output/rootfs_wb6x; \
  bash -x ./rootfs/create_rootfs.sh 6x;  \
  ./image/create_images.sh 6x"

Но нам надо добавить какой-нибудь пакет, поэтому делаем следующее:
Запускаем контейнер

WBDEV_TARGET=stretch-armhf ./wbdev root

Дожидаемся приглашения, и запускаем chroot в нужную архитектуру.

/rootfs/stretch-armhf/chroot_this.sh

Устанавливаем (настраиваем) нужное, например lsof:

apt update && apt install -y lsof
exit

Создаем образ:

apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils
mount -t devtmpfs none /dev
cd /home/sysadmin/wirenboard
ROOTFS=/rootfs/stretch-armhf ./image/create_images.sh 6x
exit

Готово, смотрим в папке ./output

Второй: то же самое, не без контейнера. Описывать?

Ну, естественно, описывать. И хотелось бы знать, чем один способ лучше другого.

А что касается предложенного описания…
Попытка дать себе права заканчивается сообщением chown: missing operand. Хотя, нормальный chown, под судо работает, если без контейнера.

Попытка собрать образ без изменений приводит к

++ cat /home/wirenboard/image/output/rootfs_wb6x/etc/wb-fw-version
cat: /home/wirenboard/image/output/rootfs_wb6x/etc/wb-fw-version: Нет такого файла или каталога
+ VERSION=
+ echo 'Unable to get firmware version'
Unable to get firmware version
+ exit 4

Понятное дело, дальше и не полез

Скопируйте сюда из консоли то что вы вводите… Ну и ответ тоже. Ну из сообщения ж ясно что не передан параметр.

~/projects/wirenboard/image(master)$ WBDEV_TARGET=stretch-armhf ./wbdev root bash -c "chown -R damakarov:damakarov ."
chown: missing operand
Try 'chown --help' for more information.

Я же написал, что без контейнера тот же chown отрабатывает

Может быть оно?
В контейнере chown не получает списка файлов
Надо в контейнере перенаправить вывод chown (ну или bash -c “ls -la .” вместо chown ) в файл или на экран и посмотреть что он там выдает и сравнить с выводом без контейнера

Я с контейнерами не имею опыта
но bash -c помню при различных кавычках может вместо переноса выдавать строку

Взял чистую виртуалку.
Воспроизвожу.

sysadmin@docker01:~$ git clone https://github.com/wirenboard/wirenboard
Cloning into 'wirenboard'...
remote: Enumerating objects: 160, done.
remote: Counting objects: 100% (160/160), done.
remote: Compressing objects: 100% (111/111), done.
remote: Total 6662 (delta 103), reused 89 (delta 49), pack-reused 6502
Receiving objects: 100% (6662/6662), 84.30 MiB | 3.13 MiB/s, done.
Resolving deltas: 100% (3915/3915), done.
sysadmin@docker01:~$ cd wirenboard
sysadmin@docker01:~/wirenboard$ ./wbdev
Unable to find image 'contactless/devenv:latest' locally
latest: Pulling from contactless/devenv
06b22ddb1913: Pulling fs layer
b4e076793166: Pulling fs layer
815d14f6a7aa: Pulling fs layer
#Вырезано как неважное#
e81427e38336: Pull complete
7dc33108bcd0: Pull complete
Digest: sha256:7626c40ef67810466fcb4f8b9e3e452b7f8d899bce720d78cd25c46ecebe3f35
Status: Downloaded newer image for contactless/devenv:latest
Warning: WBDEV_TARGET is not set or not supported, will use no-armel
/sbin/entrypoint.sh: line 66: /rootfs/no-armel/.devdir: No such file or directory

Так, воспроизвести получилось, но пришлось виртуалку сильно в ресурсах порезать.
Написал в чат.

Так: Пробуем проще

Выкачиваем и переходим в подпапку:

git clone https://github.com/wirenboard/wirenboard
cd wirenboard

Формируем файлик:

cat << EOFcommand > tmp.sh
#!/bin/bash
apt-get update
apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils
ls /rootfs
rm -rf /rootfs/$WBDEV_TARGET
ls /rootfs
mount -t devtmpfs none /dev
rm -rf ./output/rootfs_wb6x
bash -x ./rootfs/create_rootfs.sh 6x
./image/create_images.sh 6x
rm tmp.sh
EOFcommand
chmod a+x tmp.sh

Запускаем:

WBDEV_TARGET=stretch-armhf ./wbdev root ./tmp.sh

После выполнения

....cut...
 Hash algo:    sha1
  Hash value:   27d2fc2ee410e4df82abd68f62b747c2d8ae543b
+ echo -en '\n__WB_UPDATE_FIT_END__'
+ which fit-aligner
+ info 'Warning: fit-aligner is not present, image is unaligned!'
+ echo '>>> Warning: fit-aligner is not present, image is unaligned!'
>>> Warning: fit-aligner is not present, image is unaligned!
+ mv /tmp/tmp.IN4bWARlgR/unaligned.fit /home/sysadmin/wbdev/go/src/github.com/contactless/wirenboard/output/images/202011121233/202011121233_webupd_wb6x.fit
+ cleanup
+ rm -rf /tmp/tmp.IN4bWARlgR
+ echo Done
Done
+ echo /home/sysadmin/wbdev/go/src/github.com/contactless/wirenboard/output/images/202011121233
/home/sysadmin/wbdev/go/src/github.com/contactless/wirenboard/output/images/202011121233

Да, на хост-системе должен обязательно быть

qemu-user-static

Удачно собралось и на контрллер залилось:

Received good update FIT /var/www/uploads/0000000001, starting update
===============================================================================
Thu Nov 26 17:13:55 UTC 2020: started update from /mnt/data/uploads/0000000001
===============================================================================
Description:         WirenBoard firmware update
Compatible device:   contactless,imx6ul-wirenboard61
Firmware version:    202011261546
Firmware compatible: unknown
Time of creation:    Thu Nov 26 16:32:04 UTC 2020
===============================================================================

>>> Checking SHA1 hash of install
>>> SHA1 hash of install ok
>>> Extracting install script
>>> Running install script
>>> Checking SHA1 hash of rootfs
>>> SHA1 hash of rootfs ok
>>> Installing firmware update
>>> Getting mmcpart from U-Boot environment
>>> Will install to /dev/mmcblk0p3
>>> Mounting /dev/mmcblk0p3 at /dev/shm/rootfs
>>> Cleaning up /dev/mmcblk0p3
>>> Can't find rsync, cleaning up using rm -rf (may be slower)
>>> Extracting files to new rootfs
/dev/shm/rootfs /
/
>>> Recovering device certificates
mount: /dev/loop0 is write-protected, mounting read-only
>>> Unmounting new rootfs
>>> Switching to new rootfs
>>> Done, removing firmware image and rebooting
>>> Removing FIT /mnt/data/uploads/0000000001

Сделаю PR - и можно будет пользоваться.

Думаю сегодня будет готово.

Обновил вики. Попробуйте собрать.