R36 UltraにLinuxをインストールする


HackMDが死んでるのでここに書きます

前準備

SSHのつなぎかた

メインメニュー > ネットワーク設定 > Wi-Fi有効 にして SSIDをキーを設定してWiFiに接続します。
IPアドレスはこの画面か、メインメニューのバージョンの横に表示されるので確認します。(毎回変わるので注意)

任意のゲームを起動して、SELECT + Xを押して、メニューを開きます。

一覧に戻り、左から2番目のSettingsの下の方にあるServicesから SSHを有効にします。

#!/bin/bash
echo "ssh-ed25519 AAAAAA user@hostname" >> /storage/.ssh/authorized_keys
chmod 600 /storage/.ssh/authorized_keys

内蔵フラッシュのダンプ

USBメモリは/dev/sda1とします

おそらく自動で/media/<USBのラベル>にマウントされます

Terminal window
dd # load to memory
systemctl stop emustation
mount -o remount,ro /dev/mmcblk0p4
mount -o remount,ro /storage/roms
mount -o remount,ro /storage/.update
mount -o remount,ro /dev/mmcblk0p3
dd if=/dev/mmcblk0 of=/media/<USBのラベル>/r36ultra.img bs=1M
sync
umount /media/<USBのラベル>

R36 Ultraのブート条件

おそらくSDカードの16384セクタにU-Bootがあるとそちらから起動するようです。
ですので、先程ダンプしたイメージをSDカードにそのまま書き込みます。

ディスク /dev/loop1: 7.28 GiB, 7818182656 バイト, 15269888 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 5A620000-0000-4E5B-8000-25FA00006E0C
デバイス 開始位置 終了位置 セクタ サイズ タイプ
/dev/loop1p1 16384 24575 8192 4M 不明 # U-boot
/dev/loop1p2 24576 32767 8192 4M 不明 # BL2?
/dev/loop1p3 32768 4227071 4194304 2G 不明 # Bootパーティション
/dev/loop1p4 4227072 12582911 8355840 4G 不明
/dev/loop1p5 12582912 15267839 2684928 1.3G Microsoft 基本データ
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop1 7:1 0 7.3G 1 loop
├─loop1p1 259:6 0 4M 1 part
├─loop1p2 259:7 0 4M 1 part
├─loop1p3 259:8 0 2G 1 part
├─loop1p4 259:9 0 4G 1 part
└─loop1p5 259:10 0 1.3G 1 part

EMUELECパーティションの整理

EMUELECパーティションはFAT16でフォーマットされていて、その上1GBまでしか使えないようです。
FAT32でフォーマットし直して、中身をコピーします。(してください)

emuelec-partition
emuelec-partition

デバイスツリーの編集

元々入っているrk3326-evb-lp3-v12-linux.dtbは、デバイスツリー内にカーネルのコマンドラインが入っていて、こちらが優先されてしまうので編集して削除する必要があります。

Terminal window
dtc -I dtb -O dts -o rk3326-evb-lp3-v12-linux.dts rk3326-evb-lp3-v12-linux.dtb

デコンパイルしたdtsファイルを編集します。

