JavaScriptを有効にしてください

LANDISK HDL-Tシリーズで最新のDebianを動作させる

 ·   ·  ☕ 9 分で読めます

きっかけ

そもそも私のLANDISK HDL-TはメインラインカーネルでArchLinuxARMを動かしていましたが、今月(2022/02)でARMv5のサポートが終了してしまい、レポジトリが完全に消滅しました。
これから一切更新がないというのも困ってしまうので、現状有名なディストロの中で唯一ARMv5をサポートし続けているDebianに乗り換えることにしました。

注意

  • 必ずデータのバックアップを取りましょう。元々インストールされていたシステムに戻せなくなります。
  • 分解作業・はんだ付けを伴います。

用意するもの

  • 空のHDD(バックアップは取ってあると思いますが、別のHDDにインストールすることを推奨します。)
  • 適当なPCから取ってきたマザーボードのUSB9ピンヘッダをUSB端子へ変換するケーブル(オプション)
  • 他のARMv5なボード(既にLinuxが動作している必要があります)

追記: 他のボードがない場合でも既存のLinuxインストールを利用したりインストーラのデバイスツリーをパッチすれば同様のことは可能だと思われます。検証はしていません。

改造

まずは改造を行います。

分解

  1. 電源プラグ、イーサネットケーブルを抜きます。
  2. 外枠を外します。背面にある2つのネジを外し、スライドさせると外れます。
  3. ファンの配線をコネクタから外します。
  4. ファンの線を切らないよう注意しながら金属の筐体をカバーからまっすぐ引き抜きます。
  5. 金属板からHDDのネジを取り外します。正面からSATAソケットを下にして見たとき、右に2箇所、左に1箇所、裏面に1箇所あります。
  6. HDDを上に向かってまっすぐ引き抜きます。
  7. 基盤と金属板を留めているネジを全て取り外します。

はんだ付け

基盤を裏返すと、丁度金属板に長方形の穴が空いていた部分に横に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

パーティションが区切れたら、フォーマットを行います。
デバイスのパスは適当なものに置換してください。

1
2
mkfs.vfat -F32 /dev/sdb1
mkfs.ext4 /dev/sdb2

完成したら、パーティションをマウントします(USBでHDL-Tに接続している場合)。

1
2
mkdir -p /mnt/debian
mount /dev/sdb2 /mnt/debian

debootstrapのダウンロード

debianのレポジトリやpacman -S debootstrapからdebootstrapを入手します。

編集

何故か現状のdebootstrapはarmelがpacmanからArchitectureを取得する際のリストに含まれていないため、Unknown architectureなるメッセージが出て実行に失敗します。
従って、debootstrapを編集する必要があります。
私はズボラなのでこのようにしました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
diff --git a/bin/debootstrap b/debootstrap
index 487b617..b5b98bc 100755
--- a/bin/debootstrap
+++ b/debootstrap
@@ -550,7 +550,7 @@ elif in_path pacman-conf; then
                x86_64)  HOST_ARCH=amd64 ;;
                armv7h)  HOST_ARCH=armhf ;;
                aarch64) HOST_ARCH=arm64 ;;
-               *) echo "Unknown architecture: $CARCH" && exit 1
+               *) HOST_ARCH=armel ;;
        esac
 fi
 HOST_OS="$HOST_ARCH"

実行

完成したら実行します。
debootstrapのパスや/mnt/debian(インストール先)のパス、testing(バージョン)は適当なものに置換してください。

1
debootstrap --arch arm testing /mnt/debian http://ftp.jp.debian.org/debian

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(母艦)で行うことをおすすめします。

  1. Linuxカーネルソースをダウンロードします。
  2. tar xvf linux.tar.gz等で解凍します。
  3. arch/arm/boot/dts/kirkwood-cloudbox.dtsをベースにして、以下のように編集します(新規にdtsを登録しても良いですが、cloudboxとしてビルドしてしまう方が早いです。)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
