俺的計算機.NET

#公園のベンチでワンカップ大関片手に集まってきた鳩に向かって説教

自宅サーバの起動ドライブが壊れてからOS入れ替えてMackerelでディスク監視するまでの話

f:id:kiai_hissatsu:20191020013621j:plain

このエントリで話してること

書いてたらやたら長くなったので要約します。

  • 記憶域プールはOSをクリーンインストールしてもちゃんと認識するよ
  • Hyper-V Server 2019とWindows10Proのワークグループ環境では、サーバマネージャーを使う時のTrustedHostsと資格情報マネージャーにNetBIOS名とFQDNのどっちも設定する必要があるよ
  • MackerelのFreeプランで簡単なディスク障害なら検知できそうだよ

自宅サーバ運用5年目にして障害

2014年にHP Microserverを購入しました。当時家庭内NASにQNAP TS-110を使ってたんですが、やっぱRAID組みたいなって思いまして。あと大阪日本橋ふぁすとばっくで実物を見かけてなにこれめっちゃかわいい欲しい好きLOVE……ってなったので。
で、届いてからESXiがオンボードRAID認識しなくて*1泣いたり、CentOSで組んだZFSが翌日吹っ飛んで泣いたり、OpenMediaValueのVirtualBoxプラグイン*2が思った以上に遅くて泣いたりして、最終的にこちらの記事を参考にHyper-V Server 2012 R2+記憶域プールでファイルサーバ+仮想基盤を構築したわけです。

無料のHyper-V Server 2012 R2でファイル共有kero3.wordpress.com

Hyper-VNASが作れて何が嬉しいって、SMB3以上が使える ってことですよ。パフォーマンスがぜんぜん違うの。ほんと違う。めっちゃ快適。

それで5年近く運用してたんですが、最近になってWindows Update後の再起動後に正常起動しないことが多くなってきました。
自動更新設定で概ね毎月第2水曜の数日後くらいに現象が出てたので、いやだなーこわいなーいやだなーこわいなーと脳内稲川淳二が遠回しに警告してきていたんですが、忙しさにかまけてつい電源ボタン長押しというその場しのぎをしておりました。

で、先日とうとう起動しなくなっちゃいました。

起動ドライブのディスク障害

ディスプレイを繋いで起動シーケンスを見守っていたら、無慈悲にもPXE BootがDHCPサーバを探しにいっておりました。要は起動ドライブの障害です。HDDの異音は聞こえませんでしたが、多分MBRあたりのセクタエラーでしょう。

で、起動ドライブを交換しました。WDのHDD160GBだったんですが、せっかくなのでSSD化します。手持ちで余ってたのはノートから抜いた128GB。

Microserverには3.5インチのストレージスロット✕4本とと5インチベイ✕1本を備えています。ストレージスロットは2TB以上のHDDで埋めて記憶域プールとして使い切ることにし*3、5インチベイに3.5インチドライブ用のブラケットを使って起動ドライブとしていました。今考えるとこの構造は振動を生みやすいのでHDDの寿命を縮めてしまったのかもしれません。

復元ではなく再構築へ

で、5インチベイのスペースにSSDを無造作に置いて接続しましたが、問題は中身です。

一応Hyper-V Server 2012 R2で構築した当時のWindows Backupイメージは残ってたんですが、今回このイメージは使えません。160GBのHDDから128GBのSSD、つまり小さいディスクへの移行はWindows Backupでは対応していないためです。

もともとHyper-V Server 2012 R2はメインストリームサポートが2018/01/09で終了して延長サポートフェーズにありますし、Hyper-V Server 2019へのアップグレードを行おうにもそもそもインプレースアップグレードできない仕様なので、この際クリーンインストールすることにしました。再構築といっても単一のHyper-V Serverホストには大した設定項目もありませんので、まぁ楽勝です。

記憶域プールの引き継ぎ

OS側はクリーンインストールするとして、問題は記憶域プールです。OSを初期化した場合、記憶域プールの構成がどうなるのか。構成情報が無くなったら中のデータが消失するのでやばいですね。

