ネットワークストレージ、通称「NAS」(ナス)と呼ばれる装置が脚光を浴びています。

簡単に言うとLAN経由の外付けハードディスクな訳ですが、LAN経由だけに複数のパソコンから同時にアクセスできる上に、最近ではパソコンだけではなくテレビやHDDビデオレコーダー等からも使うことができるようになっているなど、企業のみならず一般家庭においても情報の一元管理・保管場所として大変便利に活用されています。

パソコンを1台用意して、そいつをファイルサーバにしても良いのですが、管理が大変だったり面倒だったりするのが難点。企業のように専任の管理者が居れば話は別ですがね。

反面、NASの場合はほぼ家電製品なので、電源をプチッと入れて、後はブラウザでプチプチと設定するだけで導入完了、後はメンテナンスフリーで良いというのが一般家庭への導入の敷居を下げていると言えましょう。

加えて、それに特化した専用機器なので、余計な物が一切付いていない。
消費電力の面でもパソコン1台置いて電源入れっぱなしにするよりも断然お得。
エコって訳です。

そんな素敵な製品、欲しいわ!

と言うわけで我が家へやってきましたのがこちら。



BuffaloのTeraStation PRO。
プロと銘打つだけあって、ディスクを4発搭載し、RAID5対応でギガビットイーサなNASです。

CPUはPowerPCベースのCPUを搭載し、OSはLinux。
その上にapacheやらsambaやらが乗ってるんでしょうね。
最近のネットワーク系アプライアンス機器の定番とも言える、よくある構成です。

新品では買えないので、もちろん中古。

しかーし!

中古は中古でも、そんじょそこらの中古とは訳が違う。



未起動品。

電源投入時の様子は↓の動画をご覧あれ。

"Can't Load Krnl!" と出ていることから、ファームウェアに何らかの問題が有ることが分かります。
ということは、ファームウェアのアップデータを使ってファームを流し込んであげれば復活!
おお、なーんだ簡単じゃなーい。

Buffaloのサイトよりアップデータをダウンロードし、手順に従っていざ実行。


    /  ̄ ̄ ̄\    /  ─    ─\    /   -=・=-  -=・=-\     |       (__人__)    |  \     ` ⌒´   /   /          \  

まあ、予想はしてましたが...

アップデートを掛けるにも、本体にIPアドレスが振られている必要があるわけで。
現状、IPアドレスが振られる以前の状態で落ちている訳で...
そりゃそうっすよね。

少し調べてみると、ファームウェアのアップデートに失敗した場合でも「EMモード」という緊急復旧モードで起動することで、再度ファームウェアのアップデートを行う事が出来るらしい。

EMモードとは、内蔵フラッシュメモリ内に格納された、このような状態からのリカバリを行う際に必要最低限のOS環境で起動した状態のこと。
EM = EMergency のことでしょうね。

EMモードになる条件は、

  • 通常モードで連続して何度か起動に失敗した時
  • 本体LCDパネル下側の赤いボタンを押しながら起動した時

の二つのパターンがあり、確実なのは後者。

EMモードで起動した場合は、ベートーベンの交響曲第5番「運命」の冒頭部分がBEEP音で鳴るそうです。


     ____      /      \   /  ─    ─\  /    (●)  (●) \ ほうほう |       (__人__)    |   /     ∩ノ ⊃  / (  \ / _ノ |  | .\ “  /__|  |     \ /___ /  

ならばそのEMモードで起動してみよう。

赤いボタンは、フロントパネルを開けて、LCDパネルの下側にあります。
これを押しながら電源ボタンをポチッとな!


                 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\                 /                     \               /                        \              /      ―――            ――― \            /          _                _   \           /          /´ ,..::::::::::.ヽ ヽ         /´ ,..:::::::::::.ヽ ヽ \         /        ,'  ,;::::::::::::::::::', ',       ,'  ,;:::::::::::::::::::', ', \        /          {  {:::::::::::::::::::::} }        {  {::::::::::::::::::::::} }  \      /           '、 ヽ::::::::::::::/ /        '、 ヽ::::::::::::::/ /      \       |            (;;;;;;;;;;)) ̄ /       |     \   ̄          |       |            /'       /        ∧      ',               |      |          {{        {        / ヽ     }               |      |           ヽ       ヽ___/ __ \___ノ            | . _______      \          人        ヽ   ´    `  '             /  ││        \           ( し.)                                 /   ││         \       `¨                           /    ..││          /                                     \      ││         /                                          \    ││

