MSYS2 on Windows 10 Pro 構築記

MSYS2 環境を構築しました。環境は Windows 10 Pro になります。
構築時のメモとして記載しましたが、皆様のご参考になれば幸いです。設定の内容によっては Windows の重要な設定を編集する場合があります。もし実施をされる場合、必ず設定内容を公式ドキュメントなどを確認の上、自己責任でお願いします。

勝手や作法を知る

Cygwin や MSYS2 とは何? ということは書きませんが、MSYS2 を使うにおいては、以下の点が結構な違いだなと思いました。

  • スタートメニューに登録されるのは C:\msys64\msys2_shell.cmd となる。デフォルトでは、これを実行することで MSYS2 環境が動く。

    • msys2_shell.cmd の実体は Windows バッチスクリプトファイル。

    • msys2_shell.cmd とは別に存在する、Launcher と呼ばれる C:\msys64\msys2_shell.exe から MSYS2 が実行された場合、同ディレクトリ内の msys2.ini の設定内容が反映される。

    • msys2_shell.cmd から MSYS2 を実行する場合、 SHELL などの設定は msys2_shell.cmd 内に直接書く必要がある。

    • Lancher の msys2_shell.exe から MSYS2 を実行した方が msys2.ini を git などで管理しやすいので、そちらがオススメかと思われる。

  • パッケージ管理は Arch Linux でお馴染みの Pacman を使用する。

  • C ドライブなど Windows のパーティションは `/` (root) 直下にマウントされる。

  • ln などシンボリックリンクを張るコマンドは Windows の mklink 同様、 Windows の機能を使用する。

    • Cygwin の場合、内部の独自実装となっており Windows 側に依存しない。Windows OS の Explorer で見ると、Cygwin のシンボリックリンクはただのファイル。

  • パッケージの量は Cygwin より少ない。 ping や dig など、良く使うコマンドのパッケージはなかった。

より詳細は公式サイトに記載があるので、一読しておくといいでしょう。

一方、 WSL2 においては「Linux の VM が動いており(コマンドやパッケージ管理はディストリビューションによる)、Windows のパーティションがマウントされていて、かつ不思議な力で Windows 側の exe ファイルが実行できる」という感じです。何ともおおざっぱな感想ですが、そんな感じだと思います。

インストールから使えるようになるまで

通常通り公式サイト https://www.msys2.org/ からインストーラをダウンロード・実行(インストール)した後の話となります。スタートメニューから MSYS2 を実行します。

まずは pacman でパッケージを最新化させます。根気よく何度か実行し、環境を最新の状態にします。 `pacman -Syu` が sudo 無しで実行されていることに違和感を覚えますが、 MSYS2 ではそういうものだと頭に認識させます。

$ pacman -Syu

必要なパッケージをインストールしていきます。 MSYS2 を便利に呼び出せる launcher プログラム、そして zsh や tmux, vim や Emacs など普段使いするコマンドが使用できるようにするコマンド例です。

$ pacman -S git openssh emacs tmux vim zsh msys2-launcher

Cygwin は setup.exe からパッケージを更新することが公式のお作法でしたが、 MSYS2 はデフォルトかつ公式で pacman が提供されております。コンソールから直接パッケージのアップデートがサポートされていることは非常に良いですね。
次に開発に必要なツールなどをインストールしていきます。これも、あくまで個人的なサンプルです。

$ pacman -S base-devel python mingw-w64-x86_64-libgccjit mingw-w64-x86_64-toolchain ruby 

以下の「シンボリックリンクを張れるようにする設定」は Windows 10 Pro や Enterprise の場合、実行可能です。
MSYS2 上からシンボリックリンクを張れるように設定します。 MSYS2 の場合 Windows のシンボリックリンク機能を利用します。つまりコマンドプロンプトから `mklink` を呼び出した結果と同等になります。
過去、Windows の一般ユーザは、管理者権限にならない限りシンボリックリンクを張ることができませんでした。しかし、 Windows 10 から一般ユーザでも管理者権限不要でシンボリックリンクを張ることができるようになりました。

シンボリックリンク作成が実行できる権限が新設されたということですね。その権限は、グループポリシーの `コンピューターの構成\Windows設定\セキュリティの設定\ユーザー権利の割り当て` 内にある「シンボリック リンクの作成」で定義がされています。
具体的には SeCreateSymbolicLinkPrivilege という権限が割り当たっているユーザ・グループであれば、作成が可能です。

