;tldr добавить свои данные в переменную bootargs
в U-Boot
Прежде всего, да, ваш подход правильный - вам нужно передать два аргумента fsck=force
и fsck.repair=yes
в качестве загрузочных аргументов вашему ядру во время загрузки. Но вы смотрите не в том направлении. Все это связано с загрузкой и ядром Linux, а не с Yocto или bitbake.
Есть несколько способов передать загрузочные аргументы ядру, например
- хардкод в код ядра (вариант грубой силы, вам придется копать исходники :))
- используйте
CONFIG_CMDLINE
конфигурацию ядра (документы говорят, что к ней будут добавлены аргументы загрузчика)
- передавать аргументы через загрузчик (наиболее гибкий и удобный способ)
- передавать аргументы
.dtb
-файлом (Дерево устройств Двоичный файл, больше этого здесь)
- придумать что-нибудь другое, так как ядро Linux — это самодельный швейцарский армейский нож
Использовать CONFIG_CMDLINE
легко - просто добавьте к этой переменной, например
CONFIG_CMDLINE=" loglevel=3 fsck=force fsck.repair=yes"
больше информации о настройке конфигураций ядра в Yocto здесь.
Лучший способ — использовать загрузчик для передачи аргументов вашему ядру. В Yocto вы, скорее всего, используете U-Boot в качестве загрузчика, поэтому переменная среды bootargs
(в среде U-Boot, а НЕ в среде пользователя Linux) имеет вид что вам нужно.
Прежде всего, попробуйте найти файл uEnv.txt. Его можно найти на основном разделе в папке /boot
или на отдельном загрузочном разделе. Этот файл содержит некоторые дополнительные параметры конфигурации для U-Boot. Например, может быть указана консоль по умолчанию для ядра - опция console=...
. Вы можете добавить свои вещи куда-нибудь туда. Скорее всего, будет специальная опция для добавления загрузочных аргументов в ядро. Внутри U-Boot такая опция будет добавлена к bootargs
во время процесса загрузки.
Если вы нашли uEnv.txt на своем устройстве, значит, он должен быть где-то в Yocto. Найдите мета-уровень BSP.
Если для вашего устройства такого файла нет, плохие новости - вам придется копать код U-Boot)) Команда, которая на самом деле устанавливает переменную окружения bootargs
в соответствующее значение, такова:
env set bootargs ${bootargs} fsck=force fsck.repair=yes
U-Boot упакован как один двоичный файл и записан на устройство памяти (SD-карту или что-то еще) с некоторым смещением. Что здесь важно, во время обычного процесса загрузки у вас нет ручного доступа к U-Boot - он просто загружается автоматически, делает какие-то действия и загружает ядро.
Однако вы можете подключиться к консоли отладки вашего устройства по умолчанию (вероятно, с UART) и ввести команду там вручную, но эта последовательность загрузки не будет воспроизводима - при следующей загрузке устройства эта команда не будет применена.
Вот почему вам нужно встроить эту команду именно в исходный код U-Boot - чтобы команда применялась мгновенно, при каждой загрузке.
Внутри источников U-Boot найдите файл конфигурации вашего устройства. Это должен быть файл .h
(заголовок C) с именем вашей платы как частью его имени и переменными BOOTENV_BOOTCOMMAND
и/или BOOTENV
внутри него. Эти переменные определяют скрипт загрузки для U-Boot. То есть последовательность загрузки для конкретного устройства постоянна - во время загрузки не должно быть необходимости в каких-либо ручных действиях. То есть во время каждой загрузки U-Boot делает примерно одно и то же. Именно это и зашито в BOOTENV_BOOTCOMMAND
и/или BOOTENV
в виде длинной C-строки с загрузочным скриптом для U-Boot (прямо как bash-скрипт).
Там вы можете добавить эту команду
env set bootargs ${bootargs} fsck=force fsck.repair=yes
или, может быть, вы найдете само определение bootargs
, например bootargs=...
, так что добавьте свои аргументы прямо здесь.
Также рассмотрите утилиту пользовательского пространства fsck
. Вы можете настроить systemd так, чтобы он запускался при запуске системы, а затем периодически по расписанию. На самом деле это не то, что вы хотели, но, возможно, это также подойдет для вашего случая.
19.01.2021