はじめに・そもそもの動機
- Windows 10 Pro で UNIX-like 環境を整えられる MSYS2 は何故かコマンド実行が遅くてつらい
- MSYS2 では、
zsh/zpty
がデフォルトでは動かない為、pure
プロンプトとか使えなくてつらい - なので、その辺りなんとかしてみましょう、というのが今回の要件です
今回取り扱う事柄
- NTFS のシンボリックリンクを ユーザー権限で利用可能にし、MSYS2 でも利用する様に設定する
zsh/zpty
をとりあえず動かせる様にする (但し、いくつかの workaround が必要)- MSYS2 のコマンド類を、設定の調整と、実行ファイルの Self-CodeSiginig で高速化する
今回取り扱わない事柄
- そもそもの MSYS2 のインストールの仕方
- Windows 10 Pro のライセンスを用意するための云々
- あと、今回の作業で必要となるツール類の詳細なインストールの手順
前提となる環境
作業内容
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
は各自で修正)
- これは Windows の Powershell で次のコマンドを発行する: (なお
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 }