カラクリスタ

「輝かしい青春」なんて失かった人のブログ

Windows 10 Pro で MSYS2 (MinGW64) を超快適にする方法

はじめに・そもそもの動機

  • Windows 10 ProUNIX-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 + α ) を手元に用意する
  • PKGBUILDprepare セクションで、一連の 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コンパイルしてインストールする

修正を施した zshzsh/zpty が正しく終了しないコトへの workaround

  • 上記の修正を施した zsh では、一応 zsh/zpty が使える様にはなるが、実は zsh/zptyを上手く終了できない不具合がある
  • そのため、tmuxzshexit をすると、途中でハングしてしまい、プロセスを終了出来ない、という事が起きる
  • よって、その辺りに対処するため、具体的には下記の様な 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
passwd: files # db
group: files # db

実行ファイルを Self-CodeSigning で高速化する

  • まず、Self-CodeSigning 用の自己証明署名を作成する
    • これは WindowsPowershell で次のコマンドを発行する: (なお nyarla.contoso.com は各自で修正)
New-SelfSignedCertificate -DnsName nyarla.contoso.com -Type CodeSigning -CertSToreLocation Cert:\CurrentUser\My
  • そして、先程作成した自己証明署名を ユーザー証明書の管理 から 信頼されたルート証明機関 にコピーする
  • 次に、 Visual Studio Community をインストールし、インストーラーで下記のパッケージを追加:
  • 最後に 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 で爆速になる理由は WindowsAppLocker と言う機能が影響するらしいです
  • CodeSigning による爆速化はバイナリ更新時などにバイナリを再署名する必要が有ります