Windows 10 Pro で MSYS2 (MinGW64) を超快適にする方法
読了まで:約4分
はじめに・そもそもの動機
- Windows 10 Pro で
UNIX-like 環境を 整えられる MSYS2 は 何故か コマンド実行が 遅くて つらい - MSYS2 では、
zsh/zpty
が デフォルトでは 動かない為、 pure
プロンプトとか 使えなくて つらい - なので、
その 辺りなんとか してみましょう、と いうのが 今回の 要件です
今回取り扱う事柄
- NTFS の
シンボリックリンクを ユーザー権限で 利用可能にし、 MSYS2 でも 利用する 様に 設定する zsh/zpty
をとり あえず 動かせる 様に する (但し、 いく つかの workaround が 必要) - MSYS2 の
コマンド類を、 設定の 調整と、 実行ファイルの Self-CodeSiginig で 高速化する
今回取り扱わない事柄
- そもそもの
MSYS2 の インストールの 仕方 - Windows 10 Pro の
ライセンスを 用意する ための 云々 - あと、
今回の 作業で 必要となる ツール類の 詳細な インストールの 手順
前提となる環境
- Windows 10 Pro 相当の
Windows 10 環境が ある コト - MSYS2 64 bit が
インストールされている コト - 今回の
作業を 実行可能な 管理者権限を 持っている コト
作業内容
NTFS シンボリックリンクをユーザー権限利用を有効化する
Windows 10 Pro 環境での設定
- ローカルセキュリティポリシー の
アプリを 開く - セキュリティの
設定 → ローカルポリシー → ユーザー権利の割り当て から、 シンボリックリンクの 作成 を探す - シンボリックリンクの
作成 をダブルクリックで プロパティを 開き、 自分の アカウントを 追加する
MSYS2 側の設定
MSYS2 の
起動時の 環境変数で、 MSYS=winsymlinks:nativestrict
と する ちなみに、
MSYS2.exe
などを 使う 場合には、 ランチャーと 同名の ini
ファイル (この場合だと MSYS2.ini
) に記載する そして、
MSYS2 の 環境から、 シンボリックリンクが 作成出来る 事を 確認する zsh/zpty を
とり あえず MSYS2 環境 使える 様に する (但しいく つかの 制約が 有り)
MSYS2 側での作業
- MSYS2 の
zsh
のパッケージ定義一式 ( PKGBUILD
+ α ) を手元に 用意する PKGBUILD
のprepare
セクションで、一連の patch
コマンドの後に 下記の コードを 挿入する :
# workaround for working zsh/zpty.c on msys2
sed -i 's!int ptsname();!int ptsname(); int main() {}!' "${srcdir}/${pkgbase}-${pkgver}/configure.ac"
sed -i 's!__CYGWIN__!__MSYS__!g' "${srcdir}/${pkgbase}-${pkgver}/Src/Modules/zpty.c"
- 最後に、
修正した パッケージ定義で zsh
をコンパイルして インストールする
修正を施した zsh で zsh/zpty が正しく終了しないコトへの workaround
- 上記の
修正を 施した zsh
では、一応 zsh/zpty
が使える 様には なるが、 実は zsh/zpty
を上手く 終了できない 不具合が ある - そのため、
tmux
や zsh
でexit
をすると、 途中で ハングしてしまい、 プロセスを 終了出来ない、と いう 事が 起きる - よって、
その 辺りに 対処する ため、 具体的には 下記の 様な Workaround の ための コードを、 .zshrc
などに追記する :
if [[ "$(uname -s)" =~ .*_NT-.* ]]; then
alias exit="sh -c \"cmd /C 'taskkill /F /T /PID $(cat /proc/$$/winpid)'\""
trap 'sh -c "cmd /C \"taskkill /F /T /PID $(cat /proc/$$/winpid)\"' 1 3 15
fi
- な
お、 これは exit
や、それに 相当する SIGNAL が 送られた 際に、 Windows 側で taskkill すると 言う workaround です
MSYS2 のコマンド類を、設定の調整と、実行ファイルの Self-CodeSiginig で高速化する
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
実行ファイルを Self-CodeSigning で高速化する
- まず、
Self-CodeSigning 用の 自己証明署名を 作成する - これは
Windows の Powershell で 次の コマンドを 発行する : (な お nyarla.contoso.com
は各自で 修正)
- これは
New-SelfSignedCertificate -DnsName nyarla.contoso.com -Type CodeSigning -CertSToreLocation Cert:\CurrentUser\My
- そして、
先程作成した 自己証明署名を ユーザー証明書の 管理 から信頼された ルート証明機関 にコピーする - 次に、
Visual Studio Community を インストールし、 インストーラーで 下記の パッケージを 追加: - Windows 10 SDK
- Windows ユニバーサル CRT
- 最後に
PowerShell で、 msys2 の 実行ファイルに CodeSigning する : (な お、 パスは 各自読み替える 事)
cd C:\msys64\usr\bin
gci -re *.exe | %{ &'C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x64\signtool.exe' si
gn /a $_.FullName }
以上
- 特に
CodeSigning の 設定を 行なった 所 zsh → tmux → zsh の 起動時の 流れが 爆速に なりました - CodeSigning で
爆速になる 理由は Windows の AppLocker と 言う 機能が 影響するらしいです - CodeSigning に
よる 爆速化は バイナリ更新時などに バイナリを 再署名する 必要が 有ります