ラベル windows の投稿を表示しています。 すべての投稿を表示
ラベル windows の投稿を表示しています。 すべての投稿を表示

2011/04/06

Visual Studio 2005でCrypto++ライブラリを使ってみる

手元のVisual Studio 2005はVB2005を使って、以前働いていた職場でプログラムを作る他はもっぱら自分の遊びようでしたが、今回はひさしぶりにVC++2005を使ってみる事にしました。

いまどきVC#じゃなくて、VC++を使ったのはIPropertySetStorageを使うプログラミングをするためにC#を使うのは大変でオーバーヘッドが大きくメリットがなかったからです。

IPropertySetStorageの使い方はいろいろ資料があるので、今回はそれと一緒に組み合せたCrypto++ライブラリの使い方についてメモを残しておきます。

Visual C++ 2005と組み合せる方法

www.cryptopp.com には、VC++との組み合せについて参考になるドキュメントはみつかりませんでした。

そこでGoogleでいくつか検索して参考にしたのは mogproject.blogspot.com の「Crypto++ 5.6.1のビルド」でした。

入手できるcryptopp561.zipを展開したディレクトリに含まれているslnファイルをVS2005から開きました。

この全体をDebug用とRelease用の2つのタイプに分けてビルドした後は、ひとまず閉じて、自分のプロジェクトファイルを開き直します。

使い方 - cryptopp.dll OR cryptlib.lib

どちらのファイルを使うにしても、ヘッダーファイルが含まれている、アーカイブを展開したフォルダのトップを「追加のインクルードディレクトリ」に含めておきます。

DLLを使う場合には、リンカオプションでDLLを含むディレクトリへのパスを通しておき、"dll.h"をインクルードするだけで直接 cryptopp.dll ファイルの名前を指定する必要はありません。

cryptlib.libを使う場合には、「追加の依存ファイル」に"cryptlib.lib"を含めておきます。

基本的にはこれだけだったのですが、デフォルトの設定で動かしていると次のような問題が発生しました。

自分のプロジェクトからCrypto++を使う時の問題

ビルドしたところ、DLLはうまく作れたけれど、LIBファイルとのリンクには失敗したという事が起こりました。

遭遇したエラーメッセージ

1>msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) は既に cryptlib.lib(iterhash.obj) で定義されています。
1>msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) は既に cryptlib.lib(iterhash.obj) で定義されています。
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>C:\Users\yasu\Documents\Visual Studio 2005\Projects\TestCryptoPP\Release\TestCryptoPP.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

これは「ランタイムライブラリ」の設定で「マルチスレッドDLLl(/MD)」が選択されていた事が原因です。

リンクする対象がDLLかスタティックライブラリかによって、オプションを変更しなきゃいけないのは理解できますが、どこを変更すれば良いのかは調べるのに時間がかかりました。

/MD, /MD等のメニュー

ランタイムライブラリ切り替えダイアログ

DLL v.s. スタティックライブラリ

簡単な文字列のSHA1 Digestを計算して、表示するアプリケーションを作成して比較しました。

DLLの場合は、DLLファイルが1.2MB程度で、オブジェクトコードは7KBほど。

スタティックライブラリの場合は、オブジェクトコードは88KBほど。

とりあえず自分の用途では、スタティックライブラリの方が扱いは楽かなぁと感じています。

Crypto++を扱う上でのリファレンス、マニュアル等

Googleなんかで検索すると、Crypto++のドキュメントがなさすぎるという記述を目にします。

確かにドキュメントやチュートリアルは少なくて、基本的な操作を知っている既にプログラマな人以外お断り的な雰囲気は感じます。

ただ、どういう風にメソッドやクラスを使えばいいのかというと、サンプルが付いてくるので、cryptestの中を除くとだいたい必要そうな情報はあるように思いました。

ちゃんと使っているわけじゃないので、なんともいえないですが、典型的な操作についてはテスト用のコードを追えばなんとかなりそうな気がします。

2010/10/05

ActivePerlスクリプトをWindowsの「送る」メニューに加えてみた

Windows Vista以降だと簡単にExplorerからShift+右クリックで開くメニューに「パス名でコピー」が表示されますが、Windows XPではその機能がないようです。

カスタマイズをサポートするアプリケーションを使う事で加えることができるようだったのですが、汎用性がないので任意のスクリプトを右クリックメニューに加える方法を調べてみました。

Explorerの右クリックメニューに項目を加える

ユーティリティを使わずにコンテキストメニューに項目を加える方法について、ざっとみたところではDLLを HKEY_CLASSES_ROOT¥*¥shellex¥ContextMenuHandlers 当りに加えてあげるのが最近のやり方のようでした。

任意のメニュー項目を追加する事自体は可能

いろいろ調べてみると、かなり以前に 任意のメニュー項目を作成する方法をまとめたページがみつかりました。

Windows XPでもレジストリの HKEY_CLASSES_ROOT\*\shell\CopyPathname\command ("CopyPathname"は任意)というエントリを作成して、commandの値に C:\usr\bin\copypath.bat %1 にように適当なアプリケーションを指定するとメニューから、そのファイル名を引数としてアプリケーションを起動できることは確認しました。

今回採用した方法

レジストリをいろいろ編集するのは良さそうには思えなかったので、今回はより安全で簡単な方法として「送る(N)」(SendTo)メニューの中にショートカットを加える方法を使いました。

ActivePerlで作るパス名をクリップボードにコピーするスクリプト

これはActiveStateの Win32::Clipboardのサンプルコードそのままです。

第一引数の文字列をクリップボードにコピーするActivePerlスクリプト: C:\usr\bin\pathcp.pl

use Win32::Clipboard;
my $clip = Win32::Clipboard("$ARGV[0]")
さらにバッチファイルの作成

ファイルハンドラを追加しても直接「送る」(SendTo)メニューの中に配置する事はできなかったので、バッチファイルを作成しました。

pathcp.plを呼び出すためだけのバッチファイル: C:\usr\bin\pathcp.bat

"C:\usr\bin\pathcp.pl" "%1"

このpathcp.batファイルのショートカットをSendToフォルダに置けば完了です。

SendToフォルダは Documents and Settings の下にありますが、「ファイル名を指定して実行」から sendto と入力してもフォルダが直接開くので、そこにショートカットを置くのが楽そうです。

JScriptでパス名をクリップボードにコピーするスクリプトを作成みてみる

さすがにActivePerlが入っている環境はそうないと思うので、一般的なJScriptで作成してみました。

Googleで検索して参考にしたのは次のページです。→ 「 JScriptでファイルシステムとクリップボードにアクセス

JScript版のpathcp.jsスクリプト

var ie = new ActiveXObject('InternetExplorer.Application');
ie.Navigate('about:blank');
while(ie.Busy ) {
    WScript.Sleep(200);
}
var cb = ie.Document.parentWindow.clipboardData;
if (WScript.Arguments.length > 0) {
  cb.setData('Text', WScript.Arguments(0));
}

内部でIEを呼び出しているため確認のダイアログが出たり、セキュリティ設定のレベルによってうまく動かないこともあると思います。

手元の環境では画面の最背面にダイアログが表示されてみえい事で気がつかず、うまく実行することができない場合もありました。

ActivePerlは1x1ピクセルのウィンドウを開いてクリップボードにアクセスするための機能を持たせているので、IEを経由するよりも負荷は低そうです。

さいごに

コンテキストメニューの中をいろいろ編集できると良さそうですが、通常はDLLを使うようですね。 MSDNに関連する記事がありでしたが、そこまでやるなら適当なアプリケーションを入れたほうがよさそうです。

クリップボードにアクセスする機能はActivePerlが良さそうでした。 ただこれが使えるような環境は恵まれているのかもしれません。

今回の操作だけではコストに見合わない感じですが、操作手順を渡す時にアプリケーションからファイルを選択するよりも、コンテキストメニューからアプリケーションを選択させる方が誤操作の防止には役立ちそうです。

2010/09/16

Vistaの「プログラムから開く」で、どっちがGUI版Vimか分からなくなった

なんだか説明するのが面倒なのですが、Explorerでファイルを右クリックすると表示されるメニューの中に「プログラムから開く」というのがあります。

これが、下のような状態になってしまい、GUI版Vim (gvim.exe)ともう片方のコンソール(CUI)版Vim (vim.exe)のどちらが、どっちなのか分からなくなってしまいました。

違うプログラムが同じ名前で表示されているメニュー

今回は最終的に、下の状態にもっていくというお話しです。

gvim.exeのみが表示されているメニュー

そもそもの問題を避けるために

Vistaでしか検証していませんが、次のようなルールを守れば、問題ないのかなと思われます。

  • 本家日本語版(kaoriya版vim)のどちらか片方だけを使う
  • 本家を使うなら「プログラムを開く」の近くに表示される「Vimで編集する」を選択する
  • (インストーラを使わない場合は特に)Vimを起動したら配置場所を変更しない
  • CUI版とGUI版のどちらかだけを使い続ける

普通は C:\Program Files\Vim\ にインストールしたら、その場所を変更すればまずいだろう、という事は想像がつくかもしれません。 けれどもインストーラの付属しないバイナリプログラムを単体でダウンロードした場合などでも、一度プログラムを実行するとその場所がレジストリに記録されてしまいます。

