11:13:32 # Life Chrome OS デバイスであるChromebook Plus(Kevin)で任意のカーネルをブートする方法について。 夏休みの宿題にしていたのだがあまり詳しくない分野で力尽きたので力尽きたところまでメモ。 任意のOSをブートする方法を調べていたら結局任意のカーネルをブートする方法が必要なのに気づいた。 Debianのイメージをmicro sd cardから起動させようとして調べたところどうもCorebootだとかDepthchargeとかUBootとかいろいろあるみたいだが結局適切に署名された起動パーティションというのが必要らしい。 Verified Bootの仕組みとして署名されているバイナリしかロードしてくれない。 Developer Mode 開発者モードというのがあるのでそのモードに入ると署名の確認がシンプルになる。 署名自体は開発用のプライベート鍵(?kernel.keyblock とkernel_data_key.vbprivk )というのが配布されているのでそれを使うとブートローダーはあまり気にせず起動してくれる。鍵はひょっとして何でもいいのかもしれない。 vbutil_kernelというツールで署名してそれをddで書き込めば良い。 パーティション自体のメタデータにChrome OS Kernelであるというフラグを指定するのにcgptでタイプを指定する必要がある。 vbutil_kernelで書き込むためにはカーネルイメージが必要なんだけどそのイメージ自体はu-boot-toolsのmkimageを利用して作成、Device TreeとLinux Kernelを組み合わせたファイルを生成してくれる。設定ファイルはdebian.its。--config cmdlineのところはカーネルの起動パラメーターで試行錯誤した結果initrdでうまく起動できなかった。何かがたりていない。 多分起動できるところまでいったんだけど画面に何も表示できていないのでこれはシリアルケーブルがないとデバッグ不可能ではないかというところに至る。
$ sudo apt install u-boot-tools
$ cgpt create /dev/sde # GPTのパーティションテーブル自体の作成
$ parted -a optimal /dev/sde unit mib mkpart Kernel 1 65 # GPTのカーネルパーティション作成
$ parted -a optimal /dev/sde unit mib mkpart Root 65 100% # root file system
$ cgpt add -i 1 -t kernel -S 1 -T 5 -P 15 /dev/sde # add flags # GPTのカーネルパーティションにタイプとかを設定
$ mkfs.ext4 /dev/sde2
$ mkimage -D "-I dts -O dtb -p 2048" -f debian.its vmlinux.uimg
$ vbutil_kernel \
--pack vmlinux.kpart \
--version 1 \
--vmlinuz vmlinux.uimg \
--arch aarch64 \
--keyblock /usr/share/vboot/devkeys/kernel.keyblock \
--signprivate /usr/share/vboot/devkeys/kernel_data_key.vbprivk \
--config cmdline \
--bootloader bootloader.bin
$ dd if=vmlinux.kpart of=/dev/sde1
15:26:20 # Life vmc の使いかた。 Crostiniは使っていたけどTerminaは全然触ってなかったので使い方メモ。 Crostiniは標準のDebianイメージをTerminaというCrOSイメージの仮想マシンのうえで動くLXC環境で動作しているもの。 Termina VMの上でLXCが動いているので任意のLinuxコンテナを動かすことが大体可能。 あと「Termina」以外のVMを走らせることも可能みたい。 Chrome OSでひらくCrosh(ctrl-alt-t)を使って操作。 とりあえず例えばBullseyeインスタンスを作成したければlxc launch images:debian/bullseye ... とか指定すれば良い。 一度作成してしまえば起動したければcroshからvmc container termina bullseyeで起動する(がコマンドが帰ってこなくてタイムアウトする)。 これタイムアウトするのは多分何かのシグナルを待っているんだが何も設定していないためそのシグナルを送ってないからなんだろうな。 たぶん一番よいドキュメントはこれ。 CrostiniからTerminaのレイヤにアクセスする方法がない気がするのでそうするとスクリプトとかはTerminaのレイヤにないといかんのか?
crosh$ vmc list # 仮想マシンのリスト、terminaだけがおそらくある。 crosh$ vsh termina # terminaのvshに接続 termina$ lxc list # terminaで動いているインスタンスの一覧 termina$ lxc launch images:debian/bullseye bullseye # インスタンスの作成 termina$ run_container.sh --container_name bullseye --shell --user root # ログイン