Ports/aarch64/RaspberryPi4bootEEPROM
![]() |
Данная страница находится в разработке. Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной. |
Содержание
Обновление и конфигурирование загрузчика Raspberry Pi 4 [ править ]
На Raspberry Pi 4 установлена флеш-память объёмом 512 кб, подключенная по интерфейсу SPI. Записанное в неё ПО используется при загрузке системы и заменяет собой файл bootcode.bin, который находился на загрузочном разделе SD карты предыдущих моделей Raspberry Pi. Это ПО позволяет загружать Raspberry Pi 4 не только с SD карты, но и с USB флешки и по сети. Периодически выпускаются новые версии загрузчика Raspberry Pi 4 и требуется его обновление.
Кроме ПО для загрузки в той же флеш-памяти записаны параметры конфигурации, управляющие режимом загрузки системы. В частности, изменяя эти параметры можно менять последовательность поиска загрузочного устройства, например, сначала SD затем USB, или сначала SD затем сеть.
Как обновление ПО загрузчика так и изменение параметров загрузки требуют перепрошивки встроенной флеш-памяти.
В случае сбоя перепрошивки RPi4 может перестать загружаться.
Для восстановления загрузчика после сбоя можно использовать программу Raspberry Pi Imager. Подробности ниже.
Также на Raspberry Pi 4 установлена микросхема USB контроллера VL805, прошивка которой может быть обновлена.
Обновление или восстановление загрузчика с помощью Raspberry Pi Imager [ править ]
Программа Raspberry Pi Imager существует под популярные ОС и архитектуры. Она позволяет просто и удобно выбрать и записать на флешку образ ОС для RPi, а также создать специальную загрузочную SD карту для перепрошивки встроенной флеш-памяти RPi4.
Пользователи Альт могут установить пакет rpi-imager из репозитория Альт. Пользователи Ubuntu, Windows и macOS могут загрузить программу по ссылке: https://www.raspberrypi.org/software/
- Понадобиться SD карта. Внимание! Всё содержимое SD карты будет перезаписано.
- Установите и запустите Raspberry Pi Imager.
- Нажмите «CHOOSE OS» и выберите «Misc utility images», затем «Bootloader».
- Выберите режим загрузки: «SD» (рекомендуется), «USB» или «Network».
- Подключите SD карту.
- Нажмите «CHOOSE STORAGE» и выберите SD карту.
- Нажмите «WRITE»
- Вставьте записанную SD карту в RPi4, загрузитесь с неё и подождите не менее 10 сек.
- Зеленый светодиод будет непрерывно мигать, а дисплей HDMI станет зеленым в случае успешной перепрошивки.
- Отключите питание RPi4 и выньте SD карту.
Обновление загрузчика с помощью скрипта rpi-eeprom-update [ править ]
Можно обновить загрузчик RPi4 из ОС Альт без использования дополнительного компьютера и SD карты. Для этого установите пакет rpi-eeprom. Вместе с ним должны быть установлены пакеты firmware-bootloader-rpi4, содержащий прошивку, и rpi-vcgencmd, содержащий утилиту vcgencmd.
Если пакет rpi-eeprom уже был установлен, то обновите его перед обновлением загрузчика.
Все указанные ниже команды следует подавать от root.
Для проверки наличия обновлений подайте команду
Для планирования обновления при следующей перезагрузке подайте команду
По этой команде на загрузочном разделе будут созданы файлы, нужные для обновления, и при следующей перезагрузке RPi4 обновление будет выполнено.
Для отмены запланированного обновления подайте команду
По этой команде файлы для обновления будут удалены.
Изменение параметров конфигурации загрузчика с помощью скрипта rpi-eeprom-config [ править ]
Описание всех параметров параметров конфигурации загрузчика можно посмотреть по ссылке:
В частности, последовательность поиска загрузочного усиройства задаётся в параметре BOOT_ORDER:
Значение BOOT_ORDER | Описание |
---|---|
0xf41 | Сначала SD, затем USB флешка, затем повторить сначала (значение по умолчанию, если BOOT_ORDER не задан) |
0xf14 | Сначала USB флешка, затем SD, затем повторить сначала |
0xf21 | Сначала SD, затем сеть, затем повторить сначала |
Возможны и другие варианты загрузки.
Посмотреть установленные в данный момент параметры загрузки можно командой
Результат выполнения этой команды можно записать в файл для редактирования, например, boot.conf, внести в этот файл требуемые изменения и применить их командой
Можно обойтись без промежуточного файла. Для этого установить переменную окружения EDITOR, например так:
затем подать команду
Будет автоматически создан временный файл boot.conf и открыт в заданном редакторе. После записи файла и выхода из редактора изменения будут применены.
Следует понимать, что скрипт rpi-eeprom-config не выполняет перепрошивку флеш-памяти. Он формирует временный файл прошивки, содержащий загрузчик и изменённые параметры загрузки и вызывает скрипт rpi-eeprom-update. Этот скрипт, в свою очередь, планирует обновление — формирует файлы на загрузочном разделе, которые выполнят перепрошивку при следующей перезагрузке RPi4.
Маленькие «малинки» в крупном дата-центре
В мае у нас появились новые серверы на базе Raspberry Pi 4. И ребята из Selectel Community (это такой неформальный телеграм-чат компании) часто спрашивали, как нам вообще удалось интегрировать их в систему автоматической сдачи. Спустя время мы окинули сделанное ретроспективным взором и готовы подробно ответить на этот вопрос.
Тема использования «малинок» в промышленных масштабах не нова — в сети можно найти множество публикаций на тему сборки вычислительных кластеров. Вначале они представляли собой самодельные фермы, где самым интересным была возможность добавить побольше плат или приспособить водяную систему охлаждения. Но с ростом интереса начали появляться уже готовые кронштейны для монтирования «малинок» в стандартную 19” стойку. Даже были попытки создать blade-варианты.
Но, несмотря на весь оптимизм в медиасфере, вопрос, удастся ли вообще интегрировать «малинки» в дата-центры Selectel, оставался открытым.
Общие требования к размещению в дата-центре
Чтобы понять, что же могло помешать, рассмотрим основные отличия «малинок» от «стандартных» серверов. Под «стандартными» подразумеваются серверы линейки Chipcore на базе десктопного железа.
Чтобы разместить сервер в дата-центре, он должен удовлетворять следующим требованиям:
- Поддержка сетевых интерфейсов. Самое очевидное требование. Сервер должен быть доступен клиенту по «белому» IP-адресу. Обеспечивается Gigabit Ethernet портом.
- Размещение в стойке. На время тестов мы использовали распечатанные на 3D-принтере салазки. На 1 монтажный юнит приходится 12 «малинок».
- Удаленное управление питанием. По умолчанию питание происходит через предназначенный для этого порт USB Type-C, что дает только ручное управление.
Но через 40-пиновый разъем можно подключить модуль PoE HAT. В таком случае управлять питанием удаленно можно через коммутатор, включая или отключая питание на порту. - Независимость от локальных дисковых устройств. Аренда выделенных серверов предполагает полный доступ клиента к железу. Более того, диски могут быть заменены по требованию. В этом случае они должны быть полностью очищены и не содержать дополнительных данных, а развертывание сервера не должно на них опираться.
- Загрузка по сети (PXE). Самый непонятный и вызывающий вопросы пункт. Мы знали, что «малинки» поддерживают загрузку по PXE, но, как в действительности это работает, оставалось неизвестным.
На последнем пункте остановимся подробнее. Нужно учитывать, что Raspberry Pi относится к железу для встраиваемых систем. А на них процесс инициализации и загрузки системы заметно отличается от привычного.
Процесс загрузки «обычного» сервера
Для сравнения, вкратце рассмотрим, как происходит загрузка на «обычном» сервере.
- BIOS/UEFI. Система стартует с BIOS/UEFI, который инициализирует железо и передает управление первому устройству в списке загрузки. По умолчанию это первый диск в системе, но для загрузки по PXE первым выбирается нужный сетевой интерфейс. Важно, что BIOS/UEFI дает нам интерфейс для изменения этого списка и может его сохранять.
- NIC. После того, как сетевой интерфейс получил управление, он посылает в сеть широковещательный запрос DHCP, получает в ответе настройки TFTP (tftp-server-name и boot-file-name) и по ним загружает файл, которому передается управление.
- iPXE. В нашем случае мы возвращаем кастомизированный iPXE-загрузчик, который через параметр chain запрашивает iPXE-скрипт и получает сценарий загрузки сервера.
- Автоустановка / автозагрузка. В зависимости от выбора дистрибутива на базе шаблона генерируется уникальный сценарий (прежде всего данные подключения) автоустановки для конкретного сервера. После завершения автоустановки сценарий загрузки меняется, и iPXE в следующий раз получит другой шаблон загрузки. Загрузка через сетевой интерфейс позволяет нам гибко управлять загрузкой сервера, меняя только ответ сервера, с которого iPXE ожидает ответ.
Процесс загрузки «малинки»
Подробно процесс загрузки для Raspberry Pi 4 описан в официальной документации. Здесь же ограничимся деталями, важными в контексте сравнения.
- EEPROM. Старт «малинки» начинается с запуска прошивки из энергонезависимой микросхемы EEPROM. В сценарии она по умолчанию ищет файлы на /boot разделе SD-карты, необходимые для инициализации компонентов. В этом смысле ее можно сравнить с BIOS без графического интерфейса. Для изменения настроек и сценария загрузки (BOOT_ORDER) нужно полностью обновить файл загрузчика с применением опций из текстового файла и заново записать его в микросхему.
- Директория загрузки (/boot). По умолчанию загрузчик из EEPROM обращается к первому разделу SD-карты, где располагаются необходимые файлы для дальнейшей загрузки. Прежде всего это файл прошивки (firmware) для GPU, DTB-файлы (описание дерева устройств) и образ ядра kernel.img, из которого загружается операционная система. В установленной и загруженной системе этот раздел монтируется в /boot. Изменение опции BOOT_ORDER по сути меняет только устройство, с которого загрузчик ожидает получить файлы, но не их список.
Да, процесс сильно отличается. И это вызывает много вопросов о его интеграции в существующую схему. Но будем разбираться последовательно.
Обновление EEPROM
Для обновления EEPROM нам нужна предустановленная система с утилитой vcgencmd. Получить ее мы можем, загрузив образ Raspberry Pi OS и раскатав его напрямую на SD-карту.
Возвращаем SD-карту обратно в «малинку» и загружаемся с нее в операционную систему. Для входа по умолчанию используются логин и пароль pi / raspberry.
Здесь можно посмотреть текущие опции прошивки EEPROM:
Генерируем из файла прошивки файл конфигурации:
В файле bootconf.txt необходимо изменить значение BOOT_ORDER для изменения порядка загрузки. Поскольку нас интересует загрузка по сети, сначала указываем загрузку по сети (2), затем — с SD-карты (1), и делать это нужно в цикле (f). Также можно указать максимальное количество попыток загрузки по сети:
После подготовки bootconf.txt нужно применить настройки из него к файлу прошивки:
В конце записываем новый файл прошивки с нужными нам опциями в EEPROM:
Мы в Selectel любим одноплатники, так что собрали для вас еще подборку интересных статей на эту тему:
Загрузка «малинки» в PXE
После перезагрузки мы видим на экране монитора, что сервер начинает грузиться по сети. Одноплатник успешно получает адрес у DHCP-сервера и начинает запрашивать файлы с TFTP-сервера. Ошибка загрузки! Ведь мы еще не подготовили замену /boot директории на TFTP-сервере.
Для этого достаточно скопировать содержимое из директории /boot в установленной Raspberry Pi OS на удаленный TFTP-сервер. Например:
После такой подготовки «малинка» успешно начнет загрузку по сети, получит по TFTP-протоколу запрошенные файлы и загрузится в уже установленную систему.
Остановитесь для оценки происходящего: используя логи TFTP-сервера, внимательно просмотрите список файлов, которые «малинка» запрашивает по сети. Для лучшего понимания будем сверяться с документацией, поясняя только для минимально необходимого набора файлов.
По первой строке можно заметить, что файлы начинают запрашиваться с префиксом, соответствующим серийному номеру платы. Если такая директория отсутствует, все остальные файлы запрашиваются из корня.
start4.elf и fixup4.dat — блоб и линкер, необходимые для инициализации видеоядра, так как GPU инициализируется еще до CPU.
сonfig.txt — файл с пользовательскими параметрами, влияющими на поведение прошивки EEPROM и инициализацию железа. Если проводить аналогию между eeprom и bios, в файле хранятся все настройки, измененные пользователем через графическое меню. Активные значения можно посмотреть через утилиту vcgencmd.
bcm2711-rpi-4-b.dtb — базовый файл, описывающий дерево устройств (device tree binary) на плате. Вообще тема DTB-файлов (и DTBO из папки overlays/) достойна отдельной статьи. В нашем контексте ограничимся, что это дерево впоследствии передается ядру Linux.
kernel8.img и cmdline.txt — ядро Linux, с которого начинается загрузка операционной системы. Через файл cmdline.txt передаются дополнительные параметры ядра.
В нашем случае, когда мы скопировали директорию /boot из установленной ОС, мы скопировали и файл cmdline.txt. Если просмотреть его содержимое, становится понятно почему, загружаясь по сети, мы попадали в установленную на SD-карту операционную систему.
Опция root, которая указывает на корневую файловую систему, ведет на второй раздел SD-карты с ранее установленной Raspberry Pi OS.
Итоги и дальнейшие планы
Мы разобрались, как именно происходит загрузка по сети у Raspberry Pi 4. Осталось придумать, что в описанной схеме заменит загрузчик iPXE, через который мы управляем загрузкой сервера.
Стоп. А так ли нужно искать замену iPXE? Может, каким-то образом загрузить «малинку» сразу в iPXE?
Получилось ли у нас реализовать задуманное, я расскажу в следующей статье. А пока подписывайтесь на наш блог, чтобы не пропустить продолжение.