記憶域プールでトライブルに見舞われたので覚書2

記憶域プールでトライブルに見舞われたので覚書に続いて、またトラブルに見舞われたので覚え書きを残しておく。

物理ディスクは正常

回復性の低下のエラーが出ているが、物理ディスクセクションは全て正常という状態になった。PowerShellからステータスを確認すると記憶域スペースは確かにDegradedモードになっているが、物理ディスクは全て正常になっている。

PS C:\WINDOWS\system32> Get-VirtualDisk

FriendlyName ResiliencySettingName OperationalStatus HealthStatus IsManualAttach Size
------------ --------------------- ----------------- ------------ -------------- ----
RAID5        Parity                Degraded          Warning      False          3 TB


PS C:\WINDOWS\system32> Get-PhysicalDisk

FriendlyName       SerialNumber         CanPool OperationalStatus HealthStatus Usage            Size
------------       ------------         ------- ----------------- ------------ -----            ----
USBHDD1            0123456789ABCDEF     False   OK                Healthy      Auto-Select   1.82 TB
USBHDD2            0123456789ABCDEF     False   OK                Healthy      Auto-Select   1.82 TB
USBHDD3            00000000354340b930b5 False   OK                Healthy      Auto-Select   1.82 TB

例によってRepair-VirtualDiskは正常に終了して何も教えてくれない。物理ディスクを追加してもDegradedモードから戻らない。前回と異なりchkdsk -rで全セクタのチェックを行っても正常となる。

一見すると正常に使えているのだが、どうも管理領域が破損している物と思われる。仕方が無いので、再び前回と同じように、新たな記憶域スペースを作成してデータを移動したあと、既存の記憶域スペースを削除する事で対応することにした。

せっかく便利な機能なのだから、もうちょっとなんとかならないのだろうか。

Windows 記憶域プールは使わない方が良い

Windowsの記憶域プールは追加投資無しでRAID0~6相当のドライブを作ってデータを保護でき、 シン・プロビジョニング(後からディスクを追加して容量を増やしたりできる)にも対応している。USB3.0を使用すれば多数のドライブを接続できるし、SSDと併用して高速化もできる。設定もGUIベースで簡単にできる。良いことづくめに見えるが、私は他者に記憶域プールの使用は進めない。

管理機能の不足

Windowsの記憶域プールのGUIは管理機能を殆どで提供しない。異常が発生しても「壊れています」以上の詳細な情報はGUIでは把握できない。標準GUIで把握できない事態に陥った場合には、PowerShellというWindowsの独自言語を使ったプログラミングが必須となる。この時点で初心者はお手上げになってしまう。

復旧機能の不足

致命的なことに復旧機能がほとんど提供されていません。ディスクの異常が発生して修復に失敗してしまうと、記憶域プールに作成した仮想ディスクを破棄して作り直す以外の方法がありません。これはPowerShellを使っても同じで、Repair-VirtualDisk(自動修復を実行する)というコマンド以外に普及方法が提供されていません。
一般的なハードウェアRAIDであれば強制的にミラーを解除して再構成をすることも出来るのですが強制的に解除するコマンドは用意されていないのです。これでは上級者でもお手上げになってしまいます。

RAID1対応のNASでも安いものなら2万円を切る価格(除くHDD)で購入できることを考えると、安価なRAID対応NASを使うほうが良いでしょう。

Windows Server 2012でVB6.0のアプリケーションを動かす

Support Statement for Visual Basic 6.0 on Windows Vista, Windows Server 2008, Windows 7, Windows 8 and Windows 8.1, Windows Server 2012, and Windows 10」に互換性に関する情報があります。このページに「Supported Runtime Files to Distribute with Your Application」として動作保証されている再配布ファイルのリスト(全言語共通の物と、日本語など言語固有の物にリストが分かれています。)が公開されています。このファイルを別のフォルダにコピーしていきます。

また上記のリストではOSに付属していることになっていますが、msvbvm60.dllはWindows 2012に含まれていませんので、これもコピーします。

Visual Basic 6.0 Service Pack 6:ランタイム再頒布可能パッケージ (vbrun60sp6.exe)」をダウンロードします。ダウンロードしたVB6.0-KB290887-X86を解凍するとvbrun60sp6.exeが得られます。vbrun60sp6.exeのインストーラはCAB形式の自己解凍ファイルになっています。vbrun60sp6.exeを解凍すると、vbrun60sp6.exeがインストールするいくつかのファイルが得られます。その内の「W95INF32.DLL、W95INF16.DLL、ADVPACK.DLL」はリストに載っていませんがコピーします。

