リモート開発メインのソフトウェア開発企業のエンジニアブログです

MSYS2 で Windows 上に *NIX ぽい環境を構築する

過去に Windows での環境構築関連で何件か記事を書いたのですが(以下のリンク参照)、

Windows – もばらぶエンジニアブログ

最近、新たに Windows マシンをセットアップする機会があったので、この記事を書くことにしました。

前提

  • Windows 11 Home
  • 家族と共用
  • 目的
    • 本格的な開発作業は行わない
      • 本格的な開発環境構築のための記事は色々と出ているので
      • あと、開発用のマシンは別で持っているので
    • Linux や Mac のような各種コマンド・ツールは使いたい

(なお、MSYS2 についてはあまり詳しくないので、誤った情報などがあればご指摘いただければと思います。)

やったこと概要

  • MSYS2 インストール
  • MSYS2 上で各種ツールインストール
    • emacs
    • git, diff, その他コマンド
  • SSH 設定
  • その他設定

MSYS2 について簡単に説明

MSYS2 概要

詳しくは公式ページ(MSYS2)を見た方が良いと思いますが、簡単に説明すると Windows 上に以下を提供するものです。

  • 各種コマンド・ツール・ライブラリー
  • Windows ネイティブアプリのビルド・実行環境

今回必要なのはそのうちの前者「各種コマンド・ツール・ライブラリー」です。具体的には Bash などのシェル環境や Git, OpenSSH といったツール、cp, diff といった基本的な *NIX 系のコマンドなどが簡単にインストールできます。

他の選択肢との比較

実は、単に Linux の CLI ツールを使うだけであれば WSL の方が簡単だと MSYS2 の以下のページにも書いてあります。

What is MSYS2? – MSYS2

また、最近はあまり聞きませんが cygwin でも同じような事ができると思います。

WSL や cygwin に比べて MSYS2 で環境を整えるメリットとしては、

  • MSYS2 上のツールは Windows ネイティブアプリなので、キビキビ動作する
  • PuTTY や Emacs などの GUI ツールも一元的に管理できる

だと思います。

MinGW-w64 などとの関係性、environment

MSYS2 という名前を聞いたことがある人であれば、MSYS (2じゃない方)や MinGW、MinGW-w64 といった名前を聞いたことがあるかもしれません。それらとの違い・関係性は色々なページに書かれていますが、以下のページが簡潔にまとまっていたため紹介します。

MSYS2でEmacs環境とUNIXライク環境を作る [のふ処|NOFUDOKORO]

で、このページの情報を前提とした上で、さらに以下の公式ページを見てもらいたいです。

Environments – MSYS2

MSYS2 には数種類の environment があり、それぞれ “toolchain”, “architecture”, “C Library”, “C++ Library” の組み合わせが異なります。ただ、上のページに書かれているとおり、よく分からなければ UCRT64 を使ってください。UCRT64 は割と最近追加されたものだと思うので、ネット上の MSYS2 の記事だと MINGW64 を使う事を勧めているものが多いですが、2023年現在、違いがよく分からない人は MINGW64 ではなく UCRT64 を使ってください。

なお、各 environment は以下の通り色が分かれているので間違いにくくなっています。

environment の違いの詳細には立ち入りませんが、ツールとして MSYS2 を使う場合に必要な知識としては

  • 各 environment (e.g. UCRT64) のツールは、その environment でしか使えない
  • MSYS environment のツールは、すべての environment で使える

という事くらいでしょうか。

Moba Pro

MSYS2 のインストール

インストールは exe ファイルを実行するだけです。詳しくは以下の公式ページを参照してください。

MSYS2

ちなみに、この後で使うのは、基本的にはすべて UCRT64 environment のターミナル(黄土色っぽいアイコン)です。しつこいようですが、2~3年前のネット上の記事だと MINGW64 を使っている事が多いですが、 UCRT64 を使いましょう。

さて、インストールが終わった後は以下のコマンドで、パッケージを最新にします。

pacman -Syuu

pacman は MSYS2 で使われるパッケージマネージャーで、Arch Linux でも使われているものです。詳しい使い方はググるなり ChatGPT に聞いてください。

MSYS2 上で各種ツールのインストール

Emacs & Vim: UCRT64 か MSYS か

何はともあれ Emacs を入れましょう。パッケージを検索するには pacman -Ss を使いますが、大抵は以下のように大量の結果が出てきます。(キャプチャはインストール後のものです。すみません)

先頭のピンク色の部分が environment の名前なのですが、各 environment 毎に似たような名前のパッケージが存在します。この場合、UCRT64 (パッケージ名は mingw-w64-ucrt-x86_64-emacs )か MSYS (同 emacs )のどちらかを選ぶ必要があります。Emacs の例ですと、UCRT64 はバージョンが29.1-2なのに対して、MSYS は 27.2-2 と若干古いです。基本的には UCRT64 を選んでおくと良いと思います。

コマンドとしては以下の通り、先頭のピンクの文字列を除いたパッケージ名を指定します。

pacman -S mingw-w64-ucrt-x86_64-emacs