diff --git a/home/h2yk/Projects/linux/linux-5.4.178/arch/arm/boot/dts/kirkwood-cloudbox.dts b/kirkwood-cloudbox.dts
index 448b0cd..e34d1dc 100644
--- a/home/h2yk/Projects/linux/linux-5.4.178/arch/arm/boot/dts/kirkwood-cloudbox.dts
+++ b/kirkwood-cloudbox.dts
@@ -5,7 +5,7 @@
 #include "kirkwood-6281.dtsi"

 / {
-	model = "LaCie CloudBox";
+	model = "I-O DATA HDL-T Series";
 	compatible = "lacie,cloudbox", "marvell,kirkwood-88f6702", "marvell,kirkwood";

 	memory {
@@ -21,8 +21,8 @@
 	ocp@f1000000 {
 		pinctrl: pin-controller@10000 {
 			pmx_cloudbox_sata0: pmx-cloudbox-sata0 {
-				marvell,pins = "mpp15";
-				marvell,function = "sata0";
+				marvell,pins = "mpp4";
+				marvell,function = "sata1";
 			};
 		};

@@ -56,34 +56,41 @@
 		};
 	};

-	gpio_keys {
-		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
-
-		power {
-			label = "Power push button";
-			linux,code = <KEY_POWER>;
-			gpios = <&gpio0 16 GPIO_ACTIVE_LOW>;
-		};
-	};
-
-	gpio-leds {
-		compatible = "gpio-leds";
-
-		red-fail {
-			label = "cloudbox:red:fail";
-			gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
-		};
-		blue-sata {
-			label = "cloudbox:blue:sata";
-			gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>;
-		};
-	};
+        gpio_keys {
+                compatible = "gpio-keys";
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                power {
+                        label = "Power push button";
+                        linux,code = <KEY_POWER>;
+                        gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
+                };
+        };
+
+        gpio-leds {
+                compatible = "gpio-leds";
+
+                green {
+                        label = "hdlt:green:power";
+                        gpios = <&gpio0 28 GPIO_ACTIVE_HIGH>;
+                        linux,default-trigger = "heartbeat";
+                };
+                orange {
+                        label = "hdlt🍊warn";
+                        gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+                        linux,default-trigger = "disk-activity";
+                };
+                red {
+                        label = "hdlt:red:error";
+                        gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
+                        linux,default-trigger = "panic";
+                };
+        };

 	gpio_poweroff {
 		compatible = "gpio-poweroff";
-		gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
 	};
 };

私はLEDをそれぞれheartbeat,disk,panicに割り当てていますが、お好きなものに変更してください。
以上の内容が実行できたら、以下のようにしてdtsをdtbへビルドします。

1
make -j16 dtbs

カーネルごとビルドする場合や、上手く行かない場合は以下のようにします。

1
2
3
4
5
6
7
8
9
#!/bin/sh

export ARCH=arm
export CROSS_COMPILE=arm-none-eabi-
export LOCALVERSION=-YOURVERSION

make mvebu_v5_defconfig
make xconfig # 設定を編集する場合
make -j16 zImage dtbs

実行が完了すると、kirkwood-cloudbox.dtbがdtsと同階層に生成されるので、HDDへコピーします。
カーネルをビルドした場合はarch/arm/bootzImage等が生成されるので、同様にします。

U-boot イメージの準備

“RootFSの準備"項でのchroot環境に入っているものとして話を進めます。

カーネルとさきほど準備したdtbを結合します。
カーネルの場所はバージョン等によって適宜調整してください。

1
cat /boot/vmlinuz-5.15.0-3-marvell kirkwood-cloudbox.dtb > hdlt.tmp

u-boot-toolsをインストールします。

1
apt install u-boot-tools

インストールが済んだら、mkimageでu-bootから読み取れるヘッダーを追加したイメージを生成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mkimage -A arm -O linux -T kernel -C none -a 0x00800000 -e 0x00800040 -n 'Linux' -d hdlt.tmp uImage

# Output:

# Image Name:   Linux
# Created:      Thu Jan 27 08:41:20 2022
# Image Type:   ARM Linux Kernel Image (uncompressed)
# Data Size:    2532747 Bytes = 2473.39 KiB = 2.42 MiB
# Load Address: 00800000
# Entry Point:  00800040

debianのカーネルを使用する場合、RAMDisk(Initrd)が必要になると思いますので、そちらも同様に生成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mkimage -A arm -T ramdisk -C none -n uInitrd -d /boot/initrd.img-5.15.0-3-marvell uInitrd

# Output:

# Image Name:   uInitrd
# Created:      Thu Jan 27 08:39:16 2022
# Image Type:   ARM Linux RAMDisk Image (uncompressed)
# Data Size:    17241653 Bytes = 16837.55 KiB = 16.44 MiB
# Load Address: 00000000
# Entry Point:  00000000

終了したら、結果のuImageuInitrd(必要な場合)をコピーします。
/boot/u-boot等にFATパーティション(ブートパーティションとなる1番)がマウントされていることを確認し、以下のようにコピーします。
場所は適当なものに置き換えてください。

1
cp uImage uInitrd /boot/u-boot

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ファイルシステムを再フォーマットして再度ファイルを配置してください。

共有

hayabusa2yk
著者
hayabusa2yk
Dev/Admin of servers