Official Raspberry Pi OS Lite minimally modified with the ability to run a script on the first boot.
Supported script filenames:
/boot/firstboot.sh- Just run the script on the first boot/boot/firstboot-script.sh- Same as above, except script is run withscript(1)for complete session recording, that can be later played back usingscriptreplay(1)
Repo is inspired by https://github.com/nmcclain/raspberian-firstboot, but has been automated, Dockerized, and fully scripted.
NOTE: If
firstboot-script.shis used, recording of script run is saved as/boot/firstboot-script-log.out(timing file alongside asfirstboot-script-log.tm)
-
Download latest image
-
Burn it into a MicroSD Card
How?
- Probably the easiest is to use Etcher
- Another way is using
ddon Linux:dd bs=4M if=path/to/downloaded/file.img of=/dev/sdX conv=fsync
- Or MacOS:
dd bs=4M if=path/to/downloaded/file.img of=/dev/diskX conv=fsync
NOTE:
bootpartition will usually get mounted as/Volumes/boot/on MacOS, and probably/mnt/boot/on Linux. -
Mount it
How?
- [MacOS] Simply re-inserting the card should do the trick, if not then
diskutil, orDisk Utilityshould help - [Linux] Hard to say exactly, but sth like:
mkdir -p /mnt/boot/ sudo mount /dev/sdX /mnt/boot/
- [MacOS] Simply re-inserting the card should do the trick, if not then
-
Add your script & mark it as executable
# MacOS example: cd /Volumes/boot/ cat <<EOF > firstboot-script.sh #!/bin/sh -e echo "Hello World!" EOF chmod +x firstboot-script.sh
-
Safely eject, move the card into Raspberry Pi, and power it on
There are 4 possible ways, numbered from easiest to most manual.
The easiest way is going to Releases, and downloading the latest one.
Releases are created automatically upon each new Raspberry Pi OS release, you can see their build log either directly in Actions tab, or by searching for release-pending-approval issues.
Second easiest path is (after cloning this repo) running:
NOTE:
--privilegedflag is required becausemounting a filesystem requires root.NOTE_2: Alternatively
./run-in-docker.shcan be run to achieve the same effect.
If you're on a Linux box, you can (after cloning this repo) run:
./modify-image.sh create images/NOTE:
sudomight be required becausemounting a filesystem requires root.
You can also completely ignore all contents of this repo, download Raspberry Pi OS Lite, and (assuming you have the ability to mount ext4 on your OS):
NOTE: For
firstboot-script.servicesee here.
- Mount second partition
- Install the service, by creating
$MOUNT_PATH/etc/systemd/system/firstboot.servicefile, with the following contents:[Unit] Description=FirstBoot After=network.target Before=rc-local.service ConditionFileNotEmpty=/boot/firstboot.sh [Service] Type=oneshot ExecStart=/boot/firstboot.sh ExecStartPost=/bin/mv /boot/firstboot.sh /boot/firstboot.sh.done RemainAfterExit=no [Install] WantedBy=multi-user.target - Enable the service by running:
cd $MOUNT_PATH/etc/systemd/system/multi-user.target.wants/ && \ ln -s /etc/systemd/system/firstboot.service . # No $MOUNT_PATH(!)
umountthe image- Burn it to a card