実行形式のプログラムは移動しないのがWindowsの作法という事なのかもしれません。

問題は以前にgvim.exeを起動した事があって、しばらく経ってから別の場所にダウンロードして起動した場合、どうやっても「プログラムを開く」から選択できなくなる可能性がありそうだという点でしょうか。

問題1 - gvim.exeファイルを移動したら「プログラムから開く」で選択できなくなった

一度「プログラムを開く」でgvim.exeを選択してから、別の場所にgvim.exeを移すと当然のように「プログラムを開く」メニューからは消えてしまいます。

そこで改めて「プログラムを開く」で選択するのですが、どういうわけかアイコンは追加されません。

結局のところ手動で regedit を起動し、次のように \HKEY_CURRENT_USER\Software\Classes\Applications\gvim.exe\shell\open\command を正しいpathに修正する必要がありました。 ()

正しいpathに手動で書き換える様子

反対に不正なpathに書き換えてしまえば、選択肢から消すことも可能です。 最終的にCUI版Vimのpathを正しくない場所を指すように変更してしまいました。

問題2 - 「プログラムから開く」にCUI版Vimが同じ名前で表示されてしまい、GUI版Vim

これは最初の図と同じ状態です。 ここまでの方法を踏まえると、既に問題は解決しているのですが、一応名前を"Vi Improved - A Text Editor"から Vi Improved - A GUI Text Editor に変更したいと思います。

これもレジストリで一箇所を変更したのですが、MuiCacheなので何かの表紙に変更されてしまうかもしれません。

バイナリエディタあたりでプログラムに登録されている名前を直接変更する方が確実そうですが、とりあえずテンポラリの方法として使えそうです。

変更する場所は \HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache で、プログラムに対応するテキストを書き換えます。

Vimの表示名を変更している様子

2010/09/20追記: 結局のところ変更したMuiCacheのレジストリエントリは再起動後に元に戻ってしまいました。 CUI版vimは一覧に表示されないようになっているので、特に問題はありませんが、恒久的にはバイナリエディタを使うしかないのかなぁ、と思っているところです。

まとめ

ここでの事はVistaだけでの事なので、Windows7などでは通用しないかもしれません。 どうせ買うならIISのテストも兼ねて、Windows7 Professional以上のパッケージ版をVMWareで動かしたいところですが、3万円以上の出費は痛過ぎるので、当分無理でしょうね。

Windowsには詳しくないので間違った事があれば優しく指摘して頂ければ幸いです。

2010/09/14

7-Zipで開けないアーカイブを開いてみた 〜再考〜

前回の投稿ではまとめきれていなかったので、情報を整理しておこうと思いました。

7-Zipが悪いわけではない

表示されたメッセージは次のようなもので、圧縮形式の問題であることがわかります。

7-Zipが表示したエラーメッセージ

7-Zip公式サイトのFAQの中に、WinZIPが互換性のない圧縮形式を使うことの記述があります。

%TEMP%以下に展開されるsetup.exeは起動可能

自己展開形式ファイルを実行すると、%TEMP%以下の WZSEn.TMP フォルダ(nは0からの数字)に展開され、その中にあるsetup.exeを最後に実行します。

展開処理を途中で止めて、手動で%TEMP%以下にあるsetup.exeを実行すると問題なくインストーラが起動します。

インストーラから起動したsetup.exeが異常終了

procmon.exe (from SysinternalSuite)というツールを使って、実行時の処理を眺めていたらsetup.exeが呼ばれているものの RC=24 で終了している事が分かりました。

setup.exeがRC=24で終了しているprocmon出力

まとめ

いまのところはインストーラから起動した場合だけ、setup.exeが正常に起動しないことだけが分かっています。

かなり中途半端なのですが、とりあえずトラブルシュートの手法はいろいろ得られたので、 当面は現状に満足して、こん件はこのまま放置することになりそうです。

2010/09/12

7-Zipで開けないアーカイブを開いてみた

Inspiron 640mで動いているWindows VistaではZIP等アーカイブファイルの展開に7-Zipを使っています。

個人的なWindows環境ではlhasaやlhaplusといったツールも以前は使っていたのですが、個々のプログラムではなくて、LZH形式自体の脆弱性が知られるようになってからはアンインストールしてしまいました。

7-Zipは圧縮効率とスピードとのバランスが気にいっているのですが、たまたまVista環境でうまく展開できないファイルを見つけたので他のプログラムを試す機会を得ました。

展開できないファイルとは…。

あまり大きな声ではいいたくないのですが、Vista機に昔を懐しんでDB2 Express-C 9.7.2 for Windows (ファイル名:db2exc_972_WIN_x86.exe) をインストールしようとしました。 これは自己解凍形式のEXEファイルなのですが、展開に失敗し、インストーラが立ち上がらない状態になってしまいました。

VMWare上のWindowsXPでは展開できるので、自分のVista環境のDLLやら過去に導入した何かが影響していると考えるのが妥当そうです。

DB2 Express-Cは無償版ですし、Forum等を検索をしても似たような事象は発見できなかったので、今回は自力で解決策を探ってみました。

とりあえず展開できないか、いろいろ試してみる

いまになって振り替えると、Windows版のlddコマンドでもあればリンクされているDLLを疑う事もできたのかなと思います。残念ながらWindows周りは詳しくないので、直線的に突進するしかありませんでした。

ファイル自身を実行する自己解凍機能がうまく動いていないようだったので、ファイルの拡張子を .exe から .zip へ手動で変更して、7-Zipで展開を試みました。

展開自体は行なわれたのですが、うまくいかず、最終的に展開に失敗したファイル群がレポートされるという結果になりました。

ただ、自己解凍形式のファイルであったも任意のアーカイバで展開できる事がわかったので、他のプログラムを探す事にしました。

7-Zipよりもう少し信頼性のあるアーカイバを探す

7-Zip自身がよく使われているので、これよりも確実に動きそうなフリー、もしくは、オープンソースなアプリケーションはないように思えました。

ZIP形式の由来はWikipediaによると、最初に PKWareという会社が開発し、現在はWinZipという会社と争うように暗号化などに対応した製品版の開発・販売を行なっている模様です。

そういえば以前いた会社ではWinZipが使えたなぁと思いつつ、ここら辺の製品が使えないか調べてみました。

最終的に圧縮ができない展開専用のアプリケーション ZIP Reader を、PKWareの Downloadsエリアで発見しました。

売り物ではないからか、 Products エリアにはリンクがないので、最初は見落したんですけどね。

ZIP Readerを試す

先ほどの拡張子を変更した、 db2exc_972_WIN_x86.zip ファイルをZIP Readerで展開すると無事に"db2exc_972_WIN_x86"フォルダが作られ、全ファイルが展開されました。

7-Zipではサイズがゼロだったreadmefirst.txtファイルもちゃんと読む事ができます。

この中のsetup.exeを実行して無事にVista機にDB2 Express-C 9.7.2を導入する事ができました。

さいごに

原因が不明なので、この結果だけでは「7-Zipを止めて、ZIP Readerを使おう」とはいえなそうです。

やはりldd的なコマンドを使って原因がDLLにないか、時間をみつけて確認することにしましょう。

DB2自体は慣れているせいもあって、端末からのテーブル作成などはすぐにできました。

LDAPサーバみたいに郵便番号データでも入れて、検索アプリを作ってみることにしましょう。

でもInterbaseをベースにしているFirebird 2.5が出たら、そっちに夢中になるかもしれません…。

2010/09/03

HDD換装後のInspiron 640mの熱暴走への対応

夏になってからInspiron 640mの熱による電源断が頻発するようになりました。

Travelstar 7K320が7200回転だから熱がこもるのかなぁと思っていたのですが、 ひょんなことからBIOSのメニューを見直して改善できたようなのでメモしておきます。

BIOSメニューの見直し

起動時にDellのロゴが表示されているところで、 F2 キーを押しているとBIOS設定画面が表示されます。

左側にメニューの中に PerformanceHDD Acoustic Mode という項目があります。

この設定値は次の3つが用意されています。

  • Bypass - デフォルト
  • Quiet
  • Performance

おそらく以前にBIOSの設定を全てデフォルトに変更した事が原因で、Bypassになっていたと思うのですが、これを Quiet に変更する事で症状をかなり改善することができました。

体感的にも発熱が抑えられている印象です。

メニューには Quiet を選択することで"Slow"になるとありますが、 体感速度が目立って遅くなったという事もないのでしばらくこれで使ってみようと思います。

その後、Performanceに設定したものの

まだ真夏日が続いて気温などの条件は変化していないはずですが、設定をPerformanceにしても特に問題は起っていません。

おそらくこれは、たまたまなのだと思いますが、 デフォルトのBypassにしている設定は変更した方が気休めにはなりそうです。

2010/02/17

Debian lennyでのhostapdとfreeradiusによるEAP-TLS環境の構築

AlixではXG-601を使って無線LAN APを構築していますが、stable系はドライバ未対応が原因で使えないため、開発版のhostapd-0.7.1を使っています。 いままではWPA-PSKを使った共有鍵方式で運用してきましたが、今回はEAP-TLSを試す事にします。

