December 06, 2008

Thinkpad X60s HDDの換装 (移行ソフトにお金かけない)

ノートPCでThinkpad X60sを使っているのですが、この度HDDがパンク寸前になったので、大きな容量のものに換装してみることにしました。最終的にはまるごとコピーで移行作業を完了できたのですが、この記事はその際の苦労話を4章構成でまとめてあります。OSはWindows XP SP3で換装元のHDDは標準で装備されていたHTS541080G9SA00(SATA, 80GB, 5400RPM)、換装後はHTS723225L9A360(SATA, 250GB, 7200RPM)になりました。タイトルにもあるとおり、コピーを行うためのソフトにはお金をかけず、かつ、ノートPCということで外付けのCDやフロッピー等の機器を使用せず(ただしEG-SATA56というHDDを外付けにするための機器は使いました)行いました。

はじめは簡単だと高をくくっていました


検索エンジンを紐解くと同じことをされている方はかなりいるようで、簡単に済むと思っていました。例えば『HDD コピー EG-SATA』で引くとててでくる『ThinkPad X60のハードディスクを換装』を参考に、Acronis True Imageというコピーユーティリティの体験版(紹介があったのはVer.9、後から見直すと最新版ではないのですね)を利用することで丸ごとコピーがうまくいったというレポートがありました。上記のページどおりの手順を踏んで、パーティションのサイズを変更しつつ移行作業を試みることにしました。

カーソルが点滅したままブートしなくて焦る


Acronis True Image体験版(Ver.9)による移行作業は、コピーの進捗画面を見ている限りですと成功したようです。いざ新しいディスクに入れ替えて、さぁ起動、となりましたが、Windows XPの起動画面を拝むことなく、右上でカーソルが点滅したままになりました。調べてみると同様の症状が報告されているようで、報告内容から判断したところMBR(Master Boot Record)の移行作業がうまくいっていない(MBRについてはパーティションサイズが変更されたので、単純コピーではおそらくXPのブートローダであるNTLDRへのポイントがうまくいかない)という印象を受けました。

作戦変更、でも純正リカバリツールよ、なぜ空気読めない


Windows XPは起動しないものの、なぜかBIOS画面でThinkVantageボタンを押すことによってThinkpad純正の修復ツール、Rescue & Recovery が起動することが確認できたので、それを使って修復できないものかと考えてみました。Windows XPのインストーラには修復モードがあるので、それを使ってMBRの修復が可能と考えていました。
しかし純正ツールはディスクを出荷時の状態(クリーンインストール)する機能しかなかったので、これが純正ツールの空気読めない点その1です。そこでクリーンインストール後、パーティションコピー(この際MBRはいじらない)で上書きを行い移行作業をするという作戦に切り替えました。
クリーンインストールは順調に進みました。どうやらパーティションを切りなおすというとんでもない空気の読み違いはしなかったものの、フォーマットをNTFSからFAT32に変更する、という空気読み違いその2は行ってくれたようです(泣)。FAT32領域に作られたWindows XPは無事クリーンな状態で起動しました。

まさかあのツール(dskprobe)で直に編集することになろうとは


移行前のディスクに取り替えて、Windowsを起動し、修復ツールによってFAT32にされてしまった新しいディスクのWindows XP領域をNTFSでフォーマットしなおします。さらに、フリーウェアのコピーツール DrvClonerXPにてパーティションコピーを行い、新しいHDDのWindows XP領域を移行前のWindows XP領域と同じ内容にしました(ここだけの話、chkdsk /fでコピー先のパーティションの修復を行いました、おそらくDrvClonerXPがコピー中のエラーを無視した結果ではないかと、chkdsk /f後は正常でした)。
再び新しいHDDに取り替えて、起動チェックをします。今度はWindows XPが立ち上がりました。が、なぜかログインできない。ログインしようとすると、すぐにログオフされてしまうのです。調べると再び同様の症状が見つかりました。どうやらMBR上にあるディスクの署名と関係しているようです。fixmbrのコマンドで解決できるようです(他、『(59) Windows 2000/XPシステムバックアップのすすめ(2)』を参考)が、その領域(セクタ0の0x01B8から2bytes)をゼロクリアさえすれば解決するそうなのでdskprobe(ディスクを直接編集するツール)を使いました。これはいわゆる『シロウトにはおすすめできない』ツールなので、何をしているかわからない場合は参考にしないでください。
結果、新しいディスク上のWindows XPにログインできるようになりました。移行前と寸分たがわず、環境が再現されています。HDDの回転数が5400RPMから7200RPMになったことにより、快適にもなりました。今は満足しています。

