Qua StationにArch Linuxをインストールする(ほぼ完成)

最近USBメモリをくれた友人のせいでQua Stationがアツいのですが、やっぱりAndroidの上でchrootしてお茶を濁したところでサーバーにはなり得んのです。systemctl使いてぇ

で、ネイティブに動かすノウハウがある程度溜まったので公開します。

正直俺はマイサーバーがあるのであったところでなのですが、うまく動くようならこれ2台体制ぐらいに移行してもいいかなとか思ってます。

まあ殆どはライバル心というか起動しないからには起動させたい的な心で動いてるわけですが…

※この記事に書いてあることは半分ぐらい友人の成果物です

あとArchLinuxをインストールとか書いてますがどっちかというとデバイスについて成分が多めです。

 

1,ブートローダー

で、まずブートローダーを探っていきます。

どうも第一ローダーでオプションをセットしたあとDTB、ramdisk、カーネル、ファームウェアを読み込んで第二ローダーへ移行するようです。

bootrというコマンドでいろいろ読み込んで第二ローダーに行きます。

b2ndbcというコマンドで何もせずに第二ローダーに行きます。

第一ローダーで使えるコマンド一覧は

こんなかんじでした。USB(XHCIに対応してます!)やmmc等のコマンドが充実しています。

デフォの環境変数はこんな感じです。第二ローダーへ移行していく過程が見て取れます。

パスワードやSSIDが普通に書いてありますが使う気はないので問題ありません(←??)

そして第二ローダーはこんな感じです

起動系やメモリ操作系が充実してますね。

なんの意味があるのかは正直わからないのですが、こんな感じに2つu-bootを使い分けているようです。

また、通常起動時に

こういう表示が出てきますが、実はどれか1つでもチェックサムが合わないとそこで中断し、LOAD GOLD FW TABLEという表示を出しながらバックアップ用のシステムが起動してきます。

(写真from友人)

ここで起動するGOLD FWは後述するzidooのrescueとそっくりです。もしかしたら同じなのかもしれません。

あとローダーに入りにくいので5秒待つようにしときましょう。

ブートローダはこんなもんかな、次~

 

2,カーネル

とりあえずこいつではLinux 4.1.17のAndroidが動いています。

別のシステム動かねえかな~と、構成が比較的似ていてSoCが同じなZidoo X9Sのリカバリを動かしてみることにしました。

第一ブートローダーのgoruというコマンドが気になったからです。

https://www.zidoo.tv/Support/downloadList/target/rRwtRFydZ4xKKmVViAFMcQ%3D%3D.html

スクショがめんどいので載せませんが結果Zidooのリカバリ入USBメモリからOpenWRTというホスト名でレスキュー用のLinuxが起動しました。

またこれも4.1.17でした。RTD1295がサポートされた4.1.17がRealtekとかから入手できるんじゃないかなぁと思います。

 

一応他のカーネルが動くなら自分でビルドしたのも動くのかなっていうことで5.0.9で試してみました。

ちょっと前にRTD1295サポートが入っており、Zidoo X9sのデバイスツリーもあります。

適当にRTD1295サポートを入れてビルドしたものをZidooのレスキューUSBメモリに入れ、第一ローダーで

こうすることでとりあえず起動します。(※ramdiskやArchについては後述)

あとrescue.emmc.dtbだとメモリが500MB弱しか認識されません。android.emmc.dtbだと1.6GBになります。

systemdも動いていい感じ~と思いきや、USBドライバやSATAドライバが入っていないためルートデバイスをみつけることができませんでした。

 

3,Archをインストール

(上の続き)ならZidooカーネルならどうやと試したところ…

動きました!

debugつけてるのでコンソールが忙しいですが、とりあえずsystemdが1で起動しているのでsystemctlとかも使い放題です。

ZidooカーネルはSATAをサポートしているのでHDDをルートデバイスにできます。ほぼパソコンです。

 

というわけで、Archのインストール方法なのですが、ほぼ

https://archlinuxarm.org/platforms/armv8/generic

のままやるだけです。というかルートデバイスについてはこのままやってOKです。

問題はramdisk。

普通にarchlinuxarmのbootの中にあるinitramfs-linux.imgを読み込んだだけだと

Initramfs unpacking failed: junk in compressed archive

と言われて展開に失敗します。

どうも0x1000バイトずつ読んでいるようで、その間は終端文字の後であってもゴミは許されないようです。

適当にddで後方を埋めときましょう。

initrd=0x02200000,0x7F0000と指定したなら終端から8Mのところまで埋めとくと確実でよいです。

