azukipochette's weblog

memory dump (mini)

いまどきの 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 をインストールします。通常のインストール方法と同じです。

インストール後、コンピューターを再起動します。

設定の変更

次の設定を変更する必要があります。

  1. UAC の無効化
  2. 複雑なパスワードの無効化
  3. シャットダウンの記録の無効化
  4. "サーバー マネージャーをログイン時に起動する"の無効化

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

参考情報