diff --git a/Dockerfile b/Dockerfile index cf03b06..a0be4c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get -y update && \ apt-get -y install --no-install-recommends \ git vim parted \ - quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \ + quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools e2fsprogs \ libarchive-tools libcap2-bin rsync grep udev xz-utils curl xxd file kmod bc \ binfmt-support ca-certificates fdisk gpg pigz arch-test \ && rm -rf /var/lib/apt/lists/* diff --git a/README.md b/README.md index c255d8d..60cc605 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ For other Linux distributions, you can use the Docker-based build method provide To install the required dependencies for building ChillcraftOS, run the following command: ```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 +apt install coreutils quilt parted qemu-user-static debootstrap zerofree zip \ +dosfstools e2fsprogs libarchive-tools libcap2-bin grep rsync xz-utils file git curl bc \ +gpg pigz xxd arch-test bmap-tools kmod ``` The `depends` file in the repository lists all the necessary tools, formatted as `[:]`. diff --git a/build-docker.sh b/build-docker.sh index 7e9828a..6481b1e 100755 --- a/build-docker.sh +++ b/build-docker.sh @@ -85,10 +85,10 @@ BUILD_OPTS="$(echo "${BUILD_OPTS:-}" | sed -E 's@\-c\s?([^ ]+)@-c /config@')" # Check the arch of the machine we're running on. If it's 64-bit, use a 32-bit base image instead case "$(uname -m)" in x86_64|aarch64) - BASE_IMAGE=i386/debian:bookworm + BASE_IMAGE=i386/debian:trixie ;; *) - BASE_IMAGE=debian:bookworm + BASE_IMAGE=debian:trixie ;; esac ${DOCKER} build --build-arg BASE_IMAGE=${BASE_IMAGE} -t pi-gen "${DIR}" @@ -151,7 +151,7 @@ time ${DOCKER} run \ pi-gen \ bash -e -o pipefail -c " dpkg-reconfigure qemu-user-static && - # binfmt_misc is sometimes not mounted with debian bookworm image + # binfmt_misc is sometimes not mounted with debian trixie image (mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc || true) && cd /pi-gen; ./build.sh ${BUILD_OPTS} && rsync -av work/*/build.log deploy/ diff --git a/build.sh b/build.sh index f684a64..1153310 100755 --- a/build.sh +++ b/build.sh @@ -111,6 +111,8 @@ EOF log "Begin ${SUB_STAGE_DIR}/${RUN_SCRIPT}" "./${RUN_SCRIPT}" log "End ${SUB_STAGE_DIR}/${RUN_SCRIPT}" + elif [ -f ${i}-run.sh ]; then + log "Skip ${SUB_STAGE_DIR}/${i}-run.sh (not executable)" fi done for CHROOT_SCRIPT in "${i}-run-chroot-${ARCH}.sh" "${i}-run-chroot-arm-only.sh" "${i}-run-chroot.sh"; do @@ -226,7 +228,7 @@ 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 ARCH="${ARCH:-arm64}" -export RELEASE=${RELEASE:-bookworm} +export RELEASE=${RELEASE:-trixie} export IMG_NAME="${IMG_NAME:-chillcraftos-$RELEASE-$ARCH}" export USE_QEMU="${USE_QEMU:-0}" @@ -282,6 +284,8 @@ export QUILT_NO_DIFF_INDEX=1 export QUILT_NO_DIFF_TIMESTAMPS=1 export QUILT_REFRESH_ARGS="-p ab" +export ENABLE_CLOUD_INIT=${ENABLE_CLOUD_INIT:-1} + # shellcheck source=scripts/common source "${SCRIPT_DIR}/common" # shellcheck source=scripts/dependencies_check diff --git a/depends b/depends index acbb5cd..752ba79 100644 --- a/depends +++ b/depends @@ -6,6 +6,7 @@ debootstrap zerofree zip mkdosfs:dosfstools +mke2fs:e2fsprogs capsh:libcap2-bin bsdtar:libarchive-tools grep diff --git a/docs/config.md b/docs/config.md index 7bdb5a2..744d022 100644 --- a/docs/config.md +++ b/docs/config.md @@ -6,7 +6,7 @@ environment variables. The following environment variables are supported: - * `IMG_NAME` (Default: `raspios-$RELEASE-$ARCH`, for example: `raspios-bookworm-armhf`) + * `IMG_NAME` (Default: `raspios-$RELEASE-$ARCH`, for example: `raspios-trixie-armhf`) The name of the image to build with the current stage directories. Use this variable to set the root name of your OS, eg `IMG_NAME=Frobulator`. @@ -17,7 +17,7 @@ The following environment variables are supported: The release name to use in `/etc/issue.txt`. The default should only be used for official Raspberry Pi builds. -* `RELEASE` (Default: `bookworm`) +* `RELEASE` (Default: `trixie`) The release version to build images against. Valid values are any supported Debian release. However, since different releases will have different sets of @@ -67,14 +67,6 @@ The following environment variables are supported: * `gz` to deploy a gzipped image (`.img.gz`). * `xz` to deploy a xzipped image (`.img.xz`). - - * `DEPLOY_ZIP` (Deprecated) - - This option has been deprecated in favor of `DEPLOY_COMPRESSION`. - - If `DEPLOY_ZIP=0` is still present in your config file, the behavior is the - same as with `DEPLOY_COMPRESSION=none`. - * `COMPRESSION_LEVEL` (Default: `6`) Compression level to be used when using `zip`, `gz` or `xz` for @@ -157,6 +149,10 @@ The following environment variables are supported: If set, use this directory path as the location of scripts to run when generating images. An absolute or relative path can be given for a location outside the pi-gen directory. + * `ENABLE_CLOUD_INIT` (Default: `1`) + + If set to `1`, cloud-init and netplan will be installed and configured. This will allow you to configure your Raspberry Pi using cloud-init configuration files. The cloud-init configuration files should be placed in the bootfs or by editing the files in `stage2/04-cloud-init/files`. Cloud-init will be configured to read them on first boot. + A simple example for building Raspberry Pi OS: ```bash diff --git a/export-image/04-finalise/01-run.sh b/export-image/04-finalise/01-run.sh index 777ca8c..7f0929c 100755 --- a/export-image/04-finalise/01-run.sh +++ b/export-image/04-finalise/01-run.sh @@ -5,14 +5,17 @@ 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 -if [ -x /etc/init.d/fake-hwclock ]; then - /etc/init.d/fake-hwclock stop -fi -if hash hardlink 2>/dev/null; then - hardlink -t /usr/share/doc -fi +on_chroot <<- EOF + update-initramfs -k all -c + if hash hardlink 2>/dev/null; then + hardlink -t /usr/share/doc + fi + if [ -f /usr/lib/systemd/system/apt-listchanges.service ]; then + python3 -m apt_listchanges.populate_database --profile apt + systemctl disable apt-listchanges.timer + fi + install -m 755 -o systemd-timesync -g systemd-timesync -d /var/lib/systemd/timesync + install -m 644 -o systemd-timesync -g systemd-timesync /dev/null /var/lib/systemd/timesync/clock EOF if [ -f "${ROOTFS_DIR}/etc/initramfs-tools/update-initramfs.conf" ]; then @@ -51,7 +54,7 @@ rm -f "${ROOTFS_DIR}"/usr/share/icons/*/icon-theme.cache rm -f "${ROOTFS_DIR}/var/lib/dbus/machine-id" -true > "${ROOTFS_DIR}/etc/machine-id" +echo "uninitialized" > "${ROOTFS_DIR}/etc/machine-id" ln -nsf /proc/mounts "${ROOTFS_DIR}/etc/mtab" diff --git a/scripts/common b/scripts/common index 25f6a11..4fd2cef 100644 --- a/scripts/common +++ b/scripts/common @@ -17,7 +17,10 @@ bootstrap(){ BOOTSTRAP_ARGS+=("$@") printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}" - capsh $CAPSH_ARG -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true + setarch linux32 capsh $CAPSH_ARG -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true + + # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1050719 + rm -f wget-log* if [ -d "$2/debootstrap" ] && ! rmdir "$2/debootstrap"; then cp "$2/debootstrap/debootstrap.log" "${STAGE_WORK_DIR}" diff --git a/stage0/00-configure-apt/00-run.sh b/stage0/00-configure-apt/00-run.sh index 26d968e..106097d 100755 --- a/stage0/00-configure-apt/00-run.sh +++ b/stage0/00-configure-apt/00-run.sh @@ -1,16 +1,18 @@ #!/bin/bash -e # Configure apt sources -install -m 644 files/sources.list "${ROOTFS_DIR}/etc/apt/" -sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list" +true > "${ROOTFS_DIR}/etc/apt/sources.list" if [[ "${ARCH}" == "arm64" || "${ARCH}" == "armhf" ]]; then - install -m 644 files/raspi.list "${ROOTFS_DIR}/etc/apt/sources.list.d/" - sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/raspi.list" + install -m 644 files/raspbian.sources "${ROOTFS_DIR}/etc/apt/sources.list.d/" + install -m 644 files/raspi.sources "${ROOTFS_DIR}/etc/apt/sources.list.d/" + sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/raspbian.sources" + sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/raspi.sources" fi -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.d/oxmc.list" +# Configure oxmc apt sources +install -m 644 files/oxmc.sources "${ROOTFS_DIR}/etc/apt/sources.list.d/" +sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/oxmc.sources" # Configure apt proxy if [ -n "$APT_PROXY" ]; then @@ -32,13 +34,11 @@ install -m 644 files/apt-chillcraftos-prefs "${ROOTFS_DIR}/etc/apt/preferences.d if [[ "${ARCH}" == "arm64" || "${ARCH}" == "armhf" ]]; then # Add raspberrypi-archive-keyring to apt - 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 files/raspberrypi-archive-keyring.pgp "${ROOTFS_DIR}/usr/share/keyrings/" fi # Add oxmc-archive-keyring to apt -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/" +install -m 644 files/oxmc.pgp "${ROOTFS_DIR}/usr/share/keyrings/" # Add armhf and arm64 architectures, update and upgrade and cache policy on_chroot <<- \EOF diff --git a/stage0/00-configure-apt/files/oxmc.list b/stage0/00-configure-apt/files/oxmc.list deleted file mode 100644 index ccb7a94..0000000 --- a/stage0/00-configure-apt/files/oxmc.list +++ /dev/null @@ -1,3 +0,0 @@ -deb https://cdn.oxmc.me/apt RELEASE main -# Uncomment line below then 'apt-get update' to enable 'apt-get source' -#deb-src https://cdn.oxmc.me/apt RELEASE main \ No newline at end of file diff --git a/stage0/00-configure-apt/files/oxmc.gpg.key b/stage0/00-configure-apt/files/oxmc.pgp similarity index 100% rename from stage0/00-configure-apt/files/oxmc.gpg.key rename to stage0/00-configure-apt/files/oxmc.pgp diff --git a/stage0/00-configure-apt/files/oxmc.sources b/stage0/00-configure-apt/files/oxmc.sources new file mode 100644 index 0000000..95ae782 --- /dev/null +++ b/stage0/00-configure-apt/files/oxmc.sources @@ -0,0 +1,5 @@ +Types: deb +URIs: https://cdn.oxmc.me/apt +Suites: RELEASE +Components: main +Signed-By: /usr/share/keyrings/oxmc.gpg \ No newline at end of file diff --git a/stage0/00-configure-apt/files/raspberrypi-archive-keyring.pgp b/stage0/00-configure-apt/files/raspberrypi-archive-keyring.pgp new file mode 100644 index 0000000..e0ada06 Binary files /dev/null and b/stage0/00-configure-apt/files/raspberrypi-archive-keyring.pgp differ diff --git a/stage0/00-configure-apt/files/raspberrypi.gpg.key b/stage0/00-configure-apt/files/raspberrypi.gpg.key deleted file mode 100644 index 60b5f65..0000000 --- a/stage0/00-configure-apt/files/raspberrypi.gpg.key +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.12 (GNU/Linux) - -mQENBE/d7o8BCACrwqQacGJfn3tnMzGui6mv2lLxYbsOuy/+U4rqMmGEuo3h9m92 -30E2EtypsoWczkBretzLUCFv+VUOxaA6sV9+puTqYGhhQZFuKUWcG7orf7QbZRuu -TxsEUepW5lg7MExmAu1JJzqM0kMQX8fVyWVDkjchZ/is4q3BPOUCJbUJOsE+kK/6 -8kW6nWdhwSAjfDh06bA5wvoXNjYoDdnSZyVdcYCPEJXEg5jfF/+nmiFKMZBraHwn -eQsepr7rBXxNcEvDlSOPal11fg90KXpy7Umre1UcAZYJdQeWcHu7X5uoJx/MG5J8 -ic6CwYmDaShIFa92f8qmFcna05+lppk76fsnABEBAAG0IFJhc3BiZXJyeSBQaSBB -cmNoaXZlIFNpZ25pbmcgS2V5iQE4BBMBAgAiBQJP3e6PAhsDBgsJCAcDAgYVCAIJ -CgsEFgIDAQIeAQIXgAAKCRCCsSmSf6MwPk6vB/9pePB3IukU9WC9Bammh3mpQTvL -OifbkzHkmAYxzjfK6D2I8pT0xMxy949+ThzJ7uL60p6T/32ED9DR3LHIMXZvKtuc -mQnSiNDX03E2p7lIP/htoxW2hDP2n8cdlNdt0M9IjaWBppsbO7IrDppG2B1aRLni -uD7v8bHRL2mKTtIDLX42Enl8aLAkJYgNWpZyPkDyOqamjijarIWjGEPCkaURF7g4 -d44HvYhpbLMOrz1m6N5Bzoa5+nq3lmifeiWKxioFXU+Hy5bhtAM6ljVb59hbD2ra -X4+3LXC9oox2flmQnyqwoyfZqVgSQa0B41qEQo8t1bz6Q1Ti7fbMLThmbRHiuQEN -BE/d7o8BCADNlVtBZU63fm79SjHh5AEKFs0C3kwa0mOhp9oas/haDggmhiXdzeD3 -49JWz9ZTx+vlTq0s+I+nIR1a+q+GL+hxYt4HhxoA6vlDMegVfvZKzqTX9Nr2VqQa -S4Kz3W5ULv81tw3WowK6i0L7pqDmvDqgm73mMbbxfHD0SyTt8+fk7qX6Ag2pZ4a9 -ZdJGxvASkh0McGpbYJhk1WYD+eh4fqH3IaeJi6xtNoRdc5YXuzILnp+KaJyPE5CR -qUY5JibOD3qR7zDjP0ueP93jLqmoKltCdN5+yYEExtSwz5lXniiYOJp8LWFCgv5h -m8aYXkcJS1xVV9Ltno23YvX5edw9QY4hABEBAAGJAR8EGAECAAkFAk/d7o8CGwwA -CgkQgrEpkn+jMD5Figf/dIC1qtDMTbu5IsI5uZPX63xydaExQNYf98cq5H2fWF6O -yVR7ERzA2w33hI0yZQrqO6pU9SRnHRxCFvGv6y+mXXXMRcmjZG7GiD6tQWeN/3wb -EbAn5cg6CJ/Lk/BI4iRRfBX07LbYULCohlGkwBOkRo10T+Ld4vCCnBftCh5x2OtZ -TOWRULxP36y2PLGVNF+q9pho98qx+RIxvpofQM/842ZycjPJvzgVQsW4LT91KYAE -4TVf6JjwUM6HZDoiNcX6d7zOhNfQihXTsniZZ6rky287htsWVDNkqOi5T3oTxWUo -m++/7s3K3L0zWopdhMVcgg6Nt9gcjzqN1c0gy55L/g== -=mNSj ------END PGP PUBLIC KEY BLOCK----- diff --git a/stage0/00-configure-apt/files/raspbian.sources b/stage0/00-configure-apt/files/raspbian.sources new file mode 100644 index 0000000..d8056b4 --- /dev/null +++ b/stage0/00-configure-apt/files/raspbian.sources @@ -0,0 +1,6 @@ +Types: deb +URIs: http://raspbian.raspberrypi.com/raspbian/ +Architectures: armhf +Suites: RELEASE +Components: main contrib non-free rpi +Signed-By: /usr/share/keyrings/raspbian-archive-keyring.gpg \ No newline at end of file diff --git a/stage0/00-configure-apt/files/raspi.list b/stage0/00-configure-apt/files/raspi.list deleted file mode 100644 index 5f889b1..0000000 --- a/stage0/00-configure-apt/files/raspi.list +++ /dev/null @@ -1,3 +0,0 @@ -deb http://archive.raspberrypi.com/debian/ RELEASE main -# Uncomment line below then 'apt-get update' to enable 'apt-get source' -#deb-src http://archive.raspberrypi.com/debian/ RELEASE main diff --git a/stage0/00-configure-apt/files/raspi.sources b/stage0/00-configure-apt/files/raspi.sources new file mode 100644 index 0000000..a736542 --- /dev/null +++ b/stage0/00-configure-apt/files/raspi.sources @@ -0,0 +1,5 @@ +Types: deb +URIs: http://archive.raspberrypi.com/debian/ +Suites: RELEASE +Components: main +Signed-By: /usr/share/keyrings/raspberrypi-archive-keyring.pgp \ No newline at end of file diff --git a/stage0/00-configure-apt/files/sources.list b/stage0/00-configure-apt/files/sources.list deleted file mode 100644 index 13697ce..0000000 --- a/stage0/00-configure-apt/files/sources.list +++ /dev/null @@ -1,7 +0,0 @@ -deb http://deb.debian.org/debian RELEASE main contrib non-free non-free-firmware -deb http://deb.debian.org/debian-security/ RELEASE-security main contrib non-free non-free-firmware -deb http://deb.debian.org/debian RELEASE-updates main contrib non-free non-free-firmware -# Uncomment deb-src lines below then 'apt-get update' to enable 'apt-get source' -#deb-src http://deb.debian.org/debian RELEASE main contrib non-free non-free-firmware -#deb-src http://deb.debian.org/debian-security/ RELEASE-security main contrib non-free non-free-firmware -#deb-src http://deb.debian.org/debian RELEASE-updates main contrib non-free non-free-firmware diff --git a/stage1/00-boot-files/files/cmdline.txt b/stage1/00-boot-files/files/cmdline.txt index 03cde68..71b90ff 100644 --- a/stage1/00-boot-files/files/cmdline.txt +++ b/stage1/00-boot-files/files/cmdline.txt @@ -1 +1 @@ -console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 fsck.repair=yes rootwait +console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 fsck.repair=yes rootwait resize diff --git a/stage1/01-sys-tweaks/00-patches/01-bashrc.diff b/stage1/01-sys-tweaks/00-patches/01-bashrc.diff index efa2104..ddeae53 100644 --- a/stage1/01-sys-tweaks/00-patches/01-bashrc.diff +++ b/stage1/01-sys-tweaks/00-patches/01-bashrc.diff @@ -1,6 +1,6 @@ ---- a/rootfs/etc/skel/.bashrc -+++ b/rootfs/etc/skel/.bashrc -@@ -43,7 +43,7 @@ +--- stage1.orig/rootfs/etc/skel/.bashrc ++++ stage1/rootfs/etc/skel/.bashrc +@@ -43,7 +43,7 @@ esac # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt @@ -9,7 +9,7 @@ if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then -@@ -57,7 +57,7 @@ +@@ -57,7 +57,7 @@ if [ -n "$force_color_prompt" ]; then fi if [ "$color_prompt" = yes ]; then @@ -18,7 +18,7 @@ else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' fi -@@ -79,9 +79,9 @@ +@@ -79,9 +79,9 @@ if [ -x /usr/bin/dircolors ]; then #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' @@ -30,4 +30,4 @@ + alias egrep='egrep --color=auto' fi - # colored GCC warnings and errors + # colored GCC warnings and errors \ No newline at end of file diff --git a/stage1/01-sys-tweaks/00-run.sh b/stage1/01-sys-tweaks/00-run.sh index e9e4b8b..fca7b0c 100755 --- a/stage1/01-sys-tweaks/00-run.sh +++ b/stage1/01-sys-tweaks/00-run.sh @@ -15,4 +15,4 @@ if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then fi echo "root:root" | chpasswd -EOF +EOF \ No newline at end of file diff --git a/stage2/01-sys-tweaks/00-debconf b/stage2/01-sys-tweaks/00-debconf index 884db93..51e5633 100644 --- a/stage2/01-sys-tweaks/00-debconf +++ b/stage2/01-sys-tweaks/00-debconf @@ -1,12 +1,6 @@ -# Encoding to use on the console: -# Choices: ARMSCII-8, CP1251, CP1255, CP1256, GEORGIAN-ACADEMY, GEORGIAN-PS, IBM1133, ISIRI-3342, ISO-8859-1, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, KOI8-R, KOI8-U, TIS-620, UTF-8, VISCII -console-setup console-setup/charmap47 select UTF-8 # Character set to support: # Choices: . Arabic, # Armenian, # Cyrillic - KOI8-R and KOI8-U, # Cyrillic - non-Slavic languages, # Cyrillic - Slavic languages (also Bosnian and Serbian Latin), . Ethiopic, # Georgian, # Greek, # Hebrew, # Lao, # Latin1 and Latin5 - western Europe and Turkic languages, # Latin2 - central Europe and Romanian, # Latin3 and Latin8 - Chichewa; Esperanto; Irish; Maltese and Welsh, # Latin7 - Lithuanian; Latvian; Maori and Marshallese, . Latin - Vietnamese, # Thai, . Combined - Latin; Slavic Cyrillic; Hebrew; basic Arabic, . Combined - Latin; Slavic Cyrillic; Greek, . Combined - Latin; Slavic and non-Slavic Cyrillic, Guess optimal character set console-setup console-setup/codeset47 select Guess optimal character set -# Font for the console: -# Choices: Fixed, Goha, GohaClassic, Terminus, TerminusBold, TerminusBoldVGA, VGA, Do not change the boot/kernel font, Let the system select a suitable font -console-setup console-setup/fontface47 select Do not change the boot/kernel font # Key to function as AltGr: # Choices: The default for the keyboard layout, No AltGr key, Right Alt (AltGr), Right Control, Right Logo key, Menu key, Left Alt, Left Logo key, Keypad Enter key, Both Logo keys, Both Alt keys keyboard-configuration keyboard-configuration/altgr select The default for the keyboard layout @@ -25,4 +19,4 @@ keyboard-configuration keyboard-configuration/ctrl_alt_bksp boolean true # Choices: English (UK), English (UK) - English (UK\, Colemak), English (UK) - English (UK\, Dvorak with UK punctuation), English (UK) - English (UK\, Dvorak), English (UK) - English (UK\, Macintosh international), English (UK) - English (UK\, Macintosh), English (UK) - English (UK\, extended WinKeys), English (UK) - English (UK\, international with dead keys), Other keyboard-configuration keyboard-configuration/variant select ${KEYBOARD_LAYOUT} # for internal use -keyboard-configuration keyboard-configuration/optionscode string PLACEHOLDER +keyboard-configuration keyboard-configuration/optionscode string PLACEHOLDER \ No newline at end of file diff --git a/stage2/01-sys-tweaks/00-packages b/stage2/01-sys-tweaks/00-packages index 4362c00..f814c9e 100644 --- a/stage2/01-sys-tweaks/00-packages +++ b/stage2/01-sys-tweaks/00-packages @@ -6,12 +6,12 @@ v4l-utils python3-spidev python3-smbus2 avahi-daemon +bluez bluez-firmware lua5.1 luajit ca-certificates curl -fake-hwclock nfs-common usbutils +usbutils dosfstools -dphys-swapfile apt-listchanges apt-file usb-modeswitch @@ -20,7 +20,6 @@ libmtp-runtime rsync htop man-db -policykit-1 ssh-import-id ethtool ntfs-3g @@ -30,3 +29,4 @@ unzip zip p7zip-full file kms++-utils python3-venv +cups \ No newline at end of file diff --git a/stage2/01-sys-tweaks/00-patches/01-useradd.diff b/stage2/01-sys-tweaks/00-patches/01-useradd.diff index e81ad5a..bc60a2d 100644 --- a/stage2/01-sys-tweaks/00-patches/01-useradd.diff +++ b/stage2/01-sys-tweaks/00-patches/01-useradd.diff @@ -1,9 +1,7 @@ -Index: jessie-stage2/rootfs/etc/default/useradd -=================================================================== ---- jessie-stage2.orig/rootfs/etc/default/useradd -+++ jessie-stage2/rootfs/etc/default/useradd +--- stage2.orig/rootfs/etc/default/useradd ++++ stage2/rootfs/etc/default/useradd @@ -5,7 +5,7 @@ - # Similar to DHSELL in adduser. However, we use "sh" here because + # Similar to DSHELL in adduser. However, we use "sh" here because # useradd is a low level utility and should be as general # as possible -SHELL=/bin/sh @@ -19,4 +17,4 @@ Index: jessie-stage2/rootfs/etc/default/useradd +SKEL=/etc/skel # # Defines whether the mail spool should be created while - # creating the account + # creating the account \ No newline at end of file diff --git a/stage2/01-sys-tweaks/00-patches/02-inputrc.diff b/stage2/01-sys-tweaks/00-patches/02-inputrc.diff new file mode 100644 index 0000000..a031b5f --- /dev/null +++ b/stage2/01-sys-tweaks/00-patches/02-inputrc.diff @@ -0,0 +1,10 @@ +--- stage2.orig/rootfs/etc/inputrc ++++ stage2/rootfs/etc/inputrc +@@ -69,3 +69,7 @@ $endif + # "\e[F": end-of-line + + $endif ++ ++# mappings for up and down arrows search history ++# "\e[B": history-search-forward ++# "\e[A": history-search-backward \ No newline at end of file diff --git a/stage2/01-sys-tweaks/00-patches/02-swap.diff b/stage2/01-sys-tweaks/00-patches/02-swap.diff deleted file mode 100644 index 52cdda4..0000000 --- a/stage2/01-sys-tweaks/00-patches/02-swap.diff +++ /dev/null @@ -1,13 +0,0 @@ -Index: jessie-stage2/rootfs/etc/dphys-swapfile -=================================================================== ---- jessie-stage2.orig/rootfs/etc/dphys-swapfile -+++ jessie-stage2/rootfs/etc/dphys-swapfile -@@ -13,7 +13,7 @@ - - # set size to absolute value, leaving empty (default) then uses computed value - # you most likely don't want this, unless you have an special disk situation --#CONF_SWAPSIZE= -+CONF_SWAPSIZE=512 - - # set size to computed value, this times RAM size, dynamically adapts, - # guarantees that there is enough swap without wasting disk space on excess diff --git a/stage2/01-sys-tweaks/00-patches/03-inputrc.diff b/stage2/01-sys-tweaks/00-patches/03-inputrc.diff deleted file mode 100644 index c81fa62..0000000 --- a/stage2/01-sys-tweaks/00-patches/03-inputrc.diff +++ /dev/null @@ -1,12 +0,0 @@ -Index: jessie-stage2/rootfs/etc/inputrc -=================================================================== ---- jessie-stage2.orig/rootfs/etc/inputrc -+++ jessie-stage2/rootfs/etc/inputrc -@@ -65,3 +65,7 @@ $endif - # "\e[F": end-of-line - - $endif -+ -+# mappings for up and down arrows search history -+# "\e[B": history-search-forward -+# "\e[A": history-search-backward diff --git a/stage2/01-sys-tweaks/00-patches/04-path.diff b/stage2/01-sys-tweaks/00-patches/03-path.diff similarity index 55% rename from stage2/01-sys-tweaks/00-patches/04-path.diff rename to stage2/01-sys-tweaks/00-patches/03-path.diff index 25b80a1..462f5db 100644 --- a/stage2/01-sys-tweaks/00-patches/04-path.diff +++ b/stage2/01-sys-tweaks/00-patches/03-path.diff @@ -1,8 +1,6 @@ -Index: jessie-stage2/rootfs/etc/login.defs -=================================================================== ---- jessie-stage2.orig/rootfs/etc/login.defs -+++ jessie-stage2/rootfs/etc/login.defs -@@ -100,7 +100,7 @@ HUSHLOGIN_FILE .hushlogin +--- stage2.orig/rootfs/etc/login.defs ++++ stage2/rootfs/etc/login.defs +@@ -60,7 +60,7 @@ HUSHLOGIN_FILE .hushlogin # # (they are minimal, add the rest in the shell startup files) ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin @@ -10,17 +8,15 @@ Index: jessie-stage2/rootfs/etc/login.defs +ENV_PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games # - # Terminal permissions -Index: jessie-stage2/rootfs/etc/profile -=================================================================== ---- jessie-stage2.orig/rootfs/etc/profile -+++ jessie-stage2/rootfs/etc/profile + # Terminal permissions for terminals after login(1). +--- stage2.orig/rootfs/etc/profile ++++ stage2/rootfs/etc/profile @@ -4,7 +4,7 @@ - if [ "`id -u`" -eq 0 ]; then + if [ "$(id -u)" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else - PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" + PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games" fi export PATH - + \ No newline at end of file diff --git a/stage2/01-sys-tweaks/00-patches/series b/stage2/01-sys-tweaks/00-patches/series index eb33ae7..89b886d 100644 --- a/stage2/01-sys-tweaks/00-patches/series +++ b/stage2/01-sys-tweaks/00-patches/series @@ -1,4 +1,3 @@ 01-useradd.diff -02-swap.diff -03-inputrc.diff -04-path.diff +02-inputrc.diff +03-path.diff diff --git a/stage2/01-sys-tweaks/01-packages-arm-only b/stage2/01-sys-tweaks/01-packages-arm-only index 5347bbe..1d29e3e 100644 --- a/stage2/01-sys-tweaks/01-packages-arm-only +++ b/stage2/01-sys-tweaks/01-packages-arm-only @@ -1,5 +1,11 @@ raspberrypi-sys-mods -pi-bluetooth rpi-update rpi-eeprom raspi-utils +rpi-swap rpi-loop-utils +gpiod python3-libgpiod +python3-gpiozero +python3-rpi-lgpio +rpi-keyboard-config +rpi-keyboard-fw-update +rpi-usb-gadget \ No newline at end of file diff --git a/stage2/01-sys-tweaks/01-run.sh b/stage2/01-sys-tweaks/01-run.sh index fec962e..6c97321 100755 --- a/stage2/01-sys-tweaks/01-run.sh +++ b/stage2/01-sys-tweaks/01-run.sh @@ -1,13 +1,5 @@ #!/bin/bash -e -install -m 755 files/resize2fs_once "${ROOTFS_DIR}/etc/init.d/" - -if [[ "${ARCH}" == "arm64" || "${ARCH}" == "armhf" ]]; then - install -m 644 files/50raspi "${ROOTFS_DIR}/etc/apt/apt.conf.d/" -fi - -install -m 644 files/console-setup "${ROOTFS_DIR}/etc/default/" - if [ -n "${PUBKEY_SSH_FIRST_USER}" ]; then install -v -m 0700 -o 1000 -g 1000 -d "${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.ssh echo "${PUBKEY_SSH_FIRST_USER}" >"${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.ssh/authorized_keys @@ -21,39 +13,28 @@ s/^#?[[:blank:]]*PasswordAuthentication[[:blank:]]*yes[[:blank:]]*$/PasswordAuth fi on_chroot << EOF -systemctl disable hwclock.sh -systemctl disable nfs-common -systemctl disable rpcbind if [ "${ENABLE_SSH}" == "1" ]; then systemctl enable ssh else systemctl disable ssh fi -if [[ "${ARCH}" == "arm64" || "${ARCH}" == "armhf" ]]; then - systemctl enable regenerate_ssh_host_keys -fi EOF if [ "${USE_QEMU}" = "1" ]; then echo "enter QEMU mode" install -m 644 files/90-qemu.rules "${ROOTFS_DIR}/etc/udev/rules.d/" - on_chroot << EOF -systemctl disable resize2fs_once -EOF echo "leaving QEMU mode" -else - on_chroot << EOF -systemctl enable resize2fs_once -EOF fi -on_chroot <&2 - exit 3 - ;; -esac diff --git a/stage2/04-cloud-init/00-packages b/stage2/04-cloud-init/00-packages new file mode 100644 index 0000000..992a1c2 --- /dev/null +++ b/stage2/04-cloud-init/00-packages @@ -0,0 +1 @@ +cloud-init \ No newline at end of file diff --git a/stage2/04-cloud-init/00-packages-arm-only b/stage2/04-cloud-init/00-packages-arm-only new file mode 100644 index 0000000..3172995 --- /dev/null +++ b/stage2/04-cloud-init/00-packages-arm-only @@ -0,0 +1 @@ +rpi-cloud-init-mods \ No newline at end of file diff --git a/stage2/04-cloud-init/01-run.sh b/stage2/04-cloud-init/01-run.sh new file mode 100644 index 0000000..21d3ce8 --- /dev/null +++ b/stage2/04-cloud-init/01-run.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +if [ "${ENABLE_CLOUD_INIT}" != "1" ]; then + log "Skipping cloud-init stage" + exit 0 +fi + +# some preseeding without any runtime effect if not modified +# install meta-data file for NoCloud data-source to work +install -v -m 755 files/meta-data "${ROOTFS_DIR}/boot/firmware/meta-data" +install -v -m 755 files/user-data "${ROOTFS_DIR}/boot/firmware/user-data" +install -v -m 755 files/network-config "${ROOTFS_DIR}/boot/firmware/network-config" \ No newline at end of file diff --git a/stage2/04-cloud-init/README.txt b/stage2/04-cloud-init/README.txt new file mode 100644 index 0000000..d12f955 --- /dev/null +++ b/stage2/04-cloud-init/README.txt @@ -0,0 +1,9 @@ +Cloud-Init support for Raspberry Pi OS + +Reference for Raspberry Pi custom cloud-init config module: https://cloudinit.readthedocs.io/en/latest/reference/modules.html#raspberry-pi-configuration + +- files/network-config is required because otherwise imager would fail to create the correct filesystem entry + +- files/user-data same reason and to include some example configurations + +- files/meta-data Cloud-init instance configuration \ No newline at end of file diff --git a/stage2/04-cloud-init/files/meta-data b/stage2/04-cloud-init/files/meta-data new file mode 100644 index 0000000..b2be92b --- /dev/null +++ b/stage2/04-cloud-init/files/meta-data @@ -0,0 +1,18 @@ +# This is the meta-data configuration file for cloud-init. Please refer to the +# cloud-init documentation for more information: +# +# https://cloudinit.readthedocs.io/ + +# Set the datasource mode to "local". This ensures that user-data is acted upon +# prior to bringing up the network (because everything about the datasource is +# assumed to be local). If you wish to use an HTTP datasource instead, you can +# change this to "net" or override it on the kernel cmdline (see README). +dsmode: local + +# Specifies the "unique" identifier of the instance. Typically in cloud-init +# this is generated by the owning cloud and is actually unique (to some +# degree). Here our data-source is local, so this is just a fixed string. +# Warning: changing this will cause cloud-init to assume it is running on a +# "new" instance, and to go through first time setup again (the value is +# compared to a cached copy). +instance_id: rpios-image \ No newline at end of file diff --git a/stage2/04-cloud-init/files/network-config b/stage2/04-cloud-init/files/network-config new file mode 100644 index 0000000..3b25338 --- /dev/null +++ b/stage2/04-cloud-init/files/network-config @@ -0,0 +1,50 @@ +# This file contains a netplan-compatible configuration which cloud-init will +# apply on first-boot (note: it will *not* update the config after the first +# boot). Please refer to the cloud-init documentation and the netplan reference +# for full details: +# +# https://netplan.io/reference +# https://cloudinit.readthedocs.io/en/latest/topics/network-config.html +# https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v2.html +# +# Please note that the YAML format employed by this file is sensitive to +# differences in whitespace; if you are editing this file in an editor (like +# Notepad) which uses literal tabs, take care to only use spaces for +# indentation. See the following link for more details: +# +# https://en.wikipedia.org/wiki/YAML +# +# Additionally, please be aware that if your boot sequence depends on active +# networking (e.g. if your cloud-init configuration pulls packages or SSH +# keys from the network), you *must* mark at least one interface as required +# ("optional: false") below. Otherwise, particularly on faster boards, +# cloud-init will start attempting to use the network before it is ready + +# Some additional examples are commented out below + +#network: +# version: 2 +# +# ethernets: +# eth0: +# dhcp4: true +# optional: true + +# wifis: +# wlan0: +# dhcp4: true +# optional: true +# access-points: +# myhomewifi: +# password: "S3kr1t" +# myworkwifi: +# password: "correct battery horse staple" +# workssid: +# auth: +# key-management: eap +# method: peap +# identity: "me@example.com" +# password: "passw0rd" +# ca-certificate: /etc/my_ca.pem + +# regulatory-domain: GB \ No newline at end of file diff --git a/stage2/04-cloud-init/files/user-data b/stage2/04-cloud-init/files/user-data new file mode 100644 index 0000000..27162b3 --- /dev/null +++ b/stage2/04-cloud-init/files/user-data @@ -0,0 +1,102 @@ +#cloud-config + +# This is the user-data configuration file for cloud-init. By default this sets +# up an initial user called "ubuntu" with password "ubuntu", which must be +# changed at first login. However, many additional actions can be initiated on +# first boot from this file. The cloud-init documentation has more details: +# +# https://cloudinit.readthedocs.io/ +# +# Please note that the YAML format employed by this file is sensitive to +# differences in whitespace; if you are editing this file in an editor (like +# Notepad) which uses literal tabs, take care to only use spaces for +# indentation. See the following link for more details: +# +# https://en.wikipedia.org/wiki/YAML +# +# Some additional examples are provided in comments below the default +# configuration. + +## Set the system's hostname. Please note that, unless you have a local DNS +## setup where the hostname is derived from DHCP requests (as with dnsmasq), +## setting the hostname here will not make the machine reachable by this name. +## You may also wish to install avahi-daemon (see the "packages:" key below) +## to make your machine reachable by the .local domain +#hostname: raspberrypi + +## Set up the keyboard layout. See localectl(1), in particular the various +## list-x11-* sub-commands, to determine the available models, layouts, +## variants, and options +#keyboard: +# model: pc105 +# layout: gb +# variant: +# options: ctrl:nocaps + +# Controls password authentication with the SSH daemon; the default here can +# prevent logging into SSH with a password. Changing this is a security risk +# and you should at the very least ensure a different default password is +# specified above +#ssh_pwauth: false + +## On first boot, use ssh-import-id to give the specific users SSH access to +## the default user +#ssh_import_id: +#- lp:my_launchpad_username +#- gh:my_github_username + +## Add users and groups to the system, and import keys with the ssh-import-id +## utility +#groups: +#- robot: [robot] +#- robotics: [robot] +#- pi +# +#users: +#- default +#- name: robot +# gecos: Mr. Robot +# primary_group: robot +# groups: users +# ssh_import_id: foobar +# lock_passwd: false +# passwd: $5$hkui88$nvZgIle31cNpryjRfO9uArF7DYiBcWEnjqq7L1AQNN3 + +## Update apt database and upgrade packages on first boot +#package_update: true +#package_upgrade: true + +## Install additional packages on first boot +#packages: +#- avahi-daemon +#- rng-tools +#- python3-gpiozero +#- [python3-serial, 3.5-1] + +## Write arbitrary files to the file-system (including binaries!) +#write_files: +#- path: /etc/default/console-setup +# content: | +# # Consult the console-setup(5) manual page. +# ACTIVE_CONSOLES="/dev/tty[1-6]" +# CHARMAP="UTF-8" +# VIDEOMODE= +# FONT="Lat15-Terminus18x10.psf.gz" +# FONTFACE= +# FONTSIZE= +# CODESET="Lat15" +# permissions: '0644' +# owner: root:root +#- encoding: gzip +# path: /root/Makefile +# content: !!binary | +# H4sICF2DTWIAA01ha2VmaWxlAFNWCM8syVBILMjPyU/PTC1WKMlXiPB2dlFQNjSx5MpNteLi +# dLDiSoRQxYl5KeWZyRkgXrSCkoqKRmaKgm6pppKCbmqhgoFCrIKamkK1QmpyRr6Ckn92YqWS +# NdC80uQMBZhOa4VahZoaqIrwjMQSewXfxOxUhcwShcr80qLi1Jw0RSUuAIYfEJmVAAAA +# owner: root:root +# permissions: '0644' + +## Run arbitrary commands at rc.local like time +#runcmd: +#- [ ls, -l, / ] +#- [ sh, -xc, "echo $(date) ': hello world!'" ] \ No newline at end of file diff --git a/stage3/00-install-packages/01-packages-arm-only b/stage3/00-install-packages/01-packages-arm-only index 7381057..ad7e014 100644 --- a/stage3/00-install-packages/01-packages-arm-only +++ b/stage3/00-install-packages/01-packages-arm-only @@ -1,2 +1,5 @@ firefox rpi-firefox-mods libwidevinecdm0 -gldriver-test \ No newline at end of file +gldriver-test +rpd-wayland-core rpd-x-core +rpd-theme +rpd-utilities rpd-preferences \ No newline at end of file diff --git a/stage3/00-install-packages/01-packages-nr-arm-only b/stage3/00-install-packages/01-packages-nr-arm-only new file mode 100644 index 0000000..40d7289 --- /dev/null +++ b/stage3/00-install-packages/01-packages-nr-arm-only @@ -0,0 +1,2 @@ +rpd-wayland-core +rpd-x-core \ No newline at end of file diff --git a/stage3/01-install-desktop/00-debconf b/stage3/01-install-desktop/00-debconf deleted file mode 100644 index 87932e2..0000000 --- a/stage3/01-install-desktop/00-debconf +++ /dev/null @@ -1,2 +0,0 @@ -# Enable realtime process priority? -jackd2 jackd/tweak_rt_limits boolean true diff --git a/stage3/01-install-desktop/00-packages b/stage3/01-install-desktop/00-packages index f44fe1a..b307ae1 100644 --- a/stage3/01-install-desktop/00-packages +++ b/stage3/01-install-desktop/00-packages @@ -1,12 +1,8 @@ -python3-tk -python3-pgzero -python3-serial python3-pip python3-numpy tree -libgl1-mesa-dri libgles1 libgles2-mesa xcompmgr +libgl1-mesa-dri libgles1 xcompmgr pprompt ffmpeg vlc -rpi-imager plymouth diff --git a/stage3/01-install-desktop/01-packages b/stage3/01-install-desktop/01-packages deleted file mode 100644 index 3396cae..0000000 --- a/stage3/01-install-desktop/01-packages +++ /dev/null @@ -1,4 +0,0 @@ -hunspell-en-us -hyphen-en-us -wamerican -wbritish diff --git a/stage3/02-setup-system/01-run-arm-only.sh b/stage3/02-setup-system/01-run-arm-only.sh index 5d00a9b..52e1e66 100755 --- a/stage3/02-setup-system/01-run-arm-only.sh +++ b/stage3/02-setup-system/01-run-arm-only.sh @@ -1,8 +1,7 @@ #!/bin/bash -e -# Enable xcompmgr on_chroot << EOF - raspi-config nonint do_xcompmgr 0 + SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_wayland W2 EOF # Pi-Apps (this is a bash script that installs pi-apps when the user runs it, then gets overwritten by the actual pi-apps)