【Win10IoT】UWF環境下でファイルの書き込みを極力なくしたい

# はじめに
組み込み向けの「Windows 10 IoT」で、物理ストレージへの書き込みを抑制する「Unified Write Filter」(UWF)を設定したとき、動作中に発生した書き込みは全てメモリに退避される。
そのため、たくさん書き込みが発生するとメモリ不足に陥って・・・死を迎える・・・

困ったことに、UWFを有効にしたからと言って、OS自体は殆ど普通のWindowsが動くので、なにも調整しないと書き込みがじゃんじゃん発生して酷いことになる。
特に、ネットワークが繋がっていると、更新ファイルなどを勝手にダウンロードされたり、起動して数分で空きメモリが 0 になることも・・・

https://learn.microsoft.com/ja-jp/windows/iot/iot-enterprise/customize/uwf-overlaygetoverlayfiles

UWF有効時に、メモリ上に存在するファイルを取得する方法を見つけたので、書き込まれたファイルから要因を調べて色々と動作を止めることで、かなり消費量が減らせたので何を止めたかのメモ。
また、自動化を前提としているので、バッチファイルで使うことを想定。
**強引に止めてる部分もあって何か問題があるかもしれないので要注意！**

Win10IoT系の情報ってあんまり見かけないし需要ないかな・・・

(Windows 10 IoT Enterprise バージョン1809)

# Windows Update/ストアアプリ更新の無効化
```bat
sc.exe config wuauserv start=disabled
sc.exe stop wuauserv
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DoNotConnectToWindowsUpdateInternetLocations /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DisableWindowsUpdateAccess /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUServer /t REG_SZ /d " " /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUStatusServer /t REG_SZ /d " " /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v UpdateServiceUrlAlternate /t REG_SZ /d " " /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v UseWUServer /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v NoAutoUpdate /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v AUOptions /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" /v AutoDownload /t REG_DWORD /d 5 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\WindowsStore" /v DisableStoreApps /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\WindowsStore" /v AutoDownload /t REG_DWORD /d 2 /f
```
真っ先に思い付く要因の1つ。
調べてみると、色んな止め方が載ってて正解がどれか分からなかった。
とりあえずこれで止まるっぽい。

# Microsoft Edgeの自動更新停止
```bat
REG ADD "HKLM\System\CurrentControlSet\Services\edgeupdate" /v Start /t REG_DWORD /d 4 /f
REG ADD "HKLM\System\CurrentControlSet\Services\edgeupdatem" /v Start /t REG_DWORD /d 4 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\EdgeUpdate" /v UpdateDefault /t REG_DWORD /d 0 /f
```
ファイル列挙するまで、こいつのアップデートが入ってるとは思いもよらず・・・
結構な大きさだった。

# イベントログ停止
```bat
REG ADD "HKLM\System\CurrentControlSet\Services\EventLog" /v Start /t REG_DWORD /d 4 /f
```
Windows的に止めて良いのか微妙だけど、UWF環境下では間違いなく無意味なので、サービスを強制無効化。

# タスクスケジューラ停止
```bat
REG ADD "HKLM\System\CurrentControlSet\Services\Schedule" /v Start /t REG_DWORD /d 4 /f
```
これまたWindows的に止めて良いのか微妙だけど、タスクを選んで無効化するのも面倒だから、まとめて強引に停止。

# Delivery Optimization無効
```bat
REG ADD "HKLM\System\CurrentControlSet\Services\DoSvc" /v Start /t REG_DWORD /d 4 /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" /v DODownloadMode /t REG_DWORD /d 0 /f
```
更新ファイルを周りの端末に配信したりするための機能らしい。
これもそこそこなサイズだった。
設定だけでも止まりそうだけど、念のためサービスも停止。

# Windows Defenderのリアルタイム保護を無効
```bat
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableRealtimeMonitoring /t REG_DWORD /d 1 /f
```
できれば、Windows Defenderを丸ごと無効化して、関連の書き込みを全て無くしてしまいたかったけど、何年か前のアップデートで「無効化設定」が無効化されたようで・・・
`C:\ProgramData\Microsoft\Windows Defender\Scans`
の書き込みが結構な量だったから抑制したくて、とりあえずリアルタイム保護を無効化。
とりあえず書き込みは減ったけど、それが無効化したからなのか、単に最新の状態で更新が無いからなのか不明。。

# 診断とか検索とか細々としたサービスを停止
```bat
REM データ使用状況サービス無効
REG ADD "HKLM\System\CurrentControlSet\Services\DusmSvc" /v Start /t REG_DWORD /d 4 /f
REM Windows Search無効
REG ADD "HKLM\System\CurrentControlSet\Services\WSearch" /v Start /t REG_DWORD /d 4 /f
REM Diagnostic Policy Service無効
sc.exe config DPS start=disabled
sc.exe config WdiServiceHost start=disabled
sc.exe config WdiSystemHost start=disabled
```
細々と書き込みが発生しているっぽくて、どれも組み込みには不要なので停止。

