Ви МОЖЕТЕ викликати виконання коду, возившись з командним рядком ядра. Найбільш очевидний метод - замінити init чимось іншим. Найпоширенішим застосуванням цього є запуск оболонки дуже рано в процесі завантаження, як правило, тому, що вам потрібно щось виправити або через те, що все інше дуже погано зламано, наприклад:
init=/bin/bash
Майте на увазі, що на даний момент процесу завантаження файлові системи все ще змонтовані лише для читання. Крім того, є ціла купа речей, які просто не працюватимуть правильно. Оскільки у вас немає справжнього запуску init, вимкнення та перезавантаження не працюватимуть. Ви повинні вручну reboot -f
перезавантажити кореневу файлову систему лише для читання та закликати перезавантажити, наприклад.
Я не маю поняття, чи можете ви передавати аргументи, щоб бити таким чином. Я ніколи не пробував. Теоретично, якщо ви можете перейти -c
до bash, ви можете сказати, що цей баш робити будь-що. Але це може обернутися досить довгим аргументом, і я не знаю, чи дозволило б ядро подібні речі.
Друге, що ти можеш зробити. Ви можете скопіювати початкову рамбу (initramfs) у файлову систему та налаштувати завантажувач для її використання config.txt
. Існує кілька способів залучення сценаріїв до initramfs, щоб робити спеціальні речі. Для цього вам доведеться підготувати спеціальну програму initramfs (див. Initramfs-tools (8)), тому я не впевнений, що це краще рішення, ніж зображення на замовлення.
Ви можете включити скрипт в / boot (я сміявся з вашої пропозиції щодо "звичайних" машин, але це був би біт, до якого ви можете отримати доступ з цих машин) і спробувати запустити це, використовуючи рядок init рядок ядра, але файли в dos файлових системах aren виконується, якщо ви не зробите це для всієї файлової системи.
Якби це я, я створив би нестандартне зображення, яке використовує 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 у своїх файлових системах перед створенням зображень. Встановлює кількість монтажу до нуля під час першого завантаження :-)
EDIT : Після багатьох місяців і більше досвіду. Ви хочете подивитися на u-boot. Замініть завантажувач на u-boot. Це можна зробити з "звичайної машини". Після того, як у вас завантажиться u-boot, ви можете або завантажити мережевий дистрибутив, з якого ви зможете легко прошивати sd-карту, або теоретично ви могли би прошивати карту безпосередньо, хоча я не маю уявлення, наскільки це буде важко.
По суті, u-boot приносить завантаження мережі до Raspberry Pi, те, що воно не підтримує самостійно.