はじめに
我が家のWindowsを撤廃してしまおうと思い、メインのサーバをUbuntu Serverにしました。
ところが、これまでWindows上で使っていたモノはほぼUbuntu上で実現できたものの、どうしてもWindowsでしか使えないモノが残ってしまいました。しかし、それはごく稀に必要になるだけです。
そこで、Ubuntuにインストール済みのVirtualBoxでWindowsを動かします。
ただし、UbuntuにはXを入れていないので、GUI操作はできません。
なので、下記のように環境を構築しました。
- GUI操作できる環境下のVirtualBox上で、Windows7をインストールしたイメージファイルを作成する
- Windows7をインストールしたイメージファイルからVagrant Boxを作成する
- Ubuntu Server上でWindowsを起動する
- Remote Desktop経由でWindowsにログインする
Windows7をvagrant upするのはUbuntu Server上で、そのインスタンスは1個だけ(自分が使うだけ)です。
必要になる機材、ソフトウェアなど
必要になる機材というか、こういう環境下で動かしたかったというだけなんですが…。
- MacBook Air with Yosemite
- Ubuntu Server 14.04.1 LTS
上記マシンそれぞれにインストールするVirtualBoxとvagrantのバージョンは揃えました。また、ここで使用するvagrant plugin、vagrant-windowsがサポートするWindowsのバージョンに制限があるので、ここに記載されているバージョン以外の組み合わせで試す際にはご注意ください。
- VirtualBox 4.3.10
- vagrant 1.6.5
- vagrant-windows plugin 1.6.0
構築手順
GUI操作できる環境下のVirtualBox上で、Windows7をインストールしたイメージファイルを作成する
ここの手順はMacで行いました。
VirtualBoxを使ったWindows7インストール手順については、普通にGUI操作するだけなので、詳細は省きます。ここでのキモは、WinRMの設定です。
- ここからVirtualBoxをダウンロードしてインストールする。
- VirtualBoxマネージャ(GUI)を起動して、Windows7を新規インストールする。仮想マシンの名前を、ここでは仮にespresso_win7とする。
- Windows7に、VirtualBox Guest Additionをインストールする。(後で入れるのは面倒なので…)
- Windows7のリモートデスクトップ機能を有効化する。
-
後でWindowsをリモート操作するため、vagrant-windows pluginのreadmeを参考に、Windows7のコマンドプロンプト上で下記のようにWinRMを設定する。
configure_winrmwinrm 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
設定が一通り完了したら、Windowsの電源を落とす。
Windowsをインストールしたイメージファイルからvagrant boxを作成する
ここの手順もMacで行いました。
MacとUbuntuとでvagrantのバージョンを揃えるため、公式サイトからインストールパッケージをダウンロードして手動でインストールしていきます。
- ここからvagrantをダウンロード、インストールする。
-
vagrant-windows pluginをインストールする。
plugin_install$ sudo vagrant plugin install vagrant-windows
-
boxファイルを作成する。ここで--baseオプション引数に指定している文字列には、VirtualBoxで作成した仮想マシンの名前を指定する。--outputオプション引数に指定しているboxファイル名は適当でよい。
package$ vagrant package --base "espresso_win7" --output espress_win7_20141223.box
-
作成したboxファイルをUbuntu Server側に転送する。ここでは仮にvagrantユーザのhome下とする。
scp$ scp espress_win7_20141223.box ubuntu_server.local.net:/home/vagrant/boxes/
Ubuntu Server上でWindowsを起動する
ここの手順はUbuntu Server上で行います。
- ここからVirtualBoxをダウンロードしてインストールする。
-
VirtualBoxのExtention Packをインストールする。
install_extpack$ sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.3.10-93012.vbox-extpack
-
Vagrantfileを作成する。ここでは/home/vagrant/win7/下にする。
create_vagrantfile$ mkdir -p /home/vagrant/win7 $ vi /home/vagrant/win7/Vagrantfile
Vagrantfile# -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Configure base box parameters config.vm.box = "vagrant-windows7sp1" config.vm.box_url = "/home/vagrant/boxes/espress_win7_20141223.box" config.vm.guest = :windows # Ensure that all networks are set to private config.windows.set_work_network = true # Port forward WinRM and RDP config.vm.network :forwarded_port, guest: 3389, host: 3389 config.vm.network :forwarded_port, guest: 5985, host: 5985, id: "winrm", auto_correct: true end
-
Windows7を起動する。
boot_win7$ cd /home/vagrant/win7/ $ vagrant up Bringing machine 'default' up with 'virtualbox' provider... [default] Clearing any previously set forwarded ports... [default] Clearing any previously set network interfaces... [default] Preparing network interfaces based on configuration... [default] Forwarding ports... [default] -- 22 => 2222 (adapter 1) [default] -- 3389 => 3389 (adapter 1) [default] -- 5985 => 5985 (adapter 1) [default] Booting VM... [default] Waiting for machine to boot. This may take a few minutes... [default] Machine booted and ready! Sorry, don't know how to check guest version of Virtualbox Guest Additions on this platform. Stopping installation. [default] Mounting shared folders... [default] -- /vagrant [default] VM already provisioned. Run `vagrant provision` or use `--provision` to force it
Remote Desktop経由でWindowsにログインする
ここの手順はMacで行います。
-
Microsoft Remote Desktopをインストールして起動し、Windows接続用の設定を新規作成する。
- 接続する。
- あとは普通に操作できる。
おまけ
VagrantfileのVagrant.configure(VAGRANTFILE_API_VERSION) do |config|
スコープ内に以下のコードを追加すると、bridgeタイプのNICを仮想マシンに追加することができます。
# Local networking
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--nic2", "bridged"]
vb.customize ["modifyvm", :id, "--nictype2", "82540EM"]
vb.customize ["modifyvm", :id, "--nicpromisc2", "allow-all"]
vb.customize ["modifyvm", :id, "--cableconnected2", "on"]
vb.customize ["modifyvm", :id, "--bridgeadapter2", "eth0"]
end
同様に、Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
スコープ内に以下のコードを追加すると、仮想マシンにpass throughする形でホストマシンの光学ドライブを追加できます。
これで、例えば仮想マシン上でBDを焼くことも可能になります。
# Directly mount the host drive.
config.vm.provider :virtualbox do |vb|
vb.customize ["storageattach", :id, "--storagectl", "SATA", "--port", "1", "--type", "dvddrive", "--medium", "host:/dev/sr0", "--passthrough", "on"]
end
これらのコマンド、オプションについての詳細は、VirtualBoxのVBoxManageコマンドヘルプに記載されています。他にもいろいろできそう。