Windows 10のNVMeドライブ健康状態表示機能を調べてみた

# はじめに

　Microsoftは、Windows 10 build 20226の新機能として、「ストレージの健康状態を監視する機能」を追加しました<sup>[1]</sup>。

　Microsoftの記事によると、この新機能は大きくわけて2つです。

　ひとつは、NVMeドライブのハードウェアに異常が発生したときに、それをユーザにプッシュ通知する機能です。記事に掲載されている画像をみるかぎり、ポップアップメッセージ（Windows用語での"Toast"）を使用する、いわゆる「通知機能」で実現されているようです。

　もうひとつは、「設定」メニューから辿ったストレージの状態表示において、NVMeドライブのS.M.A.R.T.属性の一部を表示する機能です。この機能には、ドライブに異常が生じている場合にその事象を強調表示する機能も含まれます。

　そこで、NVMeの仕様とつきあわせながら、Windowsが上記機能を実現するために何をしているのか、を調べました。

**【注意】**この記事に記載したWindows 10の挙動はbuild 20231のものであり、今後の仕様変更によって挙動が変わる可能性があります。

# まとめ

* Windowsは、NVMe仕様で規定されたS.M.A.R.T.属性のうち**いくつか**のビットを監視して、それらの値の変化に応じて強調表示をしている
* 今回の調査では、ポップアップメッセージ(Toast)の発生を確認することはできなかった

# 調査環境

　今回の調査は、図1の環境で行いました。

![調査環境イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/6e969cde-f474-c0b2-8341-88d0801bffee.png "調査環境イメージ")
図1：調査環境イメージ

　調査対象としたWindows 10は、Flight Hub<sup>[2]</sup>においてbuild 20226以降のインストールイメージ（ISOイメージ）として最初に公開されたbuild 20231です。

　このWindows（Windows 10 Pro英語版）をQemu上のゲストOSとしてインストールし、QemuがエミュレートするNVMeドライブを接続しました。

　仮想マシンモニタ(Virtual Machine Monitor; VMM)として利用したQemuは、バージョン4.1.0をベースとして、S.M.A.R.T.属性に関する機能などを追加・改造したものです。

　このQemuによるNVMeドライブエミュレーションの内容をソースレベルで改造し、S.M.A.R.T.属性の内容を変化させてWindows 10の挙動を調査しました。

# Windowsの新機能概要

　まず、今回Windowsに追加された「ストレージの健康状態を監視する機能」の概要を説明します。

## NVMeドライブ異常発生通知

　この機能は、Windowsの「通知」機能を使用して、ポップアップメッセージによってNVMeドライブに異常が発生したことをユーザに知らせる機能です。

　この機能は、図2のような仕組みになっているのではないか、と推測しています。

![NVMeドライブ異常発生に伴ってWindowsがポップアップメッセージを表示する仕組み（推測）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/8c2369fa-7401-c88a-4c3f-367f6defbd49.png "NVMeドライブ異常発生に伴ってWindowsがポップアップメッセージを表示する仕組み（推測）")
図2：NVMeドライブ異常発生に伴ってWindowsがポップアップメッセージを表示する仕組み（推測）

　具体的には、NVMeドライブに異常が発生したときに、NVMeドライブは、Windowsホストから予め受信していた`Asynchronous Event Request` (AER)コマンドに対するレスポンスを送出し、Windowsホストはそのレスポンス受領を契機にしてポップアップメッセージを表示する、というものです。

　実際、NVMeドライブが予めWindowsホストからAERコマンドを受信していること、およびWindowsホストが`Set Features`コマンドで設定した「AERコマンドのレスポンスで受信したい事象」にS.M.A.R.T.属性に関する事象が含まれていること、を確認しています。

　しかし今回の調査において、図2の仮説に基づいてNVMeドライブからAERコマンドのレスポンスを送出してもWindows側でポップアップメッセージが出現せず、この仮説が正しいかどうかは確認できませんでした。

　一方で、NVMeドライブからWindowsにAERコマンドのレスポンスを送ったのちにすぐにWindowsから新しいAERコマンドを受信したので、送出したレスポンスはWindowsに届いていると考えられ、NVMeドライブエミュレーションの改造が不十分だったことなどが原因として考えられます。これは今後の課題です。

## NVMeドライブ健康状態表示

　この機能は、図3のようにNVMeドライブのS.M.A.R.T.属性の一部を表示する機能です。

![Windows 10のNVMeドライブ健康状態表示機能（赤枠内）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/b4bcdc55-9266-6bc5-757f-d687cba9f3ac.png "Windows 10のNVMeドライブ健康状態表示機能（赤枠内）")
図3：Windows 10のNVMeドライブ健康状態表示機能（赤枠内）

　具体的には、残寿命(Estimated remaining life)、残余剰(Available spare)、温度(Temperature)、の3つの情報が表示されています。

　また、対象のドライブに異常があるときは、図4のように、そのことが強調表示されます。

![NVMeドライブに異常がある場合に強調表示される例（赤枠内）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/ead167f3-93a5-646c-05be-1390d8863636.png "NVMeドライブに異常がある場合に強調表示される例（赤枠内）")
図4：NVMeドライブに異常がある場合に強調表示される例（赤枠内）

