きっかけ
そもそも私のLANDISK HDL-TはメインラインカーネルでArchLinuxARMを動かしていましたが、今月(2022/02)でARMv5のサポートが終了してしまい、レポジトリが完全に消滅しました。
これから一切更新がないというのも困ってしまうので、現状有名なディストロの中で唯一ARMv5をサポートし続けているDebianに乗り換えることにしました。
注意
- 必ずデータのバックアップを取りましょう。元々インストールされていたシステムに戻せなくなります。
- 分解作業・はんだ付けを伴います。
用意するもの
- 空のHDD(バックアップは取ってあると思いますが、別のHDDにインストールすることを推奨します。)
- 適当なPCから取ってきたマザーボードのUSB9ピンヘッダをUSB端子へ変換するケーブル(オプション)
- 他のARMv5なボード(既にLinuxが動作している必要があります)
追記: 他のボードがない場合でも既存のLinuxインストールを利用したりインストーラのデバイスツリーをパッチすれば同様のことは可能だと思われます。検証はしていません。
改造
まずは改造を行います。
分解
- 電源プラグ、イーサネットケーブルを抜きます。
- 外枠を外します。背面にある2つのネジを外し、スライドさせると外れます。
- ファンの配線をコネクタから外します。
- ファンの線を切らないよう注意しながら金属の筐体をカバーからまっすぐ引き抜きます。
- 金属板からHDDのネジを取り外します。正面からSATAソケットを下にして見たとき、右に2箇所、左に1箇所、裏面に1箇所あります。
- HDDを上に向かってまっすぐ引き抜きます。
- 基盤と金属板を留めているネジを全て取り外します。
はんだ付け
基盤を裏返すと、丁度金属板に長方形の穴が空いていた部分に横に5つ並んだピンヘッダ(未実装)があるはずです。
シリアルコンソールになっているので、適当なピンヘッダを実装します。
シリアルコンソールの接続
ピンヘッダは、以下のような配列で並んでいます。
pin | io |
---|---|
1 | - |
2 | RX |
3 | TX |
4 | GND |
5 | - |
-
と表記のある場所は接続しなくて構いません。
接続した状態で起動すると、以下のようなヘッダーが出力されたあとLinuxが起動するはずです。
============================================================
HLS-C series Initial boot loader
Copyright (C) 2008-2011 I-O DATA DEVICE, INC.
============================================================
USBの接続(オプション)
後述するdebootstrapの実行時に直接HDDに書き込んでしまいたい場合等があると思います。
他にもUSBは様々な用途に用いることができるので設置しておいて損はありません。
基盤表面に通常のPCのマザーボードと同様の9ピンUSBヘッダがあります。
そちらに用意した変換ケーブルを接続することでUSBを利用できます。
既にLinuxを導入済みで、次項のRootFSの準備に実機を使用する場合、HDD等を接続しLinuxを起動してください。
RootFSの準備
取り敢えずまずはDebianのRootFSを用意する必要があります(インストーラを利用しない場合)。
しかし、DebianはRootFSのtarballを配布していないためdebootstrap
を実行してFSを作成する必要があります。
debootstrapはただのbashスクリプトですが、クロス実行に対応していない1ため同じARMv5なボードの上で動かす必要があります。
QEMU等の仮想環境でも動作するとは思いますが、検証していません。
ここではarchlinuxARMを既に導入済みの環境に向けて解説します。
フォーマット
インストール先のHDDを用意します。
所謂mbrパーティションテーブルとしてフォーマットし、以下のようにパーティションを区切ります。
No. | Type |
---|---|
1 | FAT32 |
2 | Linux |
パーティションが区切れたら、フォーマットを行います。
デバイスのパスは適当なものに置換してください。
|
|
完成したら、パーティションをマウントします(USBでHDL-Tに接続している場合)。
|
|
debootstrapのダウンロード
debianのレポジトリやpacman -S debootstrap
からdebootstrapを入手します。
編集
何故か現状のdebootstrapはarmelがpacmanからArchitectureを取得する際のリストに含まれていないため、Unknown architecture
なるメッセージが出て実行に失敗します。
従って、debootstrapを編集する必要があります。
私はズボラなのでこのようにしました。
|
|
実行
完成したら実行します。
debootstrap
のパスや/mnt/debian
(インストール先)のパス、testing
(バージョン)は適当なものに置換してください。
|
|
RootFSのセットアップ
以降の作業は基本的にこちらの記事を基本にして行いますが、一部環境により相違点があることに注意してください。
/boot/efi
はefi起動ではない環境で使うと紛らわしいので、/boot/u-boot
等のお好きな名前に読み替えましょう。/boot/u-boot
は/dev/sdX1
(デバイスの最初のパーティション)になるはずです。- マウントポイントをここでは
/mnt/debian
にしているので、従っている人は/media
を読み替えて考える必要があります。 - カーネルパッケージは
linux-image-marvell
になります。 - ブートローダーは使いません。
- 宗教上の理由でvimが使えない方は、デフォルトのEDITORを別のものにする必要があります。
DTB(Device Tree)の準備
素のDebianにはHDL-TのDevice Treeがないので、自分でdtbファイルを用意する必要があります。
この作業はLinuxで動作するPC(母艦)で行うことをおすすめします。
- Linuxカーネルソースをダウンロードします。
tar xvf linux.tar.gz
等で解凍します。arch/arm/boot/dts/kirkwood-cloudbox.dts
をベースにして、以下のように編集します(新規にdtsを登録しても良いですが、cloudboxとしてビルドしてしまう方が早いです。)
|
|
私はLEDをそれぞれheartbeat,disk,panicに割り当てていますが、お好きなものに変更してください。
以上の内容が実行できたら、以下のようにしてdtsをdtbへビルドします。
|
|
カーネルごとビルドする場合や、上手く行かない場合は以下のようにします。
|
|
実行が完了すると、kirkwood-cloudbox.dtb
がdtsと同階層に生成されるので、HDDへコピーします。
カーネルをビルドした場合はarch/arm/boot
にzImage
等が生成されるので、同様にします。
U-boot イメージの準備
“RootFSの準備"項でのchroot環境に入っているものとして話を進めます。
カーネルとさきほど準備したdtbを結合します。
カーネルの場所はバージョン等によって適宜調整してください。
|
|
u-boot-tools
をインストールします。
|
|
インストールが済んだら、mkimage
でu-bootから読み取れるヘッダーを追加したイメージを生成します。
|
|
debianのカーネルを使用する場合、RAMDisk(Initrd)が必要になると思いますので、そちらも同様に生成します。
|
|
終了したら、結果のuImage
とuInitrd
(必要な場合)をコピーします。
/boot/u-boot
等にFATパーティション(ブートパーティションとなる1番)がマウントされていることを確認し、以下のようにコピーします。
場所は適当なものに置き換えてください。
|
|
U-bootの設定
ここまで完了したら、NASを再起動してください。
u-bootの起動シーケンス中にEscを連打すると自動実行が停止し、プロンプトHLS-C>>
に移行します。
移動したら、以下のように設定を書き換えます。
端末等によってコピペで実行すると上手く行かない場合があるため、真心を込めた手入力を強く推奨します。
また、1行目に打ったコマンドが環境によって上手く動作しない場合があるため、お祈りの意味を込めて以下のコマンドを入力する前にCtrl + C(<INTERRUPT>
)をしておくことを推奨します。
setenv bootargs console=ttyS0,115200 root=/dev/sda2 rw
setenv bootcmd 'ide reset;fatload ide 0:1 800000 /uImage;fatload ide 0:1 1100000 /uInitrd;bootm 800000 1100000'
saveenv
ここまで実行し終えたら一旦NASの電源をリセットします。
systemdが起動すれば成功です!お疲れ様でした!
~> neofetch
_,met$$$$$gg. root@HDL-T
,g$$$$$$$$$$$$$$$P. -----------
,g$$P" """Y$$.". OS: Debian GNU/Linux bookworm/sid armv5tel
,$$P' `$$$. Host: I-O DATA HDL-T Series
',$$P ,ggs. `$$b: Kernel: 5.15.0-3-marvell
`d$$' ,$P"' . $$$ Uptime: 4 hours, 41 mins
$$P d$' , $$P Packages: 430 (dpkg)
$$: $$. - ,d$$' Shell: fish
$$; Y$b._ _,d$P' Terminal: /dev/ttyS0
Y$$. `.`"Y$$$$P"' CPU: Marvell Kirkwood (Flattened Device Tree) (1) @ 1.000GHz
`$$b "-.__ Memory: 35MiB / 246MiB
`Y$$
`Y$$.
`$$b.
`Y$$b.
`"Y$b._
`"""
注意
DebianカーネルでuImage/uInitrdを生成した方はapt upgrade
後にカーネルの更新があった場合再生成を忘れないでください。
ハマったポイント
U-boot
Verifying Checksum ... Bad Data CRC
mkimageのコマンドを間違えていませんか?
Invalid FAT entry
FATファイルシステムを再フォーマットして再度ファイルを配置してください。