Вы МОЖЕТЕ заставить код выполняться, путаясь с командной строкой ядра. Самый очевидный способ - заменить init чем-то другим. Наиболее распространенным применением этого является запуск оболочки в самом начале процесса загрузки, обычно потому, что вам нужно что-то исправить или потому что все остальное очень сильно сломано, например:
init=/bin/bash
Помните, что на этом этапе процесса загрузки файловые системы все еще монтируются только для чтения. Кроме того, есть множество вещей, которые просто не будут работать правильно. Поскольку у вас нет реального запуска init, выключение и перезагрузка не будут работать. Вы должны вручную перемонтировать корневую файловую систему только для чтения и вызвать reboot -f
перезагрузку, например.
Я понятия не имею, можете ли вы передать аргументы bash таким способом. Я никогда не пробовал. Теоретически, если вы можете перейти -c
к bash, вы можете сказать, что процесс bash делает что угодно. Но это может превратиться в довольно длинный аргумент, и я не знаю, допустит ли ядро такие вещи.
Второе, что вы можете сделать. Вы можете скопировать начальные ramfs (initramfs) в файловую систему и настроить загрузчик для его использования в config.txt
. Есть несколько способов получить скрипты в initramfs для выполнения специальных задач. Вы должны будете подготовить специальные initramfs для этой цели (см. Initramfs-tools (8)), поэтому я не уверен, что это лучшее решение, чем пользовательский образ.
Вы можете включить скрипт в / boot (я посмеялся над вашим предложением о «обычных» машинах, но это будет бит, к которому вы можете получить доступ с этих машин) и попытаться запустить его, используя строку инициализации ядра, но файлы в файловых системах dos не отображаются. не исполняемый, если вы не сделаете это для всей файловой системы.
Если бы это был я, я бы сделал собственный образ, который использует dhcp для настройки сети и который содержит собственный скрипт, который запускается при загрузке. Этот скрипт проверяет определенный файл, который действует как флаг. Если файл существует, ничего не делать. Если нет, настройте параметры, а затем создайте файл флага.
Ваш скрипт конфигурации может даже получить реальную вещь с http-сервера. Это означает, что вам не нужно создавать новое изображение, если вам нужно что-то настроить.
Это должно быть наименее стрессовым решением.
Последняя возможность, но вам придется сделать это на «нестандартной» машине :-) Вы можете смонтировать файловую систему ext4 на устройство цикла и скопировать на него файлы, не записывая их сначала в SDCard. Для стандартного Raspbian Jessie-образа это будет примерно так:
sudo losetup /dev/loop0 /tmp/gw.img -o 62914560
sudo mount /dev/loop0 /mnt
sudo cp /my/superduper/script.sh /mnt
sudo umount /dev/loop0
sudo fsck -f /dev/loop0 # This is optional
sudo losetup -d /dev/loop0
Мне нравится делать принудительный fsck на моих файловых системах перед созданием изображений. Устанавливает счетчик монтирования на ноль при первой загрузке :-)
РЕДАКТИРОВАТЬ : после многих месяцев и больше опыта. Вы хотите посмотреть на U-Boot. Замените загрузчик на u-boot. Это можно сделать с «обычной машины». После того, как вы установили u-boot, вы можете либо загрузить сетевой дистрибутив, из которого вы можете легко прошить SD-карту, либо теоретически вы можете напрямую прошить карту, хотя я понятия не имею, насколько это будет сложно.
По сути, u-boot приносит Raspberry Pi сетевую загрузку, которую он не поддерживает самостоятельно.