MSYS2+VagrantによるWindowsでのUNIX環境

0. 目次

1. はじめに
2. Vagrantについて
3. WindowsにおけるVagrantの利用について
4. PuTTYを使う方法
5. Vagrant付属のMSYS環境を利用する
5.1. Vagrant付属のMSYS環境下でmingw-getを使えるようにする
5.2. Vagrantによる仮想マシンの構築と接続の実際
5.3. MSYSのsshで接続できない時の回避策
5.4. 結局この方法はおすすめできない
6. MSYS2環境を利用する
6.1. MSYS2とは
6.2. MSYS2のダウンロードとインストール
6.3. シェルの環境設定
6.4. フォントの設定
6.5. 必要なパッケージのインストール
6.6. Vimの設定
7. 再度Vagrant
8. 仮想マシンLinuxの日本語化
9. ネットワーク設定
10. ファイル共有機能

1. はじめに

仕事上,UNIX(GNU)関係ツールをよく使うのです.
Git, Vim, gcc, make, Bash, OpenSSH, Emacs, grep, MySQL, Gnuplot, etc..
でも,メインのマシンをLinuxにするほどの勇気はありません.ですので,現在は主にMac (OS X)を使ってます.
「OS X」はBSD UNIXベースのOSのDarwin (http://en.wikipedia.org/wiki/Darwin_(operating_system) )です.

しかし,コンパイラはLLVM-GCC(llvm-gcc)か,Apple LLVM Compiler(clang)
Rubyも古いし,ApacheやPHPも同梱されているけど拡張しづらいし.
結局,独自のUNIXパッケージ管理を使わざるを得ません.

  • MacPorts
    • 全て「/opt/local」上のライブラリで完結し,Macのシステムに依存しない.
    • Gitだけをインストールするのに,約40個もの依存パッケージ(ncurses, openssl, perl等)をインストールしなければならない
  • Homebrew
    • 「/usr/local」配下をユーザに読み書きパーミッションを与えて利用.sudoしなくてよい.
    • 必要なプログラムだけをインストールするので無駄がない.
    • ビルドに,システムの古いライブラリを利用したり,Homebrew内のライブラリを利用したりで混在してしまう.

そう考えると,ぼちぼちWindowsがメインでも良いかもという気がしてきました.自分が感じるMacの不満は...

  • MS OfficeもWindow版とMac版では,やっぱり若干違う.
  • MacBook Airでも結構重い(1kg超)
  • アルミボディなのでちょっとぶつけたらすぐ変形する.
  • D-sub15ピン(VGA)コネクタや,RJ-45(LAN)用コネクタなど利用するのに色々インターフェースが必要.
  • OS Xのアップグレードのペースについていけない…
  • OS Xのアップグレードの度に,Homebrewがなんかおかしくなる
  • Xcodeがでかい.

でも,カッコいいし,フォントレンダリングも奇麗だし,何よりもベースはUNIXというのが良いのです.しかし,Windowsでも,UNIX環境を使おうと思えば使えるんですよね.

  • Cygwin
    • Windowsで,完全なUNIX環境を提供
    • 色々なUNIXアプリケーションが移植されている
    • 独自ライブラリ(cygwin1.dll)を利用
  • MSYS(MinGW)
    • GCC及び必要なツールのみの提供
    • Microsoftのランタイムライブラリ(msvcrt.dll)を利用

結局...

MacやWindows上で,ネイティブにWeb開発環境を入れても維持管理が困難
案件によって,バージョン等開発環境が異なるのは当たり前
結局,なんだかんだでLinuxの方が良いでしょう

ならば,Windows上でLinuxを利用すればよい.

そこで,VirtualBoxとVagrantの登場です.
なんだ,結局仮想化じゃないか...」と声が聞こえてきそう.

今回は,WindowsでVagrantを利用する最適な方法の1つを説明します.

2. Vagrantについて

Vagrantとは,仮想環境の構築と制御を行うソフトウェアです.
https://www.vagrantup.com

仮想マシンについては,VirtualBox,VMware等で提供されます.

事前に,最新版のVirtualBox(Version 4.3.20)をインストールしておきます.

次のサイトよりダウンロードし,通常のインストールを行います.

https://www.virtualbox.org/wiki/Downloads

仮想マシンの生成,ブートとシャットダウン,Chef/Puppetによるプロビジョニング,仮想マシンへのSSH接続等がコマンドでできます.
以前は,RubyGemsとして配布されていましたが,現在はインストールパッケージを使用することを推奨しています.
インストールパッケージは,Windows版,Linux版,OS X版とあります.

仮想マシンの生成と接続は次のコマンドをたたくだけ

$ vagrant init hashicorp/precise32
$ vagrant up
$ vagrant ssh

これだけで,VirtualBox上でUbuntu 12.04LTS(32bit)(2014/12現在)が生成され,ブートし,vagrantユーザとしてSSHでログインできます.
コマンドをたたいたディレクトリが,仮想マシン上では「/vagrant」で共有マウントされ利用可能です.
Windowsでは,コマンドプロンプト,PowerShellからでも利用可能です.

しかし,Windowsでは(標準では)SSHが使用できません...
sshコマンドを利用するためには,Cygwin,MSYS(MinGW)環境をセットアップする必要があります.
または,vagrantよりssh-configファイルを生成して,PuTTYやTeraTermなどのアプリケーションを利用する手もあります.(スマートではありません)

3. WindowsにおけるVagrantの利用について

では,どのようにして,SSH接続するか(以下の4つの方法が考えられます)

  • VagrantのMSYS環境とminttyを利用する方法
    • vagrant¥embedded配下にMSYS環境がすでに盛り込まれている
    • mingw-getをセットアップして,mingw-getでOpenSSHをインストール
  • プラグインを利用してPuTTYから接続する方法
    • 上の環境に「vagrant-multi-putty」プラグインを導入すれば,PuTTYで接続可能
  • MSYS/MinGW環境をセットアップしminttyを利用する方法
    • vagrant¥embeddedのMSYS環境は使用せず,別途環境をセットアップする
  • Cygwin環境をセットアップし,OpenSSHをインストールして利用
    • 今回は確認しませんでした.

4. PuTTYを使う方法

スマートではないですが,別途,ターミナルエミュレータPuTTYを使う方法です.

まずは,普通にPuTTYの最新版インストーラをダウンロードし,普通にインストールします.別にデフォルトの「C:¥Program Files (x86)」に入れても問題ありません.

Vagrantにデフォルトで用意されているターミナルエミュレータであるminttyからアクセスできるよう,「.bash_profile」に次のPATH設定を入れて,有効化しておきます.

export PATH=%PATH:/c/"Program Files (x86)"/Putty

次に,プラグインを入れます.

$ vagrant plugin install vagrant-multi-putty

以降は,$ vagrant putty で利用できます.

minttyあるのになんでPuTTY?って感じですが...

5. Vagrant付属のMSYS環境を利用する

5.1. Vagrant付属のMSYS環境下でmingw-getを使えるようにする

Vagrantには,既にMSYS環境も入っています(\Vagrant\embedded 配下)ので,その中に同梱されているターミナルエミュレータminttyを使用します.そこで,minttyへのアクセスを容易にするためのショートカットの作成します.

  • リンク先:
    • C:¥HashiCorp¥Vagrant¥embedded¥bin¥mintty.exe /bin/bash –login
  • 作業フォルダー:
    • C:¥HashiCorp¥vagrant¥embedded¥home¥hoge

次に,MSYSのパッケージ管理ツールであるmingw-getを使えるようにします.下記のサイトよりmingw-get-setup.exe をダウンロードします.

MinGW – Minimalist GNU for Windows – Browse -Installer at SourceForge.net
http://sourceforge.net/projects/mingw/files/Installer/

セットアッププログラムの実行.ウィザードは基本的にデフォルトのまま進んで行き,インストール先も,デフォルトの「C:¥MinGW」にしておきます.

次に,mingw-getの環境を丸ごと,Vagrant¥embedded配下にコピーします.コピーが完了すれば,「C:¥MinGW」は削除しても構いません.

cp -r /c/MinGW /c/HashiCorp/Vagrant/embedded/

続いてmingw-getでインストールしたものを,VagrantのMSYS環境で利用できるようにします.

C:¥HashiCorp¥Vagrant¥embedded¥mingw¥var¥lib¥mingw-get の中の2つのファイル「defaults.xml」と「profile.xml」の次の部分を修正します.

<sysroot subsystem="MSYS" path="%R/msys/1.0" />

%R」はmingw-get.exeが入っているディレクトリ(bin)の親ディレクトリ,すなわち,「C:¥HashiCorp¥Vagrant¥embedded¥mingw」を意味します.これの親ディレクトリ,すなわち,「C:¥HashiCorp¥Vagrant¥embedded」をルートとして管理したいので,次のように変更します.

<sysroot subsystem="MSYS" path="%R/.." />

これにより,MSYS関係プログラムは,「C:¥HashiCorp¥Vagrant¥embedded¥bin」にインストールされるようになります.

今後は,mingw-getによるパッケージ管理(GUIも利用できますが,ここはCUIで)が可能です.

  • すでにインストールされているパッケージのアップデート
    $ mingw-get update
  • 必要なパッケージのインストール
    $ mingw-get install msys-openssl
    $ mingw-get install msys-openssh
    $ mingw-get install msys-rsync
    $ mingw-get install msys-tar
    $ mingw-get install msys-vim

これでSSHが使えます.

$ ssh -v

しかし,この後色々と問題が...

5.2. Vagrantによる仮想マシン構築と接続の実際

仮想マシンのテンプレートである,既存のBOXファイルを取得します.BOXファイルへのURLは,下記サイトに記載されています.

Vagrant Boxeshttp://www.vagrantbox.es/

BOXファイルをサイトからダウンロードし,ローカルに「centos6.4」(任意)という名前で追加します.

$ vagrant box add centos6.4 http://XXXX.box

http://XXXX.box」の部分は,Vagrant Boxes に記載しているURLを指定します.

ダウンロードされたBOXファイルの実体は,「C:¥Users¥hoge¥.vagrant.d¥boxes」 の中にあります.

次に,Vagrant作業用ディレクトリを作成し,そのディレクトリに移動しておきます.

$ mkdir buzz
$ cd buzz

最後に,BOXを元に仮想マシンの生成と起動を行います.

$ vagrant init centos6.4
$ vagrant up

これでやっと,仮想マシンへSSH接続できます.

$ vargrant ssh

しかし,ちゃんと動きません...あれれ...

5.3. MSYSのsshで接続できない時の回避策

sshのconfigファイルを作成します.

$ vagrant ssh-config --host buzz >> ~/.ssh/config

そうすると,次のように指定することでSSH接続可能です.

$ ssh buzz

または,次のコマンドでもOK

$ vagrant ssh default -- -t -t

5.4. 結局この方法はおすすめできない

ここで大事なことに気がつきます.Gitがない...

$ mingw-get list | grep git
$ (Nothing!!!!)

Windowsで利用できるGitとして,別途,msysgit があります.

Git for Windows(msysgit)http://msysgit.github.io/

でもGitを利用したいだけなのに,また色々と要らないものをインストールされるのもあれですし...
そこで,MSYS2を利用することにします.

6. MSYS2環境を利用する

6.1. MSYS2とは

6.2. MSYS2のダウンロードとインストール

  • ダウンロード方法
  • インストール方法
    • セットアップファイルを実行,特にそのままウィザードを進めていく.
    • デフォルトのまま「C:¥msys64」にインストール
    • インストール終了後に,C:¥msys64¥msys2_shell.batが走り,minttyが起動する
    • 「C:¥msys64」がルート「/」になり,「C:¥msys64¥home¥hoge」がユーザホーム「/home/hoge」となる.

6.3. シェルの環境設定

シェルのホームの物理PATHは,上述したように「C:¥msys64¥home¥hoge」です.ここからユーザの「デスクトップ」と「ドキュメント」にアクセスできるようにシンボリックリンクを張りたいのですが,そのまま「ln」コマンドを実行しても失敗します.そこで次の方法を採ります.

ファイル「C:¥msys64¥msys2_shell.bat」の下記部分の「REM」を外し,有効にして上書き保存します.

REM set MSYS=winsymlinks:nativestrict

このバッチファイルを管理者として実行します.(右クリック→「管理者として実行」)

立ち上がったシェルでlnコマンドを実行します.

$ ln -s /c/Users/hoge/Desktop ~/Desktop
$ ln -s /c/Users/hoge/Documents ~/Documents

次に「.bashrc」を編集します.自分に必要なものだけコメントを外して上書き保存します.

 alias rm='rm -i'
 alias cp='cp -i'
 alias mv='mv -i'
 alias ls='ls -hF --color=tty'

次に「.bash_profile」を編集します.プロンプトを自分の使いやすいように変更します.最下行に次の文を追記して上書き保存します.

export PS1="[\u@\h \W]\$ "

または,元のようにエスケープシーケンスを使って色を変えたり,現在のシステムが,「MSYS」,「MINGW32」,「MINGW64」のどの環境かを常に表示させたりしたい場合は,次のように指定します.

export PS1="\e[32m\]\u@\h[\[\e[35m\]$MSYSTEM\[\e[32m\]]\[\e[33m\]\W\[\e[0m\]\$ "

minttyを再起動し有効になっているか確認します.

  • msys2_shell.bat → MSYS環境
  • mingw32_shell.bat → MINGW32(32bit)環境
  • mingw64_shell.bat → MINGW64(64bit)環境

本記事登録時(2014/12/25)には,記載していなかったことを追記(2015/04/05)します.

MSYS2は,msys-2.0.dll これは,Red Hat社によって開発されたDLLで,説明には「Cygwin POSIX Emulation DLL」とあります.CygwinからforkされたDLLで,POSIXをサポートしています.

msys-2.0.dll とは? | System Explorer
http://systemexplorer.net/ja/file-database/file/msys-2.0-dll

各シェル(Shell)環境についての違いは以下の通りです.

  • MSYS2 Shell
    • MSYS2環境(32bit)でビルドされたユーティリティ(Git,wget,OpenSSH,Vimなど)が使用可能.
  • MinGW-w64 Win32 Shell
    • 32bit環境のシェル,kernel32.dllやmsvcrt.dllなどのWindowsで利用されるDLLに依存.
    • msys-2.0.dllに依存しないので,DLLなしの単独で実行可能,Win32のバイナリを作成できる.
    • lsやmakeなどのコマンドは,MSYS2のユーティリティとなり,このシェルでも利用可能.
    • 例外処理方法は,DWARF
  • MinGW-w64 Win64 Shell
    • こちらも上と同様,ネイティブのWindows(Win64)バイナリを作成できる.
    • 例外ハンドリングにSEH(Structured Exception Handling)が利用可能.

本記事登録時は,MSYS2 Shell環境を優先的に使用し,必要な時にMinGW-w64 Win64 ShellでWin64環境を使用しようと考えていましたが,OpenCVなどのパッケージは,MinGW-w64(Win64/32)版はあるのですが,MSYS2版ではありません.MSYS2環境でMinGWパッケージをビルドする方法(http://wiki.qt.io/MSYS2)がありますが,後々色々と面倒そうです.

しかし,MinGW-w64環境のRubyはirbでコマンド履歴が効かなかったり,Macで構築したCソースをそのままではコンパイルに失敗する場合があったりして,結局どちらのシェルをデフォルトにすべきか悩みます.

MinGW-w64 Win64 Shell環境を使用したとしても,/usr/bin にパスが通っているので,VimやGitなどのMSYS2ユーティリティも問題なく使用できます.パスとしては,/mingw64/bin が最優先となります.

6.4. フォントの設定

デフォルトのフォントが余り格好がよろしくないので,私の好きなConsolasを利用することにします.でも日本語フォントではないので,Windowsのフォントリンク機能を使って,日本語についてはMeiryo UIを使用させるようにします.

レジストリエディタを起動します.スタートアイコン右クリック→「ファイル名を指定して実行」で「regedit」と入力し「OK」をクリックします.

※注意 レジストリを編集するとWindows環境に支障が出る場合がありますので,取扱いには注意してください.

左の階層ツリーより,次の場所に移動します.

HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows NT¥CurrentVersion¥FontLink¥SystemLink

ここに新たなキーとして,「Consolas」という名前のキー(複数業文字列データ)を作成します.

  • [編集]→[新規]→[複数行文字列データ]
  • 値の名前
    • Consolas
  • 値のデータ
    • MEIRYO.TTC,Meiryo UI,128,105
      MEIRYO.TTC,Meiryo UI

Windowsを再起動させ,設定を有効にします.

minttyを起動し,オプションの設定を行います.

  • mintty上で右クリック→「Options」
    • 「Text」→「Font」を「Consolas」のサイズ「10pt」にする
    • 「Locale」→「ja_JP」,「Character set」→「UTF-8」

6.5. 必要なパッケージのインストール

(2015/04/05に一部修正しました)

システムの更新を行います.まずはリポジトリ(DB)の更新を行います.

$ pacman -Sy

次のコマンドを実行して,最新のbashやpacman等をインストールします.

$ pacman --needed -S bash pacman pacman-mirrors msys2-runtime

ここで一回シェルを再起動させます.

次に,システム全体の更新を行います.

$ pacman -Su

この後も一応シェルを再起動させておきましょう.

(参考URL)

基本開発環境(base-devel)をインストールします.

$ pacman -S base-devel

automake,autoconf,m4,make,pkg-config,texinfo,wget,perl,python2などがインストールされますが,gccやg++はインストールされません.gccやg++は「msys2-devel」パッケージでインストールすることができますが,gccやg++は,MSYS2版ではなく,MinGW-w64(x64)版をインストールします.

$ pacman -S mingw-w64-x86_64-toolchain

MinGW64(x64)環境のgcc,binutils,gmp,make,gettext,readline,openssl,tcl/tk,python2がこれでインストールされます.

OpenSSH,Git,Vim,tar,wget,unzip,rsyncなどをインストールします.

$ pacman -S vim git openssh unzip rsync

6.6. Vimの設定

ファイル「.bashrc」に 「alias vi="/usr/bin/vim"」 追記しておくと良いでしょう.

次に,「.vimrc」を作成します.

set nocompatible
set tabstop=4
set shiftwidth=4
set backspace=indent,eol,start

次に,「.inputrc」を編集します.

set meta-flag on
set convert-meta off
set input-meta on
set output-meta on

7. 再度Vagrant

先に説明した「5.2. Vagrantによる仮想マシン構築と接続の実際」と同じ事を行います.

$ vagrant box add centos6.4 http://XXXX.box   # URLは「http://www.vagrantbox.es/」で調べる
$ mkdir buzz
$ cd buzz
$ vagrant init centos6.4
$ vagrant up
$ vagrant ssh

問題なく,SSHで接続できました.

8. 仮想マシンLinuxの日本語化

CentOS 6系の場合の話です.

BOXのデフォルトの状態は,英語モードになっていますので,ロケールを日本語,文字エンコーディングをUTF-8に,後,タイムゾーンも変更します.

ファイル「/etc/sysconfig/i18n」を編集

LANG="ja_JP.UTF-8"

ファイル「/etc/sysconfig/clock」を編集

ZONE="Asia/Tokyo"

ローカルタイムの変更

$ sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

9. ネットワーク設定

仮想マシンのデフォルトの設定がNATになっており,仮想マシンから外へはNAT経由でアクセスできますが,外からあるいはホストマシンから仮想サーバ(ゲストマシン)にはアクセスできません.仮に,仮想サーバでWebサーバを構築し,それをホストマシンからアクセスしたい場合は,次の2通りがあります.

  • ホストオンリーネットワークの設定
    • もう一つホストマシンからのアクセス専用の仮想NIC(eth1)を追加する
    • ファイル「Vagrantfile」の編集(次の文のコメントを外す)
      • config.vm.network "private_network", ip: "192.168.33.10"
    • ホストマシンからのHTTPアクセス方法
  • フォワードポートマッピングの設定
    • 例えばゲストマシンの80番ポートをホストマシンの8080番ポートに転送する
    •  ファイル「Vagrantfile」の編集(次の文のコメントを外す)
      • config.vm.network "forwarded_port", guest: 80, host: 8080
    •  ホストマシンからのHTTPアクセス方法

何れにしても,iptablesで22番ポート以外拒否されている場合があるので,iptablesの設定も確認が必要です.

10. ファイル共有機能

VirtualBoxの共有フォルダ(Share Folder)機能がデフォルトで利用できるようになっています.

ホストマシンの「Vagrantfile」の置いてあるフォルダ ←共有→ 仮想マシンの「/vagrant」ディレクトリ

実は使用してみて分かったのですが,VirtualBoxの共有フォルダは遅く,特にこのディレクトリでRailsアプリ開発を使用とすると,scssとかの読み込みにものすごく時間がかかります.これを解決するためには,rsyncを使う方法があります.これについては,後の記事にて記載したいと思います.

広告

7 thoughts on “MSYS2+VagrantによるWindowsでのUNIX環境

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中