プロジェクト

全般

プロフィール

MSYS2を高速化する » 履歴 » リビジョン 2

リビジョン 1 (開発 次郎, 2025/05/06 05:04) → リビジョン 2/4 (開発 次郎, 2025/05/06 05:05)

h1. MSYS2を高速化する 

 * (出典) 
 ** https://zenn.dev/nyarla/articles/489394cec0ecb5 

 h2. はじめに 

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

 https://www.msys2.org/ 

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

 h2. そもそもなぜ 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 はかなりキビキビと動く様になります。 

 h2. MSYS2 を高速化する方法 

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

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

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

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

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

 ---- 

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

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

 とは言え、 

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

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

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

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

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

 

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

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

 <pre><code class="powershell"> ```powershell 
 New-SelfSignedCertificate -DnsName the.kalaclista.com -Type CodeSigning -CertSToreLocation Cert:\CurrentUser\My 
 </code></pre> ``` 

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

 

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

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

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

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

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

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

 ここを無償で行うためには `Visual Studio Community` が必要になるので面倒なのですが、Visual Studio のインストーラーで次のパッケージをインストールしておきます: 

 * Windows 10 SDK 
 * Windows ユニバーサル CRT 

 その上で次の様な Powershell スクリプトを用意して実行します: 

 ```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 です。 

 h3. 3. MSYS2 環境で NTFS の Symlink が使える様にする 

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

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

 から、 

 * `シンボリックリンクの作成` 

 に自分のアカウントを追加し、マシンを再起動すればユーザー権限で NTFS のシンボリックリンクが作成できる様になります。 

 ただこれだけだと MSYS2 ではシンボリックリンクが有効にならないので、`msys2.ini` などで `MSYS=winsymlinks:nativestrict` の設定を足します。 

 なおこの方法の内、 GUI でローカルセキュリティポリシーを触るのは確か Windows 10 Home だと出来なかったはず(レジストリを直接触る必要があるはず)なので、その辺りは各自で調べてください。 

 h3. 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 
 ```