为什么启动时建立 LAN 连接需要这么长时间?

为什么启动时建立 LAN 连接需要这么长时间?

我遇到一个问题,虚拟机在启动时需要一些时间才能连接到本地网络。

我使用以下命令创建虚拟机:

virt-install \
    --connect qemu:///system \
    --name demo \
    --noautoconsole \
    --disk path=/demo.qcow2,device=disk,format=qcow2,bus=virtio,cache=writeback \
    --disk path=/base.qcow2,device=disk,format=qcow2,bus=virtio,cache=writeback \
    --import \
    --vcpus 1 \
    --virt-type kvm \
    --ram 256 \
    --hvm \
    --os-type linux

systemd当我在运行 Ubuntu 14.04.4 LTS 的主机上创建计算机时,一切正常:虚拟机启动并在运行脚本之前连接到 LAN 。然而,当主机运行 Debian 8.5 时,虚拟机需要一段时间才能连接,并且systemd脚本开始运行,然后才能真正使用网络资源。

在调试过程中,我创建了以下脚本:

#!/bin/bash

date >> /ping.log
ping -c 3 -W 3 "192.168.1.7" >> /ping.log
date >> /ping.log
curl google.com >> ping.log
date >> /ping.log

下面是相应的systemd配置:

[Unit]
Description=Demo
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/demo-init

[Install]
WantedBy=multi-user.target

机器启动后,ping.log包含以下内容:

Tue Jul 19 12:57:56 UTC 2016
PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data.
From 192.168.1.35 icmp_seq=1 Destination Host Unreachable
From 192.168.1.35 icmp_seq=2 Destination Host Unreachable
From 192.168.1.35 icmp_seq=3 Destination Host Unreachable

--- 192.168.1.7 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2001ms
pipe 3
Tue Jul 19 12:57:59 UTC 2016
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
[...]
</BODY></HTML>^M
Tue Jul 19 12:58:16 UTC 2016

代表着:

  • ping失败,
  • 连接需要20秒。

相比之下,当在 Ubuntu 主机上运行同一台机器时,以下内容存储在ping.log

Tue Jul 19 13:18:12 UTC 2016
PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data.
64 bytes from 192.168.1.7: icmp_seq=1 ttl=64 time=2.27 ms
64 bytes from 192.168.1.7: icmp_seq=2 ttl=64 time=0.711 ms
64 bytes from 192.168.1.7: icmp_seq=3 ttl=64 time=5.47 ms

--- 192.168.1.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.711/2.819/5.472/1.981 ms
Tue Jul 19 13:18:14 UTC 2016
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
[...]
</BODY></HTML>^M
Tue Jul 19 13:18:14 UTC 2016

这里:

  • ping成功了,
  • 需要 2 秒,这是实际执行操作的时间ping

实际主机(Debian 和 Ubuntu)具有不同的硬件(包括不同数量的 NIC),因此很难比较配置。然而,虚拟机的部署方式完全相同,基于预装 Debian 的相同基础磁盘,并且具有完全相同的/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address 192.168.1.35
    netmask 255.255.240.0
    network 192.168.0.0
    broadcast 192.168.3.255
    gateway 192.168.1.1
    dns-nameservers 192.168.1.3 192.168.1.4 8.8.8.8 8.8.4.4

我有两个问题:

  • 造成如此巨大延误的可能原因是什么?

  • 我是不是误会了的目的network-online.target?我认为它可以保证运行脚本时的基本连接。既然事实并非如此,那么这样做的目的是什么?

答案1

找到了。在类似的情况下,作者抱怨说:

我必须等待大约 20 秒才能网络恢复正常。

看来:

此延迟是由生成树协议 (STP) 引起的

事实上,区别之一是/etc/network/interfacesDebian 主机上包含bridge_stp on,而在 Ubuntu 上则没有bridge_stp声明。

相关内容