PackerでAMIを作ろうとしたら吐かれたsudoエラーについて

久々にPackerを使ってみて遭遇したエラーについてメモしておく。

環境

動作環境はMac Book AirOSX 10.8 Mountain Lion。Packerはv0.8.6を使用。
AMIにはAmazon Linux AMI 2015.09.1 (HVM), SSD Volume Type - ami-383c1956を選択。

Packerテンプレート

単純にAmazon LinuxのEC2インスタンスsudo yum update -yしたAMIを作るだけのものである。

{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },

  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "source_ami": "ami-383c1956",
    "instance_type": "t2.micro",
    "ami_name": "wps-web-ami {{timestamp}}",
    "ssh_username": "ec2-user",
    "ssh_timeout": "5m",
    "tags": {
      "Name": "WordPress Server"
    }
  }],

  "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo yum update -y"
    ]
  }]
}

エラーメッセージ

上記のテンプレートでビルドしたら以下の様なメッセージを吐いてコケた。

$ packer build ami.json 
amazon-ebs output will be in this color.

==> amazon-ebs: Prevalidating AMI Name...
==> amazon-ebs: Inspecting the source AMI...
==> amazon-ebs: Creating temporary keypair: packer 5655d9e2-b5e7-8a86-9f64-33936ce5add0
==> amazon-ebs: Creating temporary security group for this instance...
==> amazon-ebs: Authorizing access to port 22 the temporary security group...
==> amazon-ebs: Launching a source AWS instance...
    amazon-ebs: Instance ID: i-ed34aa48
==> amazon-ebs: Waiting for instance (i-ed34aa48) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Provisioning with shell script: /var/folders/_p/5nbnyk0n5x599chrtk9vswqc0000gn/T/packer-shell560434101
    amazon-ebs: sudo: sorry, you must have a tty to run sudo
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: No AMIs to cleanup
==> amazon-ebs: Deleting temporary security group...
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' errored: Script exited with non-zero exit status: 1

==> Some builds didn't complete successfully and had errors:
--> amazon-ebs: Script exited with non-zero exit status: 1

==> Builds finished but no artifacts were created.

原因と解決方法

エラーメッセージの赤く着色した部分が問題なのだが、読んだ通りで仮想端末を使わなければsudoできませんよと言われている。
一年くらい前にPackerで同じ様にAMIを作っていた時には、この設定内容で問題無かったような気がしたのだが、どういうことだろうと思い調べてみたところ、PackerのChangeLogにその答えが書いてあるのを見つけた。

core: SSH connection will no longer request a PTY by default. This can be enabled per builder.

Packerは2015年6月23日にv0.8.0へとアップデートしたのだが、その際、標準ではSSH接続にPTYを要求しなくなったそうだ。要するに、リモートマシンに仮想端末でログインせず、直接コマンドを投げているので、sudoersに外部からのコマンド実行を遮断されている訳である。
この問題を解決するのは簡単で、SSH接続にPTYを要求するよう設定してやれば良い。v0.8.2から追加されたCommunicatorのオプションであるssh_ptytrueを設定し、上記テンプレートのBuilder部分に追記してやると、SSH接続に仮想端末を使うようになるので、Provisionerのsudoコマンドが実行されるようになる。
なお、他の解決方法として、AMI Builderのuser_dataを利用し、sudoersの設定内容を書き換えてしまうということも可能ではあるのだが、当然、セキュリティ的に問題があるのでおすすめはしない。素直にssh_ptyを使った方が手間が無いし安全だろう。

ChefのパッケージをWeb API(Omnitruck API)で取得する

Chefのパッケージ取得方法について、ちょっとしたメモ。
Chef ClientやChef Serverのパッケージは、ダウンロードページから以外にも、Web APIを利用した取得方法が存在する。

Omnitruck API

Chef社はOmnitruck APIというWeb APIを公開しており、任意のURLをリクエストすることにより、リリースされているあらゆるバージョンのChef ClientやChef Serverのパッケージを取得することができる。
また、通常のダウンロードページには存在しない、プレリリース版やナイトリー版の取得にも対応していたりする。
Chef ServerのCommunity Cookbookなんかでは、OhaiとOmnitruck APIを利用して、環境に合わせた臨機応変なパッケージの取得を実現している。

Chef Clientの取得方法

以下のURLをリクエストすることで、パッケージを取得できる。

http://www.getchef.com/chef/download?p=$PLATFORM&pv=$PLATFORM_VERSION&m=$MACHINE_ARCH&v=latest&prerelease=false

また、上記URLのdawnloadをmetadataに変更すると、パッケージに付随したメタデータを取得することができる。

http://www.getchef.com/chef/metadata?p=$PLATFORM&pv=$PLATFORM_VERSION&m=$MACHINE_ARCH&v=latest&prerelease=false

メタデータは、パッケージのダウンロードURL、MD5とSHA256のチェックサムが記されたタブ区切りのテキストデータである。

url http://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.16.0-1.el6.x86_64.rpm
md5 5c8cfdbab2684148e2bb859b736b6827
sha256 e4d0236cc495d080f8e7a01704e2ef554e12088687e4fe946ee8027b79871bbb 

クエリパラメーターについては、

  • pはプラットフォーム。debian、el(rhel系)、freebsdmac_os_x、solaris2、sles(SUSE Enterprise Linux Server)、suseubuntuwindowsといった値を指定する。
  • pvはプラットフォームバージョン。プラットフォームに応じて指定できる値は決められており、elであれば5や6、ubuntuであれば10.4や12.10等、mac_os_xであれば10.6や10.7等といった具合。
  • mはマシンアーキテクチャi386i686x86_64、amd64といった値を指定するが、これもプラットフォームに依存する。
  • vはChef Clientのバージョン。デフォルトはlatestで省略可能。特定のバージョンが欲しい場合は、Semantic Versioningに則った形式で、x.y.z(x=MAJOR、y=MINOR、z=PATCH)といった具合に指定する。
  • prereleaseはプレリリース版を取得するためのフラグ。デフォルトはfalseで省略可能。

といった感じ。
これらクエリパラメーターでサポートされている値のより詳細な情報は、公式のドキュメントの方を参照してほしい。

Chef Serverの取得方法

Chef ClientのダウンロードURL末尾に-serverを付与するとChef ServerのダウンロードURLとなる。

http://www.getchef.com/chef/download-server?p=$PLATFORM&pv=$PLATFORM_VERSION&m=$MACHINE_ARCH&v=latest&prerelease=false&nightlies=false

メタデータの取得URLも同様。

http://www.getchef.com/chef/metadata-server?p=$PLATFORM&pv=$PLATFORM_VERSION&m=$MACHINE_ARCH&v=latest&prerelease=false&nightlies=false