　これらの表示内容は、NVMe仕様におけるS.M.A.R.T.属性に基づいていると考えられます。

　実際Windowsは、このダイアログの表示を選択したときに`Get Log Page`コマンドを発行してS.M.A.R.T.属性を取得しました。

　今回の調査に必要な範囲でのNVMe仕様におけるS.M.A.R.T.属性については後述します。

# NVMe仕様におけるS.M.A.R.T.属性（一部）

　具体的な調査結果の説明のまえに、NVMe仕様におけるS.M.A.R.T.属性について、今回の調査結果の説明に必要な範囲で表1に示します。なお説明に使用するNVMe仕様のリビジョンは1.3d<sup>[3]</sup>とします。

表1：NVMe仕様におけるS.M.A.R.T.属性（一部。NVMe仕様書Figure 94から抜粋）
![NVMe仕様におけるS.M.A.R.T.属性（一部、NVMe仕様書Figure 94から抜粋）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/41c56f41-6268-e117-b9d8-b8878f440143.png "NVMe仕様におけるS.M.A.R.T.属性（一部。NVMe仕様書Figure 94から抜粋）")

　表1に示した属性のうち、Composite Temperatureがデバイスの温度（単位は絶対温度）、Available Spareが残余剰量（百分率）、Percentage Usedが正規化された寿命使用済度を示します。

　図3に表示されている3つの項目はそれぞれ、残寿命(Estimated remaining life)は100からPercentage Usedを引いたもの、残余剰(Available spare)がAvailable Spare、温度(Temperature)がComposite Temperatureの値を表示しているものと考えられます。

　そしてCritical Warningフィールドの各ビットは、NVMeドライブのコントローラがそれぞれの項目に異常を認めたときに1となります。そのCritical Warningフィールドに定義された項目は5つで、それぞれ表2のような意味をもちます。

表2：S.M.A.R.T.属性のCritical Warningフィールドの各ビットの内容と関連する属性
![S.M.A.R.T.属性のCritical Warningフィールドの各ビットの内容と関連する属性](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/3b0f2f93-6b92-3236-12be-c62361514dcd.png "S.M.A.R.T.属性のCritical Warningフィールドの各ビットの内容と関連する属性")

# WindowsのNVMeドライブ健康状態表示調査

　それでは、前節で示したS.M.A.R.T.属性を変化させながらWindowsのNVMeドライブ健康状態表示機能の動作を調査した結果を説明します。

　結論からいうと、実験の結果からは、このWindowsの機能は、S.M.A.R.T.属性のうちCritical Warningフィールドの内容のみを監視していてその他の情報は監視していないと考えられます。そのうえ、Critical Warningフィールドに規定されている要因のうち一部にしか反応しないことがわかりました。

## Critical Warningフィールドの内容と健康状態表示

### 残余剰量低下

　NVMeドライブが`Get Log Page`コマンドのレスポンスとして返すS.M.A.R.T.属性のうち、Critical Warningフィールドのビット0が1の場合、Windowsが図5のように「ドライブの残り余剰量が低下したこと」を表示することがわかりました。

![残余剰量低下状態時のWindowsの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/986d8cd4-5836-8c61-a0f6-09853dbfc6b7.png "残余剰量低下状態時のWindowsの表示")
図5：残余剰量低下状態時のWindowsの表示

　なおこの表示は、単にS.M.A.R.T.属性のAvailable Spareの値がAvailable Spare Thresholdの値を下回っているだけでは表示されず、Critical Warningフィールドのビット0が1でないと表示されないようです。

### ドライブ信頼性低下

　NVMeドライブが`Get Log Page`コマンドのレスポンスとして返すS.M.A.R.T.属性のうち、Critical Warningフィールドのビット2が1の場合、Windowsが図6のように「ドライブの信頼性が低下したこと」を表示することがわかりました。

![ドライブ信頼性低下時のWindowsの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/330aa3a6-542e-b918-e890-d2f364d57c3d.png "ドライブ信頼性低下時のWindowsの表示")
図6：ドライブ信頼性低下時のWindowsの表示

### 読み出し専用モード

　NVMeドライブが`Get Log Page`コマンドのレスポンスとして返すS.M.A.R.T.属性のうち、Critical Warningフィールドのビット3が1の場合、Windowsが図7のように「ドライブが読み出し専用モードになったこと」を表示することがわかりました。

![読み出し専用モード時のWindowsの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/2938446e-7d8d-c562-edd0-102450b8a46f.png "読み出し専用モード時のWindowsの表示")
図7：読み出し専用モード時のWindowsの表示

### その他のビット

　表1に示したとおり、NVMe仕様のS.M.A.R.T.属性のCritical Warningフィールドには、これまでに説明した3つの状態の他に、温度上昇（低下）と揮発メモリバックアップ装置の異常を示すビットがそれぞれ存在します。しかし、これらのビットを1に設定してもWindowsの表示内容が変わることはありませんでした。

