QuaStationでArchlinuxを動作させる

こんにちは。u-haruです。

前の記事で「最近友人がQuaStationを買って…」とか言ってたのに、その友人がQuaStationのu-bootを吹っ飛ばして文鎮化させてました。

同じような被害を防ぐためにも、早く記事の続きを書かなければ…

というわけで、引き続き作業を進めていきましょう。今回はQuaStationでArchlinuxを動作させます。

シリアル線の準備

QuaStationのコンソールにアクセスするためには、シリアルケーブルを引き出す必要があります。

QuaStationの底面の四隅にある足を剥がして、ネジを外します。このときにT-10のトルクスドライバーが必要になるので注意して下さい。

次に、シリアル端子を探して線をつなぎます。下の画像を参考にして下さい。

※注意 もしかしたらTxとRxが逆かもしれません。その時はすみません。

Quastation_serial

線をつけたら、それをUSB-Serial変換基板等を用いてPCと接続します。

そしたら、TeraTermを起動してシリアルコンソールに接続します。ボーレートは115200です。

つなぎ終わったら電源を入れます。色々画面に出力されますが、途中でEscを連打することでu-bootの画面に入れます。

入れたら準備は終了です。

USBからブート

QuaStationに、前回までで用意したUSBを刺します。そしたら、u-boot画面で以下のコマンドを順に入力して下さい。
PARTUUID="~“のところは以前メモったパーティションUUIDに変えてください。(例:root=PARTUUID="0444ac2b-01")
めんどくさければroot=/dev/sda2とかでもいいです。

> usb start
> fatload usb 0 0x01f00000 /bpi-w2.dtb
> fatload usb 0 0x03000000 /uimage
> env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200n8 initrd=0x02200000,0x7F0000 root=PARTUUID="~" rw rootwait rootfstype=ext4 init=/sbin/init selinux=0 nmi_watchdog=0 devtmpfs.mount=1
env set bootcmd 'booti 0x03000000 - 0x01f00000'
> b2ndbc

これでうまく行けばArchlinuxが起動するはずです。

USBから自動起動するには、以下のコマンドをu-boot内で実行して下さい。
上のコマンドをすべて一行に圧縮してbootcmdに設定して、セーブしてるだけです。PARTUUIDは場合に応じて変えて下さい。

> env set bootcmd "usb start;fatload usb 0 0x01f00000 /bpi-w2.dtb;fatload usb 0 0x03000000 /uimage;env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200n8 initrd=0x02200000,0x7F0000 root=PARTUUID="~" rw rootwait rootfstype=ext4 init=/sbin/init selinux=0 nmi_watchdog=1 devtmpfs.mount=1;env set bootcmd 'booti 0x03000000 - 0x01f00000';b2ndbc"
> saveenv

これで、次回以降勝手に起動するはずです。

> reset

これで再起動します。

EMMCからブート

さて、USBから起動はできるようになりましたが、常にUSBメモリが刺さっているのはダサいですよね。
QuaStationにはEMMCが8GBも乗っているのだから、そちらを使ってブートすればスッキリするはずです。
というわけで、EMMCから起動できるようにしましょう。

パーティション準備

まず、余計なパーティションを削除します。
cfdiskで/dev/mmcblk1を開きましょう。(もしかしたらmmcblk0になってるかもしれません)

# cfdisk /dev/mmcblk1
                               Disk: /dev/mmcblk1
               Size: 7.29 GiB, 7818182656 bytes, 15269888 sectors
                       Label: dos, identifier: 0x00000000

    Device             Boot        Start       End  Sectors   Size  Id Type
