我写了一个 upstart 任务来修改/etc/网络/接口。(实际上是将文件source
d 放入其中。)start on
我需要声明哪个条件才能让我的任务运行前有网络工作吗?
我试过了start on starting networking
,但显然已经太晚了。启动后登录时,我可以看到更改已写入,但显然没有使用:新配置声明静态 IP,但启动过程等待不存在的 DHCP 服务器(旧配置)超时。
我也试过了start on starting network-interface INTERFACE=eth0
,但也没用。我记得日志里有一个错误,说无法写入更改。
背景:我需要一个可以克隆的 VM 模板,并通过脚本配置克隆。除其他设置外,我需要为它们提供一个静态 IP 地址,以便从主机访问它们。我使用 guestfish 将配置文件写入其中一个虚拟磁盘,并让脚本将这些设置应用于系统。我不希望该磁盘包含实际的系统设置文件。我无法直接修改 /etc,因为该磁盘在克隆之间共享(写时复制/差异),而 guestfish 显然不支持该类型的映像。我也可以让它们使用 DHCP 并设置一个通过 MAC 分配 IP 的服务器,但我担心复杂性。我还可以添加另一个虚拟磁盘用于配置文件,但如果可能的话,我更愿意将设置直接存储在系统磁盘映像上。
使用的软件:Ubuntu Server 12.04,VirtualBox。配置修改器是一个自己编写的ruby脚本。
答案1
为自己找到了一种解决方法。
我从 VM 模板中删除了 eth0 的所有配置。因此它不会自动启动。我的配置作业现在从 开始starting networking
,修改配置文件并明确调用ifup eth0
。
虽然这解决了我的问题,但这不符合在联网之前如何在 upstart 中启动服务/任务的一般情况。因此,我将保留这个问题。
答案2
start on starting network-interface
instance $INTERFACE
task
exec mything
和
start on starting networking
task
exec mything
ifup 通过两种方法之一运行,要么由network-interface
作业运行,要么由networking
作业运行,用于配置 udev 未涵盖的任何接口。
上面的节instance
确保您的工作在两种情况下都启动,因为 upstart 的工作方式是,一种or
情况不会阻止另一种情况。
(顺便说一下,这就是这个错误:https://bugs.launchpad.net/upstart/+bug/568860)
如果你的作业不能同时或两次运行,则需要将其拆分为三个作业。一个名为“mything-waiter”:
start on starting network-interface
instance $INTERFACE
task
exec start wait-for-state WAITER=mything-waiter-$UPSTART_JOB-$INTERFACE WAIT_FOR=mything
另一个具有类似的执行行,用于启动网络:
start on starting networking
task
exec start wait-for-state WAITER=mything-waiter-networking WAIT_FOR=mything
另一个叫做“神话”,它只是
task
exec mything
我认为可以提出一个论点,即“在启动网络时启动”可以完成所有这些工作,但这需要对 Ubuntu 中的网络启动进行重新设计。
答案3
你能简单地在 开始工作吗start on startup
?如果你只需要在网络启动之前更改配置,是否有理由将其与网络启动联系起来。
编辑:好的,那不起作用。
我现在不能弄乱我的初始化系统,所以我必须给出一些未经测试的建议:
第一个选项:将task
stanza 添加到您的作业中。它应该让 Upstart 等到它退出后再启动待处理的网络/网络接口作业。我相当确定这并没有解决时间问题,因为 AskUbuntu 中有很多关于如何将内容注入正常启动过程的问题。
第二种选择:使用覆盖文件。我认为network-interface.conf
是您需要伪造的文件。遗憾的是,它已经使用了部分,因此我们需要将其(并且仅将其)复制到我们的文件pre-start
中,而不是仅仅制作一个。network-interface.override
复制完pre-start
部分后,只需修改内容以满足您的需求。原始文件保持原样,但覆盖的预启动部分实际上会覆盖原始作业中的部分。
希望有帮助。