Builds bootable Linux USB images for PlayStation 5 using Docker containers. Supports Ubuntu 26.04, Arch, CachyOS (Gamescope + Steam), and full Kali Linux, individually or as a multi-distro image with kexec switching.
- Docker (with permission to run
--privilegedcontainers) — install as per your distro's instructions - ~30GB free disk space for Ubuntu, Arch, or CachyOS; a full Kali build needs
substantial working space because it creates a 96GB image and a full rootfs
tree (
~150GBfree recommended for a clean Kali build)
Once Docker is installed, add your user to the docker group and apply it without logging out:
sudo usermod -aG docker $USER
newgrp docker# Build a single Ubuntu 26.04 image
./build_image.sh --distro ubuntu2604
OR
# Build CachyOS (Arch-based, Gamescope + Steam Big Picture)
./build_image.sh --distro cachyos
OR
# Build Kali Linux (XFCE + kali-linux-everything)
./build_image.sh --distro kali
OR
# Build a multi-distro image (ubuntu2604 + arch + cachyos)
./build_image.sh --distro allThe script auto-clones the kernel source, applies PS5 patches, compiles, and builds the image. Subsequent runs reuse cached artifacts automatically. Press Ctrl+C at any time to abort cleanly.
sudo dd if=output/ps5-ubuntu2604.img of=/dev/sdX bs=4M status=progressThe Kali image uses UTC by default and enables ntpsec. PS5 hardware may boot
Linux without a correct real-time clock, so the displayed time can be wrong
until a network connection is available. The Kali recipe configures IPv4 NTP
sources that were validated through Android USB tethering, because that
connection may not provide usable IPv6 routing.
The Xfce clock's Time and Date window is the legacy time-admin utility.
On Kali it can report that NTP support is not installed even though ntpsec
is installed and active. Verify or repair synchronization from a terminal:
systemctl --no-pager status ntpsec
ntpq -pn
timedatectl statusIf the PS5 clock is still wrong after the internet connection is active, force one initial correction and restart continuous synchronization:
sudo systemctl stop ntpsec
sudo ntpd -gq -c /etc/ntpsec/ntp.conf
sudo systemctl start ntpsec
dateTo use a local timezone after boot, for example Kentucky:
sudo timedatectl set-timezone America/Kentucky/Louisville
timedatectl statusThe Kali image builds and installs the PS5 IW620 mwifiex modules for the
PS5-patched kernel. On boot, ps5-iw620.service copies the console-specific
firmware dumped by ps5-linux-loader from /boot/efi/lib/nxp/ into
/lib/firmware/nxp/, loads the driver, and enables WiFi radio. If the firmware
payload is present, NetworkManager should expose the internal interface as
mlan0 and the Xfce network applet can be used to scan and connect.
The Kali desktop autologin is enabled for local first boot. SSH is installed
but disabled by default because the initial local account is kali with
password kali. Before enabling remote access, change that password:
passwd
sudo systemctl enable --now sshThe image holds its installed kernel packages and protects the boot-copy hook from deploying a generic Kali kernel. Do not replace or unhold the PS5 kernel unless you are intentionally testing a new PS5-patched kernel build.
Ghidra is configured to use JDK 21, its documented supported runtime. Full Kali installations may also contain newer Java versions for other software.
kali-linux-everything installs NFS client components, but the PS5-patched
kernel has NFS disabled. A failed run-rpc_pipefs.mount unit can therefore be
reported at boot; it only indicates that NFS mounts are unavailable. The Kali
desktop and security tools are unaffected.
The full Kali toolset also enables chkrootkit.timer; its daily integrity scan
can use noticeable CPU time while it runs.
| Flag | Description | Default |
|---|---|---|
--distro |
ubuntu2604, arch, cachyos, kali, or all |
ubuntu2604 |
--kernel |
Path to kernel source directory | auto-clone version selected by PS5 patch set |
--img-size |
Disk image size in MB | 12000 (32000 for all, 98304 for kali) |
--clean |
Remove all cached build artifacts and start fresh | off |
--kernel-only |
Build and package the kernel only, then exit | off |
--patches-ref |
Branch, tag, or commit SHA for patches | v1.2 |
The build automatically skips stages that have already completed:
- Kernel source — reused if
work/linux/exists - Kernel packages — reused if
.deb/.pkg.tar.zstfiles exist inlinux-bin/ - Root filesystem — reused if chroot directories are populated
Use --clean to wipe everything and rebuild from scratch. The build will also suggest --clean if a stage fails.
PS5 Linux Image Builder
=======================
Distro: all
(ubuntu2604 arch cachyos)
Image size: 32000MB
Kernel src: /path/to/work/linux
Stages:
1. Kernel cached
2. Root filesystem build
3. Disk image build
Logs: /path/to/build.log
✓ Kernel packages (cached)
✓ Build image builder image
⠹ Building arch rootfs
All verbose output goes to build.log. The terminal shows a spinner with live progress.
| Distro | Desktop | Kernel format | Init |
|---|---|---|---|
| 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 |
| Kali Linux Rolling | XFCE + kali-linux-everything |
.deb |
systemd |
--distro all builds a 32GB image with 4 partitions (one EFI boot partition plus three 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 | arch | Arch rootfs |
| p4 | ext4 | cachyos | CachyOS rootfs |
The boot partition contains kexec scripts to switch between distros at runtime. Ubuntu 26.04 is the default boot target.
Use --kernel-only to compile the PS5 kernel and produce installable packages without building a full disk image.
./build_image.sh --kernel-only # .deb (default)
./build_image.sh --kernel-only --distro all # .deb + .pkg.tar.zst
./build_image.sh --kernel-only --patches-ref main # fetch from specific branch/tag
./build_image.sh --kernel-only --clean # wipe and rebuild from scratchOutput packages are written to linux-bin/. Install on a running PS5 Linux system:
sudo dpkg -i linux-bin/linux-ps5_*.debbuild_image.sh # Image builder (also supports --kernel-only)
docker/
kernel-builder/ # Kernel compilation container
kernel-builder-arch/ # Repackages .deb kernel as .pkg.tar.zst
image-builder/
Dockerfile # Image building container (distrobuilder)
entrypoint.sh # Single-distro build logic
entrypoint-multi.sh # Multi-distro build logic
distros/
ubuntu2604/ # Ubuntu 26.04 (Resolute)
arch/ # Arch Linux
cachyos/ # CachyOS repos + Gamescope/Steam
kali/ # Kali Linux Rolling
shared/ # Kernel postinst hooks (single + multi)
boot/
cmdline.txt # Kernel cmdline template (__DISTRO__ placeholder)
vram.txt # VRAM allocation
kexec-{ubuntu2604,arch,cachyos}.sh
work/ # Build artifacts (auto-created)
linux-bin/ # Compiled kernel packages
output/ # Final .img files