HDL2-TA2 メモ

# HDL2-TA2 メモ

I-O DATA の [HDL2-TA2](https://www.iodata.jp/product/nas/personal/hdl2-ta/) という NAS を手に入れたのでバラしてみました。

私が入手した個体は Toshiba DT01ACA100 が載っていました。ショッピングサイト等のレビューを見る限り Western Digital や Seagate が入っていることもあるようですが、いずれも NAS 用の HDD が載っているわけではなさそうです。

HDD は暗号化されていてディスクを取り外して母艦につないでも一筋縄では読めないし、別の個体に刺しても起動できません。また、OS は HDD に入っていてディスクが 2台とも死ぬと起動できなくなります。片方壊れたら速やかに交換しましょう。[メーカー純正の交換用 HDD](https://www.iodata.jp/product/nas/option/hdla-opbg/) もありますが 2台死んだ状態から復旧できるのかどうかは不明です。

それにしてもこの機種はネットの情報が少ない印象です。マイナーな機種なんでしょうか。

## シリアルコンソール
バラし方は、基本的には見えているネジを順番に外すだけですが、途中で2本だけ底面のゴム足に隠れているネジがあります。
基板が見えるまでバラすと<ruby><rb>表</rb><rp>（</rp><rt>おもて</rt><rp>）</rp></ruby>面（チップが乗っている面、組み付けたときに下になる側）にピンヘッダが見えます。これがシリアルポートです。あらかじめピンヘッダがついているので半田付けの手間がありません。素晴らしいですね！
シリアルポートの設定は115200bps、データ8、パリティなし、ストップ1で、電圧は3.3Vでいけました。
![HDL2-TA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627064/31ec17d7-0a85-d3a7-0d3d-b66919472e4e.png)

**基板単体で起動するとu-bootのプロンプトにアクセスできます。** u-boot関係は詳しくないですが、いろいろできそうです。また、**適当な（FAT32の？）USBメモリとLANケーブルをつないで起動すると、USBメモリ、TFTPサーバの順にカーネルを探しに行く**のが分かります。夢が広がりますね。
```
（略）
2 USB Device(s) found
       scanning usb for storage devices... 2 Storage Device(s) found
** Bad device size - usb 0 **
** Unrecognized filesystem type **
reading boot/zImage.ta
** Unable to read file boot/zImage.ta **
neta@30000 Waiting for PHY auto negotiation to complete...... done
BOOTP broadcast 1
BOOTP broadcast 2
DHCP client bound to address 192.168.1.121 (256 ms)
Using neta@30000 device
TFTP from server 192.168.1.1; our IP address is 192.168.1.xxx
Filename 'HDL2-TA/boot/zImage.ta'.
Load address: 0x1800000
Loading: T T T T ...
```
シリアルコンソールにアクセスできることは確認できたので、いったん置いておきます。

## パーティションの調査
抜いたディスクを母艦につないでパーティションを見てみると、**パーティションは全部で6個切られている**のが確認できます。
#1は EFI システムパーティションと表示されます。ファイルシステムは FAT32 かと思ったら ext4 でした。
#2はおそらくシステムが入っている領域で RAID 構成の上に暗号化されているため直接中身を確認することはできません。
#4は暗号化されておらず普通にマウントして中身を確認できますが具体的な用途は不明です。ファイルシステムは ext4 です。
#5もRAID 構成の上に暗号化されていて中身が確認できません。
#6は大きさからしてデータ置き場ですね。ここも暗号化されています。

#1, #2, #4, #5は容量も大したことないので、壊さないうちにパーティションのイメージを取ってからイメージファイルを使って遊ぶのが良いでしょう。
```
# fdisk -l /dev/sda
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Generic         
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 434FCB62-F02D-4E99-A880-F9C9E8FCBAB5

Device       Start        End    Sectors   Size Type
/dev/sda1     2048    1049599    1047552 511.5M EFI System
/dev/sda2  1049600    5243903    4194304     2G Linux RAID
/dev/sda3  5243904    7341055    2097152     1G Linux swap
/dev/sda4  7341056    7603199     262144   128M Linux filesystem
/dev/sda5  7603200    9700351    2097152     1G Linux RAID
/dev/sda6  9700352 1953525103 1943824752 926.9G Linux RAID

# dd if=/dev/sda1 of=/tmp/hdl2-ta2-p1-left.img bs=512
# dd if=/dev/sda2 of=/tmp/hdl2-ta2-p2-left.img bs=512
# dd if=/dev/sda4 of=/tmp/hdl2-ta2-p4-left.img bs=512
# dd if=/dev/sda5 of=/tmp/hdl2-ta2-p5-left.img bs=512
# dd if=/dev/sdb1 of=/tmp/hdl2-ta2-p1-right.img bs=512
# dd if=/dev/sdb2 of=/tmp/hdl2-ta2-p2-right.img bs=512
# dd if=/dev/sdb4 of=/tmp/hdl2-ta2-p4-right.img bs=512
# dd if=/dev/sdb5 of=/tmp/hdl2-ta2-p5-right.img bs=512
```
念のため左右両方のディスクのイメージを取っておきましょう。

## 暗号化の解除に挑戦
パーティション#2, #5, #6は Linux RAID と認識されているので、まずは RAID を動かします。
```
# losetup -f hdl2-ta2-p2-left.img
# losetup -f hdl2-ta2-p2-right.img
# mdadm --run /dev/md127
```
片方のイメージだけで動かすならこうですね。
```
# losetup -f hdl2-ta2-p2-left.img
# mdadm --stop --scan
# mdadm --assemble /dev/md0 /dev/loop0
maadm: /dev/md0 assembled from 1 drive - need all 2 to start it (use --run to insist).
# ls /dev/md?*
/dev/md127
# mdadm --run /dev/md127
```
しかし、暗号化されているため `mount /dev/md127 /mnt` してもエラーになってしまいます。
**ディスクを暗号化している鍵は基板（フラッシュメモリ）に入っている**ので、どうにかしてこれをぶっこ抜きます。
[シリアルコンソール](#シリアルコンソール)のところで見たように、HDD が見つからなければ USB メモリの `/boot/zImage.ta` を探しに行くので、FAT32 でフォーマットしたUSBメモリを用意してパーティション #1 内の必要なファイルを USB メモリの `/boot` フォルダへコピーします。
USB メモリの中は以下のようになります。
```
/
boot/
    config-4.4.52
    hdl2-ta.dtb
    hdl-ta.dtb
    initrd.img-4.4.52
    System.map-4.4.52
    uInitrd.ta
    vmlinuz-4.4.52
    zImage.ta
```
この USB メモリを HDD を外した HDL2-TA2 に挿して電源を入れると、（ちょっとエラーが出てますが）シリアルコンソールでシェルが使える状態で起動します。無事に起動したら `/dev/mtdblock2` をマウントして `lksystem` と `lkdata` というファイルをUSBメモリにコピーします。`lksystem` はパーティション#2, #5用、`lkdata` はパーティション#6用です（たぶん）。
**これが勝利の鍵だ！！** がお。
```
### check USB installer #################################################
usbinstall: probe: NG_INSTALLER_NOT_FOUND
### check initialization ################################################
### assemble / volume ###################################################


BusyBox v1.22.1 (Debian 1:1.22.0-9+deb8u1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/bin/sh: can't access tty; job control turned off
/ # 
/ # mount -t jffs2 -o ro /dev/mtdblock2 /mnt
/ # cp /mnt/lksystem /mnt/lkdata /tmp
/ # umount /mnt
/ # 
/ # mount /dev/sda1 /mnt
/ # cp /tmp/lksystem /tmp/lkdata /mnt
/ # umount /mnt
```

母艦の Linux に先ほど入手した鍵ファイルをコピーし、cryptsetup と鍵ファイルで暗号化を解除してあげると無事マウントできます。鍵ファイルは大切に保管しておきましょう。

```
# cryptsetup --cipher=aes --key-file=/tmp/lksystem open /dev/md127 --type=plain "md127_enc"
# mount /dev/mapper/md127_enc /mnt
```
暗号化が解除できることを確認したらきちんと後片付けしましょう。
```
# umount /mnt
# cryptsetup close md127_enc
# mdadm --stop /dev/md127
mdadm: stopped /dev/md127
# losetup -d /dev/loop1
```

## ディスクの換装
勝利の鍵が手に入れば大容量ディスクや SSD への換装はそれほど難しくありません。新しいディスクをオリジナルと同じようにパーティショニングし、それぞれのパーティションの中身を新しいディスクにコピーするだけです。対象が多いので左右と新旧を間違えないよう一つ一つ指差しヨシ！！と言いながらやってください。
同じ個体で使うなら暗号化に関しては考慮不要なので dd しても動くはずです。
パーティション#6 は空っぽでも NAS としては起動できるので、WebUI からフォーマットした後でネットワーク越しにデータを移行する方が簡単な気がします。

### 新規ディスクのパーティショニングとフォーマット
```
sectors=$(($(cat /sys/block/sda/size)-64-1))
parted -s /dev/sda \
    mktable gpt \
    unit s \
    mkpart boot      ext4          2048 1049599 \
    mkpart rootfs    ext4       1049600 5243903 \
    mkpart swap      linux-swap 5243904 7341055 \
    mkpart disklabel ext4       7341056 7603199 \
    mkpart data      ext4       7603200 9700351 \
    mkpart sataraid1 ext4       9700352 $(sectors) \
    set 1 boot on \
    set 2 raid on \
    set 5 raid on \
    set 6 raid on
parted -s /dev/sdb \
    mktable gpt \
    unit s \
    mkpart boot      ext4          2048 1049599 \
    mkpart rootfs    ext4       1049600 5243903 \
    mkpart swap      linux-swap 5243904 7341055 \
    mkpart disklabel ext4       7341056 7603199 \
    mkpart data      ext4       7603200 9700351 \
    mkpart sataraid1 ext4       9700352 $(sectors) \
    set 1 boot on \
    set 2 raid on \
    set 5 raid on \
    set 6 raid on

#dd if=/dev/zero of=/dev/sda1 bs=1M
#dd if=/dev/zero of=/dev/sdb1 bs=1M
mkfs.ext4 -E lazy_itable_init=0 /dev/sda1
mkfs.ext4 -E lazy_itable_init=0 /dev/sdb1

mdadm --zero-superblock --force /dev/sda2
mdadm --zero-superblock --force /dev/sdb2
mdadm --create /dev/md2 --level=raid1 --raid-devices=2 --force /dev/sda2 /dev/sdb2
#dd if=/dev/zero of=/dev/md2 bs=1M
cryptsetup --cipher=aes --key-file=/tmp/lksystem open /dev/md2 --type=plain md2_enc
mkfs.ext4 -E lazy_itable_init=0 /dev/mapper/md2_enc

#dd if=/dev/zero of=/dev/sda3 bs=1M
#dd if=/dev/zero of=/dev/sdb3 bs=1M
mkswap /dev/sda3
mkswap /dev/sdb3

#dd if=/dev/zero of=/dev/sda4 bs=1M
#dd if=/dev/zero of=/dev/sdb4 bs=1M
mkfs.ext4 -E lazy_itable_init=0 /dev/sda4
mkfs.ext4 -E lazy_itable_init=0 /dev/sdb4

mdadm --zero-superblock --force /dev/sda5
mdadm --zero-superblock --force /dev/sdb5
mdadm --create /dev/md5 --level=raid1 --raid-devices=2 --force /dev/sda5 /dev/sdb5
#dd if=/dev/zero of=/dev/md5 bs=1M
cryptsetup --cipher=aes --key-file=/tmp/lksystem open /dev/md5 --type=plain md5_enc
mkfs.ext4 -E lazy_itable_init=0 /dev/mapper/md5_enc

mdadm --zero-superblock --force /dev/sda6
mdadm --zero-superblock --force /dev/sdb6
mdadm --create /dev/md6 --level=raid1 --raid-devices=2 --force /dev/sda6 /dev/sdb6
#dd if=/dev/zero of=/dev/md6 bs=1M
cryptsetup --cipher=aes --key-file=/tmp/lkdata open /dev/md6 --type=plain md6_enc
mkfs.ext4 -E lazy_itable_init=0 /dev/mapper/md6_enc
```

### パーティション内容のアーカイブ（イメージファイルから）
```
# partition #1 left and right
mount hdl2-ta2-p1-left.img  /mnt/p1left
mount hdl2-ta2-p1-right.img /mnt/p1right
tar cvfz p1left.tar.gz  -C  /mnt/p1left .
tar cvfz p1right.tar.gz -C  /mnt/p1right .
umount /mnt/p1left
umount /mnt/p1right

# partition #2

losetup --show -f hdl2-ta2-p2-left.img
losetup --show -f hdl2-ta2-p2-right.img

mdadm --run /dev/md127
cryptsetup --type=plain --cipher=aes --key-file=lksystem open /dev/md127 p2enc

mount /dev/mapper/p2enc /mnt/p2
tar cvfz p2.tar.gz -C /mnt/p2 .
umount /mnt/p2

cryptsetup close p2enc
mdadm --stop /dev/md127

losetup -d /dev/loop0
losetup -d /dev/loop1

# partition #4

mount hdl2-ta2-p4-left.img  /mnt/p4left
mount hdl2-ta2-p4-right.img /mnt/p4right
tar cvfz p4left.tar.gz  -C /mnt/p4left .
tar cvfz p4right.tar.gz -C /mnt/p4right .
umount /mnt/p4left
umount /mnt/p4right

# partition #5

losetup --show -f hdl2-ta2-p5-left.img
losetup --show -f hdl2-ta2-p5-right.img

mdadm --run /dev/md127
cryptsetup --type=plain --cipher=aes --key-file=lksystem open /dev/md127 p5enc

mount /dev/mapper/p5enc /mnt/p5
tar cvfz p5.tar.gz -C /mnt/p5 .
umount /mnt/p5

cryptsetup close p5enc
mdadm --stop /dev/md127

losetup -d /dev/loop0
losetup -d /dev/loop1
```

## 新規ディスクへのファームウェア書込みに挑戦（失敗）
I-O DATA の NAS には HDL2-AA0 や HDL2-AAX0 といったドライブレスモデルが設定されている機種もあります。これらの機種はメーカーサイトでドライブレスモデル用のファームウェア（インストーラー？）が配布されているのですが、残念ながら HDL2-TA シリーズにはドライブレスモデルの設定がなくインストール用のファームウェアも配布されていません。
[暗号化の解除に挑戦](#暗号化の解除に挑戦)でUSBメモリから起動したときに見えていた `usbinstall: probe: NG_INSTALLER_NOT_FOUND` をどうにかすればドライブレスモデルと同じようにまっさらのディスクにシステムをインストールできるのではないか？と思い色々と調べましたが、必要なファイル（このメッセージで not found と言われているファイル）がどこにも見当たらず諦めました。


## TODO

### sshdを有効にしたい
sshdが動いてくれるといろいろ遊べるのですが。知っている方がいたら教えてください。

### 暗号化を無効にして運用したい
このHDL2-TAシリーズは常時暗号化されていて WebUI から無効にすることもできません。そのため書込みパフォーマンスがあまり良くありません。もしも暗号化機能を無効にして運用できるようになればパフォーマンスアップが期待できます。

## メモ置き場（未検証）

### カーネルとinitrd
`zImage.ta` と `uInitrd.ta` はパーティション#1の `/` に置いてあるものと、パーティション#1の `rootfs.tgz` の中にあるものの2種類ある。違いははよくわからない。

|file name|partition#1|rootfs.tgz|
|---|---|---|
|vmlinuz-4.4.52   |5,964,588|5,977,339|
|zImage.ta        |5,964,588|5,977,339|
|initrd.img-4.4.52|3,163,988|3,162,288|
|uInitrd.ta       |3,164,052|3,162,352|

### initrd関係
```
initrd.img-4.4.52の展開
# xzcat initrd.img-4.4.52 | cpio -id

uInitrd.ta の展開
# tail -c+65 uInitrd.ta | xzcat | cpio -id

initrd.img の再構築
# find . | cpio -R 0:0 -o -H newc | xz > initrd.img

uInitrd.ta の再構築
# mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initrd.img uInitrd.ta

systemrescuecd で `mkimage` を使えるようにするには
# pacman -Sy
# pacman -S uboot-tools
```

### イメージファイル経由でディスク換装（未検証）
```
# partition #1

dd if=/dev/zero of=p1left.img  bs=512 count=1047552
dd if=/dev/zero of=p1right.img bs=512 count=1047552

mkfs.ext4 p1left.img
mkfs.ext4 p1right.img

mount p1left.img  /mnt/p1left
mount p1right.img /mnt/p1right

tar xvfz p1left.tar.gz  -C /mnt/p1left
tar xvfz p1right.tar.gz -C /mnt/p1right

umount /mnt/p1left
umount /mnt/p1right

# partition #2

dd if=/dev/zero of=p2left.img  bs=512 count=4194304
dd if=/dev/zero of=p2right.img bs=512 count=4194304

losetup --show -f p2left.img
losetup --show -f p2right.img

mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/loop0 /dev/loop1
cryptsetup --type=plain --cipher=aes --key-file=lkdata open /dev/md2 md2_enc
mkfs.ext4 /dev/mapper/md2_enc
mount /dev/mapper/md2_enc /mnt/p2

tar xvfz p2.tar.gz -C /mnt/p2

umount /mnt/p2
cryptsetup close md2_enc
mdadm --stop /dev/md2

losetup -d /dev/loop0
losetup -d /dev/loop1

# partition #3

dd if=/dev/zero of=p3left.img  bs=512 count=2097152
dd if=/dev/zero of=p3right.img bs=512 count=2097152

mkswap p3left.img
mkswap p3right.img

# partition #4

dd if=/dev/zero of=p4left.img  bs=512 count=262144
dd if=/dev/zero of=p4right.img bs=512 count=262144

mkfs.ext4 p4left.img
mkfs.ext4 p4right.img

mount p4left.img  /mnt/p4left
mount p4right.img /mnt/p4right

tar xvfz p4left.tar.gz  -C /mnt/p4left
tar xvfz p4right.tar.gz -C /mnt/p4right

umount /mnt/p4left
umount /mnt/p4right

# partition #5

dd if=/dev/zero of=p5left.img  bs=512 count=2097152
dd if=/dev/zero of=p5right.img bs=512 count=2097152

losetup --show -f p5left.img
losetup --show -f p5right.img

mdadm --create /dev/md5 --level=1 --raid-devices=2 /dev/loop0 /dev/loop1
cryptsetup --type=plain --cipher=aes --key-file=lkdata open /dev/md5 md5_enc
mkfs.ext4 /dev/mapper/md5_enc
mount /dev/mapper/md5_enc /mnt/p5

tar xvfz p5.tar.gz -C /mnt/p5

umount /mnt/p5
cryptsetup close md5_enc
mdadm --stop /dev/md5

losetup -d /dev/loop0
losetup -d /dev/loop1
```


## 全体感想
いじれる箇所も多いですし、純正の交換用 HDD が~~ぼったくり価格~~[^1]アレなのを除けば良い製品だと思います。


[^1]:だって、交換用 HDD を2台買うと本体より高くなるなんて価格設定がおかしいでしょ。