用vga_switcheroo在Linux下(开启KMS)彻底关闭某一可切换显卡的简单教程


私在早先时记载过自己一直为一个问题所扰,就是私配备双显卡的Ideapad Y460在BIOS中仅支持“可切换”(switchable)和“独立”(原文为discrete graphic)两种模式。而当使用可切换模式进入Linux后,虽然只有集成显卡在使用,但两个显卡都会同时耗电,导致温度很高。虽然用独立显卡+催化剂(Ati的商业驱动)可以获得不错的效果,但会有诸多麻烦事情,更何况这样一来集显的节能优势就消失了。

我曾在谷歌上粗略查找过很多彻底关闭独立显卡的方案,然而就目前我看到的中文解答来说,除了那个ubuntu关闭独显的脚本还靠谱外,基本都是不靠谱的答案。直到我最近从Arch的Wiki辗转到了ubuntu documentation才找到一个使用内核自带的vga_switcheroo关闭显卡的方案。在此记述一下。
声明:本文只是记述了最主要的内容,详细内容可以从这个页面中找到。

//

下面进入正题:

首先,vga_switcheroo是内核提供的组件,但有这一组件(或者说有下文提到的文件)并不代表其在您的机器上能够正常使用。此外根据某些用户提供的信息,vga_switcheroo仅当KMS开启状态下才可用,所以请首先装好显卡的开源驱动并保持KMS开启。

一、查看当前双显卡使用状态:

终端中输入:

cat /sys/kernel/debug/vgaswitcheroo/switch

这步是要读出/sys/kernel/debug/vgaswitcheroo/switch这一文件的信息。不出意外您可能会看到类似下面(但不完全相同)的内容:

0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Off:0000:01:00.0

其中“IGD”表示集成显卡,“DIS”表示独立显卡;加号(“+”)表示当前用作输出(或称“连接上”(connected))的显卡;“Pwr”代表正在供电,“Off”代表已关闭。如果看到两个显卡都显示“Pwr”,则说明都在消耗着电能。

二、暂时性的关闭某一显卡

注意:下面和内核的交互操作是通过操作/sys/kernel/debug/vgaswitcheroo/switch这个“虚拟文件”实现的,而这一文件每次开机会重新创建,所以您对其所做的修改都是暂时的,重启后会失效。

首先切换到root用户:

su

这步通常是必要的,不可用sudo取代(似乎是因为sudo如果不经设置,是没有“>”操作符权限的)。

打开所有的显卡:

echo ON > /sys/kernel/debug/vgaswitcheroo/switch

这步是给所有显卡加电,使其运行,但不改变当前输出的状态。

切换到集成显卡:

echo IGD > /sys/kernel/debug/vgaswitcheroo/switch

这步表示使用集成显卡作为输出(即“连接上”集成显卡)。同理,将其中的“IGD”换成“DIS”可使用独立显卡。

关闭未使用的显卡:

echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

最后可以再运行一下cat /sys/kernel/debug/vgaswitcheroo/switch,看一看自己的显卡状态。

三、永久性的关闭某一显卡

解决重启后失效的办法就是每次开机时都执行一遍需要的命令,而且越早执行越好。对于这个问题,不同的发行版有不同的解决方案。例如在我所用的Arch Linux中有一个/etc/rc.local文件,把需要开机执行的命令写进去即可。对于ubuntu,可以参考ubuntu documentation上的一个启动脚本。我没有尝试过加环境变量是否有用,但似乎也应该是可以的。

//

后记:3月14日帝都(室温约20度),开启acpi节能的情况下,我的Ideapad Y460使用集显,打字、浏览网页等操作,CPU温度不到37度,电池续航4小时以上,真是太舒爽了……

回味FAD 2011


题目中的这个FAD不是黄素腺嘌呤二核苷酸,而是Fedora Activaty Day。LinuxToy上呼吁参与者稍微写一些感想,我也觉得确有写一些东西的必要了,于是就把这篇短文写了出来。

