Pinephone : Remplacer Manjaro par PostmarketOS

Pinephone : Remplacer Manjaro par PostmarketOS

Après avoir joué avec le Pinephone quelques jours sur sa Manjaro d'origine, j'ai donc eu envie d'y installer PostmarketOS (qu'on va abréger en PmOS). PmOS est une distribution Linux basée sur Alpine qui, comme son nom l'indique, s'adresse aux mobiles qui ont dépassé leur commercialisation et sont donc considérés comme obsolètes par leurs fabricants. Rappelez-vous d'Android (car ça c'est un peu amélioré depuis) où si vous vouliez une mise à jour système il fallait racheter un smartphone ... Solution économiquement idiote (sauf pour le fabricant, évidemment !) et écologiquement débile.

PmOS est donc un projet démarré en 2017 avec comme ambition de fournir une vraie distribution Linux à destination des smartphones. En effet, s'il existe plusieurs autres projets de ce type, la plupart sont en fait basés sur le kernel Android pour bénéficier de sa compatibilité avec le hardware. Il est donc conçu autour de la distribution Alpine Linux reconnue pour sa sobriété et son minimalisme tout en étant fondée sur la sécurité.

Maintenant, attaquons le vif du sujet.

Cet article n'est rien de plus qu'une reprise des éléments du Wiki de PmOS auquel j'y ajoute mon retour d'expérience de noob sur le sujet.

Liste de courses

Au début j'ai voulu faire tout ceci depuis le Pinebook ... Histoire de rester en famille, et accessoirement c'est le seul sur lequel j'ai un lecteur de microSD Card. Mais en fait ce n'est pas possible, l'outil de PmOS ne compile pas les paquets sur ARM.

