在自己的笔记本电脑上全新安装了Ubuntu 7.10。不记得是刚装好就有的,还是动了几次配置之后, 出现了了如下问题:
1)登录进去弹出警告”Failed to initialize HAL!”.
2) 网络显示”没有可用的网络设备”,但是选择手动配置,设置为DHCP自动获取后,能上网,但是图标上还是红x和提示”没有可用的网络设备”。
3) 电源管理打不开。
幸运的是昨晚折腾一晚后,上面的问题解决了。
过程如下:
1) 进services里面,发现hal没有启动,手动启动之。
退出后发现网络上面显示正常了。点电源管理,能启动了。
说明关键在于HAL上,后面的几个现象都是由于HAL开机时候没有成功启动。
2) 着手HAL的启动问题,查到hal的启动项为 /etc/rc2.d/S12hal。12表示启动优先级。(S for service?) 其依赖的dbus的启动项为S12dbus。
登录后hal可以手动启动表明dbus是启动好的。登录时候hal启动不了可能因为当时dbus没有启动完成。于是考虑把hal的启动顺序推后。移除S12hal的链接,重新ln为S13hal。重启后问题消失。
网上看到有人说解决办法是取消自动登录,然后在登录窗口稍等片刻后再登录。不过我尝试后发现不行。而用上面的办法的话,用不用自动登录都没有关系。
回头会再到台式机上验证一下里面hal的启动优先级是多少。不过感觉应该还是默认的12。
之前配置notes时候遇到一些问题。不过这个hal解决了的话,下班后可以重新搞下notes。
过程很简单,但是很有成就感。
同时还看到网友 祺祺 的解决Ubuntu 7.10中 “failed to initialize hal”错误的办法:
在Ubuntu Linux下,有不少朋友遇到“failed to initialize hal”错误。
这个错误最直接的表现是:在启动时弹出提示框告诉用户“failed to initialize hal”
这个错误将间接导致一些即插即用硬件使用错误。
比如:网卡本来是即插即用的,你拨掉网线、网络就会不可用,当你再插上网上,系统应该自动恢复网络。但如果出现上述错误就不会这样了。
又比如:U盘和移动硬盘本来是即插即用的,你一插上U盘就会在桌面上显示一个U盘符号并显示卷名称。但如果出现上述错误,就会表现为U盘或移动硬盘不能自动挂载。
出现上述原因的根本在于系统服务dbus和hal的启动顺序。
Ubuntu Linux中采用dbus+hal来管理即插即用设备,关于具体工作方式,大家可以自己用google搜索一下。
关键要知道的一点就是dbus服务必须在hal之前启动,否则hal就会启动失败。
大多数Linux系统中,所有服务都在/etc/init.d目录下有个启动脚本程序,比如:
acpid checkroot.sh hostname.sh mountdevsubfs.sh readahead udev-finish
acpi-support clamav-freshclam hotkey-setup mountkernfs.sh readahead-desktop umountfs
alsa-utils consolekit hwclockfirst.sh mountnfs-bootclean.sh README umountnfs.sh
anacron console-screen.sh hwclock.sh mountoverflowtmp reboot umountroot
apmd console-setup keyboard-setup mtab.sh rmnologin urandom
apparmor cron killprocs networking rsync usplash
apport cupsys klogd nvidia-kernel screen vbesave
atd dbus laptop-mode pcmciautils sendsigs vmware
avahi-daemon dhcdbd libpam-foreground powernowd single waitnfs.sh
bluetooth dns-clean linux-restricted-modules-common powernowd.early skeleton wpa-ifupdown
bootclean gdm loopback pppd-dns stop-bootlogd x11-common
bootlogd glibc.sh makedev procps.sh stop-bootlogd-single xserver-xorg-input-wacom
bootmisc.sh hal module-init-tools rc stop-readahead
brltty halt mountall-bootclean.sh rc.local sysklogd
checkfs.sh hdparm mountall.sh rcS udev
对于不同的启动级别(比如级别N)需要启动的服务,在/etc/rcN.d目录下有相应的链接指向/etc/init.d目录下相应的脚本,比如:
lrwxrwxrwx 1 root root 13 2007-12-24 22:28 gdm30S -> ../init.d/gdm
lrwxrwxrwx 1 root root 18 2008-01-18 21:21 K08vmware -> /etc/init.d/vmware
-rw-r–r– 1 root root 556 2007-10-04 19:17 README
lrwxrwxrwx 1 root root 17 2007-12-24 22:28 S05vbesave -> ../init.d/vbesave
lrwxrwxrwx 1 root root 25 2007-12-24 22:28 S10powernowd.early -> ../init.d/powernowd.early
lrwxrwxrwx 1 root root 34 2007-12-24 22:28 S10xserver-xorg-input-wacom -> ../init.d/xserver-xorg-input-wacom
lrwxrwxrwx 1 root root 14 2007-12-24 19:33 S12dbus -> ../init.d/dbus
lrwxrwxrwx 1 root root 13 2007-12-24 22:28 S12hal -> ../init.d/hal
lrwxrwxrwx 1 root root 22 2007-12-24 22:28 S18avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 26 2008-01-18 21:12 S20clamav-freshclam -> ../init.d/clamav-freshclam
lrwxrwxrwx 1 root root 17 2007-12-24 22:28 S20makedev -> ../init.d/makedev
lrwxrwxrwx 1 root root 23 2007-12-24 22:28 S20nvidia-kernel -> ../init.d/nvidia-kernel
lrwxrwxrwx 1 root root 15 2007-12-24 22:28 S20rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root 20 2007-12-24 22:28 S22consolekit -> ../init.d/consolekit
lrwxrwxrwx 1 root root 16 2007-12-24 22:28 S24dhcdbd -> ../init.d/dhcdbd
lrwxrwxrwx 1 root root 15 2008-01-19 16:58 S50acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 20 2008-01-19 16:56 S50alsa-utils -> ../init.d/alsa-utils
lrwxrwxrwx 1 root root 17 2008-01-19 16:58 S50anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 14 2008-01-19 16:58 S50apmd -> ../init.d/apmd
lrwxrwxrwx 1 root root 13 2008-01-19 16:58 S50atd -> ../init.d/atd
lrwxrwxrwx 1 root root 16 2008-01-19 16:58 S50brltty -> ../init.d/brltty
lrwxrwxrwx 1 root root 16 2008-01-19 16:58 S50cupsys -> ../init.d/cupsys
lrwxrwxrwx 1 root root 13 2008-01-18 21:00 S50gdm -> ../init.d/gdm
lrwxrwxrwx 1 root root 16 2008-01-19 16:57 S50hdparm -> ../init.d/hdparm
lrwxrwxrwx 1 root root 22 2008-01-19 16:57 S50hotkey-setup -> ../init.d/hotkey-setup
lrwxrwxrwx 1 root root 15 2008-01-19 16:57 S50klogd -> ../init.d/klogd
lrwxrwxrwx 1 root root 19 2008-01-19 16:58 S50powernowd -> ../init.d/powernowd
lrwxrwxrwx 1 root root 18 2008-01-19 16:57 S50sysklogd -> ../init.d/sysklogd
lrwxrwxrwx 1 root root 14 2007-12-24 22:28 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 18 2008-01-18 21:21 S90vmware -> /etc/init.d/vmware
lrwxrwxrwx 1 root root 17 2007-12-24 22:28 S98usplash -> ../init.d/usplash
lrwxrwxrwx 1 root root 22 2007-12-24 22:28 S99acpi-support -> ../init.d/acpi-support
lrwxrwxrwx 1 root root 21 2007-12-24 22:28 S99laptop-mode -> ../init.d/laptop-mode
lrwxrwxrwx 1 root root 18 2007-12-24 22:28 S99rc.local -> ../init.d/rc.local
lrwxrwxrwx 1 root root 19 2007-12-24 22:28 S99rmnologin -> ../init.d/rmnologin
lrwxrwxrwx 1 root root 24 2007-12-24 22:28 S99stop-readahead -> ../init.d/stop-readahead
这里S开头的服务将在启动时加载,S后面的数字代表了服务的启动顺序,数字小的服务将在数字大的服务之前启动,比如S90vmware服务将在S90usplash之前启动。之后再按字母顺序启动各服务。
出现“failed to initialize hal”错误就是因为hal服务在dbus之前启动。可能为:
S12hal S50dbus
要纠正这一错误,只需要把dbus前面的S50改成比hal前面的S12小或相等就可以了。比如:
sudo mv S50dbus S12dbus