いまどきの Vagrant (VMWare Workstation) で Windows の Box を作る方法
Vagrant の場合、Linux などの仮想マシンは簡単に入手できるはずです。
しかし、ライセンス問題がある Windows の仮想マシンはほとんど存在しません (人気が無いのかもしれませんが...)。 そこで、Windows の Box の作成方法を示します。
VM の作成
VM の設定
ディスクは [仮想ディスクを複数のファイルに分割] を選択します (既定)。
メモリは Vagrant の資料には 512MB と書かれていますが、Windows の場合はパフォーマンスの観点から 1 GB or 2GB が良いと思います。
Windows (OS) のインストール
普通に VMWare Workstation を使用して OS をインストールするだけです。
インストール完了後、ログインするユーザーとして次を設定します (Windows Server など、複雑なパスワードにしなくてはいけない場合は、一時的に別のパスワードに設定します)。
ユーザー名: vagrant パスワード: vagrant パスワードのヒント : パスワード以外の文字列
VMWare Tools のインストール
VMWare Tools をインストールします。通常のインストール方法と同じです。
インストール後、コンピューターを再起動します。
設定の変更
次の設定を変更する必要があります。
- UAC の無効化
- 複雑なパスワードの無効化
- シャットダウンの記録の無効化
- "サーバー マネージャーをログイン時に起動する"の無効化
UAC については、Windows 8/8.1 以降の環境では下記のレジストリで無効化する必要があります (バーを下げるだけでは UAC が無効にならないため)。 注意 : 管理者権限でコマンドプロンプトを起動する必要があります。
reg add HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /d 0 /t REG_DWORD /f /reg:64
WinRMの構成
管理者権限でコマンドプロンプトを開き、次のコマンドを実行します。
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
なお、接続しているネットワークのタイプがパブリックの場合は quickconfig 時にエラーになるので事前にパブリック以外 (プライベート or ドメイン) に変更してください。
また、WinRM 1.1 (Windows Server 2008) 以前の場合は下記のコマンドも追加で必要。 ただし、Windows Server 2008R2, Windows 7 以降は不要です。
netsh firewall add portopening TCP 5985 "Port 5985" winrm set winrm/config/listener?Address=*+Transport=HTTP @{Port="5985"}
リモート デスクトップの設定
RDP 接続したい場合は、システムのプロパティを開き、リモート接続を許可するように設定を変更してください。 また、念のためファイア ウォール設定で RDP のポートを開けておきます。
その他
Windows Update 、アプリケーションのインストールなどを行います。
マシンのシャットダウン
すべての作業を終了後、VM をシャットダウンさせます。
shutdown /s /t 0 /f
パッケージング (BOX 化)
仮想マシンを作成したフォルダに移動し、下記の作業を行います。
内容物の確認
NVRAM, VMSD, VMX, VMXF, VMDK ファイルが存在することを確認します。 それ以外のファイルは削除してしまって構いません。
ディスクの最適化
なるべく BOX のサイズを小さくするためにデフラグ (-d) とシュリンク (-k) を次の手順で最適化します。 なお、ディスクを分割している場合は、メインの仮想ディスク (-snnn が付与されていないもの) に対して実行します。
"C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -d <main.vmdk> "C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k <main.vmdk>
metadata.json ファイルの作成
BOX FILE FORMAT に従って、metadata.json を用意します。 Windows 10 1607 のファイルを作成した例を示します。公式のものには、checksum などアップデートするための設定などが書かれていますが、動かすためには provider の設定があればいいだけです。
{ "name": "en_win10_1607_x86", "description": "This box contains Windows 10 Pro 1607 (x86) English.", "provider": "vmware_desktop" }
Vagrantfile ファイルの作成
下記のような Vagrantfile を用意します。特に guest と communicator が重要で、これが正しくないと起動もしません。
# -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| config.vm.guest = :windows config.vm.define "vagrant-windows-10" config.vm.box = "windows_10" config.vm.communicator = "winrm" # Admin user name and password config.winrm.username = "vagrant" config.winrm.password = "vagrant" config.windows.halt_timeout = 15 config.vm.network :forwarded_port, guest: 3389, host: 3389, id: "rdp", auto_correct: true config.vm.network :forwarded_port, guest: 22, host: 2222, id: "ssh", auto_correct: true config.vm.network :forwarded_port, guest: 5985, host: 5985, id: "winrm", auto_correct: true config.vm.provider :vmware_workstation do |v, override| #v.gui = true v.vmx["memsize"] = "2048" v.vmx["numvcpus"] = "2" v.vmx["ethernet0.virtualDev"] = "vmxnet3" v.vmx["RemoteDisplay.vnc.enabled"] = "false" v.vmx["RemoteDisplay.vnc.port"] = "5900" v.vmx["scsi0.virtualDev"] = "lsisas1068" end end
パッキング
残念ながら、vagrant package
コマンドは VirtualBox 専用なので、GZIP などの形式に圧縮します。
私は、公式のサイト通り、tar コマンドを使用して圧縮しています。
cd "E:\Virtual Machines\en_windows_10_1607_x86_vmware" tar cvzf my.box ./*
Windows に tar コマンドは普通存在しないので、GitHub Desktop などを導入して、Linux のコマンドを呼び出すのが簡単です。ZIP でも問題ないので、そこまでするかどうかは好みの問題です (私は圧縮効率で選択)。
テスト
よい子はテストしましょう。
vagrant box add <box name> <box path> vagrant init <box name> vagrant up --debug