From: Radoslaw Smigielski Date: Fri, 19 Jun 2026 08:56:02 +0000 (+0200) Subject: lxc: Assign aliases to filesystem and network devices X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=065337dd2c1b120be92a4960d0566eb745e8e350;p=thirdparty%2Flibvirt.git lxc: Assign aliases to filesystem and network devices 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 Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index afd8d6e980..8c892a76c5 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,63 @@ 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++) { + const char *alias; + int thisidx; + + if (!def->nets[i]->info.alias) + continue; + if (!(alias = STRSKIP(def->nets[i]->info.alias, "net"))) + continue; + + if (virStrToLong_i(alias, 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++) { + const char *alias; + int thisidx; + + if (!def->fss[i]->info.alias) + continue; + if (!(alias = STRSKIP(def->fss[i]->info.alias, "fs"))) + continue; + + if (virStrToLong_i(alias, 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 d22c2ea153..a666883979 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 b59c080da9..5be087de92 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 cac49af6e2..466ce07afd 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;