PinePhone - Instructions for creating a PureOS image for PinePhone

Instructions for creating a PureOS Image for PinePhone by mozzwald

You will need u-boot-tools package for your distro and it helps to have binfmt and qemu packages for chrooting to the image. Paths and devices may be different on your system. Always verify before blindly copying and pasting commands.

Make a new working directory

mkdir ~/purepp
cd ~/purepp

Download and extract PinePhone phosh image (check for newer releases if you like)

wget https://images.postmarketos.org/pinephone/pine-pinephone-20200218-phosh.img.xz
unxz -d pine-pinephone-20200218-phosh.img.xz

Download and extract PureOS Librem 5 image (check for newer releases if you like)

wget http://downloads.pureos.net/amber/phone/gnome/librem5/2020-02-25/librem5.img.xz
unxz -d librem5.img.xz

Make temporary dirs for mounting images

mkdir pmos-boot pmos-root pureos-boot pureos-root

List used loop devices

losetup -a

List all loop devices

ls /dev/loop*

The remaining commands should be run with sudo or as root user (sudo su)

Pick an unused loop device (5 in my case) and mount pmOS image with partitions

losetup -P /dev/loop5 pine-pinephone-20200218-phosh.img

Pick an unused loop device (6 in my case) and mount PureOS image with partitions

losetup -P /dev/loop6 librem5.img

Get pmOS PinePhone bootloader

dd if=/dev/loop5 of=uboot-pmos.bin count=2048

Put pmOS PinePhone bootloader on PureOS image

dd if=uboot-pmos.bin of=/dev/loop6 bs=1024 skip=8 seek=8

Mount partitions

mount /dev/loop5p1 pmos-boot
mount /dev/loop5p2 pmos-root
mount /dev/loop6p1 pureos-boot
mount /dev/loop6p2 pureos-root

Copy PinePhone kernel & dtb to PureOS image

cp pmos-boot/vmlinuz-postmarketos-allwinner pureos-boot/
cp pmos-boot/sun50i-a64-pinephone.dtb pureos-boot/

Copy PinePhone modules to PureOS image

cp -pRv pmos-root/lib/modules/5.5.0 pureos-root/lib/modules/

Copy PinePhone firmware to PureOS image

cp -pRv pmos-root/lib/firmware pureos-root/lib/

Make u-boot initramfs from PureOS initramfs

mkimage -A arm -O linux -T ramdisk -C gzip -d pureos-boot/initrd.img pureos-boot/uInitrd.img

Get uboot-script

wget https://mozzwald.com/pp/pureos-uboot-script.cmd -O pureos-boot/boot.cmd

Compile uboot script

mkimage -A arm64 -T script -C none -d pureos-boot/boot.cmd pureos-boot/boot.scr

Put helper files into rootfs

wget https://mozzwald.com/pp/pureos-pp-helpers.tar.gz
cd pureos-root
tar -pxvf ../pureos-pp-helpers.tar.gz

If you have binfmt setup for arm64/aarch64 then you can chroot and enable modem service and do whatever else you want. Otherwise this needs done after bootup

cp /usr/bin/qemu-aarch64-static usr/bin/
chroot ./
systemctl enable pinephone.service # enable modem service
exit
cd ..

Unmount disk images

umount pmos-boot pmos-root pureos-boot pureos-root
losetup -d /dev/loop5
losetup -d /dev/loop6

Copy the new image to SD card

dd if=librem5.img of=/dev/your-sd-card-device bs=1M

Optionally resize PureOS Root partition on SD card

Put in PinePhone and boot. WIN!

Default username: purism
Default password: 123456

Last updated