EMモードで起動しようとはしているものの、それすらも起動に失敗している。
というか、電源を入れてからエラーメッセージが表示されるまでが異様に早い。

これは、本体内蔵フラッシュメモリ内に入っている全てのファームウェアが一切合切吹っ飛でいるという、まさに何処に出しても恥ずかしくないジャンク品ですね?
通ぶって言うと "bricked" 状態と言ったりしますが、でけーレンガだなオイ。

通常、ここまで逝ってしまうと通常は修理工場か清掃工場送りなのですが、そこはそれ、修理が出来るものは修理して使う。
まさにエコ。

加えて、修理の過程でブリブリにカスタマイズしてしまえばファイルサーバ以外の機能も担えてお得!


何と言っても中身は単なるLinuxマシンなので、何でもありだ!

という訳で今回のテーマはこちら。

ファームが飛んだTeraStation PROを
復活させてみよう!
ついでにLinuxマシン化してしまおう!!

さてまずは例によって情報収集から。
その道のプロならいざ知らず、事をおっ始める前に出来る限りの情報を集めることは物事の基本です。

ざっと小一時間ほどググったところ、以下のことが分かりました。

  • "SYSTEM Error E04" はフラッシュメモリ上のファームが吹っ飛んでる場合やHDD上に乗ってるOS(Linux)が読めない場合に表示される
  • HDDクラッシュやRAIDクラッシュ等でHDD上のLinuxが飛んでるだけであれば、EMモードと呼ばれる緊急事態モードで起動させることで、フラッシュメモリ上にある必要最低限のOS環境で起動させることができる。
  • EMモードで起動してしまえば、Buffaloが提供しているファームウェアのアップデータを使うことで完全に初期化することが可能


ふむ。
フラッシュメモリが無傷であること、正確にはEMモードで起動できるかどうかが棘(いばら)の道か否かの分かれ道ってことだな。

だが残念なことにコイツはEMモード用OSもろとも綺麗さっぱり吹っ飛んでる、何処に出しても恥ずかしくないジャンク品なので、棘の道決定。

さらに情報を集めていくと..

  • TeraStationをLinuxbox化するOpenTeraプロジェクトというものがあり、そこでカスタムファームやコンパイル済みバイナリを配布している
  • 利用者の交流も活発でwebフォーラムなんかもある
  • その界隈では、TS-TGLはTerastation PRO v1と呼ばれている
  • ハードウェアは玄人志向のKURO-BOX/T4と同じ。ファームウェアやHDDに入ってるOS部分が違うだけ。
  • 上記OpenTeraプロジェクトで配布しているカスタムファームやKURO-BOX/T4のファームを突っ込んでヒャッハーしてる人多数。
  • 同様にフラッシュメモリ上のファームを吹っ飛ばした人も多数
  • そのためファームを吹っ飛ばした場合のリカバリ方法も確立しており、bricked状態からの復活も不可能では無い。
  • ファームぶっ飛ばしからの蘇生には「JTAGポート」なるポート経由でゴソゴソすることになるらしい。
  • JTAGというものは組み込み機器の検査・デバッグに使う為のアクセスポート規格。
  • パソコンからJTAGポートにアクセスするには、JTAGポートと繋ぐための接続ケーブルと、それ用のソフトを用意する必要がある
  • JTAGケーブルはUSB接続のものやパラレルポートに繋ぐもの等数種類ある
  • JTAGケーブルは自作することも可能
  • ソフトは市販品・フリー物何れも何種類か有る


とのこと。
カスタムファームを配ってる先人達が居るということと、リカバリ方法が確立していることはとても心強い。
しかしリカバリ方法がJTAG(ジェイタグ)とは、ほぼ、組み込み機器のデバッグ・メンテナンスという感じです。

最初は、フラッシュメモリを基板から引っぺがしてROMライタに突っ込んで...という事態を想定していたのですが、それよりはハードルが下がって助かりました。
とは言え、敷居が高いことには代わり有りませんが...

だが、ここまで来たからには行くしかない!
退路は断たれた。前進あるのみ!行くぞオラー!

\/\/\/\/\/\/\/\/\/\/\/\/\/\/ こ こ か ら 超 濃 厚 な ヲ タ ス レ に な り ま す。            ご 期 待 く だ さ い ! ! /\/\/\/\/\/\/\/\/\/\/\/\/\/\

何はともあれ分解

落ち着け!こんなときには分解だ!
本体底面にある足を外し、ケースカバーを外すとこんな感じです。

