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

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

  • 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 + α ) を手元に用意する
  • 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 をコンパイルしてインストールする

修正を施した zsh で zsh/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
  • /etc/nsswitch.conf で、passwdgroupdb をコメントアウトする

    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 による爆速化はバイナリ更新時などにバイナリを再署名する必要が有ります

nyarlaが大体

Scrapbox.io でコメントや意見を書く