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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user