This documents a from-scratch install of Chimera Linux on a pseries
QEMU/KVM VM running on a POWER9 host, with a PReP boot partition and GRUB
(powerpc-ieee1275 target).
Verification status: the GRUB/PReP step (grub-install /dev/vda1) and
overall flow have been run for real and reported straightforward. Package
names and dinit-specific commands below are verified against Chimera's
actual repo and official docs, but the full sequence hasn't been run
start-to-finish end to end, and a couple of spots are flagged inline as
unconfirmed.
PowerPC installs are unusually fragile compared to x86/UEFI mainly because
there's no BIOS/UEFI boot menu convenience. The firmware is Open Firmware
(SLOF under QEMU pseries), which boots from a raw PReP partition
containing GRUB's core.img directly — no ESP, no bootloader search
heuristics like UEFI has.
Chimera ppc64 (big-endian) |
|
|---|---|
| Package repo | https://repo.chimera-linux.org/current/main/ppc64/ |
| Kernel package | linux-lts (LTS track) or linux-stable (mainline track) |
| GRUB package | grub-powerpc-ieee1275 (architecture-locked) |
| Bootloader install | grub-install /dev/vda1 — targets the PReP partition directly, no extra flags needed |
| Init system | dinit |
| Privilege escalation | doas (opendoas package) |
| Network | dhcpcd + dhcpcd-dinit |
| SSH | openssh + openssh-dinit |
Chimera also publishes a ppc64le repo
(https://repo.chimera-linux.org/current/main/ppc64le/) if you need that
instead.
- Disk: 50GB is comfortable. Layout:
vda1— 9 MiB, PReP boot partition (no filesystem)vda2— ~43 GiB, ext4, rootvda3— ~7 GiB, swap
- VM specs:
- libvirt/QEMU,
machine='pseries-10.2',cpu model='POWER9', 8 vCPUs, 8GiB RAM - Disk:
virtio-blk, backed by a qcow2 image - NIC:
virtiomodel - Install media: attached as a
scsicdrom (virtio-scsicontroller) - A serial console is essential:
<serial type='pty'><target type='spapr-vio-serial'/></serial>. This is your only way to interact with the SLOF firmware and the GRUB shell — there's no graphical framebuffer to fall back on. Access it withvirsh console <domain>(needs a real pty — allocate one withssh -ttif you're driving this over SSH, or run it in a local terminal).
- libvirt/QEMU,
Chimera provides bootstrap tarballs (bare userland + apk, for
container-style installs), full tarballs (complete non-graphical system, no
kernel/bootloader — for fully manual chroot-style installs), and live ISOs
for "most POWER architecture systems." Get whichever matches your plan from
the Chimera Linux project.
- Attach the install media to the VM as a cdrom device with
<boot order='1'/>, ahead of the disk (<boot order='2'/>on thevirtiodisk). - Start the VM and attach to the console:
virsh start <domain> virsh console <domain> - Once installed, remember to flip the boot order back (or detach the install media) — otherwise every reboot lands back in the installer instead of the real disk, since SLOF always tries boot order 1 first and a live/install image is a valid bootable target every time.
From inside the live/install environment, partition the target disk
(assume /dev/vda):
fdisk /dev/vda
g— create a new empty GPT partition tablen— new partition 1, size+9M(a PReP partition needs to be small; a handful of MB is plenty for GRUB'score.img)t— change its type; search for "PowerPC PReP boot" and select it
n— new partition 2, most of the remaining space, default type (Linux filesystem)n— new partition 3, remaining space for swapt— set its type to Linux swap
w— write the table
Format and mount:
mkfs.ext4 /dev/vda2
mkswap /dev/vda3
swapon /dev/vda3
mount /dev/vda2 /mnt
Sanity-check with lsblk -o NAME,SIZE,TYPE,FSTYPE,PARTTYPE,PARTLABEL,MOUNTPOINT /dev/vda
before continuing: vda1 should have no FSTYPE (it stays raw — GRUB
writes its core.img directly to the block device, not to a filesystem),
vda2 should show ext4 and be mounted at /mnt, and vda3 should show
swap.
chimera-bootstrap -l /mnt
-l bootstraps from local packages/mirror into the target directory. By
default this installs the base-full package group into the root; the
kernel is not part of base-full and gets installed explicitly in the next
step.
genfstab -U /mnt >> /mnt/etc/fstab
chimera-chroot /mnt
chimera-chroot mounts the pseudo-filesystems (/dev, /proc, /sys)
and sets up network access for you automatically — use it rather than a
bare chroot, which would leave /dev empty and break things like sshd
later.
apk add linux-lts grub-powerpc-ieee1275 shadow bash opendoas openssh openssh-dinit dhcpcd dhcpcd-dinit
A few things worth being explicit about here, since they're easy to miss:
- The
dinitservice files are separate subpackages.opensshgives you thesshdbinary but not itsdinitservice definition — that's inopenssh-dinit. Same split fordhcpcd/dhcpcd-dinit. Forgetting the-dinitpackage means there's nothing to enable in step 4.6/4.7 even though the program itself is installed. shadowprovidesuseradd/passwd(standard GNU shadow-utils) — install it explicitly rather than assuming it's part ofbase-full.bashlikewise isn't guaranteed to be your default shell out of the box; install it explicitly if you want it as a login shell.
Rebuild the initramfs after installing the kernel:
update-initramfs -c -k all
echo chimera-power > /etc/hostname
passwd root
useradd -m -G wheel -s /bin/bash yourusername
passwd yourusername
Grant the wheel group access via doas's config, /etc/doas.conf:
echo 'permit persist :wheel' > /etc/doas.conf
Authorize your SSH key for the new user:
mkdir -p /home/yourusername/.ssh
echo '<your public key>' >> /home/yourusername/.ssh/authorized_keys
chown -R yourusername:yourusername /home/yourusername/.ssh
chmod 700 /home/yourusername/.ssh
chmod 600 /home/yourusername/.ssh/authorized_keys
grub-install /dev/vda1
update-grub
Just the PReP partition device, no --target/--boot-directory flags
needed. This matches Chimera's own docs, which state that on PReP systems
grub-install targets the PReP partition directly. grub-powerpc-ieee1275
is an architecture-locked package, so there's no ambiguity about which
target to build for.
update-grub is Chimera's grub-mkconfig wrapper (writes
/boot/grub/grub.cfg) — run it after grub-install, and again any time
you change /etc/default/grub or install a new kernel.
Unconfirmed — watch for this: GRUB defaulting to
gfxterm(a graphical terminal) can crash withno suitable video mode foundon SLOF's serial-only console, which has no framebuffer — this drops you into an interactivegrub>shell instead of showing the boot menu. This is general GRUB behavior on this firmware, not confirmed either way for Chimera's default config specifically. If you land at agrub>prompt instead of a menu after rebooting, check/etc/default/grubforGRUB_TERMINAL_OUTPUTand set it toconsole, then rerunupdate-grub.
dhcpcd handles DHCP directly, configured via /etc/dhcpcd.conf (the
default behavior is to DHCP-configure all interfaces, so the stock config
file needs no edits for a basic setup).
Since dinitctl doesn't work inside a chroot (there's no running dinit
instance to talk to), enable the service by symlinking it manually into the
boot runlevel directory instead:
ln -s /usr/lib/dinit.d/dhcpcd /etc/dinit.d/boot.d/dhcpcd
Once you've rebooted into the real system (not chroot), dinitctl works
normally and this is the equivalent of what dinitctl enable dhcpcd does
under the hood.
Same manual-symlink pattern as networking, for the same reason (no live
dinit instance inside a chroot):
ln -s /usr/lib/dinit.d/sshd /etc/dinit.d/boot.d/sshd
(Verify the exact service name shipped by openssh-dinit — sshd is the
expected name following the package's own binary name, but hasn't been
independently confirmed here the way the package names above were.)
Exit the chroot, unmount, and detach the install media (or demote its boot order below the disk), then restart the VM:
exit
umount -R /mnt
Then, from the host (not the VM):
virsh detach-disk <domain> <cdrom-or-install-media-target> --config --live
virsh destroy <domain>
virsh start <domain>
Watch the console — you should see: SLOF → PReP partition → GRUB → kernel boot → login prompt, all without manual intervention.
If you end up at an interactive grub> prompt:
grub> insmod part_gpt
grub> insmod ext2
grub> ls
GRUB names disks by Open Firmware device path, not hd0-style BIOS names —
expect something like
(ieee1275/disk) (ieee1275/disk,gpt1) (ieee1275/disk,gpt2) (ieee1275/disk,gpt3).
Find your root and check what the kernel/initramfs are actually named
before booting manually (these haven't been independently confirmed for
Chimera the way they were for other distros' naming conventions):
grub> ls (ieee1275/disk,gpt2)/boot/
grub> linux (ieee1275/disk,gpt2)/boot/<kernel-image> root=UUID=<your-root-uuid> rw
grub> initrd (ieee1275/disk,gpt2)/boot/<initramfs-image>
grub> boot
Or, to test whether grub.cfg itself is reachable/valid without going
through the full normal auto-boot flow:
grub> set root=(ieee1275/disk,gpt2)
grub> configfile (ieee1275/disk,gpt2)/boot/grub/grub.cfg
| Concern | Chimera Linux |
|---|---|
| Package manager | apk |
| Bootstrap tool | chimera-bootstrap -l <target> |
| Chroot tool | chimera-chroot <target> (auto-mounts /dev, /proc, /sys) |
| Kernel package | linux-lts / linux-stable |
| GRUB package | grub-powerpc-ieee1275 |
| Bootloader install | grub-install /dev/vda1 (PReP partition directly, no extra flags) |
| Regenerate GRUB config | update-grub |
| Regenerate initramfs | update-initramfs -c -k all |
| Enable a service | dinitctl enable <svc> (running system) / manual symlink into /etc/dinit.d/boot.d (chroot) |
| Service files | separate -dinit subpackages (e.g. openssh-dinit, dhcpcd-dinit) — install alongside the main package |
| Privilege escalation | doas — permit persist :wheel in /etc/doas.conf |
| Network client | dhcpcd, configured via /etc/dhcpcd.conf |
If you hit anything beyond what's flagged as unconfirmed above, it's worth folding back into this doc.