开始之前,先贴上我这台联想R7000的配置:

CPU: AMD Ryzen 7 4800H with Radeon Graphics (16) @ 2.900GHz
Memory: 2 * 8G DDR4 3200MHz
GPU: NVIDIA GeForce GTX 1650
SSD: Samsung PM981a 512G
SSD: Intel 760P 512G
Wireless LAN Card: Intel Wi-Fi 6 AX200

其中512G的Intel 760P是我自己加上的,机子原厂只带了512G的Samsung PM981a。

这里简单放上一张neofetch截图:

neofetch

PS:Linux之父Linus Torvalds也更换到了AMD平台,相信未来Linux内核对AMD平台的支持情况会越来越好。

ArchLinux安装

新机器到手,除了赶紧把预装了联想全家桶的Windows 10家庭中文版换成专业版之外,最重要的就是装上ArchLinux了!

平时写代码还是更习惯用Linux,不仅仅是字体渲染看着比Windows清晰舒服,更重要的是很多事情都可以通过命令行搞定,还不容易有各种各样奇奇怪怪的毛病(例如在开始菜单加入广告推荐使用Edge浏览器等)。

ArchLinux的安装只需要按照官方Archwiki上的Installation guide一步步操作就行了。

不过安装过程中如果是选择通过WiFi来接入互联网那马上就会遇到第一个问题:通过wifi-menu或者其他相关命令无法正常连接WiFi。

WiFi连接

第一次启动ArchLinux的安装镜像,习惯性使用wifi-menu连接WiFi,直接就报错了。难道是AX200这张无线网卡太新了,安装镜像还不支持?检查了一下驱动发现是没问题的。

翻了翻Google才发现,原来是机子所有的无线电接口都被bloacked了,解决方法也很简单,通过rfkill命令就能直接把所有的无线电接口都unblock:

rfkill unblock all

执行完这条命令之后再执行rfkill list应该就能看到如下结果,所有的无线电接口的blocked状态都是no。

➜  ~ rfkill list
0: ideapad_wlan: Wireless LAN
        Soft blocked: no
        Hard blocked: no
1: ideapad_bluetooth: Bluetooth
        Soft blocked: no
        Hard blocked: no
2: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no
3: hci0: Bluetooth
        Soft blocked: no
        Hard blocked: no

这时候就能正常使用wifi-menu或其他相关的命令行连接WiFi,继续进行后续的安装操作了。

屏蔽nouveau

不知道是不是因为GTX 1650这张显卡比较新,nouveau用起来总是会有一些奇奇怪怪的问题,偶尔还会导致系统关机的时候卡住,内核日志里也总会有很多关于nouveau的报错。

因为打算装NVIDIA的闭源驱动,所以我直接屏蔽了nouveau,省得再出现一些奇奇怪怪的问题,具体的屏蔽方法就是在/etc/modprobe.d目录下新建一个disable-nouveau.conf文件并写入以下内容:

blacklist nouveau

这样下次开机进系统就不会加载nouveau驱动了,内核日志中也不会再出现一大堆关于nouveau的报错。

屏幕亮度调节

这是我刚装上ArchLinux时遇到的第一个问题,屏幕亮度无法调节,开机直接就是最高亮度。

当时翻遍了ArchWiki和Google,尝试了很多解决方法,包括在Kernel启动参数后加上各种奇奇怪怪的启动参数(acpi_osi=! acpi_osi="Windows 2009"acpi_backlight=vendor等),直接向/sys/class/backlight/amdgpu_bl0/brightness中写入亮度数值都不行,然后就彻底放弃了,最高亮度凑活着用吧。

后来有一次从Windows重启到Linux的时候意外发现:先启动到Windows,然后在Windows上面选择重启,之后再进Linux就能正常调节亮度了。当时没有其他解决方法,所以只能每次用Linux都先启动到Windows,然后再重启进ArchLinux。

后面滚到5.7.6内核之后就能正常调节屏幕亮度了,但是随之而来又带来了新的问题,系统在播放音频或者是视频的时候,有一定的概率会卡死,就跟这个帖子描述的类似:https://bbs.archlinux.org/viewtopic.php?id=256929,kernel的日志也是一样的,初步怀疑是kernel某个patch有问题,又懒得自己编译内核,所以就先滚回5.7.5内核,最高亮度先用着,坐等内核更新。

终于,昨天更新了5.7.7内核之后,亮度调节正常,播放音/视频也不会再导致系统卡死了。R7000装Linux遇到屏幕亮度无法调节的可以将内核升级到5.7.7试试,应该就能正常调节了。

AMD/NVIDIA双显卡切换

R7000是支持在BIOS中设置成独显直连的,但是我并不想让Linux直接在独显上跑,不仅费电,还容易发热,日常写代码感觉也不需要用上独显,所以我还是更喜欢双显卡切换,毕竟集成显卡也是花了钱买的嘛,怎么能就这么放着不用呢。

