Fix the issue of failing to find resource disk for FreeBSD

FreeBSD VM gets a UUID from host which informs where resource
disk locates. But that UUID string was not exposed from VM kernel,
as a result, the agent used a hard code "2:1:0" as the location of
resource disk. That should be updated after FreeBSD VM kernel
exposed UUID through "sysctl dev.storvsc" command.

But considering compatible with previous FreeBSD VM, the hard code
logic cannot be removed, and they are left there as a fallback.
This commit is contained in:
Hongjiang Zhang
2016-09-08 10:35:53 +08:00
parent 85f0eae3df
commit a737bfbf84
2 changed files with 64 additions and 12 deletions
+48 -1
View File
@@ -22,7 +22,7 @@ import azurelinuxagent.common.utils.textutil as textutil
import azurelinuxagent.common.logger as logger
from azurelinuxagent.common.exception import OSUtilError
from azurelinuxagent.common.osutil.default import DefaultOSUtil
from azurelinuxagent.common.future import ustr
class FreeBSDOSUtil(DefaultOSUtil):
def __init__(self):
@@ -196,3 +196,50 @@ class FreeBSDOSUtil(DefaultOSUtil):
logger.verbose("Interface info: ({0},{1},{2})", iface, inet, mac)
return iface, inet, mac
def device_for_ide_port(self, port_id):
"""
Return device name attached to ide port 'n'.
"""
if port_id > 3:
return None
g0 = "00000000"
if port_id > 1:
g0 = "00000001"
port_id = port_id - 2
err, output = shellutil.run_get_output('sysctl dev.storvsc | grep pnpinfo | grep deviceid=')
if err:
return None
g1 = "000" + ustr(port_id)
g0g1 = "{0}-{1}".format(g0, g1)
"""
search 'X' from 'dev.storvsc.X.%pnpinfo: classid=32412632-86cb-44a2-9b5c-50d1417354f5 deviceid=00000000-0001-8899-0000-000000000000'
"""
cmd_search_ide = "sysctl dev.storvsc | grep pnpinfo | grep deviceid={0}".format(g0g1)
err, output = shellutil.run_get_output(cmd_search_ide)
if err:
return None
cmd_extract_id = cmd_search_ide + "|awk -F . '{print $3}'"
err, output = shellutil.run_get_output(cmd_extract_id)
"""
try to search 'blkvscX' and 'storvscX' to find device name
"""
output = output.rstrip()
cmd_search_blkvsc = "camcontrol devlist -b | grep blkvsc{0} | awk '{{print $1}}'".format(output)
err, output = shellutil.run_get_output(cmd_search_blkvsc)
if err == 0:
output = output.rstrip()
cmd_search_dev="camcontrol devlist | grep {0} | awk -F \( '{{print $2}}'|awk -F , '{{print $1}}'".format(output)
err, output = shellutil.run_get_output(cmd_search_dev)
if err == 0:
return output.rstrip()
cmd_search_storvsc = "camcontrol devlist -b | grep storvsc{0} | awk '{{print $1}}'".format(output)
err, output = shellutil.run_get_output(cmd_search_storvsc)
if err == 0:
output = output.rstrip()
cmd_search_dev="camcontrol devlist | grep {0} | awk -F \( '{{print $2}}'|awk -F , '{{print $1}}'".format(output)
err, output = shellutil.run_get_output(cmd_search_dev)
if err == 0:
return output.rstrip()
return None
+16 -11
View File
@@ -57,19 +57,24 @@ class FreeBSDResourceDiskHandler(ResourceDiskHandler):
raise ResourceDiskError("Unable to detect resource disk device:{0}".format(output))
disks = self.parse_gpart_list(output)
err, output = shellutil.run_get_output('camcontrol periphlist 2:1:0')
if err:
raise ResourceDiskError("Unable to detect resource disk device:{0}".format(output))
device = self.osutil.device_for_ide_port(1)
if device is None:
# fallback logic to find device
err, output = shellutil.run_get_output('camcontrol periphlist 2:1:0')
if err:
# try again on "3:1:0"
err, output = shellutil.run_get_output('camcontrol periphlist 3:1:0')
if err:
raise ResourceDiskError("Unable to detect resource disk device:{0}".format(output))
# 'da1: generation: 4 index: 1 status: MORE\npass2: generation: 4 index: 2 status: LAST\n'
device = None
for line in output.split('\n'):
index = line.find(':')
if index > 0:
geom_name = line[:index]
if geom_name in disks:
device = geom_name
break
for line in output.split('\n'):
index = line.find(':')
if index > 0:
geom_name = line[:index]
if geom_name in disks:
device = geom_name
break
if not device:
raise ResourceDiskError("Unable to detect resource disk device.")