Вопрос или проблема
Моя операционная система Linux иногда выдает панику ядра при загрузке.
Для этого я определил переменную в uboot, называемую mybootcount. Она будет увеличиваться каждый раз при загрузке; если значение достигнет 3, система перейдет ко второму разделу. Но после успешной загрузки, когда система переходит в rootfs, мне нужно получить доступ к моей среде в Linux и установить значение mybootcount в 0. Для этого я создал файл /etc/fw_env.config. Я выполнил vi /dev/mmcblk1p1 0x140000 0x20000 и сохранил изменения, но когда я выполняю fw_printenv, получаю ошибку предупреждения: bad crc, используя значение по умолчанию. Однако я не получаю никаких предупреждений во время загрузки uboot.
Мой конфигурационный файл uboot
CONFIG_ENV_IS_IN_FAT=y
CONFIG_ENV_FAT_DEVICE_AND_PART="1"
CONFIG_ENV_SIZE=0X20000
CONFIG_ENV_OFFSET=0X140000
Моя загрузка uboot
U-Boot 2019.04-linux4sam_6.2 (3 окт 2024 – 10:35:02 +0300) MMC: sdio-host@a0000000: 0, sdio-host@b0000000: 1 Загрузка окружения из FAT… OK
printenv
bootargs=console=ttyS0,115200 earlyprintk root=/dev/mmcblk1p2 rw rootwait rootfstype=ext4 panic=3 atmel.pm_modes=standby,ulp1
bootargs2=console=ttyS0,115200 earlyprintk root=/dev/mmcblk1p3 rw rootwait rootfstype=ext4 panic=3 atmel.pm_modes=standby,ulp1
bootcmd=echo bootcounter: ${mybootcount}; run choose_bootargs; setexpr mybootcount ${mybootcount} + 1; saveenv; fatload mmc 1:1 0x21000000 at91-sama5d27_srcgb_mdm.dtb; fatload mmc 1:1 0x22000000 zImage; bootz 0x22000000 – 0x21000000 ;
bootcount=1
bootdelay=3
bootlimit=3
choose_bootargs=if test ${mybootcount} -ge ${bootlimit}; then echo “РЕЗЕРВНЫЙ ROOTFS”; setenv bootargs ${bootargs2}; setexpr mybootcount 0; else echo “ГЛАВНЫЙ ROOTFS”; fi; saveenv;
После ядра
fw_env.config:/dev/mmcblk1p1 0x140000 0x20000
fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
mybootcount=0
Ответ или решение
Для изменения переменной окружения в U-Boot из файловой системы rootfs с помощью fw_setenv
и устранения проблемы с предупреждением о некорректной контрольной сумме (CRC), необходимо убедиться, что конфигурация fw_env.config
и размер переменной окружения правильно указаны.
Шаги решения проблемы:
-
Проверьте конфигурацию
fw_env.config
:Убедитесь, что файл
/etc/fw_env.config
правильно настроен и соответствует конфигурации U-Boot. Например:# Путь к устройству /dev/mmcblk1p1 0x140000 0x20000
Это указывает, что переменные окружения находятся на первом разделе (p1) второго устройства (mmcblk1) с начальным смещением на 0x140000 и размером 0x20000.
-
Убедитесь в правильности CRC:
Ошибка "bad crc using default environment" может указывать на то, что данные в области памяти для переменных окружения неправильно записаны или повреждены. Вы можете попробовать:
- Перезагрузить U-Boot и выполнить команду
saveenv
из командной строки U-Boot, чтобы убедиться, что переменные окружения корректно сохраняются. - Проверьте, совпадают ли значения
CONFIG_ENV_SIZE
иCONFIG_ENV_OFFSET
в конфигурации U-Boot с теми, которые вы указали в файлеfw_env.config
.
- Перезагрузить U-Boot и выполнить команду
-
Проверка целостности файловой системы:
Убедитесь, что раздел файловой системы, где хранятся переменные окружения (в данном случае
/dev/mmcblk1p1
), не поврежден. Вы можете выполнить командуfsck
для проверки целостности файловой системы. -
Использование
fw_setenv
:После того как вы убедились, что конфигурация настроена правильно и данные в области памяти корректны, вы можете использовать команду
fw_setenv
для изменения значения вашей переменной:fw_setenv mybootcount 0
Это установит значение
mybootcount
в 0 после успешной загрузки системы. -
Мониторинг логов:
Если у вас продолжаются проблемы с загрузкой и возникновением ошибок, рекомендуется следить за логами системы и U-Boot. Убедитесь, что команда
fw_printenv
правильно отображает ваши переменные окружения, и перепроверьте вывод, если снова получите предупреждение о CRC.
Заключение:
Следуя вышеизложенным шагам, вы сможете диагностировать и исправить проблемы с переменными окружения U-Boot и их корректной настройкой из файловой системы rootfs с помощью fw_setenv
. Если проблемы сохраняются, возможно, вам следует пересмотреть конфигурацию U-Boot или обратиться к документации по вашему конкретному оборудованию для получения дополнительного решения.