クエリパラメーターも基本的にChef Clientと同じ構成であるが、フラグが一つ追加されている。

  • nightliesはナイトリー版を取得するためのフラグ。デフォルトはfalseで省略可能。ナイトリー版はあくまで検証用として用意されているので、本番環境では決して使わないこと。

当然だが各クエリパラメーターで指定できる値はChef Clientとは異なるので、サポートされている値の詳細な情報は、公式のドキュメントの方を参照してほしい。
公式ドキュメントには、他にも取得例が記載されているので、自前でChef ClientやChef Serverのインストール自動化プログラムを作る際には参考になるだろう。

ドメインについて

最後に、Chef社の旧ドメインについても触れておく。
現在のChef社は、社名変更に伴ってgetchef.comドメインを使っているが、変更前のOpscode社時代ではopscode.comドメインが使われていた。
このドメインはまだ生きており、opscode.comにアクセスすると、getchef.comへとリダイレクトされることが分かる。
で、Omnitruck APIについてだが、こちらも以前のURLであるwww.opscode.comでリクエストしても、www.getchef.comでリクエストした場合と同様に、正常にパッケージを取得することができる。
ちなみに、冒頭で例に挙げたChef ServerのCommunity Cookbookなんかは、このエントリを書いた時点では、旧ドメインのままだったりする。
とはいえ、いずれはサポートの切れるかもしれないドメインではあるので、これからOmnitruck APIを利用する場合に、わざわざ旧ドメインAPIを使用するのは止めておいた方が良いだろう。

CentOS6.5でランダムSalt付きSHA-512のシャドウパスワードを生成する

CentOS6.5でランダムSalt付きSHA-512のシャドウパスワードを生成する方法を調べたのでメモしとく。

最初、OpenSSLでできるかなと思いついたが、openssl passwdMD5はいけるけど、SHAには対応しておらず駄目だった。

$ openssl passwd --help
Usage: passwd [options] [passwords]
where options are
-crypt             standard Unix password algorithm (default)
-1                 MD5-based password algorithm
-apr1              MD5-based password algorithm, Apache variant
-salt string       use provided salt
-in file           read passwords from file
-stdin             read passwords from stdin
-noverify          never verify when reading password from terminal
-quiet             no warnings
-table             format output as table
-reverse           switch table columns

他にその手のツールはないか調べたところ、要件にピッタリ合致するgrub-cryptコマンドというのを見つけた。

$ grub-crypt --help
Usage: grub-crypt [OPTION]...
Encrypt a password.

  -h, --help              Print this message and exit
  -v, --version           Print the version information and exit
  --md5                   Use MD5 to encrypt the password
  --sha-256               Use SHA-256 to encrypt the password
  --sha-512               Use SHA-512 to encrypt the password (default)

Report bugs to <bug-grub@gnu.org>.
EOF

このコマンドを使うと、以下のように対話式でランダムSalt付きのSHA-512シャドウパスワードが生成できる。

$ grub-crypt         ←デフォルトがSHA-512なのでオプション必要無し
Password:            ←パスワード入力(今回はsampleという文字列)
Retype password:     ←もう一度パスワード入力
$6$5TIs9aRT3V4IRwJz$guTjCJzy1k.t8Gy8Y0TQiY25S7y6ptVzxeS0/o1JJG52Xv32lVIGCqOh11QCSeTqSlR2CVI380kTHYEY6WWOq/

うんうん、ちゃんとシャドウパスワードの形式で出力されてるね。
とてもシンプルで良いコマンドです。

Cygwinをアンインストールする

Cygwinをアンインストールしようと思ったが、Cygwinにはアンインストールを自動で行う手段が無く、手作業で行う必要があったので、その手順をメモしておく。

アンインストール手順

手順は公式サイトのFAQに記載されている。

http://cygwin.com/faq/faq.html#faq.setup.uninstall-all

意訳すると、

  1. Cygwin内でサービスを起動している場合は以下の手順で全て削除しましょう。一般的にインストールされていそうなサービスはsshd、cron、cygserver、inetd、apachepostgresqlとかです。

    1. cygrunsrv -Lで登録しているサービスを確認します。cygrunsrvが無い場合はこの過程を飛ばしましょう。

    2. 起動しているサービスがあればcygrunsrv --stop service_nameで停止します。inetdを使ってスタンドアローンなサービスを起動している場合はcygrunsrv -Lで表示されませんが、cygrunsrv --stop inetdを実行すればそれらもまとめて停止します。

    3. 最後にcygrunsrv --remove service_nameで各サービスを削除しましょう。

  2. X11サーバーが起動していれば停止し、バックグラウンドで動いているCygwinプログラムも止めます。コマンドプロンプトを終了し、Cygwinプロセスが無い事を確認しましょう。もし、再インストールする時の為にマウントポイントを保存しておきたければ、mount -mでfstabに書き込んでおくと良いでしょう。

  3. cyglsa.dllをインストールしており、/usr/bin/cyglsa-configを実行していた場合、LSA authentication packageの使用を停止する必要があります。その為、レジストリの/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa/Authentication Packagesの値を、元のmsv1_0という値に戻してWindowsを再起動しましょう。

  4. Cygwinのルートフォルダとサブフォルダを全て削除します。オブジェクトが使用されているといったエラーが出ましたら、全てのサービスが停止されて、全てのCygwinプログラムが終了しているかを確認しましょう。パーミッションエラーが出ましたら、エラーの原因となっているファイルやフォルダのパーミッションを変更しましょう。例えば、システムサービスによって使用されているファイルはSYSTEMアカウントが保持し、一般ユーザーからは書き込みができなくなります。

    手っ取り早く削除するには、自分に全てのファイルとフォルダの所有権限を付与しましょう。Windows Explorerを開き、Cygwinのルートフォルダで右クリックし、プロパティからセキュリティタブを選択します。もし、Windows XP Home Editionのシンプルファイル共有を使っているならば、これはセーフモードにしてからやる必要があります。それから、自分のアカウントを選択し、フルコントロールできるように変更すればOKです。まとめて削除できるようになるでしょう。

  5. デスクトップとスタートメニューのショートカット、setup-x86{_64}.exeがインストール時に使ったダウンロードフォルダを削除します。しかし、再インストールする場合であれば、setup-x86{_64}.exeは既にあるダウンロードフォルダをキャッシュとして再利用できるので、残しておくと再ダウンロードせずに済むでしょう。

  6. システムパスにCygwinを通していたら、同じ場所に再インストールする予定が無い限りは削除しましょう。CYGWIN環境変数も同様です。

  7. 最後に、徹底的にCygwinの痕跡を消したければ、レジストリのHKEY_LOCAL_MACHINEとHKEY_CURRENT_USER配下にある、Software/Cygwinを削除しましょう。しかしながら、ここまでの手順に従っていれば、既に削除すべきものは削除できています。通常、インストールフォルダは全てのレジストリに保持されています。

