@@ -7,64 +7,74 @@ vm="$2"
77device=" ${3-0} "
88part=" ${4-} "
99
10- xe_min ()
11- {
10+ function xe_min() {
1211 local cmd=" $1 "
1312 shift
1413 xe " $cmd " --minimal " $@ "
1514}
1615
16+ function run_udev_settle() {
17+ which_udev=$( which udevsettle) || true
18+ if [ -n " $which_udev " ]; then
19+ udevsettle
20+ else
21+ udevadm settle
22+ fi
23+ }
24+
1725vm_uuid=$( xe_min vm-list name-label=" $vm " )
1826vdi_uuid=$( xe_min vbd-list params=vdi-uuid vm-uuid=" $vm_uuid " \
1927 userdevice=" $device " )
2028
2129dom0_uuid=$( xe_min vm-list is-control-domain=true)
2230
23- get_mount_device ()
24- {
31+ function get_mount_device() {
2532 vbd_uuid=$1
2633
2734 dev=$( xe_min vbd-list params=device uuid=" $vbd_uuid " )
2835 if [[ " $dev " =~ " sm/" ]]; then
2936 DEBIAN_FRONTEND=noninteractive \
3037 apt-get --option " Dpkg::Options::=--force-confold" --assume-yes \
31- install kpartx || true & > /dev/null
32- mapping=$( kpartx -av " /dev/$dev " | sed -ne ' s,^add map \([a-f0 -9\-]*\).*$,\1,p' | sed -ne " s,^\(.*${part} \)\$ ,\1,p" )
38+ install kpartx & > /dev/null || true
39+ mapping=$( kpartx -av " /dev/$dev " | sed -ne ' s,^add map \([a-z0 -9\-]*\).*$,\1,p' | sed -ne " s,^\(.*${part} \)\$ ,\1,p" )
3340 if [ -z " $mapping " ]; then
3441 echo " Failed to find mapping"
3542 exit -1
3643 fi
37- echo " mapper/${mapping} "
44+ echo " /dev/ mapper/${mapping} "
3845 else
3946 echo " /dev/$dev$part "
4047 fi
4148}
4249
43- open_vdi ()
44- {
50+ function clean_dev_mappings() {
51+ dev=$( xe_min vbd-list params=device uuid=" $vbd_uuid " )
52+ if [[ " $dev " =~ " sm/" ]]; then
53+ kpartx -dv " /dev/$dev "
54+ fi
55+ }
56+
57+ function open_vdi() {
4558 vbd_uuid=$( xe vbd-create vm-uuid=" $dom0_uuid " vdi-uuid=" $vdi_uuid " \
4659 device=autodetect)
4760 mp=$( mktemp -d)
4861 xe vbd-plug uuid=" $vbd_uuid "
4962
50- which_udev=$( which udevsettle) || true
51- if [ -n " $which_udev " ]; then
52- udevsettle
53- else
54- udevadm settle
55- fi
63+ run_udev_settle
5664
5765 mount_device=$( get_mount_device " $vbd_uuid " )
5866 mount " $mount_device " " $mp "
5967 echo " Your vdi is mounted at $mp "
6068}
6169
62- close_vdi ()
63- {
70+ function close_vdi() {
6471 vbd_uuid=$( xe_min vbd-list vm-uuid=" $dom0_uuid " vdi-uuid=" $vdi_uuid " )
6572 mount_device=$( get_mount_device " $vbd_uuid " )
73+ run_udev_settle
6674 umount " $mount_device "
6775
76+ clean_dev_mappings
77+
6878 xe vbd-unplug uuid=$vbd_uuid
6979 xe vbd-destroy uuid=$vbd_uuid
7080}
0 commit comments