# WDI？を強引に無効化
```bat
icacls C:\Windows\System32\WDI\LogFiles /remove:g SYSTEM
icacls C:\Windows\System32\WDI /remove:g SYSTEM
icacls C:\Windows\System32\WDI\LogFiles /deny SYSTEM:(OI)(CI)F
icacls C:\Windows\System32\WDI /deny SYSTEM:(OI)(CI)F
```
スタートアップのパフォーマンスとかの情報を記録してるらしい。
止める手段が見当たらず、「対象のフォルダの権限設定からSYSTEMを拒否すれば良い」という強引すぎる情報を見つけて、試してみたら確かに書き込みは無くなったのでヨシ（？）

https://www.sevenforums.com/performance-maintenance/234620-how-disable-creation-bootckcl-etl.html

### 2023/10/3追記
レジストリでも無効化できた。
`HKLM\SYSTEM\CurrentControlSet\Control\Diagnostics\Performance`
に `DisableDiagnosticTracing` という名前の値を作成して `1` を設定。
`KKLM\SYSTEM\CurrentControlSet\Control\Diagnostics\Performance\BootCKCLSettings`
`KKLM\SYSTEM\CurrentControlSet\Control\Diagnostics\Performance\SecondaryLogonCKCLSettings`
`KKLM\SYSTEM\CurrentControlSet\Control\Diagnostics\Performance\ShutdownCKCLSettings`
それぞれのキーに存在する `Start` を `0` に変更。

キーの所有者の問題でバッチファイルから変更が難しいので、自動化する場合は↓を参考にPowerShellでどうぞ。

https://qiita.com/mitsu_at3/items/479e5fb4196e957dee12

# 自動メンテナンスを無効化（2023/10/3追記）
```bat
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\Maintenance" /v MaintenanceDisabled /t REG_DWORD /d 1 /f
```
深夜２時に使用量が急増していたので、恐らくこれだろうってことで設定。
タスクスケジューラを止めてるから意味ないような気も・・・？

# パフォーマンスカウンタ無効化（2023/10/3追記）
```bat
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib" /v "Disable Performance Counters" /t REG_DWORD /d 1 /f
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\PerfProc\Performance" /v "Disable Performance Counters" /t REG_DWORD /d 1 /f
```
設定が効いてるか微妙・・・
`C:\Windows\System32\perfc009.dat`
`C:\Windows\System32\perfc011.dat`
`C:\Windows\System32\perfh009.dat`
`C:\Windows\System32\perfh011.dat`
毎回これらのファイルが生成されるけど、増加はしてなさそうだから効いてる？

# 細々としたものをさらに停止（2023/10/3追記）
```bat
REM Update Orchestrator Service無効
sc.exe config UsoSvc start=disabled
REM Windows Font Cache Service無効
sc.exe config FontCache start=disabled
```
`UsoSvc`はWindows Update系のサービスらしく、`C:\ProgramData\USOShared`の下で増加するログらしきものを止めたくて停止。
`FontCache`も思いのほか増加傾向にあったので停止。

# WMIのAutoLoggerを停止（2023/10/3追記）
`HKLM\SYSTEM\CurrentControlSet\Control\WMI\Autologger`
の各サブキーの中に存在する `Start` を片っ端から `0` に変更。

このとき、`DefenderApiLogger`と`DefenderAuditLogger` は、Windows Defender関連の設定で、値を変えるだけだと勝手に元に戻されてしまうので、
サブキーのアクセス権限を編集して `SYSTEM` ユーザに対して「拒否」を設定しておくことで回避。

ちなみに自動化するには、PowerShell等でゴリゴリ頑張るしかない・・・（大変だった・・・）

# AutoLogger-Diagtrack-Listener.etl書き込み拒否（2023/10/3追記）
↑のAutoLogger停止だけで止まるかと思ったら止まりきらなかったので、ファイルのアクセス権限を変えて強引に止めた。
`C:\Windows\System32\LogFiles\WMI\AutoLogger-Diagtrack-Listener.etl`
の `SYSTEM` ユーザのアクセスを拒否に変更。

# SleepStudy書き込み拒否（2023/10/3追記）
電源周りの学習機能っぽくて不要なのに止め方が分からなかったのでフォルダの書き込みを拒否することで対応。
`C:\Windows\System32\SleepStudy`
に設定されている `Power` ユーザと `DPS` ユーザの書き込みを拒否。

# おわりに

ここまで設定することで、起動して数分で100MB超のメモリを喰うようなことはなくなり、10MBくらいから始まり、時間を掛けて微増していく動作になった。
これで数日程度の連続稼働は耐えられるはず・・・
まだまだ細かい書き込みが稀に発生していたり、NTFS由来の書き込みもあったり、完全に書き込みを無くすことは難しそう。。

### 2023/10/3追記
長時間の増加量を見てるとまだまだ酷かったので、さらに追記分の対応を行った。
それによって丸２日間連続稼働させてもメモリ使用量が50MB程度まで抑えられるようになった。
しかし、停止することが許されないWindows Defenderや、下手に触れない WinSxS 関係など、完全に書き込みを無くすことはできないのが辛い・・・

あと、セットアップ後、UWF無効のまま何も動かしていないアイドル状態で３０分～１時間ほど放置しておくことで、裏で動いている処理が落ち着いて、UWFを有効にしたときの起動後の書き込み量を抑えられる傾向がありそう。