要約します、お金をかけないで、外部機器を使わないとHDD移行作業は大変でした。せめて外部機器としてCDが使えるなら以前『GPartedでHDD丸ごとコピー』で紹介したGPartedというツールが使えたのですがね…。

10:45 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/677

December 10, 2008

Arduino serproxyをFlash XMLSocketで使う

目覚まし時計デバイスChumbyにArduinoをつなげてChumby上のFlashからコントロール(詳しくは以前の記事『ChumbyでArduino等をFlashからコントロールする方法 (XMLSocketが使える?)』をどうぞ)しようとしているわけですが、Chumbyで再生できるFlashのバージョンはFlash Lite 3(Action Script 2に相当)であるがために、本家で配布しているFlashとシリアルポート間のブリッジ serproxy (Serial Proxy)では少々問題が発生します。具体的には、Flash Lite 3では非同期通信を行う際にXMLSocketクラスを使うことになると思うのですが、それとserproxyを組み合わせるとデータの送信が拒絶されたり、受信データの一部がかけてしまったりと思ったとおりに動作しない問題に見舞われます。

これはXMLSocketが送信はヌル文字(0x00)以外のみを認める、また受信もヌル文字を受信してはじめてコールバックイベントが呼ばれるという仕掛けになっていること、一方serproxyでは、単純にネットワークからArduino等が接続されたシリアルポートへ、またはその逆について、生のデータの中継を担当してくれるだけなのでヌル文字が通信中に当然発生すること、これに由来しています。
後継のAction Script 3ではXMLSocketに加えてSocketという生データをやり取りするクラスが新たに導入されたことによってこの問題を解消できるのですが、Chumbyが対応しているFlashがAction Script 2相当であること、また無償のFlash開発環境であるmtascがAction Script 2であることを考えると、Action Script 2でサポートされているXMLSocketにおいてもserproxyをなんとか使えるようにすることは有益であると考えられます。

そこでserproxyを改造しました。改造ポイントをまとめたserproxy_hexbin.patchを公開します。なお以前、Chumby上のserproxyでFTDIを使うためのパッチを公開しましたが、それと併用できます。

変更点はコンフィグファイルでusehex=trueをすると有効になります。アイデアとしては、結局シリアルポートへのデータを中継するCGIを作った際のアイデアと同じで、1バイトを16進文字(0から9までの数字、A-Fまでのアルファベット)2文字で表記し送受信することでヌル文字が出現しないようにしました。例えばserproxy経由でシリアルポートに0xA5というバイトを送りたい場合、Flashでは"A5"という2文字を指定する、逆にシリアルポートから0xA5というバイトが送られてきたら、Flashには"A5"という2文字が転送されるようにしました。詳細はREADMEを見ていただくのがよいと思います。

この問題に気づいたのは、FlashでArduinoをコントロールする際に多くの方が使われているFirmataという環境を試している際、FlashからのArduinoのコントロールがうまくいかず困っていたときでした。FirmataはArduinoをコントロールするためにMIDIに似たプロトコルを採用しているのですが、ヌル文字が大量にでてきます。結果として、serproxy+XMLSocketにとっては想定外の環境、というわけでした。

02:53 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/678

December 13, 2008

Super Sylphide 進捗状況(22) -- MSD + CDC 改め MSD + FTDI Mimic

オートパイロットシステムSuper Sylphideですが、USBを使用したデバック用インターフェイスを設けることが悲願でした。これまでの経緯としては、USBメモリスティックのように機器を見せるMass Storgae Device Class (MSDまたはMSC)と、擬似的なシリアルポートによって通信を確立するCommunication Device Class (CDC)、この2つを同時に実装したcomposite Deviceとして機能することを狙っていました。しかしMSD + CDCを同時に実装するとWindowsではM$が提供している標準デバイスドライバの出来がよろしくないようで、認識はされるもののCDCによる通信が途絶してしまうという問題が発生しました(詳しくは『Super Sylphide 進捗状況(16) -- Windows XPでMSD+CDCのUSB compositeが相変わらず動かない』の記事をどうぞ)。しかしながら今回ようやくMSD + CDCの機能を同時に実現することができましたので、記事にしてみたいと思います。ただし断っておきますが、ここで紹介する方法はタイトルから予想されるとおり、USBシリアル変換チップを作っているFTDIというメーカーのデバイスドライバを代替として使うもので、使用許諾条件に違反していると思われます。従って製品を作られる際には、くれぐれも参考にしないでください。