と、まあこんな感じか。

で、この通りにやって特に問題無くアンインストールできました。

MSYSのrxvtやCygwinでVagrantを実行した際に出力されるNIO4RのDLLエラーについて

Vagrantに内包されているMSYSのrxvtやCygwinで、Vagrantのコマンドを叩いた時に検出されたエラーについてメモしとく。
あらかじめ書いておくが、問題の回避はできたものの、根本的な原因の究明にまでは到っていない。

環境

VagrantWindows版のパッケージを使っていて、vagrant-berkshelfはコマンドプロンプトからインストールしている。

事象

コマンドプロンプトからVagrantのコマンドを実行すると問題無く動いていたのだが、Vagrantに内包されているMSYSのrxvtや、Cygwinから実行すると以下のエラーが出力されて止まってしまった。

$ vagrant status
Vagrant failed to initialize at a very early stage:

The plugins failed to load properly. The error message given is
shown below.

1114: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。   - C:/Users/heroween/.vagrant.d/gems/gems/nio4r-1.0.0/lib/nio4r_ext.so

なんでかなーと原因を調べてみた。

原因を探る

まず、問題を起こしているNIO4Rについてだが、これはBerkshelfが依存しているGemであり、Vagrantプラグインであるvagrant-berkshelfをインストールすると一緒に入ってくる。
このNIO4Rはクロスプラットフォームな作りとなっており、実行環境のRubyの処理系に応じて実装が変わる。

  • MRI/YARV、Rubiniusの場合はlibevをベースとしてC言語で実装された拡張ライブラリが使われる。
  • JRubyの場合はJava NIOをベースとしたJavaで実装された拡張ライブラリが使われる。
  • 上記以外であればPure Ruby実装のライブラリが使われる。

と、READMEではこのように説明されている。
Pure Rubyだと処理速度が遅いので、CやJava実装の拡張ライブラリも使えるようになっているのだろう。

で、今回はVagrantに内包されている、WindowsRuby(MRI)で実行したら問題が起きた。
上記の説明の通りであれば、MRIなのでC実装の拡張ライブラリが使われて、その際にDLLエラーが発生した…ものと思われるのだが、腑に落ちない点がある。
MSYSのrxvtやCygwinで出るエラーが、コマンドプロンプトでは出ずに、普通に動いているという点だ。

よく分からないので、実装の変わる条件がどうなっているのか、インストールされたNIO4Rのコード(nio.rb)を確認してみた。

if ENV["NIO4R_PURE"] || (ENV["OS"] =~ /Windows/i && !defined?(JRUBY_VERSION))
  require 'nio/monitor'
  require 'nio/selector'
  NIO::ENGINE = 'select'
else
  require 'nio4r_ext'

  if defined?(JRUBY_VERSION)
    require 'java'
    require 'jruby'
    org.nio4r.Nio4r.new.load(JRuby.runtime, false)
    NIO::ENGINE = 'java'
  else
    NIO::ENGINE = 'libev'
  end
end

これを見ると、OSがWindowsだとJRubyで無い限りは、必ずPure RubyのNIO4Rが使われるようだ…。
コマンドプロンプトから実行した場合、エラーが出ずに正常動作するのは、C実装でなくPure RubyのNIO4Rが使われているからということになる。
それでは、MSYSのrxvtやCygwinで実行すると、何故、Pure RubyでなくC実装のNIO4Rが使われるのだろうか。
とりあえず、環境変数OSをコマンドプロンプトで確認してみると、値は以下のように表示された。

C:¥User¥heroween>echo %OS%
Windows_NT

同じようにrxvtとCygwinでも確認すると、

$ echo $OS
Windows_NT

やはり"Windows_NT"と表示される。
それでは、Vagrant実行時にどうなっているのかと、nio.rbに直接puts ENV["OS"]と書き込んで実行したところ、

# コマンドプロンプト
Windows_NT

# MSYSのrxvt
MINGW32_NT-6.1

# Cygwin
CYGWIN_NT-6.1

と、ターミナル毎に異なった値が出力された。
そこで、VagrantのShell実装コマンドを見てみると、以下のように環境変数OSが上書きされていることが分かった。

# Determine the OS that we're on, which is used in some later checks.
# It is very important we do this _before_ setting the PATH below
# because uname dependencies can conflict on some platforms.
OS=$(uname -s 2>/dev/null)

unameコマンドの値で環境変数OSから"Windows"が消えてしまったことで、C実装のNIO4Rが使われるようになっていた訳である。

ここまでで、コマンドプロンプトとMSYSのrxvtやCygwinで挙動が変わっていた原因は分かった。
それでは、DLLエラーを吐く根本的な原因はなんなのだろうか。

処理の実行に失敗しているnio4r_ext.soをobjdumpで確認してみると、

$ objdump -T nio4r_ext.so

nio4r_ext.so:     file format pei-i386

DYNAMIC SYMBOL TABLE:
no symbols


C:¥MinGW¥bin¥objdump.exe: nio4r_ext.so: not a dynamic object

と表示されたので、soファイル自体壊れている可能性もありそうなのだが、Windows環境とC言語に明るくない自分では、究明するまでにかなりハマりそうなので、ここで打ち切ることにした。

対応

対応として、環境変数NIO4R_PUREに真の値を設定しておけば、必ずPure RubyのNIO4Rを使うようになるので、この問題を回避することはできる。

nio.rbのコードを見ると分かるが、そもそも、OSがWindowsの場合はC実装のNIO4Rを使わないような条件になっているし、過去のIssueやPRを追ってみても、単純にサポートしてないだけのように思われる。
どうしてもWindowsでC実装のNIO4Rを使いたいという訳でも無いので、一先ずはここまでにしておく。

Windows7にRubyInstaller+Pikで複数バージョンのRuby環境を整える

Windows上で複数バージョンのRubyを使う必要に迫られたので、RubyInstallerとPikを使って実現してみた。

前置き

PikとはWindows上で複数バージョンのRubyを管理するためのツールである。

Pik - Github

このPikを使ってRubyのインストールからバージョンの切り替えまで一切を管理する…のが本来の使い方なのだろうが、Pikの開発とメンテナンスは数年前から停滞している模様で、最新版(0.3.0-pre)でもインストールできるRubyのバージョンが標準で1.9.2までだったり、各種コマンドの挙動が不安定だったりしたので、RubyのインストールはRubyInstallerで行い、Pikはあくまでもバージョン切り替えだけを目的として使うことにした。

Rubyのインストール

という訳で、まずはRubyInstallerでRubyをインストールする。

Downloads - RubyInstaller for Windows

上記のページから、このエントリー作成時点での最新バージョンであった2.0.0-p481(x86)のインストーラーをダウンロードし、ダウンロードが完了したら実行する。
ウィザードが起動し、インストーラーでの表示言語選択が出てくるので、日本語を選択してOKをクリックする。

