何を言ってるかわからねえと思うが…(略
はじめに
以前、SONY が NCP-HG100 というAIスマートホームゲートウェイというルーターをOpenWRTベースで出していて、GPLなLinuxをソースコード開示している、という話をしました。
そんな開示されているソースコードですが、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.its
を mkimage
に食わせれば 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 スクリプトを実行してくれるようになるので、カーネルのコンフィグで設定します。
いざ起動
ここまで準備できたら uboot でコマンドを
env set fdt_high 87000000 env set bootargs console=ttyMSM0,115200n8 root=/dev/sda1 rootfstype=ext4 tftpboot manoma_fit.itb
最初はいきなり再起動がかかって失敗したかと思いましたが、再度起動したらちゃんとターミナルが表示されました。
終わりに
まぁここまでやった人はわかると思いますが、ブートするだけです。ネットワークインタフェースなどは全然認識されず、eth0
も eth1
もない!!どうしてこうなった!!!!
おまけ
manomaいじりには↑みたいなオスがバネになってるテストワイヤがすごく便利でした。
続きます
次回、ネットワークを有効にします!!!