Запуск сервера Ubuntu на Raspberry Pi 3 B+, и я не могу отключить консоль, подключенную к GPIO UART, для начальной последовательности загрузки. Я могу отключить его в общем исполнении (и сделали это), но при каждом перезапуске он включается для диалога «Нажмите любую клавишу, чтобы остановить автозагрузку».
Плата должна быть размещена в автономном транспортном средстве, сопровождающая доска постоянно телеметрия через интерфейс.Если он запускается первым (это всегда происходит, если только он не был намеренно отложен), то RPi не может загрузиться из-за этого диалога.Помимо неудобства отложенного запуска, существует очевидная опасность того, что RPi не сможет восстановиться в случае отключения питания в середине миссии.
Ubuntu Server 18.04.4.LTS Малиновый Пи 3 Б+ GPIO UART (ttyAMA0)
Чтобы отключить автоматический запуск, я сделал следующее:
Вышеуказанные шаги обеспечили его функциональность только для общего использования. Как предотвратить запуск начальной службы?
В версии 18.04 эта проблема была решена путем полного обхода grub путем добавления этих строк в раздел [ALL]
файла /boot/firmware/config.txt
:
kernel=vmlinuz
initramfs initrd.img followkernel
I дерево устройств также закомментировано в том же файле, но не уверен, что это необходимо.
Перед загрузкой ядра Pi запускает u-boot, который по умолчанию прерывается данными, полученными через UART, даже если впоследствии он отключен для ядра.
Я решил эту проблему для Ubuntu 20.04 на моем Raspberry Pi 4, изменив u-boot так, чтобы он не прослушивал сигнал прерывания.
Вы можете настроить загрузку без задержки и не проверять прерывание, установив для переменной среды bootdelay значение -2. Для этого вы можете либо скомпилировать новый двоичный файл u-boot, либо подключиться к вашему Pi с помощью последовательной консоли (например, с помощью экрана):
$ sudo screen /dev/ttyUSB0 115200
Загрузите Pi и прервите процесс загрузки, нажав и установите для переменной bootdelay значение -2:
U-Boot> setenv bootdelay -2
U-Boot> saveenv
Команда saveenv сохраняет переменную среды, чтобы сделать изменение постоянным.
Дополнительную информацию о переменных среды u-boot можно найти здесь.
Вот видео, в котором пошагово объясняется, как сделать так, чтобы консоль U-boot не прерывала автозагрузку и не отправляла отладочные сообщения по UART. Я знаю, что ответы только на ссылки не одобряются, поэтому вот краткое описание решения:
Установите зависимости
sudo apt install git make gcc gcc-aarch64-linux-gnu
Git клонирует официальный репозиторий u-boot. В качестве альтернативы можно клонировать мой форк репозитория, где у меня уже есть необходимые изменения для тихой автозагрузки — но если вам нужна последняя версия, то вам нужно клонировать официальный репозиторий и вносить изменения самостоятельно.
git clone --depth 1 git://git.denx.de/u-boot.git
cd u-boot
Найдите файлы конфигурации Raspberry Pi — они зависят от модели, rpi_3_defconfig для Raspberry Pi 3, rpi_4_defconfig для Raspberry Pi 4 и так далее.
Добавьте следующие строки в конец файла:
CONFIG_BOOTDELAY=-2
CONFIG_SILENT_CONSOLE=y
CONFIG_SYS_DEVICE_NULLDEV=y
CONFIG_SILENT_CONSOLE_UPDATE_ON_SET=y
CONFIG_SILENT_U_BOOT_ONLY=y
Первая строка убирает задержку загрузки, поэтому автозагрузка не будет прерываться сообщениями, отправляемыми по интерфейсу UART. Следующие четыре строки включают тихую загрузку, поэтому U-boot не будет отправлять никаких сообщений на сам UART, потому что сообщения, в свою очередь, могут запутать ваше устройство. Осталась еще одна мелочь, установить переменную среды тихой загрузки. Измените файл include/configs/rpi.h
#define CONFIG_EXTRA_ENV_SETTINGS \
"dhcpuboot=usb start; dhcp u-boot.uimg; bootm\0" \
"silent=1\0" \
ENV_DEVICE_SETTINGS \
ENV_DFU_SETTINGS \
ENV_MEM_LAYOUT_SETTINGS \
BOOTENV
Теперь настройте с помощью
make rpi_3_defconfig
из основной папки репозитория
И соберите с помощью
make CROSS_COMPILE=aarch64-linux-gnu-
Когда процесс сборки завершится, у вас будет u- ботинок.bin
, который необходимо переименовать и скопировать на SD-карту Raspberry Pi. Теперь вашему Raspberry Pi не будут мешать никакие сообщения по UART во время загрузки. Функциональность UART после загрузки не пострадает.