#!/bin/sh
# extract_defaults_from_raspios_img.sh
# 2025-10-17
# by Gernot Walzl
# This script extracts defaults (config files, list of installed packages)
# from a Raspberry Pi OS image file.
# It must be run as root on a Raspberry Pi.
# https://www.raspberrypi.com/software/operating-systems/
CWD=$(pwd)
IMAGE=$1
BASENAME=$(basename "$IMAGE" .img)
MNT_DIR=${MNT_DIR:-'/mnt/raspbian'}
print_usage () {
echo "Usage: $0 IMAGE"
echo "Example: $0 2025-10-01-raspios-trixie-arm64.img"
}
mount_image () {
losetup -P /dev/loop1 "$IMAGE"
mkdir "$MNT_DIR"
mount /dev/loop1p2 "$MNT_DIR"
mount /dev/loop1p1 "$MNT_DIR/boot/firmware"
}
umount_image () {
umount "$MNT_DIR/boot/firmware"
umount "$MNT_DIR"
rmdir "$MNT_DIR"
losetup -d /dev/loop1
}
extract_config () {
cat "$MNT_DIR/boot/firmware/config.txt" \
> "${CWD}/${BASENAME}_config.txt"
}
extract_packagelists () {
chroot "$MNT_DIR" apt-mark showmanual \
> "${CWD}/${BASENAME}_apt-mark_showmanual.txt"
chroot "$MNT_DIR" apt-mark showauto \
> "${CWD}/${BASENAME}_apt-mark_showauto.txt"
}
extract_etc () {
cd "$MNT_DIR" || return 1
tar cfJ "${CWD}/${BASENAME}_etc.tar.xz" --numeric-owner etc
cd "$CWD"
}
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root."
exit 1
fi
if [ -z "$IMAGE" ]; then
print_usage
exit 1
fi
mount_image
extract_config
extract_packagelists
extract_etc
umount_image