MOŻESZ spowodować, że kod zostanie wykonany przez zakłócenie linii poleceń jądra. Najbardziej oczywistą metodą jest zastąpienie init czymś innym. Najczęstszą aplikacją tego jest uruchamianie powłoki na bardzo wczesnym etapie procesu rozruchu, zwykle dlatego, że trzeba coś naprawić lub ponieważ wszystko inne jest bardzo zepsute, np .:
init=/bin/bash
Należy pamiętać, że na tym etapie procesu uruchamiania wszystkie systemy plików są nadal montowane tylko do odczytu. Ponadto istnieje cała masa rzeczy, które po prostu nie będą działać poprawnie. Ponieważ nie masz uruchomionego prawdziwego init, zamknięcie i ponowne uruchomienie nie będzie działać. Musisz ręcznie zamontować główny system plików tylko reboot -f
do odczytu i na przykład uruchomić ponownie komputer.
Nie mam pojęcia, czy potrafisz przekazać argumenty do bashowania w ten sposób. Nigdy nie próbowałem. Teoretycznie, jeśli możesz przejść -c
do bash, możesz powiedzieć, że ten proces bash zrobi cokolwiek. Ale może to przerodzić się w dość długi argument i nie wiem, czy jądro pozwoli na takie rzeczy.
Druga rzecz, którą możesz zrobić. Możesz skopiować początkowy ramfs (initramfs) do systemu plików i skonfigurować bootloader, aby go używał config.txt
. Istnieje kilka sposobów na przeniesienie skryptów do initramfs, aby robić specjalne rzeczy. W tym celu będziesz jednak musiał przygotować specjalne initramfs (zobacz initramfs-tools (8)), więc nie jestem pewien, czy jest to lepsze rozwiązanie niż obraz niestandardowy.
Możesz dołączyć skrypt do katalogu / boot (śmiałem się z twoich sugestii na temat „zwykłych” maszyn, ale byłby to kawałek, do którego można uzyskać dostęp z tych maszyn) i spróbować uruchomić go za pomocą linii inicjującej jądro, ale pliki na systemach plików dos nie są nie jest wykonywalny, chyba że zrobisz to dla całego systemu plików.
Gdybym to był ja, stworzyłbym niestandardowy obraz, który używa dhcp do konfiguracji sieci, i który zawiera niestandardowy skrypt uruchamiany podczas uruchamiania. Ten skrypt sprawdza określony plik, który działa jak flaga. Jeśli plik istnieje, nie rób nic. Jeśli nie, skonfiguruj rzeczy, a następnie utwórz plik flagi.
Twój skrypt konfiguracyjny może nawet wyciągnąć prawdziwą rzecz z serwera http. Oznacza to, że nie musisz tworzyć nowego obrazu, jeśli musisz coś ulepszyć.
To powinno być najmniej stresujące rozwiązanie.
Ostatnia możliwość, ale musisz to zrobić na „nietypowej” maszynie :-) Możesz zamontować system plików ext4 na urządzeniu pętlowym i skopiować na niego pliki bez uprzedniego zapisania go na sdcard. W przypadku standardowego obrazu Raspbian Jessie byłoby to mniej więcej tak:
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
Lubię robić wymuszony fsck na moich systemach plików przed tworzeniem obrazów. Ustawia liczbę montowania na zero przy pierwszym uruchomieniu :-)
EDYCJA : Po wielu miesiącach i więcej doświadczeniu. Chcesz spojrzeć na u-boot. Zamień boot-loader na u-boot. Można to zrobić z „zwykłej maszyny”. Kiedy już uruchomisz u-boot, możesz albo uruchomić system z sieci, z którego możesz łatwo sflashować kartę SD, albo teoretycznie możesz sflashować kartę bezpośrednio, chociaż nie mam pojęcia, jak trudne byłoby to.
Zasadniczo u-boot zapewnia rozruch sieciowy na Raspberry Pi, czego nie obsługuje samodzielnie.