显示标签为“upstart”的博文。显示所有博文
显示标签为“upstart”的博文。显示所有博文

2012年9月1日星期六

NetworkManager和Upstart

Ubuntu桌面下,网络是由NetworkManager管理的。NM很好用,但是有时要配置复杂网络,只能用interfaces等网络配置文件搞定。

我给eth0设置了静态IP,用于办公室环境(其实也是DHCP网络)。回家之后这个静态IP得不到,开机的时候会等待2分钟时间让网络起来,先显示:
Waiting for network configuration...
1分钟后是:
Waiting up to 60 more seconds for network configuration...
最后是:
Booting system without full network configuration...
这在Launchpad上有N个bug报告。之后进入Ubuntu,interfaces文件没有生效,而且NM都没自动启动呢。来分析一下这个问题。

现在的Ubuntu在/etc/init.d下,System V Init任务和Upstart任务都有。如果是Upstart任务,则都链接到/lib/init/upstart-job,如NM:
tux@macbook:/etc/init.d(0)$ ls -l network-manager
lrwxrwxrwx 1 root root 21 May 25 12:01 network-manager -> /lib/init/upstart-job
开始我看到NM在/etc/rc?.d下没有启动脚本,就用update-rc.d创建了链接,但还是不能自动启动。后来才明白Upstart任务的启动和停止控制不在/etc/rc?.d目录下,而是在/etc/init目录。NM的配置文件为/etc/init/network-manager.conf。里面有:
start on (local-filesystems
      and started dbus
      and static-network-up)
就是说NM要在local-filesystem, dbusstatic-network-up之后才会启动,而这个Upstart Event(事件)应该是要在interfaces中的网络接口启用之后才会发生(Emit)。所以如果interfaces文件失效,NW也起不来。

那么开机等待的两分钟在哪里配置的呢?看了这个文章后才知道,是在/etc/init/failsafe.conf里面配置的。具体看该文件可以知道个大概。

2010年7月12日星期一

运行级的问题

Virtualbox和dictd开机不能启动。查看/etc/rc?.d下面的脚本链接没有问题,但是runlevel输出的是unknown。我以为是Ubuntu里面的upstart已经没有runlevel的概念了,但是查看/usr/share/doc/upstart/README.Debian.gz,里面说了runlevel的概念没有变,不过是在/etc/init/rc-sysinit.conf里面定义的。我看这个文件里面又说,runlevel可以被/etc/inittab里面的设置覆盖,而我的inittab里面只有一行了,是IBM DB2的。我想应该是这个文件造成了runlevel无法正确设置。

以前装了个IBM DB2 Express-C 9.7,想学学,但是装好后从来没有碰过,这次顺便就删除算了。没想到这个软件安装容易卸载难,安装的时候有详细的文档,卸载却制造各种障碍还没有文档。按照一个DB2 Express-C的卸载步骤,才卸载掉。重启后运行级还是unknown。干脆把inittab文件删除掉,问题还是照旧。

在launchpad上Ubuntu的Bug 543506里面,看到可以查看/var/log/boot.log(由bootlogd记录)。我发现我的里面有这样的记录:

init: network-interface (lo) pre-start process (748) terminated with status 1
init: network-interface (lo) post-stop process (752) terminated with status 1
init: network-interface (eth0) pre-start process (757) terminated with status 1
init: network-interface (eth0) post-stop process (766) terminated with status 1
…………
init: networking main process (948) terminated with status 1

这表明network-interfaces脚本启动出错,进而导致iinit没没有进入到运行级2,也就没有启动/etc/rc2.d里面的启动脚本。
我想起最近用了Network Manager上上网,为了不让interfaces文件起作用,我把/etc/network/interfaces文件改名了。这正是导致networking启动不起来的原因。我把interfaces文件改回去后重启,系统的运行级成了2,/etc/init.d下下面的vboxdrv和dictd都都启动了。

在上面说的bug记录中,有人指出了问题所在,就是upstart需要lo网络接口启用才能运行成功,而Network Manager启用lo后不会通知upstart。如果确实如他所说,在我的情况里,lo在interfaces文件里面,我把这个文件改名后,lo自然不是由networking启动的,而是由network-manager启动,没有通知upstart,所以就造成了init不能启动的问题。