zaki work log

作業ログやら生活ログやらなんやら

VBoxManageコマンドを使ってVirtualBox(5.2.26)でもCLIでVM作成

ここしばらくは自宅でESXiさわっていたけど、ノートPCで使っている素のVirtualBoxでもCLI操作できる。
Vagrantを使えば十分なCLI操作に加えてOSインストールの手間も省けるけど、ハード寄りの構成などで細かい設定が難しかったりした(ネットワークのアダプタ1にNAT以外の設定がわからなかった、など)ので、お試しのつもりで触ってみた。

環境

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やストレージなどなど無し状態) f:id:zaki-hmkc:20191022165100p:plain

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>

すると設定が反映される。

f:id:zaki-hmkc:20191022165610p:plain

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>

実行するとこうなる。

f:id:zaki-hmkc:20191022170052p:plain

ストレージ

ストレージはちょっと手順が多い。
VM用のディスクファイルであるVDIを別途作成し、VMにアタッチする」という手順になっている。(たぶん)

(こういう仕組みにVirtualBox側がなってるから、Vagrantでも任意のサイズのディスクのVMを作るのがひと手間あるのかな)

qiita.com

コントローラの作成

作成直後のVMは、ストレージデバイスを使用するためのコントローラを全く持っていないため、まずこれを作成する。
使うコマンドはstoragectl

before f:id:zaki-hmkc:20191022170415p:plain

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 f:id:zaki-hmkc:20191022170557p:plain

これでストレージをセットできるようになる。

ディスクの作成

まずディスクを作成する。
使うコマンドは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で認識されている)

f:id:zaki-hmkc:20191022171805p:plain

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>

追加された f:id:zaki-hmkc:20191022172247p:plain

メディアのマウント

(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"

f:id:zaki-hmkc:20191022172457p:plain

これで電源投入すれば、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がぽこぽこっとできる。


バージョン差異のため(ストレージ周りで特に)若干コマンドが異なっていたが、こちらのブログが参考になりました。

unageanu.hatenablog.com

逆に言うと、今後のバージョンアップでまたやり方が変わる可能性はある。