f:id:heroween:20140630122036p:plain

ライセンスに同意して次へをクリックする。

f:id:heroween:20140630122509p:plain

インストールフォルダ(デフォルトはC:¥Ruby200-x64)と各オプションを設定し、インストールをクリックする。
今回の例では、RubyGUIアプリを作成するために必要なTd/Tkサポートが不要だったのでチェックを外した。

f:id:heroween:20140630122933p:plain

インストールが開始され、

f:id:heroween:20140630123058p:plain

インストールが完了。完了をクリックしてウィザードを閉じる。

f:id:heroween:20140630123208p:plain

コマンドプロンプトRubyのバージョンを確認してみる。

C:¥>ruby -v
ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

Rubyのバージョンが表示され、無事インストールされていることが分かる。

DevKitのインストール

Rubyはインストールしたが、これだけではRubyGemsの拡張ライプラリ(C言語製の)をビルドすることができない。
この状態でjson等の拡張ライブラリをインストールしようとすると、以下のようなエラーメッセージが出力されることになるだろう。

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

拡張ライブラリをビルドできるようにするためには、Rubyの本体に加えてDevKitもインストールする必要がある。
RubyInstallerのダウンロードページの下部にある、DEVELOPMENT KITからRuby2.0(x64)版をダウンロードして実行する。
ファイルは7zip形式のアーカイブなので、展開先を設定してExtractをクリック。

f:id:heroween:20140630125355p:plain

解凍が始まり、

f:id:heroween:20140630125404p:plain

ファイルの展開が完了するとウィザードは自動で閉じる。

インストールされたDevKitの中身を確認してみると、DevKitとはMinGWMSYSであることが分かる。
拡張ライブラリをビルドするのに最低限必要となるWindows移植版のGNUツール群であり、RubyGemsのコマンドを実行した時に、DevKitのツール群を利用するように設定してやることで、拡張ライブラリがビルドできるようになる。

で、その設定方法だが、インストールしたフォルダの直下にあるdk.rbを使って行う。
まず、コマンドプロンプトを開いて初期化コマンドであるdk.rb initを実行する。

C:¥devkit>ruby dk.rb init
[INFO] found RubyInstaller v2.0.0 at C:/Ruby200-x64

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

すると、このマシンにインストールされているRubyが自動で検出され、DevKitのフォルダに以下の内容のconfig.ymlというファイルが生成される。

# This configuration file contains the absolute path locations of all
# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
---
- C:/Ruby200-x64

注意すべき点として、複数バージョンのRubyがインストールされている場合は、config.ymlのコメントに例示されているように、複数のパスが検出されてファイルに記載される。
この状態で、次のDevKitの適用コマンドを実行すると、全てのRubyに対して適用されてしまうため、適用したくないバージョンが含まれている場合は、テキストエディタでconfig.ymlを開き、対象外のパスを削除しておく必要がある。
尚、既に他のDevKitが適用されているRubyには、その旨がメッセージとして出力されるだけで、上書きされるようなことは無い。
逆に言うと、一度適用してしまうと修正できなくなるということなのだが、その場合はdk.rb install -fとforceオプションを付与することで強制上書きすることができる。

ここで、config.ymlの内容に問題が無ければ、dk.rb installで対象となるRubyにDevKitを適用する。

C:¥devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby200-x64'
[INFO] Installing 'C:/Ruby200-x64/lib/ruby/site_ruby/devkit.rb'

出力されたメッセージにもある通り、適用するとdevkit.rbというファイルが新規に生成される。devkit.rbはRubyGemsのフックスクリプトで、DevKitのバイナリパスと環境変数が定義されており、RubyGemsのコマンドが実行されるとこのスクリプトが読み込まれ、拡張ライブラリのビルドにDevKit内のgcc等が使われるようになる。

余談だが、1.9.3のDevKitではdevkit.rbに加え、operating_system.rbというファイルも生成される。operating_system.rbは元からRubyの本体にあるファイルなのだが、その内容が書き変わり、元のファイルは日時付きにリネームされて、バックアップファイルとして保持される。
尚、devkit.rbとoprating_system.rbの内容は概ね同じなのだが、operating_system.rbがRubyGemsのフックスクリプトで、devkit.rbはプログラム内でDevKitの設定をrequire 'devkit'して読み込む為のヘルパーライブラリという位置付けであった。2.0になってからはdevkit.rbに統合された模様である。
DevKitについてより詳しく知りたければGithubのWikiを参照すると良い。

これでDevKitのインストールは完了となり、Ruby2.0.0の実行環境が整った。
そうしたら、次は同様の手順で別のバージョンのRubyである1.9.3-p545をインストールしてみよう。
DevKitも1.9.3向けのものがあるので、そちらも合わせてインストールする。

DevKitのアンインストール

DevKitはRubyやPikと異なり、アンインストールするためのプログラムは用意されていないので、アンインストール方法についても触れておく。
DevKitをアンインストールをしたくなったら、インストールフォルダを丸ごと削除し、適用したRubyに生成されたdevkit.rbを削除する。
1.9.3の場合はこれに加えて、operating_system.rbをバックアップされている初期のファイルに差し替える必要がある。

Pikのインストール

さて、これで2つのバージョンのRubyがインストールできた。それでは、これらのRubyをPikで管理できるようにする。
PikはRubyGemsインストーラーを使ってインストールすることができるのだが、特定のバージョンのRubyに依存する形でインストールしたくなかったので、今回はインストーラーの方を使った。

pik - Download Packages

上記のページから最新版であるpik-0.3.0.pre.msiをダウンロードし、インストーラーを実行するとウィザードが起動するのでNextをクリックする。

f:id:heroween:20140701102104p:plain

ライセンスに同意し、

f:id:heroween:20140701102235p:plain

インストールフォルダ(デフォルトはC:¥pik)の設定とシステムパスへPikのバリナリパスを通すかをチェックし、

f:id:heroween:20140701102359p:plain

Installをクリック。

f:id:heroween:20140701102548p:plain

f:id:heroween:20140701102556p:plain

インストールが完了したらFinishをクリックでウィザードを閉じる。

f:id:heroween:20140701102627p:plain

コマンドプロンプトを開き以下のコマンドでバージョンを確認。

C:¥Users¥heroween>pik -v
pik 0.3.0.pre on Microsoft Windows [Version 6.1.7601]
by Gordon Thiesfeld (gthiesfeld@gmail.com)

creating C:¥Users¥heroween¥.pik

問題無くインストールできた。
コマンドの初回実行時には、ユーザーのホームフォルダ配下に.pikフォルダが生成される。
このフォルダは初め空の状態だが、Pikを使用することで設定ファイルが格納されることになる。