用意したランタイムファイルをWindows Server 2012の適当なフォルダ(ここではC:\VB6Runtimeとします)にコピーします。システムのPATH設定にC:\VB6Runtimeを追加したあと、拡張子がOCXの物についてはregsvr32コマンドを使用してレジストリに登録していきます。C:\Windows\System32にコピーした場合はregsvr32コマンドに失敗します。C:\Windows\System32にはランタイムを置かないで下さい。

「Supported and Shipping in Windows Vista, Windows Server 2008, Windows 7, and Windows 8」に含まれているファイルを誤って配布しないように注意してください。C:\Windows\System32を見てもmsado150.dllやmfc40.dllが が見当たりませんが、規定のインストール先がC:\Windows\SysWOW64やC:\Program Files (x86)\Common Files\System\Ole DBに移っているだけで、きちんと存在しています。無闇に導入してしまうと別の問題を引き起こす恐れがあるので、Supported and Shipping~の対象は絶対にコピーしないでください。

VB6.0のランタイムをインストールするためのフリーウェアがありますが、それらはC:\Windows\System32に複製しても問題なかった時代に設計された物がほとんどのはずです。無闇に利用するとトラブルの原因となり得ます。同じ理由で昔自作したインストーラも危険です。気をつけましょう。

Windows7のデスクトップショートカットが削除される

Windows7のコントロールパネルにある「トラブルシューティング→設定の変更」にて、コンピューターの保守が有効になっている場合、定期的にスクリプトが動作してクリック先ファイルの見つからないショートカットや、一定期間使用していないデスクトップアイコンを自動的に削除します。

Google等で検索すると、対処方法として「コントロールパネルの設定で無効にする」とか、「レジストリのLinkResolvelgnoreLinkInfo、NoResolveTrack、NoResolveSearchを無効に設定する」とか、「TS_BrokenShortcuts.ps1を編集する」といった回答がヒットします。これらは当時緊急に模索された方法です。現在は解決方法としてMicrosoftからKB2642357が提供されいてるので、この情報にしたがって対応するのがよいでしょう。

解決方法は「KB2642357 :Broken shortcuts are deleted from the desktop in Windows 7(日本語訳は機械翻訳の質がすごく悪いので英語を読んだほうがよい)」に記載されています。ここで提供されているHotFixをダウンロードしてインストールしてから、記載内容にしたがってレジストリを編集します。

インストール手順

HotFixのダウンロードURLは公開されていないので、ダウンロードボタンをクリックした後、メールアドレスを入力してCAPTCHAによる認証を行います。その後、登録したメールアドレスにダウンロードURLを記載したメールが送られてくるので、そこからダウンロードします。

ダウンロードしたファイルは自己解凍の圧縮ファイルになっているので、適当なフォルダに解凍します。 解凍したWindows6.1-KB2642357-x86.msuをダブルクリックしてインストールします。

合わせて以下のレジストリ値を作成して設定します。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ScheduledDiagnostics]
"IsBrokenShortcutsTSEnabled"=dword:00000000
"IsUnusedDesktopIconsTSEnabled"=dword:00000000

グループポリシーでの展開方法

グループポリシーから行う場合には、Windows6.1-KB2642357-x86.msuをスタートアップスクリプトでインストールします。Windows6.1-KB2642357-x86.msuを共有フォルダに配置しておき、Windows Update Standalone Installer(wusa.exe)を呼び出す次のようなBATファイルを作成します。これをグループポリシーの「コンピューターの構成→ポリシー→Windowsの設定→スクリプト」にてスタートアップスクリプトに登録します。

@ECHO OFF
SET LOGFILE=%SystemRoot%\Logs\Windows6.1-KB2642357-x86.log

IF EXIST %LOGFILE% GOTO EXIT
md %SystemRoot%\Logs
echo "Windows6.1-KB2642357-x86.msuを適用しました。" > %LOGFILE%
wusa.exe "\\adsv\share\HotFix\Windows6.1-KB2642357-x86.msu" /quiet /warnrestart

:EXIT

合わせてレジストリの設定も必要になるので、グループポリシーの「コンピューターの構成→基本設定→Windowsの設定→レジストリ」にてIsBrokenShortcutsTSEnabledとIsUnusedDesktopIconsTSEnabledを作成するように設定します。

Adobe Flashをグループポリシーで配布するには

Adobe FlashをActive Dierctoryのグループポリシーで配布する手順をメモ

