
Я работаю над встраиваемым устройством с arm cortex A9. Версия ядра — 4.16.0, оно сгенерировано buildroot 2018.05. Память для хранения — mmc с несколькими разделами. U-boot считывает uImage в одном разделе и запускает ядро. Файловая система включена в образ ядра и загружается при запуске в initramfs (config: BR2_TARGET_ROOTFS_INITRAMFS).
Я хочу использовать overlayfs для использования папки (в mmc) в качестве «пользовательской» файловой системы, смонтированной в /
.
Я уже пытался успешно создать наложение /etc
с именем каталога, /data/etc
добавив эти строки в файл /etc/fstab
:
/dev/mmcblk0p1 /data auto defaults 1 2
overlay /etc overlay x-systemd.requires=/data,lowerdir=/etc,upperdir=/data/etc,workdir=/data/work/etc 0 0
Это работает, но оверлей монтируется после того, как systemd уже запустил свои службы. Так что, например, сетевая конфигурация — это та, что в uImage, а не та, что в моей user
файловой системе. Я бы хотел смонтировать оверлей до запуска systemd, сразу после того, как /
он смонтирован.
Я понял, что при запуске система создает первое пространство памяти в оперативной памяти, а затем извлекает в него образ cpio. Затем /
монтируется туда, и система запускает первую программу: systemd:/sbin/init
с PID 1. Правильно ли я понимаю?
Я прочитал много статей и веб-сайтов вопросов и ответов, но я все еще не понимаю, где мне нужно внести изменения, чтобы выполнить мой оверлей во время загрузки. Какие файлы содержат операцию mount /
?
решение1
Эта операция загрузки находится в initramfs. Вам нужно добавить скрипт в ваш initramfs/scripts
, вероятно, init-bottom
для (пере)монтирования файловых систем по желанию, затем сгенерировать новый пакет initramfs.
Скрипт выполняется до вашей файловой системы init
, в конце init
процесса ядра. Причина, по которой это сбивает с толку, заключается в том, что код для настройки не находится непосредственно в файловой системе, он находится в вашем файле initramfs.
решение2
Вам необходимо выяснить фактическое местоположение вашего наложения и ввести его в файл.
/etc/fstab
таким же образом, как вы бы ввели его в работающую систему.
Одно предостережение: вам необходимо добавить файл в buildroot overlay-filesystem, чтобы при построении rootfs buildroot включал измененную filesystem-table.
В качестве примера предположим, что вы хотите наложить/dev/mmc0p0над/дом, вам следует выполнить следующие шаги, используя MYCOMP и MYBOARD в качестве названия вашей компании и вашей доски объявлений:
- create a filesystem structure in a seperate directory, as
specified in the buildroot manual chapter 9.1 "Recommended
directory structure", presumably under /tmp/br_ext
- in this directory you add board/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab
and fill it with this information:
board/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab:
/dev/mmc0p0 /home ext4 defaults 0 1
Затем вы создаете файловую систему в дереве buildroot с помощью:
make BR2_EXTERNAL=/tmp/br_ext menuconfig
make
После перезагрузки новой файловой системы оверлей должен быть на месте.