>>  Free space                      2048    196607   194560    95M
    /dev/mmcblk1p1                196608   3237871  3041264   1.5G  83 Linux
    /dev/mmcblk1p2               3237888  12853231  9615344   4.6G  83 Linux
    /dev/mmcblk1p3              12853248  13672431   819184   400M  83 Linux
    /dev/mmcblk1p4              13672448  14942207  1269760   620M   5 Extended
    |-/dev/mmcblk1p5            13672464  13680639     8176     4M  83 Linux
    |-/dev/mmcblk1p6            13680656  13713407    32752    16M  83 Linux
    |-/dev/mmcblk1p7            13713424  14737407  1023984   500M  83 Linux
    `-/dev/mmcblk1p8            14737424  14942207   204784   100M  83 Linux
    Free space                  14942208  15269887   327680   160M

14745600

           [   New  ]  [  Quit  ]  [  Help  ]  [  Write ]  [  Dump  ]

                      Create new partition from free space

大体こんな感じだと思います。
この中で必要なのは最初の95Mと最後の160Mの空きスペースだけです。
ここ以外は消して大丈夫なので、一度すべて消します。
いらないパーティションを選んでDeleteするだけなので簡単です。
※注意 Writeはまだしないで下さい。最後に確認してから書き込みます。

    Device             Boot        Start       End  Sectors   Size  Id Type
>>  Free space                      2048  15269887 15267839   7.4G

こんな感じになると思います。

そしたら、一旦Free spaceのところもパーティションとして作成します。
Newを選んで、194560Sと打ち込みます。
次に、Newを選んで、14745600Sと打ち込みます。
最後に、Newを選んで何も打たずにEnterを押します。
うまく行ってれば、大体こんな感じになるはずです。

    Device             Boot        Start       End  Sectors   Size  Id Type
>>  /dev/mmcblk1p1                  2048    196607   194560    95M  83 Linux
    /dev/mmcblk1p2                196608  14942207 14745600   7.2G  83 Linux
    /dev/mmcblk1p3              14942208  15269887   327680   160M  83 Linux

そしたら、パーティション1と3をDeleteします。

    Device             Boot        Start       End  Sectors   Size  Id Type
>>  Free space                      2048    196607   194560    95M
    /dev/mmcblk1p1                196608  14942207 14745600   7.2G  83 Linux
    Free space                  14942208  15269887   327680   160M

こうなってれば成功です。一応、最初に95Mと最後に160Mがあることを確認して下さい。
範囲を間違えていると、u-bootの範囲と被ってバグる可能性があります。
特に最初のスペースはu-bootが入っているので絶対上書きしてはいけません。上書きしたら最後、二度と動かなくなります。(友人がやらかしました)
確認して大丈夫そうなら、Writeしましょう。yesとタイプしてEnterで書き込み、あとはQuit。

最後に、準備したパーティションをext4でフォーマットしましょう。

# mkfs.ext4 /dev/mmcblk1p1

以上でパーティション準備は完了です。

EMMCにArchlinuxを入れる

めんどくさいですが、もう一度pacstrapで入れ直します。

# systemctl start NetworkManager
# nmtui

これでネットワークに接続して下さい。
つなぎ終わったら、

# pacman -S arch-install-scripts
# mount /dev/mmcblk1p1 /mnt
# pacstrap /mnt base networkmanager sudo

これでEMMCにArchlinuxが入りました。パスワードとか設定するためにchrootします。

# arch-chroot /mnt
//以下、EMMC環境
# passwd
# exit

これで設定は完了です。

次に、カーネルとdtbをEMMCに書き込む準備をします。

ZidooのレスキューUSBを用意する

さて、EMMCに書き込むためには専用のカーネルが必要になります。Zidooから
http://apidl.zidoo.tv/X9S/v2.1.36/ZIDOO_X9S-v2.1.36-202001141356-ota.zip
を落として、適当なUSBに展開してください。フォーマットはfat32です。あと、わかりやすい場所にdtbとカーネルも入れときましょう。

そしたら、それをQuaStationにぶっ刺して、u-bootに入ります。その後、コンソールで

> goru

とだけ実行してください。うまくいけば、レスキュー用コンソールに入れます。
次はいよいよ、EMMCに書き込んでいきます。
USBから起動したArchでも書き込めると思っててこれ書いてませんでした…(2021/6/6 追記)

カーネルとdtbをEMMCに書き込む

まず最初に、カーネルとdtbのサイズを計算します。EMMCのブロックサイズは512byteなので、
・カーネルが21281280Byteなら、21281280 / 512 = 41565 = 0xA25D
・dtbが66613Byteなら、512で割り切れないので多めに計算します(+1ブロック)。66613 / 512 + 1 = 131 = 0x83

この2つの値が書き込みと起動に必要になります。

計算が終わったら、USBから起動したレスキューカーネルから書き込みます。
以下のコマンドで書き込みます。(中括弧で囲ったところの値は変えて下さい)

# dd if=/dev/zero of=/dev/block/mmcblk0 seek=86314 bs=512 count={カーネルのブロックサイズ(今回の例なら41565)}	//EMMCのカーネル部分のゼロ埋め
# dd if=/dev/zero of=/dev/block/mmcblk0 seek=12673 bs=512 count={dtbのブロックサイズ(今回の例なら131)}	//EMMCのdtb部分のゼロ埋め
# dd if=/mnt/usb/uImage of=/dev/block/mmcblk0 seek=86314 bs=512				//EMMCへのカーネル書き込み
# dd if=/mnt/usb/bpi-w2.dtb of=/dev/block/mmcblk0 seek=6488576 bs=1			//EMMCへのdtb書き込み

dtbのゼロ埋めの所、前までseekの値間違えてました…(2021/6/6 修正)

さて、書き込みが終わったら再起動して、再びu-bootに入ります。

u-bootでEMMCから起動する

u-bootに入ったら、次のようにコマンドを実行して下さい。(中括弧で囲ったところの値は変えて下さい)

> env set bootcmd "mmc read 0x03000000 1512a {カーネルのブロックサイズ(今回の例ならA25D)};mmc read 0x01f00000 3181 {dtbのブロックサイズ(今回の例なら83)};env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200n8 initrd=0x02200000,0x7F0000 root=/dev/mmcblk1p1 rw rootwait rootfstype=ext4 init=/sbin/init selinux=0 nmi_watchdog=0 devtmpfs.mount=1;env set bootcmd 'booti 0x03000000 - 0x01f00000';b2ndbc"
> saveenv

これで、次回以降勝手に起動するはずです。
リセットして再起動します。

> reset

USBメモリなしでブートすれば成功です。

終わり

だいぶ駆け足になってしまいましたが、これでQuaStationがLinuxサーバーとして動作するようになりました。(もう少し分けて書いたほうが良かったかも…?)
前回の更新から4ヶ月も空いたので何を書いたかほぼ忘れてて、もしかしたらなにか抜けてるかもしれないです。
なにか分からないところがあったら、Twitterにでも聞いて下さい…
それではまた。

u-haru
u-haru
Engineer

エンジニア@関東

関連項目