EAP-TLSはユーザ毎に認証用ファイルを配布する事ができるようになります。 誰がネットワークに接続したのか特定する必要がある環境ではとても便利な仕組みです。 共通鍵を使った環境では、鍵情報の流出+MACアドレス詐称が行なわれた場合、どの端末がネットワークに接続しているのか、どの経路で情報が漏洩したのか把握する事ができません。

公開鍵暗号化方式は、概念はとてもシンプルですが、使うまでの手順が面倒そうなので、あまり使われていないのではないでしょうか。 最近は市販されている家庭用無線LANルータにもRADIUS設定ができるものが多いので、ローカルなCA局とfreeradiusの運用から始めても良いかもしれません。

試行錯誤したところhostapd内蔵のRADIUS機能がどうしても使えなかったため、freeradiusを稼働させました。 debパッケージから構成できれば楽だったのですが、freeradiusのdebian lennyのパッケージでは、libsslライブラリとリンクされていないため、パッケージのビルドも行なっています。 詳細な手順はWPA2 + FreeRADIUS + EAP-TLSを確認してください。

参考にした文書、サイト

目次

作業全体の流れ

EAP-TLSを稼働させるまでの流れは、参考にした上記リンク先に従って進めています。 リンク先に書かれている事は省略していますが、気になったところや判りずらいところを補足する形で書きたいと思います。

  • hostapd-0.7.1のコンパイル
  • freeradiusパッケージの作成 & インストール
  • hostapd及びfreeradiusの設定
  • Windows Vistaからの接続確認

hostapd-0.7.1のコンパイル

本家からtarアーカイブを取得して、適当な場所にファイルを展開します。 configureスクリプトは附属していないので、次の手順で.configファイルを準備してコンパイルしましょう。

いまどきconfigureを使わずに.configファイルなんてlinux kernelのコンパイルみたいですね。

$ cd hostapd-0.7.1/hostapd/
$ cp defconfig .config
$ make
.configファイル

現状使っているhostapdをコンパイルした時の設定ファイルから、コメントと空行を除いたものは次のようになります。

.configファイルからコメントと空行を除いた中身

CONFIG_DRIVER_NL80211=y
CONFIG_EAP=y
CONFIG_EAP_TLS=y
CONFIG_IPV6=y

freeradiusパッケージの作成 & インストール

標準的にapt-getで導入できるfreeradiusではEAP-TLSが使えないので、設定を少し変更してパッケージを独自に作成する必要があります。

手順は参考にしたサイトにある通りですが、EAP-TLS以外は必要ないので、"--with-rlm_eap_tls"と"--with-openssl"の2個所だけを変更しました。 debian/ruleファイルの差分は次のようになっています。

debian/ruleファイルの差分

--- debian/rules.old	2010-02-15 20:17:09.000000000 +0900
+++ debian/rules	2010-02-15 20:16:36.000000000 +0900
@@ -80,14 +80,14 @@
 		--with-large-files --with-udpfromto --with-edir \
 		--enable-developer \
 		--config-cache \
-		--without-rlm_eap_tls \
+		--with-rlm_eap_tls \
 		--without-rlm_eap_ttls \
 		--without-rlm_eap_peap \
 		--without-rlm_eap_tnc \
 		--without-rlm_otp \
 		--with-rlm_sql_postgresql_lib_dir=`pg_config --libdir` \
 		--with-rlm_sql_postgresql_include_dir=`pg_config --includedir` \
-		--without-openssl \
+		--with-openssl \
 		--without-rlm_eap_ikev2 \
 		--without-rlm_sql_oracle \
 		--without-rlm_sql_unixodbc \
@@ -176,12 +176,12 @@
 	dh_strip -a --dbg-package=freeradius-dbg
 
 	dh_makeshlibs -a -n
-	for pkg in ${pkgs} ; do \
-	  if dh_shlibdeps -p $$pkg -- -O 2>/dev/null | grep -q libssl; then \
-	    echo "$$pkg links to openssl" ;\
-	    exit 1 ;\
-	  fi ;\
-	done
+#	for pkg in ${pkgs} ; do \
+#	  if dh_shlibdeps -p $$pkg -- -O 2>/dev/null | grep -q libssl; then \
+#	    echo "$$pkg links to openssl" ;\
+#	    exit 1 ;\
+#	  fi ;\
+#	done
 	dh_shlibdeps
 
 binary-common:

あとは一般ユーザでパッケージ作成のコマンドを実行して、待つだけです。

$ dpkg-buildpackage -rfakeroot
freeradiusパッケージの導入

ひとつ上(..)のディレクトリにパッケージが作成されているので、これを導入します。

$ cd ..
$ sudo dpkg -i freeradius_2.0.4+dfsg-6_i386.deb
$ sudo dpkg -i libfreeradius2_2.0.4+dfsg-6_i386.deb
$ sudo dpkg -i freeradius-common_2.0.4+dfsg-6_all.deb

ここで事前にパッケージのfreeradiusを導入していなかったり、状況によっては/etc/freeradiusに正しく設定ファイルが配置されないようです。

dpkgを実行した直後の/etc/freeradiusの様子


acct_users.dpkg-new		    otp.conf.dpkg-new
attrs.access_reject.dpkg-new	    policy.conf.dpkg-new
...

どうも依存関係が十分ではなかったようで、他のパッケージを導入しようとしたタイミングで気がつきました。

他のパッケージを導入する際に表示されたメッセージ

The following packages have unmet dependencies:
  freeradius: Depends: libperl5.10 (>= 5.10.0) but it is not going to be installed
              Depends: libsnmp15 (>= 5.4.1~dfsg) but it is not going to be installed
              Recommends: freeradius-utils but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

ここに書かれているようにapt-getを実行すれば、問題は解決します。

$ sudo apt-get -f install

予防策としては事前にopensslに対応していないリポジトリのfreeradiusを導入してから、コンパイルしたfreeradiusを導入するのが良いのかもしれません。

2010/03/06追記:
どうやら設定ファイルが正しく配置されない状況があるようなので、このセクションを追加しました。

dpkg --set-selectionsオプションについて

参考にしたサイトでは、自動的にapt-getでfreeradiusのパッケージが更新されてしまう事のないように各パッケージをholdにする手順が書かれています。

しかしこの中の一部の文字コードがASCIIではないために、コマンドの実行に失敗してしまいます。

エラー時の画面出力

$ echo “freeradius hold” | sudo dpkg --set-selections
dpkg: illegal package name at line 1: must start with an alphanumeric

バイトの並びをみると"0xe2 0x80 0x9c"と"..0x9d"になるので、HTMLでいうところの&ldquo;(left double quotation mark)と&rdquo;(right double quotation mark)のようです。

ユーロ圏では母国語用キーボードで、ASCIIではない事を意識せずにleft/right double quotation markを簡単に使えるのかもしれません。 実際のところechoコマンドでのquotationは、複数の空白を含めたい場合を除けば必要ありません。

$ echo freeradius hold | sudo dpkg --set-selections
$ echo libfreeradius2 hold | sudo dpkg --set-selections
$ echo freeradius-common hold | sudo dpkg --set-selections
間違ってmakeコマンドを実行してしまったら…

この手順通りに進めれば問題ないのですが、どこかのタイミングでmakeコマンドを打ってしまうとdpkg-buildpackage -rfakerootを実行してもパッケージが作成できなくなってしまいます。 やり直そうとしてmake distcleanとかは実行してはいけないルールのようです。

設定を少し変更してパッケージの作り直しをする時には、そのまま繰り返しdpkg-buildpackageコマンドを実行すればOKです。 どうしようもなくなったら、apt-get sourceからやり直しましょう。

freeradiusの起動

2010/02/17追記:
たまたまfreeradiusが起動しなかったと思ったら、どうもバグだと気がついたのでセクシュンを追加。

正しく設定ファイルを作成しても、現在のstableパッケージ(freeradius_2.0.4+dfsg-6)に含まれる/etc/init.d/freeradiusスクリプトからはfreeradiusは起動しません。

これはバグで/var/run/freeradiusディレクトリにfreeradユーザで書き込みができないからです。 起動スクリプトはこのディレクトリがない場合には作成して、適切な権限に設定してくれますが、このディレクトリはfreeradiusパッケージの管理下にあるため最初からroot権限で作成されてしまいます。

既にrootでのみ書き込みができるディレクトリが存在するため、ディレクトリの作成が行なわれず、後続の権限修正もまた行なわれないままになるという仕組みです。

このバグはfreeradius (2.1.7+dfsg-1)で修正されている模様です。 将来のstableパッケージでは問題は起きないでしょう。

$ sudo chown freerad:freerad /var/run/freeradius

hostapd及びfreeradiusの設定

今回の設定のポイントはTLS用の鍵ファイルを作成するところで、clientAuthserverAuthを指定します。 参考にしたサイトにはchallengeパスワードを設定するよう書かれていますが、EAPTLS.pdfでは言及されていません。

デフォルトのopenssl.cnfファイルにはreq_attributesセクションが定義されているので、おそらくこれが読み込まれているようにみえます。残念ながらドキュメントを追い掛けても、ここら辺の動きについての資料をみつける事ができませんでした。

作業の概要

今回は前回のApache2のSSL化で作成したCA局の鍵をそのまま使います。

ただ後続の作業で"--extfile"オプションを使うため設定ファイルを準備しました。 これはopenssl.cnfに含める事はできないため、別ファイルである事が必要です。ファイル名や配置場所は任意で構いません。