注意すべき点として、Pikをインストーラーでインストールした場合は、ユーザー環境変数HOME(もしくはPIK_HOME)に%USERPROFILE%を設定しておく必要がある。
このユーザー環境変数を設定しておかないと、Pikを使ってRubyのバージョンを切り替えることができないので、コマンドプロンプトなり、コントロールパネルのシステムから設定しておこう。

Pikで複数バージョンのRubyを使う

ユーザー環境変数の設定まで終えたら、Pikで複数バージョンのRubyを使ってみよう。
まずは、インストール済みのRubyをPikに登録していく。
pik listを実行してPikにRubyが未登録であることを確認。

C:¥Users¥heroween>pik list

pik addに引数としてRubyのバイナリパスを渡して、各バージョンを登録していく。

C:¥Users¥heroween>pik add C:¥Ruby200-x64¥bin
INFO: Adding:  [ruby-]2.0.0-p481
      Located at:  C:¥Ruby200-x64¥bin

C:¥Users¥heroween>pik add C:¥Ruby193¥bin
INFO: Adding:  [ruby-]1.9.3-p545
      Located at:  C:¥Ruby193¥bin

完了したらもう一度pik listを実行。

C:¥Users¥heroween>pik list
   ruby-1.9.3-p545
=> ruby-2.0.0-p481

C:¥Users¥heroween>ruby -v
ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

Rubyが登録されていることが確認できる。
先頭に⇒が記されているRubyが現在有効になっているバージョンである。
ここで、.pikフォルダの中を確認してみると、以下のような内容のconfig.ymlというファイルが生成されている。

---
"[ruby-]1.9.3-p545":
  :path: !ruby/object:Pathname
    path: C:/Ruby193/bin
  :version: |
    ruby 1.9.3p545 (2014-02-24) [i386-mingw32]

"[ruby-]2.0.0-p481":
  :path: !ruby/object:Pathname
    path: C:/Ruby200-x64/bin
  :version: |
    ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

--- {}

初回のpik addでこのconfig.ymlが生成され、登録したRubyの情報がここに定義されるという訳である。

次に、バージョンを切り替えてみよう。
登録されているRubyのバージョンを切り替えるにはpik useを使う。
pik useに渡す引数は、ruby-1.9.3-p545といったフルネームでも、1.9.3-p545といった省略形でもどちらでも良い。

C:¥Users¥heroween>pik use 1.9.3-p545

C:¥Users¥heroween>pik list
=> ruby-1.9.3-p545
   ruby-2.0.0-p481

C:¥Users¥heroween>ruby -v
ruby 1.9.3p545 (2014-02-24) [i386-mingw32]

これでバージョンが2.0.0-p481から1.9.3-p545へと切り替わった。

以上で、Windows上に複数バージョンのRuby環境が整い、Pikで切り替えながら使うことができるようになった。
さらに他のバージョンのRubyも使いたければ、これまでの手順通りにRubyをインストールしてPikに登録してやれば、同様に使い分けることができる。

Pikについて蛇足

最後にPikを使ってみての所感。
冒頭にも書いた通り、開発とメンテナンスが停滞してるためか、色々とコマンドの挙動が不安定だった。

例えば、

  • 登録したRubyのバージョンを削除するpik remove(rm)は、実行すると一見正常に動いているように見えるが実は機能していない。不要なRubyのバージョンを削除したければ、直接config.ymlをテキストエディタで編集した方が良い。
  • config.ymlを削除するpik implodeは、実行時にエラーを出力するけどconfig.ymlは削除されている。
  • Pikのバージョンアップをするpik update(up)は、0.3.0-preで実行すると0.2.8にダウングレードされ(安定版だからだろうが)、かつその時点で使っているRubyのgemにインストールされる。さらにpik list -rで表示される殆どのRubyのバージョンが消えてしまう。

等々。
他にも、pik install等のパッケージ周りのコマンドも、なんだかんだと前提条件が必要だったりで、単純に実行しただけではすんなりと動かないケースが多い。
興味があればGithubを参照しながらアレコレ試してみると良いが、きっと煩わしくなることが多いだろう。
インストール自体は楽だし、バージョンの切り替えだけに限定すれば特に問題は無いので、割り切って使うのが賢明かと思う。

Windows7にmingw-getでMSYSのsshとrsyncをインストールする

Windows7上でVagrantとChef(knife-solo)を使うにあたり、sshrsyncが必要になるのだが、Windows向けのVagrantとChefに同梱されているMSYSには入っていなかったので、改めてmingw-getを使ってインストールしてみた。

MinGW、MSYSとは

Wikipediaを読んでください。

本家のサイトは以下。

mingw-getのインストール

MinGWとMSYSにはmingw-getというパッケージ管理ソフトがあり、これを使って各種アプリケーションのインストールを行う事ができる。

まずは、そのパッケージ管理ソフトであるmingw-getをインストールする為、ここからlatestのインストーラーをダウンロードしてくる。ダウンロードできたらインストーラーを起動。ライセンスを確認しインストールへ。

f:id:heroween:20140606182514p:plain

インストールフォルダ(デフォルトはC:¥MinGW)とGUIの設定をする。

f:id:heroween:20140606182527p:plain

mingw-getはCUIGUIの両方をサポートしているが、GUIも使いたい場合はここで有効にしておく。また、デスクトップとスタートメニューにショートカットが必要であれば、ここでチェックしておく。ショートカットは自分だけでなく全てのユーザーに作る事もできるようだが、ドキュメントを読むと推奨されていない。

Continueでインストールが始まり、

f:id:heroween:20140606182616p:plain

f:id:heroween:20140606182623p:plain

完了。ここでContinueをクリックするとGUIが起動し、Quitをクリックするとそのままウィザードが閉じる。

GUIはこんな感じ。

f:id:heroween:20140606182710p:plain

インストール直後のフォルダ構成は以下のようになっている。

MinGW
 ├bin      バイナリ
 ├libexec  exeやdllとか
 ├share    ドキュメントとか
 └var      キャッシュ、パッケージ定義ファイルとか

なお、mingw-getはインストールしても自動ではバイナリのあるフォルダのパスを通さないので、インストールが終わったら必ず環境変数PATHにC:¥MinGW¥binを追加する必要がある。勿論、インストールフォルダを変えた場合は、適宜binフォルダの位置を追加する。

mingw-getのアンインストール

ちなみに、mingw-getにはアンインストールする為のプログラムが内包されていない。アンインストールする場合は、インストール先のフォルダを直接削除すれば良い。デスクトップやスタートメニューにショートカットを作っていたら、それらも合わせて削除する。

パッケージのインストール:GUI

sshrsyncをインストールする前に、mingw-getを使ったパッケージインストールの手順を一通りメモしておく。

最初はGUIを使った場合。ここではパッケージリストからBasic Setupのmingw32-baseを選択し、MinGWの基本パッケージ群をインストールする。

