现代(笔记本上的)ACPI(Advanced Configuration and Power Interface, 高级配置和电源管理接口)通常只针对windows优化,导致linux无法完全控制ACPI功能。需要对DSDT(Differentiated System Description Table)伪装为windows,以启用更多功能。
主要内容摘译自 http://iam.tj/prototype/enhancements/Windows-acpi_osi.html
a. 手动完成工作:
从DSDT获得windows对应的osi参数
sudo strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort
将对应参数填入grub启动参数,或直接写入/etc/default/grub中的GRUB_CMDLINE_LINUX
例:
在yast-->引导加载器-->内核参数直接填入: acpi_osi=! "acpi_osi=Windows 2015"
或
在/etc/default/grub写入:GRUB_CMDLINE_LINUX="acpi_osi=! \"acpi_osi=Windows 2015\""
b. 直接通过脚本完成所有工作:
VERSION="$(sudo strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort | tail -1)"
echo 'Linux kernel command-line parameters required: acpi_osi=! "acpi_osi='$VERSION'"'
config() { sed -n '/.*linux[[:space:]].*root=\(.*\)/{s//BOOT_IMAGE=\1/ p;q;}' /boot/grub/grub.cfg; }
echo "Existing Command Line: ` config `"
sudo sed -i "s/^\(GRUB_CMDLINE_LINUX=.*\)\"$/\1 acpi_osi=! \\\\\"acpi_osi=$VERSION\\\\\"\"/" /etc/default/grub
echo "Modified Command Line: ` config `"
sudo update-grub
由于发行版差异,update-grub可能替换为grub-mkconfig ...
如果更改CMDLINE后没有明显变化,可以尝试按照步骤a.1中列出的所有可能参数,从新到旧依次尝试。