From 2e5c932f086e669a66f58206db4e454060b60c66 Mon Sep 17 00:00:00 2001 From: pstruebi Date: Thu, 24 Apr 2025 13:52:58 +0200 Subject: [PATCH] add a first custom version for the auracaster os --- .gitignore | 3 - README_AURACAST_SYSTEM.md | 2 + config | 10 ++ flash_sdcard.sh | 204 ++++++++++++++++++++++++++ stage1/00-boot-files/files/config.txt | 14 +- stage2.1_custom/00-install/00-run.sh | 29 ++++ stage2.1_custom/SKIP | 1 + stage3/SKIP | 0 stage4/SKIP | 0 stage4/SKIP_IMAGES | 0 stage5/SKIP | 0 stage5/SKIP_IMAGES | 0 12 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 README_AURACAST_SYSTEM.md create mode 100644 config create mode 100755 flash_sdcard.sh create mode 100644 stage2.1_custom/00-install/00-run.sh create mode 100644 stage2.1_custom/SKIP create mode 100644 stage3/SKIP create mode 100644 stage4/SKIP create mode 100644 stage4/SKIP_IMAGES create mode 100644 stage5/SKIP create mode 100644 stage5/SKIP_IMAGES diff --git a/.gitignore b/.gitignore index f01ee89..4f9dc29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,5 @@ deploy/* work/* -config postrun.sh -SKIP -SKIP_IMAGES .pc *-pc diff --git a/README_AURACAST_SYSTEM.md b/README_AURACAST_SYSTEM.md new file mode 100644 index 0000000..b6a691e --- /dev/null +++ b/README_AURACAST_SYSTEM.md @@ -0,0 +1,2 @@ +# Build +- Always use the docker build script \ No newline at end of file diff --git a/config b/config new file mode 100644 index 0000000..47a5c29 --- /dev/null +++ b/config @@ -0,0 +1,10 @@ +TIMEZONE_DEFAULT='Europe/Vienna' +IMG_NAME='iot-system' +DEPLOY_COMPRESSION=none +ENABLE_SSH=1 +TARGET_HOSTNAME=auracaster +FIRST_USER_NAME=caster +FIRST_USER_PASS=pw + +# Custom stage to run after stage2 +STAGE_LIST="stage0 stage1 stage2 stage2.1_custom" diff --git a/flash_sdcard.sh b/flash_sdcard.sh new file mode 100755 index 0000000..31cc8be --- /dev/null +++ b/flash_sdcard.sh @@ -0,0 +1,204 @@ +#!/bin/bash +# +# Script to flash the Auracaster System image to an SD card +# This script must be run with sudo privileges + +set -e + +# Configuration +IMAGE_FILE="./work/iot-system/export-image/2025-04-23-iot-system-lite.img" +AUTO_YES=false + +# Parse command line arguments +while getopts "y" opt; do + case $opt in + y) + AUTO_YES=true + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + esac +done + +shift $((OPTIND -1)) + +# Require image file argument +if [ $# -lt 1 ]; then + echo "Usage: sudo $0 [-y] " + exit 1 +fi + +IMAGE_FILE="$1" + +# Check if script is run as root +if [ "$(id -u)" -ne 0 ]; then + echo "Error: This script must be run as root (sudo)." + exit 1 +fi + +# Check if image exists +if [ ! -f "$IMAGE_FILE" ]; then + echo "Error: Image file not found at $IMAGE_FILE" + echo "You need to build the project first." + exit 1 +fi + +# Find SD cards (both removable devices and mmcblk devices) +echo "Looking for SD cards..." +echo + +# Get list of potential SD cards (both removable devices and mmcblk devices) +SD_CARDS=$(lsblk -d -o NAME,SIZE,MODEL,VENDOR,TRAN,RM | grep -v "loop" | grep -E '(1$|mmcblk)' | awk '{print $1}') +SD_CARD_COUNT=$(echo "$SD_CARDS" | grep -v "^$" | wc -l) + +if [ "$SD_CARD_COUNT" -eq 0 ]; then + echo "No SD cards found. Please insert an SD card and try again." + exit 1 +fi + +# Display available SD cards +echo "Available SD cards:" +echo +lsblk -d -o NAME,SIZE,MODEL,VENDOR,TRAN,RM | head -n 1 +lsblk -d -o NAME,SIZE,MODEL,VENDOR,TRAN,RM | grep -v "loop" | grep -E '(1$|mmcblk)' +echo + +# Safety check - get list of internal disks to avoid (exclude mmcblk devices from this check) +INTERNAL_DISKS=$(lsblk -d -o NAME,RM | grep -E '0$' | grep -v "mmcblk" | awk '{print $1}') + +# Select SD card +DEVICE="" +if [ "$SD_CARD_COUNT" -eq 1 ]; then + DEVICE=$(echo "$SD_CARDS" | tr -d '[:space:]') + echo "Found single SD card: /dev/$DEVICE" +else + echo "Multiple SD cards found. Please select which one to use:" + select DEVICE in $SD_CARDS; do + if [ -n "$DEVICE" ]; then + break + else + echo "Invalid selection. Please try again." + fi + done +fi + +# Safety check - ensure we're not flashing to an internal disk +if echo "$INTERNAL_DISKS" | grep -q "$DEVICE"; then + echo "ERROR: Selected device /dev/$DEVICE appears to be an internal disk!" + echo "This script will only flash to removable devices or mmcblk devices for safety." + exit 1 +fi + +# Validate device exists +if [[ "$DEVICE" == mmcblk* ]]; then + DEV_PATH="/dev/$DEVICE" +else + DEV_PATH="/dev/$DEVICE" +fi + +if [ ! -b "$DEV_PATH" ]; then + echo "Error: Device $DEV_PATH does not exist or is not a block device." + exit 1 +fi + +# Double-check with clear warning +echo +echo "You are about to erase ALL DATA on $DEV_PATH and write the pi-gen built image ($IMAGE_FILE) to it." +echo "This operation cannot be undone." +echo + +# Check if pv is available for better progress display +if command -v pv >/dev/null 2>&1; then + # Get image size for pv + IMAGE_SIZE=$(stat -c %s "$IMAGE_FILE") + + # Show the command that will be executed with pv + FLASH_COMMAND="pv -s $IMAGE_SIZE \"$IMAGE_FILE\" | dd of=\"$DEV_PATH\" bs=4M conv=fsync oflag=direct" + echo "The following command will be executed (with progress bar):" + echo "$FLASH_COMMAND" +else + # Fallback to dd with status=progress + FLASH_COMMAND="dd if=\"$IMAGE_FILE\" of=\"$DEV_PATH\" bs=4M status=progress conv=fsync oflag=direct" + echo "The following command will be executed:" + echo "$FLASH_COMMAND" + echo "For better progress visualization, consider installing 'pv' (Pipe Viewer)." +fi +echo + +if [ "$AUTO_YES" = true ]; then + CONFIRM="y" + echo "Auto-confirming with -y flag" +else + read -p "Are you ABSOLUTELY SURE you want to continue? (y/n): " CONFIRM + + if [ "$CONFIRM" != "y" ]; then + echo "Operation cancelled." + exit 0 + fi +fi + +# Unmount any partitions on the device, reporting failures +echo "Unmounting any mounted partitions on $DEV_PATH..." +UNMOUNT_FAILED=0 +if [[ "$DEVICE" == mmcblk* ]]; then + for partition in $(lsblk -n -o NAME | grep "^$DEVICE"); do + if [ "$partition" != "$DEVICE" ]; then + if mount | grep -q "/dev/$partition"; then + umount "/dev/$partition" 2>/dev/null || { + echo "Warning: Failed to unmount /dev/$partition" >&2 + UNMOUNT_FAILED=1 + } + fi + fi + done +else + for partition in $(lsblk -n -o NAME /dev/$DEVICE | grep -v "^$DEVICE$"); do + if mount | grep -q "/dev/$partition"; then + umount "/dev/$partition" 2>/dev/null || { + echo "Warning: Failed to unmount /dev/$partition" >&2 + UNMOUNT_FAILED=1 + } + fi + done +fi +if [ $UNMOUNT_FAILED -eq 1 ]; then + echo "Some partitions could not be unmounted. Please close any open files or applications using the SD card and try again." >&2 + exit 1 +fi +# Check for open files on the device +if lsof | grep -q "/dev/$DEVICE"; then + echo "Warning: Open files detected on /dev/$DEVICE. Please close them before flashing to avoid corruption." >&2 + lsof | grep "/dev/$DEVICE" + exit 1 +fi + +# Flash the image +echo "Flashing image to $DEV_PATH..." +echo "This may take several minutes. Please wait..." +echo + +# Execute the flashing command +eval "$FLASH_COMMAND" + +# Sync to ensure all writes are complete +sync + +# Remind user to eject the card safely +echo "Flash complete! SD card is ready with the pi-gen built image." +echo +# Re-read the partition table to ensure the system recognizes the new layout +echo "Running partprobe to re-read the partition table on $DEV_PATH..." +if partprobe "$DEV_PATH"; then + echo "Partition table re-read successfully. The SD card is ready for use." +else + echo "Warning: partprobe failed. If partitions do not show up, try reinserting the SD card." +fi +echo +# Instructions for next steps +echo "1. Insert the SD card into your Raspberry Pi 3" +echo "2. Power on the device" +echo + +exit 0 \ No newline at end of file diff --git a/stage1/00-boot-files/files/config.txt b/stage1/00-boot-files/files/config.txt index fecd26f..1145582 100644 --- a/stage1/00-boot-files/files/config.txt +++ b/stage1/00-boot-files/files/config.txt @@ -14,7 +14,7 @@ dtparam=audio=on # /boot/firmware/overlays/README # Automatically load overlays for detected cameras -camera_auto_detect=1 +camera_auto_detect=0 # Automatically load overlays for detected DSI displays display_auto_detect=1 @@ -49,3 +49,15 @@ otg_mode=1 dtoverlay=dwc2,dr_mode=host [all] + +# uart debug enable on GPIO14/15 +enable_uart=1 +uart_2ndstage=1 +dtparam=uart0_console +dtdebug=1 + +# for auracaster project +dtoverlay=disable-bt +dtoverlay=disable-wifi +dtoverlay=uart1-pi5 +dtoverlay=uart2-pi5 \ No newline at end of file diff --git a/stage2.1_custom/00-install/00-run.sh b/stage2.1_custom/00-install/00-run.sh new file mode 100644 index 0000000..cec24b5 --- /dev/null +++ b/stage2.1_custom/00-install/00-run.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -e + +# Install Docker (official instructions for Raspberry Pi OS) +curl -fsSL https://download.docker.com/linux/raspbian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/raspbian \ + $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null +apt-get update +apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + +docker compose version || true + +# Install Python Poetry (official installer) +curl -sSL https://install.python-poetry.org | python3 - + +# Install WireGuard +apt-get install -y wireguard + +# Disable WiFi (rfkill block and mask wpa_supplicant) +rfkill block wifi || true +systemctl mask wpa_supplicant.service || true +# Optionally, remove wpa_supplicant package +# apt-get remove -y wpa_supplicant + +# Disable Bluetooth service +systemctl mask bluetooth.service || true +systemctl disable hciuart.service || true diff --git a/stage2.1_custom/SKIP b/stage2.1_custom/SKIP new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/stage2.1_custom/SKIP @@ -0,0 +1 @@ + diff --git a/stage3/SKIP b/stage3/SKIP new file mode 100644 index 0000000..e69de29 diff --git a/stage4/SKIP b/stage4/SKIP new file mode 100644 index 0000000..e69de29 diff --git a/stage4/SKIP_IMAGES b/stage4/SKIP_IMAGES new file mode 100644 index 0000000..e69de29 diff --git a/stage5/SKIP b/stage5/SKIP new file mode 100644 index 0000000..e69de29 diff --git a/stage5/SKIP_IMAGES b/stage5/SKIP_IMAGES new file mode 100644 index 0000000..e69de29