在Ubuntu12.04中使用vga_switcheroo实现双显卡切换

本文内容适用于Linux环境中的双显卡切换,依wiki文档的介绍仅适用于第二代的双显卡切换技术,即手动软件切换双显卡,不保证支持新的智能切换技术。仅在联想Y560-IFI,AMD 5730 + Intel双显卡,Ubuntu 12.04环境中测试,不保证在其他环境中可用,由此造成的任何损失作者不负任何责任。

作者的Y560-IFI最近安装了Ubuntu 12.04,先使用的ATI官方闭源驱动,此时必须在BIOS中关闭集显,只能一直使用独显,在使用windows系统时很不方便,于是想到要搞定在Linux系统中的双显卡切换,经过阅读资料(见文后参考资料)+几天的努力,终于实现了在Ubuntu 12.04系统中的AMD+Intel双显卡切换。文后附有快速切换显卡的sh脚本。

要实现双显卡切换有一下几点要求:

  1. 使用支持双显卡切换的Linux内核,建议使用最新内核。

  2. 电脑必须具有硬件MUX,即必须使用第二代手动热切换技术。使用新一代显卡切换技术的用户请参考http://ubuntuforums.org/showthread.php?t=1930450

  3. 必须开启KMS。

  4. 必须使用开源驱动,不能使用闭源驱动。

检测方法:

检测内核的方法:

grep -i switcheroo /boot/config-3.2.*

开启KMS:

Ubuntu 12.04默认开启KMS。察看KMS是否开启的方法是打开/boot/grub/grub.cfg文件,在其中找到启动Ubuntu的命令(注意看核心版本号,还有不要看恢复模式下面的),在

linux /boot/vmlinuz-3.2.0-2*-generic

这一行的后面寻找是否有“nomodeset”字样,如果有将其删除并保存,然后重启即可开启KMS。如果没能正常开启,则vga_switcheroo就不会开启,可将其改为“radeon.modeset=1”试试(针对AMD显卡,Nvidia显卡请用“nouveau.modeset=1”)。

加载vga_switcheroo模块:

切换显卡的模块目前仍然处于调试状态,在一些系统中首先要加载这些模块,在笔者的Ubuntu 12.04中默认就已加载

sudo mount -t debugfs debugfs /sys/kernel/debug

测试vga_switcheroo是否开启:

ls -l /sys/kernel/debug/vgaswitcheroo/switch

检测开源驱动是否正常工作(非必须):

glxinfo | grep "renderer string"

 如提示无效的命令请先安装glxinfo,显示“OpenGL renderer string”则表示开源驱动工作正常。

glxinfo | grep direct -i

 这里显示是否支持硬件加速。

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

sudo cat /sys/kernel/debug/vgaswitcheroo/switch

此步将显示switch文件的内容,格式如下:

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

其中“IGD”表示集成显卡,“DIS”表示独立显卡;“+”表示正在使用的显卡;“Pwr”表示显卡处于开启状态,“Off”表示显卡处于关闭状态。

切换显卡方法:

下面开始切换显卡,使用不同的命令可以切换不同的显卡,请按自己的需求使用合适的命令。

开启所有显卡:

sudo sh -c "echo ON > /sys/kernel/debug/vgaswitcheroo/switch"

这条命令可以开启已关闭的显卡,但并不会切换显卡。

切换到集显模式:

sudo sh -c "echo IGD > /sys/kernel/debug/vgaswitcheroo/switch"

切换到独显模式:

sudo sh -c "echo DIS > /sys/kernel/debug/vgaswitcheroo/switch"

关闭未使用的显卡:

sudo sh -c "echo OFF > /sys/kernel/debug/vgaswitcheroo/switch"

这条命令可以关闭未使用的显卡(即在switch文件中不带“+”的显卡)以省电。

在重启X-window后切换到集显模式(只需注销重新登陆即可):

sudo sh -c "echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch"

在重启X-window后切换到独显模式(只需注销重新登陆即可):

sudo sh -c "echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch"

注意事项:

在笔者的电脑上,直接使用

sudo sh -c "echo DIS > /sys/kernel/debug/vgaswitcheroo/switch"
命令无法切换显卡,必须使用
sudo sh -c "echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch"
命令进行切换,然后注销并重新登陆才可以生效。

在切换显卡之前,如果发现当前使用的显卡就是所需的显卡,可以直接使用关闭未使用显卡的命令,而不用注销。
sudo sh -c "echo OFF > /sys/kernel/debug/vgaswitcheroo/switch"

显卡切换在重启后失效,必须重新设置。可以打开rc.local文件
sudo gedit /etc/rc.local
在其中的exit 0前面添加命令
sudo sh -c "echo OFF > /sys/kernel/debug/vgaswitcheroo/switch"
这样以后每次开机就自动关闭不用的显卡了。

笔者的电脑在测试显卡切换功能时因怀疑开源驱动不完善,于是更新了最新的开源驱动,不知是否有影响。有需要更新开源驱动的请参考文后的参考资料。

快速切换显卡脚本:

建立一个.sh脚本文件,在其中输入以下内容,设置可执行权限后运行即可快速切换显卡。仅限可以使用前文介绍的方法成功切换显卡的用户。其中切换显卡的命令可根据自己的需要进行修改。
#! /bin/bash
function pause(){
        read -n 1 -p "$*" INP
        if [[ $INP != '' ]] ; then
                echo -ne 'b n'
        fi
}
sudo cat /sys/kernel/debug/vgaswitcheroo/switch
pause '0切换到独立显卡,1切换到集成显卡'
if [[ "$INP" == 0 ]]; then
    sudo sh -c "echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch"
elif [[ "$INP" == 1 ]]; then
    sudo sh -c "echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch"
fi

参考资料:

  1. http://ukyoi.wordpress.com/2012/03/14/用vga_switcheroo在linux下(开启kms)彻底关闭某一可切换显卡的/

  2. https://help.ubuntu.com/community/HybridGraphics

  3. http://forum.ubuntu.org.cn/viewtopic.php?f=42&t=351974

  4. http://cxbii.blog.163.com/blog/static/185001460201241010137830/

参考资料过多,在此不一一列举,向以上文章作者表示衷心的感激。

  本文链接:https://www.zhangminghao.com/post/14.html

相关文章

发表评论:

验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。