First Stable OS

This commit is contained in:
2025-03-21 10:25:29 -07:00
parent b9e30f2e0e
commit c66784a6a0
46 changed files with 332 additions and 196 deletions

View File

@@ -108,8 +108,10 @@ run_stage(){
log "End ${STAGE_DIR}/prerun.sh" log "End ${STAGE_DIR}/prerun.sh"
fi fi
for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do
if [ -d "${SUB_STAGE_DIR}" ] && [ ! -f "${SUB_STAGE_DIR}/SKIP" ]; then if [ -d "${SUB_STAGE_DIR}" ]; then
run_sub_stage if [ ! -f "${SUB_STAGE_DIR}/SKIP" ] && [ ! -f "${SUB_STAGE_DIR}/SKIP_${ARCH}" ]; then
run_sub_stage
fi
fi fi
done done
fi fi
@@ -176,8 +178,8 @@ export PI_GEN_REPO=${PI_GEN_REPO:-https://github.com/RPi-Distro/pi-gen}
export PI_GEN_RELEASE=${PI_GEN_RELEASE:-Raspberry Pi reference} export PI_GEN_RELEASE=${PI_GEN_RELEASE:-Raspberry Pi reference}
export ARCH=arm64 export ARCH=arm64
export RELEASE=${RELEASE:-bookworm} # Don't forget to update stage0/prerun.sh export RELEASE=${RELEASE:-bookworm}
export IMG_NAME="${IMG_NAME:-raspios-$RELEASE-$ARCH}" export IMG_NAME="${IMG_NAME:-chillcraftos-$RELEASE-$ARCH}"
export USE_QEMU="${USE_QEMU:-0}" export USE_QEMU="${USE_QEMU:-0}"
export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}" export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}"
@@ -202,7 +204,7 @@ export LOG_FILE="${WORK_DIR}/build.log"
export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi} export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi}
export FIRST_USER_NAME=${FIRST_USER_NAME:-pi} export FIRST_USER_NAME=${FIRST_USER_NAME:-setup}
export FIRST_USER_PASS export FIRST_USER_PASS
export DISABLE_FIRST_BOOT_USER_RENAME=${DISABLE_FIRST_BOOT_USER_RENAME:-0} export DISABLE_FIRST_BOOT_USER_RENAME=${DISABLE_FIRST_BOOT_USER_RENAME:-0}
export WPA_COUNTRY export WPA_COUNTRY
@@ -211,10 +213,10 @@ export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}"
export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_GB.UTF-8}" export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_GB.UTF-8}"
export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-gb}" export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}"
export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (UK)}" export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}"
export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/London}" export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Americas/Los_Angeles}"
export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"} export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}

View File

@@ -3,6 +3,7 @@
rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache" rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
find "${ROOTFS_DIR}/var/lib/apt/lists/" -type f -delete find "${ROOTFS_DIR}/var/lib/apt/lists/" -type f -delete
on_chroot << EOF on_chroot << EOF
apt-file update
apt-get update apt-get update
apt-get -y dist-upgrade --auto-remove --purge apt-get -y dist-upgrade --auto-remove --purge
apt-get clean apt-get clean

73
export-image/mk-img.sh Executable file
View File

@@ -0,0 +1,73 @@
#!/bin/bash -e
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
unmount_image "${IMG_FILE}"
rm -f "${IMG_FILE}"
rm -rf "${ROOTFS_DIR}"
mkdir -p "${ROOTFS_DIR}"
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))"
# 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
# image.
ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)"
BOOT_PART_START=$((ALIGN))
BOOT_PART_SIZE=$(((BOOT_SIZE + ALIGN - 1) / ALIGN * ALIGN))
ROOT_PART_START=$((BOOT_PART_START + BOOT_PART_SIZE))
ROOT_PART_SIZE=$(((ROOT_SIZE + ROOT_MARGIN + ALIGN - 1) / ALIGN * ALIGN))
IMG_SIZE=$((BOOT_PART_START + BOOT_PART_SIZE + ROOT_PART_SIZE))
truncate -s "${IMG_SIZE}" "${IMG_FILE}"
parted --script "${IMG_FILE}" mklabel msdos
parted --script "${IMG_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))"
parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))"
echo "Creating loop device..."
cnt=0
until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$IMG_FILE")"; do
if [ $cnt -lt 5 ]; then
cnt=$((cnt + 1))
echo "Error in losetup. Retrying..."
sleep 5
else
echo "ERROR: losetup failed; exiting"
exit 1
fi
done
ensure_loopdev_partitions "$LOOP_DEV"
BOOT_DEV="${LOOP_DEV}p1"
ROOT_DEV="${LOOP_DEV}p2"
ROOT_FEATURES="^huge_file"
for FEATURE in 64bit; do
if grep -q "$FEATURE" /etc/mke2fs.conf; then
ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES"
fi
done
if [ "$BOOT_SIZE" -lt 134742016 ]; then
FAT_SIZE=16
else
FAT_SIZE=32
fi
mkdosfs -n bootfs -F "$FAT_SIZE" -s 4 -v "$BOOT_DEV" > /dev/null
mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$ROOT_DEV" > /dev/null
mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4
mkdir -p "${ROOTFS_DIR}/boot/firmware"
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot/firmware" -t vfat
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/firmware/" "${ROOTFS_DIR}/boot/firmware/"

