- ESXi: 7.0U3b
vCenterを導入していない環境では仮想マシンがクローンできないと思い込んでいたけれども、どうやらvCenterが無くともクローンできるようである。まずはESXiのWeb管理画面、若しくはDCUIからSSHを有効にし、ESXiにSSHで接続する。
今回の環境はデータストア「esxi1ds」にalma9という名でAlmaLinux9の仮想マシンがこさえてあり、此れをクローンする。最初に、クローンする仮想マシンがあるデータストアへ移動する。
# cd /vmfs/volumes/esxi1ds
# ls
alma9
続いてクローン先のディレクトリを作成する。クローンしたものである事が分かりよいようにalma9-cloneとした。
# mkdir alma9-clone
# ls
alma9 alma9-clone
クローン元の仮想ディスクファイル(.vmdk)をクローン先にコピーする。コピーにはvmkfstools
コマンドを用いる。-d
オプションでディスクフォーマットが指定できる。シンプロビジョニングなら-d thin
という具合である。何も指定しないとシックプロビジョニング(Lazy Zeroed)となる。
なおこの際、仮想マシンが起動しており、かつスナップショットがない状態であるとファイルのロックに失敗してコピーできない。
# vmkfstools -i alma9/alma9.vmdk alma9-clone/alma9-clone.vmdk -d thin
Failed to open 'alma9/alma9.vmdk': Failed to lock the file (16392).
.vmdkファイルがすでにロックされているため触れないようである。そこでスナップショットを作成する。これによりコピーしたい.vmdkファイルがロックから解放され、スナップショットの.vmdkにロックが移る。のだと思う。スナップショットを作成するために仮想マシンのvmidを調査せねばならない。vim-cmd vmsvc/getallvms
コマンドで以って調べを進める。
# vim-cmd vmsvc/getallvms
Vmid Name File Guest OS Version Annotation
50 alma9 [esxi1ds] alma9/alma9.vmx rhel9_64Guest vmx-19
クローン元の仮想マシンはvmidが50であることが判明した。これを用いてスナップショットを作成する。vim-cmd vmsvc/snapshot.create
に続けてvmid、スナップショット名を指定する。
# vim-cmd vmsvc/snapshot.create 50 'snapshot for clone'
Create Snapshot:
スナップショットが作成されたことを確認しておく。vim-cmd vmsvc/get.snapshotinfo
に続けてvmidを付与して実行する。長たらしい出力であるが、nameの値に注目するとスナップショット作成時に指定したものであるから良さそうである。
# vim-cmd vmsvc/get.snapshotinfo 50
(vim.vm.SnapshotInfo) {
currentSnapshot = 'vim.vm.Snapshot:50-snapshot-1',
rootSnapshotList = (vim.vm.SnapshotTree) [
(vim.vm.SnapshotTree) {
snapshot = 'vim.vm.Snapshot:50-snapshot-1',
vm = 'vim.VirtualMachine:50',
name = "snapshot for clone",
description = "",
id = 1,
createTime = "2025-05-01T12:54:53.858972Z",
state = "poweredOff",
quiesced = false,
backupManifest = ,
childSnapshotList = ,
replaySupported = false
}
]
}
そうしたら改めて仮想ディスクファイルのコピーを試みると、今度は首尾よく進んだ。
# vmkfstools -i alma9/alma9.vmdk alma9-clone/alma9-clone.vmdk -d thin
Destination disk format: VMFS thin-provisioned
Cloning disk 'alma9/alma9.vmdk'...
Clone: 100% done.
続いて仮想マシンの構成ファイル(.vmx)をコピーする。
# cp -av alma9/alma9.vmx alma9-clone/alma9-clone.vmx
'alma9/alma9.vmx' -> 'alma9-clone/alma9-clone.vmx'
コピーした構成ファイルを編集する。仮想マシン名が含まれている箇所をクローン先の仮想マシン名に置換する。
# sed -i.bak 's/alma9/alma9-clone/' alma9-clone/alma9-clone.vmx
スナップショットを取得した関係でscsi0:0.fileName
のファイル名に枝番が付いているのでこれをviで以って削除した。
# vi alma9-clone/alma9-clone.vmx
scsi0:0.fileName = "alma9-clone-000001.vmdk"
↓
scsi0:0.fileName = "alma9-clone.vmdk"
また、OS起動時にネットワークが接続されるとIPアドレスが重複して都合が悪いからethernet0.startConnected = "FALSE"
などのようにvmxファイルへ追記して、パワーオン時に接続されないようにした。
そうしたら仮想マシンを登録する。出力にvmidが表示される。クローンした仮想マシンのvmidは51であった。
# vim-cmd solo/registervm /vmfs/volumes/esxi1ds/alma9-clone/alma9-clone.vmx
51
# vim-cmd vmsvc/getallvms
Vmid Name File Guest OS Version Annotation
50 alma9 [esxi1ds] alma9/alma9.vmx rhel9_64Guest vmx-19
51 alma9-clone [esxi1ds] alma9-clone/alma9-clone.vmx rhel9_64Guest vmx-19
これでクローンは完了して、仮想マシンを起動する準備は整った。然しながら、このまま起動を試みても4分ほど応答が返ってこない。
# vim-cmd vmsvc/power.on 51
Powering on VM:
この時ESXiのWeb管理画面には、質問へ回答せろというダイアログが出ている。曰く
この仮想マシンは移動またはコピーされている可能性があります。特定の管理機能やネットワーク機能を構成するために、VMware ESX ではこの仮想マシンが移動されたのか、またはコピーされたのかを認識する必要があります。不明な場合は、「コピーしました」を回答してください。
ということである。4分ほど放っておくと自動的に「コピーしました」として扱われて起動が始まる。なお「コピーしました」を選択するとクローン元のネットワークアダプタと異なるMACアドレスが採用される。一方で「移動しました」を選択するとMACアドレスがクローン元と同一となる。
起動開始まで4分もかかっては日が暮れてしまうので、Web管理画面から回答するかvim-cmd vmsvc/message
コマンドで質問へ回答する。コマンドからやるなら一旦、Ctrl+Cでvim-cmd vmsvc/power.on
を中断してまずはメッセージを確認する。
# vim-cmd vmsvc/message 51
Virtual machine message 123101:
This virtual machine might have been moved or copied. In order to configure certain management and networking features, VMware ESX needs to know if this virtual machine was moved or copied. If you don't know, answer "I Copied It".
0. button.uuid.cancel (Cancel)
1. button.uuid.movedTheVM (I Moved It)
2. button.uuid.copiedTheVM (I Copied It) [default]
メッセージIDは123101である。仮想マシンのコピーをした旨、回答したいので2番を選択する。そうするとコマンドは下に掲げるようになる。
# vim-cmd vmsvc/message 51 123101 2
コマンドを実行した時点で起動が始まる。改めてメッセージを確認すると、質問事項は無くなっていた。
vim-cmd vmsvc/message 51
No message.
あとはクローンを作成するために一時的に取得したスナップショットを削除する。まずはvim-cmd vmsvc/get.snapshot
で以ってスナップショットのIDを調べる。
# vim-cmd vmsvc/get.snapshot 50
(vim.vm.SnapshotInfo) {
currentSnapshot = 'vim.vm.Snapshot:50-snapshot-1',
rootSnapshotList = (vim.vm.SnapshotTree) [
(vim.vm.SnapshotTree) {
snapshot = 'vim.vm.Snapshot:50-snapshot-1',
vm = 'vim.VirtualMachine:50',
name = "snapshot for clone",
description = "",
id = 1,
createTime = "2025-05-01T12:54:53.858972Z",
state = "poweredOff",
quiesced = false,
backupManifest = ,
childSnapshotList = ,
replaySupported = false
}
]
}
IDが1だと判明したので削除へ移る。vim-cmd vmsvc/snapshot.remov
コマンドにvmidとスナップショットIDを引き渡して実行する。
# vim-cmd vmsvc/snapshot.remove 50 1
Remove Snapshot:
こうして仮想マシンのクローンが完了した。