本体正面に向かって左側側面に、このようにメイン基板がマウントされています。
綺麗な作りですね。

基板をシャーシから分離し、基板表面が見えるようにひっくり返した図(クリックで拡大)。

LANコントローラはお馴染みRealtekのRTL8110S。
蟹のマークのRealtekがお送り致します。

CPUはFreescaleのMPC8241LVR266D。
PowerPCベースで動作クロックは266MHz。
今回はこの "PowerPCベース" というのが今回とても重要だったりします。

あからさまにシリアルポートな空きランド。
実際、ここはOSからはCOM1として見えるポートです。
ちなみに本体背面にあるUPS接続ポートは、OSからはCOM2として見えます。
信号レベルはTTLレベルなので、パソコンのシリアルポートに繋ぐにはMAX232等のレベルコンバータを噛ましてあげる必要があります。
丁寧にピンアサインがシルク印刷されているので、とても助かります。

そしてこれがお目当てのJTAGポート。
機器の開発・デバッグ時にはここにJTAGケーブルを繋いで色々やります。
今回はここが突破口となる、とっても大事な場所。

基板の大まかな様子はこんな感じです。
突破口たるJTAGポートがちゃんと空きランドとして設けられていることや、プルアップ抵抗などもきちんと実装されているようなので、単純にそこに繋げば良いのがとても助かります。

突破口を開ける

では、今回の突破口たるJTAGポートに攻め入ることにしましょう。

といっても、本体側の細工は空きランドにピンヘッダを立てていくだけなので簡単。

こんな感じ。

ついでにシリアルポートにもピンヘッダを植えておきましょう。

さてピンは植わりましたが、肝心のピンアサインが分からないことにはどうしようもありません。
そこは有能な先人達、ちゃんとピンアサインが公開されていました。
以下のようになっているそうです。

先人達の偉業に敬意を払いつつ、ありがたく利用させて頂きましょう。

1TDO
3TDI
4nTRST(通常未使用)
6(Detect?)
7TCK
9TMS
13VCC
16GND

    ___    ,;f     ヽ   i:         i   |         |   |        |  ///;ト,   |    ^  ^ ) ////゛l゛l;   おおお天の恵みか!   (.  >ノ(、_, )ヽ、} l   .i .! |   ありがたやありがたや   ,,∧ヽ !-=ニ=- | │   | .| /\..\\`ニニ´ !, {   .ノ.ノ /  \ \ ̄ ̄ ̄../   / .|

装備を用意する(1) JTAGケーブル

本体側の突破口が空いたところで、今度はその突破口に攻め入るための装備を用意する必要があります。
具体的にはJTAGケーブルの用意とJTAGソフトウェアの用意です。

JTAGソフトウェアは、先にも述べたとおり市販品・フリーウェア含めていくつか存在します。
過去の事例をひもとくと、TopJTAG Flash Programmerというソフトが使えるようですが、Cygwin+openwinceが実績としては豊富なようですので、今回はこの組み合わせで行くことにします。

またJTAGケーブルは、市販品を使っても良いですし自作しても構いません。
市販品(〜約1万円程度)を買うほどリッチメンではないので、もちろん自作で行きます。

ケーブルを自作する場合は、いくつかのベンダーよりJTAGケーブルの回路図が公開されているので、それを参考に部品を集めて作っていくのですが、使うJTAGソフトウェアで対応しているケーブルを選ぶことが肝心です。

今回使用予定のjtagソフトウェア(openwince)で対応しているJTAGケーブルは、

  • Arcom JTAG Cable
  • Altera ByteBlaster/ByteBlaster II/ByteBlasterMV Parallel Port Download Cable
  • Xilinx DLC5 JTAG Parallel Cable III
  • ETC EA253 JTAG Cable
  • ETC EI012 JTAG Cable
  • Keith & Koep JTAG Cable
  • Mpcbdm JTAG Cable
  • Ka-Ro TRITON (PXA255/250) JTAG Cable
  • Macraigor Wiggler JTAG Cable

とのことなので、この中のどれかを選ぶ必要があります。

どうせ作るんだったら、今回の件以外にも使えて多くのソフトでも対応しているメジャーな奴がいいなあと思って見繕ったのが、アルテラ社のByteBlasterMVとザイリンクス社のDLC5。

アルテラByteBlasterMVの回路図

ザイリンクスDLC5の回路図

見た感じByteBlasterMVの方が作りやすそうなので、ByteBlasterMVで行くことにしますかね。

