diff --git a/README.md b/README.md index 6ade5d3..0ab2a37 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # PS5 Linux Image Builder -Builds bootable Linux USB images for PlayStation 5 using Docker containers. Supports Ubuntu 26.04, Ubuntu 24.04, Arch, CachyOS (Gamescope + Steam), and Alpine, individually or as a multi-distro image with kexec switching. +Builds bootable Linux USB images for PlayStation 5 using Docker containers. Supports Ubuntu 26.04, Arch, CachyOS (Gamescope + Steam), and Alpine, individually or as a multi-distro image with kexec switching. ## Prerequisites @@ -22,17 +22,12 @@ newgrp docker OR -# Build a single Ubuntu 24.04 image -./build_image.sh --distro ubuntu2404 - -OR - # Build CachyOS (Arch-based, Gamescope + Steam Big Picture) ./build_image.sh --distro cachyos OR -# Build a multi-distro image (ubuntu2604 + ubuntu2404 + arch + alpine + cachyos) +# Build a multi-distro image (ubuntu2604 + arch + alpine + cachyos) ./build_image.sh --distro all ``` @@ -48,7 +43,7 @@ sudo dd if=output/ps5-ubuntu2604.img of=/dev/sdX bs=4M status=progress | Flag | Description | Default | |------|-------------|---------| -| `--distro` | `ubuntu2604`, `ubuntu2404`, `arch`, `cachyos`, `alpine`, or `all` | `ubuntu2604` | +| `--distro` | `ubuntu2604`, `arch`, `cachyos`, `alpine`, or `all` | `ubuntu2604` | | `--kernel` | Path to kernel source directory | auto-clone `v6.19.10` | | `--img-size` | Disk image size in MB | `12000` (`32000` for `all`) | | `--clean` | Remove all cached build artifacts and start fresh | off | @@ -69,7 +64,7 @@ Use `--clean` to wipe everything and rebuild from scratch. The build will also s PS5 Linux Image Builder ======================= Distro: all - (ubuntu2604 ubuntu2404 arch alpine cachyos) + (ubuntu2604 arch alpine cachyos) Image size: 32000MB Kernel src: /path/to/work/linux @@ -91,7 +86,6 @@ All verbose output goes to `build.log`. The terminal shows a spinner with live p | Distro | Desktop | Kernel format | Init | |--------|---------|---------------|------| -| Ubuntu 24.04 (Noble) | GNOME | `.deb` | systemd | | Ubuntu 26.04 (Resolute) | GNOME | `.deb` | systemd | | Arch | Sway | `.pkg.tar.zst` | systemd | | CachyOS | Gamescope + Steam Big Picture (Arch + `[cachyos]` repo, no v3 migration in image build) | `.pkg.tar.zst` | systemd | @@ -99,16 +93,15 @@ All verbose output goes to `build.log`. The terminal shows a spinner with live p ## Multi-distro Image -`--distro all` builds a 32GB image with 6 partitions (one EFI boot partition plus five root filesystems): +`--distro all` builds a 32GB image with 5 partitions (one EFI boot partition plus four root filesystems): | Partition | Type | Label | Content | |-----------|------|-------|---------| | p1 | FAT32 | boot | Shared kernel, per-distro initrds, kexec scripts | | p2 | ext4 | ubuntu2604 | Ubuntu 26.04 rootfs | -| p3 | ext4 | ubuntu2404 | Ubuntu 24.04 rootfs | -| p4 | ext4 | arch | Arch rootfs | -| p5 | ext4 | alpine | Alpine rootfs | -| p6 | ext4 | cachyos | CachyOS rootfs | +| p3 | ext4 | arch | Arch rootfs | +| p4 | ext4 | alpine | Alpine rootfs | +| p5 | ext4 | cachyos | CachyOS rootfs | The boot partition contains kexec scripts to switch between distros at runtime. Ubuntu 26.04 is the default boot target. @@ -124,7 +117,6 @@ docker/ entrypoint.sh # Single-distro build logic entrypoint-multi.sh # Multi-distro build logic distros/ - ubuntu2404/ # Ubuntu 24.04 (Noble) ubuntu2604/ # Ubuntu 26.04 (Resolute) arch/ # Arch Linux cachyos/ # CachyOS repos + Gamescope/Steam @@ -133,7 +125,7 @@ distros/ boot/ cmdline.txt # Kernel cmdline template (__DISTRO__ placeholder) vram.txt # VRAM allocation - kexec-{ubuntu2604,ubuntu2404,arch,alpine,cachyos}.sh + kexec-{ubuntu2604,arch,alpine,cachyos}.sh work/ # Build artifacts (auto-created) linux-bin/ # Compiled kernel packages output/ # Final .img files diff --git a/boot/kexec-ubuntu2404.sh b/boot/kexec-ubuntu2404.sh deleted file mode 100644 index a1418ff..0000000 --- a/boot/kexec-ubuntu2404.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -# Switch to Ubuntu 24.04 via kexec -set -e -BOOT=/boot/efi -kexec -l "$BOOT/bzImage" --initrd="$BOOT/initrd-ubuntu2404.img" --command-line="$(cat $BOOT/cmdline-ubuntu2404.txt)" -kexec -e diff --git a/build_image.sh b/build_image.sh index 117a9d8..b9e1a52 100755 --- a/build_image.sh +++ b/build_image.sh @@ -9,13 +9,13 @@ KERNEL_SRC="" CLEAN=false IMG_SIZE=12000 -MULTI_DISTROS="ubuntu2604 ubuntu2404 arch alpine cachyos" +MULTI_DISTROS="ubuntu2604 arch alpine cachyos" usage() { echo "Usage: $0 [--distro ] [--kernel ] [--img-size ] [--clean]" echo "" echo "Options:" - echo " --distro Distribution to build: ubuntu2604, ubuntu2404, arch, cachyos, alpine, all (default: ubuntu2604)" + echo " --distro Distribution to build: ubuntu2604, arch, cachyos, alpine, all (default: ubuntu2604)" echo " --kernel Path to kernel source directory (default: auto-clone to work/linux/)" echo " --img-size Disk image size in MB (default: 12000, 32000 for --distro all)" echo " --clean Remove all cached build artifacts and start from scratch" diff --git a/distros/ubuntu2404/grow-rootfs b/distros/ubuntu2404/grow-rootfs deleted file mode 100644 index 23ee936..0000000 --- a/distros/ubuntu2404/grow-rootfs +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# Grows the root partition and filesystem to fill the disk. -# Runs once on first boot, then disables itself. -set -e - -ROOT_DEV=$(findmnt -no SOURCE /) -DISK=$(lsblk -ndo PKNAME "$ROOT_DEV") -PART_NUM=$(cat /sys/class/block/$(basename "$ROOT_DEV")/partition) - -growpart "/dev/$DISK" "$PART_NUM" || true -resize2fs "$ROOT_DEV" || true - -systemctl disable grow-rootfs.service diff --git a/distros/ubuntu2404/grow-rootfs.service b/distros/ubuntu2404/grow-rootfs.service deleted file mode 100644 index 722eca7..0000000 --- a/distros/ubuntu2404/grow-rootfs.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Grow root filesystem to fill disk -DefaultDependencies=no -Before=local-fs.target -After=local-fs-pre.target - -[Service] -Type=oneshot -ExecStart=/usr/local/sbin/grow-rootfs -RemainAfterExit=yes - -[Install] -WantedBy=local-fs.target diff --git a/distros/ubuntu2404/image.yaml b/distros/ubuntu2404/image.yaml deleted file mode 100644 index f0a527b..0000000 --- a/distros/ubuntu2404/image.yaml +++ /dev/null @@ -1,162 +0,0 @@ -image: - name: ps5-ubuntu2404 - distribution: ubuntu - release: noble - description: Ubuntu Noble desktop - architecture: x86_64 - -source: - downloader: debootstrap - url: http://archive.ubuntu.com/ubuntu - variant: minbase - keyserver: keyserver.ubuntu.com - keys: - - 0x790BC7277767219C42C86F933B4FE6ACC0B21F32 - - 0xf6ecb3762474eda9d21b7022871920d1991bc93c - -packages: - manager: apt - update: true - cleanup: true - - repositories: - - name: sources.list - url: |- - deb http://archive.ubuntu.com/ubuntu {{ image.release }} main restricted universe multiverse - deb http://archive.ubuntu.com/ubuntu {{ image.release }}-updates main restricted universe multiverse - deb http://security.ubuntu.com/ubuntu {{ image.release }}-security main restricted universe multiverse - architectures: - - amd64 - - sets: - - packages: - - ubuntu-desktop - - gnome-software - - firefox - - openssh-server - - build-essential - - network-manager - - linux-firmware - - initramfs-tools - - kmod - - dialog - - sudo - - nano - - cloud-guest-utils - - kexec-tools - - fonts-ubuntu - - fonts-liberation - - fonts-dejavu - - fontconfig - - systemd-zram-generator - - git - - flex - - gawk - - bison - - dwarves - - libelf-dev - - libssl-dev - - libncurses-dev - action: install - -files: -- path: /etc/hostname - generator: hostname - -- path: /etc/hosts - generator: hosts - -- path: /etc/machine-id - generator: dump - -- path: /etc/NetworkManager/conf.d/dns.conf - generator: copy - source: /tmp/build-staging/nm-dns.conf - -- path: /etc/kernel/postinst.d/zz-update-boot - generator: copy - source: /tmp/build-staging/zz-update-boot - mode: "0755" - -- path: /etc/fstab - generator: copy - source: /tmp/build-staging/fstab - -- path: /usr/local/sbin/grow-rootfs - generator: copy - source: /tmp/build-staging/grow-rootfs - mode: "0755" - -- path: /etc/systemd/system/grow-rootfs.service - generator: copy - source: /tmp/build-staging/grow-rootfs.service - -- path: /opt/debs/ - generator: copy - source: /tmp/build-staging/debs - -actions: -- trigger: post-unpack - action: |- - #!/bin/bash - set -eux - # Clear stale apt lists to avoid InRelease split errors after debootstrap - rm -f /var/lib/apt/lists/*InRelease /var/lib/apt/lists/*Release /var/lib/apt/lists/*Packages* || true - # Retry up to 10 times on transient 429/network errors - echo 'Acquire::Retries "10";' > /etc/apt/apt.conf.d/80retry - # Install gnupg + dirmngr so we can fetch the Mozilla PPA key - apt-get update - apt-get install -y gnupg dirmngr curl - - # Import Mozilla PPA signing key and add repository - mkdir -p /root/.gnupg /etc/apt/keyrings - chmod 700 /root/.gnupg - curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x0AB215679C571D1C8325275B9BDB3D89CE49EC21" | \ - gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/keyrings/mozillateam.gpg --import - chmod 644 /etc/apt/keyrings/mozillateam.gpg - - echo "deb [signed-by=/etc/apt/keyrings/mozillateam.gpg] http://ppa.launchpad.net/mozillateam/ppa/ubuntu noble main" \ - > /etc/apt/sources.list.d/mozilla-ppa.list - - # Pin PPA firefox over snap transitional package - cat > /etc/apt/preferences.d/mozilla-ppa << 'PINEOF' - Package: firefox* - Pin: release o=LP-PPA-mozillateam - Pin-Priority: 1001 - PINEOF - -- trigger: post-update - action: |- - #!/bin/bash - set -eux - passwd -l root - -- trigger: post-packages - action: |- - #!/bin/bash - set -eux - fc-cache -f -v - - # SSH — password auth only, root login via sudo - sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config - sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config - systemctl enable ssh - - # zram swap: half of RAM, zstd compressed - printf '[zram0]\nzram-size = ram / 2\ncompression-algorithm = zstd\n' > /etc/systemd/zram-generator.conf - -- trigger: post-files - action: |- - #!/bin/bash - set -eux - systemctl enable grow-rootfs.service - systemctl enable systemd-resolved - mkdir -p /boot/efi - dpkg -i /opt/debs/*.deb - rm -rf /opt/debs - KVER=$(ls -1t /lib/modules | head -1) - update-initramfs -c -k "$KVER" - /etc/kernel/postinst.d/zz-update-boot "$KVER" - -mappings: - architecture_map: debian diff --git a/distros/ubuntu2404/nm-dns.conf b/distros/ubuntu2404/nm-dns.conf deleted file mode 100644 index c81a643..0000000 --- a/distros/ubuntu2404/nm-dns.conf +++ /dev/null @@ -1,2 +0,0 @@ -[main] -dns=systemd-resolved diff --git a/docker/image-builder/entrypoint-multi.sh b/docker/image-builder/entrypoint-multi.sh index eced5de..156fb23 100644 --- a/docker/image-builder/entrypoint-multi.sh +++ b/docker/image-builder/entrypoint-multi.sh @@ -5,7 +5,7 @@ set -ex IMG_SIZE="${IMG_SIZE:-32000}" SKIP_CHROOT="${SKIP_CHROOT:-false}" -DISTROS="${DISTROS:-ubuntu2404 ubuntu2604 arch alpine cachyos}" +DISTROS="${DISTROS:-ubuntu2604 arch alpine cachyos}" STAGING="/tmp/build-staging" EFI_LABEL="boot" IMG="/output/ps5-multi.img"