tsukumijima / QuaStation-Ubuntu

Qua Station 向けの Linux カーネルのビルドと、Ubuntu 20.04 LTS の rootfs の構築を全自動で行うスクリプト
15 stars 4 forks source link
kernel linux realtek rtd1295 ubuntu

QuaStation-Ubuntu

Qua Station 向けの Linux カーネルのビルドと、Ubuntu 20.04 LTS の rootfs の構築を全自動で行うスクリプトです。

概要

Qua Station 向けの Ubuntu 20.04 LTS のインストールイメージを作成するためのツールです。
Qua Station に搭載されているほとんどのハードウェアをフル活用できるように、Linux カーネルの構成やデバイスツリー、ソースコード、設定ファイルなどを大幅に調整しています。

動作確認は Ubuntu 20.04 LTS の Linux PC (x86_64) で行っています。
ビルドはすべて Docker コンテナ内で実行されますが、WSL などではうまく動かないかもしれません。

注意: このリポジトリは2つの Linux カーネルをサブモジュールとして含んでいるため、展開後のサイズがかなり大きくなります (ソースと .git だけで 4GB 程度)。
Docker イメージのビルドやインストールイメージの構築でもストレージ容量を GB 単位で消費するため、最低でも 20GB はストレージ容量に余裕を持たせた状態でビルドすることを推奨します。

ハードウェア

現時点で動作する Qua Station 搭載のハードウェアは以下の通りです。

Linux カーネルの選択

Ubuntu 20.04 LTS と組み合わせるカーネルは、

の2つから選択できます。

どちらも mainline のカーネルと比較すると、Realtek SoC 向けの大幅なカスタマイズ( Realtek SoC 固有のドライバやデバイスツリーの追加など)が行われています。
mainline のカーネルでは Realtek SoC 固有のドライバが実装されていないため、まずまともに動かないことでしょう。

4.9.119 ですら今となってはかなり古いバージョンですが、BSP カーネルを新しい Linux カーネルに移植するには多大な時間と労力が必要です(そして SoC メーカーは基本的にアップデートを公開しない…)。
できるだけ多くの搭載ハードウェアを動かすため、やむを得ず古いカーネルを利用しています。
ufw がうまく動作しないなど若干の問題はありますが、基本的には Ubuntu 20.04 LTS でも問題なく動作します。一応 Docker も動きます。

基本的には Linux 4.9.119 ベースの方をおすすめします。
4.1.17 ベースの方はバージョン自体が古い上に、5GHz の方の Wi-Fi IC が接続された PCIe スロット (PCIE2) がエラーで認識されない問題を抱えています。
また、4.1.17 ではあまり動作確認をしていないため、もしかするとうまく起動できなかったりがあるかもしれません。安定性も 4.9.119 の方が高い印象です。

いずれのカーネルにも既知の問題があります。詳細は各カーネルの Readme.md を参照してください。

ビルド

ビルドはすべて Docker コンテナ内で実行されるため、Docker 環境さえあれば、ホスト PC の環境を汚すことなく簡単にビルドできます。

下記で解説するコマンドのうち、bpi の部分を au に変更して実行すると、4.9.119 カーネルの代わりに 4.1.17 カーネルの方をビルドできます。

git clone --recursive https://github.com/tsukumijima/QuaStation-Ubuntu.git
cd QuaStation-Ubuntu

このリポジトリを clone します。
サブモジュール(Linux カーネル)も同時に clone するため、この時点で 4GB 弱のストレージ容量を消費します。

make docker-image-bpi  # カーネルビルド用の Docker イメージを構築
make docker-image-ubuntu-rootfs  # rootfs 構築用の Docker イメージを構築

あらかじめ、ビルドに利用する Docker イメージを構築しておきます。

make build-all-bpi
make build-kernel-bpi  # カーネルのみビルドする場合
make build-ubuntu-rootfs  # Ubuntu の rootfs のみビルドする場合

あとは make build-all-bpi を実行するだけで、全自動でビルドが行われます。

PC のスペックにもよりますが、ビルドにはかなり時間がかかります(私の環境だと1時間近くかかった…)。
Ubuntu 20.04 LTS rootfs build is completed. と表示されたら完了です!

rootfs の構築スクリプトは build_ubuntu_rootfs.sh にあります。
Ubuntu 20.04 LTS (x86_64) の Docker コンテナの中でさらに chroot 環境に入り、その中で実行しています。
適宜 build_ubuntu_rootfs.sh をカスタマイズすることで、事前に様々なソフトをインストールしておくことができます。

chroot 環境のため、一部の機能 (Systemd・Docker など) が動作しないことに注意してください。


make clean-bpi で、カーネルのビルドされた成果物(ビルドキャッシュなど)をすべて削除できます。
カーネルを最初からビルドし直したい際などに実行します。

Ubuntu の rootfs を最初からビルドし直したいときは、usbflash/rootfs/ をまるごと削除して、もう一度 make build-all-bpi を実行してください。

成果物

ビルドが終わると、usbflash/ ディレクトリ以下に

がそれぞれ生成されています。各自 USB メモリにコピーしてください。

bootfs/ 以下のファイルは FAT32 (VFAT) でフォーマットされた先頭 100MB のパーティションへ、rootfs/ 以下のファイルは残りの ext4 パーティションに配置します。

USB メモリに焼く手順や U-Boot のコマンドについては、u-haru 氏の記事 (記事1記事2) が参考になると思います。
現時点では USB ブートのみ想定しています。eMMC からのブートは未検証です。

env set bootcmd "usb start;fatload usb 0 0x01f00000 /QuaStation.dtb;fatload usb 0 0x03000000 /uImage;fatload usb 0 0x01b00000 /bluecore.audio;env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200n8 initrd=0x02200000,0x7F0000 root=/dev/sdb2 rw rootwait rootfstype=ext4 init=/sbin/init selinux=0 nmi_watchdog=1 devtmpfs.mount=1;env set bootcmd 'booti 0x03000000 - 0x01f00000';go a;b2ndbc"
saveenv
reset

その後、U-Boot のコンソールで適切にコマンドを実行すれば、Qua Station 上で Ubuntu 20.04 LTS が起動できるはずです。
私は上記のコマンドを U-Boot のコンソールで実行し、Linux 4.9.119 + Ubuntu 20.04 LTS を USB からブートできるようにしています。