趣味の話:p-bootを試してみた

u-boot

PinephoneにOSのお試しインストールをしていくうち、bootディレクトリの中味がx86と違うことに気付きました。
Armはu-bootというものが一般的なようで、Image、board.dtb、bootscrと、今まで見なかったものが並んでいます。
Archlinux Armを自前でインストールして起動しよう!と思い立ったものの、u-bootのことは全く分からず。
Webで手順は見つかりますが、起動までたどり着きません。
調べるうち、p-bootというものにたどり着きました。


p-boot

p-bootはpinephone用に作られたもの。
起動が早くて便利みたいです。
Archlinux、DanctNixどちらでも使えるものがあったので、早速試すことにしました。
https://github.com/tqre/pinephone-arch

注意!
インストールで既存環境のbootパーティションは消去されるため、失敗すれば起動不能になります。
実行は自己責任で、当方関知いたしませんので悪しからず。

OSはDanctNixです。
JumpDriveでx86のPC と接続、arch-chrootから試すことにしました。
違うアーキテクチャへのchrootなので、まずその準備から。

qemu-aarch64-static取得。
Pinephoneの/usr/binに配置。
https://github.com/multiarch/qemu-user-static/release

以下インストール。
かなり時間がかかりました。
$ yay -S qemu-user-static binfmt-qemu-static
$ sudo pacman -S aarch64-linux-gnu-gcc

次にPinephoneのセーブ。
PCにJumpDrive接続した状態でdd。
圧縮かけてないので29GBですが、まぁ良し。
$ sudo dd if=/dev/sdX of=/自分の/セーブしたいとこ/DanctNix.img bs=1M

PinephoneをPCの/mntにマウントしてchroot
$ sudo mount /dev/sdX2 /mnt
$ sudo mount /dev/sdX1 /mnt/boot
$ sudo su
# arch-chroot /mnt qemu-aarch64-static /bin/bash

でインストールを試みたんですが、結果は起動時にハングアップ、失敗です。
PC接続時のデバイス名(/dev/sdX)と、Pinephone起動時のデバイス名(/dev/mmnblkX)が一致しなくなるのが原因ぽい。
このため、Pinephone本体で作業することにしました。

またJumpDrive接続して焼き戻し。
1時間以上かかりましたー
$ sudo dd if=/自分の/セーブしたとこ/DanctNix.img of=/dev/sdX bs=1M

構成はこんな感じ。
/dev/mmcblk2p1 vfat /boot
/dev/mmcblk2p2 ext4 /

 

準備

$ sudo pacman -S git base-devel f2fs-tools
Danctnix はext4を使用しているためf2fs-toolsは不要。

/bootを第1パーティションにマウントした状態だと、インストールのbootパーティション改変でエラーが出て失敗します。
このためbootパーティションをumount、更に念のため空にしました。
$ sudo umount -R /boot
$ fdisk -l
$ fdisk /dev/mmcblk2
  d→1→
  n→p→1→→
  a→
  w→
$ mkfs.vfat -F32 /dev/mmcblk2p1

chroot
Pinephone本体のOSから、microSDを/mntにマウントしてchroot
$ sudo mount /dev/mmcblk2p2 /mnt
$ sudo mount /dev/mmcblk2p1 /mnt/boot
$ sudo su
# arch-chroot /mnt /bin/bash

データ取得
# su 一般ユーザー
$ cd
$ git clone https://github.com/tqre/pinephone-arch.git
$ cd pinephone-arch

PKGBUILDファイルの変更
pkgverは https://xff.cz/kernels/ の最新版を使用。当然ここに無いバージョンはエラーを起こしてパッケージ作成が止まります。
最新版のsha256sumsは分からないのでSKIP。
bootdev、rootpart、bootpartは、本体での作業なら不要かもしれません。
JumpDrive作業時ここで詰まったので、変更を加えて実行しました。
$ nano PKGBUILD/
  10: pkgver=5.17
  25: sha256sums=('SKIP'
  36: _bootdev=/dev/mmcblk2
  37: _rootpart=/dev/mmcblk2p2
  38: _bootpart=/dev/mmcblk2p1

パッケージ作成とインストール。
$ makepkg
$ sudo pacman -U linux-megous-選択したバージョン-aarch64.pkg.tar.xz --overwrite /etc/fstab
256MBあった第1パーティションはインストール中削除され、64MBの未知のパーティションに置き換えられていますね。
/etc/fstabもインストール中書き換えられています。メッセージには「書き換えの必要があるかも」とありましたが、特に何もしなくても起動しました。


p-boot使ってみて

確かに早いかな?
DanctNixはboot時の情報が表示されませんが、表示されるようになって便利。
今後アップデートしても、カーネルバージョンが選べます。

/etc/pacman.confの書き換えは行いました。
linux-megousと齟齬が起きると面倒なので、linux-megiにアップデートがかからないようにしました。
  25行目「#IgnorePkg   =」
  IgnorePkg   =linux-megi

今回DanctNixにインストールしてみたことで、少し様子が分かりました。
Pinephone Proにはまだ対応してないようですが、自前でインストールしてるArchlinuxで試そうかなーと考えています。

 

追記(20220221):
microSDにインストールして、起動出来てなかったArchlinuxArm。
Pinephoneにカードを挿して、arch-chrootからp-bootをインストールしたらあっさり起動しました。これもデバイス名のズレから起動していなかった模様。

f:id:ichapy:20220221091943j:imagef:id:ichapy:20220221092406j:image


参考:

https://xnux.eu/index.html
https://megous.com/git/p-boot
https://xff.cz/kernels
https://archlinuxarm.org/platforms/armv8/allwinner/pine64