92
export-image/mk-iso.sh Executable file
View File

@@ -0,0 +1,92 @@
#!/bin/bash -e
ISO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.iso"
unmount_image "${ISO_FILE}"
rm -f "${ISO_FILE}"
rm -rf "${ROOTFS_DIR}"
mkdir -p "${ROOTFS_DIR}"
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))"
# 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
# image.
ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)"
BOOT_PART_START=$((ALIGN))
BOOT_PART_SIZE=$(((BOOT_SIZE + ALIGN - 1) / ALIGN * ALIGN))
ROOT_PART_START=$((BOOT_PART_START + BOOT_PART_SIZE))
ROOT_PART_SIZE=$(((ROOT_SIZE + ROOT_MARGIN + ALIGN - 1) / ALIGN * ALIGN))
IMG_SIZE=$((BOOT_PART_START + BOOT_PART_SIZE + ROOT_PART_SIZE))
truncate -s "${IMG_SIZE}" "${ISO_FILE}"
parted --script "${ISO_FILE}" mklabel msdos
parted --script "${ISO_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))"
parted --script "${ISO_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))"
echo "Creating loop device..."
cnt=0
until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$ISO_FILE")"; do
if [ $cnt -lt 5 ]; then
cnt=$((cnt + 1))
echo "Error in losetup. Retrying..."
sleep 5
else
echo "ERROR: losetup failed; exiting"
exit 1
fi
done
ensure_loopdev_partitions "$LOOP_DEV"
BOOT_DEV="${LOOP_DEV}p1"
ROOT_DEV="${LOOP_DEV}p2"
ROOT_FEATURES="^huge_file"
for FEATURE in 64bit; do
if grep -q "$FEATURE" /etc/mke2fs.conf; then
ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES"
fi
done
if [ "$BOOT_SIZE" -lt 134742016 ]; then
FAT_SIZE=16
else
FAT_SIZE=32
fi
mkdosfs -n bootfs -F "$FAT_SIZE" -s 4 -v "$BOOT_DEV" > /dev/null
mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$ROOT_DEV" > /dev/null
mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4
mkdir -p "${ROOTFS_DIR}/boot/firmware"
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot/firmware" -t vfat
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/firmware/" "${ROOTFS_DIR}/boot/firmware/"
# Create bootable ISO with GRUB
echo "Creating bootable ISO..."
mkdir -p "${ROOTFS_DIR}/boot/grub"
# Install GRUB bootloader
cat > "${ROOTFS_DIR}/boot/grub/grub.cfg" <<EOF
set default=0
set timeout=5
menuentry "Linux" {
linux /boot/vmlinuz root=/dev/sda2
initrd /boot/initrd.img
}
EOF
grub-mkrescue -o "${ISO_FILE}" "${ROOTFS_DIR}"
echo "Bootable ISO created at ${ISO_FILE}"

View File