demoCA/xpextensionsファイル

[xpclient_ext]
extendedKeyUsage=1.3.6.1.5.5.7.3.2

[xpserver_ext]
extendedKeyUsage=1.3.6.1.5.5.7.3.1

今回は同様の内容を持つ、次のファイルを使用しました。

demoCA/xpextensionsファイル ver.2

[xpclient_ext]
extendedKeyUsage=clientAuth

[xpserver_ext]
extendedKeyUsage=serverAuth

どちらのファイルを使っても、問題なく動きました。

server用鍵の生成

このステップは基本的にapache2のSSL化の時と同じですが、前回使用したコマンドラインの後ろにextensions関連のオプションを追加したところエラーになってしまいました。

エラーになる実行例

$ openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem -extensions xpserver_ext -extfile demoCA/xpextensions

今回は次の手順で鍵ファイルを作成しました。

$ openssl req -new -nodes -keyout newkey.pem -out newreq.pem -days 365
$ openssl ca -policy policy_anything -out newcert.pem -extensions xpserver_ext -extfile demoCA/xpextensions -infiles newreq.pem

Extended Key Usageの追加を確認する

        X509v3 extensions:
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
Certificate is to be certified until Feb 16 23:14:16 2011 GMT (365 days)
Sign the certificate? [y/n]:y
...

これで、サーバ用のnewkey.pem(秘密鍵)とnewcert.pem(公開鍵)のペアが作成できているはずです。 別のディレクトリを作成して鍵ファイルを保存します。

$ mkdir wireless_server_keys
$ mv newcert.pem newkey.pem wireless_server_keys/
$ cp demoCA/cacert.pem wireless_server_keys/

2010/03/06追記:
中間CAを使う時にはfreeradiusに指定するcacert.pemファイルは1つなので、親CAと中間CAのpemファイルを連結します。
$ cat ../demoCA/cacert.pem demoCA/cacert.pem > wireless_server_keys/cacert.pem

CN(CommonName)にはローカルのDNSサーバに登録されているFQDNを指定しました。

ここまでの作業が無事に終ったら、秘密鍵(newkey.pem)に繋がるnewreq.pemファイルは削除しておきます。

$ rm newreq.pem
client用の鍵生成

手順自体は同じですが、Windowsでクライアント用の鍵ファイルを読み込むためにpkcs12形式のファイルも作成しておきます。 参考にした手順では、この時に"-clcerts"オプションを指定してCA局の公開鍵を別経路で取り込むようにしています。

セキュリティ的にはより良い方法ですし、もし社内や閉じられたコミュニティ向けのローカルなCA局を運用するのであれば、別経路でのCA局公開鍵の配布は必須とは重います。 ここではpkcs12にCA局の情報も入れています。

$ openssl req -new -nodes -keyout newkey.pem -out newreq.pem -days 365
$ openssl ca -policy policy_anything -out newcert.pem -extensions xpclient_ext -extfile demoCA/xpextensions -infiles newreq.pem 
$ openssl pkcs12 -in newcert.pem -inkey newkey.pem -certfile ./demoCA/cacert.pem -out newcert.p12 -export -name "My Certificate"

ここでのCNにはメールアドレスを入力しました。 社員番号のようなユニークなキーがあれば、それでも良いと思います。

2番目のコマンドで署名をする時には、次のようなExtended Key Usageが付与されているか確認します。 また最後のコマンドでnewcert.p12ファイルを作成する時には、任意のパスワードを付けます。 CA局のパスワードとは違うものにするのが良いでしょう。

Extended Key Usageの追加を確認する

        X509v3 extensions:
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
Certificate is to be certified until Feb 16 23:26:17 2011 GMT (365 days)
Sign the certificate? [y/n]:y
...

作成した鍵ファイルを別ディレクトリに保存しておきます。

$ mkdir wireless_client_keys
$ mv newcert.pem newkey.pem newcert.p12 wireless_client_keys/
$ rm newreq.pem

freeradiusサーバへの鍵ファイルの配布

TLS-EAPに対応したfreeradiusが既に導入されている事が必要です。 このfreeradiusが稼働するサーバにscpなどで鍵ファイルのディレクトリ全体をコピーしておきます。

$ scp -r wireless_server_keys 192.168.10.10:

freeradiusが稼働するサーバの/etc/freeradius/certs以下にファイルを保存していきます。

$ sudo cp wireless_server_keys/cacert.pem /etc/freeradius/certs
$ sudo cp wireless_server_keys/newkey.pem /etc/freeradius/certs
$ sudo cp wireless_server_keys/newcert.pem /etc/freeradius/certs

さらに参考にしたサイトの例に従って"dh"ファイルや"random"ファイルを作成します。 dhファイルの作成はalixには重い作業なので、より高速なCPUを積んだマシンで作成するのがよいでしょう。

$ openssl dhparam -5 -out dh1024.pem 1024
$ sudo cp dh1024.pem /etc/freeradius/certs

randomファイルはalix上で作成します。

$ sudo dd if=/dev/urandom of=/etc/freeradius/certs/random count=2

2010/03/06追記:
参考にした手順で作成した"dh"ファイルは512bitだったので、1024bitで作成しました。 2048bitでも良いのですが、ファイル作成に時間がかかるのと、そこまでは またrandomファイルの作成手順についても載せています。
この作業の結果、eap.confの中でのdhファイル名を変更(dh->dh1024.pem)しました。

またeap.confは次のようになりました。

/etc/freeradius/eap.confファイル

eap {
        default_eap_type = tls
        timer_expire     = 60
        ignore_unknown_eap_types = no
        cisco_accounting_username_bug = no         

        tls {
                certdir = ${confdir}/certs
                cadir = ${confdir}/certs
                private_key_password = 
                private_key_file = ${certdir}/newkey.pem
                certificate_file = ${certdir}/newcert.pem
                CA_file = ${cadir}/cacert.pem
                dh_file = ${certdir}/dh1024.pem
                random_file = ${certdir}/random
                fragment_size = 1024
                include_length = yes
                check_cert_cn = %{User-Name}
                cipher_list = "DEFAULT"
        }
}

次にclient.confファイルを編集します。 テストのためにclient localhostの定義がありますが、secretは適当に変更しておきます。 そして最後にhostapdが走るホストのIPアドレスかFQDNを定義します。

client 192.168.1.x {
        secret = 6a_abp1z75_5e318
        shortname = wireless-ap
}

パスワードは次のようなコマンドで適当な文字列を表示させて使っています。 このままだと0-9,a-fの範囲しか使わないので数字の'0'は適当な記号に、'f'はa-fの範囲外の適当なアルファベットに手で置き換えるといったことをしています。

$ dd if=/dev/urandom bs=16 count=1 | od -t x8

2010/03/06追記:
あっちこっち参照するのは面倒なのでclient.confの編集とパスワードの適当な選び方について追加しました。

サーバ用のnewreq.pemファイルを生成する段階で、"-nodes"オプションを指定してパスワードをつけていません。 このためprivate_key_passwordには何も指定していないところが、参考にした手順と違うところです。

hostapdの設定について

hostapd内蔵のradius機能を使わないためにeap_server=0を指定するか、コメントアウトする事が必要だろうと思います。 ただ"WPA/IEEE 802.11i configuration"セクションにあるオプションを有効にしたところ、PTK Rekeyingのタイミングで接続が切れるようになってしまいました。

できるだけデフォルト設定のように使って、wpa_ptk_rekeyなどのオプションは指定しないのが良さそうです。 いまのところhostapd.confは次のようになっています。

コメント、空行を除いたhostapd.conf

interface=wlan0
bridge=br0
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=0
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=ALIXHOMEAP4TEST
country_code=JP
ieee80211d=1
hw_mode=g
channel=9
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
ap_max_inactivity=300
max_listen_interval=100
ieee8021x=1
eapol_version=1
eapol_key_index_workaround=1
eap_reauth_period=1800
use_pae_group_addr=0
eap_server=0
own_ip_addr=192.168.10.10
nas_identifier=alix.example.org
auth_server_addr=192.168.10.10
auth_server_port=1812
auth_server_shared_secret=xxxxxxxxxxxxxxxxxx
acct_server_addr=192.168.10.10
acct_server_port=1813
acct_server_shared_secret=xxxxxxxxxxxxxxxxxx
radius_retry_primary_interval=600
radius_acct_interim_interval=1200
dynamic_vlan=0
wpa=1
wpa_key_mgmt=WPA-EAP
wpa_pairwise=TKIP

Windows Vistaからの接続確認

作成したnewcert.p12ファイルをUSBメモリなどでコピーし、このファイルをWindows上でダブルクリックするとインストールが始まります。 気をつけるところはデフォルトではどのCA局も信頼する対象になっていませんから、Access Pointのプロパティから信頼するCA局としてチェックを入れるところでしょうか。

ただ、wpa_ptk_rekeyをコメントアウトして、比較的安定して動いていると思いますが、WPA-PSKの時と比べると、まだ時々切断されている事があります。

さいごに

hostapdでEAP-TLSを実現するための方法をみると、CA局を専用に作らないとなのかなぁ、などいろいろ思いますが、なんとかApache2のSSL化で使ったdemoCA/cacert.pemが使えました。 ただ、ちゃんと動く環境を手に入れるまでは不確定な要素を排除するために、専用のdemoCA/cacert.pemを作る確実な手順を踏襲するのが良いとは思います。

