本文信息参考了以下:
主要:http://forum.ubuntu.org.cn/viewtopic.php?f=42&t=328969
原文:http://ubuntuforums.org/showpost.php?p=10557451&postcount=5
Source:https://github.com/mkottman/acpi_call
由于某次悲剧的断电之后,用wubi装的Ubuntu10.04能在修复后运行,但是Win7却悲剧的启动不能,所以从新装了Win7,而且索性割了一部分硬盘出来直接装Ubuntu。感谢Laohyx帮我装完了系统并完成了引导……虽然Win7还是挂了……
发现Ubuntu在不插电时电量消耗还是很大,考虑到这个系统应该比Win不耗电,而且发热异常,所以上网查了一下,发现是因为Linux不是很好的支持双显卡,导致独显一直全功率运行。上网搜索了方法并且实践了,能耗是有所下降。现在将代码贴上来方便大家以后需要。本人电脑为:ASUS A42JV.以下开始转载……
1. 在家目录下创建一个隐藏文件夹
代码:
mkdir ~/.optimus
cd ~/.optimus/
2. 安装git,使我们可以使用acpi_call模块关闭n卡
代码:
sudo apt-get install git
git clone http://github.com/mkottman/acpi_call.git
3. 下面,进入acpi_call目录,进行编译
代码:
cd acpi_call/
make
4. 现在,将模块放入内核的acpi文件夹
代码:
sudo insmod ./acpi_call.ko
5. 运行这个命令并记录下内核版本
代码:
uname -r
-- 如:本人内核是2.6.38-11-generic。
6. 复制模块并运行depmod
代码:
sudo cp acpi_call.ko /lib/modules/<UNAME -R VALUE>/kernel/drivers/acpi/
sudo depmod
-- 此处的 <UNAME -R VALUE>,即为上文中uname -r 的输出结果,
-- 如:本人的应为 sudo cp acpi_call.ko /lib/modules/2.6.38-11-generic/kernel/drivers/acpi/
7. 编辑/etc/modules,是模块在启动时加载
代码:
gksu gedit /etc/modules
插入:
acpi_call
--添加在文件末尾,独立一行即可
按照原文的内容,应该进行步骤8,不过原文是针对ASUS U36Jc的,因此,我们先要运行以下的内容。
补充:
在上文创建的 acpi_call 目录下,执行
./test_off.sh
脚本将会测试各种关闭显卡的命令,一直到可以成功关闭为止。
如下:
richard@Richard-XPS:~/.optimus/acpi_call$ sudo sh test_off.sh
(本人直接参照默认配置,但是有些人机器不同,可能会产生一下结果,特此说明:
Trying \_SB.PCI0.P0P1.VGA._OFF: failed
Trying \_SB.PCI0.P0P2.VGA._OFF: failed
Trying \_SB_.PCI0.OVGA.ATPX: failed
Trying \_SB_.PCI0.OVGA.XTPX: failed
Trying \_SB.PCI0.P0P3.PEGP._OFF: failed
Trying \_SB.PCI0.P0P2.PEGP._OFF: failed
Trying \_SB.PCI0.P0P1.PEGP._OFF: failed
Trying \_SB.PCI0.MXR0.MXM0._OFF: failed
Trying \_SB.PCI0.PEG1.GFX0._OFF: failed
Trying \_SB.PCI0.PEG0.GFX0.DOFF: failed
Trying \_SB.PCI0.PEG1.GFX0.DOFF: failed
Trying \_SB.PCI0.PEG0.PEGP._OFF: works!
有些人的机器若跑出以上结果,可以使用‘\_SB.PCI0.PEG0.PEGP._OFF’关闭,这一点将在步骤8中使用。请特别注意。其他结果请自行参照。)
8. 新建一个服务,使我们可以开启/关闭n卡
代码:
gksu gedit /etc/init.d/optimusoff
插入:
代码:
#! /bin/sh
### BEGIN INIT INFO
# Provides: optimusoff
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disables/Enables the NVidia graphics card
# within the NVidia Optimus system
#
# Modified for the U36Jc and Ubuntu 11.04
# using details from
#
# http://robbyx.net/blog/?p=190
### END INIT INFO
. /lib/lsb/init-functions
set -e
case "$1" in
start)
#
echo '\_SB.PCI0.PEG1.GFX0._OFF' > /proc/acpi/call
# -- 此处要更改为上文中 works的命令,如 上文举例的改为
# -- echo '\_SB.PCI0.PEG0.PEGP._OFF' > /proc/acpi/call
;;
stop)
echo '\_SB.PCI0.PEG1.GFX0._ON' > /proc/acpi/call
# --同上
;;
*)
echo '\_SB.PCI0.PEG1.GFX0._OFF' > /proc/acpi/call
# --同上
N=/etc/init.d/optimusoff
echo "Usage: $N {start|stop}\nBy default, 'start' is executed.\n" >&2
exit 1
;;
esac
exit 0
9. 激活服务
代码:
--使用这段代码的同学,请注意。如果你和我一样是双系统,这会让你的windows环境下也被屏蔽独显
--可以跳过这段代码,每次需要时手动运行。
sudo update-rc.d optimusoff defaults 98 02
sudo chmod a+x /etc/init.d/optimusoff
10. 在使用前,检查当前电力消耗(拔下电源)
代码:
grep rate /proc/acpi/battery/BAT0/state
***注释:有些人电脑里没有BAT0这个文件夹,但是有BAT1,请自行检查;BAT0应为默认
***注释:原文中的功率为15148mW,因人而异(本人的有2w多...)
11. 现在,关闭n卡
代码:
sudo service optimusoff start
12. 检查关闭nv显卡后的电力消耗
代码:
grep rate /proc/acpi/battery/BAT0/state
***注释:此时原文中的功率变为9828mW,大约为原来的65%,本人电脑是1W多
13. blacklist 显卡驱动模块,避免不必要的麻烦
代码:
gksu gedit /etc/modprobe.d/blacklist-nvidia.conf
插入:
代码:
blacklist nouveau
blacklist nvidia
14. 最后,运行以下代码
代码:
sudo update-initramfs -u
注:关于上文中说明的功率问题,本人测试后发现差异大约在20%~30%。还是有一定效果的。主要是风扇的转速和发热量都有很明显的变化。
另外,因为是编译到内核中的,很可能在更新内核后需要重新编译。请各位注意
PS:如果对BIOS有了解可以直接禁用另一块显卡...