如何为exception网络配置配置Ubuntu / Upstart?

我最近在一个专门为托管某些虚拟机而构建的新服务器盒上安装了Ubuntu Utopic 14.04 LTS。 此框的网络配置(包含两个NIC)仅通过虚拟网桥公开两个网卡 – 一个到专用网络,一个到面向公众的Internet。 一个客户虚拟机将通过分接头访问两个网桥,特别是作为主机的防火墙和网关以及专用网络。 另一个VM将只是专用网络上的独立访客服务器。 主机只能通过相应的专用网桥直接加入专用网络。

因此,eth0和eth1都不会仅仅在其相应虚拟桥的上下文之外“向上”。 然而,当Ubuntu引导时,我相信暴发户的故障保护是错误的假设(坚持?)至少eth0独立,然后它将允许系统超过故障安全施加的20/40/60秒延迟。 然而,在启动完成之前,延迟几乎没有希望得到解决,并允许客户虚拟机开始自由启动! 看悖论? 说实话,我不确定eth0和eth1是否会达到状态故障保护要求。

在一个原始的,反动的层面上,我的沮丧,非Ubuntu方面想要破坏故障保护,因为每次重新启动配置更改都迫使我等待最多两分钟的状态更改,我99.9%肯定会从未发生过设计 。 底线 – 没有故障安全依赖。 我只是想做出额外的箍,我意识到故障保护正在迫使它消失。

出于同样的原因,我试图至少在某种程度上对Upstart尝试使用故障保护措施持开放态度,因为这是我第一次接触它。 我已经看到一些(非常模糊)的信息,其中一种方法涉及改变/ etc / network / interfaces的设置方式,将我的网桥设置转移到他们自己的Upstart任务中,但我真的更愿意单独保留我的接口定义,快乐,工作。

那么,我的选择是什么? 我可以直接消除故障安全任务,或修改它以改变其条件吗? 如果是这样,怎么样? 我必须破解我的interfaces文件吗?

首先,让我为回答我自己的问题而道歉。

其次,我实际上已经克服了failsafe.conf启动延迟问题。 虽然我意识到在这个问题上没有激活的活动,但我已经在各种其他线程上看到了类似故障保护/启动延迟问题的足够活动,我正在发布我的研究和解决方案,以便在类似的泡菜中为其他人带来好处。

概观

正如在最初的post中所指出的那样,我看到的问题是故障安全新手工作对我的系统启动施加了不必要的限制。 然后我进一步研究了这个问题,发现为什么故障安全表现得像。

分析

默认情况下,failsafe.conf定义一个启动条件,在启动时有效地触发它(只要文件系统和环回接口可用),并定义两个可能的停止条件之一:

start on filesystem and net-device-up IFACE=lo stop on static-network-up or starting rc-sysinit 

由于没有“停止”事件发生,故障安全部队坚持延迟。 第二个条件rc-sysinit是最终系统初始化任务之一的upstart运行,它有自己的启动条件

 start on (filesystem and static-network-up) or failsafe-boot 

由于故障安全没有停止 ,显然rc-sysinit没有启动。 一旦超时到期,Failsafe将发出failafe-boot事件。 鉴于故障安全已经开始,隐含了“文件系统”,因此两个事件的唯一剩余条件是“静态网络连接”。 故障安全正在运行,因为它认为任何网络接口都没有“启动”。

原因

通过/etc/network/if-up.d向后工作,定义了一个upstart脚本,它迭代通过“auto”限定符定义的/ etc / network / interfaces中定义的所有网络接口,这意味着要启动接口在开机时。 界面如何被视为“向上”的定义成为我稍后将描述的重要语义问题。

当且仅当所有“自动”配置的接口都“up”时,upstart脚本才会发出着名的“static-network-up”事件。 反过来,这将允许rc-sysinit触发并终止故障保护 – 因此是我的问题的根本原因。 我的网络接口都没有在启动时具有IP地址 – 按设计。 但是,’static-network-up’并没有遵循没有 IP地址的接口“up”的想法,因此故障保护会一直持续到超时为止。

对于我的情况,我将盒子中的两个物理网卡连接到网桥,并通过水龙头将它们暴露给两个不同的VM。 一台虚拟机通过一个分路器提供DHCP,另一个虚拟机只是同一网络上的服务器。 为了使网络能够被VM轻击,NIC必须至少“UP”,被动地允许数据包通过。 因此,’auto’在/ etc / network / interfaces中似乎是合适的。 然而,在故障保护的眼中,这是不合适的,因此唯一的解决方案必须是遵守故障保护的语义。

那么,我的问题的解决方案是双重的:

  1. 从我定义的每个网络接口(环回除外)中删除’auto’声明。
  2. 创建新手工作以“手动”显示以前的“自动”界面。

我通过模仿这里提供的解决方案,定义了一个作业,四个设备中的四个 – 两个水龙头和两个虚拟桥梁。

在此配置中,没有“自动”接口,网络脚本现在应立即发出’static-network-up’,从而强制故障保护终止。 最后的修改要求我在每个tap的接口定义中添加一个“post-up”子句来调用’brctl’并创建相应的虚拟桥,以前是作为’auto’配置的一部分完成的。

所以,我的/ etc / network / interfaces(部分)现在看起来像:

 #auto tpRED (commented out) iface tpRED inet manual pre-up /usr/sbin/tunctl -t tpRED post-up /sbin/brctl addbr brRED #auto brRED iface brRED inet manual bridge_ports eth1 tpRED bridge_hw xx:yy:aa:bb:cc:dd 

酸测试

酸测试? 重新启动服务器。 当我这样做时, 故障安全超时消失了 ,我的网络出现了function相同的配置。 有用!! 我希望我们能够更好地处理“UP”网络接口的语义!