开始的时候,因为dmesg报告的错误是
[ 0.100729] [Firmware Bug]: ACPI: BIOS _OSI(Linux) query ignored
[ 2.629929] [Firmware Bug]: Duplicate ACPI video bus devices for the same VGA controller, please try module parameter "video.allow_duplicates=1"if the current driver doesn't work.
[ 13.262620] kernel BUG at include/net/cfg80211.h:3150!
就认为是firmware也就是bios的bug,用sudo getSystemId查看机器的bios信息
Libsmbios version: 2.2.28
Product Name: Latitude D630
Vendor: Dell Inc.
BIOS Version: A13
System ID: 0x01F9
Service Tag:
Express Service Code: 0
Asset Tag:
Property Ownership Tag:
根据 https://wiki.ubuntu.com/DellBIOS
其中这一节内容
Upgrading the BIOS using Dell's "biosdisk" and "syslinux memdisk"
说可以使用FreeDos来加载Dell的bios镜像,比如我要的是D630_A17.exe 。
就按照该节的内容,手动刷新了bios。
这次下决心解决这台机器一直存在的两个问题,
一是系统不能自动关机和重启,必须长按电源键强制关机,
开机后从splash到登录界面出现之前,deepin动画不显示,不论登录与否,
Ctrl+Alt+F1无法切换到控制台1(现象为附件的图示),
只能Ctrl+Alt+F2等切换到其他控制台。
二是无线网卡一直工作不起来。
开始的时候,因为dmesg报告的错误是
[ 0.100729] [Firmware Bug]: ACPI: BIOS _OSI(Linux) query ignored
[ 2.629929] [Firmware Bug]: Duplicate ACPI video bus devices for the same VGA controller, please try module parameter "video.allow_duplicates=1"if the current driver doesn't work.
[ 13.262620] kernel BUG at include/net/cfg80211.h:3150!
就认为是firmware也就是bios的bug,用sudo getSystemId查看机器的bios信息
Libsmbios version: 2.2.28
Product Name: Latitude D630
Vendor: Dell Inc.
BIOS Version: A13
System ID: 0x01F9
Service Tag:
Express Service Code: 0
Asset Tag:
Property Ownership Tag:
所以决定先刷新版的bios。根据
https://help.ubuntu.com/community/BIOSUpdate
http://www.ducea.com/2007/08/27/dell-bi ... on-debian/
http://linux.dell.com/wiki/index.php/Oss/Firmware_Tools
https://launchpad.net/ubuntu/+source/fi ... addon-dell
首先采用
http://www.ducea.com/2007/08/27/dell-bi ... on-debian/
所给出的方法,失败,原因是执行完命令
dellBiosUpdate -u -f bios.hdr
后要重启机器期间不能断电,但是系统的问题正好是无法自动关机和重启,
强制关机是要断电的,这就矛盾了。只能换其他方法。
根据
https://wiki.ubuntu.com/DellBIOS
其中这一节内容
Upgrading the BIOS using Dell's "biosdisk" and "syslinux memdisk"
说可以使用FreeDos来加载Dell的bios镜像,比如我要的是D630_A17.exe 。
就按照该节的内容,手动刷新了bios。
重启后发现bios版本已经更新好了,但是无法自动关机和重启的问题,
以及无线网卡不工作的问题依然存在。
重新回顾dmesg的输出,注意到
[ 13.262620] kernel BUG at include/net/cfg80211.h:3150!
搜索cfg80211,根据
http://www.crifan.com/files/doc/docbook ... 80211.html
可知cfg80211是无线驱动架构的一部分,
因此猜测上述现象的根源是无线网卡驱动有问题。
首先仔细阅读的BroadCom 43xx系统无线网卡的驱动文档
https://help.ubuntu.com/community/WifiD ... t%20access
以及配套文档
http://wireless.kernel.org/en/users/Dri ... developers
可知主要的驱动为wl、b43两种,事实上由apt命令可查知,
deepin(也可能是ubuntu)给出的驱动包既有firmware-b43-installer
它提供了b43这个开源驱动,
也有 bcmwl-kernel-source,它提供了wl这个Broadcom STA驱动。
然后确认无线网卡的型号。根据
http://wireless.kernel.org/en/users/Dri ... ed_devices
可知,这台机器的无线网卡是
PCI-ID: 14e4:4311
Supported? yes
Chip ID: BCM4311
Modes: b/g
PHY version: G
Alternative: wl
再仔细查看lsmod的输出,确认系统加载了使用了wl驱动,而没有加载b43驱动。
然后进入/etc/modprobe.d/
查看里面的那些blacklist文件,发现正好有一个由bcmwl-kernel-source生成的
blacklist文件,内容是屏蔽了b43相关的驱动。
因此,尝试解决的办法就是,首先屏蔽wl的驱动看看效果。
在/etc/modprobe.d/里新建blacklist-broadcom-wireless.conf屏蔽掉wl,
强制关机后,重启,splash显示出来了,登入桌面,lsmod检查wl驱动已经屏蔽。
按Ctrl+Alt+F1也能切换到tty1的正常状态(即命令行等待用户名输入)
然后点关机图标,关机过程正常。重复一遍操作,把关机换成重启,过程也正常。
既然屏蔽掉wl驱动解决了关机和重启问题,并且引发问题的根源是
bcmwl-kernel-source,那么为了让无线网卡工作,应该试试b43驱动。
所以再次开机登录桌面后,用apt命令卸载bcmwl-kernel-source,
检查一下/etc/modprobe.d/里面的文件,发现由bcmwl-kernel-source生成的
blacklist也删除了。于是重启机器,登录桌面后立刻发现无线网络已经连接好了。
检查lsmod | grep -i 'b43',显示b43及其相关的依赖驱动都已加载。
总结:
当系统安装完,发现无法正常关机和重启时,原因很可能是某个设备的驱动程序
出现了问题,比如有bug,造成内核在启动阶段就已经出错。
所以解决方法就是通过dmesg、lspci配合grep,找到出错的log内容,
然后根据该log内容搜索标准文档,搞清楚原理,
最后通过屏蔽出错驱动尝试解决问题。如果已经解决,那么卸载出错的驱动。
如有必要,安装新的正确驱动。