いくつかの手順をみるとそれぞれの工夫がみて取れます。 EAPTLS.pdfではスクリプトが準備されていますが、内部を理解しないとちゃんと動かない、なんてことにもなりそうです。 TLS周りの作業は自分でスクリプト化するのは良い事ですが、人が作成したスクリプトは時間をかけても確実に各ステップを確認して、自分なりのスクリプトに編み直す事が必要そうです。

hostapdの内蔵TLSがうまく動いていないとか、未解決のままにしている事はありますが、ひとまずは目的を達成できたので情報を整理しておこうと思います。

2009/11/20

PowerShell 1.0でアプリの一覧を取ってみたものの

東京の寒さを報せるニュースをみていたら、街を歩く人達が自分よりも暖かそうな格好をしている事に気がつきました。うーん、油断してたかなぁ。でもまだここら辺は雪は降ってないし、大丈夫じゃないかなぁと思っています。

たまたまokwaveでWindowsに登録されているアプリケーションの一覧を取る方法について質問されているのをみました。 手元のWindowsXP Home SP3でpowershellを使う方法を試してみたところ、エラーになってしまいました。

PS C:\Documents and Settings\Owner> gwmi win32_product


IdentifyingNumber : {15DA9946-FB08-3742-A385-9F8AAA863D71}
Name              : Microsoft Visual F# Runtime 1.0
Vendor            : Microsoft Corporation
Version           : 10.0.21006
Caption           : Microsoft Visual F# Runtime 1.0

Get-WmiObject : エラーです
発生場所 行:1 文字:5
+ gwmi  <<<< win32_product

"gwmi"は"Get-WmiObject"のエイリアスです。 調べてみたところバグと認識されているものと挙動は同じようです。 [ 荒井省三のBlog::[PS]WMIの取り扱いについて ]

まだBeta版のVisualStudio2010を入れているので、まさかその関連でWMI周りも変ってしまったのかと思い、VMWareのスナップショットをVisualStudioを入れる前に戻して確認してみました。 結果は無事に動きましたが、関連についてはいまいちはっきりしません。

C:\Windows\System32\直下の最近変更されたdllを眺めてみても、wmi.dllとかは変更されていないし、VisualStudio2010が変な情報をレジストリに登録してしまったのかなぁ。そんなことあるんだろうか。

ソフトウェアのインベントリ(台帳)管理のためには、一覧の取得は重要な機能だと思うのですが、レジストリをみなきゃ確実じゃないとしたら、ちょっとインタフェースがいけていないなと思います。

まぁインベントリ管理ソフトウェアを使えという話しになるかもしれませんが、使った事がある人なら、情報整理のための追加で必要な膨大なマンパワーと価格を考えて発狂しそうになったことでしょう。

PowerShell 2.0を試してみる

2.0自体はマイクロソフトのサイトからダウンロード可能です。その際に1.0をアンインストールするように言われますが、プログラムの追加と削除で”更新プログラムの表示”オプションにチェックを入れないと一覧に表示されず、アンインストールできません。更新プログラムの一部なんですね…。

導入が終ると”すべてのプログラム”の"Accesories"フォルダの中にPowerShellのプログラムが導入されていました。昔どこかで試したIntegrated Scripting Environment (ISE)が入っています。

で、早速win32_productにアクセスして試してみると、似たようなエラーが起ります。

VisualStudio 2010 Ultimate beta2をアンインストールしてみる

beta2を入れる前にbeta1を削除する手順はあるのですが、beta2自身をアンインストールする手順はUltimate beta2のリリースノートの中ぐらいしか見当りませんでした。

正しい順番でアンインストールする必要があるならサポートプログラムが欲しいところです。 まだbetaだからしょうがないけど、製品版がでても同じなんだろうなぁ…。 まっさらな環境にbeta2をインストールしている場合のアンインストール順番は以下の通り。

  1. Uninstall all instances of Visual Studio 2010 products (for example, Visual Studio 2010 Ultimate).
  2. Web Deployment Tool (Web配置ツール)
  3. Silverlight 3 SDK (Microsoft Silverlight 3 SDK - 日本語)
  4. SQL Server 2008 Management Objects (SQL Server 2008 R2 Management Objects)
  5. SQL Server CLR Types (SQL Server System CLR Types)
  6. SQL Server 2008 (Microsoft SQL Server 2008)
  7. SQL Server 2008 Native Client (Microsoft SQL Server 2008 Native Client)
  8. SQL Server Compact 3.5 SP2 (Microsoft SQL Server Compact 3.5 SP2 Beta 日本語版)
  9. Visual Studio 2010 Tools for Office Runtime Beta 2 (Visual Studio 2010 Tools for Office Runtime Beta 2 (x86) 及び 同 Language Pack)
  10. The .NET Framework version 4 Language Pack (未導入)
  11. The .NET Framework version 4 Extended (reboot, if prompted) (Microsoft .Net Framework 4 Extended Beta 2)
  12. The .NET Framework version 4 Client (reboot, if prompted) (Microsoft .Net Framework 4 Client Beta 2)

"プログラムの変更と削除”の一覧に表示される時には、日本語の名前で登録されていたり、リストにある名前の通りではなく"Microsoft"が前に付いたりします。 ”SQL Server CLR Types”などは逆に"Microsoft"が前に付かないので、見過してしまいそうです。

また一連の操作の中で"Microsoft SQL Server 2008"を削除する時には、Windowsの再起動処理で失敗マークが付いてしまい、一旦再起動した後でなければアンインストールできませんでした。

明記されていませんが、Visual Studio 2010 Tools for Office Runtime Beta2 (x86)を削除する時には、同 Language Packも削除するべきでしょう。

”Microsoft .NET Framework 4 Beta 2 日本語 Language Pack”は導入されていませんでした。 "Microsoft .Net Framework 4 Extended"と"同 Client"を削除すると、対応するLanguage Packは自動的に削除されました。ここの挙動はOffice Runtimeと違いますね。

まぁBeta版ですからね。いいんですけれど、やっぱり面倒だなぁ。

途中から"gwmi win32_product"が動く

"Web Deployment Tool" (Web配置ツール)を削除して、Silverlight 3 SDKのアンインストールを始めてから、無事にアプリケーションの一覧が表示されるようになりました。

でも全部アンインストールしてから手動でSilverlight 3 SDKとWeb Deployment Toolをインストールしても現象は再現しませんでした。

PowerShellは良いんですけどね、この挙動だと仕事でインベントリ管理にはちょっと使えないかなぁ。

2009/10/31

Windows7はスルー

日経なんかでも散々Windows7の特集組んだりしてましたが、Inspiron 640mに入っているVista BuisinessをWindows7に移行しない事にしました。

Intelの945GMチップセットを積んでいるので64bit版にしても認識できるメモリ量が増える分けではない、そもそも使いたいアプリ&機能がない、というのが主な理由です。

しかし一番大きな理由は限定出荷されているアップデート版を買うよりも、DSP版の方が安いというところでしょう。もちろんカスタムインストールになるから移行が大変ですけどね。64bit版にするなら同じことですし。

Windows7はRC版を使ってみて、まぁ見た目に違うのとUAC周りで挙動の違いはあるのですが、バックアップ機能とか、壊れたNTFSのチェックディスク機能とか、Vistaと価格差を埋め合わせるほどのメリットはないと感じています。

XPを使っていてハードウェアの性能が十分なら、Windows7にするのはおすすめなんですけどね。 しかしXPのバックアップ周りとかNTFSのチェックディスクの機能なんかは貧弱ですが、 日常的に使う分には何も不具合ないのが困りどころだとは思います。

まぁ新しいもの好きにしても、OS自体はすぐに飽きそうな気がします。 それよりもXPやVistaでIronPythonやPowerShellで遊んでいた方が楽しいかなぁ。

仕事でクライアント環境を管理するようになればVMWare用にパッケージ版を買うかもしれないですけどね。

2009/09/17

Avast!を導入して気がついた事

ThinkPad x22のアンチウィルスソフトをNOD32からAvast!に入れ替えました。

NOD32はMacBookのVMWareで動くVistaに持っていきました。 今回使ったAvast! Home Editionは家庭での非営利目的に限定して無償で配布されています。

Avast!自体はビジネス向けやMac向けに有償版があるので、 単純に無料のソフトウェアというわけではありません。宣伝広告のためでしょうか。

使ってみた感想

NOD32と比較してAvast!の消費メモリが大きいのが気になります。NOD32は20MB〜40MBの消費量だったのが、Avast!は2つのプロセスが各25MB〜80MBのメモリを消費しています。全体で90MBほど起動時のメモリ消費量が増えています。

ThinkPad x22は最大とはいえ640MBしかないので、特にメモリの消費量は気になってしまいます。 けれど普段使うレスポンスに大きな違いは感じられないですし、お金があればNOD32に戻したいぐらいには思いますが、いまどきのパソコンならAvast!で十分なんではないでしょうか。

Avast!はお勧めか?

お勧めできない製品はいくつか思い浮ぶんですけどね。 電気屋さんで手に入る安価なソフトを使って頻繁に再起動するようになったパソコンを知っています。 そういう点からみても、Avast!はいまのところ大きな問題を起してはいないと思います。

