やってること
ESXiで作成されたゲストVMをVagrant Box化したいという要望があった時に調べてやったこと。
とりあえずこれでできたけど、手順の抜け漏れがあるかも。
検証環境
検証環境は以下の通り。
-
登場人物
-
VMホスト
ESXi 6.0.0 (esxi-host) -
Vagrant変換用サーバ
CentOS 6.9 (vagrant-converter) # Minimal Desktopでインストール -
ゲストVM
CentOS 6.9 (guest-vm) # Minimalでインストール
-
VMホスト
-
使用するソフトウェア
-
VirtualBox 5.1.26
vagrant-converterとクライアントマシン(私の環境はWin7Pro)の双方にインストール -
Vagrant 2.0.0
こちらもVirtualBoxと同様
-
ovftool
VMWareが出してるツール。OVF<=>VMXの変換用
-
VirtualBox 5.1.26
事前の仕込み
vagrant-converter
NFSサーバの設定を行い、ESXiのデータストアとしてマウント
1. NFS関係のパッケージをインストール
# yum -y install nfs-utils nfs-utils-lib nfs4-acl-tools
chkconfig nfs on
# mkdir -p /vargrant/{source,boxes}
# echo "/vagrant 192.168.1.0/24(rw,no_root_squash)" >> /etc/exports
# service nfs start
# service nfs status
2. VirtualBoxをダウンロード&インストール
ここはGUIからやったほうが良いかも
# cd /usr/local/src
# wget http://download.virtualbox.org/virtualbox/5.1.28/VirtualBox-5.1-5.1.28_117968_el6-1.x86_64.rpm
# yum localinstall VirtualBox-5.1-5.1.28_117968_el6-1.x86_64.rpm
3. Vagrantをダウンロード&インストール
ここもGUIからやったほうが良いかも
# cd /usr/local/src
# wget https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.rpm
# yum localinstall vagrant_2.0.0_x86_64.rpm
4. ovftoolのインストール
VMWareのサイトからovftoolのインストーラをダウンロードしてくる
(OS/アーキテクチャの組合せなど注意。my vmwareへの登録が必要かも)
ダウンロードしてきたらSCPなどで/usr/local/src下に配置
# cd /usr/local/src
# chmod 700 VMware-ovftool-3.5.0-1274719-lin.x86_64.bundle
# ./VMware-ovftool-3.5.0-1274719-lin.x86_64.bundle
Extracting VMware Installer...done.
You must accept the VMware OVF Tool component for Linux End User
License Agreement to continue. Press Enter to proceed.[Enter]
...ライセンス条項が表示される。同意するなら[q]を入力...
Do you agree? [yes/no]:yes
The product is ready to be installed. Press Enter to begin
installation or Ctrl-C to cancel.[Enter]
Installing VMware OVF Tool component for Linux 3.5.0
Configuring...
[######################################################################] 100%
Installation was successful.
# ovftool --version
VMware ovftool 3.5.0 (build-1274719)
esxi-host
1. NFSデータストアのマウント
exportしたvagrant-converterのNFSボリュームをデータストアとしてマウントする
# esxcfg-nas -a -o vagrant-converter -s /vagrant vagrant-converter
# ls /vmfs/volumes/vagrant-converter/
boxes source
guest-vm
1. ESXi上でguest-vmを作成
インストールは割愛。
2. もろもろパッケージのインストール
VirtualBox Guest Additionsなど入れる時に必要
# yum -y install kernel-devel kernel-headers gcc gcc-c++ perl wget unzip
3. ネットワーク設定周りをいじる
MACアドレスとethを紐付ける設定が/etc/udev/rules.d/70-persistent-net.rulesに設定されているが、Vagrantで立ち上げた時に付与される仮想NICに意図しないethが割り振られるのを防ぐため/dev/nullにリンクする
# ln -sf /dev/null /etc/udev/rules.d/70-persistent-net.rules
ネットワーク設定ファイルを再定義する
# cat << 'EOF' > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
TYPE=Ethernet
BOOTPROTO=dhcp
ONBOOT=yes
NETBOOT=yes
IPV6INIT=no
EOF
4. vagrantユーザを作成する
# useradd -u 2000 vagrant
vagrantユーザでパスワードなしsudoが出来るように設定
# echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant
# chmod 400 /etc/sudoers.d/vagrant
5. 公開鍵の設定
vagrantユーザで公開鍵認証出来るように公開鍵を設定する
(コレvagrant upの時にinsecure_key使ってるからっていって再生成されちゃうみたい。Vagranfileで設定入れれば再生成を抑止できる)
# mkdir -p /home/vagrant/.ssh
# chmod 700 /home/vagrant/.ssh
# cd /usr/local/src
# wget https://github.com/hashicorp/vagrant/archive/master.zip
# unzip master.zip
# cat vagrant-master/keys/vagrant.pub >> /home/vagrant/.ssh/authorized_keys
# chmod 600 /home/vagrant/.ssh/authorized_keys
# chown -R vagrant:vagrant /home/vagrant/.ssh
# rm -rf master.zip vagrant-master
6. ゲストVMをシャットダウン
# shutdown -h now
esxi-host
1. ゲストVMをコピー
ゲストVMをVagrant Box8変換用サーバの所定ディレクトリにコピーしておく
# mkdir -p /vmfs/volumes/vagrant-converter/source/guest-vm
# \cp -p /vmfs/volumes/datastore1/guest-vm/guest-vm.vmx /vmfs/volumes/vagrant-converter/source/guest-vm/guest-vm.vmx
# vmkfstool -i /vmfs/volumes/datastore1/guest-vm/guest-vm.vmdk # /vmfs/volumes/vagrant-converter/source/guest-vm/guest-vm.vmdk -d thin
vagrant-converter
1. ovftoolでVMの形式を変換
コピーしたゲストVMをovftoolを使ってovf形式に変換する
# cd /vagrant/source/guest-vm
# ovftool guest-vm.vmx guest-vm.ovf
※ここから先、Linux環境でやる場合とWin環境でやる場合を分けて書いてる。
今回の検証環境がNestedVMな環境なので、ゲストを起動しようとするとVirtualBoxに怒られて起動できない。
仕方ないのでovfファイルとguest-vm-disk1.vmdkをローカル(Win環境)にSCPする。
2. VirtualBoxに変換したVMをインポートする
Linux環境
VMインポート後、起動してVirtualBox Guest Additionsをインストールする
# インポート
# VBoxManage import guest-vm.ovf --vsys 0 --ostype "RedHat_64" --vsys 0 --vmname guest-vm --vsys 0 --cpus 1 --vsys 0 --memory 2048 --vsys 0 --unit 10 --disk /vagrant/VirtualBox\ VMs/guest-vm/guest-vm-disk1.vmdk
# 光学ドライブが消えちゃうのでstorageattachコマンドで光学ドライブを追加している。
# VBoxManage storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
VirtualBox Guest Additionsをインストールする
ゲストVM実行中に[デバイス] -> [Guest Additions CDイメージの挿入]をクリック
ゲストVM内でインストール作業を実行
# mount /dev/sr0 /media
# export KERN_DIR=/usr/src/kernels/x.x.xx-xxx.xx.x.el6.x86_64 # ここは任意のカーネルバージョンになる
# /media/VBoxLinuxAdditions.run
# umount /dev/sr0
# shutdown -h now
CDイメージの取り出し
# VBoxManage storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
Win環境
VMインポート後、起動してVirtualBox Guest Additionsをインストールする
> "C:\Program Files\Oracle\VirtualBox\VBoxManage" import guest-vm.ovf --vsys 0 --ostype "RedHat_64" --vsys 0 --vmname guest-vm --vsys 0 --cpus 1 --vsys 0 --memory 2048
> "C:\Program Files\Oracle\VirtualBox\VBoxManage" storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
> "C:\Program Files\Oracle\VirtualBox\VBoxManage" modifyvm guest-vm --nic1 nat
VirtualBox Guest Additionsをインストールする
ゲストVM実行中に [デバイス] -> [Guest Additions CDイメージの挿入]をクリック
ゲストVM内でインストール作業を実行
# mount /dev/sr0 /media
# export KERN_DIR=/usr/src/kernels/x.x.xx-xxx.xx.x.el6.x86_64 # ここは任意のカーネルバージョンになる
# /media/VBoxLinuxAdditions.run
# umount /dev/sr0
# shutdown -h now
CDイメージの取り出し
> "C:\Program Files\Oracle\VirtualBox\VBoxManage" storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
3. Vagrant Box化する
# vagrant package --base guest-vm --output /vagrant/boxes/guest-vm.box
==> guest-vm: Exporting VM...
==> guest-vm: Compressing package to: /vagrant/boxes/guest-vm.box
4. Vagrantfileの作成
Vagrantfileを作成する。
とりあえず起動するのに必要最小限で。
# vagrant init
# vi Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "guest-vm.box"
# vagrant up時にinsecure_private_keyのペアから書き換えられるのを防ぐ(推奨されないけども)
config.ssh.insert_key = false
end
5. vagrant upを実行
起動してみる
# vagrant box add guest-vm guest-vm.box
# vagrant up
こんな感じ。