ここしばらくは自宅でESXiさわっていたけど、ノートPCで使っている素のVirtualBoxでもCLI操作できる。
Vagrantを使えば十分なCLI操作に加えてOSインストールの手間も省けるけど、ハード寄りの構成などで細かい設定が難しかったりした(ネットワークのアダプタ1にNAT以外の設定がわからなかった、など)ので、お試しのつもりで触ってみた。
環境
- ホストOS: Windows 10 Home
- VirtualBox: 5.2.26 r128414
VirtualBoxを普通にインストールすると、CLI操作するためのコマンドはだいたい C:\Program Files\Oracle\VirtualBox\VBoxManage.exe
にある。
使い方は公式ドキュメント:
www.virtualbox.org
VMの作成について、以下つらつらと。(OSのインストールは別途行うように)
help
公式ドキュメントにもサブコマンドやオプションは記載あるが、オプションなしでVBoxManage.exe
を実行してもヘルプメッセージは表示される。
ただしかなり分量があるのでファイルに出力して文字列検索とかしながら見たほうがよいかも。
VMの作成(ガワのみ)
まずはcreatevm
コマンドを使う。
PS C:\Users\zaki> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' createvm --name centos-vm --ostype RedHat_64 --register Virtual machine 'centos-vm' is created and registered. UUID: ********-****-****-****-************ Settings file: 'C:\Users\zaki\VirtualBox VMs\centos-vm\centos-vm.vbox' PS C:\Users\zaki>
するとVMができる。(CPUやストレージなどなど無し状態)
ostypeについてはVBoxManage list ostypesを実行すれば一覧を確認できる。
(これも量が多いのでファイルに吐いて確認した方がいいかも)
出力される一覧のID
のとこの文字列を指定すればOK。
よく使うのはRedHat_64
, Debian_64
, Ubuntu_64
ってところか? (Fedora,Red HatはあるのにCentOSが無いのが不思議だけど)
CPU/メモリの設定
作成済みのVMに対してmodifyvm
を使って「変更」する。
- CPU: 2 (70%制限)
- メモリ: 2GB
であれば、
PS C:\Users\zaki> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm centos-vm --cpus 2 --cpuexecutioncap 70 --memory 2048 PS C:\Users\zaki>
すると設定が反映される。
NICの設定
VM作成の時点で、ネットワークアダプタ1にNATが設定されるが、これを上書きして設定を更新できる。これもmodifyvm
を使う。
例えば
- NIC1: "static-nat"と名前がついている「NATネットワーク」
- NIC2: "VirtualBox Host-Only Ethernet Adapter"と名前がついている「ホストオンリーアダプタ」
を設定する場合であれば、
PS C:\Users\zaki> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm centos-vm --nic1 natnetwork --nat-network1 static-nat --nic2 hostonly --hostonlyadapter2 "VirtualBox Host-Only Ethernet Adapter" PS C:\Users\zaki>
実行するとこうなる。
ストレージ
ストレージはちょっと手順が多い。
「VM用のディスクファイルであるVDIを別途作成し、VMにアタッチする」という手順になっている。(たぶん)
(こういう仕組みにVirtualBox側がなってるから、Vagrantでも任意のサイズのディスクのVMを作るのがひと手間あるのかな)
コントローラの作成
作成直後のVMは、ストレージデバイスを使用するためのコントローラを全く持っていないため、まずこれを作成する。
使うコマンドはstoragectl
。
before
PS C:\Users\zaki> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' storagectl centos-vm --name SATA --add sata --controller IntelAHCI PS C:\Users\zaki>
after
これでストレージをセットできるようになる。
ディスクの作成
まずディスクを作成する。
使うコマンドはcreatemedium
。
このコマンドで作成されるストレージファイルは、フルパスで指定するか、パス指定がなければコマンドを実行したカレントディレクトリになるので、実行前にVMの定義ファイルディレクトリに移動して実行するのがわかりやすくて良い。
通常利用であれば、%USERPROFILE%\VirtualBox VMs\{vm name}\
がVMのディレクトリ
PS C:\Users\zaki> cd "$env:USERPROFILE\VirtualBox VMs\centos-vm" PS C:\Users\zaki\VirtualBox VMs\centos-vm> ls ディレクトリ: C:\Users\zaki\VirtualBox VMs\centos-vm Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2019/10/22 17:05 1815 centos-vm.vbox -a---- 2019/10/22 17:00 1549 centos-vm.vbox-prev PS C:\Users\zaki\VirtualBox VMs\centos-vm>
※ これはPowerShellの場合。cmdであればcd "%USERPROFILE%\VirtualBox VMs\centos-vm"
など。
で、ディスク作成
PS C:\Users\zaki\VirtualBox VMs\centos-vm> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' createmedium disk --filename centos-vm.vdi --size 40960 --format VDI 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Medium created. UUID: ********-****-****-****-************ PS C:\Users\zaki\VirtualBox VMs\centos-vm> ls ディレクトリ: C:\Users\zaki\VirtualBox VMs\centos-vm Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2019/10/22 17:05 1815 centos-vm.vbox -a---- 2019/10/22 17:00 1549 centos-vm.vbox-prev -a---- 2019/10/22 17:13 2097152 centos-vm.vdi PS C:\Users\zaki\VirtualBox VMs\centos-vm>
thinプロビジョニングかな?
ディスクのアタッチ
VMに作成したディスクファイルを認識させる。
使うコマンドはstorageattach
。
--medium
オプションにアタッチするディスクファイルを指定する。
PS C:\Users\zaki\VirtualBox VMs\centos-vm> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' storageattach centos-vm --storagectl SATA --port 0 --type hdd --medium centos-vm.vdi PS C:\Users\zaki\VirtualBox VMs\centos-vm>
こうなる。(ちゃんと40GBで認識されている)
OSインストール用ISOメディアのマウント
この時点でネットワークブート&ネットワークインストールができる環境であれば、ブートしてOSインストールできる(と思う。試してない)
が、最後にDVDのISOファイルからOSインストールするために、ISOマウントの設定を追加する。
コントローラの追加
ストレージと同じく、メディアマウント用のコントローラが無いので追加する。
手順はストレージと同じ。
PS C:\Users\zaki\VirtualBox VMs\centos-vm> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' storagectl centos-vm --name IDE --add ide --controller PIIX4 --hostiocache on PS C:\Users\zaki\VirtualBox VMs\centos-vm>
追加された
メディアのマウント
(ISOファイルは別途用意しておく)
& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' storageattach centos-vm --storagectl IDE --port 0 --device 0 --type dvddrive --medium "C:\Users\zaki\Downloads\CentOS-7-x86_64-Minimal-1804.iso"
これで電源投入すれば、DVDブートしてOSのインストーラが起動する。
Ansibleで自動化したいけど、ホストOSがWindowsだからなー。。。
ということで、設定をJSONで持たせてPowerShellで(ものすごく雑に)スクリプト化してみた。
{ "vmconf" : [ { "vmname": "okd-master", "ostype": "RedHat_64", "cpus": 4, "cpuexecutioncap": 60, "memory": 11469, "storage": 61440 }, { "vmname": "okd-node1", "ostype": "RedHat_64", "cpus": 2, "cpuexecutioncap": 100, "memory": 8192, "storage": 40960 }, { "vmname": "okd-node2", "ostype": "RedHat_64", "cpus": 2, "cpuexecutioncap": 100, "memory": 8192, "storage": 40960 } ] }
こんな感じのvmconf.json
ファイルを作成して、
$config = Get-Content "vmconf.json" | ConvertFrom-Json $vboxmng = "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" $isofile = "C:\Users\zaki\Downloads\CentOS-7-x86_64-Minimal-1804.iso" foreach ($item in $config.vmconf) { echo $item # create vm & $vboxmng "createvm" --name $item.vmname --ostype $item.ostype --register # vm configure & $vboxmng "modifyvm" $item.vmname --cpus $item.cpus --cpuexecutioncap $item.cpuexecutioncap --memory $item.memory # vm network & $vboxmng "modifyvm" $item.vmname --nic1 natnetwork --nat-network1 static-nat --nic2 hostonly --hostonlyadapter2 "VirtualBox Host-Only Ethernet Adapter" # cd cd ($env:USERPROFILE + '\VirtualBox VMs\' + $item.vmname) # create storage controller & $vboxmng storagectl $item.vmname --name SATA --add sata --controller IntelAHCI # create storage $diskname = $item.vmname + ".vdi" & $vboxmng createmedium disk --filename $diskname --size $item.storage --format VDI # attach storage & $vboxmng storageattach $item.vmname --storagectl SATA --port 0 --type hdd --medium $diskname # create DVD contoller & $vboxmng storagectl $item.vmname --name IDE --add ide --controller PIIX4 --hostiocache on # attach DVD & $vboxmng storageattach $item.vmname --storagectl IDE --port 0 --device 0 --type dvddrive --medium $isofile }
このPowerShellスクリプトを実行すれば、JSONに書いたスペックのVMがぽこぽこっとできる。
バージョン差異のため(ストレージ周りで特に)若干コマンドが異なっていたが、こちらのブログが参考になりました。
逆に言うと、今後のバージョンアップでまたやり方が変わる可能性はある。