インフラ・DevOps
Lenovo IdeaPad DuetでUbuntuを実行する
Running Ubuntu on the Lenovo IdeaPad Duet (vhaudiquet.fr)
要約
著者はLenovo IdeaPad Duet ChromebookにUbuntuをインストールし、実行する過程を詳述しています。postmarketOSの起動問題に直面した後、Ubuntuのrootfsを既存のパーティションに展開し、最終的にはデバイスのブートローダーであるDepthchargeの仕組みを理解することで、Ubuntuカーネルでの正常な起動を実現しました。
全文翻訳
Lenovo IdeaPad DuetでUbuntuを実行する
Valentin Haudiquet
ソフトウェアエンジニア
私はLenovo IdeaPad Duet Chromebook、ChromeOS 2-in-1 ARM64タブレットを所有しています。ChromeOSを使い、次にpostmarketOSを使っていましたが、突然動作しなくなりました。Ubuntuを動かすためにファームウェアハッキングを試みる時が来たのです!
Lenovo IdeaPad Duet
Lenovo IdeaPad Duet: 取り外し可能なキーボード、1920x1200のスクリーン、ARM64 MediaTek MT8183 SoC、4 GiBのRAMを搭載した10.1インチタブレット(画像クレジット: Lenovo)
このデバイスは、エンジニアリングスクールの最初の年に、しばらく前に購入しました。安価(約100ユーロ)で、中古でしたが非常に良い状態でした。私は携帯性を重視して10インチのラップトップを好んでおり、このデバイスはノートテイキング用のスタイラスでも使用できるため、試してみたいワークフローでした(結果的にあまり自分には合いませんでした)。
ChromeOSも使ったことがなく、非常に興味がありました。当時はAndroidアプリを開発しており、ネイティブでコーディングしてデバイス上でアプリを実行できるのはエキサイティングに思えました。しかし、ChromeOSでのパフォーマンスはあまり良くなく、Linuxのすべてをコンテナで実行する必要があり、それが不格好に感じられたため、期待外れでした。私は静かにデバイスの使用をやめました。
しばらくして、postmarketOSがこれをサポートしていることに気づきました。それは、Alpine Linuxをベースにした、任意のDE(GNOME、KDEなど)と適切なLinuxツール、パフォーマンスを備えた、実際のLinuxディストリビューションを意味します。試さなければなりませんでした。
postmarketOSのインストールは、wikiとインストールガイドにかけられた労力のおかげで非常に簡単でした。基本的に、デバイスを「開発者モード」にし、イメージをダウンロードし、USBスティックに書き込み、「開発者モード」メニューを使用してそこから起動します。その後、eMMCにインストールできるライブpostmarketOSイメージに着地します。
ChromeOSのファームウェア「開発者モード」メニュー。これにより、起動メディア(USBまたは内部ストレージ)を選択できます。私のものはフランス語です。「Start legacy BIOS」は何もしません。これはx86 Chromebookでのみ機能し、同じファームウェアを再利用しただけだと推測します。
ここまでは順調でした。GNOMEのようなプリインストールされたDEを持つイメージさえあります。私はメインコンピューターでGNOMEを多用しているので、そちらを選びました。残念ながら、それは間違いであることが判明しました。GNOMEはリソースを大量に消費する可能性があり、デバイスの弱いCPUと4 GiBのRAMには適していませんでした。少し遅く、実用的にするには摩擦が大きすぎました。また、GNOMEは「ミニマリスト」ワークフローには不向きだと感じます。今考えると、ターミナル中心のワークフローを持つタイリングウィンドウマネージャーなら、間違いなくデバイスには良かったでしょう。
それでも時々使い続けました。最終的にpostmarketOS 26.06にアップデートしましたが、その後デバイスは再起動できなくなりました。
古い25.12バージョンを起動することはできましたが、26.06をUSBスティックに書き込んで起動しても機能しないようです。2つのバージョンの間に、Duetでの起動を静かに壊す何かが変更されたに違いありません。調査中、必要なすべてのドライバーがメインラインカーネルに含まれていることに気づきました。私は現在、CanonicalでUbuntu開発に従事しており、RISC-Vデバイスの起動を担当しています。Duetの状態を考えると、Ubuntuの起動は本当に実現可能に見えました。それで…週末がありました。やりましょう!
Ubuntuのインストール?
この時点で、postmarketOSがデバイス上でどのように起動するのか、ブートフローがどのようなものなのか、Ubuntuで何が機能するのか、ほとんどわかりません。「Ubuntuのように見えるもの」を得る最も簡単な方法の1つは、postmarketOS 26.06のrootfsをUbuntuのrootfsに置き換えることです。それで、私はそれをしました。
postmarketOS 25.12 USBスティックで起動しました。まず、内部eMMCストレージの状態を調べました:
/dev/mmcblk0のfdiskを実行し、パーティションテーブルを表示
OK。それで、謎の「ChromeOS Kernel」パーティション、/boot EFIパーティション、そしてrootfsパーティションがあります。次にUbuntu rootfsをインストールする簡単な方法は、それを置き換えるだけです。それが、私が最も愚かな方法で行ったことです:
# mount /dev/mmcblk0p3 /mnt # ls /mnt/boot 何もなし、それで/dev/mmcblk0p2が/bootにマウントされました # rm -rf /mnt/* 古いpostmarketOS rootfsのすべてのファイルを削除 # curl -L -O https://cdimage.ubuntu.com/.../ubuntu-base-26.04-base-arm64.tar.gz Ubuntu「base」イメージ、最小限のUbuntu rootfsをダウンロード # tar -C /mnt -xzf ubuntu-base-26.04-base-arm64.tar.gz そのベースUbuntu rootfsを/dev/mmcblk0p3に展開
これで、/mntにchrootして新しいUbuntuシステムを楽しむ準備ができました。
postmarketOS 25.12 USBスティックから、新しいUbuntu rootfsで/dev/mmcblk0p3にchrootしました。fastfetchのようなパッケージさえインストールしました!6.12.87-mt81カーネルに注目してください。これはUSBスティックからのpostmarketOSカーネルです。
これはすべて非常に良いのですが、永遠にchroot内で生活し、内部ストレージをマウントするためだけにUSBから起動しなければならないのは、あまり気分が良くありません。この新しいrootfsにブートしてみる時が来ました!新しいpostmarketOS 26.06カーネルに何か問題があると思ったので、これは失敗すると予想していましたが、驚いたことに問題なく動作しました。つまり、26.06の問題はrootfsの起動プログラムにあったはずで、何かが静かにクラッシュしていたのです。
/dev/mmcblk0p3のUbuntu rootfsに、内部ストレージからブートしました。新しい6.18.44-mt81カーネルに注目してください。これは26.06インストールのpostmarketOSカーネルで、/dev/mmcblk0p1またはp2ブートパーティションにあります。
ご覧のとおり、デバイスは現在localhostと表示されるため、設定を完了するためにいくつかのセットアップを行う必要があります。しかし、私はすでにchrootでユーザーアカウントを作成していました。別の問題:新しいrootfsにはpostmarketOSカーネルのファームウェアが不足しているため、Wi-Fiが機能しなくなりました。簡単な修正は、26.06イメージを取得し、/lib/firmware/6.18.../*ツリーを展開してrootfsにコピーすることです。これによりWi-Fiが復元されます。
しかし、それはpostmarketOSカーネルのままで、アップデートできないことを意味します。私はそれを望んでいませんでした。カーネルを含む完全なUbuntuを実行したかったのです。
それで、最も簡単なことをしました。アーカイブからlinux-genericパッケージをインストールしました。vmlinuzとinitrdを/bootパーティションである/dev/mmcblk0p2にコピーしました。また、必要に応じてカーネルコマンドラインでハードコードできるように、アップストリームのDTBを/bootパーティションにコピーしました。すべてがクラッシュし、何も機能しないと予想していました。ブートローダーがわからず、カーネルが正しいDTBを取得できないと仮定していたからです。再起動しました。
驚いたことに、マシンは正常に起動しました。さらに良いことに、もう一度fastfetchを実行したところ、カーネルバージョンを含め、すべてが同一でした。
待て、何?/bootパーティションのカーネルを上書きしたばかりです。そのパーティションはまったく使用されていないのですか?
Ubuntuカーネルの使用
ブートフローの理解
明らかに、ステップバックしてマシンがどのように起動するのかを実際に理解する必要がありました。ランダムなことを試すだけではもううまくいかないからです。それで、いくつかのリソースを読み、Claudeと話し、彼(それ?)にURLを与えてブートフローの説明を求めました。
Chromebookではブートフローが少し複雑であることがわかりました。以下は、Claudeが説明してくれた際のスキームです。私はそれらを非常に明確だと思います。
Chromebookのファームウェアブートチェーン。ブートROMにはFSBLが含まれており、それがCorebootをロードします。CorebootにはDuetのアップストリームサポートがあります。次に、CorebootはARM Trusted Firmware(この分析には関連しません)をロードし、それがDepthcharge、ChromeOSデバイスのブートローダーをロードします。
それで、ChromeOSブートローダーであるDepthchargeは、起動時にUSBと内部ストレージのどちらを選択できるかを示す「開発者モード」メニューも表示します。これは非常に興味深いです。さて、次のステップは何でしょうか?Depthchargeは実際に何をロードするのでしょうか?
内部ストレージを起動するDepthcharge。それは最初の、謎の「ChromeOS kernel」パーティションのみを気にします。実際にはFITイメージが含まれており、ここではカーネル、initrd、デバイスツリーのバンドルにすぎません。
これで謎が解けました!/bootパーティションは起動時にはまったく使用されておらず、postmarketOSがDepthcharge FITイメージを(mkdepthchargeツールを使用して)準備するためにのみ使用されていました。したがって、新しいカーネルをそこにインストールするだけでは不十分でした。Depthchargeイメージを再生成する必要もありました。
EFI環境が必要
これは非常に簡単ですが、それはunfortunat