Вопрос или проблема
Я работаю с встроенным устройством на базе ARM Cortex A9. Версия ядра 4.16.0, сгенерированная с помощью Buildroot 2018.05. Хранение данных осуществляется на MMC с несколькими разделами. U-Boot считывает uImage из одного раздела и запускает ядро. Файловая система включена в образ ядра и загружается при старте в initramfs (конфигурация: 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, сразу после монтирования /
.
Я понял, что при запуске система создает первое пространство в памяти (RAM), а затем извлекает в него образ cpio. Затем /
монтируется там, и система запускает первую программу: systemd:/sbin/init
с PID 1. Я правильно понимаю?
Я прочитал много статей и вопросов-ответов, но все еще не понимаю, где мне нужно внести изменения, чтобы выполнить мой оверлей во время загрузки. Какие файлы содержат операцию mount /
?
Эта операция при загрузке находится в initramfs. Вам необходимо добавить скрипт в вашу initramfs/scripts
, вероятно, init-bottom
, чтобы (пере)смонтировать файловые системы по желаемому образцу, а затем сгенерировать новый пакет initramfs.
Скрипт выполняется до вашего файлового init
, в конце процесса init
ядра. Причина путаницы в том, что код настройки нигде на файловой системе не находится, он находится в вашем файле initramfs.
Вам нужно выяснить фактическое местоположение вашего оверлея и ввести его в файл
/etc/fstab
так, как вы бы ввели его в работающей системе.
Одно предостережение: вам нужно добавить файл в файловую систему оверлея Buildroot, чтобы, когда вы будете создавать rootfs, Buildroot включал измененную таблицу файловой системы.
Например, предположим, вы хотите наложить /dev/mmc0p0 на /home, вы бы выполнили следующие шаги, используя MYCOMP и MYBOARD в качестве названий вашей компании и вашей платы:
- создайте структуру файловой системы в отдельной директории, как
указано в главе 9.1 "Рекомендуемая структура директорий" документации Buildroot, предположительно в /tmp/br_ext
- в этой директории вы добавляете board/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab
и заполняете ее следующей информацией:
board/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab:
/dev/mmc0p0 /home ext4 defaults 0 1
Затем вы строите файловую систему в дереве Buildroot с помощью:
make BR2_EXTERNAL=/tmp/br_ext menuconfig
make
После перезагрузки новая файловая система должна быть на месте.
Ответ или решение
Для корректного монтирования пользовательской overlay-файловой системы во время загрузки на встраиваемом устройстве с архитектурой ARM Cortex A9 и ядром Linux версии 4.16.0, созданным с помощью Buildroot 2018.05, необходимо внести изменения в начальную файловую систему (initramfs). Ваша задача заключается в том, чтобы убедиться, что overlay монтируется перед запуском systemd, то есть сразу после монтирования корневого раздела.
Понимание процесса загрузки
Вы правильно поняли, что во время загрузки система создает начальное пространство в оперативной памяти, затем извлекает образ cpio и монтирует корневую файловую систему, после чего запускается процесс systemd
(с PID 1). Эти операции происходят внутри initramfs, который содержит скрипты для выполнения необходимых задач перед тем, как система загрузится в госупругую среду.
Шаги по добавлению overlay-файловой системой в initramfs
-
Создание скрипта для монтирования overlay:
Вам потребуется создать скрипт в каталогеinitramfs/scripts/init-bottom
, который будет выполнять монтирование overlay после монтирования корневого файла, но перед запуском systemd. Например, создайте файл с именемmount-overlay.sh
с следующим содержимым:#!/bin/sh # Прежде всего, создайте рабочую директорию для overlay mkdir -p /data/work/etc # Монтируем пользовательский файловый система mount /dev/mmcblk0p1 /data # После этого сами монтируем overlay mount -t overlay overlay -o lowerdir=/etc,upperdir=/data/etc,workdir=/data/work/etc /
Не забудьте сделать скрипт исполняемым:
chmod +x mount-overlay.sh
-
Помещение скрипта в структуру файловой системы Buildroot:
Поместите созданный скрипт в соответствующие директории вашей Buildroot:board/MYCOMP/MYBOARD/rottfs_overlay/etc/initramfs/scripts/init-bottom/mount-overlay.sh
-
Изменение файла
fstab
:
Убедитесь, что файл/etc/fstab
внутри вашей overlay-файловой системы содержит правильные записи. Например:/dev/mmcblk0p1 /data auto defaults 1 2
-
Сборка нового initramfs:
После того как все изменения внесены, соберите новую файловую систему с помощью команд:make BR2_EXTERNAL=/tmp/br_ext menuconfig make
-
Перезагрузка устройства:
После успешной сборки вам необходимо перезагрузить устройство, чтобы изменения вступили в силу. Теперь во время загрузки будет смонтирована ваша пользовательская overlay-файловая система сразу после монтирования корневой файловой системы, что предотвратит применение конфигураций, находящихся в файловой системе ядра.
В заключение
При правильном выполнении всех вышеперечисленных шагов, вы достигнете желаемого результата: overlay-файловая система будет смонтирована до запуска systemd, что обеспечит применение пользовательских конфигураций. Обратите внимание на возможные ошибки при работе со скриптами и проверьте настройки в fstab
, чтобы избежать проблем во время загрузки.