HDL2-TA2 メモ
I-O DATA の HDL2-TA2 という NAS を手に入れたのでバラしてみました。
私が入手した個体は Toshiba DT01ACA100 が載っていました。ショッピングサイト等のレビューを見る限り Western Digital や Seagate が入っていることもあるようですが、いずれも NAS 用の HDD が載っているわけではなさそうです。
HDD は暗号化されていてディスクを取り外して母艦につないでも一筋縄では読めないし、別の個体に刺しても起動できません。また、OS は HDD に入っていてディスクが 2台とも死ぬと起動できなくなります。片方壊れたら速やかに交換しましょう。メーカー純正の交換用 HDD もありますが 2台死んだ状態から復旧できるのかどうかは不明です。
それにしてもこの機種はネットの情報が少ない印象です。マイナーな機種なんでしょうか。
シリアルコンソール
バラし方は、基本的には見えているネジを順番に外すだけですが、途中で2本だけ底面のゴム足に隠れているネジがあります。
基板が見えるまでバラすと表面(チップが乗っている面、組み付けたときに下になる側)にピンヘッダが見えます。これがシリアルポートです。あらかじめピンヘッダがついているので半田付けの手間がありません。素晴らしいですね!
シリアルポートの設定は115200bps、データ8、パリティなし、ストップ1で、電圧は3.3Vでいけました。
基板単体で起動すると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アレなのを除けば良い製品だと思います。
-
だって、交換用 HDD を2台買うと本体より高くなるなんて価格設定がおかしいでしょ。 ↩