Compare commits

...

25 Commits

Author SHA1 Message Date
3cba93baa6 permissions
All checks were successful
Build images / Build images (push) Successful in 1h37m22s
2025-08-14 18:04:45 -05:00
4a1ae922b4 compress published images 2025-08-14 18:04:45 -05:00
48414ac32f update default wallpaper, video config uses hdmi2 2025-08-14 18:04:45 -05:00
8cea745c7f avoid parallel uploads 2025-08-14 18:04:45 -05:00
34f00ea0ca Fix publish step url 2025-08-14 18:04:45 -05:00
30b2d9413e Define build action 2025-08-14 18:04:45 -05:00
236bea7ae3 initial showpiece patches 2025-08-14 18:04:45 -05:00
Serge Schneider
05a772481a Merge branch 'master' into arm64 2025-05-28 14:49:11 +01:00
Serge Schneider
26ea1c19ff stage4: remove alacarte and alacarte-specific fixes 2025-05-28 14:47:57 +01:00
Serge Schneider
bf7981f6a4 stage4: remove stage4/03-bookshelf 2025-05-28 14:44:52 +01:00
Serge Schneider
9f8fc6ff6e Merge branch 'master' into arm64 2025-05-13 07:45:46 +01:00
Serge Schneider
e9c2afbdac export-image: Check if bmap file exists before copying 2025-05-13 07:45:25 +01:00
Serge Schneider
6e8dcbfd22 Update release notes 2025-05-13 07:43:36 +01:00
Serge Schneider
5dabc7dc94 Merge branch 'master' into arm64 2025-05-12 12:10:50 +01:00
Serge Schneider
f548f25325 Update release notes 2025-05-12 12:10:31 +01:00
Serge Schneider
49e1078c1b Merge branch 'master' into arm64 2025-05-06 14:20:09 +01:00
Serge Schneider
b9f63ee11b Update release notes 2025-05-06 14:19:42 +01:00
Serge Schneider
551c58880b export-image: Do not compress the bmap file 2025-04-29 10:13:23 +01:00
Serge Schneider
79afc6e5e7 export-image: remove image_ prefix from non-image files 2025-04-28 16:12:23 +01:00
Serge Schneider
bcf2bc1d98 stage4: do not install system-config-printer (replaced with rprinters by ui-mods) 2025-04-28 13:29:12 +01:00
Serge Schneider
ca3d54e7e7 Add TEMP_REPO variable 2025-04-15 14:57:18 +01:00
Serge Schneider
260c17db0e stage2: trim down third party firmware package list 2025-04-15 14:34:44 +01:00
Serge Schneider
04880a5a0f Remove old qemu-arm-static reference 2025-04-15 14:06:18 +01:00
Richard Oliver
2e5d13e1b9 export-image: generate bmap file if bmaptool is available 2025-03-14 14:33:23 +00:00
Jonathan Bell
f621f9e279 Align partition start boundaries to 8M
Higher-capacity cards (particularly Raspberry Pi 128GB A2) have an 8MB
preferred erase size, which is a good indication of the flash block size.

Other large cards may also benefit.

Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
2025-03-13 15:58:40 +00:00
38 changed files with 277 additions and 37 deletions