Microsoft のドキュメントの通りセキュリティの懸念がありますので、ドキュメントをよく読み、その内容をよく考慮した上で設定すべきです。
なお筆者は未確認ですが Administrators グループはデフォルトで入っている可能性があるようです。自身が使用しているユーザについては、コマンドプロンプトから権限が割り当たっているか確認が可能です。

$ whoami /priv | findstr SeCreateSymbolicLinkPrivilege
SeCreateSymbolicLinkPrivilege シンボリック リンクの作成                       有効

もし割り当たっていない場合「ローカルグループポリシーエディター」(gpedit.msc)などで該当のポリシーにユーザやグループを追加できます。
なお、エディションが Home の場合、グループポリシーエディターが実行できないため設定ができません。インターネット上では無理やりに解決する方法が掲載されていたりしますが……、自己責任でどうぞ。

その後 `/msys2.ini` を vim などで修正します。 `MSYS=winsymlinks:nativestrict` という行が有効になっていれば OK です。
これにて `ln -s [src] [dest]` が正常に動作するようになりました。

.zshrc など dotfiles を設定していきます。私の環境では git で管理しているので、 `git clone` して最新の環境を適当なパスにデプロイした後、 HOME 以下のファイルをシンボリックリンクに置き換えていきます。

$ cd /path/to/dotfiles
$ rm /msys2.ini
$ ln -s ${PWD}/MSYS2/msys2.ini /msys2.ini
$ ln -s ${PWD}/dot.zshrc ${HOME}/.zshrc
$ ln -s ${PWD}/dot.vimrc ${HOME}/.vimrc
$ ln -s ${PWD}/dot.emacs.d ${HOME}/.emacs.d
...

msys2.ini は以下のような内容です。デフォルト SHELL の指定なども行っております。

MSYS=winsymlinks:nativestrict
SHELL=/usr/bin/zsh
MSYSTEM=MSYS

これにより Launcher (msys2.exe) から実行できるようになりました。スタートメニューの MSYS2 のリンクも msys2.exe へ書き換えて、作業完了となりました。

Mintty の設定

余談ですが Mintty の設定について。
Mintty は GUI の設定ウインドウの他、かなり膨大な設定項目があります。

いくつかを紹介します。例えば、英語と CJK それぞれで別々のフォントを使いたいという場合です。

Font=Cascadia Code
FontChoice=CJK:2
Font2=HackGen
FontHeight=9

通常のフォントは Cascadia Code 、 CJK の場合は `Font2` で指定している HackGen を使うという設定となります。

その他、キーカスタマイズができる設定があるのですが、微妙に設定できる内容に制限があります。

KeyFunctions=A+v:paste

私はターミナルでは Alt + v でクリップボードの内容をペーストするようにしたいのですが、このように Mintty で設定すると Alt + v ではなく Ctrl + Alt + Shift + v でペースト となってしまいます。
これは Mintty の KeyFunctions 設定では、必ず Ctrl と Shift キーがコンバインされてしまうためです。( `CtrlExchangeShift=true` とすると、Shift キーが不要になる)
不便ですね。

歴史的経緯があるのか、と回避方法含め色々調べてみましたが結局分かりませんでした。 PowerToys の Keyboard Manager などからトリックさせてあげれば Alt + v でペーストという動作は実現可能ですが、 Mintty 単体で解決して欲しい内容です。 Issue 立ててみようかな。

また `${HOME}/.mintty/themes` というディレクトリ内に色の指定が書かれたテーマファイルを作成し配置すると、そのテーマを指定可能です。

さいごに

最初は WSL2 と Ubuntu 環境を整えていたのですが Vmmem のメモリ使用率が気になり、結局のところ MSYS2 をメインに使用し必要に応じて WSL2 を動かす、という運用に落ちつきました。
リソースの使用量がミニマムに抑えられる WSL1 実装の発展を望んでいたのですが、残念でしたね。
Cygwin から完全に乗り換えようかな、とも思ってましたが、よく使うパッケージは Cygwin の方が多いことから Cygwin にそのうち戻りそうです。

老後、奥さんと世界一周のための費用にします。