Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a43a05f61 | |||
| eb7cb9ac5b | |||
| 95f56a7bf5 | |||
| 12c5b066fc | |||
| 8086f9e95f | |||
| d49f6dc165 | |||
| ff5e561df3 | |||
| e5283bd57a | |||
| 79332b36e6 | |||
| b703b3e7d9 | |||
| c999eea6a4 | |||
| 4cba035fd0 | |||
| 2e5c932f08 |
@@ -1,8 +1,5 @@
|
||||
deploy/*
|
||||
work/*
|
||||
config
|
||||
postrun.sh
|
||||
SKIP
|
||||
SKIP_IMAGES
|
||||
.pc
|
||||
*-pc
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
# Build
|
||||
- Always use the docker build script
|
||||
- sudo bash build-docker.sh
|
||||
|
||||
# System
|
||||
- Extended stage2 with customizations
|
||||
- this builds a 'lite' version of the system, featuring also basic development tools
|
||||
- deactivate wifi and bluetooth (wifi can be deactivated, bt has bt-disable overlay)
|
||||
- install docker
|
||||
- install poetry
|
||||
- install wireguard
|
||||
|
||||
# Migrate
|
||||
- move to rpi-image-gen in the future: https://github.com/raspberrypi/rpi-image-gen
|
||||
@@ -0,0 +1,9 @@
|
||||
TIMEZONE_DEFAULT='Europe/Vienna'
|
||||
IMG_NAME='iot-system'
|
||||
DEPLOY_COMPRESSION=xz
|
||||
ENABLE_SSH=1
|
||||
TARGET_HOSTNAME=auracaster
|
||||
FIRST_USER_NAME=caster
|
||||
FIRST_USER_PASS=pw
|
||||
|
||||
STAGE_LIST="stage0 stage1 stage2"
|
||||
Executable
+204
@@ -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] <path-to-image-file.img>"
|
||||
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
|
||||
@@ -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=uart3,ctsrts
|
||||
dtoverlay=uart4,ctsrts
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# do some checks first
|
||||
echo "DEBUG: Listing /home"
|
||||
ls -l /home
|
||||
echo "DEBUG: Checking for python3"
|
||||
which python3 || echo "python3 not found"
|
||||
echo "DEBUG: Checking user 'caster'"
|
||||
id caster || echo "user caster not found"
|
||||
|
||||
|
||||
# Add Docker's official GPG key:
|
||||
# apt-get update
|
||||
# apt-get install -y ca-certificates curl
|
||||
# install -m 0755 -d /etc/apt/keyrings
|
||||
# curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
|
||||
# chmod a+r /etc/apt/keyrings/docker.asc
|
||||
|
||||
# # Add the repository to Apt sources:
|
||||
# echo \
|
||||
# "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
|
||||
# bookworm 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
|
||||
|
||||
# # Ensure docker group exists and add main user to it
|
||||
# DOCKER_GROUP=docker
|
||||
# if ! getent group "$DOCKER_GROUP" > /dev/null; then
|
||||
# groupadd "$DOCKER_GROUP"
|
||||
# fi
|
||||
# # Use FIRST_USER_NAME if set, else default to 'pi'
|
||||
# USER_TO_ADD="${FIRST_USER_NAME:-pi}"
|
||||
# usermod -aG "$DOCKER_GROUP" "$USER_TO_ADD" || true
|
||||
# docker compose version
|
||||
|
||||
# Install Python Poetry for caster user (official installer)
|
||||
su - caster -c "curl -sSL https://install.python-poetry.org | python3 -"
|
||||
|
||||
# Add Poetry to PATH for caster user
|
||||
CASTER_BASHRC="/home/caster/.bashrc"
|
||||
if ! grep -q 'export PATH="/home/caster/.local/bin:$PATH"' "$CASTER_BASHRC" 2>/dev/null; then
|
||||
echo 'export PATH="/home/caster/.local/bin:$PATH"' >> "$CASTER_BASHRC"
|
||||
chown caster: "$CASTER_BASHRC"
|
||||
fi
|
||||
/home/caster/.local/bin/poetry config virtualenvs.in-project true
|
||||
|
||||
# setup audio
|
||||
apt install -y ethtool linuxptp pipewire
|
||||
apt remove -y libportaudio2 portaudio19-dev libportaudiocpp0
|
||||
|
||||
apt install -y --no-install-recommends \
|
||||
git build-essential cmake pkg-config \
|
||||
libasound2-dev libpulse-dev
|
||||
|
||||
if [ ! -d portaudio ]; then
|
||||
git clone https://github.com/PortAudio/portaudio.git
|
||||
# use static commit
|
||||
cd portaudio
|
||||
git checkout 9abe5fe7db729280080a0bbc1397a528cd3ce658
|
||||
rm -rf build
|
||||
# TODO: determine which backends to use, maybe only use pipewire
|
||||
cmake -S . -B build -G"Unix Makefiles" \
|
||||
-DBUILD_SHARED_LIBS=ON \
|
||||
-DPA_USE_ALSA=ON \
|
||||
-DPA_USE_PULSEAUDIO=ON \
|
||||
-DPA_USE_JACK=OFF
|
||||
else
|
||||
cd portaudio
|
||||
fi
|
||||
|
||||
cmake --build build -j$(nproc)
|
||||
cmake --install build # installs to /usr/local/lib
|
||||
ldconfig # refresh linker cache
|
||||
cd ..
|
||||
|
||||
# # install openocd
|
||||
apt install git build-essential libtool autoconf texinfo libusb-1.0-0-dev libftdi1-dev libhidapi-dev pkg-config -y
|
||||
apt-get install pkg-config libjim-dev -y
|
||||
if [ ! -d openocd ]; then
|
||||
git clone --recurse-submodules https://github.com/raspberrypi/openocd.git
|
||||
cd openocd
|
||||
git fetch --all
|
||||
git checkout 8b8c9731a514d3e4dd367d4e77826711201b81b3
|
||||
./bootstrap
|
||||
./configure --enable-bcm2835gpio --enable-sysfsgpio
|
||||
else
|
||||
cd openocd
|
||||
fi
|
||||
make
|
||||
make install
|
||||
cd ..
|
||||
|
||||
# Install WireGuard
|
||||
#apt-get install -y wireguard wireguard-tools
|
||||
|
||||
# Disable WiFi
|
||||
# Option 1: Mask wpa_supplicant (prevents WiFi client connections)
|
||||
systemctl mask wpa_supplicant.service || true
|
||||
# Option 2: Remove wpa_supplicant package (removes WiFi client capability)
|
||||
# apt-get remove -y wpa_supplicant
|
||||
# Option 3: (Optional, not always necessary) Block WiFi radio with rfkill
|
||||
apt-get install -y rfkill && rfkill block wifi || true
|
||||
# Note: rfkill is not strictly necessary if you mask/remove wpa_supplicant, but it disables the radio at a lower level.
|
||||
|
||||
# Disable Bluetooth service
|
||||
systemctl mask bluetooth.service || true
|
||||
systemctl disable hciuart.service || true
|
||||
|
||||
touch /root/CUSTOM_STAGE_WORKED
|
||||
Reference in New Issue
Block a user