老实说,作为一个学医的,平时就不算太闲,最近更是相当繁忙的一段时期,本不应该抽空去FAD这样的“没用”的东西。然而我实在是很想找一段小小的空闲,暂时忘却一下现实的重压,寻找一点或许是虚假的、稍纵即逝的快慰。因而虽然里面的多数东西我都听得半懂不懂,却仍旧挺高兴,挺感动。见到了 @CSSlayer 仁兄以及在各种虚拟空间神交已久的诸君,觉得难得有一天如此开心。

 

可惜的是我的抒情功底实在太差,所以无论我如何安排,下面的记叙总还是免不了流水帐:

上午的内容我不想再赘述了,就在我写这篇网志的时候,我看到CSSlayer仁兄的FAD回忆网志写好了,可以点击这里去参考他的。对我等来说,下午的内容才是重点,也是真正的FAD内容。

本次FAD 11是和开源软件周合办的,所以下午的小会同时有多个内容并行。按照CSSlayer仁兄的说法,我所在的那个屋子是个Geek聚集地。是不是Geek我不清楚,不过大家基本上都是开源软件的爱好者。虽然专攻不同的领域,但也算是志同道合,相当愉快。不过就内容而言我只记了个大概,具体内容则是忘得差不多了。 @Tiansworld 和 @黑日白月 (Tommy He)兄讲翻译的时候提到了Qt Linguist,是我刚好想学一学的;CSSlayer仁兄讲的是plasmoid开发,这东西讲不了啥实质性内容,只是介绍了一些概况和参考,不过让我印象深刻的是貌似每次不论讲了啥,都能吸引点人去玩玩KDE,看来广告/代言真的是很重要的; @jcome 仁兄讲的是一个2D动画制作软件,大概是想找Flash替代品的人的福音,但说实在我已经多年不玩动画制作了;最后 @alick 仁兄关于TeX Live的演讲我也听了一些,因为我一直想研究下TeX但一直没有时间。另外还见到了Calligra的开发者之一—— @yue ,他居然平时用Qt Creator(据本人说是因为KDevelop打开大工程太慢,跑不动),虽然没聊几句话,但都很愉快。

结束的时候发纪念品。对于纪念品这东西,其实我还是蛮在意的,倒不是贪那点小便宜,只是为留个念想。最后拿到了一张fedora15 64bit的光盘,心想以后大概还能恢复系统用。

也许是因为来得相对早,我很幸运地拿到了中午的饭票,吃了顿比格批萨。虽然没有像有一次同校聚会那样暴饮暴食,不过也算是吃得相当满意了。晚上去了个小地方,虽然作为一个学医的,我对那些触目惊心的卫生细节表示有些难以接受,然而最后还是吃了不少东西。另外晚上去吃饭的时候跟若干同道边走边聊,了解到大家都有尝试各发行版的辛酸史。吃饭的时候也跟他们聊了聊闲话,还是蛮轻松的。

另外还有个小插曲,CSSlayer仁兄把耳机落在了会场,结果他手机恰好没电,于是乎他本来都回到学校了,又折返回来拿了耳机,后来我跟他一起离开了吃饭的地点。

 

基本就是这样了吧……引用某人的一句话:“如果我有什么忘了说的,就当我没说好了。”……

这个假期


假期将尽,接下来是繁忙的基础课年,之后又有更多的实验、实习,恐怕连假期都很难过上,因而这个假期大概是私最自在的一个。然而回顾这个假期,很多既定的目标终究没有实现,不能不说还是有所遗憾。

这个假期究竟做了什么有意义的事呢?继续学习了C语言,也学了点C++的基础思想,这是不假。然而生产力显然还没有真正构成。一门语言也不是用假期里的一点点空闲时间就能熟练掌握的,更莫提数据结构与算法了。本想在学过C++基本思想后再学一些Qt,然后给fcitx写个皮肤浏览器,算是为开源界做些贡献,然而最终却连fcitx读取皮肤配置文件的API都没有搞懂,到现在整个程序仍旧基本是与csslayer大神会面时由他所写的半成品。大概唯一能用的成果就是用C重写的会员卡管理程序,当然黑乎乎的文本界面加麻烦的操作方式,大概也没多少人愿意用。

