Вопрос или проблема
Я использую 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
.
Основные шаги, которые должны быть выполнены:
-
Компиляция и сборка образа OpenWrt: Убедитесь, что вы корректно собрали OpenWrt с поддержкой NFS и TFTP. Возможно, стоит пересобрать проект, чтобы гарантировать наличие всех необходимых модулей для ядра.
-
Указание пути к ядру в U-Boot: Проблема могла быть вызвана фактом, что
bootm
пытается загрузить образ с неправильного адреса. В вашем случае, адрес 0x9fea0000 мог не соответствовать месту в памяти, где расположено ядро. Вам необходимо загрузить ядро в память, используя командуtftpboot
. -
Подготовка TFTP-сервера: Установите и настройте TFTP-сервер на вашем ПК. Перенесите скомпилированный образ ядра в директорию TFTP-сервера, например
openwrt-ar71xx-generic-*.bin
. -
Загрузка ядра через TFTP: Используйте команду U-Boot
tftpboot
, например:tftpboot 0x81000000 openwrt-ar71xx-generic-squashfs-tftp.bin
Здесь
0x81000000
— адрес в памяти, куда будет загружено ядро. Убедитесь, что выбранный адрес допустим и свободен. -
Запуск ядра: После успешной загрузки ядра, используйте команду
bootm
:bootm 0x81000000
Применение
Теперь обсудим, как применить полученные знания для устранения проблем:
-
Проверка адреса загрузки ядра: Убедитесь, что адрес в команде
bootm
соответствует адресу вtftpboot
. Это ключевой момент, так как ошибка "Bad Magic Number" чаще всего возникает из-за неправильного адреса или неправильного содержимого в этом адресе. -
Изучение структуры файлов: В вашей сборке OpenWrt, файлы в каталоге
bin/ar71xx
могут содержать разные образы для различных конфигураций или устройств. Для вашего устройства может потребоваться конкретный файл, который вы должны выбрать в зависимости от названия устройства. Убедитесь, что используемый вами файл поддерживает вашу аппаратную платформу. -
Использование
printenv
в U-Boot: Используйте командуprintenv
, чтобы проверить актуальные переменные окружения, и скорректируйте их, если требуется. Уделите внимание переменным, связанным с сетью, такими какipaddr
,serverip
иbootfile
. -
Настройки сети: Проверьте сетевые подключения и адреса. Ошибки в сетевых параметрах могут также мешать корректной загрузке.
-
Дополнительная настройка ядра и модулей: Возможно, придётся скорректировать конфигурацию ядра, чтобы оно поддерживало NFS. Это может потребовать изменения и пересборки исходных кодов OpenWrt.
Надеемся, что эти шаги помогут вам в решении возникших проблем и успешной загрузке сети с использованием OpenWrt на вашем Arduino Yun.