之前暗影精灵2上面是使用bumblebee的方案来管理双显卡的,但是bumblebee似乎只支持Intel+NVIDIA双显卡,不支持AMD+NVIDIA双显卡。那就只能寻找新的解决方案了。

所以就去爬了爬ArchWiki上的NVIDIA Optimus,最终决定采用optimus-manager来管理双显卡。

安装显卡驱动

AMD集成显卡的驱动使用xf86-video-amdgpu,NVIDIA独立显卡的驱动使用NVIDIA闭源驱动:

sudo pacman -S xf86-video-amdgpu
sudo pacman -S nvidia nvidia-settings nvidia-utils lib32-nvidia-utils

安装Optimus Manager

首先需要安装optimus-manager, 因为是AMD平台,所以不能直接安装原版的optimus-manager,必须安装AMD分支版本optimus-manager-amd-gitAUR

yay -S optimus-manager-amd-git

同时bbswitch也得替换成bbswitch-ati-gitAUR

yay -S bbswitch-ati-git

都安装好了之后开启服务:

sudo systemctl enable optimus-manager.service

同时需要确保/etc/X11/xorg.conf/etc/X11/xorg.conf.d 下面没有显示相关的配置文件

配置Optimus Manager

sudo mkdir -p /etc/optimus-manager
sudo cp /usr/share/optimus-manager.conf /etc/optimus-manager/optimus-manager.conf

然后编辑/etc/optimus-manager/optimus-manager.conf文件,根据文件内的注释说明进行optimus-manager的配置。

这里贴一下我自己用的配置:

[optimus]

# This parameter defines the method used to power switch the Nvidia card. See the documentation
# for a complete description of what each value does. Possible values :
#
# - nouveau : load the nouveau module on the Nvidia card.
# - bbswitch : power off the card using the bbswitch module (requires the bbswitch dependency).
# - acpi_call : try various ACPI method calls to power the card on and off (requires the acpi_call dependency)
# - none : do not use an external module for power management. For some laptop models it's preferable to
#           use this option in combination with pci_power_control (see below).
#           With that option set, you can also use the scripts nvidia-enable.sh and nvidia-disable.sh to
#           execute custom commands for power management.
switching=none

# Enable PCI power management in Intel mode.
# This option is incompatible with acpi_call and bbswitch, so it will be ignored in those cases.
pci_power_control=yes

# Remove the Nvidia card from the PCI bus.
# May prevent crashes caused by power switching.
# Ignored if switching=nouveau or switching=bbswitch.
pci_remove=no

# Reset the Nvidia card at the PCI level before reloading the nvidia module.
# Ensures the card is in a fresh state before reloading the nvidia module.
# May fix some switching issues. Possible values :
#
# - no : does not perform any reset
# - function_level : perform a light "function-level" reset
# - hot_reset : perform a "hot reset" of the PCI bridge. ATTENTION : this method messes with the hardware
#         directly, please read the online documentation of optimus-manager before using it.
#         Also, it will perform a PCI remove even if pci_remove=no.
#
pci_reset=no

# Automatically log out the current desktop session when switching GPUs.
# This feature is currently supported for the following DE/WM :
# KDE Plasma, GNOME, XFCE, Deepin, i3, Openbox, AwesomeWM, bspwm
# If this option is disabled or you use a different desktop environment,
# GPU switching only becomes effective at the next graphical session login.
auto_logout=yes

# The mode used with startup mode ac_auto when not connected to AC.
# Possible values : amd, intel, hybrid-amd, hybrid-intel
ac_auto_battery_mode=amd


# The mode used with startup mode ac_auto when connected to AC.
# Possible values : hybrid, nvidia
ac_auto_extpower_mode=nvidia

[intel]

# Driver to use for the Intel GPU. Possible values : modesetting, intel
# To use the intel driver, you need to install the package "xf86-video-intel".
driver=modesetting

# Acceleration method (corresponds to AccelMethod in the Xorg configuration).
# Only applies to the intel driver.
# Possible values : sna, xna
# Leave blank for the default (no option specified)
accel=

# Enable TearFree option in the Xorg configuration.
# Only applies to the intel driver.
# Possible values : yes, no
# Leave blank for the default (no option specified)
tearfree=

# DRI version. Possible values : 2, 3
DRI=3

# Whether or not to enable modesetting for the nouveau driver.
# Does not affect modesetting for the Intel GPU driver !
# This option only matters if you use nouveau as the switching backend.
modeset=yes


[amd]

# Driver to use for the AMD GPU. Possible values : modesetting, amdgpu
# To use the amdgpu driver, you need to install the package "xf86-video-amdgpu".
driver=amdgpu

# Enable TearFree option in the Xorg configuration.
# Only applies to the amdgpu driver.
# Possible values : yes, no
# Leave blank for the default (no option specified)
tearfree=

