Files
raspberrypi/README.md

144 lines
6.2 KiB
Markdown

Raspberry Pi Scripts
====================
This repository contains my collection of scripts and other snippets for the
[Raspberry Pi](https://www.raspberrypi.org). I am publishing these in case they
are of any benefit to other enthusiasts. Use them freely and please let me know
in case you encounter any issues or require changes.
The latest versions, documentation and bugtracker available on my
[Gitea instance](https://gitea.lindenaar.net/scripts/raspberrypi)
Copyright (c) 2019 - 2025 Frederik Lindenaar. free for distribution under
the GNU General Public License, see [below](#license)
Contents
========
This repository contains the following scripts:
* [gpio_trigger.py](#gpio_trigger)
is s script to execute a command when a GPIO input pin changes
* [rpi_no_hdmi.service](#services)
is a systemd service to disable the Raspberry Pi's HDMI port at boot
* [rpi_no_usb.service](#services)
is a systemd service to disable the Raspberry Pi's USB bus at boot
* [rpi_no_wifi.service](#services)
is a systemd service to disable on-board WiFi on Raspberry Pi at boot
* [rpi_poweroff_button.service](#services)
is a systemd service to support a power-off button using [gpio_trigger.py](#gpio_trigger)
* [rpi-lvm-imager.sh](#rpi-lvm-imager)
initialize an NVME drive with Raspberry Pi OS (Lite) on LVM
<a name=gpio_trigger>gpio_trigger.py</a>
----------------------------------------
This script was initially written to add a power-off button to a Raspberry Pi,
[see this blog post](https://frederik.lindenaar.nl/2019/10/23/raspberry-pi-power-off-button.html)
for the rationale behind it and how to construct and connect a physical button.
The script itself is a generic solution to monitor a GPIO pin and executes a
command when the input signal on a pin changes. It can run as interactively as
well as in the background and executes a command once or continuously upon any
change or specific transition (e.g. HIGH to LOW).
The script is written in Python 2 and uses the `RPi.GPIO` library as both are
installed by default on most distributions so should just work. Please note that
by default the script should be started as root to gain access to the GPIO port.
To implement a simple power-off button, install the script in `/usr/local/sbin`,
connect an NC switch (i.e. one that connects when pressed) between pin 39 (GND)
and pin 40 of the Raspberry Pi and add:
~~~
if [ -x /usr/local/sbin/gpio_trigger.py ]; then
/usr/local/sbin/gpio_trigger.py -D -H 5000 poweroff
fi
~~~
to the file `/etc/rc.local`. This will start the script in the background (`-D`)
to wait for pin 40 (default pin) to be connected to ground for 5000ms (`-H`) and
then run the command `poweroff` to shutdown the Raspberry Pi.
Please refer to the output of `gpio_trigger.py -h` for the options supported and
defaults used when no option is specified.
<a name=services>Systemd services</a>
-------------------------------------
The repository contains a number of `.service` files, which are systemd service
descriptions to control specific on-board features of the Raspberry Pi (e.g. to
disable unused ports). Their purpose should be pretty clear from their name (and
comments they contain). The rationale of the initial scripts is covered in this
[blog post](https://frederik.lindenaar.nl/2018/05/11/raspberry-pi-power-saving-disable-hdmi-port-and-others-the-systemd-way.html).
In general, to install these copy them to the directory `/etc/systemd/system/`
To manually disable the port, 'start' the 'service' with:
~~~
service <<filename without .service>> start
~~~
To manually enable the port again, 'stop' the 'service' with:
~~~
service <<filename without .service>> stop
~~~
To enable starting during system boot (to disable the port) run:
~~~
systemctl enable service <<filename without .service>>
~~~
To disable starting during system boot (to no longer disable the port) run:
~~~
systemctl disable service <<filename without .service>>
~~~
<a name=rpi-lvm-imager>rpi-lvm-imager.sh</a>
--------------------------------------------
This script will wipe and partition a (large) storage device with a small boot
partition, setup LVM for the rest of the disk, and then writes the latest
version of Raspbian Pi OS (Lite) or another OS image availabile via the
Raspberry Pi Imager to LVM managed partition(s) and makes the device bootable.
The reason I worte this script was that the Raspberry Pi Imager can only write
an image to a full disk and does not allow one to partition it nor perform the
installation on an LVM managed disk. This was needed for a Raspberry Pi 5 with
NVME SSD as the device had way more diskspace than would ever be needed/useful
for the system partition.
This script was inspired by the write-up found [here](https://raspberrypi.stackexchange.com/questions/7159/can-the-raspberry-boot-to-an-lvm-root-partition).
That was apparently superseded by [this approach](https://raspberrypi.stackexchange.com/questions/85958/easy-backups-and-snapshots-of-a-running-system-with-lvm),
hoever, I like the initial approach more. This script will write the OS to a
device after setting up LVM but before booting it so it is just quicker than
writing the OS and then moving it to an LVM managed partition.
To write the latest version of Raspberry Pi OS (64bit Lite) to an NVME SSD
device simply run:
~~~
sudo rpi-lvm-imager.sh --lvm-group nvme /dev/nvme0n1
~~~
Please note that this will unmound and wipe the specified device so be careful!
to see all aailable options, run: `./rpi-lvm-imager.sh -h`
<a name="license">License</a>
-----------------------------
These scripts, documentation & configration examples are free software: you can
redistribute and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
This script, documenatation and configuration examples are distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, download it from <http://www.gnu.org/licenses/>.