根据某资料,我等来年需要学习的必修课程有:解剖、组胚、人体生理、生化、免疫、细胞生物、医学遗传、微生物、寄生虫、预防医学、神经生物、病理、药理。在这种状况下似乎也很难再继续研究编程了。然而csslayer大神也提到过,人的精力是有限的,很多时候能做成一两件想做的事就很幸福了。那么私根据自己的愿望选择了学医,大概也会是幸福的吧……

其实私本来还想多写些东西,然而有时又觉得这种想法实在是种完美主义,更何况长篇大论没有人愿意看,那么就这样结束吧……

用C语言重写的会员卡管理程序,欢迎Linux众测试


终于重写完毕了,不过Bug肯定很多,欢迎诸君测试。由于未在Windows下调试,且有磁盘读写的相关代码,若有热心的Windows用户想通过源代码编译还请自行删除可能产生的垃圾文件。

Linux用户可用的二进制程序:

https://skydrive.live.com/?cid=D40A6A1CE1A272AC&id=D40A6A1CE1A272AC%21507&sc=documents

源代码在此,欢迎给出指导:

http://github.com/ukyoi/cardmanage

我不太会用github,所以有些混乱,还请原谅。

最近的动作


好久没码字了。主要原因仍旧是太懒,觉得码字太耽误时间,但其实在互联网上闲逛也很耗时间,每天似乎没做什么事就流逝掉了。

当然,也不是什么事都没做。最近在把私曾经那个用Python写的代码再用C重写一遍……私承认这个想法有点蛋疼,但是这么做还是有一定原因的。首要原因是私的目标是未来使用Qt图形库,写这个文本的会员卡程序只是练练手。PyQt虽然有文档,但私找到的教程都不是很系统也不很容易理解。原生Qt是使用C++的,有详细的官方文档,所以私打算先涉及C/C++,然后把原生Qt学会,再学PyQt这样的语言绑定。所以私并非放弃Python,而是暂时先搁置一下而已。

然而直到开始写,才直到用C写程序是有多么困难。私会员卡管理程序的第一版只有180行python代码。而现在写了200+行C代码,只实现了不到一半的功能。当然也有其他的原因,第一版的程序流程控制有很大问题,误操作之后要从主菜单重新选过,非常麻烦,而现在私在写的时候会尽量考虑到误操作之后怎么处理的问题。然而总体来说,C语言的头文件、声明以及表示代码段的括号等等都是很占地方的。

而且……啃C语言的教材也是相当困难的事情……大概我在这方面没什么天赋吧……

Ubuntu 11.04 Release Party


由于谷歌地图给的车站位置不是很准,所以迟到了若干分钟。具体的困难就不说了……

算了还是说一说吧……首先我参考了两条路线,但是谷歌地图给的位置不准,于是乎只找到了一条线的站牌。由于和同学一道吃饭,吃完饭就点晚了,本来就很着急,结果等车时我眼睁睁地看着三辆我没找到站牌的那路车先后驶过,自己要等的不见一辆。我寻思这样不行,得找到那一路公交车的站牌。就在我走了一站地之后,我刚才一直在等的车出现了……

不过到得还不算太晚,看到了计算机科学屠戮者大神。让人觉得幸运又诡异的是第一排居然还有座,于是我当仁不让……

下面开始记录内容:

第一位基本没听到,听到的主要是他没少黑Unity——其实不算黑,因为本来Unity问题就很多——此外貌似他也不咋喜欢Gnome3,至少不喜欢现在的Gnome3。并且一定不认为“用户的言论毫不足虑”。大概是因为讲得不是很有趣,底下非常非常乱……但其实我觉得内容倒还有点意思。