68
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,68 @@
name: Build images
on:
push:
branches:
- showpiece
tags:
- 'v*'
jobs:
build_images:
name: Build images
runs-on: ubuntu-latest
timeout-minutes: 120
strategy:
fail-fast: true
env:
DEPLOY: startsWith(github.ref, 'refs/tags/v')
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: https://github.com/actions/checkout@v4
- name: Apply patches
run: ./runtime-patches.sh
- name: Install dependencies
run: |
sudo apt-get update &&
sudo apt-get install -y qemu-user-static quilt debootstrap libarchive-tools arch-test binfmt-support
- name: Setup binfmt_misc
run: |
ls /proc/sys/fs/binfmt_misc/ || true
sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc || true
sudo update-binfmts --enable qemu-aarch64
- name: Run build process
run: |
sudo ./build.sh &&
sudo mv deploy/*-arm64-standalone.img deploy/showpieceos-arm64-standalone.img &&
sudo mv deploy/*-arm64-client.img deploy/showpieceos-arm64-client.img
- name: Compress images
if: startsWith(github.ref, 'refs/tags/v')
run: sudo ./compress-images.sh
- name: Publish client
if: startsWith(github.ref, 'refs/tags/v')
uses: https://github.com/softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
files: deploy/*-client.img.gz
- name: Publish standalone
if: startsWith(github.ref, 'refs/tags/v')
uses: https://github.com/softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
files: deploy/*-standalone.img.gz

3
.gitignore vendored
View File

@ -1,8 +1,5 @@
deploy/*
work/*
config
postrun.sh
SKIP
SKIP_IMAGES
.pc
*-pc

View File

@ -22,7 +22,7 @@ To install the required dependencies for `pi-gen` you should run:
```bash
apt-get install coreutils quilt parted qemu-user-static debootstrap zerofree zip \
dosfstools libarchive-tools libcap2-bin grep rsync xz-utils file git curl bc \
gpg pigz xxd arch-test
gpg pigz xxd arch-test bmap-tools
```
The file `depends` contains a list of tools needed. The format of this
@ -80,6 +80,13 @@ The following environment variables are supported:
will not be included in the image, making it safe to use an `apt-cacher` or
similar package for development.
* `TEMP_REPO` (Default: unset)
An additional temporary apt repo to be used during the build process. This
could be useful if you require pre-release software to be included in the
image. The variable should contain sources in [one-line-style format](https://manpages.debian.org/stable/apt/sources.list.5.en.html#ONE-LINE-STYLE_FORMAT).
"RELEASE" will be replaced with the RELEASE variable.
* `BASE_DIR` (Default: location of `build.sh`)
**CAUTION**: Currently, changing this value will probably break build.sh

View File

@ -222,6 +222,7 @@ export PUBKEY_SSH_FIRST_USER
export CLEAN
export APT_PROXY
export TEMP_REPO
export STAGE
export STAGE_DIR

5
compress-images.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
for img in "deploy/"*.img; do
gzip -4 -v -k "$img"
done

22
config Normal file
View File

@ -0,0 +1,22 @@
IMG_NAME="showpieceos-bookworm-arm64"
PI_GEN_RELEASE="Showpiece OS Bookworm"
RELEASE="bookworm"
DEPLOY_COMPRESSION="none"
COMPRESSION_LEVEL=0
LOCALE_DEFAULT="en_US.UTF-8"
TARGET_HOSTNAME="showpiece"
KEYBOARD_KEYMAP="us"
KEYBOARD_LAYOUT="English (US)"
TIMEZONE_DEFAULT="America/Chicago"
FIRST_USER_NAME="pi"
FIRST_USER_PASS="letmein"
DISABLE_FIRST_BOOT_USER_RENAME=1
WPA_COUNTRY=US
ENABLE_SSH=0
STAGE_LIST=""
for d in stage*; do
if [ -d "$d" ] && [ ! -f "$d/SKIP" ]; then
STAGE_LIST+="$d "
fi
done
STAGE_LIST="$(echo "$STAGE_LIST" | xargs)"

View File

@ -1,9 +1,5 @@
#!/bin/bash -e
if [ ! -x "${ROOTFS_DIR}/usr/bin/qemu-arm-static" ]; then
cp /usr/bin/qemu-arm-static "${ROOTFS_DIR}/usr/bin/"
fi
if [ -e "${ROOTFS_DIR}/etc/ld.so.preload" ]; then
mv "${ROOTFS_DIR}/etc/ld.so.preload" "${ROOTFS_DIR}/etc/ld.so.preload.disabled"
fi

View File

@ -1,6 +1,7 @@
#!/bin/bash -e
rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
rm -f "${ROOTFS_DIR}/etc/apt/sources.list.d/00-temp.list"
find "${ROOTFS_DIR}/var/lib/apt/lists/" -type f -delete
on_chroot << EOF
apt-get update

View File

@ -3,6 +3,7 @@
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info"
SBOM_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.sbom"
BMAP_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.bmap"
on_chroot << EOF
update-initramfs -k all -c
@ -100,6 +101,12 @@ zerofree "${ROOT_DEV}"
unmount_image "${IMG_FILE}"
if hash bmaptool 2>/dev/null; then
bmaptool create \
-o "${BMAP_FILE}" \
"${IMG_FILE}"
fi
mkdir -p "${DEPLOY_DIR}"
rm -f "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.*"
@ -126,6 +133,9 @@ none | *)
esac
if [ -f "${SBOM_FILE}" ]; then
xz -c "${SBOM_FILE}" > "$DEPLOY_DIR/image_$(basename "${SBOM_FILE}").xz"
xz -c "${SBOM_FILE}" > "$DEPLOY_DIR/$(basename "${SBOM_FILE}").xz"
fi
if [ -f "${BMAP_FILE}" ]; then
cp "$BMAP_FILE" "$DEPLOY_DIR/"
fi
cp "$INFO_FILE" "$DEPLOY_DIR/"

View File

@ -13,7 +13,7 @@ BOOT_SIZE="$((512 * 1024 * 1024))"
ROOT_SIZE=$(du -x --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot/firmware --block-size=1 | cut -f 1)
# All partition sizes and starts will be aligned to this size
ALIGN="$((4 * 1024 * 1024))"
ALIGN="$((8 * 1024 * 1024))"
# Add this much space to the calculated file size. This allows for
# some overhead (since actual space usage is usually rounded up to the
# filesystem block size) and gives some free space on the resulting

View File

@ -1,5 +1,43 @@
UNRELEASED:
*
2025-05-13:
* Setting touchscreen in Screen Configuration does not delete default associations for greeter
* Bug fix - wizard keyboard setting correctly transferred into desktop
* Chromium updated to 136.0.7103.92
* Raspberry Pi firmware bc7f439c234e19371115e07b57c366df59cc1bc7
* Linux kernel 6.12.25 - 3dd2c2c507c271d411fab2e82a2b3b7e0b6d3f16
2025-05-06:
* New mouse and keyboard settings application, rasputin, to replace lxinput
* New printer application, rpinters, to replace system-config-printer
* Added swaylock screen lock application for labwc - use ctrl-alt-L to lock, or access via new option in Shutdown Options
* Added separate settings for console and desktop autologin to raspi-config and Raspberry Pi Configuration
* New command-line password prompt application, sudopwd, to replace zenity password prompts
* New command-line dialog tool, zenoty, to replace zenity error, information, warning and question dialogs
* labwc updated to version 0.8.1
* wf-panel-pi startup optimised - now starts much faster
* Network manager plugin updated from latest upstream code
* Busy indication (watch cursor) added to first boot wizard
* uBlock Origin Lite now installed by default in Chromium, as it is no longer possible to preinstall uBlock Origin
* Added compatibility with recent kernel to GPU plugin and task manager
* Added more default touchscreen associations
* Added ability to select mouse emulation or multitouch mode for touchscreens in Screen Configuration
* Added ability to set monitor on which squeekboard on-screen keyboard is shown in Raspberry Pi Configuration
* Plugins for lxpanel and wf-panel-pi restructured to build from shared projects for each, to reduce any divergence between them
* Apperance Settings and Raspberry Pi Configuration reviewed - various minor inconsistencies between X and Wayland addressed
* HackSpace removed from Bookshelf application
* Bug fix - correctly position panel menus on secondary monitor under X
* Bug fix - prevent desktop pictures overflowing bounds of monitors
* Bug fix - squeekboard not starting unless a specific monitor had been set for it
* Bug fix - some application icons, including Chromium web apps, were incorrect on the taskbar
* Bug fix - greeter keyboard layout was being reset on updates
* Bug fix - main menu submenus were not scrollable if they didn't fit the screen
* Bug fix - Connect plugin now more accurately detects when Connect is installed and uninstalled
* Bug fix - modified wfpanelctl to work correctly when called via PackageKit
* Various other minor tweaks and updates
* Chromium updated to 135.0.7049.84
* Firefox updated to 138.0
* Raspberry Pi firmware bc7f439c234e19371115e07b57c366df59cc1bc7
* Linux kernel 6.12.25 - 3dd2c2c507c271d411fab2e82a2b3b7e0b6d3f16
2024-10-22:
* labwc compositor now used as the default on all models of Raspberry Pi
* wf-panel-pi now loads plugins dynamically at runtime

6
runtime-patches.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash
# Patches to run before building showpieceos
# Allows for non-destructive deletion of files
rm stage2/EXPORT_IMAGE

View File

@ -12,6 +12,13 @@ else
rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
fi
if [ -n "$TEMP_REPO" ]; then
install -m 644 /dev/null "${ROOTFS_DIR}/etc/apt/sources.list.d/00-temp.list"
echo "$TEMP_REPO" | sed "s/RELEASE/$RELEASE/g" > "${ROOTFS_DIR}/etc/apt/sources.list.d/00-temp.list"
else
rm -f "${ROOTFS_DIR}/etc/apt/sources.list.d/00-temp.list"
fi
cat files/raspberrypi.gpg.key | gpg --dearmor > "${STAGE_WORK_DIR}/raspberrypi-archive-stable.gpg"
install -m 644 "${STAGE_WORK_DIR}/raspberrypi-archive-stable.gpg" "${ROOTFS_DIR}/etc/apt/trusted.gpg.d/"
on_chroot <<- \EOF

View File

@ -1,4 +1,4 @@
wpasupplicant wireless-tools firmware-atheros firmware-brcm80211 firmware-libertas firmware-misc-nonfree firmware-realtek
wpasupplicant wireless-tools firmware-atheros firmware-brcm80211 firmware-libertas firmware-realtek firmware-mediatek firmware-marvell-prestera-
raspberrypi-net-mods
network-manager
net-tools

View File

@ -10,6 +10,8 @@ firefox rpi-firefox-mods
gldriver-test
fonts-droid-fallback
fonts-liberation2
fonts-noto
fonts-noto-color-emoji
obconf
raindrop
libcamera-tools

View File

@ -1,6 +1,8 @@
xserver-xorg xinit
x11-xserver-utils
mousepad
eom
vim
lxde lxtask menu-xdg
zenity xdg-utils
gvfs-backends gvfs-fuse

View File

@ -0,0 +1,6 @@
#!/bin/bash -e
install -d -o 1000 -g 1000 "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/autostart"
install -m 644 files/kiosk.desktop "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/autostart/"
chown -R 1000:1000 "${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.config
mkdir -p "${ROOTFS_DIR}/tmp"

View File

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=Chromium
Exec=chromium-browser --profile-directory="showpiece-browser" --kiosk https://showpiece.sanin.dev/
StartupNotify=false
Terminal=false

View File

@ -6,7 +6,7 @@ debian-reference-en dillo
raspberrypi-net-mods raspberrypi-ui-mods
python3-pip
python3-numpy
alacarte rc-gui sense-hat
rc-gui sense-hat
tree
libgl1-mesa-dri libgles1 libgles2-mesa xcompmgr
geany

View File

@ -1,7 +0,0 @@
#!/bin/bash -e
#Alacarte fixes
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local"
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local/share"
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local/share/applications"
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local/share/desktop-directories"

View File

@ -1,15 +0,0 @@
#!/bin/sh -e
BOOKSHELF_URL="https://magpi.raspberrypi.com/bookshelf.xml"
GUIDE_URL="$(curl -s "$BOOKSHELF_URL" | awk -F '[<>]' "/<TITLE>Raspberry Pi Beginner's Guide .*<\/TITLE>/ {f=1; next} f==1 && /PDF/ {print \$3; exit}")"
OUTPUT="$(basename "$GUIDE_URL" | cut -f1 -d'?')"
if [ ! -f "files/$OUTPUT" ]; then
rm files/*.pdf -f
curl -s "$GUIDE_URL" -o "files/$OUTPUT"
fi
file "files/$OUTPUT" | grep -q "PDF document"
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/Bookshelf"
install -v -o 1000 -g 1000 -m 644 "files/$OUTPUT" "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/Bookshelf/"

View File

@ -1 +0,0 @@
*.pdf

View File

@ -1,2 +1 @@
cups
system-config-printer

View File

@ -0,0 +1,6 @@
#!/bin/bash -e
echo "Setting default wallpaper"
for conf in "${ROOTFS_DIR}/etc/xdg/pcmanfm/LXDE-pi/desktop-items-"*.conf; do
sed -E 's|/usr/share/rpd-wallpaper/.+$|/usr/share/rpd-wallpaper/RPiSystem.png|' -i "$conf"
done

View File

@ -0,0 +1,4 @@
#!/bin/bash -e
echo "Setting custom cmdline"
sed -i 's/$/ video=HDMI-A-2:1920x1080M@60/' "${ROOTFS_DIR}/boot/firmware/cmdline.txt"

View File

@ -1,4 +1,4 @@
IMG_SUFFIX=""
IMG_SUFFIX="-client"
if [ "${USE_QEMU}" = "1" ]; then
export IMG_SUFFIX="${IMG_SUFFIX}-qemu"
fi

0
stage5/SKIP Normal file
View File

View File

@ -0,0 +1,3 @@
apt-transport-https
gnupg2
software-properties-common

View File

@ -0,0 +1,7 @@
#!/bin/bash
#change to "debian" if necessary:
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
echo "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) stable" | \
tee /etc/apt/sources.list.d/docker.list
apt update

View File

@ -0,0 +1,3 @@
docker-ce
docker-compose-plugin
cgroupfs-mount

View File

@ -0,0 +1,5 @@
#!/bin/bash
systemctl enable docker
systemctl start docker
gpasswd -a pi docker
newgrp docker

11
stage9/02-showpiece/01-run.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/bash -e
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/showpiece"
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/showpiece/config"
install -m 644 files/docker-compose.yml "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/showpiece/"
install -m 644 files/config.json5 "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/showpiece/config/"
install -d -o 1000 -g 1000 "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/autostart"
install -m 644 files/kiosk.desktop "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config/autostart/"
chown -R 1000:1000 "${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.config
mkdir -p "${ROOTFS_DIR}/tmp"
echo "$FIRST_USER_NAME" > "${ROOTFS_DIR}/tmp/first_username"

View File

@ -0,0 +1,12 @@
#!/bin/bash
USERNAME=$(cat /tmp/first_username)
COMPOSEFILE="/home/$USERNAME/.config/showpiece/docker-compose.yml"
echo "@reboot docker compose --file '$COMPOSEFILE' up -d && chromium --kiosk 'http://localhost:8080/?w=1080'" >> /tmp/user.crontab
echo "40 3 * * * docker compose --file '$COMPOSEFILE' pull && docker compose --file '$COMPOSEFILE' up -d" >> /tmp/user.crontab
crontab -u "$USERNAME" /tmp/user.crontab
rm /tmp/first_username
rm /tmp/user.crontab

View File

@ -0,0 +1,14 @@
{
// Port for the viewer
"port": 8080,
// Port for the control panel
// (use a different port to restrict access to this interface)
"controlport": 8080,
// (optional) provide weather data to modules that support it
"weather": {
// Provide an OpenWeatherMap API key
// https://openweathermap.org/price
// "key": "not0a0real0key00281f631aef6ad3a1",
// "city": "chicago"
}
}

View File

@ -0,0 +1,10 @@
services:
showpiece:
container_name: showpiece
image: corysanin/showpiece:latest
restart: always
ports:
- 8080:8080
volumes:
- /etc/localtime:/etc/localtime:ro
- ./config:/usr/src/showpiece/config

View File

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=Chromium
Exec=chromium-browser --profile-directory="showpiece-browser" --kiosk http://localhost:8080/?w=1080
StartupNotify=false
Terminal=false

4
stage9/EXPORT_IMAGE Normal file
View File

@ -0,0 +1,4 @@
IMG_SUFFIX="-standalone"
if [ "${USE_QEMU}" = "1" ]; then
export IMG_SUFFIX="${IMG_SUFFIX}-qemu"
fi

5
stage9/prerun.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash -e
if [ ! -d "${ROOTFS_DIR}" ]; then
copy_previous
fi