@@ -1,73 +1,10 @@
#!/bin/bash -e #!/bin/bash -e
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" # Check if the architecture is arm64 or armhf
if [[ "$ARCH" == "arm64" || "$ARCH" == "armhf" ]]; then
unmount_image "${IMG_FILE}" # If the architecture is arm64 or armhf, run mk-img.sh
./mk-img.sh
rm -f "${IMG_FILE}"
rm -rf "${ROOTFS_DIR}"
mkdir -p "${ROOTFS_DIR}"
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))"
# 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
# image.
ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)"
BOOT_PART_START=$((ALIGN))
BOOT_PART_SIZE=$(((BOOT_SIZE + ALIGN - 1) / ALIGN * ALIGN))
ROOT_PART_START=$((BOOT_PART_START + BOOT_PART_SIZE))
ROOT_PART_SIZE=$(((ROOT_SIZE + ROOT_MARGIN + ALIGN - 1) / ALIGN * ALIGN))
IMG_SIZE=$((BOOT_PART_START + BOOT_PART_SIZE + ROOT_PART_SIZE))
truncate -s "${IMG_SIZE}" "${IMG_FILE}"
parted --script "${IMG_FILE}" mklabel msdos
parted --script "${IMG_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))"
parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))"
echo "Creating loop device..."
cnt=0
until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$IMG_FILE")"; do
if [ $cnt -lt 5 ]; then
cnt=$((cnt + 1))
echo "Error in losetup. Retrying..."
sleep 5
else
echo "ERROR: losetup failed; exiting"
exit 1
fi
done
ensure_loopdev_partitions "$LOOP_DEV"
BOOT_DEV="${LOOP_DEV}p1"
ROOT_DEV="${LOOP_DEV}p2"
ROOT_FEATURES="^huge_file"
for FEATURE in 64bit; do
if grep -q "$FEATURE" /etc/mke2fs.conf; then
ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES"
fi
done
if [ "$BOOT_SIZE" -lt 134742016 ]; then
FAT_SIZE=16
else else
FAT_SIZE=32 # Otherwise, run mk-iso.sh
./mk-iso.sh
fi fi
mkdosfs -n bootfs -F "$FAT_SIZE" -s 4 -v "$BOOT_DEV" > /dev/null
mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$ROOT_DEV" > /dev/null
mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4
mkdir -p "${ROOTFS_DIR}/boot/firmware"
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot/firmware" -t vfat
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/firmware/" "${ROOTFS_DIR}/boot/firmware/"

0
export-noobs/00-release/files/partition_setup.sh Normal file → Executable file
View File

View File

@@ -2,8 +2,10 @@
install -m 644 files/sources.list "${ROOTFS_DIR}/etc/apt/" install -m 644 files/sources.list "${ROOTFS_DIR}/etc/apt/"
install -m 644 files/raspi.list "${ROOTFS_DIR}/etc/apt/sources.list.d/" install -m 644 files/raspi.list "${ROOTFS_DIR}/etc/apt/sources.list.d/"
#install -m 644 files/oxmc.list "${ROOTFS_DIR}/etc/apt/sources.list.d/"
sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list" sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list"
sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/raspi.list" sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/raspi.list"
#sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/oxmc.list"
if [ -n "$APT_PROXY" ]; then if [ -n "$APT_PROXY" ]; then
install -m 644 files/51cache "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache" install -m 644 files/51cache "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
@@ -14,6 +16,8 @@ fi
cat files/raspberrypi.gpg.key | gpg --dearmor > "${STAGE_WORK_DIR}/raspberrypi-archive-stable.gpg" 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/" install -m 644 "${STAGE_WORK_DIR}/raspberrypi-archive-stable.gpg" "${ROOTFS_DIR}/etc/apt/trusted.gpg.d/"
#cat files/oxmc.gpg.key | gpg --dearmor > "${STAGE_WORK_DIR}/oxmc.gpg"
#install -m 644 "${STAGE_WORK_DIR}/oxmc.gpg" "${ROOTFS_DIR}/etc/apt/trusted.gpg.d/"
on_chroot <<- \EOF on_chroot <<- \EOF
ARCH="$(dpkg --print-architecture)" ARCH="$(dpkg --print-architecture)"
if [ "$ARCH" = "armhf" ]; then if [ "$ARCH" = "armhf" ]; then

View File

@@ -0,0 +1,53 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
JwmNXcU=
=JjzN
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,3 @@
deb http://apt.oxmc.me/ RELEASE main
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://apt.oxmc.me/ RELEASE main

View File

