PinePhone Pro/Create a multi-distribution image using rk2aw
Rk2Aw BootLoader & Multi-Distro on SD Card for PinePhonePro
References: https://xff.cz/kernels/rk2aw/rk2aw-rk3399-pinephone-pro/INSTALL and https://xnux.eu/rk2aw/
Requirements: SSH connection from linux machine to PinePhonePro, internet connection.
Note: Preloader and userspace utility to flash it are non-free.
Thanks: Megi at https://xnux.eu/log/ for the BoatLoader, and Chris Norris for improving this guide.
Flash Rk2Aw BootLoader to SPI
Connect PinePhonePro to linux machine
ssh <user>@<phoneip> # start ssh connection cd ~/Downloads # enter to directory curl -O https://xff.cz/kernels/bootloaders/ppp.tar.gz # download installer tar -xvzf ppp.tar.gz -C ~/Downloads # extract # scp -r ~/Downloads/ppp <user>@<phoneip>:~/Downloads # copy to phone, non needed sudo ./spinor-flash-initial-setup.sh # flash SPI
Flash Multi-Distro SD Card
Get distro compressed images and decompress them. (i.e. Manjaro.phosh.beta34, Mobian.6.1, ArchLinux)
Mount distro images both partitions "/boot", "/root" for each distro
lsblk # show /loop, /sd references blkid show UUID for the partition ├─loop0p1 /media/xxx/BOOT_MNJRO └─loop0p2 /media/xxx/ROOT_MNJRO ├─loop1p1 /media/xxx/boot └─loop1p2 /media/xxx/rootfs ├─loop2p1 /media/xxx/52CA-6165 └─loop2p2 /media/xxx/3d99072c-9fd6-4316-8526-9192e192c441 └─sdb disk (after each dd command you'll see the partition id name to adjust into scripts.) sudo dd if=/dev/zero of=/dev/sdb count=945728 bs=32768 status=progress # quick erase sd card. i.e. # 32GB SDcard (30989615104bytes/32768dim=945728volte) or sudo dd if=/dev/zero of=/dev/sdb count=1 bs=32768 status=progress # slow erase sd card. i.e. # 32GB SDcard (30989615104bytes/32768dim=1volta)
Partition SD Card (min 32GB)
sudo sfdisk /dev/sdb/ <<EOF label: gpt first-lba: 64 table-length: 8 start=64, size=32704, type=D7B1F817-AA75-2F4F-830D-84818A145370, name="loader", attrs=RequiredPartition size=10G, name="ALARM", attrs="RequiredPartition,LegacyBIOSBootable" size=10G, name="MANJARO", attrs="RequiredPartition,LegacyBIOSBootable" size=+, name="MOBIAN", attrs="RequiredPartition,LegacyBIOSBootable" EOF
lsblk # list partitions on sd and mounted distro images Device Start End Sectors Size Type /dev/sdb1 64 32767 32704 16M unknown /dev/sdb2 32768 16809983 16777216 8G Linux filesystem /dev/sdb3 16809984 33587199 16777216 8G Linux filesystem /dev/sdb4 33587200 60524543 26937344 12.8G Linux filesystem
Copy Files for Arch Linux ARM
sudo su # login with your psw dd if=/dev/loop2p2 of=/dev/sdb2 bs=1M status=progress conv=fsync # copy rootfs to sd part2 mount /dev/sdb2 /media/xxx/3d99072c-9fd6-4316-8526-9192e192c441 scp -r /media/xxx/52CA-6165/* /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/boot # copy bootfs to to part2/boot mv /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/boot/boot.scr /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/boot/boot.scrORIG # hide auto-menu item nano /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/etc/fstab # add PARTLABEL=ALARM and delete UUID=xxx from second line, delete /boot entry mkdir /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/boot/extlinux # add directory
cat << EOF > /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/boot/extlinux/extlinux.conf #/boot/extlinux/extlinux.conf MENU TITLE Pinephone Pro Boot Menu LABEL l0 MENU LABEL ALarm FDT /boot/dtbs/rockchip/rk3399-pinephone-pro.dtb KERNEL /boot/Image INITRD /boot/initramfs-linux.img APPEND root=PARTLABEL=ALARM console=ttyS2,115200 console=tty0 loglevel=4 rw rootwait EOF
Copy Files for ManJaro
dd if=/dev/loop0p2 of=/dev/sdb3 bs=1M status=progress conv=fsync # copy rootfs to sd part3 mount /dev/sdb3 /media/xxx/ROOT_MNJRO1/ scp -r /media/xxx/BOOT_MNJRO/* /media/xxx/ROOT_MNJRO1/boot # copy bootfs to to part3/boot nano /media/xxx/ROOT_MNJRO1/etc/fstab # change UUID=xxx to PARTLABEL=MANJARO, delete /boot line mv /media/xxx/ROOT_MNJRO1/boot/boot.scr /media/xxx/ROOT_MNJRO1/boot/boot.scrORIG # hide auto-menu item mkdir /media/xxx/ROOT_MNJRO1/boot/extlinux # add directory cat << EOF > /media/xxx/3d99072c-9fd6-4316-8526-9192e192c4411/boot/extlinux/extlinux.conf #/boot/extlinux/extlinux.conf MENU TITLE Pinephone Pro Boot Menu LABEL l0 MENU LABEL ManJaro FDT /boot/dtbs/rockchip/rk3399-pinephone-pro.dtb KERNEL /boot/Image INITRD /boot/initramfs-linux.img APPEND root=PARTLABEL=MANJARO console=ttyS2,115200 console=tty0 loglevel=4 rw rootwait EOF
Copy Files for MObian
dd if=/dev/loop1p2 of=/dev/sdb4 bs=1M status=progress conv=fsync # copy rootfs to sd part4 mount /dev/sdb4 /media/xxx/rootfs1/ scp -r /media/xxx/boot/* /media/xxx/rootfs1/boot # copy bootfs to to part4/boot nano /media/xxx/rootfs1/etc/fstab # replace UUID=xxx with PARTLABEL=MOBIAN and delete UUID=xxx from second line. Delete /boot line nano /media/xxx/rootfs1/boot/extlinux/extlinux.conf # edit path from /bootfs to /part4/boot linux /boot/vmlinuz-6.1-rockchip initrd /boot/initrd.img-6.1-rockchip fdtdir /boot/dtb-6.1-rockchip/ APPEND root=PARTLABEL=MOBIAN console=ttyS2,115200 console=tty0 loglevel=4 rw rootwait
Rk2Aw BootLoader & Multi-Distro on eMMC for PinePhonePro
Make sure you boot from the SDcard in your PPP as we are going to be building the eMMC. Note that below, arch is booted from the SDcard and the SDcard shows as /dev/mmcblk1
Flash Rk2Aw BootLoader to SPI
Same as above. Note this installs rk2aw and a bootloader to SPI NOR flash. Resulting SPI status is as follows:
# ./rk2aw-spi-flasher Machine: Pine64 PinePhonePro (pine64,pinephone-pro) SPI NOR Flash: - Total size: 16384 KiB - Erase block size: 4 KiB - Write size: 1 - Manufacturer: gigadevice - Part name: gd25lq128e - JEDEC ID: 257018
Bootable images currently present in SPI NOR flash: Idx Header Off 1 Size 1 Off 2 Size 2 Notes/content ------------------------------------------------------------------------------- 0 0 2048 6144 0 0 (padded) 0='rk2aw' 5 131072 133120 67584 200704 124928 0='U-Boot TPL' 1='U-Boot SPL' 7 524288 526336 147456 673792 124928 0='ddrbin' 1='U-Boot SPL'
Auto-calculated layout for rk2aw dual bootloader scheme: Area Offset Size --------------------------------------------------- rk2aw primary 0 65536 rk2aw backup 65536 65536 spl fallback 131072 393216 spl primary 524288 389120 itb fallback 913408 2097152 itb primary 3010560 2097152
Build Multi-Distro eMMC
In this example we are going to build 2 partitions on the eMMC, the first with Arch/phosh and the second with Arch/sxmo. We have already downloaded the images from Danct12 and decompressed them.
Mount the Images
cd ~/Downloads # enter to directory sudo su # login with your psw losetup -P /dev/loop0 archlinux-pinephone-pro-phosh-20230203.img losetup -P /dev/loop1 archlinux-pinephone-pro-sxmo-20230203.img ls -l /mnt/ mkdir /mnt/phosh mkdir /mnt/sxmo mkdir /mnt/phosh/boot mkdir /mnt/phosh/root mkdir /mnt/sxmo/boot mkdir /mnt/sxmo/root mkdir /mnt/ephosh # e for the partition on the eMMC mkdir /mnt/esxmo # e for the partition on the eMMC mount /dev/loop0p1 /mnt/phosh/boot/ mount /dev/loop0p2 /mnt/phosh/root/ mount /dev/loop1p1 /mnt/sxmo/boot/ mount /dev/loop1p2 /mnt/sxmo/root/
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 5G 0 loop ├─loop0p1 259:0 0 122M 0 part /mnt/phosh/boot └─loop0p2 259:1 0 4.9G 0 part /mnt/phosh/root loop1 7:1 0 3.5G 0 loop ├─loop1p1 259:2 0 122M 0 part /mnt/sxmo/boot └─loop1p2 259:3 0 3.4G 0 part /mnt/sxmo/root mmcblk2 179:0 0 115.2G 0 disk ├─mmcblk2p1 179:1 0 122M 0 part └─mmcblk2p2 179:2 0 115.1G 0 part mmcblk2boot0 179:32 0 4M 1 disk mmcblk2boot1 179:64 0 4M 1 disk mmcblk1 179:96 0 59.6G 0 disk ├─mmcblk1p1 179:97 0 122M 0 part /boot └─mmcblk1p2 179:98 0 59.5G 0 part / zram0 254:0 0 1.5G 0 disk [SWAP]
Prepare eMMC
dd if=/dev/zero of=/dev/mmcblk2 count=32768 bs=32768 status=progress # overwrite the front to clear any bootloaders
sfdisk /dev/mmcblk2 << EOF label: gpt first-lba: 64 table-length: 8 size=32G, name="PHOSH", attrs="RequiredPartition,LegacyBIOSBootable" size=+, name="SXMO", attrs="RequiredPartition,LegacyBIOSBootable" EOF
Checking that no-one is using this disk right now ... OK Disk /dev/mmcblk2: 115.23 GiB, 123731968000 bytes, 241664000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes >>> Script header accepted. >>> Created a new GPT disklabel (GUID: 7EB4B1E0-5F49-4F30-9F1E-E9E1F305D461). The maximal number of partitions is 8 (default is 128). /dev/mmcblk2p1: Created a new partition 1 of type 'Linux filesystem' and of size 32 GiB. /dev/mmcblk2p2: Created a new partition 2 of type 'Linux filesystem' and of size 83.2 GiB. /dev/mmcblk2p3: Done.
New situation: Disklabel type: gpt Disk identifier: 7EB4B1E0-5F49-4F30-9F1E-E9E1F305D461 Device Start End Sectors Size Type /dev/mmcblk2p1 2048 67110911 67108864 32G Linux filesystem /dev/mmcblk2p2 67110912 241661951 174551040 83.2G Linux filesystem The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 5G 0 loop ├─loop0p1 259:0 0 122M 0 part /mnt/phosh/boot └─loop0p2 259:1 0 4.9G 0 part /mnt/phosh/root loop1 7:1 0 3.5G 0 loop ├─loop1p1 259:2 0 122M 0 part /mnt/sxmo/boot └─loop1p2 259:3 0 3.4G 0 part /mnt/sxmo/root mmcblk2 179:0 0 115.2G 0 disk ├─mmcblk2p1 179:1 0 32G 0 part └─mmcblk2p2 179:2 0 83.2G 0 part mmcblk2boot0 179:32 0 4M 1 disk mmcblk2boot1 179:64 0 4M 1 disk mmcblk1 179:96 0 59.6G 0 disk ├─mmcblk1p1 179:97 0 122M 0 part /boot └─mmcblk1p2 179:98 0 59.5G 0 part / zram0 254:0 0 1.5G 0 disk [SWAP]
Build Phosh Partition
dd if=/dev/loop0p2 of=/dev/mmcblk2p1 bs=1M status=progress conv=fsync mount /dev/mmcblk2p1 /mnt/ephosh/ scp -r /mnt/phosh/boot/* /mnt/ephosh/boot mv /mnt/ephosh/boot/boot.scr /mnt/ephosh/boot/boot.scrORIG cat << EOF > /mnt/ephosh/etc/fstab #/boot/extlinux/extlinux.conf #Static information about the filesystems. #See fstab(5) for details. #<file system> <dir> <type> <options> <dump> <pass> PARTLABEL=PHOSH / ext4 rw,relatime 0 1 # UUID=52CA-6165 /boot vf rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2 mkdir /mnt/ephosh/boot/extlinux cat << EOF > /mnt/ephosh/boot/extlinux/extlinux.conf #/boot/extlinux/extlinux.conf MENU TITLE Pinephone Pro Boot Menu LABEL l0 MENU LABEL phosh FDT /boot/dtbs/rockchip/rk3399-pinephone-pro.dtb KERNEL /boot/Image INITRD /boot/initramfs-linux.img APPEND root=PARTLABEL=PHOSH console=ttyS2,115200 console=tty0 loglevel=4 rw rootwait EOF
Build SXMO Partition
We have unmounted all the phosh devices, so
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 5G 0 loop ├─loop0p1 259:0 0 122M 0 part └─loop0p2 259:1 0 4.9G 0 part loop1 7:1 0 3.5G 0 loop ├─loop1p1 259:2 0 122M 0 part /mnt/sxmo/boot └─loop1p2 259:3 0 3.4G 0 part /mnt/sxmo/root mmcblk2 179:0 0 115.2G 0 disk ├─mmcblk2p1 179:1 0 32G 0 part └─mmcblk2p2 179:2 0 83.2G 0 part mmcblk2boot0 179:32 0 4M 1 disk mmcblk2boot1 179:64 0 4M 1 disk mmcblk1 179:96 0 59.6G 0 disk ├─mmcblk1p1 179:97 0 122M 0 part /boot └─mmcblk1p2 179:98 0 59.5G 0 part / zram0 254:0 0 1.5G 0 disk [SWAP] dd if=/dev/loop1p2 of=/dev/mmcblk2p2 bs=1M status=progress conv=fsync mount /dev/mmcblk2p2 /mnt/esxmo/ scp -r /mnt/sxmo/boot/* /mnt/esxmo/boot mv /mnt/esxmo/boot/boot.scr /mnt/esxmo/boot/boot.scrORIG cat << EOF > /mnt/esxmo/etc/fstab # Static information about the filesystems. # See fstab(5) for details. # <file system> <dir> <type> <options> <dump> <pass> PARTLABEL=SXMO / ext4 rw,relatime 0 1 # UUID=841C-F9DD /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2 EOF mkdir /mnt/esxmo/boot/extlinux cat << EOF > /mnt/esxmo/boot/extlinux/extlinux.conf #/boot/extlinux/extlinux.conf MENU TITLE Pinephone Pro Boot Menu LABEL l0 MENU LABEL sxmo FDT /boot/dtbs/rockchip/rk3399-pinephone-pro.dtb KERNEL /boot/Image INITRD /boot/initramfs-linux.img APPEND root=PARTLABEL=SXMO console=ttyS2,115200 console=tty0 loglevel=4 rw rootwait EOF
Follow-Up Comments
- On first boot neither phosh nor sxmo resized their partition - sudo resize2fs sorted that.
- Any time an update rebuilds the initramfs it is necessary to delete /boot/boot.scr again to keep the rk2aw menu clean.
- The end result is a boot screen as follows: