Какой файл мне нужно изменить, чтобы подключить оверлей пользователя при загрузке системы?

Вопрос или проблема

Я работаю с встроенным устройством на базе 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

  1. Создание скрипта для монтирования 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
  2. Помещение скрипта в структуру файловой системы Buildroot:
    Поместите созданный скрипт в соответствующие директории вашей Buildroot:

    board/MYCOMP/MYBOARD/rottfs_overlay/etc/initramfs/scripts/init-bottom/mount-overlay.sh
  3. Изменение файла fstab:
    Убедитесь, что файл /etc/fstab внутри вашей overlay-файловой системы содержит правильные записи. Например:

    /dev/mmcblk0p1 /data auto defaults 1 2
  4. Сборка нового initramfs:
    После того как все изменения внесены, соберите новую файловую систему с помощью команд:

    make BR2_EXTERNAL=/tmp/br_ext menuconfig
    make
  5. Перезагрузка устройства:
    После успешной сборки вам необходимо перезагрузить устройство, чтобы изменения вступили в силу. Теперь во время загрузки будет смонтирована ваша пользовательская overlay-файловая система сразу после монтирования корневой файловой системы, что предотвратит применение конфигураций, находящихся в файловой системе ядра.

В заключение

При правильном выполнении всех вышеперечисленных шагов, вы достигнете желаемого результата: overlay-файловая система будет смонтирована до запуска systemd, что обеспечит применение пользовательских конфигураций. Обратите внимание на возможные ошибки при работе со скриптами и проверьте настройки в fstab, чтобы избежать проблем во время загрузки.

Оцените материал
Добавить комментарий

Капча загружается...