1
0
mirror of https://git.yoctoproject.org/meta-arm synced 2026-05-07 04:58:57 +00:00

arm-autonomy/xenguest-tools: add multiple disk devices support

With this patch user can set DISK_DEVICE for guest image.
If guest disk configuration contains DISK_DEVICE setting,
xenguest-manager uses that disk for this guest, insted of default one,
that is set with XENGUEST_VOLUME_DEVICE in xenguest-manager.conf file.
DISK_DEVICE is not set by deafult.

Change-Id: If400850f60097d38339e76a3d18fc0e2b927f3a0
Issue-Id: SCM-1513
Signed-off-by: Kamil Dziezyk <kamil.dziezyk@arm.com>
Signed-off-by: Jon Mason <jon.mason@arm.com>
This commit is contained in:
Kamil Dziezyk
2020-12-03 11:59:21 +00:00
committed by Jon Mason
parent 03f2d78e45
commit e3b06f63b1
4 changed files with 78 additions and 39 deletions
@@ -43,6 +43,9 @@ XENGUEST_IMAGE_KERNEL ??= "Image"
# be included in the xenguest image)
XENGUEST_IMAGE_DISK_SIZE ??= "${@ '4' if not d.getVar('INITRAMFS_IMAGE') else '0'}"
# set empty partition to be used by xenguest-manager for this image
XENGUEST_IMAGE_DISK_DEVICE ??= ""
#
# XENGUEST_IMAGE_DISK_PARTITIONS is used to describe the partitions to setup
# and their content.
@@ -142,6 +145,11 @@ xenguest_image_create() {
call_xenguest_mkimage update --disk-add-part=$arg
done
fi
diskdevice="${XENGUEST_IMAGE_DISK_DEVICE}"
if [ -n "$diskdevice" ]; then
call_xenguest_mkimage update --disk-device="${diskdevice}"
fi
;;
esac
@@ -66,6 +66,11 @@ The file contains the following entries:
and extract CONTENT as initial partition content (.tar[.gz|.xz|.bz2] file
or img[.gz|.bz2] file to be dumped in the partition).
FS and CONTENT can be empty.
- `DISK_DEVICE=X`: disk or partition to be used by lvm. Setting this option
allows to bind guest disk with any partition or disk available on host,
e.g. /dev/sda3 or /dev/sdb.
This variable is not set by default, but if set, it overrides disk settings
inside xenguest-manager.conf - 'XENGUEST_VOLUME_DEVICE'.
The disk-files contain files to be used for initializing the disk partitions
content. Those should be used to create a LVM or a physical disk and initialize
@@ -116,51 +116,56 @@ function xenguest_volume_init()
# Return:
# 0 - success
# 1 - failure
local diskdevice
local volumename
check_private
if [ -z "${DISK_DEVICE}" ]; then
# By default guest is using disk defined inside xenguest-manager.conf
diskdevice="${XENGUEST_VOLUME_DEVICE}"
volumename="${XENGUEST_VOLUME_NAME}"
else
# If guest configuration contains custom disk setting,
# overwrite default one
diskdevice="${DISK_DEVICE}"
volumename="vg-xen-$(basename ${diskdevice})"
fi
if [ -z "${XENGUEST_VOLUME_DEVICE:-}" -o \
! -b ${XENGUEST_VOLUME_DEVICE:-} ]; then
echo "${PREF} Invalid volume device in configuration: ${XENGUEST_VOLUME_DEVICE:-}"
if [ -z "${diskdevice}" -o ! -b "${diskdevice}" ]; then
echo "${PREF} Invalid volume device in configuration: ${diskdevice}"
return 1
fi
if [ -z "${XENGUEST_VOLUME_NAME:-}" ]; then
echo "${PREF} No volume name in configuration, using vg-xen..."
XENGUEST_VOLUME_NAME="vg-xen"
fi
pvs ${XENGUEST_VOLUME_DEVICE} > /dev/null 2>&1
pvs "${diskdevice}" > /dev/null 2>&1
if [ $? -ne 0 ]; then
# Check if there is no filesystem in the block device
echo "lsblk -n -o FSTYPE ${XENGUEST_VOLUME_DEVICE}" >> ${LOGFILE} 2>&1
filesystem=$(lsblk -n -o FSTYPE ${XENGUEST_VOLUME_DEVICE} 2>> ${LOGFILE})
echo "lsblk -n -o FSTYPE ${diskdevice}" >> ${LOGFILE} 2>&1
filesystem=$(lsblk -n -o FSTYPE "${diskdevice}" 2>> ${LOGFILE})
if [[ $? -eq 0 && -z "$filesystem" ]]; then
echo "${PREF} Initialize lvm on ${XENGUEST_VOLUME_DEVICE}"
echo "pvcreate -f ${XENGUEST_VOLUME_DEVICE}" >> ${LOGFILE} 2>&1
pvcreate -f ${XENGUEST_VOLUME_DEVICE} >> ${LOGFILE} 2>&1
echo "${PREF} Initialize lvm on ${diskdevice}"
echo "pvcreate -f ${diskdevice}" >> ${LOGFILE} 2>&1
pvcreate -f "${diskdevice}" >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error: initialing lvm on " \
"${XENGUEST_VOLUME_DEVICE} failed." | tee -a ${LOGFILE}
"${diskdevice} failed." | tee -a ${LOGFILE}
return 1
fi
else
[ -z "$filesystem" ] || \
echo "${PREF} Error: The ${XENGUEST_VOLUME_DEVICE} is already " \
echo "${PREF} Error: The ${diskdevice} is already " \
"formatted as $filesystem." | tee -a ${LOGFILE}
return 1
fi
fi
vgs ${XENGUEST_VOLUME_NAME} > /dev/null 2>&1
vgs "${volumename}" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Create ${XENGUEST_VOLUME_NAME} volume"
echo "vgcreate ${XENGUEST_VOLUME_NAME} ${XENGUEST_VOLUME_DEVICE}" \
echo "${PREF} Create ${volumename} volume"
echo "vgcreate ${volumename} ${diskdevice}" \
>> ${LOGFILE} 2>&1
vgcreate ${XENGUEST_VOLUME_NAME} ${XENGUEST_VOLUME_DEVICE} \
vgcreate "${volumename}" "${diskdevice}" \
>> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error: creating ${XENGUEST_VOLUME_NAME} volume " \
echo "${PREF} Error: creating ${volumename} volume " \
"failed." | tee -a ${LOGFILE}
return 1
fi
@@ -201,9 +206,19 @@ function xenguest_disk_init()
guestname="$1"
guestfile="$2"
devname="/dev/${XENGUEST_VOLUME_NAME}/${guestname}"
source ${XENGUEST_CONF_BASE}/guests/${guestname}/disk.cfg
if [ -z "${DISK_DEVICE}" ]; then
# By default guest is using disk defined inside xenguest-manager.conf
diskdevice="${XENGUEST_VOLUME_DEVICE}"
volumename="${XENGUEST_VOLUME_NAME}"
else
# If guest configuration contains custom disk setting,
# overwrite default one
diskdevice="${DISK_DEVICE}"
volumename="vg-xen-$(basename ${diskdevice})"
fi
devname="/dev/${volumename}/${guestname}"
DISK_SIZE=$(check_size "${DISK_SIZE}")
if [ -z "${DISK_SIZE}" ] || [ "${DISK_SIZE}" = "0M" ]; then
@@ -224,11 +239,11 @@ function xenguest_disk_init()
# Remove volume if it already exist
echo "lvs ${XENGUEST_VOLUME_NAME}/${guestname}" >> ${LOGFILE} 2>&1
lvs ${XENGUEST_VOLUME_NAME}/${guestname} >> ${LOGFILE} 2>&1
echo "lvs ${volumename}/${guestname}" >> ${LOGFILE} 2>&1
lvs "${volumename}/${guestname}" >> ${LOGFILE} 2>&1
if [ $? -eq 0 ]; then
echo "lvremove -y ${devname}" >> ${LOGFILE} 2>&1
lvremove -y ${devname} >> ${LOGFILE} 2>&1
lvremove -y "${devname}" >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error removing volume ${guestname}"
return 1
@@ -236,9 +251,9 @@ function xenguest_disk_init()
fi
# Create volume
echo "lvcreate -y -L ${DISK_SIZE} -n ${guestname} ${XENGUEST_VOLUME_NAME}" \
echo "lvcreate -y -L ${DISK_SIZE} -n ${guestname} ${volumename}" \
>> ${LOGFILE} 2>&1
lvcreate -y -L ${DISK_SIZE} -n ${guestname} ${XENGUEST_VOLUME_NAME} \
lvcreate -y -L "${DISK_SIZE}" -n "${guestname}" "${volumename}" \
>> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error creating volume ${guestname}"
@@ -247,7 +262,7 @@ function xenguest_disk_init()
# Add partition table
echo "parted -s ${devname} mklabel msdos" >> ${LOGFILE} 2>&1
parted -s ${devname} mklabel msdos >> ${LOGFILE} 2>&1
parted -s "${devname}" mklabel msdos >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error creating partition table on ${guestname}"
return 1
@@ -256,8 +271,8 @@ function xenguest_disk_init()
# Setup disk name in xen configuration
echo "xenguest-mkimage update ${XENGUEST_CONF_BASE}/guests/${guestname}" \
"--xen-disk=${devname}" >> ${LOGFILE} 2>&1
xenguest-mkimage update ${XENGUEST_CONF_BASE}/guests/${guestname} \
--xen-disk=${devname} >> ${LOGFILE} 2>&1
xenguest-mkimage update "${XENGUEST_CONF_BASE}/guests/${guestname}" \
"--xen-disk=${devname}" >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error setting disk in xen configuration"
return 1
@@ -311,8 +326,8 @@ function xenguest_disk_init()
# Create partition
echo "parted -s ${devname} unit MB mkpart primary ${partstart}" \
"${partend}" >> ${LOGFILE} 2>&1
parted -s ${devname} unit MB mkpart primary ${partstart} \
${partend} >> ${LOGFILE} 2>&1
parted -s "${devname}" unit MB mkpart primary "${partstart}" \
"${partend}" >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error adding partition ${part}"
return 1
@@ -346,7 +361,7 @@ function xenguest_disk_init()
# Attach disk to xen
echo "xl block-attach 0 phy:${devname} xvda w" >> ${LOGFILE} 2>&1
xl block-attach 0 phy:${devname} xvda w >> ${LOGFILE} 2>&1
xl block-attach 0 "phy:${devname}" xvda w >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error attaching partition ${part}"
return 1
@@ -528,16 +543,27 @@ function xenguest_guest_remove()
check_private
guestname="$1"
devname="/dev/${XENGUEST_VOLUME_NAME}/${guestname}"
source ${XENGUEST_CONF_BASE}/guests/${guestname}/disk.cfg
if [ -z "${DISK_DEVICE}" ]; then
# By default guest is using disk defined inside xenguest-manager.conf
diskdevice="${XENGUEST_VOLUME_DEVICE}"
volumename="${XENGUEST_VOLUME_NAME}"
else
# If guest configuration contains custom disk setting,
# overwrite default one
diskdevice="${DISK_DEVICE}"
volumename="vg-xen-$(basename ${diskdevice})"
fi
devname="/dev/${volumename}/${guestname}"
# check if guest had a volume
echo "lvs ${XENGUEST_VOLUME_NAME}/${guestname}" >> ${LOGFILE} 2>&1
lvs ${XENGUEST_VOLUME_NAME}/${guestname} >> ${LOGFILE} 2>&1
echo "lvs ${volumename}/${guestname}" >> ${LOGFILE} 2>&1
lvs ${volumename}/${guestname} >> ${LOGFILE} 2>&1
if [ $? -eq 0 ]; then
# Remove guest volume
echo "${PREF} Removing ${guestname} volume. This might take a while..."
echo "lvremove -y ${devname}" >> ${LOGFILE} 2>&1
lvremove -y ${devname} >> ${LOGFILE} 2>&1
lvremove -y "${devname}" >> ${LOGFILE} 2>&1
if [ $? -ne 0 ]; then
echo "${PREF} Error removing volume ${guestname}"
exit 1
@@ -17,7 +17,7 @@ S = "${WORKDIR}"
# Please refer to documentation/xenguest-manager.md for documentation on those
# parameters
XENGUEST_MANAGER_VOLUME_DEVICE ?= "/dev/sda2"
XENGUEST_MANAGER_VOLUME_NAME ?= "vg-xen"
XENGUEST_MANAGER_VOLUME_NAME ?= "vg-xen-$(basename ${XENGUEST_MANAGER_VOLUME_DEVICE})"
XENGUEST_MANAGER_GUEST_DIR ?= "${datadir}/guests/"
# We add an init script to create and start guests automatically