@@ -1,10 +1,5 @@
#!/bin/bash -e #!/bin/bash -e
if [ "$RELEASE" != "bookworm" ]; then
echo "WARNING: RELEASE does not match the intended option for this branch."
echo " Please check the relevant README.md section."
fi
if [ ! -d "${ROOTFS_DIR}" ]; then if [ ! -d "${ROOTFS_DIR}" ]; then
bootstrap ${RELEASE} "${ROOTFS_DIR}" http://deb.debian.org/debian/ bootstrap ${RELEASE} "${ROOTFS_DIR}" http://deb.debian.org/debian/
fi fi

View File

@@ -1,6 +1,8 @@
#!/bin/bash -e #!/bin/bash -e
install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab" install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab"
# SteamOS like readonly root
install -m 644 files/system-readonly "${ROOTFS_DIR}/sbin/"
on_chroot << EOF on_chroot << EOF
if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then

View File

@@ -1,3 +1,5 @@
proc /proc proc defaults 0 0 proc /proc proc defaults 0 0
BOOTDEV /boot/firmware vfat defaults 0 2 BOOTDEV /boot/firmware vfat defaults 0 2
ROOTDEV / ext4 defaults,noatime 0 1 ROOTDEV / ext4 defaults,noatime 0 1
# For /home (always writable):
LABEL=home /home ext4 defaults 0 2

View File

@@ -0,0 +1,30 @@
#!/bin/bash
FSTAB_FILE="/etc/fstab"
if [ "$1" == "enable" ]; then
echo "Enabling read-only mode..."
# Modify fstab to set root filesystem as read-only
sudo sed -i 's|\(ROOTDEV.* / .* ext4 \)defaults,noatime|\1ro,noatime|' "$FSTAB_FILE"
# Remount root as read-only
sudo mount -o remount,ro /
echo "System is now read-only. Reboot for changes to persist."
elif [ "$1" == "disable" ]; then
echo "Disabling read-only mode..."
# Modify fstab to set root filesystem as writable
sudo sed -i 's|\(ROOTDEV.* / .* ext4 \)ro,noatime|\1defaults,noatime|' "$FSTAB_FILE"
# Remount root as writable
sudo mount -o remount,rw /
echo "System is now writable. Reboot for changes to persist."
else
echo "Usage: system-readonly enable|disable"
exit 1
fi

View File

@@ -3,9 +3,6 @@ console-setup keyboard-configuration debconf-utils parted
build-essential manpages-dev bash-completion gdb pkg-config build-essential manpages-dev bash-completion gdb pkg-config
python-is-python3 python-is-python3
v4l-utils v4l-utils
gpiod python3-libgpiod
python3-gpiozero
pigpio python3-pigpio raspi-gpio python3-rpi-lgpio
python3-spidev python3-spidev
python3-smbus2 python3-smbus2
avahi-daemon avahi-daemon
@@ -18,6 +15,7 @@ dphys-swapfile
raspberrypi-sys-mods raspberrypi-sys-mods
pi-bluetooth pi-bluetooth
apt-listchanges apt-listchanges
apt-file
usb-modeswitch usb-modeswitch
libpam-chksshpwd libpam-chksshpwd
rpi-update rpi-update

View File

@@ -1,3 +1,2 @@
cifs-utils cifs-utils
rpicam-apps-lite
mkvtoolnix mkvtoolnix

View File

@@ -1,2 +0,0 @@
# Do you accept the Wolfram - Raspberry Pi® Bundle License Agreement?
wolfram-engine shared/accepted-wolfram-eula boolean true

View File

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

View File

@@ -2,19 +2,14 @@ gstreamer1.0-x gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-
evince gtk2-engines alsa-utils evince gtk2-engines alsa-utils
desktop-base desktop-base
git git
policykit-1
gvfs gvfs
rfkill rfkill
chromium rpi-chromium-mods libwidevinecdm0 firefox rpi-firefox-mods libwidevinecdm0
firefox rpi-firefox-mods
gldriver-test gldriver-test
fonts-droid-fallback fonts-droid-fallback
fonts-liberation2 fonts-liberation2
obconf obconf
raindrop raindrop
libcamera-tools
rpicam-apps
python3-picamera2
python3-pyqt5 python3-pyqt5
python3-opengl python3-opengl
vulkan-tools mesa-vulkan-drivers vulkan-tools mesa-vulkan-drivers