結論から言うと問題ありません。記憶域プールの構造はOS側ではなく、記憶域プールを構成しているディスク(プールディスク)側で保持しており、記憶域プールをサポートしたOSで自動的に認識します。つまりちゃんと引き継げるわけですね。よかったよかった。

satsumahomeserver.com

これ、ある意味チップに依存するハードウェアRAIDよりも耐障害性が高いかもしれません。まぁパリティ計算遅いんですけども。
なお、OSをインストールした直後の認識では OperationalStatusRead-only になるケースがあるみたいですが、俺の環境では最初から正常認識されてました( FriendlyNamechihiro のもの)。

PS C:\> Get-StoragePool

FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly    Size AllocatedSize
------------ ----------------- ------------ ------------ ----------    ---- -------------
chihiro      OK                Healthy      False        False      8.64 TB       5.45 TB
Primordial   OK                Healthy      True         False      8.76 TB       8.64 TB

www.kondoah.com

ただし、OSクリーンインストールすると当然ながらユーザのSIDが新規になるので、中に入っているファイルのNTFSアクセス権は再設定する必要があります。

資格情報の運用について

自宅サーバなのでWindowsネットワークはActiveDirectoryではなくワークグループ環境なんですが、どうやら最近のWindows Serverはワークグループ環境下でRSATで管理する場合*4、WinRMの TrustedHosts で信頼するホストにNetBIOS名とFQDNのどっちも登録する必要があるようです。

例えばホスト名が morinaka の場合、 morinakamorinaka.local の両方になります。

PS C:\Windows\system32> Get-Item WSMan:\localhost\Client\TrustedHosts


   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client

Type            Name                           SourceOfValue   Value
----            ----                           -------------   -----
System.String   TrustedHosts                                   morinaka,morinaka.local

TrustedHostsへの登録はPowerShellで設定する場合とwinrmコマンドを使う場合のどちらでもOKです。

PowerShellで設定する場合

Set-Item WSMan:\localhost\Client\TrustedHosts "morinaka,morinaka.local" -Concatenate -Force

winrmコマンドで設定する場合

winrm set winrm/config/client '@{TrustedHosts=”morinaka, morinaka.local″}'

ちなみに、最近のWindows10ではwinrmコマンドの記述が厳密化され、@(アットマーク)と最後のシングルコーテーションが必須になったようです。地味にハマりました。

また、同様に資格情報にも同じようにNetBIOS名とFQDNの両方の登録が必要です。

f:id:kiai_hissatsu:20191019231434p:plain
資格情報マネージャーの画面

cmdkeyでも確認できます。

PS C:\Windows\system32> cmdkey /list:morinaka*

morinaka* のために現在保存されている資格情報:

    ターゲット: morinaka
    種類: ドメイン パスワード
    ユーザー: morinaka\yousuke

    ターゲット: morinaka.local
    種類: ドメイン パスワード
    ユーザー: morinaka\yousuke

FQDNはサーバーマネージャーそのものへの追加とHyper-Vマネージャ、NetBIOS名は共有サービスやコンピュータの管理(リモートサーバ)で使うようです。ローカルDNSがあるActiveDirectory環境ならこんなことは無さそうですが。

今後に備えたMackerel監視

さてOSのクリーンインストールも完了し、記憶域プールも無事認識し、管理できるようになりました。それはいいんですが、このまま放置しているとまたOSが吹っ飛ぶようなディスク障害が発生して脳内稲川淳二が騒ぎそうなので、ちゃんと監視するようにしましょう。
ですが、さすがに我が家にはZabbixサーバなんていう大層なものはないので、素直にMackerelを使うことにしました。MackerelのエージェントはGoで書かれていてWindows用のバイナリも用意されています。いぇーい便利。

mackerel.io

ただし、デフォルトで取れるのは死活監視とパフォーマンス関連のメトリックくらいです。ディスク障害の検知にはちょっと工夫が必要になります。

