mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
qemu: Move channelTargetDir into stateDir
For historical reasons (i.e. unknown reason) we put channel sockets into a path derived from cfg->libDir which is a path that survives host reboots (e.g. /var/lib/libvirt/...). This is not necessary and in fact for session daemon creates a longer prefix: XDG_CONFIG_HOME -> /home/user/.config XDG_RUNTIME_DIR -> /run/user/1000 Worse, if host is rebooted suddenly (e.g. due to power loss) then we leave files behind and nobody will ever remove them. Therefore, place the channel target dir into state dir. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2173980 Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
d3759d3674
commit
8abc979bb0
@ -2135,7 +2135,6 @@ exit 0
|
||||
%ghost %dir %{_rundir}/libvirt/qemu/slirp/
|
||||
%ghost %dir %{_rundir}/libvirt/qemu/swtpm/
|
||||
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/
|
||||
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/
|
||||
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/
|
||||
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/
|
||||
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/
|
||||
|
@ -143,6 +143,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
|
||||
cfg->configBaseDir = g_strdup_printf("%s/etc", root);
|
||||
cfg->stateDir = g_strdup_printf("%s/run/qemu", root);
|
||||
cfg->swtpmStateDir = g_strdup_printf("%s/run/swtpm", root);
|
||||
cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
|
||||
cfg->cacheDir = g_strdup_printf("%s/cache/qemu", root);
|
||||
cfg->libDir = g_strdup_printf("%s/lib/qemu", root);
|
||||
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/swtpm", root);
|
||||
@ -151,7 +152,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
|
||||
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
|
||||
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
|
||||
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
|
||||
cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
|
||||
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
|
||||
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
|
||||
} else if (privileged) {
|
||||
@ -163,8 +163,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
|
||||
cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt");
|
||||
|
||||
cfg->stateDir = g_strdup_printf("%s/libvirt/qemu", RUNSTATEDIR);
|
||||
|
||||
cfg->swtpmStateDir = g_strdup_printf("%s/libvirt/qemu/swtpm", RUNSTATEDIR);
|
||||
cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
|
||||
|
||||
cfg->cacheDir = g_strdup_printf("%s/cache/libvirt/qemu", LOCALSTATEDIR);
|
||||
|
||||
@ -173,7 +173,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
|
||||
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
|
||||
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
|
||||
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
|
||||
cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
|
||||
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
|
||||
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
|
||||
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/libvirt/swtpm",
|
||||
@ -190,8 +189,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
|
||||
|
||||
rundir = virGetUserRuntimeDirectory();
|
||||
cfg->stateDir = g_strdup_printf("%s/qemu/run", rundir);
|
||||
|
||||
cfg->swtpmStateDir = g_strdup_printf("%s/swtpm", cfg->stateDir);
|
||||
cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
|
||||
|
||||
cfg->configBaseDir = virGetUserConfigDirectory();
|
||||
|
||||
@ -201,8 +200,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
|
||||
cfg->checkpointDir = g_strdup_printf("%s/qemu/checkpoint",
|
||||
cfg->configBaseDir);
|
||||
cfg->autoDumpPath = g_strdup_printf("%s/qemu/dump", cfg->configBaseDir);
|
||||
cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel",
|
||||
cfg->configBaseDir);
|
||||
cfg->nvramDir = g_strdup_printf("%s/qemu/nvram", cfg->configBaseDir);
|
||||
cfg->memoryBackingDir = g_strdup_printf("%s/qemu/ram", cfg->configBaseDir);
|
||||
cfg->swtpmStorageDir = g_strdup_printf("%s/qemu/swtpm",
|
||||
|
@ -5401,6 +5401,28 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
|
||||
}
|
||||
|
||||
|
||||
|
||||
static bool
|
||||
qemuDomainChrMatchDefaultPath(const char *prefix,
|
||||
const char *infix,
|
||||
const char *target,
|
||||
const char *path)
|
||||
{
|
||||
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
|
||||
g_autofree char *regexp = NULL;
|
||||
|
||||
virBufferEscapeRegex(&buf, "^%s", prefix);
|
||||
if (infix)
|
||||
virBufferEscapeRegex(&buf, "%s", infix);
|
||||
virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
|
||||
virBufferEscapeRegex(&buf, "%s$", target);
|
||||
|
||||
regexp = virBufferContentAndReset(&buf);
|
||||
|
||||
return virStringMatch(path, regexp);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Clear auto generated unix socket paths:
|
||||
*
|
||||
@ -5421,6 +5443,9 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
|
||||
*
|
||||
* This function clears the path for migration as well, so we need to clear
|
||||
* the path even if we are not storing it in the XML.
|
||||
*
|
||||
* Please note, as of libvirt 9.7.0 the channelTargetDir is no longer derived
|
||||
* from cfg->libDir but rather cfg->stateDir.
|
||||
*/
|
||||
static void
|
||||
qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
|
||||
@ -5439,14 +5464,31 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
|
||||
|
||||
cfg = virQEMUDriverGetConfig(driver);
|
||||
|
||||
virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir);
|
||||
virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
|
||||
virBufferEscapeRegex(&buf, "%s$", chr->target.name);
|
||||
|
||||
regexp = virBufferContentAndReset(&buf);
|
||||
|
||||
if (virStringMatch(chr->source->data.nix.path, regexp))
|
||||
if (qemuDomainChrMatchDefaultPath(cfg->channelTargetDir,
|
||||
NULL,
|
||||
chr->target.name,
|
||||
chr->source->data.nix.path)) {
|
||||
VIR_FREE(chr->source->data.nix.path);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Previously, channelTargetDir was derived from cfg->libdir, or
|
||||
* cfg->configBaseDir even. Try them too. */
|
||||
if (qemuDomainChrMatchDefaultPath(cfg->libDir,
|
||||
"/channel",
|
||||
chr->target.name,
|
||||
chr->source->data.nix.path)) {
|
||||
VIR_FREE(chr->source->data.nix.path);
|
||||
return;
|
||||
}
|
||||
|
||||
if (qemuDomainChrMatchDefaultPath(cfg->configBaseDir,
|
||||
"/qemu/channel",
|
||||
chr->target.name,
|
||||
chr->source->data.nix.path)) {
|
||||
VIR_FREE(chr->source->data.nix.path);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
<channel type='unix'>
|
||||
<source mode='bind' path='/var/lib/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
|
||||
<source mode='bind' path='/var/run/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
|
||||
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
||||
</channel>
|
||||
|
@ -39,7 +39,7 @@
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||
</controller>
|
||||
<channel type='unix'>
|
||||
<source mode='bind' path='/var/lib/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
|
||||
<source mode='bind' path='/var/run/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
|
||||
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
||||
<alias name='channel0'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
||||
|
@ -42,7 +42,7 @@
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||
</controller>
|
||||
<channel type='unix'>
|
||||
<source mode='bind' path='/var/lib/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
|
||||
<source mode='bind' path='/var/run/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
|
||||
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
||||
<alias name='channel0'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
||||
|
@ -28,6 +28,10 @@
|
||||
<source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
|
||||
<target type='virtio' name='org.qemu.guest_agent.4'/>
|
||||
</channel>
|
||||
<channel type='unix'>
|
||||
<source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
|
||||
<target type='virtio' name='org.qemu.guest_agent.5'/>
|
||||
</channel>
|
||||
<memballoon model='none'/>
|
||||
</devices>
|
||||
</domain>
|
||||
|
@ -46,6 +46,11 @@
|
||||
<target type='virtio' name='org.qemu.guest_agent.4'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='5'/>
|
||||
</channel>
|
||||
<channel type='unix'>
|
||||
<source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
|
||||
<target type='virtio' name='org.qemu.guest_agent.5'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='6'/>
|
||||
</channel>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<audio id='1' type='none'/>
|
||||
|
@ -42,6 +42,10 @@
|
||||
<target type='virtio' name='org.qemu.guest_agent.4'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='5'/>
|
||||
</channel>
|
||||
<channel type='unix'>
|
||||
<target type='virtio' name='org.qemu.guest_agent.5'/>
|
||||
<address type='virtio-serial' controller='0' bus='0' port='6'/>
|
||||
</channel>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<audio id='1' type='none'/>
|
||||
|
@ -460,7 +460,7 @@ int qemuTestDriverInit(virQEMUDriver *driver)
|
||||
VIR_FREE(cfg->libDir);
|
||||
cfg->libDir = g_strdup("/var/lib/libvirt/qemu");
|
||||
VIR_FREE(cfg->channelTargetDir);
|
||||
cfg->channelTargetDir = g_strdup("/var/lib/libvirt/qemu/channel");
|
||||
cfg->channelTargetDir = g_strdup("/var/run/libvirt/qemu/channel");
|
||||
VIR_FREE(cfg->memoryBackingDir);
|
||||
cfg->memoryBackingDir = g_strdup("/var/lib/libvirt/qemu/ram");
|
||||
VIR_FREE(cfg->nvramDir);
|
||||
|
Loading…
Reference in New Issue
Block a user