部材を用意し、

紙に配線パターンを起こして、

ユニバーサル基板上に実装していきます。

基板上に植えたピンヘッダと接続するため、ケーブルエンドにコンタクトピンを付け2550コネクタに埋め込みます。
コンタクトピンは本来圧着工具で圧着する物ですが、工具が無いので今回はコネクタにケーブルを半田付けしちゃいます。

完成図。
各ケーブルにはテプラで信号線の名称を貼っておきました。

なお、ByteBlasterMVの回路図上ではバッファチップが74HC244となってますが、3.5V環境でも使えるよう74AC244を使ったほうが良いでしょう。
先人達のディスカッションでも74HCではうまくいかない事例が散見されたので、それに倣い74AC244を使用することにします。

装備を用意する(2) JTAGソフトウェア

ケーブルの準備ができたところで、今度はソフトウェア側の準備です。
既に述べたとおり、今回はCygwin上でopenwinceを使うことにします。

Windows上にCygwin環境を作り、そこにopwnwinceをダウンロード。
openwinceはソースファイルでの提供なので、Cygwin上でコンパイルしていくのですが、現在最新版のリリースであるjtag-0.5.1は2003年11月リリース。実はこのバージョンではTeraStationProに乗り込むことはできません。

どうするかというと、CVSソースリポジトリから最新版のソースを取ってきて、なおかつそのソフトにパッチを当てる必要があります。

これも先人達の試行錯誤により、方法は確立しています。
大雑把には以下の通り。

Cygwin+openwinceでの環境を構築する

Cygwin環境を構築。インストールするパッケージ類は以下

  • cvs
  • autoconf
  • autoconf2.1
  • autoconf2.5
  • gettext
  • gettext-devel
  • automake1.4
  • automake1.9
  • gcc
  • make
  • ioperm
  • readline

インストール後、ホームディレクトリを /home/xxxx へ変更するため Cygwin.bat の bash 起動行の前に以下を追記。

set HOME=/home/xxxx

これがないと Documents and Settings 以下にホームディレクトリが作られ、openwince の make installでこける(パス名にスペースが入る事による弊害)

  • openwince-jtagとincludeのソースツリーをcvsよりダウンロード
    $ cvs -d:pserver:anonymous@openwince.cvs.sourceforge.net:/cvsroot/openwince login
    $ cvs -z3 -d:pserver:anonymous@openwince.cvs.sourceforge.net:/cvsroot/openwince co -P include jtag

この中にはMPC8241のデータがないので以下から落としてくる
http://buffalo.nas-central.org/w/images/f/f2/Openwince-jtag-mpc8241.txt
落としたら jtag/data/motorola/mpc8241/1.2 として保存。

  • includeのビルド・インストール
    $ cd include
    $ ./autogen.sh
    $ ./configure
    $ make install
    
  • jtagのビルド・インストール
    $ cd jtag
    $ ./autogen.sh
    $ ./configure
    $ make
    $ make install
    
    libbrux/po/Makefile の MKINSTALLDIRS 行がおかしいので以下のように書き換える必要あり。
    $(HOME)/jtagwork/jtag/tools/mkinstalldirs
    その後mpc8241のファイルをコピー
    $ cp -R data/motorola/mpc8241 /usr/local/share/jtag/motrola/

FlashメモリがSTMicroの場合は要パッチらしい。
http://www.yamasita.jp/linkstation/BBS/2510.html
http://www.yamasita.jp/linkstation/BBS/2913.html

パッチ1(hnishiパッチ)  http://www.yamasita.jp/cgi-bin/BBS/eztree.cgi?action=view&view_num=2422
パッチ2(わんこパッチ)  http://www.yamasita.jp/cgi-bin/BBS/eztree.cgi?action=view&view_num=2538
パッチ3(かいへいパッチ)  http://www.yamasita.jp/cgi-bin/BBS/eztree.cgi?action=view&view_num=2932

なお、試しにパッチ当てずに実行してみたところ、一見うまくいっているように見えるものの、書き込み後のべりファイでエラーになります。素直に上記パッチを当ててビルドしましょう。

てことで、パッチ済みファイルと、ついでにMPC8241のJTAG declarationファイルを以下に置いておきます。

いざ本能寺!

ケーブルとjtagソフトの用意が出来たら早速ドッキング!
写真では基板のJTAGポート群からJTAGケーブルの電源(VCCとGND)を取ってますが、どうも怪しいのでシリアルポートにあるVCCとGNDから取った方が良いかも知れません。

