はじめに・そもそもの動機
- 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
コマンドの後に下記のコードを挿入する:
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 による爆速化はバイナリ更新時などにバイナリを再署名する必要が有ります