Debian

為什麼在啟動時建立 LAN 連接需要這麼長時間?

  • July 19, 2016

我有一個虛擬機在啟動時需要時間連接到本地網路的問題。

我使用以下命令創建虛擬機:

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

當我在執行 Ubuntu 14.04.4 LTS 的主機上創建機器時,一切正常:虛擬機在執行systemd腳本之前啟動並連接到 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?我認為它會在執行腳本時保證基本連接。既然事實並非如此,那它的目的是什麼?

找到了。在類似的案例中,送出人抱怨說:

我必須等待大約 20 秒,直到我的網路啟動。

看來

此延遲是由生成樹協議 (STP) 引起的

確實,其中一個區別是/etc/network/interfacesDebian 主機包含bridge_stp on,而在 Ubuntu 上,沒有bridge_stp聲明。

引用自:https://unix.stackexchange.com/questions/296857