CentOS 7のHyper-V provider用boxを作成、運用する


概要

VagrantのHyper-V用boxを作成、運用する。ゲストOSはCentOS 7とする。

Hyper-V用のboxを作成する

Hyper-V マネージャーで以下の構成の仮想マシンを作成する。

  
名前 何でも良いがここではCentOS-7.0-x86_64-minimalとする。
仮想マシンの世代 第2世代
ハードディスク 127GB
メモリ 動的メモリ 使用する
スタートアップ RAM 768MB
最小 RAM 512MB
ファームウェア セキュアブート有効のチェックを外す

CentOSのインストール

CentOSについてはnetinstallかminimalのISOをダウンロードしてインストールする。
細かい手順については割愛するが、rootのパスワードをvagrantとすることと、ユーザvagrantを作成してこちらのパスワードもvagrantとすることがポイント。

仮想OS上での作業

CentOSをインストールしたらrootでログインして以下の作業を行う。
なお、この項で示すコマンドの先頭にある#や$はプロンプトなので入力する必要はない。
例えば

# ls

と記載してある場合、rootユーザでlsコマンドを実行するという意味であって、# lsと入力するわけではない。

インストールされたパッケージの最新化

シェル上で

# yum update

としてインストールされたパッケージを最新化する。

sudoersファイルの編集

シェル上で

# visudo

として、sudoersファイルに下記内容を追記する。

Defaults:vagrant !requiretty
vagrant ALL=(ALL) NOPASSWD: ALL

sshdの設定

/etc/ssh/sshd_configを編集して、
UseDNSをnoに、PubkeyAuthenticationをyesに変更する。

Hyper-V Key-Value Pair(KVP) daemonのインストールと自動起動設定

Hyper-V マネージャがゲストのIPアドレスを取得できるよう、Hyper-V KVP daemonをインストールする。
シェル上で、

# yum install hypervkvpd

とすることでインストールできる。デフォルトでhypervkvpdはOS起動時に自動起動するようになっているが、もしなっていない場合は

# systemctl enable hypervkvpd

として自動起動するよう設定する。

カーネルパラメータの編集

Best Practices for running Linux on Hyper-Vにある通りカーネルパラメータを変更する。
より具体的には/etc/default/grubを編集し、GRUB_CMDLINE_LINUXの末尾にnuma=off elevator=noopを追加する。
/etc/default/grubの編集が終わったらシェル上で

# /sbin/grub2-mkconfig -o /etc/grub2-efi.cfg

として、編集内容をgrubに反映させる。

初回vagrant up用のSSH公開鍵の取得

1回目のvagrant upのためにSSH公開鍵を取得する。

# su - vagrant
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ curl -o ~/.ssh/authorized_keys https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 600 ~/.ssh/authorized_keys
$ exit

上記で取得した公開鍵に対応する秘密鍵は
Githubのリポジトリ上にある。
この秘密鍵はOpenSSH用のため、Puttyで使用するためにはputtygenで変換する必要があることに注意。

一旦再起動

ここまで終わったらシェル上で

# shutdown -r now

としてゲストOSを一旦再起動する。再起動したら前述した秘密鍵で仮想マシンにSSHでログインしてみる。
無事SSHでログインできたら、そのままSSHで続きの作業を行う。

yumのキャッシュ削除

仮想ハードディスクの容量削減のため、

$ sudo yum clean all

としてyumのキャッシュを削除する。

コマンド履歴の消去

必ずしも必要な作業ではないが、box作成時のコマンド履歴を消しておきたいときにはシェル上で以下のようにする。

$ unset HISTFILE
$ echo -n > ~/.bash_history
$ sudo sh -c "echo -n > /root/.bash_history"

ゲストOSのシャットダウン

ここまでくればゲストOS上での作業は終わりなので、シェル上で

sudo shutdown -h now

としてゲストOSをシャットダウンする。

Windows上での作業

仮想マシンのエクスポート

Hyper-V マネージャで仮想マシンをエクスポートする。
ここではエクスポート先をC:\tmp\boxとする。

boxを構成するファイルの準備

エクスポートが完了したら、エクスポート先のSnapshotsフォルダを削除する。
次にエクスポート先のVirtual Hard Disks, Virtual Machinesフォルダがある階層で、metadata.jsonファイルを以下の内容で作成する。
"name"は何でも良い(無くても良い)が、"provider": "hyperv"は必要なので必ず記述する。

{
    "name": "no17/centos-7.0-x86_64-minimal-hyperv",
    "provider": "hyperv"
}

boxファイルの作成

エクスポート先のVirtual Hard Disks, Virtual Machinesフォルダ、metadata.jsonファイルがある階層をルートとしてzipで圧縮する。圧縮したファイルの拡張子は.boxとする。
ここではC:\tmp\box\centos-7.0-x86_64-minimal-hyperv.boxとする。

Vagrantのスクリプトの修正

Vagrantのバージョン1.7.1ではboxのセキュアブート設定が無視されてしまうため、そのままでboxが起動しない。
最新版のVagrantで対応されるまで、Vagrantのリポジトリにコミットされた修正を基に/embedded/gems/gems/vagrant-1.7.1/plugins/providers/hyperv/scripts/import_vm.ps1に以下の記述を追加する。

# Determine secure boot options
$secure_boot_enabled = (Select-Xml -xml $vmconfig -XPath "//secure_boot_enabled").Node."#text"
# Set EFI secure boot 
if ($secure_boot_enabled -eq "True") {
    Set-VMFirmware -VM $vm -EnableSecureBoot On
}  else {
    Set-VMFirmware -VM $vm -EnableSecureBoot Off
}

boxの追加と起動

管理者権限で起動したコマンドプロンプト、またはPowershellで

vagrant box add no17/centos-7.0-x86_64-minimal-hyperv \box\centos-7.0-x86_64-minimal-hyperv.box
vagrant init no17/centos-7.0-x86_64-minimal-hyperv
vagrant up --provider hyperv

とすることで起動させることができる。
初回起動時には仮想マシンのネットワークアダプタをHyper-Vのどの仮想ネットワークアダプタに紐付けるか決めるよう促される他、SSH公開鍵が新たに生成されたものに置き換えられる。
生成されたSSH公開鍵に対応する秘密鍵は.vagrant\machines\default\hypervにprivate_keyという名前で保存されている。
この秘密鍵はOpenSSH形式なので、Puttyで使用する場合にはputtygenで変換する必要がある。
また、初回起動時に限らず毎回ホストとゲスト間でのフォルダ共有のためWindowsにログインするためのユーザ名とパスワードを尋ねられるので注意。