🖥️ Framebuffer console
A 640×480 pvr2fb console on the PowerVR2 — plug in a TV/Monitor and a Dreamcast keyboard and you have a terminal.
// GNU/Linux on the Sega Dreamcast · SH4
A modern 7.x kernel, a BusyBox base and a ~140-package userland — booting on real Dreamcast hardware from a humble GD-ROM. Kernel built in a Docker environment; userland cross-compiled with T2 SDE.
✓ Tested on real hardware · MIT licensed · No emulator required
Linux version 7.1.2 (root@build) (sh4-linux-gcc (GCC) 15.2.0, GNU ld 2.45.1) #3 PREEMPT Sat Jun 27 2026 Booting machvec: Sega Dreamcast Kernel command line: console=ttySC1,115200 panic=3 ip=dhcp Zone ranges: Normal [mem 0x000000000c000000-0x000000000cffffff] PVR=040205c1 CVR=00000000 PRR=00000000 I-cache : n_ways=1 n_sets=256 way_incr=8192 D-cache : n_ways=1 n_sets=512 way_incr=16384 virtual kernel memory layout: lowmem : 0x8c000000 - 0x8d000000 ( 16 MB) (cached) .text : 0x8c001000 - 0x8c395408 (3665 kB) SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 intc: Registered controller 'sh7750' with 20 IRQs Calibrating delay loop (skipped)... 199.50 BogoMIPS PRESET (lpj=399012) CPU: SH7750 Memory: 10524K/16384K available (3661K kernel code, 205K rwdata, 916K rodata, 160K init, 102K bss, 5244K reserved) Performance Events: sh7750 support registered Advanced Linux Sound Architecture Driver Initialized. DMA: Registering g2_dmac handler (4 channels). PCI host bridge to bus 0000:00 pci 0000:00:00.0: [11db:1234] type 00 class 0x020000 conventional PCI endpoint PCI: Fixing up device 0000:00:00.0 maple: bus core now registered NET: Registered PF_INET protocol family TCP: Hash tables configured (established 1024 bind 1024) sq: Registering store queue API. maple (null): detected Dreamcast Mouse: function 0x200: at (0, 0) maple (null): detected Dreamcast Controller: function 0x1: at (1, 0) maple (null): detected Keyboard: function 0x40: at (2, 0) maple (null): detected Dreamcast Controller: function 0x1: at (3, 0) maple (null): detected Visual Memory: function 0xE: at (3, 1) squashfs: version 4.0 (2009/01/31) Phillip Lougher Console: switching to colour frame buffer device 80x30 fb0: NEC PowerVR2 (rev 1.1) frame buffer device, using 600k/8192k of video memory fb0: Mode 640x480-16 pitch = 1280 cable: VGA video output: VGA sqremap: NEC PowerVR2 [2048 pages] va 0xe0000000 pa 0xa5000000 SuperH (H)SCI(F) driver initialized sh-sci.1: ttySC1 at MMIO 0xffe80000 (irq = 56, base_baud = 0) is a scif printk: legacy console [ttySC1] enabled Dreamcast_visual_memory 3:01.E: VMU LCD at (3, 1) registered as vmu_lcd0 8139too 0000:00:00.0 eth0: RealTek RTL8139 at 0x(ptrval), 00:d0:f1:03:21:ca, IRQ 99 PPP generic driver version 2.4.2 Dreamcast_visual_memory 3:01.E: VMU device at partition 0 has 240 user blocks with a root block at 255 SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256). gdrom: CD-ROM DRIVE from SE with firmware 6.42 gdrom: Registered with major number 254 cdrom: Uniform CD-ROM driver Revision: 3.20 input: Keyboard as /devices/maple/2:00.40/input/input0 input: Dreamcast Mouse as /devices/maple/0:00.200/input/input1 input: Dreamcast Controller as /devices/maple/1:00.1/input/input2 AICA AICA: ALSA Driver for Yamaha AICA Super Intelligent Sound Processor random: crng init done 8139too 0000:00:00.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1 Sending DHCP requests ., OK IP-Config: Got DHCP answer from 192.168.0.1, my address is 192.168.0.38 device=eth0, hwaddr=00:d0:f1:03:21:ca, ipaddr=192.168.0.38, mask=255.255.255.0, gw=192.168.0.1 ALSA device list: #1: Yamaha AICA Super Intelligent Sound Processor for SEGA Dreamcast Freeing unused kernel image (initmem) memory: 160K Run /init as init process ISO 9660 Extensions: RRIP_1991A root@dreamcast:/$ _
Real boot log — Linux 7.1.2 on actual Dreamcast hardware, scroll it. ▶ Watch it boot · raw dmesg
Dreamcast Linux running on real hardware. Click any shot to enlarge.
htopDOOMA real, usable Linux system on 28-year-old console hardware — not a tech demo.
A 640×480 pvr2fb console on the PowerVR2 — plug in a TV/Monitor and a Dreamcast keyboard and you have a terminal.
Broadband Adapter (RTL8139) support with full TCP/IP, NFS mounts and remote login over the wire.
Read and write the Visual Memory Unit as a block device, including the on-VMU LCD and vmufat filesystem.
Native GD-ROM driver — boot and mount the giga-disc directly, or run from GDEMU / dcload.
~140 packages on the GD-ROM, mounted writable via overlayfs. Available as musl or uClibc builds.
Controllers, keyboards and peripherals on the Maple bus are probed and exposed as standard input devices.
A current 7.x SH4 kernel with a kernel-integrated initramfs — no separate initrd juggling required.
Every sane kernel change is sent upstream to mainline rather than kept as a private fork — so Dreamcast support keeps improving for everyone, not just this distro.
The ~140 userland packages are cross-compiled with T2 SDE, the System Development Environment for fully source-based distributions.
fbdoom ships in the userland — DOOM rendered straight to the Dreamcast framebuffer.
A tiny custom init — just ~5 KB — brings the system up while using as little of the 16 MB as possible. Every byte counts here.
The lightweight mksh (MirBSD Korn Shell) is the default shell — small, fast and a comfortable fit for a memory-tight system.
Grab a bootable image from the latest release. Burn the CDI, drop it on a GDEMU, or load the raw binary with dcload.
vmufat support as filesystem of VMUs with Adrian McMenamin's codefbdoom shipped in the userland.fbset,
libsdl,
inetutils (for telnet),
xinetd (to start telnetd),
cmatrix,
text2lcd,
vmu_lcd_text
| Image | What it is | For |
|---|---|---|
base-busybox |
Kernel + initrd with a minimal BusyBox shell. NFS, GD-ROM mounts and more. | Smallest bootable system / debugging |
with-userland |
Full system, ~140 packages on GD-ROM via overlayfs. musl or uClibc. |
The complete distro |
userland |
Just the userland files, no kernel. | Custom roll-your-own images |
kernel-boot.bin |
Plain executable. | Loading via dcload-serial |
1ST_READ.BIN |
Scrambled executable. | Burning a self-booting CD |
It runs on metal. Add your console via a PR to the repo.
| Boot medium | Revision | Status |
|---|---|---|
| GDEMU · dcload-serial · dcload-ip | HKT-3030, PAL E, Rev. 1 | ✓ Works |
| GD-ROM · dcload-serial | HKT-3000, NTSC-J (670-14071E) | ✓ Works |
| GD-ROM · dcload-serial | HKT-3020, NTSC-U, Rev. 1 (670-14081B) | ✓ Works |
| GDEMU | HKT-3020, NTSC-U, Rev. 1 (670-14081M) | ✓ Works |
| GDEMU | HKT-3020, NTSC-U, Rev. 1 (670-14081K) | ✗ Stuck at SEGA screen |
| Emulators (flycast, lxdream, redream, GXemul) | various | ✗ Not yet |
Full per-device notes and emulator analyses live in the repo's debuggings/ directory and the README.
Linux on the Dreamcast is not new. Back in 2000–2001, the GNU/Linux on SEGA Dreamcast team made the impossible boot — a full Linux distribution on a 2.4 kernel, running on a games console with just 16 MB of RAM. In the years since, the Linux-SH developers carried that work into the mainline kernel — which is why a modern 7.x kernel boots on this hardware today. This project exists to carry that torch forward, and it owes everything to the people who got there first.
Who started the Linux/SuperH port back in 1998 — building the GNU toolchain and the sh3/sh4 architecture support that every Dreamcast kernel since has been built on.
Author of the original GNU/Linux on SEGA Dreamcast — the patched 2.4.5 kernel and Debian-based live CD with working X11, networking and framebuffer, back in 2001.
m17n.org/linux-sh/dreamcastLong-time maintainer of the SuperH (arch/sh) architecture upstream — the reason Dreamcast support lives in the mainline kernel at all.
The current SuperH maintainer — who stepped in to keep arch/sh from being removed from the kernel and still actively cares for the architecture. The direct reason a modern 7.x kernel boots on this hardware today.
Author of much of the Dreamcast's mainline hardware support — the VMU maple-bus driver, the vmu-flash MTD device and the vmufat filesystem this distro still builds on.
Whose reverse-engineering and documentation of the Dreamcast — the boot process, the IP.BIN format and the makeip / scramble tools — are what let this distro build a self-booting disc at all.
Who packaged and shared the unofficial DcLinux DiscJuggler image (2001) so the rest of us could actually boot it.
The Linux-SH kernel hackers, the homebrew and dcemulation scene, the GCC / binutils / glibc and T2 SDE maintainers, and every contributor whose name didn't fit on a card. These few are named for what this project leans on directly — but none of it works without the many. Thank you.