De quoi avons-nous besoin :

  • Une carte microSD (l'outil fera 64MB)
  • Un PC sous Linux avec Python 3, Pip et Git installés
  • Un câble USB-C potable (j'expliquerai plus loin)
  • L'outil Jumpdrive
  • Sauvegarder vos éventuelles données du Pinephone car nous allons installer directement sur la eMMC (mémoire interne), pas en boot sur microSD

Préparer l'image PostmarketOS

PmOS propose un utilitaire du nom de pmboostrap écrit en Python. Il vous permettra de préparer l'image système à installer sur le smartphone. Il s'installe avec pip.

$ pip3 install --user pmbootstrap

Collecting pmbootstrap
  Downloading https://files.pythonhosted.org/packages/38/b0/ca29865c548873bce155b9047de96a722494c0bc999e2afe2f6e98797875/pmbootstrap-1.24.0-py3-none-any.whl (202kB)
     |████████████████████████████████| 204kB 10.4MB/s 
Installing collected packages: pmbootstrap
Successfully installed pmbootstrap-1.24.0

L'outil travaillera dans un filesystem emprisonné (chroot) pour pouvoir installer ses dépendances sans impacter l'hôte.

On lance ensuite la préparation de l'image avec la commande pmboostrap init. Celle-ci va vous poser plein de questions, voici les réponses pour le Pinephone et mes choix :

  • Channel : stable (vous pouvez choisir selon votre degré de témérité un canal de dev)
  • Vendor : pine64
  • Device codename : pinephone
  • Enable package propriétaire : yes
  • Username : un nom d'utilisateur pour le système
  • Available user interfaces :
    • Alors là il y en a quelques unes et je ne les connais pas toutes .. J'ai essayé phosh qui semble basée sur GNOME 3.
  • Additional options boot partition : no
  • Extra packages : j'ai mis vim pour la déconne
  • Choose timezone : il propose la même que celle du PC qui créé l'image.
  • Device hostname : j'ai laisse la proposition pine64-pinephone
  • Copy SSH public key : pourquoi pas !
  • Build outdated packages : yes

Ci-après le résultat :

$ pmbootstrap init
[20:49:28] Location of the 'work' path. Multiple chroots (native, device arch, device rootfs) will be created in there.
[20:49:28] Work path [/home/seb/.local/var/pmbootstrap]: 
[20:49:29] pmbootstrap does everything in Alpine Linux chroots, so your host system does not get modified. In order to work with these chroots, pmbootstrap calls 'sudo' internally. To see the commands it runs, you can run 'pmbootstrap log' in a second terminal.
[20:49:29] Setting up the native chroot and cloning the package build recipes (pmaports)...
[20:49:29] Clone git repository: https://gitlab.com/postmarketOS/pmaports.git
Clonage dans '/home/seb/.local/var/pmbootstrap/cache_git/pmaports'...
[20:49:32] NOTE: pmaports path: /home/seb/.local/lib/python3.8/site-packages/aports
[20:49:32] Choose the postmarketOS release channel.
[20:49:32] Available (2):
[20:49:32] * edge: Rolling release channel
[20:49:32] * stable: Stable release channel (first beta v20.05, does not have many devices yet)
[20:49:32] Channel [edge]: stable
[20:49:40] Currently checked out branch 'master' of pmaports.git is on channel 'edge'.
[20:49:40] Switching to branch 'v20.05' on channel 'stable'...
Basculement sur la nouvelle branche 'v20.05'
La branche 'v20.05' est paramétrée pour suivre la branche distante 'v20.05' depuis 'origin'.
[20:49:40] Choose your target device vendor (either an existing one, or a new one for porting).
[20:49:40] Available vendors (3): asus, pine64, qemu
[20:49:40] Vendor [qemu]: pine64
[20:49:44] Available codenames (1): pinephone
[20:49:44] Device codename: pinephone
[20:49:48] This device has proprietary components, which trade some of your freedom with making more peripherals work.
[20:49:48] We would like to offer full functionality without hurting your freedom, but this is currently not possible for your device.
[20:49:48] device-pine64-pinephone-nonfree-firmware: Wifi and Bluetooth firmware
[20:49:48] Enable this package? (y/n) [y]: 
[20:49:50] Username [user]: seb
[20:49:52] Available user interfaces (12): 
[20:49:52] * none: No graphical environment
[20:49:52] * gnome: (Wayland) Gnome Shell (not for armhf)
[20:49:52] * i3wm: (X11) Tiling WM (keyboard required)
[20:49:52] * kodi: (Wayland) 10-foot UI useful on TV's
[20:49:52] * mate: (X11) MATE Desktop Environment, fork of GNOME2 (stylus recommended)
[20:49:52] * phosh: (Wayland) Mobile UI developed for the Librem 5 (works only with numeric passwords!)
[20:49:52] * plasma-desktop: (X11/Wayland) KDE Desktop Environment (works well with tablets)
[20:49:52] * plasma-mobile: (Wayland) Mobile variant of KDE Plasma (does not run without hardware acceleration, allows only numeric passwords!)
[20:49:52] * plasma-mobile-extras: Plasma Mobile with more apps pre-installed (video and music players, pdf reader, etc.)
[20:49:52] * shelli: Plain console with touchscreen gesture support
[20:49:52] * sway: (Wayland) Tiling WM, drop-in replacement for i3wm (DOES NOT RUN WITHOUT HW ACCELERATION!)
[20:49:52] * weston: (Wayland) Reference compositor (demo, not a phone interface)
[20:49:52] * xfce4: (X11) Lightweight desktop (stylus recommended)
[20:49:52] User interface [weston]: phosh
[20:50:02] Additional options: boot partition size: 128 MB, parallel jobs: 17, ccache per arch: 5G
[20:50:02] Change them? (y/n) [n]: 
[20:50:04] Additional packages that will be installed to rootfs. Specify them in a comma separated list (e.g.: vim,file) or "none"
[20:50:04] Extra packages [none]: vim
[20:50:07] Your host timezone: Europe/Paris
[20:50:07] Use this timezone instead of GMT? (y/n) [y]: 
[20:50:08] Device hostname (short form, e.g. 'foo') [pine64-pinephone]: 
[20:50:09] Would you like to copy your SSH public keys to the device? (y/n) [n]: y
[20:50:13] After pmaports are changed, the binary packages may be outdated. If you want to install postmarketOS without changes, reply 'n' for a faster installation.
[20:50:13] Build outdated packages during 'pmbootstrap install'? (y/n) [y]: 
[20:50:23] WARNING: The chroots and git repositories in the work dir do not get updated automatically.
[20:50:23] Run 'pmbootstrap status' once a day before working with pmbootstrap to make sure that everything is up-to-date.
[20:50:23] Done!

La prochaine étape est maintenant de construire l'image, grâce à la commande pmboostrap install.

L'outil vous demandera votre mot de passe sudo pour préparer son environnement d'exécution. A la fin, il vous demandera d'initialiser un mot de passe pour l'utilisateur du portable.

Attention : Si vous avez choisi phosh comme moi, il ne supporte que des caractères numériques (je me suis fait avoir en tapant machinalement un mot de passe alphanumérique... same player shoot again). Ce mot de passe servira à déverrouiller l'écran d'accueil.

L'outil supporte l'option --fde pour un chiffrer les partitions de postmarketOS.

$ pmbootstrap install
[20:50:37] *** (1/5) PREPARE NATIVE CHROOT ***
[sudo] Mot de passe de seb : 
[20:50:41] Update package index for x86_64 (3 file(s))
[20:50:43] Download http://dl-2.alpinelinux.org/alpine/v3.12/main/x86_64/apk-tools-static-2.10.5-r1.apk
[20:50:44] (native) install alpine-base
[20:50:48] (native) install cryptsetup util-linux e2fsprogs parted dosfstools
[20:50:52] *** (2/5 CREATE DEVICE ROOTFS("pine64-pinephone") ***
[20:50:52] (native) install qemu-aarch64
[20:50:53] Register qemu binfmt (aarch64)
[20:50:53] (rootfs_pine64-pinephone) install alpine-base
[20:50:53] Update package index for aarch64 (3 file(s))
[20:50:59] (rootfs_pine64-pinephone) install postmarketos-base device-pine64-pinephone device-pine64-pinephone-nonfree-firmware calls chatty eog firefox-esr gedit gnome-calculator gnome-clocks gnome-contacts gnome-software kgx megapixels mobile-config-firefox nemo postmarketos-artwork-wallpapers postmarketos-hidden-desktop-entries postmarketos-welcome-gtk3 xdg-user-dirs xorg-server-xwayland postmarketos-ui-phosh vim
[20:53:21] (rootfs_pine64-pinephone) write /etc/os-release
[20:53:21] (rootfs_pine64-pinephone) install
[20:53:23] (rootfs_pine64-pinephone) install
[20:53:24] (rootfs_pine64-pinephone) mkinitfs postmarketos-allwinner
[20:53:42]  *** SET LOGIN PASSWORD FOR: 'seb' ***
New password: 
Retype new password: 
passwd: password updated successfully
[20:53:59] NOTE: No valid keymap specified for device
[20:54:00] *** (3/5) PREPARE INSTALL BLOCKDEVICE ***
[20:54:00] (native) create pine64-pinephone.img (1555M)
[20:54:00] (native) mount /dev/install (pine64-pinephone.img)
[20:54:02] (native) partition /dev/install (boot: 128M, reserved: 0M, root: the rest)
[20:54:02] (native) format /dev/installp2
[20:54:02] (native) mount /dev/installp2 to /mnt/install
[20:54:03] (native) format /dev/installp1 (boot, ext2), mount to /mnt/install/boot
[20:54:03] *** (4/5) FILL INSTALL BLOCKDEVICE ***
[20:54:03] (native) copy rootfs_pine64-pinephone to /mnt/install/
[20:54:15] Embed firmware u-boot/pine64-pinephone/u-boot-sunxi-with-spl.bin in the SD card image at offset 8 with step size 1024
[20:54:19] *** (5/5) FLASHING TO DEVICE ***
[20:54:19] Run the following to flash your installation to the target device:
[20:54:19] * If the above steps do not work, you can also create symlinks to the generated files with 'pmbootstrap export' and flash outside of pmbootstrap.
[20:54:19] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[20:54:19] Done

Maintenant, on génère l'image disque avec la commande pmboostrap export.

$ pmbootstrap export
[20:54:40] (rootfs_pine64-pinephone) install
[20:54:41] (rootfs_pine64-pinephone) install
[20:54:43] (rootfs_pine64-pinephone) mkinitfs postmarketos-allwinner
[20:55:01] Export symlinks to: /tmp/postmarketOS-export
[20:55:01]  * uImage-postmarketos-allwinner (Kernel, legacy u-boot image format)
[20:55:01]  * initramfs-postmarketos-allwinner (Initramfs)
[20:55:01]  * uInitrd-postmarketos-allwinner (Initramfs, legacy u-boot image format)
[20:55:01]  * vmlinuz-postmarketos-allwinner (Linux kernel)
[20:55:01]  * initramfs-postmarketos-allwinner-extra (Extra initramfs files in /boot)
[20:55:01]  * pine64-pinephone.img (Rootfs with partitions for /boot and /)
[20:55:01] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[20:55:01] Done

La commande realpath permet de savoir où se trouve le fichier produit par le build dans le chroot.

$ realpath /tmp/postmarketOS-export/pine64-pinephone.img 
/home/seb/.local/var/pmbootstrap/chroot_native/home/pmos/rootfs/pine64-pinephone.img

Installer Jumpdrive pour flasher le Pinephone

Jumpdrive est un outil qui vous permettra de boot le Pinephone et d'exposer son stockage eMMC en USB afin de flasher directement dessus.

Téléchargez la dernière release disponible et installez-la sur la carte microSD.

Comment identifier la carte microSD.

Avant de l'insérer dans votre lecteur, lancez la commande lsblk et mémorisez la liste des filesystems. Insérez votre carte et recommencez, vous devriez trouver un device /dev/mmcblk*** en plus.

Attention : La commande dd que nous allons utiliser pour flasher la microSD est sans pitié, relisez 40 fois avant de la lancer pour ne pas flasher le mauvais filesystem ;)

Téléchargez donc la release de Jumpdrive puis installez-le sur la carte microSD :

$ xzcat pine64-pinephone.img.xz | sudo dd of=/dev/mmcblk*** status=progress

Si vous n'avez pas la commande xzcat de disponible, vous pouvez utiliser unxz.

$ unxz pine64-pinephone.img.xz
# va remplacer pine64-pinephone.img.xz par pine64-pinephone.img
# puis on installe sur la microSD
$ sudo dd if=pine64-pinephone.img of=/dev/mmcblk*** status=progress

Lancer le flash

Assurez-vous que le Pinephone est bien éteint puis insérez la microSD dans l'emplacement prévu à cet effet du Pinephone.

Démarrez le Pinephone, l'image de Jumpdrive apparaît au bout de quelques secondes.

flash pinephone

Listez une nouvelle fois vos filesystems avec lsblk puis branchez en USB le Pinephone. Son filesytem doit apparaître.

# avant branchement
$ lsblk
NAME                            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                               8:0    0 931,5G  0 disk /media/data
sdb                               8:16   0 223,6G  0 disk 
├─sdb1                            8:17   0   600M  0 part /boot/efi
├─sdb2                            8:18   0     1G  0 part /boot
└─sdb3                            8:19   0   222G  0 part 
  ├─fedora_localhost--live-root 253:0    0    70G  0 lvm  /
  ├─fedora_localhost--live-swap 253:1    0   7,9G  0 lvm  [SWAP]
  └─fedora_localhost--live-home 253:2    0 144,1G  0 lvm  /home

# après branchement
$ lsblk
NAME                            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                               8:0    0 931,5G  0 disk /media/data
sdb                               8:16   0 223,6G  0 disk 
├─sdb1                            8:17   0   600M  0 part /boot/efi
├─sdb2                            8:18   0     1G  0 part /boot
└─sdb3                            8:19   0   222G  0 part 
  ├─fedora_localhost--live-root 253:0    0    70G  0 lvm  /
  ├─fedora_localhost--live-swap 253:1    0   7,9G  0 lvm  [SWAP]
  └─fedora_localhost--live-home 253:2    0 144,1G  0 lvm  /home

# et voici le stockage eMMC du Pinephone !
sdd                               8:48   1  29,1G  0 disk 
├─sdd1                            8:49   1   121M  0 part /run/media/seb/pmOS_boot
└─sdd2                            8:50   1    29G  0 part /run/media/seb/pmOS_root

# et ici le système Jumdrive démarré !
sde                               8:64   1   1,9G  0 disk 
└─sde1                            8:65   1    49M  0 part /run/media/seb/1D88-7C72

Si vous ne voyez rien, changez de câble USB ! Au début je ne comprenais pas, mais le câble USB-C vendu avec le Pinephone semble de mauvaise qualité pour la transmission de données (voire incapable ?). J'ai donc utilisé un autre que je savais fonctionnel, et le FS est apparu comme par magie. Si ça ne passe toujours pas, là il faudra commencer à creuser voire peut être regarder du côté des issues de Jumpdrive, il y a quelques récalcitrants.

Note : la version 0.4 de Jumpdrive n'est pas compatible avec le Pinephone 3GB vendu avec Manjaro, il ne boot pas.

Bien, nous pouvons lancer l'installation sur le Pinephone. Pour rappel, ceci va remplacer tout le contenu de la eMMC par l'image de PostmarketOS !

Munissez-vous de l'emplacement de l'image obtenue lors du build et du nom du device associé au Pinephone. Dans mon cas il s'agit de /dev/sdd. Adaptez à votre résultat !.

Lancez le flash avec la commande dd et surtout, attendez avant de débrancher le Pinephone. Jumpdrive ne sait pas s'éteindre et il convient d'attendre quelques minutes après la fin de la commande dd pour s'assurer que l'écriture sur disque est bien terminée. Il est possible que le cache ne soit pas encore tout à fait écrit sur la mémoire eMMC et l'éteindre trop tôt peut entraîner une corruption.

$ sudo dd if=/home/seb/.local/var/pmbootstrap/chroot_native/home/pmos/rootfs/pine64-pinephone.img of=/dev/sdd status=progress
[sudo] Mot de passe de seb : 
1616949760 octets (1,6 GB, 1,5 GiB) copiés, 209 s, 7,7 MB/s 
3184640+0 enregistrements lus
3184640+0 enregistrements écrits
1630535680 octets (1,6 GB, 1,5 GiB) copiés, 209,826 s, 7,8 MB/s

Attendez 5 minutes après l'installation pour débrancher le Pinephone, puis éteignez-le en maintenant le bouton on/off 5 secondes et retirez la microSD.

Allumez ensuite le Pinephone, vous voici sur Postmarket OS !

pinephone postmarket