🌀

Windows 10 Pro で MSYS2 を出来る限り高速化する

2021/02/14に公開

皆さん速は上っていますか?

はじめに

この記事は Windows 上で動く Unix-like な環境である、

https://www.msys2.org/

を出来る限り高速化するための HowTo をまとめた記事です。

そもそもなぜ MSYS2 は遅くなるのか

私の今現在のマシン環境は、

  • CPU: Ryzen 9 3950X
  • Memory: 128GB
  • Storage: NVMe 1TB SSD

と言う、

誰がどう考えてもこれで遅いはずはないだろー

みたいな環境なのですが、Windows 10 Pro の設定を弄らず に MSYS2 をそのままインストールしただけでは、コマンドを打つたびに何もかもワンテンポ遅れる、みたいな状態でした。そして私のマシンはどう考えても過剰なスペックを持っている訳で、これは性能がどうこう、と言う話では無いわけです。

それで色々調べた結果、MSYS2 が遅くなる要因は次の通りとなりました:

  1. MSYS2 がインストールされたフォルダに対してウィルススキャンが有効になっている
  2. MSYS2 の実行コマンドが CodeSigning されてない
  3. MSYS2 環境で NTFS の Symlink が使える様になっていない
  4. MSYS2 の設定がマズい

そのためこの三つを解決すれば、 MSYS2 はかなりキビキビと動く様になります。

MSYS2 を高速化する方法

1. MSYS2 のフォルダに対してウィルススキャンを切る

最初に言っておきますがこれはそれなりにリスクのある行為で、なんらかの攻撃者が、

MSYS2 がインストールされたフォルダではウィルススキャンを切られている

と言う前提の元に攻撃を仕掛けてこられると、その攻撃に対して脆弱になるリスクが上がります。

また個人の Windows PC ならいざ知らず、会社などの勤め先の PC などでは会社で規定されるセキュリティポリシー的にアウトになる可能性もあるので、この方法はそう言ったリスクを承知した上で使って下さい。


それでなぜ MSYS2 をインストールしたフォルダに対してウィルススキャンを無効化すると MSYS2 の速度が改善されるのか、と言うとこれは MSYS2 でファイルが作られたりなんだかんだする度に、毎回ウィルススキャンが走っているため で、この影響で恐らくはファイルの I/O の性能が劣化しているから、だと考えられます。

まぁ本当はこの手の話はベンチマーク貼れよって話なのですが、上記の要因を取り除く前にベンチマークとかを取ってなかったのと、あとそもそもどうやってベンチ取ればええねん、みたいな話もあったので、今のところはベンチマークを取っていません。

とは言え、

MSYS2 のインストール先のフォルダに対してウィルススキャンを無効にする

と言うのはファイル I/O の性能の向上にはかなり有益っぽいのは確かなので、まずはここから設定を始めた方が良いかと思います。

なお特定のフォルダ以下のウィルススキャンを無効化する方法については、それぞれが使っているセキュリティソフトウェアによっても異なってくるので、ここではそれらの方法については取り上げませんのでご了承ください。

2. MSYS2 のコマンド (.exe) に対して CodeSigning する

正直なところこれは眉唾なのでは? と思わなくも無いんですが、とりあえずおまいじない程度に私は実行していて、そのやり方は次の通りになります。

1. まず自分のアカウントに対してオレオレ証明書を作る

これは Powershell 上で次のコマンドを実行すれば作成できます:

New-SelfSignedCertificate -DnsName the.kalaclista.com -Type CodeSigning -CertSToreLocation Cert:\CurrentUser\My

なおこの -DnsName the.kalaclista.com のドメイン部分は各自の適切な値に書き換えてください。

2. オレオレ証明書を信頼されたルート証明機関 に移す

これは Windows 10 Pro だとコントロールパネルの ユーザー証明書の管理 アプリケーションから、

  1. 証明書 - 現在のユーザー個人証明書 以下にあるオレオレ証明書を コピー
  2. 信頼されたルート証明機関証明書 に貼り付け
  3. そして念のために再起動

と言う手順で出来るはずです。

なお私は Windows 10 Pro を使っているのでこの方法が使えていますが、Windows 10 Home でこれが出来るのかは今一つ分かってません。

3. Visual Studio にある signtool.exe で自己署名する

ここを無償で行うためには 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\MSYS2C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86\signtool.exe に関しては各自の環境に応じて書き換えてください。

そして後は MSYS2 のパッケージの追加など .exe が書き換えられるたびに上記のスクリプトを実行すれば OK です。

これは ローカルセキュリティポリシー アプリケーションで、

  • セキュリティの設定ローカルポリシーユーザー権利の割り当て

から、

  • シンボリックリンクの作成

に自分のアカウントを追加し、マシンを再起動すればユーザー権限で 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.confpasswdgroup の記述の db を下記の様にコメントアウトします:

passwd: files # db
group: files # db

以上

と言う事で以上が現時点(2021年2月14日)時点で私が把握している MSYS2 の高速化手順です。

まぁこれ上記をやるには面倒と言えば面倒なのですが、

MSYS2 が遅くて使いものにならねー

と言う方は、リスクも加味した上で一度試しても良いんじゃないかと思っています。

Discussion