[libvirt] [PATCH 0/3] virSysinfo: Introduce SMBIOS type 3 support

From: Zhuang Yanying <ann.zhuangyanying@huawei.com> Some applications inside VM need to access SMBIOS Chassis Asset Tag, which should be emulated. access inside VM (for example) Linux: /sys/class/dmi/id/chassis_asset_tag. Windows: (Get-WmiObject Win32_SystemEnclosure).SMBIOSAssetTag wirhin Windows PowerShell. It has already been realized in qemu: SMBIOS: Build aggregate smbios tables and entry point https://git.qemu.org/?p=qemu.git;a=commit;h=c97294ec1b9e36887e119589d456557d... but not in libvirt. we realize it here. As an example, you could use something like <chassis> <entry name='manufacturer'>Huawei</entry> <entry name='version'>To be filled by O.E.M.</entry> <entry name='serial'>To be filled by O.E.M.</entry> <entry name='asset'>To be filled by O.E.M.</entry> <entry name='sku'>Type3Sku1</entry> </chassis> BTW: I'll be on vacation for china spring festival for the next week, I'll response as soon as I get back if there's any modification needed. Zhuang Yanying (3): conf: add support for setting Chassis SMBIOS data fields qemu: add support for generating SMBIOS Chassis strings command line news: add support for setting Chassis SMBIOS data fields docs/formatdomain.html.in | 23 +++++++ docs/news.xml | 5 ++ docs/schemas/domaincommon.rng | 22 ++++++ src/conf/domain_conf.c | 55 +++++++++++++++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 51 ++++++++++++++ src/util/virsysinfo.c | 133 +++++++++++++++++++++++++++++++++++- src/util/virsysinfo.h | 13 ++++ tests/qemuxml2argvdata/smbios.args | 2 + tests/qemuxml2argvdata/smbios.xml | 7 ++ tests/qemuxml2xmloutdata/smbios.xml | 7 ++ 11 files changed, 318 insertions(+), 1 deletion(-) -- 1.8.3.1