Windowsのディスク監視にはいろいろ方法はありますが、メジャーな手段であるCrystalDiskInfoのS.M.A.R.T.監視はCLI環境しかないHyper-V Serverでは使えません。代わりにWindowsイベントログで監視します。
幸い、MackerelのWindowsエージェントにはWindowsイベントログ監視プラグインが最初から入っています。あとはアラートを飛ばす対象イベントを書いてあげればよいわけです。 dev.classmethod.jp こちらの記事を参考に、mackerel-agent.conf にこんな設定を組み込みます。

# DiskError detection 2019/10/15 Yousuke
# https://dev.classmethod.jp/etc/mackerel-windows-eventlog/

[plugin.checks.DiskError-Physical]
command = ["check-windows-eventlog", "--log", "System", "--type", "Error", "--source-pattern", "Disk", "--event-id-pattern", "11"]
prevent_alert_auto_close = true

[plugin.checks.DiskError-NTFS]
command = ["check-windows-eventlog", "--log", "System", "--type", "Error", "--source-pattern", "NTFS", "--event-id-pattern", "55"]
prevent_alert_auto_close = true

DiskError-Physical はディスクの物理破損の検知が目的です。

blogs.msdn.microsoft.com

DiskError-NTFSNTFSの論理障害(ファイルシステムエラー)の検知が目的です。

blogs.technet.microsoft.com

テストイベントも書き込んでみます。

Write-EventLog -LogName System -Source "Disk" -EntryType Error -EventID 11 -message "TestEvent"

f:id:kiai_hissatsu:20191020011647p:plain
イベントビューアで見たテストイベント

Mackerelにもちゃんと飛んできました。メールも送られています。

f:id:kiai_hissatsu:20191020011538p:plain
Mackerel Alert画面
f:id:kiai_hissatsu:20191020011825p:plain
Mackerelからのメール通知

これらイベントが発生したからといって直ちにディスク交換やchkdskが必要というわけではないので、例えば「24時間以内に5回発生したら通知する」などの設定する必要があるでしょう。
ただ、MackerelのFreeプランで使えるホストメトリック監視では、こういった追加メトリックを対象にすることはできないようです。まぁ自宅サーバですし、当面はメールが何通も来てたら対応する、くらいの体制でいいでしょう。

Mackerelで記憶域プールの監視はできない

上記の設定は主に起動ドライブに対する監視ですが、記憶域プール側のHDD監視もやっておきたいところです。

satsumahomeserver.com

記憶域プールのイベントログは Microsoft-Windows-StorageSpaces-Driver/Operational のようです。
これを参考に、とりあえずこんな記述を mackerel-agent.conf に追記します。

# DiskError detection 2019/10/20 Yousuke
# https://satsumahomeserver.com/blog/7885

[plugin.checks.StorageSpaces-Driver]
command = ["check-windows-eventlog", "--log", "Microsoft-Windows-StorageSpaces-Driver/Operational", "--type", "Error"]

ただ、MackerelのWindowsイベントログ監視プラグインではアプリケーションログ・セキュリティログ・システムログの3つのみが対象となっており、それ以外のイベントログは対応していないようです。
実際にこの設定を組み込んでmackerelサービスの再起動後、テストイベントを書き込んでみたのですが、Mackerelには通知は届きませんでした。

f:id:kiai_hissatsu:20191020010928p:plain
StorageSpaces-Driver/Operationalへのテストイベント

おそらくStandardプランにすれば式による監視が使えると思いますが、自宅サーバですし今回は諦めましょう。

以上、自宅サーバで起きたトラブルでいろいろ知見が得られたので書きました。

*1:サポートマトリクスちゃんと見てない俺が悪いんですが。

*2:当時は艦これプレイサーバとして24時間でブラウザ立ち上げっぱなしにできる仮想PCがほしかったんです。主に朝のデイリー遠征クエスト受注と演習。

*3:4本中3本で構成し、1本はホットスペアとして待機させてます。

*4:RSATでHyper-V Server 2019を管理するPCはWIndows10 Proが必要です。