记录一些最近针对本机硬件设备驱动相关的调整与优化(?反向优化), 主要涉及到Nvidia独立显卡, Intel声卡以及电源管理等几个部分.
电源管理
在使用Windows时基本上是稳定1.5-2h左右, 去年刚配置好我的bspwm桌面系统后却能使用到4h… 结果目前Linux的续航又变成2h了.. 所以研究一下如何对Linux的电源进行监视与管理.
PowerTop电量监测
拔掉电源, 耗电惊人.. 不外接显示屏而使用笔记本屏幕时更是会达到40W左右..
耗电量的优化?
有一些专门的应用程序, 不过调研后发现感觉其实也是治标不治本?.. 有一些懒得折腾这种有点补救性质的软件, 加上也没有太多功夫去测试某某某选项到底对耗电有多大的优化.. 另外在后台启动的程序确实比半年前要多一打, 所以这一条准备暂且搁置, 电量的优化交给下一台PC即可.
2023-5-12: 电源耗电恢复正常! 使用电池时大概十几mW, 电脑也不发烫了, 能够轻量使用(指不make -j $(nproc)
)续航4h+!
解决方案分为两步:
-
在grub.cfg中设置内核选项
nouveau.modeset=0
, 禁用(?不确定)nouveau驱动程序 -
使用 bbswitch模块, 向
/proc/acpi/bbswitch
写入off即可. 需要root权限
这样就能稳定关闭nvidia显卡, 将耗电量降低至低低, 续航4-5h!
ACPI事件
关于ACPI事件参考: <电源管理 - Arch Linux 中文维基>
在/etc/systemd/logind.conf
做了一些修改, 功能是在笔记本盒盖时不发生任何事情, 这对于经常使用外接显示屏来说比较方便, 我可以任意的开盖盒盖而不会导致我的画面有任何的闪烁
1[Login]
2#NAutoVTs=6
3#ReserveVT=6
4#KillUserProcesses=no
5#KillOnlyUsers=
6#KillExcludeUsers=root
7#InhibitDelayMaxSec=5
8#UserStopDelaySec=10
9#HandlePowerKey=poweroff
10#HandlePowerKeyLongPress=ignore
11#HandleRebootKey=reboot
12#HandleRebootKeyLongPress=poweroff
13#HandleSuspendKey=suspend
14#HandleSuspendKeyLongPress=hibernate
15#HandleHibernateKey=hibernate
16#HandleHibernateKeyLongPress=ignore
17HandleLidSwitch=ignore
18HandleLidSwitchExternalPower=ignore
19HandleLidSwitchDocked=ignore
20#PowerKeyIgnoreInhibited=no
21#SuspendKeyIgnoreInhibited=no
22#HibernateKeyIgnoreInhibited=no
23#LidSwitchIgnoreInhibited=yes
24#RebootKeyIgnoreInhibited=no
25#HoldoffTimeoutSec=30s
26#IdleAction=ignore
27#IdleActionSec=30min
28#RuntimeDirectorySize=10%
29#RuntimeDirectoryInodesMax=
30#RemoveIPC=yes
31#InhibitorsMax=8192
32#SessionsMax=8192
UPower
在/etc/UPower/UPower.conf
中设置采取Action的时间, 以及采用什么Action, 做这样的一些修改.. 主要的改动是CriticalPowerAction
, 这是因为之前用的一直是HybridSleep
, 其在低电量是会优先Suspend, 再低了就会Hibernate. 不过遗憾的是据ArchWiki所说, 我的机子可能就不支持Hibernate… 难怪之前浅浅调过一些但是总是不成功. 当我的机子进入冬眠状态, 其将无法再成功恢复, 只能强制重启; 而且依据一次经验, 纯粹的Suspend只能待机6h+左右(后续可以再测试一下), 因而不如直接Poweroff吧, 就不要再做任何的休眠了.
1PercentageLow=25
2PercentageCritical=24
3PercentageAction=20
4# Possible values are:
5# PowerOff
6# Hibernate
7# HybridSleep
8#
9# If HybridSleep isn't available, Hibernate will be used
10# If Hibernate isn't available, PowerOff will be used
11
12CriticalPowerAction=PowerOff
事实上, 在查看日志的时候, 发现UPower居然会与logind
守护进程进行交互.
1# journalctl -b-1
2...
3Apr 13 12:25:34 ArchLinux systemd[1]: Started Daemon for power management.
4Apr 13 12:25:54 ArchLinux systemd-logind[647]: The system will power off now!
5Apr 13 12:25:54 ArchLinux systemd-logind[647]: System is powering down.
6...
ChatGPT说:
upower和logind是Linux系统中的两个工具。
upower是一个Linux实用程序,用于提供有关电源设备(例如电池和AC适配器)及其当前状态(例如充电水平和容量)的信息。它还允许您执行各种与电源相关的操作,例如挂起或休眠系统,并设置节能模式。
logind是Linux系统服务,用于管理用户登录和会话。它负责启动和停止用户会话,跟踪用户座位和设备,并处理电源管理事件,例如笔记本电脑盖子关闭或电池电量低时的情况。
logind和upower共同为Linux系统提供统一的电源管理解决方案,upower处理电源设备管理的低级细节,logind处理更高级别的策略决策和系统级电源管理。
upower和logind在Linux系统中相互配合,以提供全面的电源管理功能。
upower会监测系统中的电源设备(例如电池和AC适配器),并提供它们的状态信息。当电源状态发生变化时,upower会通过DBus系统总线向logind发送信号通知。logind收到这些信号后,会更新当前用户的会话状态,例如如果电池电量低于某个阈值,logind会触发相应的操作(例如挂起或休眠),或者发送警告消息给用户。
同时,logind还可以通过DBus系统总线发送命令给upower,以执行某些电源管理操作,例如要求upower挂起或休眠系统。
因此,upower和logind共同构成了一个完整的电源管理解决方案,可以确保系统在使用电池时能够更加高效地运行,同时也可以保护硬件免受过度使用造成的损害。
暂时不想多研究电源管理这一个技术/应用栈.. 就先这样凑活用
另外关于Linux上的桌面技术栈, 兴趣可能更多一点, 不过也先搁置…
其余的一些参考:
Nvidia显卡
在尝试禁用显卡以提高待机时间时, 发现Nvidia的闭源显卡好像不太能主动禁用显卡硬件, 又想起之前遇到的各种恼火问题, 以及目前没有使用GPU做计算的各种刚需, 因而决定更换Nvidia的闭源显卡驱动为xf86-video-nouveau
更换驱动没有什么问题, 但是带来了一些小问题…
-
关机时有时候会产生等待的问题, 此时桌面消失, 光标存留, 无论是否外接显示屏均观察到过, 大概卡顿30s左右, 原因不明, 尚未来得及排查
-
xss-lock锁屏时屏幕上有白色的污点污线, 范围也不大, 大概1cm左右, 每次位置也不一样
更换完成后即可在grub中添加内核选项nouveau.modeset=0
, 禁用Nvidia显卡. (问题: 这种是以何种方式禁用独显的? 是直接断开电源供电, 还是只是不接受总线上nvidia的信号? 暂时未考, 而且关闭后耗电量无明显降低, 没啥用)
2023-5-12: OBS录屏变得清晰了, 不确定是不是显卡的问题!
声卡
声卡其实一直是有毛病的, 当初在Macbook的硬件上外接硬盘装的Ubuntu就无法使用声卡播放声音. 解决方案是在grub中添加内核选项snd_hda_intel.dmic_detect=0
, 禁用对麦克风的自动检测, 好消息是这样可以启用扬声器, 当时就能够成功播放音频, 因而当我在Dell上安装Arch时也沿用了改内核选项, 启用扬声器.
坏消息是这样会禁用麦克风, 而且外接的插孔麦克风也将失效. 查了不少ArchWiki以及各类Forum贴文后, 最终解决方案是不使用内核自带的Intel声卡驱动snd_hda_intel
, 转而使用开源的声卡驱动sof-firmware
. 据Wiki(
<ALSA - Arch Linux 中文维基>)所说:
ALSA是一组内置的Linux内核模块….
alsa-firmware包 软件包包含了某些声卡(如创新SB0400 Audigy2)可能需要的固件. 一些较新型号的笔记本电脑(2019年底/2020)需要sof-firmware包 和 alsa-ucm-conf包, 它们使用 Sound Open Firmware 提供的固件实现驱动程序.
也不太懂声卡的这条技术栈, 不过更换驱动后, 可以使用lspci检查到确实已经更换成功:
1# lspci -nnk | grep -A2 -i audio
200:1f.3 Multimedia audio controller [0401]: Intel Corporation Alder Lake PCH-P
3High Definition Audio Controller [8086:51c8] (rev 01)
4 Subsystem: Dell Device [1028:0b56]
5 Kernel driver in use: sof-audio-pci-intel-tgl
6--
701:00.1 Audio device [0403]: NVIDIA Corporation GA106 High Definition Audio
8Controller [10de:228e] (rev a1)
9 Subsystem: NVIDIA Corporation Device [10de:0000]
10 Kernel driver in use: snd_hda_intel
下面一条是NVidia独立显卡对应的声卡驱动, 用于在HDMI显示屏上播放一些什么… 没有使用过, 但是当时原生windows好像能开箱即用, 未考
更换完成后, 使用alsamixer
, F6选择声卡, 即可自由地调整笔记本内置的麦克风和扬声器选项了! 通过腾讯会议喊一些123123即可测试确实成功.
另外还可以通过pavucontrol
使用一个Ubuntu-Style(实际是GTK)的界面可视化的控制一些声音的选项, 比如调音等等.. 这个界面真的是梦开始的地方..
PulseAudio( <PulseAudio - Arch Linux 中文维基>)是 PulseAudio 音频服务器的 GUI 控制面板.. 音频这一条技术栈也是知之甚少.. 暂且搁置..
按理应该不会默认安装pavucontrol
的, 查了下居然是这么古老的开国元老.. 有关 ArchLinux的包管理器, 最不满意的一点是貌似版本控制做的不够好. 如果我在X时间首次安装了软件包, 随后的一天我在Y时间正常更新了系统与该软件包, 则X时间这个信息将会完全地被丢弃? 以至于我无法知道这个软件包我到底是什么时候安装的, 同时很容易让我遗忘一些临时安装的软件包, 这些软件包可能只用过一次, 结果就混在pacman -Suy中不为人所知了. 关于这一点还是希望调研一下, LFS的package user模式其实很得我意, 不过缺点是实践起来太过于复杂了, 特别可能是安装一些大型的软件并处理超多的非官方仓库的AUR依赖包时(如狗屎ns3等)
1showpkg | grep pavu
22022-10-07 16:10:56 pavucontrol