おはよう君需要なし

求不得苦な日々

SONYの MANOMA NCP-HG100 で Debian Buster を起動する(するだけ)

何を言ってるかわからねえと思うが…(略

f:id:yoh_mar28:20201221023729p:plain
Debian

はじめに

以前、SONY が NCP-HG100 というAIスマートホームゲートウェイというルーターをOpenWRTベースで出していて、GPLLinuxソースコード開示している、という話をしました。

nodemand.hatenablog.com

そんな開示されているソースコードですが、QSDKというSDKから切り出された一部であり、このソースコードさえあればビルド可能な環境が手に入るかというとそうではありません。

現在の OpenWRT と 当該QSDK では書き方が変わっている部分があったり、そもそもOpenWRTに取り込まれていないドライバがあったりと、素人の私には手の出しづらい領域でした。(とりあえず OpenWRT 19.07あたりは動かしたけど…その次の一手が打てなかった)

ではどうするか

というわけで、私にもできないことがないか?と考えたところ「linux-4.4にはフルのlinuxカーネルが含まれているのだから、DebianのrootfsマウントすればDebian動くんじゃね?」という仮説でした。

ファンとスピーカーとタッチパネルとLEDが付いたarmhf な Debian が手に入る。素敵ではないか。

実践

というわけでやってみました。結論からいくと素の linux-4.4 ではダメです。

カーネルコンフィグ

とりあえず、展開した linux-4.4 で

make menuconfig ARCH=arm

としてカーネルのコンフィグをいじっていきます。いきなりmmcにrootfsを書くのは自殺行為なので ext4 でフォーマットしたUSBをマウントできるようにします。(.configはいじりすぎてカオスになってしまったので、いつか整理したい。というか今考えるとこれもいらない手順だったか?)。あとはDebianでsystemdとか使うのでそれようのコンフィグとかします()

ビルド

カーネルをビルドしてから、ubootに食わせる FIT イメージを生成します。

カーネル

カーネルをビルドするコマンドはこれです↓

CC="ccache gcc" make zImage modules dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

ローダブルカーネルモジュールはこれで生成できます

CC="ccache gcc" make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/path/to/install_mod/

/path/to/install_mod/lib/module/4.4.60/ みたいなディレクトリにコンフィグでM指定したモジュールが生成されます。

FIT イメージ

FIT イメージ生成用の .its ファイルには、OpenWRTのスクリプトが便利なのでそれを使います。

/home/user/dev/openwrt/scripts/mkits.sh -A arm -C none -c config@1 -a 0x80208000  -e 0x80208000 -v 4,4.60 -k ./arch/arm/boot/Image -D manoma -d ./arch/arm/boot/dts/qcom-ipq4019-ap.dk04.1-c4.dtb -o manoma_fit.its

で、できた manoma_fit.itsmkimage に食わせれば uboot で使用可能な FITイメージができあがります。

mkimage -f manoma_fit.its manoma_fit.itb

initramfs (initrd) 生成

ここらへんの手順、だいぶ整理できてなくてカオスなんですが、メモとして残します。

まず、前提として、ext4でフォーマットしたUSBのパーティションに debootstrap で構成した armhf の rootfs を生成します。(qemu と debootstrap で頑張る)。

(/dev/console がないといざ起動しようとするとカーネルパニックが発生するので、mknod で作ります)

次に、公式ファームで起動したmanomaにそのUSBを差し、debootstrap で生成した環境に chroot します。

chroot /mnt/USBDriveA/

みたいな。その状態で update-initramfs を呼び出すと initrd が /boot に生成されるのでそれを何らかの方法でホストにコピーします。(これmanomaでやる必要ないかも)

update-initramfs で 生成した initrd は cpio を gzip したものなので、zcat initrd.img-4.4.60 > initrd-4.4.60.cpio みたいな感じで cpio にします。

この cpio の活用方法なんですが、 FITイメージに同梱すると、カーネル起動時に読み込んで中の init スクリプトを実行してくれるようになるので、カーネルのコンフィグで設定します。

f:id:yoh_mar28:20201221165611p:plain
cpio埋め込むコンフィグの図

いざ起動

ここまで準備できたら uboot でコマンドを

env set fdt_high 87000000
env set bootargs console=ttyMSM0,115200n8 root=/dev/sda1 rootfstype=ext4 
tftpboot manoma_fit.itb

最初はいきなり再起動がかかって失敗したかと思いましたが、再度起動したらちゃんとターミナルが表示されました。

f:id:yoh_mar28:20201221170918p:plain
Debian on manoma

終わりに

まぁここまでやった人はわかると思いますが、ブートするだけです。ネットワークインタフェースなどは全然認識されず、eth0eth1 もない!!どうしてこうなった!!!!

おまけ

manomaいじりには↑みたいなオスがバネになってるテストワイヤがすごく便利でした。

続きます

次回、ネットワークを有効にします!!!