この方法を思い至ったのは、PICで有名なMicrochipのユーザーフォーラムを見ていた際に、FTDIのドライバを利用することによって、USB付きデバイスであるPIC18Fで2チャンネル分のシリアルポートを確保できたという話を見つけたことに遡ります。シリアルポートを2チャンネル確保する方法としては、USBの標準的な規格であるCDCを2チャンネル実装することが最も適当な方法だと思われますが、残念ながらWindowsではこの構成において必要となる複合デバイス用のドライバ(usbccgp.sys)とCDCドライバ(ubsser.sys)がうまくかみ合わず、1チャンネル分の通信しかうまくいかない問題が発生するそうで、このFTDIのドライバを使う方法はそれを解消したといえます。
僕が実装したいのはMSD + CDCで、それに対して上はCDC * 2で話が違うのではないか、と思われるかもしれませんが、MSD + CDCの構成においてCDCが通信できないよう悪さをしているのは同じドライバ(usbccgp.sysとusbser.sys)の可能性が高かったため、参考になると考えた次第です。

そこで上記のリンクで公開されているソース、またLinuxのFDTIのKernel Driver(/drivers/usb/serial/ftdi_sio.*)を参考に、FTDIのドライバに適合したファームウェア(MSD + FTDI Mimic)を実装してみました。実装した結果のうちFTDIに関わる部分(および変更前のCDCの部分)はUSB_CDC.c, USB_CDC.hで、USB_CDC.h上でCDC_IS_REPLACED_BY_FTDIを定義するとFTDIのドライバを使用するようになります。ディスクリプタの定義はf34x_USB_Descriptor.cで、MSD + FTDI Mimicでは下図のような構成になっています。

FTDI_MSD.gif

Interface Associaton Descriptorを使ってFTDIドライバが想定していないMSDの部分を切り離してあります。またFTDIドライバに関するINエンドポイントはBulkではなくInterrupt転送としました。これはMSDアクセスがあった場合でもFTDIのINエンドポイントを存続させるためで、なぜかWindowsでMSDアクセスをすると全ての転送がMSDに関するBulk転送で埋められてしまい、他のBulkエンドポイントの入出力をしてくれない問題を解消してあります。

さらにWIndowsで認識のために必要となるinfファイルですが、F34x_FTDIBUS.inf, F34x_FTDIPORT.infを作りました。FTDIの現時点での最新の安定版ドライバ(2.04.06)を想定しています。また認識の際にはFTDIドライバが想定するベンダIDと違うものを作っているため、VCPドライバを手動で導入(やねうらおさんの『FT232RLの周辺』の記事の後ろにある『FT232RLのシリアルナンバーだけ変更しておけば~』のくだりを参考)する必要がありました。

認識されるとWindowsのデバイスマネージャでは下図のようになります。

FTDI_MSD_Windows.png

これでSuper SylphideからMSDを使って保存されたデータの吸出し、そしてFTDI Mimicを使ったSuper Sylphideを使ったハードウェアインザループ(Hardware in the loop)試験の両方ができるようになりました。転送速度を考えると排他的な使い方になってしまうのですが、設定を変えることなく一つのデバイスで2つのことができるのは快適です。
しかしあくまでもFTDIのドライバは借り物で気持ちのよいものではないので、純正のusbccgp.sys, usbser.sys(それぞれ5.1.2600.5585, 5.1.2600.5512で試験したがダメ)がhotfixで更新されることを期待し続けたいと思います。

※その後、通信プロトコルの話を書きました。

14:51 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/679

December 23, 2008

今日って休日だったんですね

[Timely]

毎日同じような生活をしていると曜日感覚がなくなってきます。特に本日(12/23)のように休日が週の中にポコっとあると、まったく気づかないで過ごしかねません。自戒の意味を含めて、本日の酷すぎた行動をここに残しておこうと思います。

まず銀行に行きました。外国小切手の処理があったので、窓口が開いていないと困るのですが、『平日なのに』、窓口が閉まっていることに腹を立てている自分がいました。思わず年末年始の窓口休止の張り紙がないか探してみていたところからすると、年末年始の臨時休業ということでこの時の自分の中では片付けていたようです。
次に、電子部品の調達に魔界都市アキハバラに出向いたわけですが、人が多すぎる。秋月電子が『平日なのに』混んでいることに腹を立てている自分がいました。平日は空いていてとても買い物がしやすいのがいいのですが。またしても年末だし、ということで自分の中で片付けていたようです。
そして最後に仕事場に行ったのですが、入り口の鍵がかかっていることにショックを受けている自分がいました。あれー平日なのに、ということで、ここでようやく本日が祝日だということに気づきました。仕事場に行ったのは書類の判子をもらうためだったのですが、当然もらえるわけもなく。

ハッピーマンデーの影響で月曜が休日になっている場合は割りと日曜からの繋がりで問題なく過ごせるのですが、本日は本当に伏兵でした。

23:51 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/680