あと、あまり使いませんが(嘘)、vim も入れておきましょう。UCRT64 には neovim というのしか無いので、MSYS environment のものを入れます。

コマンドは以下の通りです。

pacman -S vim

他のツール

diff くらい最初から入れておいてほしいのですが、入ってないので入れます。

pacman -S diffutils

SSH 関連

PuTTY のインストール

最初の方で MSYS2 を使うメリットとして「PuTTy や Emacs などの GUI ツールも一元的に管理できる」と書いたのですが、私は何となく Microsoft Store からインストールしてしまいました。が、MSYS2 からインストールする場合は以下のコマンドで行います。

 pacman -S mingw-w64-ucrt-x86_64-putty

実行ファイルはデフォルトでは C:\msys64\ucrt64\bin に配置されます。

SSH 秘密鍵の作成

鍵の生成は PuTTYgen で行います。詳しくは色々なサイトで解説されているので、それらを参照してください。

SSH エージェント周り

PuTTY には pageant という SSH エージェントのプログラムがありますが、MSYS2 にインストールされている SSH クライアント(OpenSSH)からは直接利用する事ができません。そのあたりの事情は以下の記事に詳しくまとまっているので、興味がある方は読んでみる事をおすすめします。

混沌を極めるWindowsのssh-agent事情 – Qiita

とりあえず動かせるようにしたいだけであれば、MSYS2 上で ssh-pageant というパッケージをインストールします。

pacman -S ssh-pageant

その上で、MSYS の .bash_profile の末尾に以下の行を追加します。

# ssh-pageant
eval $(/usr/bin/ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME")

これで、MSYS2 上の OpenSSH から PuTTY の Pageant に接続できます。

その他設定

シンボリックリンク関連

WSL (1, 2 を問わず)は、動作としては基本的には Linux と同じですので、(WSL 内部であれば)シンボリックリンクは通常通り動作します。(作成したシンボリックリンクを Windows からアクセスできるかとか、その辺は深入りしません。)

それに対して、MSYS2 内部で ln -s でシンボリックリンクを作ろうとするとファイルのコピーが行われます(ディレクトリに関しても同様のようです。)以下、試してみた結果を貼ります。

k4200@DESKTOP-CAGH81I UCRT64 ~
$ mkdir symlink-test

k4200@DESKTOP-CAGH81I UCRT64 ~
$ touch symlink-test/a

k4200@DESKTOP-CAGH81I UCRT64 ~
$ ln -s symlink-test/a symlink-test/b
ln: failed to create symbolic link 'symlink-test/b': No such file or directory

k4200@DESKTOP-CAGH81I UCRT64 ~
$ ls -l symlink-test/
total 0
-rw-r--r-- 1 k4200 k4200 0 Sep  5 09:26 a

k4200@DESKTOP-CAGH81I UCRT64 ~
$ cd symlink-test/

k4200@DESKTOP-CAGH81I UCRT64 ~/symlink-test
$ ln -s a b

k4200@DESKTOP-CAGH81I UCRT64 ~/symlink-test
$ ls -la
total 4
drwxr-xr-x 1 k4200 k4200 0 Sep  5 09:27 .
drwxr-xr-x 1 k4200 k4200 0 Sep  5 09:26 ..
-rw-r--r-- 1 k4200 k4200 0 Sep  5 09:26 a
-rw-r--r-- 1 k4200 k4200 0 Sep  5 09:26 b


最後のコマンドの結果を見ると分かるとおり、b というファイルはシンボリックリンクではなく通常のファイルです。(ちなみに、3行目のコマンドがなぜ失敗したのかは不明です。)

Windows にはシンボリックリンクの機能が無いからでは、と思う方もいるかと思いますが、実はそこまで知名度はありませんが Windows にもシンボリックリンクの機能があります(ずいぶん後になって追加されたと思います)。MSYS2 からその機能を使うには、以下の2つを行う必要があります。

  • MSYS 環境変数に winsymlinks:nativestrict という値を設定する
    • .bashrc で設定する
    • あるいは C:\msys64\msys2.ini で当該行のコメントを外す
  • 以下のどちらかを実行する
    • MSYS2 を管理者権限で実行する
    • Windows を Developer Mode にして MSYS2 を実行する

個人的にはシンボリックリンクを作成する時だけ MSYS2 を管理者権限で実行しています。

まとめ

Windows で Linux や Mac みたいな環境を作る方法としては、WSL を使う方法のほかに、今回紹介した MSYS2 を使う方法もあります。WSL とは異なり、Windows ネイティブアプリとしてコンパイルされた *NIX 系のコマンドを Windows 上のファイルシステム上で使えるという便利なものです。

一方この記事を読んで分かるかもしれませんが、Linux や Mac でコマンドを使うのと違って仕組みが若干複雑なので、仕組みを理解していないとトラブルシューティングに手間取ったり、やりたいことを実現するのに時間がかかったり、ということになりがちです。

← 前の投稿

AWS CDK の権限周りについて考えてみた

次の投稿 →

FirebaseRealtimeDatabaseのJSONデータをFlutterのfl_chartでグラフ表示

コメントを残す