　温度については、S.M.A.R.T.属性内のComposite Temperatureの値をIdentify Controllerデータ内のCritical Composite Temperature Threshold (CCTEMP)の値より大きくしても、Windowsの表示内容に変化はありませんでした（図8）。

![S.M.A.R.T.属性内の温度の値が摂氏120度でも変化しないWindowsの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/81cc17b6-84a9-2be2-51ba-7b8181a77b7a.png "S.M.A.R.T.属性内の温度の値が摂氏120度でも変化しないWindowsの表示")
図8：S.M.A.R.T.属性内の温度の値が摂氏120度でも変化しないWindowsの表示

### 同時に複数の異常が発生している場合

　ここでコーナーケースとして、同時に複数の異常が発生している場合のWindowsの表示内容を確認しました。

　これまでの調査結果から、Windowsが表示内容を変更するパターンとして「残余剰量低下」と「ドライブ信頼性低下」を選択し、Critical Warningフィールドの対応するそれぞれのビットを1にしました。

　その結果、Windowsは各要因をならべて表示することがわかりました（図9）。

![複数の異常が同時発生している場合のWindowsの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/887ccb3f-3692-a46b-7f5a-39a1bcb049b9.png "複数の異常が同時発生している場合のWindowsの表示")
図9：複数の異常が同時発生している場合のWindowsの表示

## 実験結果まとめ

　これまでに説明した、WindowsがNVMe仕様のS.M.A.R.T.属性のうちCritical Warningフィールドのどのビットに反応するのかという実験結果をまとめると表3のようになります。

表3：WindowsがCritical Warningフィールドの各ビットの値に応じて強調表示するかどうか（実験結果）
![WindowsがCritical Warningフィールドの各ビットの値に応じて強調表示するかどうか（実験結果）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/3668fdc7-281a-177d-cda5-4b1dbedddb6c.png "WindowsがCritical Warningフィールドの各ビットの値に応じて強調表示するかどうか（実験結果）")

# まとめ

　この記事では、Windows 10 build 20226にて追加された、NVMeドライブの健康状態を表示する機能について、NVMe仕様におけるS.M.A.R.T.属性との関連を調査した結果をまとめました。

　調査の結果、このWindowsの新機能が、NVMe仕様で規定されたS.M.A.R.T.属性のうちいくつかのビットを監視し、値の変化に応じてドライブの異常として強調表示していることがわかりました。

　一方、今回の調査では、ポップアップメッセージによる通知の発生を確認することはできませんでした。

　この新機能が追加されたWindowsが一般向けにリリースされるのがいつになるのかはまだわかりませんし、今後仕様が変更される可能性もありますので、ポップアップメッセージによる通知が発生する仕組みの調査を含め、今後もWindows 10開発版の新バージョンがリリースされ次第、挙動の確認を行いたいと思います。

# 【ご参考】NVMeドライブ健康状態表示方法

　これまでに説明したNVMeドライブの健康状態を表示する画面には、以下のように操作することで辿り着くことができます。なお、ここではWindows 10 Pro英語版の表記で説明します。

![NVMeドライブ健康状態表示方法（その1/3）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/39c5a6a9-f228-fd41-de06-1e250ab03220.png "NVMeドライブ健康状態表示方法（その1/3）")
図10：NVMeドライブ健康状態表示方法（その1/3）

　まずスタートメニューから"Settings"を選択し（図10 (1)）、メニューから"System"を選択します（図10 (2)）。

![NVMeドライブ健康状態表示方法（その2/3）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/a0d1f185-b4ac-14d0-37a9-10fb4f743324.png "NVMeドライブ健康状態表示方法（その2/3）")
図11：NVMeドライブ健康状態表示方法（その2/3）

　その後"Storage"を選択し（図11 (3)）、続いて"Manage Disks and Volumes"を選択します（図11 (4)）。

![NVMeドライブ健康状態表示方法（その3/3）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/5fb26844-b7b8-be80-c2b5-f1f8e7b9a715.png "NVMeドライブ健康状態表示方法（その3/3）")
図12：NVMeドライブ健康状態表示方法（その3/3）

　システムに接続されたストレージが表示されたら、情報を見たいドライブ（ボリュームではない）をクリックし（図12 (5)）、表示された "Properties"をクリックします（図12 (6)）。すると、選択したドライブの健康状態が表示されます（図12 (7)）。

　なお、情報を見たいドライブを初期化していないと"Properties"というボタンが表示されず情報が見られませんので注意が必要です。

# 参考文献
[1] Microsoft, _"[Announcing Windows 10 Insider Preview Build 20226](https://blogs.windows.com/windows-insider/2020/09/30/announcing-windows-10-insider-preview-build-20226/)"_, Retrieved October 19, 2020
[2] Microsoft, _"[Flight Hub](https://docs.microsoft.com/ja-jp/windows-insider/flight-hub/)"_, Retrieved October 19, 2020
[3] NVM Express, _"NVM Express<sup>TM</sup> Base Specification"_, Revision 1.3d March 20, 2019

# ライセンス表記
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この記事は<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際ライセンス</a>の下に提供されています。