# DRI version. Possible values : 2, 3
DRI=3

# Whether or not to enable modesetting for the nouveau driver.
# Does not affect modesetting for the AMD GPU driver !
# This option only matters if you use nouveau as the switching backend.
modeset=yes


[nvidia]

# Whether or not to enable modesetting. Required for PRIME Synchronization (which prevents tearing).
modeset=yes

# Whether or not to enable the NVreg_UsePageAttributeTable option in the Nvidia driver.
# Recommended, can cause poor CPU performance otherwise.
PAT=yes

# DPI value. This will be set using the Xsetup script passed to your login manager.
# It will run the command
# xrandr --dpi <DPI>
# Leave blank for the default (the above command will not be run).
DPI=96

# If you're running an updated version of xorg-server (let's say to get PRIME Render offload enabled),
# the nvidia driver may not load because of an ABI version mismatch. Setting this flag to "yes"
# will allow the loading of the nvidia driver.
ignore_abi=no

# Set to yes if you want to use optimus-manager with external Nvidia GPUs (experimental)
allow_external_gpus=no

# Comma-separated list of Nvidia-specific options to apply.
# Available options :
# - overclocking : enable CoolBits in the Xorg configuration, which unlocks clocking options
#   in the Nvidia control panel. Note: does not work in hybrid mode.
# - triple_buffer : enable triple buffering.
options=

关于我的这份配置文件:

  • switching method不使用bbswitch是因为使用集成显卡的时候通过bbswitch关闭独立显卡会导致电脑的风扇以最高转速狂转,可能是因为关闭了独立显卡电源之后,系统无法正常读取独显温度导致将风扇调至最高转速,暂时没有找到一个比较靠谱的解决方法,所以就先用none,也许未来BIOS升级之后能解决这个问题
  • 正是因为switching method选择了none,所以把pci_power_control启用了,让PCI power management管理独显的电源
  • AMD的driver使用amdgpu
  • 其余配置基本都是默认配置

一些都配置好了就重启电脑吧,如果没有什么意外的话,Optimus Manager已经正常工作了。

Optimus Manager用法

  • 切换到NVIDIA:

    optimus-manager --switch nvidia
    
  • 切换到AMD:

    optimus-manager --switch amd
    
  • 设置开机使用AMD:

    optimus-manager --set-startup=amd
    
  • 显示当前模式:

    optimus-manager --print-mode
    
  • 显示开机使用的模式:

    optimus-manager --print-startup
    
  • 更多用法:

    optimus-manager --help
    

Optimus Manager GUI

optimus-manager-qt

  • Argos Script For Optimus-Manager

argos-optimus-manager

由于原版的optimus-manager-argos不支持AMD显卡的切换,同时也停止维护了,所以我Fork了一份,加上了AMD的支持:https://github.com/LGiki/optimus-manager-argos

触摸板

是的,这台机器的触摸板在Linux下无法正常使用,触摸跟按键都没有任何反应。

在内核日志上可以找到关于触摸板的报错内容:

[    1.981868] i2c_hid i2c-MSFT0001:00: supply vdd not found, using dummy regulator
[    1.981883] i2c_hid i2c-MSFT0001:00: supply vddl not found, using dummy regulator
[    7.064976] i2c_hid i2c-MSFT0001:00: failed to reset device.
[   13.251401] i2c_hid i2c-MSFT0001:00: failed to reset device.
[   19.438327] i2c_hid i2c-MSFT0001:00: failed to reset device.
[   25.624986] i2c_hid i2c-MSFT0001:00: failed to reset device.
[   26.638144] i2c_hid i2c-MSFT0001:00: can't add hid device: -61
[   26.638591] i2c_hid: probe of i2c-MSFT0001:00 failed with error -61

找到了一个相关的讨论:https://bugzilla.kernel.org/show_bug.cgi?id=207759

由于我平时都是用鼠标,几乎用不到笔记本的触摸板,所以也懒得去研究这个问题了,说不定随着内核的更新,触摸板突然就能用了呢(想peach)。

更新 (2021.01.18)

针对触摸板无法正常使用的相关讨论可以看:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1887190

5.11及之后的内核应该就修复这个问题了,只需要等5.11内核release之后及时更新即可。

Xorg无法启动

如果你遇到了Xorg无法启动的问题,查看日志找到了如下字样:

/dev/dri/card0: No such file or directory

检查xf86-video-amdgpu等相关包均安装正常的情况下,需要根据https://wiki.archlinux.org/index.php/Kernel_mode_setting中的描述,编辑/etc/mkinitcpio.conf文件,在其中的MODULES部分加入amdgpu

MODULES=(amdgpu)

保存之后需要执行下面指令,重新生成initramfs images:

sudo mkinitcpio -P

重启系统之后Xorg应该就能正常启动了