第二位是苏大神的“一个菜鸟的爬行轨迹”,从他的演讲内容来看显然不是个菜鸟,因为他居然曾经直接把OpenFetion的代码翻出来然后“翻译”了。讲的内容主要是跟他相关的翻译问题。吐槽点甚多,而且居然好多我都知道……另外貌似这是“山东口音”?

第三位……嗯……首先更正一下上文的一处。事实是除了苏神那个充满山东腔的演讲不是很混乱以外,后面的演讲都很混乱,甚至包括人都走了一大半的下半场报告。第三位是叫做Levin的研究生(大神?),OpenFetion的发起人,很让人无语的是演示居然是全英文的(当然是用汉语讲的),而更让人无语的是苏神吐槽的时候就提到OpenFetion把汉字直接写进代码以至于给本地化带来了大量问题……
主要讲了他自己开发OpenFetion的过程,以及OpenFetion的一些技术细节。OpenFetion居然是用反编译得到的飞信协议的代码,不知道中国移动会不会告他……

第四位……计算机科学屠戮者大神……KDE4.6终于上场了……一开始居然让我们看到了启动列表……乃居然没在本地装kubuntu……
演示居然也用的英文(难道这是当今的趋势?)……不过显然要好看得多,因为图多,当然更重要因为KDE4漂亮……也许更重要的是有魔法少女小圆的壁纸?让我很搞不懂的是大家为啥对ACG如此敏感……当然也有人对屏幕右下角的照片很敏感。
首先浏览了KDE的历史……我是从4.2开始用的,看着很有一种熟悉的感觉啊……从休息时候的聊天来说貌似还算卖成功了。不过我个人认为从讲解的过程来说基本还是幻灯较多,实际演示较少……并且最后把KDE弄成类Unity界面的时候因为屏幕显示的原因,左面一列没有显示出来。其实KDE的效果应该用更多动态的效果来展示……当然还有krunner这样低调绽放(quietly brilliant)的组件……
当然我个人觉得最后这演讲是整个release party里面最好玩的。和第一个讲Unity的对比来看算是丰富得多了。因为Unity本身也没什么可讲的。而KDE众多的功能、软件绝对不是一时半刻能说完的。

课间休息……

下半场……貌似主题是Bug回报。一个是讲了一些中文ubuntu的问题,一个是怂恿人们积极、高水平地回报Bug,甚至还给我们演示了一下如何用调试代码来查kernel的Bug,不过我怀疑此人逻辑有点问题,前面说报Bug态度不能太差,后面又说在邮件列表舌战很有趣……

//

最后……其实我的化学书还没啃完,英语网测还有好多没做,英语单词还没背。不过有这样一个参加的机会实在是很难得啊,于是乎还是来了。怎么说呢……算是不虚此行吧,至少还索取了个10.04(居然不是11.04)的光盘呢……

Arch恢复


首先感谢计算机科学屠戮者大神,在私的PC上大大地展现了一番bash功力。当然他自己未必觉得如此,但私看得却是眼花缭乱得很……

其实不能挂载的症结就是私grub配置不知怎地(反正绝不是私搞的),挂载root分区那行里的“ro”莫名其妙地变成了“rw”,以至于root被挂载为读写模式,而Arch自检的时候要求挂载为只读模式,于是就出现问题了。

而这个问题说到根上,都是源于私换驱动的时候用了“pacman -Rns catalyst”的命令,以至于pacman把其依赖——xserver卸掉了,于是乎装了啥驱动也不管用了。

另外其实原先私fstab还有个问题,就是swap挂载写了两遍,所以每次启动会提示swap挂载有误,这次也一并解决了。另外还对系统进行不少小调整,在此不一一赘述。

总之很感谢计算机科学屠戮者大神,不过私想到以后如果再有这样的问题,凭自己这样的能力,大概是解决不了的吧。还是得再研究再学习啊。