mirror of
https://github.com/churchers/vm-bhyve.git
synced 2025-12-12 09:51:02 +01:00
clone command for ZFS users
makes it easy to duplicate an existing guest
This commit is contained in:
@@ -215,7 +215,7 @@ If you are using the default csh/tcsh shell built into FreeBSD, the following co
|
|||||||
autocomplete to work for all the currently supported functions:
|
autocomplete to work for all the currently supported functions:
|
||||||
|
|
||||||
complete vm \
|
complete vm \
|
||||||
'p@1@(list create install start stop console configure reset poweroff switch iso)@' \
|
'p@1@(list create install start stop console configure reset poweroff destroy clone switch iso)@' \
|
||||||
'n@create@n@' \
|
'n@create@n@' \
|
||||||
'n@list@n@' \
|
'n@list@n@' \
|
||||||
'n@iso@n@' \
|
'n@iso@n@' \
|
||||||
|
|||||||
@@ -82,6 +82,9 @@ __parse_cmd(){
|
|||||||
configure)
|
configure)
|
||||||
__vm_configure "$@"
|
__vm_configure "$@"
|
||||||
;;
|
;;
|
||||||
|
clone)
|
||||||
|
__zfs_clone "$@"
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
__usage
|
__usage
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -77,12 +77,13 @@ Usage: vm ...
|
|||||||
install <name> <iso>
|
install <name> <iso>
|
||||||
start <name>
|
start <name>
|
||||||
stop <name>
|
stop <name>
|
||||||
console <name>
|
console <name> [com1|com2]
|
||||||
startall
|
startall
|
||||||
stopall
|
stopall
|
||||||
reset <name>
|
reset <name>
|
||||||
poweroff <name>
|
poweroff <name>
|
||||||
configure <name>
|
configure <name>
|
||||||
|
clone <name> <new-name>
|
||||||
iso [url]
|
iso [url]
|
||||||
image list
|
image list
|
||||||
image create [-d description] <name>
|
image create [-d description] <name>
|
||||||
|
|||||||
32
lib/vm-zfs
32
lib/vm-zfs
@@ -86,6 +86,38 @@ __zfs_make_zvol(){
|
|||||||
[ $? -ne 0 ] && __err "failed to create new ZVOL ${VM_ZFS_DATASET}/${_name}"
|
[ $? -ne 0 ] && __err "failed to create new ZVOL ${VM_ZFS_DATASET}/${_name}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# clone a vm
|
||||||
|
__zfs_clone(){
|
||||||
|
local _old="$1"
|
||||||
|
local _new="$2"
|
||||||
|
local _uuid _uuidpart _fs _newfs
|
||||||
|
|
||||||
|
[ -z "${_old}" -o -z "${_new}" ] && __usage
|
||||||
|
[ ! "${VM_ZFS}" = "1" ] && __err "cannot clone guests unless ZFS support is enabled"
|
||||||
|
[ ! -e "${vm_dir}/${_old}/${_old}.conf" ] && __err "${_old} does not appear to be an existing virtual machine"
|
||||||
|
[ -e "${vm_dir}/${_old}/run.lock" ] && __err "${_old} must be powered off first"
|
||||||
|
[ -d "${vm_dir}/${_new}" ] && __err "directory ${vm_dir}/${_new} already exists"
|
||||||
|
|
||||||
|
_uuid=$(uuidgen)
|
||||||
|
_uuidpart=$(echo "${_uuid}" |awk -F- '{print $1}')
|
||||||
|
|
||||||
|
zfs snapshot -r ${VM_ZFS_DATASET}/${_old}@${_uuidpart}
|
||||||
|
[ $? -ne 0 ] && __err "failed to create snapshot ${VM_ZFS_DATASET}/${_old}@${_uuidpart}"
|
||||||
|
|
||||||
|
zfs list -o name -rHt filesystem,volume ${VM_ZFS_DATASET}/${_old} | \
|
||||||
|
while read _fs; do
|
||||||
|
_newfs=$(echo "${_fs}" | sed "s@${VM_ZFS_DATASET}/${_old}@${VM_ZFS_DATASET}/${_new}@")
|
||||||
|
|
||||||
|
zfs clone ${_fs}@${_uuidpart} ${_newfs}
|
||||||
|
[ $? -ne 0 ] && __err "error while cloning datasets"
|
||||||
|
done
|
||||||
|
|
||||||
|
# update new guest
|
||||||
|
mv "${vm_dir}/${_new}/${_old}.conf" "${vm_dir}/${_new}/${_new}.conf"
|
||||||
|
sysrc -inqf "${vm_dir}/${_new}/${_new}.conf" "uuid=${_uuid}" >/dev/null 2>&1
|
||||||
|
rm "${vm_dir}/${_new}/vm-bhyve.log" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
# create an image of a vm
|
# create an image of a vm
|
||||||
__zfs_image_create(){
|
__zfs_image_create(){
|
||||||
local _name
|
local _name
|
||||||
|
|||||||
13
vm.8
13
vm.8
@@ -65,6 +65,10 @@
|
|||||||
.Nm
|
.Nm
|
||||||
.Cm configure
|
.Cm configure
|
||||||
.Ar name
|
.Ar name
|
||||||
|
.Nm
|
||||||
|
.Cm clone
|
||||||
|
.Ar name
|
||||||
|
.Ar new-name
|
||||||
.Pp
|
.Pp
|
||||||
.Nm
|
.Nm
|
||||||
.Cm iso
|
.Cm iso
|
||||||
@@ -456,6 +460,15 @@ The
|
|||||||
command simply opens the virtual machine configuration file in your default editor,
|
command simply opens the virtual machine configuration file in your default editor,
|
||||||
allowing you to easily make changes. Please note, changes do not take effect until
|
allowing you to easily make changes. Please note, changes do not take effect until
|
||||||
the virtual machine is fully shutdown and restarted.
|
the virtual machine is fully shutdown and restarted.
|
||||||
|
.It Cm clone Ar name Ar new-name
|
||||||
|
Create a clone of the virtual machine
|
||||||
|
.Pa name ,
|
||||||
|
as long as it is currently powered off. The new machine will be called
|
||||||
|
.Pa new-name ,
|
||||||
|
and will be ready to boot with a newly assigned UUID and empty log file.
|
||||||
|
.Pp
|
||||||
|
Please note that this function requires ZFS, and a snapshot will be taken of the original
|
||||||
|
guest, along with any descendant datasets.
|
||||||
.It Cm iso Op Ar url
|
.It Cm iso Op Ar url
|
||||||
List all the ISO files currently stored in the
|
List all the ISO files currently stored in the
|
||||||
.Pa $vm_dir/.iso
|
.Pa $vm_dir/.iso
|
||||||
|
|||||||
Reference in New Issue
Block a user