diff --git a/rk3326-evb-lp3-v12-linux.dts b/rk3326-evb-lp3-v12-linux-fix.dts
index e25733f..28f752d 100644
--- a/rk3326-evb-lp3-v12-linux.dts
+++ b/rk3326-evb-lp3-v12-linux-fix.dts
@@ -4379,7 +4379,7 @@
};
chosen {
- bootargs = "earlycon=uart8250,mmio32,0xff178000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 rw rootwait overlayroot=device:dev=PARTLABEL=STORAGE,fstype=ext4,mkfs=1,bootfromnand=1";
+ bootargs = "earlycon=uart8250,mmio32,0xff178000 console=ttyFIQ0";
};
fiq-debugger {
Terminal window
dtc -O dtb -o rk3326-evb-lp3-v12-linux-fix.dtb rk3326-evb-lp3-v12-linux-fix.dts

できたdtbはEMUELECラベルのついたFAT32パーティションに入れます。

Ubuntuのインストール

パーティションの作成

SDカードのおしりとかに適当なext4パーティションを作ります。
作成後、以下のコマンドでext4のオプションを無効化してください。

作成したパーティションを/dev/sdXnとします。

Terminal window
e2fsck -f /dev/sdXn
tune2fs -O ^orphan_file /dev/sdXn

rootfsはdrwxr-xr-x, root:rootである必要があります。

Terminal window
mount /dev/sdXn /mnt
chown root:root /mnt
chmod 755 /mnt

Ubuntuの展開

今回はUbuntu Base 24.04.3を使用します。

Ubuntu Baseは以下のURLからダウンロードできます。

https://cdimage.ubuntu.com/ubuntu-base/releases/

ubuntu-base-24.04.3-base-arm64.tar.gzを先程作成したパーティションに展開します。

Terminal window
sudo tar -xzvf ubuntu-base-24.04.3-base-arm64.tar.gz -C /mnt

chroot環境の準備

今回のホストマシンはamd64なので、qemuを使ってarm64のバイナリを実行できるようにします。

Terminal window
sudo pacman -S qemu-user-static qemu-user-static-binfmt

chrootします

Terminal window
sudo arch-chroot /mnt /bin/bash
Terminal window
export PATH=$PATH:/usr/sbin
export TERM=xterm-256color

Ubuntuの初期設定

一般ユーザを作成します。

Terminal window
useradd -m -s /bin/bash -G sudo sim1222
passwd sim1222

hostnameを設定します。

Terminal window
echo "r36ultra" > /etc/hostname
echo "127.0.1.1 r36ultra" >> /etc/hosts
echo "127.0.0.1 localhost" >> /etc/hosts

aptの更新をします。

Terminal window
apt update
apt upgrade -y

aptに必要なパッケージをインストールします。

Terminal window
apt install dialog
apt install locales
locale-gen "en_US.UTF-8"

必須パッケージをインストールします。

Terminal window
apt install ubuntu-minimal
apt install kmscon wget apt-utils wpasupplicant network-manager vim ssh openssh-server initramfs-tools

その他お好みで。

Terminal window
apt install bash-completion htop neofetch

fbconが使えないので、kmsconを使うようにします。

Terminal window
systemctl disable getty@tty1.service
systemctl enable kmsconvt@tty1.service
ln -s /usr/lib/systemd/system/kmsconvt\@.service /etc/systemd/system/autovt\@.service

initramfsの生成

EMUELECパーティションにあるSYSTEMファイルはsquashfsファイルです。これをマウントして、/usr/lib/kernel-overlays/base/lib/フォルダー内のファイルをrootfsの/usr/libにコピーします。
また、/usr/lib/firmwareフォルダー内のファイルもコピーします。

initramfsを生成します。
カーネルのバージョンは各自の環境に合わせて変更してください。

Terminal window
mkinitramfs -o /root/ubuntu-zImage 5.10.160

blkidコマンドで、UbuntuのパーティションのUUIDを確認します。

Terminal window
blkid /dev/sdXn

/root/ubuntu-zImageをEMUELECパーティションにコピーします。

EMUELECパーティションの/extlinux/extlinux.confを編集します。

blkidで確認したUUIDをroot=UUID=xxxxの部分に設定します。

以下を追記してください。

DEFAULT ubuntu
LABEL ubuntu
LINUX /KERNEL
FDT /rk3326-evb-lp3-v12-linux-fix.dtb
INITRD /ubuntu-zImage
APPEND root=UUID=uuuuuuuu-uuuu-iiii-dddd-uuiduuiduuid rw rootwait earlyprintk console=ttyFIQ0 net.iframes=0 fbcon=rotate:3 ssh consoleblank=0 selinux=0 fastboot

fstabに以下を追記します。

Terminal window
/dev/mmcblk1p3 /boot vfat rw,relatime 0 0

お好みでSwapを設定しておきましょう。ZRAMはモジュールがビルトインではないので使えません。

おまけ

Terminal window
echo "rk915" >> /etc/modules-load.d/rk915.conf
systemctl enable NetworkManager

ブート

SDカードをR36 Ultraに挿して起動します。
たぶん起動します。

OTGポートにハブをつけて、キーボードとLANアダプタを接続しておくと便利です。
netplanとかの設定は各自でがんばってください。
KDEとかはkubuntu-desktopとかで入ると思います。

まとめ

GPUドライバ(libmali)を元システムからコピーしてきたり、ネットから拾ってきて当てようとしていますが、うまく動いていません。
音は出たり出なかったりします。(alsamixerからSPKとかにルートを設定してください)
ジョイスティックはスティックだけ動きますが、ボタンは動きません。(なぜ?)

neofetch