From: Zhuang Yanying <ann.zhuangyanying@huawei.com> This type of information defines attributes of a system chassis, such as SMBIOS Chassis Asset Tag. access inside VM (for example) Linux: /sys/class/dmi/id/chassis_asset_tag. Windows: (Get-WmiObject Win32_SystemEnclosure).SMBIOSAssetTag wirhin Windows PowerShell. As an example, you could use something like <chassis> <entry name='manufacturer'>Huawei</entry> <entry name='version'>To be filled by O.E.M.</entry> <entry name='serial'>To be filled by O.E.M.</entry> <entry name='asset'>To be filled by O.E.M.</entry> <entry name='sku'>Type3Sku1</entry> </chassis> Signed-off-by: Zhuang Yanying <ann.zhuangyanying@huawei.com> --- docs/formatdomain.html.in | 23 ++++++++ docs/schemas/domaincommon.rng | 22 +++++++ src/conf/domain_conf.c | 55 +++++++++++++++++ src/libvirt_private.syms | 1 + src/util/virsysinfo.c | 133 +++++++++++++++++++++++++++++++++++++++++- src/util/virsysinfo.h | 13 +++++ 6 files changed, 246 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 3ec1173..bcbf6fd 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -411,6 +411,13 @@ <entry name='version'>0B98401 Pro</entry> <entry name='serial'>W1KS427111E</entry> </baseBoard> + <chassis> + <entry name='manufacturer'>Huawei</entry> + <entry name='version'>To be filled by O.E.M.</entry> + <entry name='serial'>To be filled by O.E.M.</entry> + <entry name='asset'>To be filled by O.E.M.</entry> + <entry name='sku'>Type3Sku1</entry> + </chassis> <oemStrings> <entry>myappname:some arbitrary data</entry> <entry>otherappname:more arbitrary data</entry> @@ -502,6 +509,22 @@ validation and <code>date</code> format checking, all values are passed as strings to the hypervisor driver. </dd> + <dt><code>chassis</code></dt> + <dd> + This is block 3 of SMBIOS, with entry names drawn from: + <dl> + <dt><code>manufacturer</code></dt> + <dd>Manufacturer of Chassis</dd> + <dt><code>version</code></dt> + <dd>Version of the Chassis</dd> + <dt><code>serial</code></dt> + <dd>Serial number</dd> + <dt><code>asset</code></dt> + <dd>Asset tag</dd> + <dt><code>sku</code></dt> + <dd>SKU number</dd> + </dl> + </dd> <dt><code>oemStrings</code></dt> <dd> This is block 11 of SMBIOS. This element should appear once and diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index ee6f83c..8165e69 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4896,6 +4896,18 @@ </element> </zeroOrMore> <optional> + <element name="chassis"> + <oneOrMore> + <element name="entry"> + <attribute name="name"> + <ref name="sysinfo-chassis-name"/> + </attribute> + <ref name="sysinfo-value"/> + </element> + </oneOrMore> + </element> + </optional> + <optional> <element name="oemStrings"> <oneOrMore> <element name="entry"> @@ -4940,6 +4952,16 @@ </choice> </define> + <define name="sysinfo-chassis-name"> + <choice> + <value>manufacturer</value> + <value>version</value> + <value>serial</value> + <value>asset</value> + <value>sku</value> + </choice> + </define> + <define name="sysinfo-value"> <data type="string"/> </define> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fb732a0..e369235 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14542,6 +14542,50 @@ virSysinfoOEMStringsParseXML(xmlXPathContextPtr ctxt, return ret; } + +static int +virSysinfoChassisParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt, + virSysinfoChassisDefPtr *chassisdef) +{ + int ret = -1; + virSysinfoChassisDefPtr def; + + if (!xmlStrEqual(node->name, BAD_CAST "chassis")) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("XML does not contain expected 'chassis' element")); + return ret; + } + + if (VIR_ALLOC(def) < 0) + goto cleanup; + + def->manufacturer = + virXPathString("string(entry[@name='manufacturer'])", ctxt); + def->version = + virXPathString("string(entry[@name='version'])", ctxt); + def->serial = + virXPathString("string(entry[@name='serial'])", ctxt); + def->asset = + virXPathString("string(entry[@name='asset'])", ctxt); + def->sku = + virXPathString("string(entry[@name='sku'])", ctxt); + + if (!def->manufacturer && !def->version && + !def->serial && !def->asset && !def->sku) { + virSysinfoChassisDefFree(def); + def = NULL; + } + + *chassisdef = def; + def = NULL; + ret = 0; + cleanup: + virSysinfoChassisDefFree(def); + return ret; +} + + static virSysinfoDefPtr virSysinfoParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt, @@ -14600,6 +14644,17 @@ virSysinfoParseXML(xmlNodePtr node, if (virSysinfoBaseBoardParseXML(ctxt, &def->baseBoard, &def->nbaseBoard) < 0) goto error; + /* Extract chassis related metadata */ + if ((tmpnode = virXPathNode("./chassis[1]", ctxt)) != NULL) { + oldnode = ctxt->node; + ctxt->node = tmpnode; + if (virSysinfoChassisParseXML(tmpnode, ctxt, &def->chassis) < 0) { + ctxt->node = oldnode; + goto error; + } + ctxt->node = oldnode; + } + /* Extract system related metadata */ if ((tmpnode = virXPathNode("./oemStrings[1]", ctxt)) != NULL) { oldnode = ctxt->node; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3b14d7d..97e4c00 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2860,6 +2860,7 @@ virVasprintfInternal; # util/virsysinfo.h virSysinfoBaseBoardDefClear; virSysinfoBIOSDefFree; +virSysinfoChassisDefFree; virSysinfoDefFree; virSysinfoFormat; virSysinfoRead; diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c index e8d3371..856215c 100644 --- a/src/util/virsysinfo.c +++ b/src/util/virsysinfo.c @@ -108,6 +108,19 @@ void virSysinfoBaseBoardDefClear(virSysinfoBaseBoardDefPtr def) VIR_FREE(def->location); } +void virSysinfoChassisDefFree(virSysinfoChassisDefPtr def) +{ + if (def == NULL) + return; + + VIR_FREE(def->manufacturer); + VIR_FREE(def->version); + VIR_FREE(def->serial); + VIR_FREE(def->asset); + VIR_FREE(def->sku); + VIR_FREE(def); +} + void virSysinfoOEMStringsDefFree(virSysinfoOEMStringsDefPtr def) { size_t i; @@ -143,6 +156,8 @@ void virSysinfoDefFree(virSysinfoDefPtr def) virSysinfoBaseBoardDefClear(def->baseBoard + i); VIR_FREE(def->baseBoard); + virSysinfoChassisDefFree(def->chassis); + for (i = 0; i < def->nprocessor; i++) { VIR_FREE(def->processor[i].processor_socket_destination); VIR_FREE(def->processor[i].processor_type); @@ -826,6 +841,66 @@ virSysinfoParseX86BaseBoard(const char *base, } static int +virSysinfoParseX86Chassis(const char *base, + virSysinfoChassisDefPtr *chassisdef) +{ + int ret = -1; + const char *cur, *eol = NULL; + virSysinfoChassisDefPtr def; + + if ((cur = strstr(base, "Chassis Information")) == NULL) + return 0; + + if (VIR_ALLOC(def) < 0) + return ret; + + base = cur; + if ((cur = strstr(base, "Manufacturer: ")) != NULL) { + cur += 14; + eol = strchr(cur, '\n'); + if (eol && VIR_STRNDUP(def->manufacturer, cur, eol - cur) < 0) + goto cleanup; + } + if ((cur = strstr(base, "Version: ")) != NULL) { + cur += 9; + eol = strchr(cur, '\n'); + if (eol && VIR_STRNDUP(def->version, cur, eol - cur) < 0) + goto cleanup; + } + if ((cur = strstr(base, "Serial Number: ")) != NULL) { + cur += 15; + eol = strchr(cur, '\n'); + if (eol && VIR_STRNDUP(def->serial, cur, eol - cur) < 0) + goto cleanup; + } + if ((cur = strstr(base, "Asset Tag: ")) != NULL) { + cur += 11; + eol = strchr(cur, '\n'); + if (eol && VIR_STRNDUP(def->sku, cur, eol - cur) < 0) + goto cleanup; + } + if ((cur = strstr(base, "SKU Number: ")) != NULL) { + cur += 12; + eol = strchr(cur, '\n'); + if (eol && VIR_STRNDUP(def->sku, cur, eol - cur) < 0) + goto cleanup; + } + + if (!def->manufacturer && !def->version && + !def->serial && !def->asset && !def->sku) { + virSysinfoChassisDefFree(def); + def = NULL; + } + + *chassisdef = def; + def = NULL; + ret = 0; + cleanup: + virSysinfoChassisDefFree(def); + return ret; +} + +static int virSysinfoParseX86Processor(const char *base, virSysinfoDefPtr ret) { const char *cur, *tmp_base; @@ -1047,7 +1122,7 @@ virSysinfoReadX86(void) return NULL; } - cmd = virCommandNewArgList(path, "-q", "-t", "0,1,2,4,17", NULL); + cmd = virCommandNewArgList(path, "-q", "-t", "0,1,2,3,4,17", NULL); VIR_FREE(path); virCommandSetOutputBuffer(cmd, &outbuf); if (virCommandRun(cmd, NULL) < 0) @@ -1067,6 +1142,9 @@ virSysinfoReadX86(void) if (virSysinfoParseX86BaseBoard(outbuf, &ret->baseBoard, &ret->nbaseBoard) < 0) goto error; + if (virSysinfoParseX86Chassis(outbuf, &ret->chassis) < 0) + goto error; + ret->nprocessor = 0; ret->processor = NULL; if (virSysinfoParseX86Processor(outbuf, ret) < 0) @@ -1203,6 +1281,29 @@ virSysinfoBaseBoardFormat(virBufferPtr buf, } static void +virSysinfoChassisFormat(virBufferPtr buf, + virSysinfoChassisDefPtr def) +{ + if (!def) + return; + + virBufferAddLit(buf, "<chassis>\n"); + virBufferAdjustIndent(buf, 2); + virBufferEscapeString(buf, "<entry name='manufacturer'>%s</entry>\n", + def->manufacturer); + virBufferEscapeString(buf, "<entry name='version'>%s</entry>\n", + def->version); + virBufferEscapeString(buf, "<entry name='serial'>%s</entry>\n", + def->serial); + virBufferEscapeString(buf, "<entry name='asset'>%s</entry>\n", + def->asset); + virBufferEscapeString(buf, "<entry name='sku'>%s</entry>\n", + def->sku); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</chassis>\n"); +} + +static void virSysinfoProcessorFormat(virBufferPtr buf, virSysinfoDefPtr def) { size_t i; @@ -1354,6 +1455,7 @@ virSysinfoFormat(virBufferPtr buf, virSysinfoDefPtr def) virSysinfoBIOSFormat(&childrenBuf, def->bios); virSysinfoSystemFormat(&childrenBuf, def->system); virSysinfoBaseBoardFormat(&childrenBuf, def->baseBoard, def->nbaseBoard); + virSysinfoChassisFormat(&childrenBuf, def->chassis); virSysinfoProcessorFormat(&childrenBuf, def); virSysinfoMemoryFormat(&childrenBuf, def); virSysinfoOEMStringsFormat(&childrenBuf, def->oemStrings); @@ -1466,6 +1568,32 @@ virSysinfoBaseBoardIsEqual(virSysinfoBaseBoardDefPtr src, return identical; } +static bool +virSysinfoChassisIsEqual(virSysinfoChassisDefPtr src, + virSysinfoChassisDefPtr dst) +{ + bool identical = false; + + if (!src && !dst) + return true; + + if ((src && !dst) || (!src && dst)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Target chassis does not match source")); + goto cleanup; + } + + CHECK_FIELD(manufacturer, "chassis vendor"); + CHECK_FIELD(version, "chassis version"); + CHECK_FIELD(serial, "chassis serial"); + CHECK_FIELD(asset, "chassis asset"); + CHECK_FIELD(sku, "chassis sku"); + + identical = true; + cleanup: + return identical; +} + #undef CHECK_FIELD bool virSysinfoIsEqual(virSysinfoDefPtr src, @@ -1509,6 +1637,9 @@ bool virSysinfoIsEqual(virSysinfoDefPtr src, dst->baseBoard + i)) goto cleanup; + if (!virSysinfoChassisIsEqual(src->chassis, dst->chassis)) + goto cleanup; + identical = true; cleanup: diff --git a/src/util/virsysinfo.h b/src/util/virsysinfo.h index ecb3a36..00a15db 100644 --- a/src/util/virsysinfo.h +++ b/src/util/virsysinfo.h @@ -98,6 +98,16 @@ struct _virSysinfoBaseBoardDef { /* XXX board type */ }; +typedef struct _virSysinfoChassisDef virSysinfoChassisDef; +typedef virSysinfoChassisDef *virSysinfoChassisDefPtr; +struct _virSysinfoChassisDef { + char *manufacturer; + char *version; + char *serial; + char *asset; + char *sku; +}; + typedef struct _virSysinfoOEMStringsDef virSysinfoOEMStringsDef; typedef virSysinfoOEMStringsDef *virSysinfoOEMStringsDefPtr; struct _virSysinfoOEMStringsDef { @@ -116,6 +126,8 @@ struct _virSysinfoDef { size_t nbaseBoard; virSysinfoBaseBoardDefPtr baseBoard; + virSysinfoChassisDefPtr chassis; + size_t nprocessor; virSysinfoProcessorDefPtr processor; @@ -130,6 +142,7 @@ virSysinfoDefPtr virSysinfoRead(void); void virSysinfoBIOSDefFree(virSysinfoBIOSDefPtr def); void virSysinfoSystemDefFree(virSysinfoSystemDefPtr def); void virSysinfoBaseBoardDefClear(virSysinfoBaseBoardDefPtr def); +void virSysinfoChassisDefFree(virSysinfoChassisDefPtr def); void virSysinfoOEMStringsDefFree(virSysinfoOEMStringsDefPtr def); void virSysinfoDefFree(virSysinfoDefPtr def); -- 1.8.3.1

From: Zhuang Yanying <ann.zhuangyanying@huawei.com> This wires up the previously added Chassis strings XML schema to be able to generate comamnd line args for QEMU. This requires QEMU >= 2.1 release containing this patch: SMBIOS: Build aggregate smbios tables and entry point https://git.qemu.org/?p=qemu.git;a=commit;h=c97294ec1b9e36887e119589d456557d... Signed-off-by: Zhuang Yanying <ann.zhuangyanying@huawei.com> --- src/qemu/qemu_command.c | 51 +++++++++++++++++++++++++++++++++++++ tests/qemuxml2argvdata/smbios.args | 2 ++ tests/qemuxml2argvdata/smbios.xml | 7 +++++ tests/qemuxml2xmloutdata/smbios.xml | 7 +++++ 4 files changed, 67 insertions(+) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6c73cd7..266b354 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5817,6 +5817,51 @@ qemuBuildSmbiosOEMStringsStr(virSysinfoOEMStringsDefPtr def) } +static char * +qemuBuildSmbiosChassisStr(virSysinfoChassisDefPtr def) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + + if (!def) + return NULL; + + virBufferAddLit(&buf, "type=3"); + + /* 3:Manufacturer */ + virBufferAddLit(&buf, ",manufacturer="); + virQEMUBuildBufferEscapeComma(&buf, def->manufacturer); + /* 3:Version */ + if (def->version) { + virBufferAddLit(&buf, ",version="); + virQEMUBuildBufferEscapeComma(&buf, def->version); + } + /* 3:Serial Number */ + if (def->serial) { + virBufferAddLit(&buf, ",serial="); + virQEMUBuildBufferEscapeComma(&buf, def->serial); + } + /* 3:Asset Tag */ + if (def->asset) { + virBufferAddLit(&buf, ",asset="); + virQEMUBuildBufferEscapeComma(&buf, def->asset); + } + /* 3:Sku */ + if (def->sku) { + virBufferAddLit(&buf, ",sku="); + virQEMUBuildBufferEscapeComma(&buf, def->sku); + } + + if (virBufferCheckError(&buf) < 0) + goto error; + + return virBufferContentAndReset(&buf); + + error: + virBufferFreeAndReset(&buf); + return NULL; +} + + static int qemuBuildSmbiosCommandLine(virCommandPtr cmd, virQEMUDriverPtr driver, @@ -5888,6 +5933,12 @@ qemuBuildSmbiosCommandLine(virCommandPtr cmd, VIR_FREE(smbioscmd); } + smbioscmd = qemuBuildSmbiosChassisStr(source->chassis); + if (smbioscmd != NULL) { + virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL); + VIR_FREE(smbioscmd); + } + if (source->oemStrings) { if (!(smbioscmd = qemuBuildSmbiosOEMStringsStr(source->oemStrings))) return -1; diff --git a/tests/qemuxml2argvdata/smbios.args b/tests/qemuxml2argvdata/smbios.args index d27d436..2f0a89f 100644 --- a/tests/qemuxml2argvdata/smbios.args +++ b/tests/qemuxml2argvdata/smbios.args @@ -17,6 +17,8 @@ serial=32dfcb37-5af1-552b-357c-be8c3aa38310,\ uuid=c7a5fdbd-edaf-9455-926a-d65c16db1809,sku=1234567890,family=Red Hat' \ -smbios 'type=2,manufacturer=Hewlett-Packard,product=0B4Ch,version=D,\ serial=CZC1065993,asset=CZC1065993,location=Upside down' \ +-smbios 'type=3,manufacturer=Huawei,version=To be filled by O.E.M.,\ +serial=To be filled by O.E.M.,asset=To be filled by O.E.M.,sku=Type3Sku1' \ -smbios 'type=11,value=Hello,value=World,value=This is,,\ more tricky value=escaped' \ -nographic \ diff --git a/tests/qemuxml2argvdata/smbios.xml b/tests/qemuxml2argvdata/smbios.xml index 319bdf6..474b7d8 100644 --- a/tests/qemuxml2argvdata/smbios.xml +++ b/tests/qemuxml2argvdata/smbios.xml @@ -26,6 +26,13 @@ <entry name='asset'>CZC1065993</entry> <entry name='location'>Upside down</entry> </baseBoard> + <chassis> + <entry name='manufacturer'>Huawei</entry> + <entry name='version'>To be filled by O.E.M.</entry> + <entry name='serial'>To be filled by O.E.M.</entry> + <entry name='asset'>To be filled by O.E.M.</entry> + <entry name='sku'>Type3Sku1</entry> + </chassis> <oemStrings> <entry>Hello</entry> <entry>World</entry> diff --git a/tests/qemuxml2xmloutdata/smbios.xml b/tests/qemuxml2xmloutdata/smbios.xml index cbe616c..5ef9402 100644 --- a/tests/qemuxml2xmloutdata/smbios.xml +++ b/tests/qemuxml2xmloutdata/smbios.xml @@ -26,6 +26,13 @@ <entry name='asset'>CZC1065993</entry> <entry name='location'>Upside down</entry> </baseBoard> + <chassis> + <entry name='manufacturer'>Huawei</entry> + <entry name='version'>To be filled by O.E.M.</entry> + <entry name='serial'>To be filled by O.E.M.</entry> + <entry name='asset'>To be filled by O.E.M.</entry> + <entry name='sku'>Type3Sku1</entry> + </chassis> <oemStrings> <entry>Hello</entry> <entry>World</entry> -- 1.8.3.1

From: Zhuang Yanying <ann.zhuangyanying@huawei.com> Signed-off-by: Zhuang Yanying <ann.zhuangyanying@huawei.com> --- docs/news.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/news.xml b/docs/news.xml index 5a2943a..b60cb2d 100644 --- a/docs/news.xml +++ b/docs/news.xml @@ -72,6 +72,11 @@ completion data. </description> </change> + <change> + <summary> + conf: add support for setting Chassis SMBIOS data fields + </summary> + </change> </section> <section title="Bug fixes"> </section> -- 1.8.3.1

On 02/14/2018 04:22 AM, Zhuangyanying wrote:
From: Zhuang Yanying <ann.zhuangyanying@huawei.com>
Some applications inside VM need to access SMBIOS Chassis Asset Tag, which should be emulated.
access inside VM (for example) Linux: /sys/class/dmi/id/chassis_asset_tag. Windows: (Get-WmiObject Win32_SystemEnclosure).SMBIOSAssetTag wirhin Windows PowerShell.
It has already been realized in qemu:
SMBIOS: Build aggregate smbios tables and entry point https://git.qemu.org/?p=qemu.git;a=commit;h=c97294ec1b9e36887e119589d456557d...
but not in libvirt. we realize it here. As an example, you could use something like
<chassis> <entry name='manufacturer'>Huawei</entry> <entry name='version'>To be filled by O.E.M.</entry> <entry name='serial'>To be filled by O.E.M.</entry> <entry name='asset'>To be filled by O.E.M.</entry>
Would prefer some more "realistic values" rather than "To be filled by O.E.M."... They don't have to be exactly what is on your system, but closer to expectations would be nice. Similar to what already exists. You can just respond here and I can make the changes for you. NB: The xml files you put in patch2 should have been in patch1 - I can move those too. Other than that everything looks good to me. John
<entry name='sku'>Type3Sku1</entry> </chassis>
BTW: I'll be on vacation for china spring festival for the next week, I'll response as soon as I get back if there's any modification needed.
Zhuang Yanying (3): conf: add support for setting Chassis SMBIOS data fields qemu: add support for generating SMBIOS Chassis strings command line news: add support for setting Chassis SMBIOS data fields
docs/formatdomain.html.in | 23 +++++++ docs/news.xml | 5 ++ docs/schemas/domaincommon.rng | 22 ++++++ src/conf/domain_conf.c | 55 +++++++++++++++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 51 ++++++++++++++ src/util/virsysinfo.c | 133 +++++++++++++++++++++++++++++++++++- src/util/virsysinfo.h | 13 ++++ tests/qemuxml2argvdata/smbios.args | 2 + tests/qemuxml2argvdata/smbios.xml | 7 ++ tests/qemuxml2xmloutdata/smbios.xml | 7 ++ 11 files changed, 318 insertions(+), 1 deletion(-)

-----邮件原件----- 发件人: John Ferlan [mailto:jferlan@redhat.com] 发送时间: 2018年2月14日 22:02 收件人: Zhuangyanying <ann.zhuangyanying@huawei.com>; libvir-list@redhat.com; berrange@redhat.com 抄送: Zhangbo (Oscar) <oscar.zhangbo@huawei.com>; Gonglei (Arei) <arei.gonglei@huawei.com>; Jiangyifei <jiangyifei@huawei.com> 主题: Re: [libvirt] [PATCH 0/3] virSysinfo: Introduce SMBIOS type 3 support
On 02/14/2018 04:22 AM, Zhuangyanying wrote:
From: Zhuang Yanying <ann.zhuangyanying@huawei.com>
Some applications inside VM need to access SMBIOS Chassis Asset Tag, which should be emulated.
access inside VM (for example) Linux: /sys/class/dmi/id/chassis_asset_tag. Windows: (Get-WmiObject Win32_SystemEnclosure).SMBIOSAssetTag wirhin Windows PowerShell.
It has already been realized in qemu:
SMBIOS: Build aggregate smbios tables and entry point
https://git.qemu.org/?p=qemu.git;a=commit;h=c97294ec1b9e36887e119589d 456557d72ab37b5
but not in libvirt. we realize it here. As an example, you could use something like
<chassis> <entry name='manufacturer'>Huawei</entry> <entry name='version'>To be filled by O.E.M.</entry> <entry name='serial'>To be filled by O.E.M.</entry> <entry name='asset'>To be filled by O.E.M.</entry>
Would prefer some more "realistic values" rather than "To be filled by O.E.M."... They don't have to be exactly what is on your system, but closer to expectations would be nice. Similar to what already exists.
You can just respond here and I can make the changes for you.
Thank you very much for your help ! Whether the configuration below is appropriate: <chassis> <entry name='manufacturer'>Dell Inc.</entry> <entry name='version'>2.12</entry> <entry name='serial'>65X0XF2</entry> <entry name='asset'>40000101</entry> <entry name='sku'>Type3Sku1</entry> </chassis>
NB: The xml files you put in patch2 should have been in patch1 - I can move those too.
Oh, yes, I missed it. Thanks again for your help ! Regards, -Zhuang Yanying
Other than that everything looks good to me.
John
<entry name='sku'>Type3Sku1</entry> </chassis>
BTW: I'll be on vacation for china spring festival for the next week, I'll
response as soon as I get back if there's any modification needed.
Zhuang Yanying (3): conf: add support for setting Chassis SMBIOS data fields qemu: add support for generating SMBIOS Chassis strings command line news: add support for setting Chassis SMBIOS data fields
docs/formatdomain.html.in | 23 +++++++ docs/news.xml | 5 ++ docs/schemas/domaincommon.rng | 22 ++++++ src/conf/domain_conf.c | 55 +++++++++++++++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 51 ++++++++++++++ src/util/virsysinfo.c | 133
+++++++++++++++++++++++++++++++++++-
src/util/virsysinfo.h | 13 ++++ tests/qemuxml2argvdata/smbios.args | 2 + tests/qemuxml2argvdata/smbios.xml | 7 ++ tests/qemuxml2xmloutdata/smbios.xml | 7 ++ 11 files changed, 318 insertions(+), 1 deletion(-)
participants (2)
-
John Ferlan
-
Zhuangyanying