U-boot: неверное магическое число

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

Я использую Arduino Yun и хочу смонтировать rootfs через NFS.

Я скачал исходники openwrt, собрал проект и затем скопировал сгенерированный rootfs из build_dir/target-mips_34kc_musl-1.1.15/root-ar71xx в /home/user/srv/nfs/root-ar71xx

На командной строке uboot я использовал следующую команду:

setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.1:/home/user/srv/nfs/root-ar71xx ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0::off; bootm

Переменные окружения uboot:

ar7240> printenv
bootcmd=bootm 0x9fea0000
bootdelay=4
baudrate=115200
ethaddr=0xb4:0x21:0x8a:0x00:0x00:0x10
ipaddr=192.168.1.2
serverip=192.168.1.1 
stdin=serial
stdout=serial
stderr=serial
ethact=eth0
bootargs=root=/dev/nfs rw nfsroot=192.168.1.1:/home/user/srv/nfs/root-ar71xx
ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0::off

Environment size: 319/65532 bytes

Но я получил:

## Booting image at 81000000 ...
Bad Magic Number

Я читал в этой ссылке, что существует своего рода инкапсуляция для ядра, чтобы оно было “известно” U-Boot. То же самое для rootfs?

У меня есть другой вопрос, но он не совсем по теме:
После сборки проекта у меня есть несколько бинарных файлов (24) в bin/ar71xx/:

openwrt-ar71xx-generic-wzr-hp-ag300h-squashfs-tftp.bin 
openwrt-ar71xx-generic-tl-mr11u-v1-squashfs-sysupgrade.bin
openwrt-ar71xx-generic-wzr-hp-g300nh2-squashfs-factory.bin
...

Я ожидал только одно изображение ядра, для чего предназначены все эти изображения?

Заранее спасибо.

ИЗМЕНЕНИЕ:

Я изменил командную строку на:

setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.1:/home/bou6/srv/nfs/root-ar71xx ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0::off; bootm 0x9fea0000

и больше не получаю Bad Magic Number, но все еще есть вопросы:

1- Как можно узнать адрес загрузки ядра

2- Я заметил, что даже если Ethernet-кабель не подключен, ядро продолжает использовать файловую систему, прошитую на Yun. Существует ли метод отключения этого.

Недостаточно просто установить bootargs, а затем вызвать bootm … вам нужно загрузить образ ядра откуда-то – так что ответ на вопрос 1: “выберите любой адрес, который вам нравится – пока он находится в RAM и там достаточно места, чтобы в него поместился образ ядра, который вы собираетесь в него загрузить”.

Чтобы загрузить образ ядра, настройте tftp-сервер и используйте команду u-boot tftpboot. Например:

tftpboot <address> openwrt-ar71xx-generic-wzr-hp-ag300h-squashfs-tftp.bin

(Я предполагаю, что это файл, содержащий образ ядра, но, возможно, и нет) – затем вы можете использовать команду bootm например:

bootm <address>

Возможно, вы найдете подсказки здесь.

Кстати, строка команды ядра ip=... имеет такой формат:

ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

так что мне кажется, что должно быть два двоеточия перед off, например:

ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:::off

но я могу ошибаться.

По вопросу 2, я бы ожидал, что загрузка завершится сбоем, и u-boot вернется к приглашению – а не продолжит использовать файловую систему во флеше.

И наконец, вам нужно перечислить все 24 файла из bin/ar71xx, чтобы мы могли определить, какой из них является образом ядра (мой вариант выше кажется неверным).

Ответ или решение

Ошибка "Bad Magic Number" в U-Boot указывает на проблему с загрузкой образа, и это часто связано с тем, что образ, который вы пытались загрузить, повреждён или не соответствует ожидаемому формату. В контексте вашей ситуации с Arduino Yun и OpenWrt, для решения этой проблемы необходимо обратить внимание на несколько ключевых аспектов конфигурации и подготовки окружения, которые мы рассмотрим подробно.

Теория

U-Boot — это загрузчик, который инициализирует железо и подготавливает систему для загрузки ядра. Обычно он работает с образами, имеющими определённую структуру и формат. Когда U-Boot сообщает об "ошибке волшебного числа", это часто указывает на то, что загружаемый образ не содержит правильного заголовка. В контексте OpenWrt для вашего устройства это может быть связано с неправильной упаковкой ядра или корневой файловой системы.

Пример

Рассмотрим вашу конфигурацию и шаги, которые вы предпринимали. Вас интересует, как загрузить ядро и использовать корневую файловую систему через NFS. У вас возникла проблема с параметром bootm.

Основные шаги, которые должны быть выполнены:

  1. Компиляция и сборка образа OpenWrt: Убедитесь, что вы корректно собрали OpenWrt с поддержкой NFS и TFTP. Возможно, стоит пересобрать проект, чтобы гарантировать наличие всех необходимых модулей для ядра.

  2. Указание пути к ядру в U-Boot: Проблема могла быть вызвана фактом, что bootm пытается загрузить образ с неправильного адреса. В вашем случае, адрес 0x9fea0000 мог не соответствовать месту в памяти, где расположено ядро. Вам необходимо загрузить ядро в память, используя команду tftpboot.

  3. Подготовка TFTP-сервера: Установите и настройте TFTP-сервер на вашем ПК. Перенесите скомпилированный образ ядра в директорию TFTP-сервера, например openwrt-ar71xx-generic-*.bin.

  4. Загрузка ядра через TFTP: Используйте команду U-Boot tftpboot, например:

    tftpboot 0x81000000 openwrt-ar71xx-generic-squashfs-tftp.bin

    Здесь 0x81000000 — адрес в памяти, куда будет загружено ядро. Убедитесь, что выбранный адрес допустим и свободен.

  5. Запуск ядра: После успешной загрузки ядра, используйте команду bootm:

    bootm 0x81000000

Применение

Теперь обсудим, как применить полученные знания для устранения проблем:

  1. Проверка адреса загрузки ядра: Убедитесь, что адрес в команде bootm соответствует адресу в tftpboot. Это ключевой момент, так как ошибка "Bad Magic Number" чаще всего возникает из-за неправильного адреса или неправильного содержимого в этом адресе.

  2. Изучение структуры файлов: В вашей сборке OpenWrt, файлы в каталоге bin/ar71xx могут содержать разные образы для различных конфигураций или устройств. Для вашего устройства может потребоваться конкретный файл, который вы должны выбрать в зависимости от названия устройства. Убедитесь, что используемый вами файл поддерживает вашу аппаратную платформу.

  3. Использование printenv в U-Boot: Используйте команду printenv, чтобы проверить актуальные переменные окружения, и скорректируйте их, если требуется. Уделите внимание переменным, связанным с сетью, такими как ipaddr, serverip и bootfile.

  4. Настройки сети: Проверьте сетевые подключения и адреса. Ошибки в сетевых параметрах могут также мешать корректной загрузке.

  5. Дополнительная настройка ядра и модулей: Возможно, придётся скорректировать конфигурацию ядра, чтобы оно поддерживало NFS. Это может потребовать изменения и пересборки исходных кодов OpenWrt.

Надеемся, что эти шаги помогут вам в решении возникших проблем и успешной загрузке сети с использованием OpenWrt на вашем Arduino Yun.

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

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