スマートとは言い難いやり方ですがこれしか思いつきませんでした…

→すいません、rootでHDDを指定してinit=/sbin/initにすれば普通に動きました…

early-hook等を使用しない場合はramdiskにこだわらなくてもいいと思います。

あとはZidooのカーネルを使って起動すれば動いてくれます

 

が!!

最初に書いたとおりネットワークがまともに動いてくれません。

具体的に言えばdhcpcdでアドレスを取得しようにも192.168.255.20/24のアドレスを取得してしまい(どの携帯のUSBテザリングでもこうなります。)

手動で設定してもパケットが通りません。またネットワークを使おうとするたびSELinuxの警告が出てきます。多分Enconfigになってるんじゃないかな…

→違いました。Qua Station内蔵LTEモデムがusb0として認識されてたみたいです。なので携帯のテザリングが認識されていなかったようです

ドライバをビルドできる環境がほしいです。

しかし、zidooの/system/vendor/modulesを見ていたところ、RTL8192EEとRTL8812AEのドライバを発見しました。

適当にコピーしてinsmodしてみると…

無事Wi-Fiが認識されました

rtk-btusb.koをinsmodすればBluetoothも使えるんじゃないですかね、試してないのでわかりませんが

そして、今の僕の環境、実はArchLinuxARM-aarch64-latest.tar.gzではなくpacstrapで作ったものなのでNetworkManagerもついでに入ってます。

pacstrapでaarch64用のシステムを作る

なのでsystemctlでNetworkManagerを立ち上げたあとnmcliで設定すると…

https://qiita.com/youyo_/items/376503446135c0dd3da7

無事にネットに繋がりました!

しかしAndroidのCONFIG_ANDROID_PARANOID_NETWORKのせいでグループに所属していないとソケット通信とかができません

https://stackoverflow.com/questions/36451444/what-can-cause-a-socket-permission-denied-error

こんなんで屈する訳にはいかないのでauにOSS開示のメールを送ってみました。

とりあえず宿題でもやりながら待ちたいと思います。宿題多すぎてキレそう(どうでもいい)

 

EMMCを使った自動起動はauからカーネルソースをもらってからやろうと思いますが、USBメモリを使った自動起動だとbootcmdをちょっといじるだけでできてお手軽です。

ここまでくれば(ひと手間かかりますが)ほぼサーバーですね!

Androidの上にchrootで寄生していたときより圧倒的に使いやすいです。

(いつもの)

ちなみに電源管理も一応出来てるみたいで再起動もちゃんとできます。ただ電源を切ると一回プラグを抜くまで動きません…(仕様..?)

 

4,最後に

えーというわけで未完成です。auからの返事を待ちたいと思います。

 

#2019/5/31追記

書き忘れてましたが、auからカーネルソースを送ってもらえました。

https://github.com/Haruroid/linux-kernel-kts31

僕は今テスト期間なので何もできませんが終わったらなんかやろうと思ってます。5.1に移植とか…

にしてもカスタマイズされたカーネルっていうのはどれも面倒くさいですね…

SC-03Eのときもそうでしたが特定のオプションをオンにしないとビルドできないとか余裕であります…

 

https://drive.google.com/file/d/1U_OucdZhlmwdZV7v_Yzlm_NUTqGU_a7L/view

もらったDVDの生ISOはこちらです。Android側のものがいろいろ入ってます。

#追記終わり

 

でもなんでzidooもカーネルを開示してないんですかね、Realtekてそういう契約するところだっけ、よく知らないのでわかりません

ちなみにおまけとして書いとくと、

Normal boot fw follow…
Kernel:
FW Image to 0x03000000, size=0x00fe6600 (0x03fe6600)
FW Image fr 0x02a25400
DT:
FW Image to 0x01f00000, size=0x0000f7b4 (0x01f0f7b4)
FW Image fr 0x026b0200
ROOTFS:
FW Image to 0x02200000, size=0x00400000 (0x02600000)
FW Image fr 0x0460ba00
Audio FW:
FW Image to 0x01b00000, size=0x00335160 (0x01e35160)
FW Image fr 0x026f0200

のとおりmmcblk0から

dd if=/dev/mmcblk0 of=./some.img bs=1 skip=(FW Image fr:のアドレスを10進にしたもの) count=(size=を10進にしたもの)

で各イメージを吸い出せます。

最初これのカーネルとdtbで試してたのですが、ウォッチドッグがどうしても止まらず、30秒付近で強制再起動されてました。

Android側に習って(Androidの)/initをwatchdogdとして起動したりしてみたのですがだめでした

 

ではでは~

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です