QuaStationでArchlinuxを動作させる
こんにちは。u-haruです。
前の記事で「最近友人がQuaStationを買って…」とか言ってたのに、その友人がQuaStationのu-bootを吹っ飛ばして文鎮化させてました。
同じような被害を防ぐためにも、早く記事の続きを書かなければ…
というわけで、引き続き作業を進めていきましょう。今回はQuaStationでArchlinuxを動作させます。
シリアル線の準備
QuaStationのコンソールにアクセスするためには、シリアルケーブルを引き出す必要があります。
QuaStationの底面の四隅にある足を剥がして、ネジを外します。このときにT-10のトルクスドライバーが必要になるので注意して下さい。
次に、シリアル端子を探して線をつなぎます。下の画像を参考にして下さい。
※注意 もしかしたらTxとRxが逆かもしれません。その時はすみません。
線をつけたら、それを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にでも聞いて下さい…
それではまた。