XEN

Материал из support.qbpro.ru

Здесь все что касается XEN



VBoxManage clonehd centos6.vdi centos6.img -format RAW

Скрипт настройки XEN при обновлении Grub:

/etc/grub.d/20_linux_xen
 #! /bin/sh
 set -e
 
 # grub-mkconfig helper script.
 # Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # GRUB is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 
 prefix="/usr"
 exec_prefix="${prefix}"
 datarootdir="${prefix}/share"
 
 . "${datarootdir}/grub/grub-mkconfig_lib"
 
 export TEXTDOMAIN=grub
 export TEXTDOMAINDIR="${datarootdir}/locale"
 
 CLASS="--class gnu-linux --class gnu --class os --class xen"
 
 if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
   OS=GNU/Linux
 else
   OS="${GRUB_DISTRIBUTOR} GNU/Linux"
   CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1) ${CLASS}"
 fi
 
 # loop-AES arranges things so that /dev/loop/X can be our root device, but
 # the initrds that Linux uses don't like that.
 case ${GRUB_DEVICE} in
   /dev/loop/*|/dev/loop[0-9])
     GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
     # We can't cope with devices loop-mounted from files here.
     case ${GRUB_DEVICE} in
       /dev/*) ;;
       *) exit 0 ;;
     esac
   ;;
 esac
 
 if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
     || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
     || uses_abstraction "${GRUB_DEVICE}" lvm; then
   LINUX_ROOT_DEVICE=${GRUB_DEVICE}
 else
   LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
 fi
 
 # Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT.
 if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE}" ]; then
   GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX_XEN_REPLACE}"
 fi
 if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}" ]; then
   GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}"
 fi
 
 if [ "x`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true`" = xbtrfs ] \
     || [ "x`stat -f --printf=%T /`" = xbtrfs ]; then
   rootsubvol="`make_system_path_relative_to_its_root /`"
   rootsubvol="${rootsubvol#/}"
   if [ "x${rootsubvol}" != x ]; then
     GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
   fi
 fi
 
 linux_entry ()
 {
   os="$1"
   version="$2"
   xen_version="$3"
   recovery="$4"
   args="$5"
   xen_args="$6"
   if ${recovery} ; then
     title="$(gettext_quoted "%s, with Xen %s and Linux %s (recovery mode)")"
   else
     title="$(gettext_quoted "%s, with Xen %s and Linux %s")"
   fi
# дополнительные опции - можно выставить самому...
   printf 'set default="0" \n'
   printf 'set timeout=5 \n'
# ------------------------------------------------
   printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${xen_version}" "${version}"
   if ! ${recovery} ; then
       save_default_entry | sed -e "s/^/\t/"
   fi
 
   if [ -z "${prepare_boot_cache}" ]; then
     prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
   fi
   printf '%s\n' "${prepare_boot_cache}"
   xmessage="$(gettext_printf "Loading Xen %s ..." ${xen_version})"
   lmessage="$(gettext_printf "Loading Linux %s ..." ${version})"
   cat << EOF
         echo    '$xmessage'
         multiboot       ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args}
         echo    '$lmessage'
         module  ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
 EOF
   if test -n "${initrd}" ; then
     message="$(gettext_printf "Loading initial ramdisk ...")"
     cat << EOF
         echo    '$message'
         module  ${rel_dirname}/${initrd}
 EOF
   fi
   cat << EOF
 }
 EOF
 }
 
 linux_list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* /boot/kernel-*; do
     if grub_file_is_not_garbage "$i"; then
         basename=$(basename $i)
         version=$(echo $basename | sed -e "s,^[^0-9]*-,,g")
         dirname=$(dirname $i)
         config=
         for j in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
             if test -e "${j}" ; then
                 config="${j}"
                 break
             fi
         done
         if (grep -qx "CONFIG_XEN_DOM0=y" "${config}" 2> /dev/null || grep -qx "CONFIG_XEN_PRIVILEGED_GUEST=y" "${config}" 2> /dev/null); then echo -n "$i " ; fi
     fi
     done`
 if [ "x${linux_list}" = "x" ] ; then
     exit 0
 fi
 xen_list=`for i in /boot/xen*; do
         if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
       done`
 prepare_boot_cache=
 
 while [ "x${xen_list}" != "x" ] ; do
     list="${linux_list}"
     current_xen=`version_find_latest $xen_list`
     xen_basename=`basename ${current_xen}`
     xen_dirname=`dirname ${current_xen}`
     rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname`
     xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"`
     echo "submenu \"Xen ${xen_version}\" {"
     while [ "x$list" != "x" ] ; do
         linux=`version_find_latest $list`
         echo "Found linux image: $linux" >&2
         basename=`basename $linux`
         dirname=`dirname $linux`
         rel_dirname=`make_system_path_relative_to_its_root $dirname`
         version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
         alt_version=`echo $version | sed -e "s,\.old$,,g"`
         linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
 
         initrd=
         for i in "initrd.img-${version}" "initrd-${version}.img" \
             "initrd-${version}" "initrd.img-${alt_version}" \
             "initrd-${alt_version}.img" "initrd-${alt_version}" \
             "initramfs-genkernel-${version}" \
             "initramfs-genkernel-${alt_version}" ; do
             if test -e "${dirname}/${i}" ; then
                 initrd="$i"
                 break
             fi
         done
         if test -n "${initrd}" ; then
             echo "Found initrd image: ${dirname}/${initrd}" >&2
         else
     # "UUID=" magic is parsed by initrds.  Since there's no initrd, it can't work here.
             linux_root_device_thisversion=${GRUB_DEVICE}
         fi
 
         linux_entry "${OS}" "${version}" "${xen_version}" false \
             "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
         if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
             linux_entry "${OS}" "${version}" "${xen_version}" true \
                 "single ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}"
         fi
 
         list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
     done
     echo "}"
     xen_list=`echo $xen_list | tr ' ' '\n' | grep -vx $current_xen | tr '\n' ' '`
 done

Монтирование образа хоста XEN

используем утилиту losetup:

проверяем наличие свободных устройств:

losetup -a

если все свободно, монтируем сначала образ:

losetup /dev/loop5 disk.img

смотрим смещение относительно начала:

fdisk -l /dev/loop5

пример вывода:

Disk /dev/loop5: 115.3 GB, 115343360000 bytes
255 heads, 63 sectors/track, 14023 cylinders, total 225280000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x390038ff

      Device Boot      Start         End      Blocks   Id  System
/dev/loop5p1   *          63   104872319    52436128+   7  HPFS/NTFS/exFAT

смещение для этого раздела равно 63, размер сектора 512 байт, для программного сдвига offset=63*512 (32256) создаем устройство типа /dev/sda1 только в варианте loop с которым будем работать:

losetup -o 32256 /dev/loop6 /dev/loop5

теперь у нас аналог /dev/sda1 только устройство /dev/loop6 можно например его примонтировать:

ntfs-3g /dev/loop6 /mnt

и делать там все что угодно..

Xen HVM guest qemu-dm USB

Qemu-dm used for Xen HVM (fully virtualized) guests supports USB passthru of devices from dom0 to the guest. Qemu-dm emulates USB 1.1 UHCI 2-port controller, which is pretty slow and limited in features and device support. Qemu-dm USB 1.1 passthru support is in all Xen 3.x (and newer) versions.

Qemu-dm USB 1.1 passthru doesn't require any additional backend drivers in dom0 or any additional frontend drivers in the guest!

As of Xen 4.2, HVM passthru is not available via xl, only xm. Support is slated for the 4.3 release.

Usage example in /etc/xen/<guest> cfgfile:

usb = 1
usbdevice = "host:xxxx:yyyy"

You can find out the "xxxx:yyyy" part by using "lsusb" command in dom0.

You can also plug a device into a running VM using usb-add and usb-del:

   xm usb-add domain host:xxxx:yyyy
   xm usb-del domain host:xxxx:yyyy