また、このタイミングで基板上のシリアルポートへも繋いでコンソールの状態を見ることにしましょう。

先にも述べたとおり、このポートの信号レベルは+5V/0VのTTLレベル。シリアルポートに使用されているRS-232C信号規格は-15V/+15V。当然直結することはできず、間にレベルコンバータが必要になります。

定番のMAX232を使ってブレッドボード上に回路組んでもいいのですが、今回は携帯電話のメモリ編集ソフトに付いてきたUSB接続ケーブルを流用することにします。 レベル変換とUSB-シリアル変換を同時にやってくれるのでシリアルポートのないノートPC等でも使えて重宝する1本です。
見ての通り、携帯電話と接続するコネクタ部分をバラして、そこにコンタクトピンと2550コネクタを付けています。

マイコン工作をする場合、この手のレベルコンバータはよく必要になるので、1本あると何かと役に立ちますよ、ってこんな所見に来るような人には言うまでもないですね。

接続風景。

シリアルコンソールが繋がったところで、ちょっとコンソールログを拝んでみましょうか。
先ほどのシリアルポートにシリアルケーブルを接続し、Terastationの電源を投入すると、ブートメッセージが表示されます。
通信速度は57600bps。

フラッシュメモリの中身がカラになって読めないせいでしょう、Product Informationがえらいことになってます。

そして最後に「Mi」まで表示したところで、先の動画で言うところの「ピー!ピ−!」連続鳴動状態です。

この「ピー!ピー!」連続鳴動状態になると、電源ボタン以外の全ての制御を受け付けてくれないので、JTAGケーブルで繋いで何かやる際には電源投入→連続鳴動状態までの僅かな間にデバッグモード(ってものがあるのかどうか分かりませんが)へ落とす必要があるようです。

一旦Terastationの電源を落とし、JTAGケーブルとシリアルコンソールを接続。
いざ!

jtagコマンドの実行

Cygwin上からIOポートを使えるようにする(初回のみでOKみたい)

$ ioperm -i

openwinceのjtagプログラムを実行

$ /usr/local/bin/jtag

jtagコマンド実行

jtag> cable parallel 0x378 ByteBlaster
jtag> detect
jtag> include motorola/mpc8241/1.2
jtag> endian big
jtag> instruction SAMPLE/PRELOAD
jtag> shift ir
jtag> shift dr
jtag> dr
jtag> instruction EXTEST
jtag> shift ir
jtag> initbus mpc824x
jtag> detectflash 0xFFC00000

Terastationの電源が入っていないとdetectできない(VCCにも電源来てないので当然と言えば当然)。

また、BEEP音連続鳴動状態になってしまうとVCCへの電源供給が絶たれるので、TerastationPROの電源をONした直後に cable parallel 〜 detectflash までのコマンドをCopy&Pasteで一気に実行。
そうすることでBEEP音連続鳴動状態になる前に、JTAGデバッグモード(?)に入ることができる。
成功するとフロントパネルが "ROM Checking.." の表示のままで止まる。

ここまでうまくいったら、いよいよファームウェアの書き込み。
ファームウェア本体となるbootcode.binとfirmimg.binはBuffaloのファームウェアアップデータの中にあるので、それを使います。
上記2ファイルをカレントディレクトリへ置き、いざ!いざ!

jtagコマンド実行

jtag> flashmem 0xFFF00000 ./bootcode.bin
jtag> flashmem 0xFFC00000 ./firmimg.bin

書き込み中の図。

こんな感じでざくざくと書き込まれていきます。

bootcode.bin (42KB)の書き込みとベリファイで約30分。
ということは、firmimg.bin (3MB)の書き込みとベリファイで36.5時間

USB接続のJTAGケーブルならもっと早く書き込めるようですが、パラレルケーブル接続なので遅い遅い。
じっと我慢の子です。

その間、jtagコマンドを実行しているパソコンが省電力モードになったり、WindowsUpdateの自動更新に引っかかって「後で再起動する」を何度も何度も叩く羽目にならないよう、注意を。

ベリファイが通ればファームウェアの書き込みは完了。

一旦電源を落として、再度電源投入。
そして....無事起動すれば、はい一丁上がり!

念には念を入れて、Buffaloのファームウェアアップデータを使って再度ファームウェアを更新しておきましょう。
これでフラッシュメモリの中身も、ディスク上のOSも最新版になります。

長くなったので今日はここまで。
次回はTerastationのLinuxbox化に取りかかります。