Windows 10 Pro で MSYS2 を出来る限り高速化する
皆さん速は上っていますか?
はじめに
この記事は Windows 上で動く Unix-like な環境である、
を出来る限り高速化するための HowTo をまとめた記事です。
そもそもなぜ MSYS2 は遅くなるのか
私の今現在のマシン環境は、
- CPU: Ryzen 9 3950X
- Memory: 128GB
- Storage: NVMe 1TB SSD
と言う、
誰がどう考えてもこれで遅いはずはないだろー
みたいな環境なのですが、Windows 10 Pro の設定を弄らず に MSYS2 をそのままインストールしただけでは、コマンドを打つたびに何もかもワンテンポ遅れる、みたいな状態でした。そして私のマシンはどう考えても過剰なスペックを持っている訳で、これは性能がどうこう、と言う話では無いわけです。
それで色々調べた結果、MSYS2 が遅くなる要因は次の通りとなりました:
- MSYS2 がインストールされたフォルダに対してウィルススキャンが有効になっている
- MSYS2 の実行コマンドが CodeSigning されてない
- MSYS2 環境で NTFS の Symlink が使える様になっていない
- MSYS2 の設定がマズい
そのためこの三つを解決すれば、 MSYS2 はかなりキビキビと動く様になります。
MSYS2 を高速化する方法
1. MSYS2 のフォルダに対してウィルススキャンを切る
最初に言っておきますがこれはそれなりにリスクのある行為で、なんらかの攻撃者が、
MSYS2 がインストールされたフォルダではウィルススキャンを切られている
と言う前提の元に攻撃を仕掛けてこられると、その攻撃に対して脆弱になるリスクが上がります。
また個人の Windows PC ならいざ知らず、会社などの勤め先の PC などでは会社で規定されるセキュリティポリシー的にアウトになる可能性もあるので、この方法はそう言ったリスクを承知した上で使って下さい。
それでなぜ MSYS2 をインストールしたフォルダに対してウィルススキャンを無効化すると MSYS2 の速度が改善されるのか、と言うとこれは MSYS2 でファイルが作られたりなんだかんだする度に、毎回ウィルススキャンが走っているため で、この影響で恐らくはファイルの I/O の性能が劣化しているから、だと考えられます。
まぁ本当はこの手の話はベンチマーク貼れよって話なのですが、上記の要因を取り除く前にベンチマークとかを取ってなかったのと、あとそもそもどうやってベンチ取ればええねん、みたいな話もあったので、今のところはベンチマークを取っていません。
とは言え、
MSYS2 のインストール先のフォルダに対してウィルススキャンを無効にする
と言うのはファイル I/O の性能の向上にはかなり有益っぽいのは確かなので、まずはここから設定を始めた方が良いかと思います。
なお特定のフォルダ以下のウィルススキャンを無効化する方法については、それぞれが使っているセキュリティソフトウェアによっても異なってくるので、ここではそれらの方法については取り上げませんのでご了承ください。
.exe
) に対して CodeSigning する
2. MSYS2 のコマンド (正直なところこれは眉唾なのでは? と思わなくも無いんですが、とりあえずおまいじない程度に私は実行していて、そのやり方は次の通りになります。
1. まず自分のアカウントに対してオレオレ証明書を作る
これは Powershell 上で次のコマンドを実行すれば作成できます:
New-SelfSignedCertificate -DnsName the.kalaclista.com -Type CodeSigning -CertSToreLocation Cert:\CurrentUser\My
なおこの -DnsName the.kalaclista.com
のドメイン部分は各自の適切な値に書き換えてください。
2. オレオレ証明書を信頼されたルート証明機関 に移す
これは Windows 10 Pro だとコントロールパネルの ユーザー証明書の管理
アプリケーションから、
-
証明書 - 現在のユーザー
→個人
→証明書
以下にあるオレオレ証明書をコピー
-
信頼されたルート証明機関
→証明書
に貼り付け - そして念のために再起動
と言う手順で出来るはずです。
なお私は Windows 10 Pro を使っているのでこの方法が使えていますが、Windows 10 Home でこれが出来るのかは今一つ分かってません。
Visual Studio
にある signtool.exe
で自己署名する
3. ここを無償で行うためには Visual Studio Community
が必要になるので面倒なのですが、Visual Studio のインストーラーで次のパッケージをインストールしておきます:
- Windows 10 SDK
- Windows ユニバーサル CRT
その上で次の様な Powershell スクリプトを用意して実行します:
cd P:\app\MSYS2\usr\bin
gci -re *.exe | %{ &'C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe' sign /a $_.FullName }
cd P:\app\MSYS2\mingw64\bin
gci -re *.exe | %{ &'C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe' sign /a $_.FullName }
cd P:\app\MSYS2\clang64\bin
gci -re *.exe | %{ &'C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe' sign /a $_.FullName }
cd P:\app\MSYS2\mingw32\bin
gci -re *.exe | %{ &'C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86\signtool.exe' sign /a $_.FullName }
cd P:\app\MSYS2\clang32\bin
gci -re *.exe | %{ &'C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86\signtool.exe' sign /a $_.FullName }
なお上記スクリプトの P:\app\MSYS2
と C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86\signtool.exe
に関しては各自の環境に応じて書き換えてください。
そして後は MSYS2 のパッケージの追加など .exe
が書き換えられるたびに上記のスクリプトを実行すれば OK です。
3. MSYS2 環境で NTFS の Symlink が使える様にする
これは ローカルセキュリティポリシー
アプリケーションで、
-
セキュリティの設定
→ローカルポリシー
→ユーザー権利の割り当て
から、
シンボリックリンクの作成
に自分のアカウントを追加し、マシンを再起動すればユーザー権限で NTFS のシンボリックリンクが作成できる様になります。
ただこれだけだと MSYS2 ではシンボリックリンクが有効にならないので、msys2.ini
などで MSYS=winsymlinks:nativestrict
の設定を足します。
なおこの方法の内、 GUI でローカルセキュリティポリシーを触るのは確か Windows 10 Home だと出来なかったはず(レジストリを直接触る必要があるはず)なので、その辺りは各自で調べてください。
4. MSYS2 の設定を改善する
まず次の手順で /etc/passwd
と /etc/group
を生成します:
$ mkpasswd -c -l > /etc/passwd
$ mkgroup -c -l > /etc/group
次に /etc/nsswitch.conf
で passwd
と group
の記述の db
を下記の様にコメントアウトします:
passwd: files # db
group: files # db
以上
と言う事で以上が現時点(2021年2月14日)時点で私が把握している MSYS2 の高速化手順です。
まぁこれ上記をやるには面倒と言えば面倒なのですが、
MSYS2 が遅くて使いものにならねー
と言う方は、リスクも加味した上で一度試しても良いんじゃないかと思っています。
Discussion