OSの評価・機能検証には、手軽に作ったり消したりできる環境があると便利です。Windows Server 2012 R2 の評価環境を Vagrant で手軽にデプロイできるよう Box を作成してみましたので、手順をまとめておきます。
(Windows Server 2012 R2インストールには、マイクロソフトTechnetからダウンロードした180日の評価版を使っています。)
いきなりですが注意点から Windowsは、インストール直後からとにかく仮想ディスクが大きくなります。さらに、Windows Updateなどで汚すとあっという間に肥大化します。クローニング等でこの仮想ディスクをコピーする時間はとてもストレスになりますので、できればSSDを使った方が良いです。また、Windows Updateをすると TiWorker.exeがCPUをバカ食いして重くなることがあります。極力、Windows Updateは、Box作成時に済ませておいた方が良いでしょう。また、Feature on Demandで機能を追加する際も Windows Updateからではなく、インストールメディア(イメージ)から追加することをお勧めします。
なお、末尾に参考とさせていただいたブログ、マニュアルや書籍等をまとめて記載させていただいています。
#ロードマップ
Box作成の大まかな手順は以下のようになります。
- 仮想マシンの作成
- 仮想マシンの設定
- OSのインストール
- Guest Additionのインストール
- Vagrant Base Boxにするための設定
- Windows Update の設定と更新プログラムを適用
- インストールされていない役割や機能のバイナリの削除(オプション)
- 追加のアプリケーションのインストール(オプション)
- 解放された領域をゼロで埋める(オプション)
- Vagrant Base Box を作成
- Vagrant環境にを Box を追加
- デプロイテスト
- RDP接続テスト
#仮想マシンを作成する
VirtulBox マネージャーを起動して、新規仮想マシンを作成します。名前とオペレーティングシステムの設定は下記のとおりにしました。「名前」は任意の名前で大丈夫です。
「次へ(N)」をクリックするとメモリーサイズを指定するダイアログが表示されます。
VirtualBoxが提案してきた2GBのままとしました。メモリー搭載量が少ない環境の場合は、1GB程度にしても良いかもしれません。
「次へ(N)」をクリックするとハードドライブを指定するダイアログが表示されます。
「仮想ハードドライブを作成する(C)」を選びます。
「作成」をクリックするとハードドライブのファイルタイプを指定するダイアログが表示されます。デフォルトの「VDI(VirtualBox Disk Image)」を選択します。
「次へ(N)」をクリックすると「物理ハードドライブにあるストレージ」というダイアログが表示されます。「可変サイズ(D)」を指定します。
「次へ(N)」をクリックするとファイルの場所とサイズを指定するダイアログが表示されます。場所は、デフォルトのままとするか任意の場所を指定します。サイズは、VirtualBoxが提案してきた25GBとしました。
「作成」をクリックするとダイアログが閉じて、VirtualBoxマネージャーの左側のウィンドウに新しい仮想マシン(Windows Server 2012R2)が作成されています。
#仮想マシンの設定
メニューから「仮想マシン(M)」、「設定(S)」の順に選択し、設定ダイアログを開きます。
「高度(A)」タブを開いて、「クリップボードの共有(S)」を「双方向」に設定します(後程、コマンド入力があるコピー・ペーストができた方が効率的です)。
「システム」、「マザーボード(M)」タブの順に選択し、「フロッピー」の左のチェックボックスのチェックをはずします。
PCの搭載コア数に余裕があれば、プロセッサ数は、2とすることをお勧めします。
「プロセッサー(P)」タブを選択し、「プロセッサー数(P)」を2に設定します。1CPUでもインストール、動作に問題はありませんが、後程 Windows Updateをする際に1CPUだと TiWorker.exeのCPU使用率が100%に達してしまう時間帯があります。Box化する際に1CPUに戻します。なお、今回は4プロセッサとしてみたのですが、Windows Update中にもCPU使用率が50%を超えることはありませんでしたので、2CPU以上はWindows Updateでは使われないようです。(ちなみに、今回は、2012 R2 ですが、Windows 10 Technical Preview Build 9926では、1CPUではインストール終了後の再起動時に「準備しています」から先に進まなくなります。これは VirtualBoxだけではなく、Hyper-VやVMware Player でも発生しますので、Windows 10 Technical Preview Build 9926の問題のようです。)
次に「オーディオ」を選択し、「オーディオを有効化(A)」の左のチェックボックスのチェックをはずします。
「OK」をクリックしてダイアログを閉じます。
ここまでで、Windows Server 2012 R2 をインストールする仮想マシンの準備ができました。
#Windows Server 2012R2のインストール
「起動」ボタン(緑色の右矢印)をクリックし、仮想マシンを起動します。
「起動ハードディスクを選択」という名称のインストールメディアを指定するダイアログが表示されるので、ドライブ名の右にあるフォルダーアイコンをクリックして、エクスプローラー風のダイアログを開き、ダウンロードしたISOイメージを指定します。
「開く(O)」をクリックして、ファイルを選択するダイアログを閉じて、「起動」をクリックします。
上部に「キーボードの自動キャプチャー機能」と「マウス統合機能」についてメッセージが表示されます。それぞれの右端にある×印をクリックしてメッセージを消します。
言語等に変更がなければ、「次へ(N)」をクリックします。次の画面に変わります。
「今すぐインストール(I)」をクリックします。セットアップが始まります。
しばらくすると「インストールするオペレーティングシステムを選んでください(S)」という画面で停止します。
今回は、「Windows Server 2012 R2 Datacenter 評価版(GUI使用サーバ)」を選択しました。
「次へ(N)」をクリックします。「ライセンス条項」が表示されます。
同意する場合は、「同意します(A)」にチェックを入れて、「次へ(N)」をクリックします。「インストールの種類を選んでください」という画面が表示されます。
下の「カスタム(Windowsのみをインストールする)」を選びます。
「Windowsのインストールする場所を選んでください。」という画面が表示されます。
仮想マシンが数回再起動されるので、停止するまで待ちます。
「設定」という画面で停止します。
「Administratorアカウント」のパスワードを入力します。
VagrantのBase Box用には "vagrant" と設定したいところですが、デフォルトでは、Windows Server 2012 R2のパスワードの複雑性の要件を満たしていないため設定できません。試しに、"vagrant"と入れてみます。
「完了(F)」をクリックします。下記のとおり設定できません。
長さ6文字以上で、英字大文字、英字小文字、数字、記号のうち3つ以上を含むパスワードを設定します。「完了(F)」をクリックすると、次の画面で停止します。
メニューの「仮想マシン」から「Ctrl-Alt-Delを送信」を選択します。
ログイン画面となります。
先ほど設定した Administrator のパスワードを入力して「Enter」を押します。いくつか画面が変わった後、下記画面で停止します。
ネットワーク上のデバイスを探して自動的に接続するか聞いてきますので、「はい」を選択します(ネットワークの種別(NetworkCategory )を「プライベート」に設定したことになります。「パブリック」にしたい場合は、「いいえ」を選択します)。サーバーマネージャーのダッシュボードが表示された状態となります。
ここまでで、Windows Server 2012 R2のインストールは完了です。
続いて、VirtualBoxのGuest Additionをインストールし、Vagrant の Base Box とするための設定を行います。
Guest Additionのインストール
メニューから [デバイス] > [Guest Additions のCDイメージを挿入...Host+D] を選びます。画面上な何も変化はありません。「ダッシュボード」を最小化して、画面下のタスクバーにあるフォルダーアイコンをクリックして、エクスプローラーを開きます。
VirtualBox Guest Additionsと表示されたCDドライブをダブルクリックして開きます。
VBoxWindowsAdditions-amd64 をダブルクリックして起動します。
Guest Additions の Setupウィザードが開きます。「Next >」をクリックします。
インストール先のフォルダーを聞いてきます。「Next >」をクリックします。
インストールするコンポーネントを聞いてきます。「Install」をクリックします。
「Windowsセキュリティ」のダイアログが表示されますので、インストールを継続する場合は「インストール(I)」をクリックします。
Guest Additionsのインストールが始まり、完了すると下記の画面となります。
ここまでで、Guest Additionsのインストールは完了です。
Vagrant Base Boxにするための設定
メニューの「仮想マシン」から「Ctrl-Alt-Delを送信」を選択して、ログイン画面でパスワードを入力します。ログインすると自動的にサーバーマネージャーのダッシュボードが起動し、次の画面となります。
パスワードの複雑性の要件を「無効」にする
サーバー マネージャーのメニューから 「ツール(T)」 > 「ローカル セキュリティー ポリシー」 を選択します。
「セキュリティーの設定」から「アカウント ポリシー」、「パスワードのポリシー」を選択し、「複雑さの要件を満たす必要があるパスワード」 をダブルクリックします。
[無効] に設定して、「適用(A)」、「OK」の順にクリックします。
Administratorのパスワードを変更
メニューの「仮想マシン」から「Ctrl-Alt-Delを送信」を選択して、「パスワードの変更(C)」を選び、パスワードを "vagrant" に変更します。
「OK」をクリックします。(元の画面に戻ります。「ローカル セキュリティ ポリシー」ウィンドウを閉じておきます)
vagrant アカウントを作成する
サーバー マネージャーのメニューから 「ツール」、「コンピューターの管理」の順に選択します。
「システム ツール」、「ローカル ユーザーとグループ」、「ユーザー」の順に選択します。
メニューから「操作(A)」、「新しいユーザー(N)」を選びます。
ユーザー名(U): vagrant
パスワード(P): vagrant
として、「ユーザーは次回ログオン時にパスワードの変更が必要」 のチェックを外し、「パスワードを無期限にする」にチェックを入れます。
vagrant アカウントを管理者に変更します
今、作成した vagrant をダブルクリックして、「プリパティ」を開きます。
所属するグループに Administrators に変更するために、以下を行います。
「追加(D)」をクリックします。「グループの選択」ダイアログが表示されます。
「選択するオブジェクト名を入力してください」の下の入力ボックスへ"Administorators"と入力します。
「名前の確認(C)」をクリックします。入力が正しければ入力ボックス下記の状態となります。
所属するグループ(M):のリストにある"Users"を選択し、「削除(R)」をクリックします。"Users"が削除できたら「適用(A)」、「OK」をクリックします。
ユーザーアカウント制御(User Account Control:UAC) を無効にします。
UACは、管理者権限が必要となる操作を行おうとすると確認のダイアログを表示する機能ですが、Vagrantがvagrant up等の際にネットワーク等の設定をする際の障害となりますので、これを停止します。
サーバーマネージャーのメニューの「ツール(T)」、「システム構成」、「ツール」タブで「UAC設定の変更」を選び「起動」をクリックして「ユーザーアカウント制御の設定」を開きます。
「OK」をクリックします。「システム構成」も「OK」をクリックして閉じます。
シャットダウン イベントの追跡ツール(Shutdown Tracker)を無効にする設定
画面左下のWindowsアイコンを右クリックして、「ファイル名を指定して実行(R)」を開きます。
"gpedit.msc" と入力して 「OK」 をクリックして「ローカル グループ ポリシー エディター」を起動します。
「コンピューターの構成」、「管理者用テンプレート」、「システム」を選択し、右側の「設定」で「シャットダウン イベントの追跡ツールを表示する」(下の方にありますので、スクロールします)をダブルクリックして、下記の画面を表示します。
「適用(A)」、「OK」をクリックします。
ログイン時にサーバーマネージャーを自動的に表示しないように設定
「ローカル グループ ポリシー エディター」を使用します。起動していない場合は、上の「シャットダウン イベントの追跡ツール(Shutdown Tracker)を無効にする設定」のときと同じように起動します。
「コンピューターの構成」、「管理者用テンプレート」、「システム」、「サーバー マネージャー」を選択し、右側の「設定」で「ログオン時にサーバー マネージャーを自動的に表示しない」をダブルクリックして、下記の画面を表示します。
左上の「有効(E)」のラジオボタンをチェックします。
(自動的に表示しないようにしますので、「自動的に表示しない」を有効にします。)
「適用(A)」、「OK」をクリックします。
右上の×をクリックして、「ローカル グループ ポリシー エディター」も終了します。
WinRM を有効化する設定
画面下のタスクバーの左から3番目の青い平行四辺形のアイコンをクリックして PowerShell を起動します。
Vagrantのドキュメントでは、以下のコマンドを実行するようにと書かれています。
winrm quickconfig -q
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
winrm set winrm/config @{MaxTimeoutms="1800000"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}
sc config WinRM start= auto
ただし、MaxMemoryPerShellMBについては、MSDNドキュメントのQuota Management for Remote Shellsにデフォルトが1024で、デフォルト以下の値を設定した場合の動作はサポートされない(保証されないという意味?)と記載されていましたので、設定変更はしないこととしました。なお、今回は、PowerShellから実行しましたので、scコマンドは、"sc.exe"とする必要があります(PowerShellのSet-Content cmdletのaliasと競合し、Set-Contentが優先されるため)。
したがって、実際に PowerShellで実行したのは以下のコマンドです。
winrm quickconfig -q
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
sc.exe config WinRM start= auto
最初のコマンド(winrm quickconfig -q)実行時には下記のメッセージが出力されました。
PowerShellを終了します。
リモートデスクトップを有効化する設定
サーバーマネージャーを使用します。起動していない場合は、画面下のタスクバーの左から2番目のアイコンかスタート画面の左上から起動します。
「リモート デスクトップ」の右の「無効」をクリックして「システムのプロパティ」、「リモート」を表示します。
「このコンピュータへのリモート接続を許可する(L)」をチェックします。「リモートデスクトップ接続」というダイアログが表示されます。
「OK」をクリックします。
「システムのプロパティ」も「適用」、「OK」をクリックして閉じます。
Windows Update を設定して更新プログラムをインストール(オプション)
サーバーマネージャーを使用します。起動していない場合は、画面下のタスクバーの左から2番目のアイコンかスタート画面の左上から起動します。
「プロパティ」の右列に「Windows Update」が見えます。画面上に見えていない場合はスクロールバーを右へスライドします。
「Windows Update」の右にある「未構成」をクリックします。
「重要な更新プログラム(I)」の下の欄で「更新プログラムを確認するが、ダウンロードとインストールを行うかどうかは選択する」を選びます。これは、仮想マシン上での更新プログラム適用は重い処理であるためタイミングを選べるようにするためです。
「推奨される更新プログラム」の下のチェックボックスもチェックします。
更新プログラムの確認にはしばらく時間がかかります(今回は、3分程)。確認が終わると次の画面となります。
「更新プログラムをダウンロードしています...」のまま、「合計 0 KB、0% 完了」の表示も変わらない状態が長く続きますが、このまま待ちます。今回は、50分程かかってしまいました。
更新プログラムのインストールが終わると次の画面となります。
正常にログインできることを確認
メニューから「仮想マシン」、「Ctrl+Alt+Delを送信」を選択します。
なお、更新プログラム間の依存性の関係と思われますが、再起動後に更新プログラムの確認をすると、さらに未適用の更新プログラムが現れます。これらもインストールすべきと思いますが、常にこの2回でその時点のすべての更新プログラムをインストールできるのかどうかは不明です(未適用の更新プログラムが無くなるまで、再起動、更新プログラムのインストールを繰り返すべきなのでしょうか?)。
インストールされていない役割や機能のバイナリの削除(オプション)
Windows Server 2012 R2では、インストールされていない役割や機能のバイナリがインストール先のディスクにコピーされている。
Get-WindowsFeature
をPowerShell等で実行した際に、"Install State"が、"Available"と表示されるものが該当する。
これらは削除しても必要なときには、インストールメディアからインストールすることができる。削除する場合は以下のコマンドをPowerShell等で実行する。
Get-WindowsFeature | Where-Object { $_.InstallState -eq 'Available' } | Uninstall-WindowsFeature -Remove
バイナリの削除が終わると再起動されます。
Get-WindowsFeature
で確認すると、インストールされていないものは、"Install State"が、"Removed"となっていることがわかります。
Vagrant upした後で、削除した役割や機能をインストールする場合に備えてインストールメディアイメージをCD-ROM/DVDドライブにマウントしておきます。
VirtualBoxのコンソールビューの上部にあるメニューから「デバイス」、「CD/DVDデバイス」を選択し、インストールメディアのISOイメージを選択します。
エクスプローラーを開くと、CD ドライブ(D:)にインストールメディアイメージがマウントされていることがわかります(以前にマウントされていたGuest Additionsから表示が変わるのに少し時間がかかる場合があります)。
役割や機能を追加インストールする際に「インストールオプションの確認」画面で代替ソールパスに指定します。
追加のアプリケーションのインストール(オプション)
追加で何かアプリケーションをインストールしておきたい場合は、ここでインストールします。
ちなみに、Vagrantは、sshのポートのフォワーディングを行いますが、Windowsへsshdをインストールしたり、Windowsファイアーウォールの設定をすることまではしません。sshを使いたい場合は、CygwinのOpenSSH等をここでインストールし、Windowsファイアーウォールの設定で22番ポートへの接続を受け入れるようにしておく必要があります。
解放された領域をゼロで埋める(オプション)
インストールやWindows Updateや追加のアプリケーションのインストールの過程で削除されたファイルが占めていた領域をゼロで埋めます。これをしないとBoxにパッケージングする際に削除されたファイルの領域を含めた不必要に大きな仮想ディスクが、Boxファイルにアーカイブされる vmdk ファイルが作られてしまいます。
空き領域をゼロで埋めるには、Windows Sysinternalsに含まれる SDelete
を使用します。SDelete
は、マイクロソフトTechNet オンラインからダウンロードします。ダウンロードしたファイルを解凍すると、sdelete.exe
が現れますので、PowerShell等で、以下のとおりに実行します。
sdelete -z c:
Windows Server 2012 R2 仮想マシンをシャットダウン
左下の Windowsアイコンをクリックして右クリックして、「シャットダウンまたはサインアウト(U)」、「シャットダウン(U)」を選択します。
仮想マシンのプロセッサ数を変更
VirtualBoxマネージャーで「Windows Server 2012R2」を選択して、「システム」をクリックします。「設定」画面が表示されます。
「プロセッサ(P)」タブを選択して、「プロセッサ数(P)」を"1"に変更します。
「OK」をクリックします。
Vagrant Base Box を作成する
Boxに同梱するVagrantfile を用意する
下記のファイルを Vagrantfile という名前で用意します。Boxに同梱し デフォルトの Vagrantfile となります。Windows固有の設定があるため、これを同梱しておいた方が、個々のプロジェクトディレクトリに配置するVaigrantfileに都度書かなくて良いので便利です。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.guest = :windows
config.vm.communicator = "winrm"
if Vagrant.has_plugin?("vagrant-vbguest")
config.vbguest.auto_update = false
end
config.vm.network :forwarded_port, guest: 3389, host: 13389
config.vm.network :forwarded_port, guest: 5985, host: 15985,id: "winrm", auto_correct: true
end
パッケージング
仮想マシンをパッケージングしてBoxを作成するために、Vagrantのホスト側(VirtualBoxを実行しているPC/Mac等)で以下を実行する。
(実行するディレクトリはどこでもよいが、カレントディレクトリに Box が作成される)
$ vagrant package --base "Windows Server 2012R2" --vagrantfile Vagrantfile
==> Windows Server 2012R2: Exporting VM...
==> Windows Server 2012R2: Compressing package to: D:/Vagrant/box/package.box
ここで、--vagrantfile
には、上で用意したvagrantfileのパスを指定します。
$ mv package.box Windows2012R2.box
以上で、Windows Server 2012 R2 Datacenter Editionの Box は完成です。
Vagrant環境にを Box を追加
$ vagrant box add --name Windows2012R2 Windows2012R2.box
==> box: Adding box 'Windows2012R2' (v0) for provider:
box: Downloading: file://D:/Vagrant/box/Windows2012R2.box
box:
==> box: Successfully added box 'Windows2012R2' (v0) for 'virtualbox'!
なお、"--name"で指定するBoxの名前はなんでもかまいません。
#テスト
##仮想マシンをデプロイするテスト
プロジェクトのディレクトリとVagrantfileの用意
$ mkdir windows2012R2-test
$ cd windows2012R2-test/
$ vagrant init Windows2012R2
A Vagrantfile
has been placed in this directory. You are now
ready to vagrant up
your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com
for more information on using Vagrant.
###仮想サーバのデプロイ
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'Windows2012R2'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: windows2012R2-test_default_1429273934115_33238
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 3389 => 13389 (adapter 1)
default: 5985 => 15985 (adapter 1)
default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
default: /vagrant => D:/Vagrant/projects/windows2012R2-test
リモートデスクトップでの接続テスト
ローカル(vagrant upしたPC)から接続する場合は、vagrant up
コマンドを使います。vagrant 1.6から導入された新しいコマンドです。
$ vagrant rdp
==> default: Detecting RDP info...
default: Address: 127.0.0.1:13389
default: Username: vagrant
==> default: Vagrant will now launch your RDP client with the connection parameters
==> default: above. If the connection fails, verify that the information above is
==> default: correct. Additionally, make sure the RDP server is configured and
==> default: running in the guest machine (it is disabled by default on Windows).
==> default: Also, verify that the firewall is open to allow RDP connections.
他のホストから接続する場合は、port番号に Vagrantfileでゲストの"3389"番portをフォワードしているport番号を指定します。上の例では、"13389"番です。
#参考情報
マニュアル
ホームページ、ブログ等
- VagrantでWindowsのBoxを無料で構築する
- Vagrant で作ったり壊したりできる Windows 環境を手に入れるまでの手順
- 使い捨てできるWindows環境(必要ソフト導入済み)の作り方
- Vagrant で Windows もゲストOSに