Image Flavours
Every image is the same image.nix derivation with different contents and geometry.
Sizes are megabytes.
x86_64
| Package | File | ESP | Root | Notes |
|---|---|---|---|---|
image | puredarwin.img | 64 | 6144 | The full system: X11, Wayland, Xfce, Wine, toolchains |
image-debug | puredarwin.img | 64 | 6144 | Same, built against the debug kernel |
image-stripped | puredarwin-stripped.img | 64 | 6144 | Base system plus a small library and test set |
image-wayland | puredarwin-wayland.img | 64 | 6144 | Wayland only: no X11 clients, no Xfce, sway and GTK built without X |
image-minimal | puredarwin-minimal.img | 60 | 200 | The usual boot-test image |
image-minimal-debug | puredarwin-minimal-debug.img | 64 | 384 | Minimal, debug kernel, tracing on |
image-hfs | puredarwin.img | 64 | 6144 | HFS+ root, for bisection and for macOS users |
Newer images, built on the same derivation:
| Package | Notes |
|---|---|
image-gpu | The Argon desktop with the amdgpu, i915 and nouveau drivers in the auxiliary kernel collection, their firmware and the system Mesa. Also carries BOOTIA32.EFI for 32-bit UEFI machines |
image-gpu-sb | image-gpu signed for Secure Boot, with a Microsoft-signed shim and PUREDARWIN.cer to enroll |
image-gpu-legacy | image-gpu with a BIOS boot stack in the MBR |
image-legacy, image-legacy-minimal | BIOS boot for the full and minimal images |
image-ia32, image-ia32-dual | For 32-bit UEFI firmware. The dual image carries both loaders |
image-apfs-minimal | Minimal image with an APFS root |
image-wayland-minimal | The desktop session over a small base, the base of image-gpu |
image-hfs has two uses.
The first is bisection. When something looks like filesystem corruption, booting the
same system on Apple’s own hfs.kext tells you whether the ext4 driver is the culprit.
It has been the deciding test more than once.
The second is for macOS users who want to open the image and change something. Every other image has an ext4 root, and macOS cannot mount ext4 without our own kext, which is not much help when the thing you are trying to modify is the image that contains it. An HFS+ root mounts on a Mac without ceremony. This is the mildly absurd consequence of supporting a filesystem Apple does not: the Linux-native option is the one a Mac cannot read.
arm64
| Package | ESP | Root | Notes |
|---|---|---|---|
image-arm64-virt | 64 | 6144 | QEMU virt, BOOTAA64.EFI |
image-arm64-virt-minimal | 768 | 512 | RAM disk root (rd=md0), 512 MB ramdisk |
image-arm64-virt-minimal-release | 64 | 512 | Release kernel, AHCI and kext logging |
image-arm64-virt-full | 64 | 3072 | Larger set, virtio-gpu debugging enabled |
netboot-arm64-virt-minimal | - | - | Netboot only, 512 MB ramdisk |
ramdisk-arm64-t8010 | - | - | iPad 6, 160 MB ext4 ramdisk, loaded by PongoOS |
image-arm64-bcm2837 | 64 | 1024 | Raspberry Pi 3, puredarwin-rpi3.img |
Geometry and RAM Disk Settings
image.nix parameters you will meet when adding a flavour:
| Parameter | Default | Meaning |
|---|---|---|
espMB | 64 | EFI system partition size |
rootMB | 6144 | Root partition size |
apfsMB | 128 | APFS test partition size |
rootFsType | ext4 | ext4 or hfs |
efiBinary | BOOTX64.EFI | BOOTAA64.EFI on arm64 |
netbootOnly | false | Produce netboot artifacts and no disk image |
useRamdisk | false | Root from a RAM disk |
ramdiskMB | 128 | RAM disk size |
ramdiskPrune | empty | Paths to drop from the RAM disk only |
bootArgs | see below | Written to \EFI\BOOT\boot-args.txt |
ramdiskPrune matters more than it looks. A RAM disk has to fit in memory twice over on
the way in, so anything not needed to run the system is worth removing. The T8010 image
prunes the kernels directory, every include tree, the pkgconfig directories and the
guest header staging.
Built-In Boot Arguments
The default, used by the full x86_64 images:
debug=0x218 -nogzalloc_mode keepsyms=1 serial=3 gopconsole=1 -noprogress
gen9_debug=1 serial_video_mirror=1
Per-flavour overrides:
| Flavour | boot-args |
|---|---|
image-minimal | -v debug=0x218 -nogzalloc_mode keepsyms=1 serial=3 gopconsole=1 gen9_debug=1 |
image-minimal-debug | as above plus serial_video_mirror=1 pdtrace=1 |
image-arm64-virt-minimal, netboot-arm64-virt-minimal | -v debug=0x218 -nogzalloc_mode keepsyms=1 serial=3 gopconsole=1 pdtrace=1 serial_video_mirror=1 no_interrupt_masked_debug=1 rd=md0 |
ramdisk-arm64-t8010 | -v debug=0x218 -nogzalloc_mode keepsyms=1 serial=3 serial_video_mirror=1 no_interrupt_masked_debug=1 rd=md0 |
image-arm64-bcm2837 | -v debug=0x218 -nogzalloc_mode keepsyms=1 serial=1 no_interrupt_masked_debug=1 |
image-arm64-virt-full | default plus vgpu_debug=1 |
image-arm64-virt-minimal-release | -v serial=3 ahci_debug=1 kext=0xffff io=0xffff |
The loader falls back to a built-in default if it cannot read boot-args.txt, but the
file is there so you can edit arguments without rebuilding an image. What each argument
does is in Debugging.
One row reads oddly on its own: ramdisk-arm64-t8010 sets serial=3 on a device with
no serial port. serial_video_mirror=1 is the part that matters there, because the
console the user actually sees is the iPad’s display. See
arm64 T8010.