パッケージを選択すると、下部のペインにはそのパッケージの詳細な情報が表示される。選択したパッケージの□をクリックするか右クリックをすると、ポップアップメニューが開く(メニューバーのPackageと同じ)。

f:id:heroween:20140606182819p:plain

メニューの中からMark for Installationを選択すると、□にインストールマークが表示される。もし、対象を誤った場合は再びポップアップメニューを開いてUnmarkを選択すれば消える。

f:id:heroween:20140606182848p:plain

この状態でメニューバーのInsallationからApply Changesを選択する。

f:id:heroween:20140606183409p:plain

するとアクション選択ウィンドウが開き、インストール対象となるパッケージ群が表示される(アップグレードやリムーブ対象があればそれぞれ表示される)。確認を行い問題が無ければApplyを、変更があればDeferを、中止したければDiscardをクリックする。

f:id:heroween:20140606183509p:plain

DeferとDiscardをクリックするといずれもパッケージリストに戻るが、Dederだとパッケージに付与したマークはそのままで、Discardだとマークが消えてしまう。間違えると場合によっては面倒な事に。

今回は問題無いのでApplyをクリックしてインストールを開始。各パッケージのダウンロードが始まる。

f:id:heroween:20140606184304p:plain

パッケージのダウンロードに失敗すると以下のようなエラーメッセージが表示されるが、OKをクリックするとそのまま次の過程に進行していく。

f:id:heroween:20140606184721p:plain

全てのパッケージのダウンロードが完了すると、ダイアログが表示されてインストールが始まる。Detailsでインストールの過程を確認する事ができる。

f:id:heroween:20140606184800p:plain

全てのパッケージのインストールが完了したらCloseをクリックで終了。パッケージリストを確認すると、インストール済みパッケージは□の色が緑になっている。

f:id:heroween:20140606184817p:plain

ダウンロードに失敗したパッケージはインストールマークがついたままなので、再度インストールを行うなり、Unmarkするなりしておいた方が良い。

f:id:heroween:20140606184940p:plain

パッケージのアップグレード、再インストール、リムーブについても、対象のパッケージにするマークの種別が異なるところ以外は殆ど同様の手順となるので、特に迷わず操作をできるだろう。

MinGWの基本パッケージ群をインストールした直後のフォルダ構成は以下の通り。mingw-get以外のパッケージがビルドされて、ヘッダファイルとオブジェクトファイルの入ったフォルダが追加されている。

MinGW
 ├bin      バイナリ
 ├include  ヘッダファイルlib      オブジェクトファイル
 ├libexec  exeやdllとか
 ├mingw32  mingw32-gcc
 ├share    ドキュメントとか
 └var      キャッシュ、パッケージ定義ファイルとか

mingw32フォルダも追加されており、中にはmingw32-gccが配置されている。が、gccはbinにも配置されている。これは恐らくクロスコンパイラとかmingw64ネイティブコンパイラ共存させる為にあるものと思われるが、ちょっと調べた限りでは正確なところがよく分からなかった。

パッケージのインストール:CUI

続いてCUIを使った場合。コマンドプロンプトからmingw-getを実行してみる(上述したが、バイナリのパスを通し忘れないように)。

C:¥Users¥heroween>mingw-get

と、mingw-getコマンドをオプションもアクションも付与しないで実行すると、GUIが起動する(GUIを有効にしていない場合はエラーのポップアップが出る)。また、GUIが起動した状態でコマンドを叩くとCUI側にロックされているというメッセージが出て実行できない。

mingw-getコマンドの使い方はhelpを見れば大体分かるので参照する。

C:¥Users¥heroween>mingw-get --help
Manage MinGW and MSYS installations (command line user interface).

Usage:
  mingw-get [OPTIONS] ACTION [package-spec[version-bounds] ...]

  mingw-get update
  mingw-get [OPTIONS] {install | upgrade | remove} package-spec ...
  mingw-get [OPTIONS] {show | list} [package-spec ...]

Options:
  --help, -h        Show this help text

  --version, -V     Show version and licence information

  --verbose, -v     Increase verbosity of diagnostic or
                    progress reporting output; repeat up
                    to three times for maximum verbosity
  --verbose=N       Set verbosity level to N; (0 <= N <= 3)

  --trace=N         Enable tracing feature N; (debugging aid)

  --reinstall       When performing an install or upgrade
                    operation, reinstall any named package
                    for which the most recent release is
                    already installed

  --recursive       Extend the scope of "install --reinstall"
                    or of "upgrade", such that the operation
                    is applied recursively to all prerequisites
                    of all packages named on the command line

  --download-only   Download the package archive files which
                    would be required to complete the specified
                    install, upgrade, or source operation, but
                    do not unpack them, or otherwise proceed
                    to complete the operation

  --print-uris      Display the repository URIs from which
                    package archive files would be retrieved
                    prior to performing the specified install,
                    upgrade, or source operation, but do not
                    download any package file, or otherwise
                    proceed with the operation

  --all-related     When performing source or licence operations,
                    causes mingw-get to retrieve, and optionally to
                    unpack the source or licence archives for all
                    runtime prerequisites of, and in addition to,
                    the nominated package

  --desktop[=all-users]
                    Enable the creation of desktop shortcuts, for
                    packages which provide the capability via pre-
                    or post-install scripts; the optional 'all-users'
                    qualifier requests that all such shortcuts are
                    to be made available to all users; without it
                    shortcuts will be created for current user only

                    Note that specification of this option does not
                    guarantee that shortcuts will be created; the
                    onus lies with individual package maintainers
                    to provide scripting to support this capability

  --start-menu[=all-users]
                    Enable the creation of start menu shortcuts, for
                    packages which provide the capability via pre-
                    or post-install scripts; the optional 'all-users'
                    qualifier requests that all such shortcuts are
                    to be made available to all users; without it
                    shortcuts will be created for current user only

                    Note that specification of this option does not
                    guarantee that shortcuts will be created; the
                    onus lies with individual package maintainers
                    to provide scripting to support this capability

Actions:
  update            Update local copy of repository catalogues
  list, show        List and show details of available packages
  source            Download and optionally unpack package sources
  licence           Download and optionally unpack licence packages,
                    handling them as if they are source packages
  install           Install new packages
  upgrade           Upgrade previously installed packages
  remove            Remove previously installed packages

Package Specifications:
  [subsystem-]name[-component]:
  msys-bash-doc     The 'doc' component of the bash package for MSYS
  mingw32-gdb       All components of the gdb package for MinGW

Version Bounds (for install or upgrade actions):
  {>|>=|=|<=|<}major[.minor[.rev]][-subsystem-major[.minor[.rev]]]:
  "gcc=4.5.*"       Latest available release of GCC version 4.5.x
  "gcc<4.6"         Alternative representation for GCC version 4.5.x