アンチウィルスソフトの目的って何なんでしょうね。いわゆるScript Kiddy程度の、知り合いの嫌がらせやいたずらを防ぐという意味では、どの製品でも大差はないでしょう。この範囲ではAvast!は十分な役割を果すと思います。

けれど仕事で使うかもしれないWindowsにはNOD32を使っています。 これは何かあった時の言い訳としての役割もありますし、価格に対する独自の機能や性能をプラスに評価しているからです。はっきりいえば、単純に自分の持つイメージが良いという事だけが理由です。

他の人にアンチウィルスソフトを勧める時には、その人が使おうとしている製品や、期待するイメージを聞くようにしています。自分がノートンを使わないからといって、相手がノートンに信頼感を持っていれば反論する理由はありません。

もし間違った情報を持って行動しているようなら指摘できますし、+αの情報を伝える事もできます。 どんな製品も不具合を持っていないという事はないですし、有名な製品を使うというのも「赤信号をみんなで渡る」ようなものかもしれません。最終的な決定はパソコンを使う本人がするべきで、これはとても大切な事です。

けれど、大事な事はもっと他にあるような…

アンチウィルスソフトに何を使うかは気にするところだと思いますが、 もっと大切な事は危険そうな怪しいWebサイトやメールには近づかないことです。

定期的にセキュリティ更新を行なう事でレベルの低い愉快犯は防ぐ事ができます。 バックアップを取っておけばファイルを壊されても何とかなるでしょう。

自らの能力の限界を認めて誰かに守ってもらおうという姿勢は、私も同じですし、良い事だと思います。 ただそれに100%依存してしまっては、やはり危険から逃れる事はできないのだとも思います。 人間が作ったコンピュータの世界は、しょせん人間の日常生活の一部を反映しているに過ぎませんから、普段の生活と同じ感覚で考えれば良いのですけどね。

痛みを伴なうわけではないから、ついつい羽目を外したり、不注意になって、危険な目にあってしまうのかもしれません。

2009/09/08

MacBook+VMware+Vistaで遭遇したFlashplayerの不具合

アップルストアで売られていた修理品のMacBook 13インチ アルミニウム (late 2008)を手に入れました。 少し古いですがNVIDIA 9400MGのチップセットが入っていれば、しばらくは問題ないだろうという判断からです。 MacBook Proの方が液晶の色域は向上していますが、普段使う分にはこのLEDバックライトで問題ありません。

さてさて、今回はVMWare FusionでVistaを動かした時に遭遇した、Flashplayerの不具合についてです。

普段使っているInspiron 640mやらMac miniやらでは、VMWare(Player)からVirtualBoxに移りました。 今回はWindows Vistaを割と安定して使いたかたったので、VMWare Fusionを使いました。 VirtualBox + Vistaの組み合せは試していませんが、Ubuntuの経験からはきっと問題なく動くんでしょうね。 スナップショットを活用するつもりはないので、VMWareは安定して動いて欲しい保険の意味が大きいです。

さて、IEのアイコンをDockに入れます。 MacからIE8のアイコンをクリックするだけで全画面モードでVistaが立ち上がり、IEが動き始めます。 最初はIE8が立ち上がらなかったりしましたが、VMWare Toolsを入れたり、ゴチャゴチャしている間に、どうやらいまのところはちゃんと動くようになっています。

しかしYoutubeで全画面に切り替えると画面が固まってしまいます。

症状を改善するには全画面表示に切り替える前に、動画上で右クリックをして設定から「ハードウェアアクセラレーションを有効化」のチェックを外せば良かったのですが、情報が見つけられなくて苦労しました。

分かってしまえば、以前もlinux上のflashplayerで同じような事があったと思うんですよねぇ…。 無意識にキャッシュ設定周りをいじった時に変えちゃったのかなぁ。

2009/09/06

WIndows XPが無線LANに接続できなくなった…

英語キーボードのThinkpad X22(Windows XP)は、キータッチがDellのInspiron 640mとは比べものにならないほど良く、HDDも高性能のものに変更しているので、まだまだ現役で使っています。この投稿もX22のChrome上で書いています。

普段は無線LANカードとしてコレガのWLCB54GSXを使っています。 しかしこの無線LANに接続したままEthernetケーブルを接続してから、再起動をしても無線LANに接続する事ができなくなってしまいました。 Ethernetと無線LANに同じIPアドレスを静的に割り当てた設定がどうやらWindowsの動きをおかしくしたようです。

しかし根本原因の特定まではできず、結局のところは無線LAN用のIPアドレスを変更してドライバを再インストールする事で解決できました。ドライバの再導入が必要だったところから、無線LANのサーバー側は関係なさそうです。

しかし見た目はIPアドレスも割り当てられているし、pingの反応がないのを見るまでは、ネットワークに接続できているものと思っていたので、DNSサーバー側を確認したり、いろいろ時間がかかりました。 重複したIPアドレスを割り当てると、あとあとまで問題があるのはWindowsの問題なのかなぁ。

そういえばLenovoのメーリングリストで流れてきたメールをみて気がついたのですが、週末割引を使ってそこそこなスペックのx200sが10万円ちょっとで入手できそうです。 個人的にはTegraベースのネットブックに興味があるのと、仕事もないしThinkpadが必要な状況ではないので、今回はスルーかなぁ。

もしものためにドライバーが置かれている"C:\corega"フォルダは残しておこう。 Gyaoだけならみれるし、このx22にはもう少し働いてもらいたいところです。

2009/08/25

リムーバブルではなくなった外付けHDD

Inspiron 640mに入っているVista Business SP2のバックアップ用に使っている320GBのTranscend製のUSB外付け2.5インチHDD StoreJet。いつからか「安全に取り外す」を選択すると「'汎用ボリューム'デバイスを使用中のため、停止できません」のメッセージが表示されるようになってしまいました。 これでは電源を入れている間は取り外せないままで、リムーバブルとはもはや呼べないものになっています。

けれどデバイスをつかんでいるプロセスは思いつかず、電源を止めたり再起動したタイミングで外していました。しかし、どういう理由か納得していないけれど、現象としては無事に「安全に取り外す」が行なえるようになりました。

変更したデバイスのプロパティ

変更したのは「ポリシー」タブの設定で、「クイック削除のために最適化する」から「パフォーマンスのために最適化する」にチェックを移しました。この状態では、どういう理由か無事に「安全に取り外す」が行なえます。

元々の設定であれば「安全に取り外す」を選択する必要がほぼなかったわけですが、それであれば選択できないか、「安全に取り外せます」ぐらいのメッセージが欲しいところ。 間違いかと思って手元で設定を戻してみたけれど、1回目は再現して取り外せなくなりました。

ただし次から何回か設定を戻したり繰り返している内に、どちらの設定でも安全に取り外せるようになりました。 時間の経過が解決したのであれば、Diskeeperが分析でもしていたのかなぁ…。 というわけで原因はなぞのままです。

UNIXやらLinuxであれば"lsof"で解決したいところですが、Windows XP以降では"openfiles"で似たような動きをするとのこと。ただし使うためには再起動が必要で、今回はうまく使う事ができませんでした。

Vistaの嫌いなところ、はまるところ

今回は「デバイス・マネージャ」の「ディスクドライブ」に一覧される「StoreJet Transcend USB Device」のように表示されるデバイスのプロパティを変更しました。

デバイスマネージャの代りにExplorerに表示される"C:"やら"F:"やらのプロパティ経由でも「ハードウェア」タブに一覧表示されているデバイスのリストがあって同じウィンドウが開きます。 けれどもプロパティの「ポリシー」タブ内は灰色の表示で変更できません。 これは管理者権限でExplorerを起動しても同じ。

この他の方法としては、管理ツールにある「コンピュータの管理」を起動してディスクの管理の中からプロパティを開く事でもポリシーの変更は可能です。 こっちは見た目はExplorerと同じなのに、ちゃんとポリシーの変更ができました。

なんでかなぁ。UACのせいだと思うんだけど、Explorerを管理者権限で起動しても見れないって変だよなぁ…。もしExplorerの問題だとしたらUACの動きが実装に依存する事になっておかしいよね。フェイルセーフではあるけれど。

2009/08/21

dynabook C8/213の壊れかかったHDDの交換

手持ちのノートPCのHDD交換では、Windowsが動いているものは、これまでSelfimageで対応してきました。 ソフトウェアの再インストールは時間がかかりますし、まったく同じ環境は引き継げないので、ディスクイメージでコピーをするのが楽ですよね。

ところが今回はSelfimageで40GBのHDDから別の80GBのHDDへ読み込んでいくと20.711GBのところで"CRCエラー"が発生してしまうノートPC(dynabook C8/213)の引っ越し作業を行なう事になりました。

最終的にはInspiron 640mのVistaに取り出したHDDと新しいHDDをUSB経由で2台接続して作業を行ないました。C8/213に接続したままで作業が完了するかは微妙ですが、Selfimageを使わずにDriveImage XMLの"Backup", "Restore"だけを使えば行なえただろうと思います。

C8/213の症状

