Fedora Server 36下libvirtd无法自启且运行2分钟自动关闭
问题背景
- 环境:全新最小化安装Fedora Server 36,服务器仅用于部署KVM虚拟化环境
- 初始操作:执行
dnf group install "Headless Virtualization"安装无头虚拟化组件组,安装完成后重启服务器 - 初始异常:执行
systemctl status libvirtd查询服务状态,发现libvirtd默认未运行,初始状态输出如下:
[root@dell-fedora-kvm ~]# systemctl status libvirtd ○ libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: disabled) Active: inactive (dead) TriggeredBy: ○ libvirtd-tcp.socket ○ libvirtd-admin.socket ○ libvirtd-ro.socket ○ libvirtd-tls.socket ○ libvirtd.socket Docs: man:libvirtd(8) https://libvirt.org
- 手动操作后的异常:
- 先后执行
systemctl start libvirtd手动启动服务、systemctl enable libvirtd设置开机自启,重启服务器后libvirtd依然不会自动启动 - 手动启动服务后,服务可正常运行,运行状态输出如下:
- 先后执行
[root@dell-fedora-kvm ~]# systemctl status libvirtd ● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2022-07-03 16:32:23 AEST; 52s ago TriggeredBy: ○ libvirtd-tcp.socket ● libvirtd-admin.socket ● libvirtd-ro.socket ○ libvirtd-tls.socket ● libvirtd.socket Docs: man:libvirtd(8) https://libvirt.org Main PID: 857 (libvirtd) Tasks: 21 (limit: 32768) Memory: 44.8M CPU: 480ms CGroup: /system.slice/libvirtd.service ├─ 857 /usr/sbin/libvirtd --timeout 120 ├─ 957 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper └─ 958 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper Jul 03 16:32:23 dell-fedora-kvm systemd[1]: Started libvirtd.service - Virtualization daemon. Jul 03 16:32:24 dell-fedora-kvm dnsmasq[957]: started, version 2.86 cachesize 150 Jul 03 16:32:24 dell-fedora-kvm dnsmasq[957]: compile time options: IPv6 GNU-getopt DBus no-UBus no-i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset auth cryptohash Jul 03 16:32:24 dell-fedora-kvm dnsmasq-dhcp[957]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h Jul 03 16:32:24 dell-fedora-kvm dnsmasq-dhcp[957]: DHCP, sockets bound exclusively to interface virbr0 Jul 03 16:32:24 dell-fedora-kvm dnsmasq[957]: reading /etc/resolv.conf Jul 03 16:32:24 dell-fedora-kvm dnsmasq[957]: using nameserver 127.0.0.53#53 Jul 03 16:32:24 dell-fedora-kvm dnsmasq[957]: read /etc/hosts - 2 addresses Jul 03 16:32:24 dell-fedora-kvm dnsmasq[957]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses Jul 03 16:32:24 dell-fedora-kvm dnsmasq-dhcp[957]: read /var/lib/libvirt/dnsmasq/default.hostsfile
- 手动启动的服务会在运行约2分钟后自动关闭,关闭时状态输出如下,用户未修改过
libvirtd.service原生配置:
[root@dell-fedora-kvm ~]# systemctl status libvirtd ○ libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: disabled) Active: inactive (dead) since Sun 2022-07-03 16:37:25 AEST; 6s ago TriggeredBy: ○ libvirtd-tcp.socket ● libvirtd-admin.socket ● libvirtd-ro.socket ○ libvirtd-tls.socket ● libvirtd.socket Docs: man:libvirtd(8) https://libvirt.org Process: 994 ExecStart=/usr/sbin/libvirtd $LIBVIRTD_ARGS (code=exited, status=0/SUCCESS) Main PID: 994 (code=exited, status=0/SUCCESS) Tasks: 2 (limit: 32768) Memory: 31.7M CPU: 330ms CGroup: /system.slice/libvirtd.service ├─ 957 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper └─ 958 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper Jul 03 16:35:25 dell-fedora-kvm systemd[1]: Starting libvirtd.service - Virtualization daemon... Jul 03 16:35:25 dell-fedora-kvm systemd[1]: Started libvirtd.service - Virtualization daemon. Jul 03 16:35:25 dell-fedora-kvm dnsmasq[957]: read /etc/hosts - 2 addresses Jul 03 16:35:25 dell-fedora-kvm dnsmasq[957]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses Jul 03 16:35:25 dell-fedora-kvm dnsmasq-dhcp[957]: read /var/lib/libvirt/dnsmasq/default.hostsfile Jul 03 16:37:25 dell-fedora-kvm systemd[1]: libvirtd.service: Deactivated successfully. Jul 03 16:37:25 dell-fedora-kvm systemd[1]: libvirtd.service: Unit process 957 (dnsmasq) remains running after unit stopped. Jul 03 16:37:25 dell-fedora-kvm systemd[1]: libvirtd.service: Unit process 958 (dnsmasq) remains running after unit stopped.
故障根本原因
这不是配置错误,是Fedora 36中libvirtd的默认设计逻辑:
- 从Fedora 34版本开始,libvirtd默认采用socket按需激活模式,而非传统的开机常驻运行模式。你看到的
libvirtd.socket等5个socket单元就是激活触发器:只有当有libvirt客户端(比如virsh、virt-manager)连接对应socket时,系统才会临时拉起libvirtd进程处理请求。 - 服务启动参数中默认带
--timeout 120配置,意思是如果libvirtd连续120秒没有收到任何客户端请求,就会自动退出释放资源,这就是手动启动后2分钟服务自动关闭的原因。 - 执行
systemctl enable libvirtd只是设置了服务单元本身的开机自启,但默认模式下开机不会主动触发服务启动,只有socket收到连接请求才会启动服务,所以重启后默认看不到libvirtd进程运行,属于正常现象。
排查与解决方案
根据使用场景二选一即可:
方案1:保留默认按需启动模式(推荐,资源占用更低)
不需要额外修改配置,这种模式不影响KVM正常使用:
- 当执行
virsh list等libvirt操作命令,或者有其他管理工具连接libvirt时,系统会自动启动libvirtd进程,操作无感知 - 空闲自动退出是预期行为,不会影响已经运行的虚拟机,虚拟机进程由libvirt_qemu相关进程托管,和libvirtd主进程生命周期无关
- 验证方式:直接执行
virsh list --all,再查询服务状态,会发现libvirtd已经被自动拉起
方案2:改为传统常驻运行模式(适合需要libvirtd长期运行的场景)
如果不想用按需启动,要让libvirtd开机就启动、且不会因为空闲自动退出,按以下步骤操作:
- 停止并禁用默认的socket激活单元:
systemctl stop libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket libvirtd-tcp.socket libvirtd-tls.socket systemctl disable libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket libvirtd-tcp.socket libvirtd-tls.socket
- 覆盖默认的服务启动参数,去掉超时退出配置:
mkdir -p /etc/systemd/system/libvirtd.service.d/ cat > /etc/systemd/system/libvirtd.service.d/override.conf <<EOF [Service] Environment=LIBVIRTD_ARGS="--timeout 0" EOF
--timeout 0表示禁用空闲自动退出逻辑
3. 重载systemd配置,设置libvirtd开机自启并立即启动:
systemctl daemon-reload systemctl enable --now libvirtd
- 验证:重启服务器后执行
systemctl status libvirtd,会看到服务保持active(running)状态,且不会再2分钟后自动退出。
注意:不要直接修改
/usr/lib/systemd/system/libvirtd.service原生文件,后续系统更新会覆盖该文件,用上面的override.conf方式自定义配置是官方推荐的做法。
内容的提问来源于stack exchange,提问作者Thomas Meier
相关产品推荐
相关产品推荐

