[PATCH v3] lxc: Assign aliases to filesystem and network devices
This patch addresses the missing device alias assignment for filesystem and network interface devices in LXC domains. Before this patch, virsh dumpxml showed filesystem and network devices without aliases: <filesystem type='mount' accessmode='passthrough'> <source dir='/shared6'/> <target dir='/shared6'/> </filesystem> <interface type='bridge'> <mac address='b8:3f:d2:c9:e8:bd'/> <source bridge='br0'/> <target dev='vnet8'/> <model type='virtio'/> </interface> After this patch, filesystem devices have auto-generated aliases: <filesystem type='mount' accessmode='passthrough'> <source dir='/shared6'/> <target dir='/shared6'/> <alias name='fs1'/> <!-- Now assigned --> </filesystem> <interface type='bridge'> <mac address='b8:3f:d2:c9:e8:bd'/> <source bridge='br0'/> <target dev='vnet8'/> <model type='virtio'/> <alias name='net4'/> <!-- Now assigned --> </interface> Changes in v3: - Implemented new index allocation algorithm, scans existing aliases before new index allocation - Added hotplug support in lxcDomainAttachDeviceNetLive() - Handles gaps in numbering after device detach/attach - Follows QEMU's qemuAssignDeviceNetAlias() pattern - Tested hotplug scenario The implementation follows the same pattern used by QEMU's qemuAssignDeviceNetAlias() and qemuAssignDeviceFSAlias(). This is needed as a prerequisite for fixing bug #63 (loop device path length limitation), where device aliases will be used to compose synthetic lo_file_name references in the format "libvirt-$UUID-$DEVALIAS".
From: Radoslaw Smigielski <rsmigiel@redhat.com> LXC domains did not assign device aliases to filesystem and network interface during domain startup. Only console devices received aliases. This change introduces two new functions: - virLXCAssignDeviceNetAlias() - virLXCAssignDeviceFSAlias() These functions scan existing devices to find the next available device index. Also ensure correct alias assignment after network and block device hotplug/unplug operations when a gap can be introduced in device numbering. The new functions are called during: - domain startup virLXCProcessStart() - device hotplug lxcDomainAttachDeviceNetLive() Signed-off-by: Radoslaw Smigielski <rsmigiel@redhat.com> --- src/lxc/lxc_domain.c | 59 +++++++++++++++++++++++++++++++++++++++++++ src/lxc/lxc_domain.h | 8 ++++++ src/lxc/lxc_driver.c | 3 +++ src/lxc/lxc_process.c | 8 ++++++ 4 files changed, 78 insertions(+) diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index afd8d6e9805f..5326c9852073 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -25,6 +25,7 @@ #include "virlog.h" #include "virerror.h" +#include "virstring.h" #include "virtime.h" #include "virsystemd.h" #include "virinitctl.h" @@ -375,3 +376,61 @@ virLXCDomainSetRunlevel(virDomainObj *vm, g_clear_pointer(&data.st_valid, g_free); return ret; } + + +void +virLXCAssignDeviceNetAlias(virDomainDef *def, + virDomainNetDef *net) +{ + size_t i; + int idx = 0; + + if (net->info.alias) + return; + + for (i = 0; i < def->nnets; i++) { + int thisidx; + + if (!def->nets[i]->info.alias) + continue; + if (!STRPREFIX(def->nets[i]->info.alias, "net")) + continue; + + if (virStrToLong_i(def->nets[i]->info.alias + 3, NULL, 10, &thisidx) < 0) + continue; + + if (thisidx >= idx) + idx = thisidx + 1; + } + + net->info.alias = g_strdup_printf("net%d", idx); +} + + +void +virLXCAssignDeviceFSAlias(virDomainDef *def, + virDomainFSDef *fs) +{ + size_t i; + int idx = 0; + + if (fs->info.alias) + return; + + for (i = 0; i < def->nfss; i++) { + int thisidx; + + if (!def->fss[i]->info.alias) + continue; + if (!STRPREFIX(def->fss[i]->info.alias, "fs")) + continue; + + if (virStrToLong_i(def->fss[i]->info.alias + 2, NULL, 10, &thisidx) < 0) + continue; + + if (thisidx >= idx) + idx = thisidx + 1; + } + + fs->info.alias = g_strdup_printf("fs%d", idx); +} diff --git a/src/lxc/lxc_domain.h b/src/lxc/lxc_domain.h index d22c2ea153a5..a66688397968 100644 --- a/src/lxc/lxc_domain.h +++ b/src/lxc/lxc_domain.h @@ -79,3 +79,11 @@ virLXCDomainGetMachineName(virDomainDef *def, pid_t pid); int virLXCDomainSetRunlevel(virDomainObj *vm, int runlevel); + +void +virLXCAssignDeviceNetAlias(virDomainDef *def, + virDomainNetDef *net); + +void +virLXCAssignDeviceFSAlias(virDomainDef *def, + virDomainFSDef *fs); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index b59c080da908..5be087de922a 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3502,6 +3502,9 @@ lxcDomainAttachDeviceNetLive(virLXCDriver *driver, if (virDomainActualNetDefValidate(net) < 0) return -1; + /* Assign alias to the new network interface */ + virLXCAssignDeviceNetAlias(vm->def, net); + actualType = virDomainNetGetActualType(net); switch (actualType) { diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index cac49af6e2b2..466ce07afd03 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -1349,6 +1349,14 @@ int virLXCProcessStart(virLXCDriver * driver, vm->def->consoles[i]->info.alias = g_strdup_printf("console%zu", i); } + VIR_DEBUG("Setting up filesystem aliases"); + for (i = 0; i < vm->def->nfss; i++) + virLXCAssignDeviceFSAlias(vm->def, vm->def->fss[i]); + + VIR_DEBUG("Setting up network interface aliases"); + for (i = 0; i < vm->def->nnets; i++) + virLXCAssignDeviceNetAlias(vm->def, vm->def->nets[i]); + VIR_DEBUG("Setting up Interfaces"); if (virLXCProcessSetupInterfaces(driver, vm->def, &veths) < 0) goto cleanup; -- 2.54.0
participants (1)
-
rsmigiel@redhat.com