まとめると次のような状況でした。

  • 正常に起動し、通常の使用については不具合はない
  • ときおりHDDから1秒間に2回ほどのペース(約120BPM)で「カチ」という音が連続して聞こえてくる
  • さらにまれに、1秒間に4回ほどのペース(約240BPM)で「ガチ」という音が連続して聞こえてくる
  • CHKDSKによる不良セクタの修復などでは不具合は報告されていない
  • SelfimageやLinux上のddコマンドでディスクイメージを読み出すと、特定の個所で処理が停止する

潜在的にかなり問題のある状況で、SelfimageやDiskimage XMLで特定のセクタにアクセスしようとするとヘッドが数回その場所をシークしようとする音がした後に沈黙、Windows上ではCRCやらその他のエラーが報告されました。

引っ越し作業をする際の注意点

今回は引っ越し元と、引っ越し先のHDDをVistaに接続しています。 作業がない時はHDDを接続しないなどの方法で、間違ってオリジナルのHDDをフォーマットするといった事がないようにしてください。

また容量の小さいHDDから大きなHDDにコピーする場合は、一時的に同じ容量のドライブが作成されます。 余った領域をD:ドライブとして使う方法もありますが、DISKPARTコマンドを使ってC:ドライブ(パーティション)が拡張できる事も覚えておいてください。

成功した方法

とりあえず試行錯誤の経過は置いておいて、成功した流れをメモしておきます。 冗長な部分もあると思いますが、とりあえずこの方法で繰り返し成功しました。

  1. C8/213から取り出したオリジナルHDD(HDD-SRC)と、新しいHDD(HDD-DST)を両方ともUSBケースに入れVistaに接続
  2. Selfimageを使い、HDD-SRCからHDD-DSTに"entire drive"でコピー (途中でエラーで停止する)
  3. Vistaでエラーチェックから”不良セクタの回復”にもチェックを付けて、再起動 (CHKDSKが走る)
  4. VistaでHDD-DSTがNTFSとしてドライブレターが付いている事を確認
  5. DriveImage XMLを使い、HDD-SRCに対して"Backup"を使い、不良個所がでても無視し、バックアップイメージを取得
  6. DriveImage XMLを使い、HDD-DSTに対して"Restore"を使いバックアップイメージを戻す
  7. C8/213にHDD-DSTを載せ換えて無事に起動する事を確認
  8. 再びHDD-DSTをVistaに接続して、DISKPARTを起動し、Volumeの選択(Select)と拡張(Extend)を行なう

Selfimageを使わなくてもWindows XPのインストールCD-ROMがあれば、単純なコピーを取得した後で"fixboot", "fixmbr"を実行すれば起動できるだろうと思います。 最初に"Selfimage"を行なっているのは、この部分の作業を省略するためです。

さいごに

DriveImage XMLを使うと、セクタエラーがあっても何とか読める範囲のファイルはバックアップを取得する事ができました。この点はSelfimageにはない利点だと思います。

今回はリカバリCDがないなどの状況があったので、ブートブロックを含めてオリジナルHDDのコピーを作成する方法に執着しましたが、HDDが壊れかかっている場合にはリカバリCDから新しいHDDにコピーを作成するのが確実です。今回は運が良かったかなと

2009/07/08

Windows7での「アップグレード」という言葉の意味

既にXPやらVistaやらが動いているPCにWindows7を入れて動かすという意味で「アップグレード」という言葉を使いますが、人によって受け取り方が違ってきます。私は「アップグレードできる」と言われれば、OS以外のデータや導入済みのソフトウェアはそのまま"Program Files"フォルダに引き継がれると思ってしまいます。

しかし今回はXPからのアップグレードは「クリーンインストール」になると説明されていて、既存のデータやソフトウェアは引き継がれないと言われています。

わかる人にはわかるこの説明がいろんなところで混乱を招いていて、マイクロソフトのサイトをみていてもVista等を対象にした説明ではデータが引き継がれるという意味で「アップグレード」と書かれていますし、対象のOSによって単語の意味が統一されていないようです。 もちろんアップグレード版は低価格ですから、「XPユーザーはアップグレード版を購入できます」という意味で「アップグレードできます」と書かれているところもあります。

こんな風に言葉の違いが気になったのは、32bit版のVistaに64bit版のWindows7が導入できるか気になって調べていたからです。少なくとも32bit版のXPに64bit版のVistaが導入できない事はわかっています。→「32 ビットと 64 ビットの Windows : よく寄せられる質問」。 これを踏まえてWindows7についての情報を探すと公式な資料は発見できませんでしたが、Wikipediaには「32bit版Vista→64bit版Windows7が可能」と書かれています。その出典が価格.comのクチコミ情報になっていたので、そこを見てみると信用できるか微妙な表現になっていました。

先日予約が始まった(そしてすぐに終った)Windows7のアップグレード版を販売するサイトでは、はっきりと「32bit版Vista→64bit版Windows7は新規インストール」と書かれています。ここでも「クリーンインストール」とは書かれていないですね…。

仕組みを考えるとVistaであれWindows7であれ、32bit版と64bit版でデバイスドライバの互換性はありませんから、異なる"ビット"同士で既存のデータやソフトウェアを引き継いだアップグレードは非常にリスクが高いと考えるのが妥当に思えます。たぶん再起動したら動かなくなる可能性がある程度あると思います。

たぶん「アップグレード版を購入する事ができます」が短かくなって「アップグレードできます」になったのだと思いますが、マイクロソフトの窓口担当者でも混乱しているという事なのでしょうか。

結局みつけたのがこれ…

マイクロソフトのサイトからやっとそれらしいものを探すと、優待アップグレードプログラムの中に「プログラムに関する情報」があり、その中で「システムのプラットフォーム (32 ビットまたは 64 ビット)」と書かれた下に次のような説明がありました。

重要 : ご使用の Windows Vista の基本言語、エディション、プラットフォームとは異なる言語、エディション、プラットフォームの Windows 7 にアップグレードしようとすると、アップグレード処理が失敗し、インストールされていた元のバージョンの Windows ソフトウェアで利用していたアプリケーション、ファイル、および設定が失われることがあります。最悪の場合、ハードドライブのフォーマットが必要になることがあります。

※ 「プラットフォーム」に強調タグを追加しました。

販売店の情報でも良いけれど、なぜか信用できそうな情報がこれだけという結果になりました。Windows7から64bit版を本格的に展開するのだから、こういったところのフォローも必要じゃないかなぁ。32bit版と64bit版は同一パッケージに同梱されるから間違ったものを買う可能性はなさそうですが、正しくないものを導入してしまいそうです。

Windows7に期待が集っているらしい

どうやらWindows7の発売日が決定したらしく、一般の各種メディアでも取り上げられ始めています。今日の日経新聞にも動作が軽快であるなど期待が高まっている旨の記事が掲載されていました。記事はすごくよくまとまっていました。

その記事の中でXPからWindows7への乗り換え時の価格について触れられていました。 それを読んで、ふと、アップグレード版を購入したとして初期のXP搭載PCの代りにはならないかなぁ、と思いました。XPからのアップグレード後にストレスなく動くのはVistaが発売されてからも意図的にXPを動かしていたようなPCぐらいでしょうか。

Vistaに対する不満を受けてWindows7で行なわれた改善点は、起動時に動かすアプリケーション数を抑えた事でメモリ使用量とCPUへの負荷を下げた事のはずです。結果として前評判は非常に良いものとなりました。Vistaで不満を爆発させたユーザーがWindows7を購入した場合はそれなりに納得すると思います。

しかしVista発売以前のXP搭載PCを使っているユーザーが十分なCPU、メモリリソースを持っているようには思えません。アップグレード版が売れれば売れるほど不満の声が大きくなるといった事になるのではないかと思います。

ネットブックでもWindows7が動くとはいわれていますが、メリットを感じる事はたぶんないと思います。サポートの問題でXPを止めなければいけないMSには十分大きなメリットがあるのでしょうけれど。

WindowsがNT系に移行して安定稼動するOSとなってからは、OSの更新が必要となるのは、より新しいハードウェアを使いたい場合ぐらいでしょうか。 もちろん使い易くなったと言われたりしますが、実際にはOSが新しくなってもユーザーの作業効率が増すようなInnovationは行なわれていないと思います。 グラフィック機能は新しいOSの方がリッチなようですが、グラフィック機能をカーネルに組み込む事で容易に差し替える事が難しくなった元々の設計に問題があった気もします。

マイクロソフトは意図的に新しい機能をバックポートせずに済ませる事で、OSのエコシステムを維持していく以外に道はないように思えます。

企業向けには間違いなく売れるでしょうね…

XPからのアプリ移行を考えるとVirtual PCでXPが動くXP Modeはよさそうですが、より多くのCPU、メモリのリソースが必要になります。Professional版が必要ですから一般消費者よりも、業務アプリを安全に動かしたい、クライアントの環境に依存せずに開発したい企業の利用者、開発者に対してよりメリットがありそうです。いままでは追加でライセンスを購入しないと実現できなかったこの利点のために、企業はより高いスペックを持つPCへの買い替えすらするのかもしれません。

いつWindows7を我が家に導入するか…

結局のところプログラムを書くぐらいならVistaでもしばらくは同等の環境が手に入りそうです。きっとWindows7は長い間使われるでしょうから、いつかは乗り換えるでしょうけれど、SP1が出たら考えるかなぁ…。