Use 'mingw-get list' to identify possible package names, and the
components associated with each.

Quote package names with attached version bounds specifications, to
avoid possible misinterpretation of shell operators.  Do NOT insert
white space at any point within any "package-spec[version-bounds]"
specification string.

インストールのコマンドも分かったので、今度はMSYSの基本パッケージ群をインストールしてみる。

C:\Users\heroween>mingw-get install msys-base
http://prdownloads.sourceforge.net/mingw/msysCORE-1.0.18-1-msys-1.0.18-lic.tar.lzma?download
11.52 kB / 11.52 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/msysCORE-1.0.18-1-msys-1.0.18-doc.tar.lzma?download
7.79 kB / 7.79 kB       |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libiconv-1.14-1-msys-1.0.17-dll-2.tar.lzma?download
518.74 kB / 518.74 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/liblzma-5.0.3-1-msys-1.0.17-dll-5.tar.lzma?download
68.72 kB / 68.72 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libintl-0.18.1.1-1-msys-1.0.17-dll-8.tar.lzma?download
22.11 kB / 22.11 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/make-3.81-3-msys-1.0.13-bin.tar.lzma?download
76.84 kB / 76.84 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/less-436-2-msys-1.0.13-bin.tar.lzma?download
184.85 kB / 184.85 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma?download
205.63 kB / 205.63 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/tar-1.23-1-msys-1.0.13-bin.tar.lzma?download
136.05 kB / 136.05 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/sed-4.2.1-2-msys-1.0.13-bin.tar.lzma?download
60.97 kB / 60.97 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/xz-5.0.3-1-msys-1.0.17-bin.tar.lzma?download
35.74 kB / 35.74 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/gzip-1.3.12-2-msys-1.0.13-bin.tar.lzma?download
36.39 kB / 36.39 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/grep-2.5.4-2-msys-1.0.13-bin.tar.lzma?download
60.93 kB / 60.93 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libmagic-5.04-1-msys-1.0.13-dll-1.tar.lzma?download
241.70 kB / 241.70 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/file-5.04-1-msys-1.0.13-bin.tar.lzma?download
103.25 kB / 103.25 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma?download
123.02 kB / 123.02 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma?download
92.09 kB / 92.09 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma?download
150.93 kB / 150.93 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/dos2unix-6.0.5-1-msys-1.0.17-bin.tar.lzma?download
41.06 kB / 41.06 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/coreutils-5.97-3-msys-1.0.13-bin.tar.lzma?download
288.85 kB / 288.85 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/zlib-1.2.7-1-msys-1.0.17-dll.tar.lzma?download
39.76 kB / 39.76 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/msysCORE-1.0.18-1-msys-1.0.18-bin.tar.lzma?download
596.49 kB / 596.49 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/termcap-0.20050421_1-2-msys-1.0.13-bin.tar.lzma?download
19.57 kB / 19.57 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma?download
35.32 kB / 35.32 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma?download
14.34 kB / 14.34 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libbz2-1.0.6-1-msys-1.0.17-dll-1.tar.lzma?download
25.98 kB / 25.98 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/msysCORE-1.0.18-1-msys-1.0.18-ext.tar.lzma?download
7.68 kB / 7.68 kB       |================================================| 100%
http://prdownloads.sourceforge.net/mingw/bzip2-1.0.6-1-msys-1.0.17-bin.tar.lzma?download
18.26 kB / 18.26 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/bash-3.1.17-4-msys-1.0.16-bin.tar.lzma?download
231.70 kB / 231.70 kB   |================================================| 100%
install: msysCORE-1.0.18-1-msys-1.0.18-lic.tar.lzma
 installing msysCORE-1.0.18-1-msys-1.0.18-lic.tar.lzma
install: msysCORE-1.0.18-1-msys-1.0.18-doc.tar.lzma
 installing msysCORE-1.0.18-1-msys-1.0.18-doc.tar.lzma
install: libiconv-1.14-1-msys-1.0.17-dll-2.tar.lzma
 installing libiconv-1.14-1-msys-1.0.17-dll-2.tar.lzma
install: liblzma-5.0.3-1-msys-1.0.17-dll-5.tar.lzma
 installing liblzma-5.0.3-1-msys-1.0.17-dll-5.tar.lzma
install: libintl-0.18.1.1-1-msys-1.0.17-dll-8.tar.lzma
 installing libintl-0.18.1.1-1-msys-1.0.17-dll-8.tar.lzma
install: make-3.81-3-msys-1.0.13-bin.tar.lzma
 installing make-3.81-3-msys-1.0.13-bin.tar.lzma
install: less-436-2-msys-1.0.13-bin.tar.lzma
 installing less-436-2-msys-1.0.13-bin.tar.lzma
install: texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma
 installing texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma
install: tar-1.23-1-msys-1.0.13-bin.tar.lzma
 installing tar-1.23-1-msys-1.0.13-bin.tar.lzma
install: sed-4.2.1-2-msys-1.0.13-bin.tar.lzma
 installing sed-4.2.1-2-msys-1.0.13-bin.tar.lzma
install: xz-5.0.3-1-msys-1.0.17-bin.tar.lzma
 installing xz-5.0.3-1-msys-1.0.17-bin.tar.lzma
install: gzip-1.3.12-2-msys-1.0.13-bin.tar.lzma
 installing gzip-1.3.12-2-msys-1.0.13-bin.tar.lzma
install: grep-2.5.4-2-msys-1.0.13-bin.tar.lzma
 installing grep-2.5.4-2-msys-1.0.13-bin.tar.lzma
install: libmagic-5.04-1-msys-1.0.13-dll-1.tar.lzma
 installing libmagic-5.04-1-msys-1.0.13-dll-1.tar.lzma
install: file-5.04-1-msys-1.0.13-bin.tar.lzma
 installing file-5.04-1-msys-1.0.13-bin.tar.lzma
install: findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma
 installing findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma
install: diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma
 installing diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma
install: gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma
 installing gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma
install: dos2unix-6.0.5-1-msys-1.0.17-bin.tar.lzma
 installing dos2unix-6.0.5-1-msys-1.0.17-bin.tar.lzma
install: coreutils-5.97-3-msys-1.0.13-bin.tar.lzma
 installing coreutils-5.97-3-msys-1.0.13-bin.tar.lzma
install: zlib-1.2.7-1-msys-1.0.17-dll.tar.lzma
 installing zlib-1.2.7-1-msys-1.0.17-dll.tar.lzma
install: msysCORE-1.0.18-1-msys-1.0.18-bin.tar.lzma
 installing msysCORE-1.0.18-1-msys-1.0.18-bin.tar.lzma
