5年前我花了一周时间也没解决的问题,现在只用了2个小时就完美解决了
参考资料:[1]https://blog.csdn.net/u013991521/article/details/49562365
[2]https://askubuntu.com/questions/762764/cant-change-brightness-in-ubuntu-16-04-lts
本人的一台联想昭阳E46G笔记本(无独显),在被换上i5 520M、4G内存、120G ssd之后继续延续着他第8年的使命。
尽管如此,但即便是windows7也无法流畅的在这台老机器上运行了。于是,我重新给他装上了Linux系统(5年前尝试了基于Debian 8 某Linux发行版,这次是Ubuntu 18.04 LTS)
不出所料,5年前的BUG又一次的出现了!!
然而这个现象在我的另一台笔记本上却没有出现。
附上未出BUG机器的配置:
Model:ASUS X84L
CPU:intel B815 @1.60GHz
RAM:2G DDR3
HDD:320G WD
GPU:AMD HD6470m 1G
在查阅多方资料与不断尝试后,我发现是因为Intel集成显卡的原因。
原因如下:
fn调节的是/sys/class/backlight/acpi_video0/brightness文件,而Intel的文件是/sys/class/backlight/intel_backlight/brightness
-------来自参考资料[1]
参考资料[1]中给出了两种解决方案:
1)通过修改/etc/default/grub 来实现对Intel显卡的支持
2)手动通过命令修改
然而第1种方案对我无效,而我喜欢经常调节亮度,法2实在过于麻烦。
在参考资料[2]中也有一种方案,但依旧对我无效。
由于发现是外文资料,且国内好像无人翻译,现翻译在另一篇文章上,可以先尝试一下【地址摸我】
经过实验发现,在通过Fn组合键促发亮度调节功能时,系统的亮度logo会有正常响应
而且,/sys/class/backlight/acpi_video0/brightness 会有变化
!我可以写一个程序监控/sys/class/backlight/acpi_video0/brightness ,然后反手把读出来的值经过处理写到/sys/class/backlight/intel_backlight/brightness!
观察得出:
我的/sys/class/backlight/acpi_video0/brightness 值的范围在[0,10],且0时为最暗但不是黑屏,10为最亮
我的/sys/class/backlight/intel_backlight/brightness值的范围在[0,4882],且0时为最暗且为黑屏,4882为最亮
注:图片仅为文件格式展示,不代表最低/高值
于是就有了第一代程序
import time
import os
# 先赋777权限(其实这里给高了,不过没关系
os.system("sudo chmod -R 777 /sys/class/backlight/intel_backlight/brightness")
while True:
# 先读取Fn组合键保存的文件
acpi_l = open("/sys/class/backlight/acpi_video0/brightness")
# 简单的线性调整,偏置值+20 为了在调至最暗时不至于黑屏 480权重请自己测试,不同机型可能不一样
brightness= str(int(acpi_l.read()) * 480 + 20)
acpi_l.close()
# 以“w”模式打开,方便清空
intel_l = open("/sys/class/backlight/intel_backlight/brightness","w")
intel_l.write(brightness)
intel_l.close()
# 等待0.5s,在不过多占用系统资源的情况下获得较好的体验
time.sleep(0.5)
先解释下为什么要每次给写入权限:因为sys目录里的权限掉电会还原,所以每次都要打上。
然而这样的操作很麻烦,每次先不说要打开一个文件,还要输密码,而且还要给他一个单独的shell占用着。
我先创建了/etc/rc.local文件(Ubuntu16.10以后就没有了)
加入了
# 注:为了精简,这里的/etc/rc.local文件内容仅包含有实际意义的部分
sudo chmod -R 777 /sys/class/backlight/intel_backlight/brightness
python /etc/auto_brightness/change.py
然后重启
结果卡死在启动界面!!
赶紧进入可读写的单用户模式把rc.local删了。
Linux的开机启动项目必须执行完才能进入桌面,然而 while True。。。。
难道这与开机自启无缘了吗?
其实用screen就可以完美解决!
要使用screen,请先执行
sudo apt-get install screen
然后建立一个sh文件
screen_name="auto_run"
screen -dmS $screen_name
#以下路径为python程序的路径
cmd="python3 /etc/auto_run/change.py";
screen -x -S $screen_name -p 0 -X stuff "$cmd"
screen -x -S $screen_name -p 0 -X stuff '\n'
在/etc/rc.local中加入
如果没找到/etc/rc.local,请参考https://blog.csdn.net/weixin_43599336/article/details/85970601
sudo chmod -R 777 /sys/class/backlight/intel_backlight/brightness
# 刚刚的sh文件路径
sh /etc/auto_run/auto_run.sh
重启
sudo reboot
你以为就这么结束了吗?
其实我觉得个人喜欢的亮度范围在[500,2500]之间,如果用线性变化有时会出现加一格嫌亮,降一格觉得暗的情况。
于是我就开始用了一个新的处理函数
10.8x2 + 299x + 201
整个程序就变成了这样
import time
while True:
acpi_l = open("/sys/class/backlight/acpi_video0/brightness")
l = int(acpi_l.read())
brightness = str(int(10.8 * l * l + 299 * l + 201))
intel_l = open("/sys/class/backlight/intel_backlight/brightness","w")
intel_l.write(brightness)
intel_l.close()
time.sleep(0.5)
这个函数可以使亮度调节的中后段调节更加的细腻,更符合我的个人习惯
要注意的一点是:一点要确保当l在[0,10]时,你的函数值不会小于0或溢出最大值(我的是4880)