少なくともその前にUbuntu 10.04 LTSをメインマシンに導入するでしょうね。

2009/04/02

Diskeeper 2009体験版を2週間使ってみて

家のThinkPad x22はHDDを入れ替えてWindows XP ProfessionalとUbuntu 8.10を使い分けています。このXPとInspiron 640mのWindows Vista BusinessにDiskeeper 2009 Professionalの体験版を入れえて約2週間使ったところ。

同じところが作っているとはいえ、動きが違うのでOS標準のデフラグよりもバックグラウンドで動作するところなどは快適で満足しています。

正直なところNTFSとはいえDiskに十分な空きがあれば問題ないだろうと思っていましたが、 Diskeeperを入れてからは実感としてアプリケーションやOSの起動が早くなったと感じていて、デフラグツールは必要だなぁと思います。

以前よりディスクアクセスの時に感じたつっかかり感はなく、 細かな動きがスムーズになっていると感じているので、 常時使うVistaにはDiskeeperの製品版ライセンスを購入しようかなと思っているところです。

しかしVMWareに入っているWindows XP HomeはUltraDefragで十分に満足しているし、 ThinkPad x22にもDiskeeperのライセンスはあった方が良いとは思うけれど、UltraDefragで良いのではないかと悩んでいるところ。Ubuntuを使う時間が長ければ無駄な投資になるし。

教訓としてはWindowsを使っていてパフォーマンスに問題があると思っていて、 ディスクアクセスと関連がありそうであれあメモリや高速回転なHDDと交換する前にちゃんとしたデフラグツールを使ってみるのがお勧めです。

次のセカンドPCにはDellのInspiron Mini 12 + SDDを考えていますが、 納期が長い間は様子見。
4月から次の世代のミニノートが各社から発表されていますし。 中古の値段が安くなればThinkPad x41 + SDD + 英語キーボードも趣味としては捨て難いですね。

純粋な性能比較ならDellのMini 12が良いと思うけれど、キーボードの馴染み感はいまx22が最高なので、やっぱりThinkPadの系列が良いなぁと思うわけです。
Inspiron 640mくんの英語キーボードも値段相応で満足はしていませんから。 さすがにx22だとmp3再生しながらWeb+プログラミングすると、ちょっと止まったりして不満が…。CPUがボトルネックだとさすがに新しくしないとなぁ…。

2009/01/17

Inspiron 640mのメモリを2GBx2と交換してみる

HDDに続いてメモリも交換しました。無事に3.2GBに搭載メモリが増えています。
マニュアルで合計2GBが上限とされているInspiron 640mにPATRIOTの2GB SO-DIMMモジュール(PSD22G6672S)を2つ載せてみます。

オンラインマニュアで簡単に外せそうに書いてあるヒンジカバーを外すのに30分も格闘してしまいました。難しかったのは、右側ヒンジ裏部分のツメが外れなかったところ。もし外そうとする方がいれば、ヒンジにあるLED表示部分を外して、そこからドライバで内側のツメを外す事をお勧めします。

ナゾなのはマニュアルには、「モジュール2枚、モジュールは2GBまでのものに対応、最大搭載可能メモリ2GB」となっているところ。
2GBモジュールが2枚なら4GBじゃない?って思ったんですが、32bit Vistaは認識できる論理メモリアドレスの幅が4GBまでのようだし、SP1が出るまで「システム」で表示される最大メモリを律儀にタスクマネージャーと同じ3.2GBぐらいで表示していたようなので、いろいろ混乱を防ぐために2GBを最大メモリとしたのかなぁ?、と思っています。

4GBメモリを搭載しても「3.2GB」と表示されたら「1GB近く誤魔化された?」と詐欺のように感じるかもしれないですから。でも3.2GBしかアクティブじゃないのに4GB搭載されていますっていう表示は、「ユーザーからは見えませんが、OS内部で有効活用しています」といった誤解を与えないかなぁ…。

確かに物理メモリを2GBから4GBに拡張して、実質1.2GBしか増えていないのはちょっと複雑な思いはありますが、自分の使い方からすると1.2GBでも増えた事はうれしいです。

注意点

このInspiron 640mはチップセットに945GMを使って、かろうじてAeroをサポートしています。4GBにするよりも2GB+1GBの3GBで良いと思うかもしれませんが、スピードがDualChannelでなくなるため半減し、Aeroは使えなくなるという指摘が某掲示板にありました。

元々Aeroは使っていませんでしたが、この機会に有効にしています。
ドライバは120MB前後をビデオメモリとして占有していて、動作はとても快適です。 AeroをOffにした方がシステム全体のメモリ使用量は抑えられると思いますが、動きについてはAeroを使った方が良いかもしれません。

2009/07/11追記
Aeroは遅くて使えないというほどではありませんが、 ひさしぶりにAeroをoffにした後は、キビキビと動いているように思います。 Vistaらしい雰囲気はなくなってしまうので好みでしょうか。

2008/12/13

Inspiron 640mのHDDをHGST 7K320と交換する

120GBもあったのに足りなくなったので、ThinkPadに続きInspiron 640mのHDDをオリジナルのSeagate Moments 5400.3からHGST(旧IBM)7K320な320GB HDDに交換しました。

方法はThinkPadの時と同じでSelfimageを使いDrive全体(entire disk)のコピーをしています。HDDはUSB接続ができるケースを使いました。
しかし今回はDellさんがCドライブの後ろに2GBの領域をMediaDirect用に確保していたので、サクっと削除して「ディスクの管理」からCドライブの拡張を行なっています。

XPではできなかったと思いますが、今回はCドライブとして起動してからMediaDirect用領域の削除とCドライブのボリューム拡張を行ないました。 MediaDirect用の領域を復元しようか考えましたが、使っていないので止めました。
5400rpmでも十分だけれど、さすがに7200rpmな320GBにすると起動時に違いが体感できます。 実際は元々がSATA1.5Gですから、7K320のSATA3Gな性能を活かしてはいませんが十分でしょう。
次はSSDの平均容量が500GBぐらいになったら交換かなぁ…。 さて空いた場所にDB2 Express-CやらActiveStateのPerlやらPythonやらをインストールしてみましょう。

ちなみに後日CHKDSK(ボリュームのエラーチェック)を起動時にスケジュールしたところ、全てが終るのに土曜日の夕方から深夜まで6時間程度かかっています。

2008/11/15

Thinkpad x22:CD-ROMを使わずにHDD入れ替えWindows XPの引越し

前の会社に入社した時に13万円ぐらいで買った英語版キーボードのThinkPad x22。
さすがに古くなり、ハードディスクに空きがなくなってきたので手持ちのIDE HDDの中から大容量の160GB HDDと交換してみました。 今回のテーマは次の2点です。

  • 無料で手に入るツールを使う事
  • 交換用OSをCD-ROMから起動しない事

CD-ROMで新しいHDDにOSを入れずにHDDを新しくする方法はMicrosoftのサイトでみつける事はできませんでしたが、ツールを購入したり、Knoppixを使うなどの選択肢はいろいろあるようです。 Knoppixが使えればddで起動するだけですが、余ったHDDの領域はDドライブなど他のパーティションになってしまいます。
Googleさんではこれぞという方法が見付からなかったので、Unix系OSでいうところのddコマンドを使った移行と同じ事ができないかいろいろ調べてみると、GUIを持つ"SelfImage"というツールでディスク単位でのコピーができるということがわかりました。

SelfImageのサイトに書かれている説明をみるとWindows版の"dd"コマンドでは、稼働中のディスクのコピーはできないが"SelfImage"はできると書かれています。

linuxでの"dd"コマンドと同様に"selfimage"では移行元のディスクと同容量のCドライブが作成されるという事で、余った部分はDドライブにするなどして使う必要があると調べたサイトに書かれていました。
けれどDドライブはいらないし、余った領域をCドライブに追加できないか調べてみます。 まずはGNU partedでNTFSの拡張ができるか調べたところNG。 ただしWindows XP付属する"diskpart"コマンドでNTFSの拡張操作のみは可能だという事が判明。

単純に、

  1. 160GB HDDをDドライブとして追加
  2. "selfimage"でCドライブをDドライブにVolumeコピーし再起動
  3. DOS窓で"diskpart"を実行しCドライブのVolumeを拡張+再起動
  4. その後で物理的にDドライブをCドライブに交換
"SelfImage"コマンドと"diskpart"コマンドを利用して、2-3時間程度で20GBのCドライブを、およそ145GBに拡張することができました。

注意点

気をつける事はBIOSを最新にして120GB以上のディスクを認識させる点と、ThinkPadにドッキングベイ+ウルトラベイ2000などを使って2台目のHDDを付けなければいけない点。
またMicrosoft純正の"diskpart"コマンドといえどもCドライブは拡張できないため、"selfimage"でのディスクコピー後にNTFSの拡張操作をしてから、CドライブとDドライブの物理的入れ替えを行なうという手順を守る点。

CD-ROMでKnoppixを起動して、HDD2台の内容をコピーする必要があるかと思って外付けUSB CD-ROMドライブを買わないとかなと躊躇していましたが、Dドライブをマウントするためのウルトラベイ2000を持っていたので、2台目のディスクを接続するだけで可能でした。 もう少し早くやっておけば良かったと少し後悔しました。