install: termcap-0.20050421_1-2-msys-1.0.13-bin.tar.lzma
 installing termcap-0.20050421_1-2-msys-1.0.13-bin.tar.lzma
install: libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma
 installing libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma
install: libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma
 installing libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma
install: libbz2-1.0.6-1-msys-1.0.17-dll-1.tar.lzma
 installing libbz2-1.0.6-1-msys-1.0.17-dll-1.tar.lzma
install: msysCORE-1.0.18-1-msys-1.0.18-ext.tar.lzma
 installing msysCORE-1.0.18-1-msys-1.0.18-ext.tar.lzma
install: bzip2-1.0.6-1-msys-1.0.17-bin.tar.lzma
 installing bzip2-1.0.6-1-msys-1.0.17-bin.tar.lzma
install: bash-3.1.17-4-msys-1.0.16-bin.tar.lzma
 installing bash-3.1.17-4-msys-1.0.16-bin.tar.lzma
install: msys-base-2013072300-msys-bin.meta
 installing msys-base-2013072300-msys-bin.meta

これでインストール完了。インストールするパッケージの名前が分かっていればGUIより少ない手順で済む。

MSYSのパッケージについては、MinGWのインストールフォルダの直下にmsysフォルダが作成されて、そちらの方にインストールされる事になる。

MinGW
 ├bin      バイナリ
 ├include  ヘッダファイル
 ├lib      オブジェクトファイル
 ├libexec  exeやdllとか
 ├mingw32  mingw32-gccmsys     MSYSパッケージ
 ├share    ドキュメントとか
 └var      キャッシュ、パッケージ定義ファイルとか

msysフォルダ以下はこんな感じ。

msys
 └1.0
   ├bin          バイナリ
   ├etc          設定ファイル
   ├postinstall  MSYSのインストールバッチ
   ├sbin         バイナリ
   └share        awkスクリプト、ドキュメントとか

MSYSについてもバイナリのパスは自動で通らないので、MinGW同様に環境変数PATHにC:¥MinGW¥msys¥1.0¥binを設定する。MinGWのインストールフォルダを変えていれば(以下略。

sshrsyncのインストール

mingw-getの使い方が一通り分かったところで、本題であるsshrsyncのインストールを行おう。

sshrsyncはMSYSのパッケージがあるので、以下のコマンドを実行してインストールする。

C:\Users\heroween>mingw-get install msys-openssl msys-openssh msys-rsync
http://prdownloads.sourceforge.net/mingw/libpopt-1.15-2-msys-1.0.13-dll-0.tar.lzma?download
207.48 kB / 207.48 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libopenssl-1.0.0-1-msys-1.0.13-dll-100.tar.lzma?download
654.91 kB / 654.91 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/openssl-1.0.0-1-msys-1.0.13-bin.tar.lzma?download
315.05 kB / 315.05 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/openssl-1.0.0-1-msys-1.0.13-doc.tar.lzma?download
238.07 kB / 238.07 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/openssl-1.0.0-1-msys-1.0.13-lic.tar.lzma?download
2.11 kB / 2.11 kB       |================================================| 100%
http://prdownloads.sourceforge.net/mingw/libminires-1.02_1-2-msys-1.0.13-dll.tar.lzma?download
11.40 kB / 11.40 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/openssh-5.4p1-1-msys-1.0.13-bin.tar.lzma?download
274.71 kB / 274.71 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/openssh-5.4p1-1-msys-1.0.13-doc.tar.lzma?download
77.02 kB / 77.02 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/openssh-5.4p1-1-msys-1.0.13-lic.tar.lzma?download
4.79 kB / 4.79 kB       |================================================| 100%
http://prdownloads.sourceforge.net/mingw/rsync-3.0.8-1-msys-1.0.17-bin.tar.lzma?download
163.12 kB / 163.12 kB   |================================================| 100%
http://prdownloads.sourceforge.net/mingw/rsync-3.0.8-1-msys-1.0.17-doc.tar.lzma?download
95.64 kB / 95.64 kB     |================================================| 100%
http://prdownloads.sourceforge.net/mingw/rsync-3.0.8-1-msys-1.0.17-lic.tar.lzma?download
11.23 kB / 11.23 kB     |================================================| 100%
install: libpopt-1.15-2-msys-1.0.13-dll-0.tar.lzma
 installing libpopt-1.15-2-msys-1.0.13-dll-0.tar.lzma
install: libopenssl-1.0.0-1-msys-1.0.13-dll-100.tar.lzma
 installing libopenssl-1.0.0-1-msys-1.0.13-dll-100.tar.lzma
install: openssl-1.0.0-1-msys-1.0.13-bin.tar.lzma
 installing openssl-1.0.0-1-msys-1.0.13-bin.tar.lzma
install: openssl-1.0.0-1-msys-1.0.13-doc.tar.lzma
 installing openssl-1.0.0-1-msys-1.0.13-doc.tar.lzma
install: openssl-1.0.0-1-msys-1.0.13-lic.tar.lzma
 installing openssl-1.0.0-1-msys-1.0.13-lic.tar.lzma
install: libminires-1.02_1-2-msys-1.0.13-dll.tar.lzma
 installing libminires-1.02_1-2-msys-1.0.13-dll.tar.lzma
install: openssh-5.4p1-1-msys-1.0.13-bin.tar.lzma
 installing openssh-5.4p1-1-msys-1.0.13-bin.tar.lzma
install: openssh-5.4p1-1-msys-1.0.13-doc.tar.lzma
 installing openssh-5.4p1-1-msys-1.0.13-doc.tar.lzma
install: openssh-5.4p1-1-msys-1.0.13-lic.tar.lzma
 installing openssh-5.4p1-1-msys-1.0.13-lic.tar.lzma
install: rsync-3.0.8-1-msys-1.0.17-bin.tar.lzma
 installing rsync-3.0.8-1-msys-1.0.17-bin.tar.lzma
install: rsync-3.0.8-1-msys-1.0.17-doc.tar.lzma
 installing rsync-3.0.8-1-msys-1.0.17-doc.tar.lzma
install: rsync-3.0.8-1-msys-1.0.17-lic.tar.lzma
 installing rsync-3.0.8-1-msys-1.0.17-lic.tar.lzma

各々のコマンドを実行しバージョンを確認。

C:\Users\heroween>ssh -v
OpenSSH_5.4p1, OpenSSL 1.0.0 29 Mar 2010
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

C:\Users\heroween>rsync --version
rsync  version 3.0.8  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    32-bit files, 32-bit inums, 32-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, no IPv6, batchfiles, inplace,
    append, ACLs, no xattrs, iconv, no symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

これでWindows上でもsshrsyncが使えるようになった。一先ず目的は達成。

折角MSYSを入れたので、暇があったらminttyを使ってみようかと思うが、その辺りの事は気が向いたら書こう。