View File

@@ -1,8 +1,8 @@
xserver-xorg xinit xserver-xorg xinit
mousepad mousepad
eom eom
lxde lxtask menu-xdg menu-xdg
zenity xdg-utils yad zenity xdg-utils
gvfs-backends gvfs-fuse gvfs-backends gvfs-fuse
lightdm gnome-themes-extra-data gnome-icon-theme gdm3 gnome-themes-extra-data gnome-icon-theme
gnome-keyring gnome-keyring

View File

@@ -0,0 +1,16 @@
python3-pygame
python3-tk
python3-pgzero
python3-serial
python3-pip
python3-numpy
rc-gui
tree
libgl1-mesa-dri libgles1 libgles2-mesa xcompmgr
geany
piclone
python3-twython
pprompt
ffmpeg
vlc
rpi-imager

View File

@@ -0,0 +1,2 @@
pi-package
gnome-core gnome-tweaks gnome-shell-extension-no-annoyance gnome-shell-extension-manager gnome-shell-extension-gsconnect gnome-shell-extension-dash-to-panel gnome-shell-extension-bluetooth-quick-connect gnome-shell-extension-appindicator gnome-initial-setup

View File

@@ -0,0 +1,4 @@
hunspell-en-us
hyphen-en-us
wamerican
wbritish

View File

@@ -0,0 +1 @@
command-not-found

4
stage3/02-extras/00-run.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/bash -e
#polkit fixes
install -m 644 files/polkit-admin.conf "${ROOTFS_DIR}/etc/polkit-1/localauthority.conf.d/51-admin.conf"

View File

@@ -0,0 +1 @@
AdminIdentities=unix-group:sudo;unix-group:admin

17
stage3/05-setup/00-run.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash -e
# Include custom vendor file for gnome-inital-setup
mkdir -p "${ROOTFS_DIR}/usr/share/gnome-initial-setup/"
install -m 644 files/vendor.conf "${ROOTFS_DIR}/usr/share/gnome-initial-setup/"
# Configure default GDM3 Session to Xorg
on_chroot << EOF
sed -i 's/#WaylandEnable=false/WaylandEnable=false/' /etc/gdm3/daemon.conf
mkdir -p /var/lib/gdm
touch /var/lib/gdm/run-initial-setup
EOF
# Remove setup user (chill) [This allows for the user to be created in the first boot from the gnome-initial-setup]
on_chroot << EOF
deluser --remove-home --remove-all-files ${FIRST_USER_NAME}
EOF

View File

@@ -0,0 +1,5 @@
[pages]
# Pages to show when a user already exists
existing_user_only=language;keyboard;timezone;goa;
# Only show the privacy page in the 'first boot' situation
new_user_only=welcome;language;keyboard;network;account;privacy;

0
stage3/EXPORT_IMAGE Normal file
View File

View File

@@ -1,27 +0,0 @@
python3-pygame
python3-tk thonny
python3-pgzero
python3-serial
debian-reference-en dillo
raspberrypi-net-mods raspberrypi-ui-mods
python3-pip
python3-numpy
alacarte rc-gui sense-hat
tree
libgl1-mesa-dri libgles1 libgles2-mesa xcompmgr
geany
piclone
python3-twython
python3-flask
pprompt
piwiz
rp-prefapps
ffmpeg
vlc
rpi-connect
rpi-imager
labwc
squeekboard
# ninja-build and openocd needed for vscode pico extension
meson openocd

View File

@@ -1,2 +0,0 @@
pi-package
realvnc-vnc-server

View File

@@ -1,4 +0,0 @@
hunspell-en-gb
hyphen-en-gb
wamerican
wbritish

View File

@@ -1,5 +0,0 @@
#!/bin/bash -e
on_chroot << EOF
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_boot_behaviour B4
EOF

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,5 +0,0 @@
#!/bin/bash -e
on_chroot << EOF
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_wayland W3
EOF

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
mu-editor
scratch nuscratch scratch3
wolfram-engine
claws-mail
realvnc-vnc-viewer
code-the-classics code-the-classics-2
kicad

View File

@@ -1,3 +0,0 @@
libreoffice-pi openjdk-11-jre-
libreoffice-help-en-gb
libreoffice-l10n-en-gb

View File

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

View File

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