1.再配布ライセンスの取得手続き

Adobe Readerの再配布にはAdobeランタイム/Reader配布許諾契約(https://distribute.adobe.com/mmform/index.cfm?name=distribution_form&pv=fp&loc=ja)が必要です。リンク先のWEBページにて手続きをしてください。手続きを終えるとメールが送られてきます。

2.インストーラーのダウンロード

送られてきたメールにインストーラのダウンロードURLが掲載されています。当該サイトからMSI形式のインストーラをダウンロードします。

3.グループポリシーに登録する

MSIファイルが確保できれば後は簡単ですね。クライアントパソコンからアクセス可能な共有フォルダにMSIファイルを配置して、グループポリシーの「コンピューターの構成→ポリシー→ソフトウェアの設定→ソフトウェアインストール」にMSIファイルを設定すれば配布できます。

Adobe Reader DCをグループポリシーで配布するには

Adobe ReaderをActive Dierctoryのグループポリシーで配布する手順をメモ

1.再配布ライセンスの取得手続き

Adobe Readerの再配布にはAdobeランタイム/Reader配布許諾契約(https://distribute.adobe.com/mmform/index.cfm?name=distribution_form&pv=fp&loc=ja)が必要です。リンク先のWEBページにて手続きをしてください。手続きを終えるとメールが送られてきます。

2.Adobe Reader DCをダウンロードします
Adobe Acrobat Reader DCの配布(http://get.adobe.com/jp/reader/enterprise/)からOSの種類や言語を選んでインストーラをダウンロードします。

3.インストーラを解凍して共有フォルダに置

Adobe Readerのインストーラは7z形式の自己解凍圧縮ファイルとして作成されています。7zを扱える解凍ツールを使うと、インストーラに含まれているファイルを解凍する事でMSIファイルを得る事ができます。

4.グループポリシーに登録する

解凍したファイルをクライアントPCから参照可能な共有フォルダに配置します。 グループポリシーの「コンピューターの構成→ポリシー→ソフトウェアの設定→ソフトウェアインストール」にMSIファイルを設定すれば配布できます。

5.インストーラ修正プログラムの配布

このままだとバージョンのAdobe Readerがインストールされるだけで、最新のパッチは適用されません。先ほど解凍したファイルに含まれているインストーラー修正プログラム(MSPファイル)もインストールする必要があります。MSPファイルはスタートアップスクリプトから起動してインストールします。

ログファイルが作成されていなければインストールされるように、次のようなバッチファイルを作成して「C:\Windows\SYSVOL\sysvol\\scripts」などに配置します。

@ECHO OFF
SET LOGFILE=%SystemRoot%\Logs\AcroRdrDCUpd1500820082.log
SET ERRFILE=%SystemRoot%\Logs\AcroRdrDCUpd1500820082.err

ECHO "ログファイルの有無でインストール状況を判定し、インストーラを起動する"
IF EXIST LOGFILE GOTO EXIT
msiexec.exe /p "\\adsv\INSTALL\AdobeReader\AcroRdrDCUpd1500820082.msp" /qn /log %ERRFILE%

IF NOT ERRORLEVEL 0 GOTO EXIT
RENAME %ERRFILE% *.log

:EXIT

グループポリシーの「コンピューターの構成→ポリシー→Windowsの設定→スクリプト」のスタートアップに作成したバッチファイルを設定すればパッチが適用されます。

Java Runtimeをグループポリシーで配布するには

JREをActive Dierctoryのグループポリシーで配布する手順をメモ

1. インストーラのダウンロード

Java SEのDownloadサイトからJREをダウンロードする。ダウンロードするファイルはオフラインインストール用の実行ファイル(jre-8u60-windows-i586.exe、jre-8u60-windows-x64.exe)をダウンロードする。配布対象が32bit OSであればjre-8u60-windows-i586.exeだけでよい。jre-8u60-windows-x64.exeに32bit版ブラウザ用のプラグイン等が含まれていないため、64bit OSに配布する場合には jre-8u60-windows-i586.exe、jre-8u60-windows-x64.exeの両方が必要になる。

2.MSIファイルを取り出す

ダウンロードした実行ファイルを起動してインストール確認画面が表示されているときに、C:\Users\ユーザー名\AppData\LocalLow\Oracle\Java\以下を参照するとMSIファイルが作成されます。このMSIファイルをコピーして、グループポリシーからのインストールに使用します。なんと、これ、公式の手順です。「Active Directory を使用する JRE の配備(http://docs.oracle.com/javase/jp/7/technotes/guides/deployment/deployment-guide/install-msi.html)

3.グループポリシーに登録する

MSIファイルが確保できれば後は簡単ですね。クライアントパソコンからアクセス可能な共有フォルダにMSIファイルを配置して、グループポリシーの「コンピューターの構成→ポリシー→ソフトウェアの設定→ソフトウェアインストール」にMSIファイルを設定すれば配布できます。
配布対象が64bit OSの場合は、32bit版のJREと、64bit版のJREの両方をインストールする必要がある事に注意してください。

Windows10のディスクアクセス負荷が高い場合の対処

Windows10が妙に重たいので調べてみた。

タスクマネージャーでパフォーマンスの項目を見ると、Cドライブのアクティブな時間がほぼ100%になっており、平均的な応答時間に数千msかかっている状態になっている。C:に使用しているHDDが低速だと、このような状態になりやすい。このような症状はCPU負荷はそれほど高くないので原因の特定が難しい。
Windows10_disk_busy

この場合、実は意外なところの設定でディスクへのアクセス負荷が大きく下がる。スタートメニューから設定→パーソナル設定→色にある「背景からアクセントカラーを選ぶ」「スタート、タスクバー、アクションセンターに色をつける」「スタート、タスクバー、アクションセンターを透明にする」のトグルスイッチをオン→オフに切り替えるとディスクアクセス負荷が驚くほど下がる。
windows10_color_config

もし古いパソコンにWindows10をインストールして使用しているのであればお試しあれ。

SymmetricDSで日本語の使えない機能

SQL Server 2000とSQL Server 2012のデータ連係(SymmetricDS)で日本語を使えると書いたが、機能しない機能も見つかってきたので覚書。

同期条件の指定(Sync On ~ Condition)

SYM_TRIGGERテーブルのSYNC_ON_UPDATE_CONDITION、 SYNC_ON_INSERT_CONDITION、 SYNC_ON_DELETE_CONDITIONには日本語カラム名を含む条件式を指定できない。SYNC_ON_~_CONDITIONは同期対象のカラムを限定する制約条件を指定する事の出来るパラメーターだが、日本語を含むカラム名をしていすると、トリガーの登録時にエラーログにカラムが見つからない旨のエラーが記録される。
これはSymmetricDSのサンプルにおいても使われている機能です。サンプルも一部動かないので気を付けよう。

SQL Server 2000からSQL Server 2012への移行

レガシーマイグレーションというほどでは無いが、古いWindows 2003 ServerをWindows 2012 Serverに移行するにあたって覚え書き。

SQL Server 2000のデータベースをSQL Server 2012でマウントする事は出来ません。SQL SerSQL Server 2005のデータベースをSQL Server 2014でマウントする事は出来ません。したがってSQL Server 2000や2005から互換性がないSQL Serverにデータを移行するには、いったんSQL Server 2008を経由する必要があります。

SQL Serverのデータフォルダ(既定では%PROGRAM FILES%¥Microsoft SQL Server¥MSSQL¥Data)にあるMDFファイルとLDFファイルをSQL Server 2008の環境にコピーします。

SQL Server 2008上でコピーしたMDFファイルとLDFファイルをアタッチしてデータベースを起動します。

互換性レベルが80(SQL Server 2000)ないし90(SQL Server 2005)になっているので、100(SQL Server 2008)に変更します。これで先ほどアタッチしたMDFファイルとLDFファイルのバージョンが上がります。

SQL Server 2008上のMDFファイルとLDFファイルを、移行先となるSQL Server 2012またはSQL Server 2014にコピーしてアタッチします。

最終移行先となるSQL Server上で再び互換性レベルを変更します。110(SQL Server 2012)または120(SQL Server 2014)に変更します。

以上でデータの移行は完了。

念のために移行後のデータベースに「DBCC CHECKDB(~)」をかける。変換時に不整合が発生したり、互換性の無い機能が含まれていて問題になることもある。もしエラーになるなら、速やかに修正する。

データのインポートおよびエクスポートウィザードを使用する方法考えられるが、SQL Server Native Clientなどでは接続できないため、OLE DB Providerやフラットファイルソースを使用する事になる。この場合テーブル自体はインポートできるが、テーブルに付属するインデックス情報や制約情報、ビュー、ストアドプロシージャなどは取込むことが出来ない。テーブルデータ以外は別途SQL文として取得して、移行先のSQL Serverで実行することになる。手間を考えるとデータベースのバイナリファイルを直接移動する方が良いと思う。