Nano Hash - криптовалюты, майнинг, программирование

Принудительно FSCK при загрузке в образе yocto

Я хотел бы принудительно проверить файловую систему моего образа bitbake. Если я правильно понимаю, мне нужно добавить fsck=force и fsck.repair=yes к /proc/cmdline. Правилен ли этот подход? Как правильно изменить /proc/cmdline?

РЕДАКТИРОВАТЬ: я запустил oe-pkgdata-util find-path /proc/cmdline, который вышел с ERROR: Unable to find any package producing path /proc/cmdline. Таким образом, я предполагаю, что он генерируется во время компиляции ядра. Это правильно?

18.01.2021

Ответы:


1

;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
  • Большое спасибо за развернутое объяснение! Многому научился на этом! 19.01.2021
  • Конечно! Пожалуйста:) 20.01.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..