Thunderbolt

出自 ArchWiki

Thunderbolt 3 在最新的 Linux 内核版本中开箱即用 [1]。从 4.13 版本开始,Linux 内核也支持 Thunderbolt 安全性。

获取固件更新

制造商经常发布 Thunderbolt 端口和设备的固件更新以确保正常运行,请访问 https://thunderbolttechnology.net/updates 以获取更多关于如何为特定供应商获取更新的详细信息。

注意: 一些供应商使用 fwupd 在 Linux 上推送固件更新。

用户设备授权

现代 Thunderbolt 设备实现了安全模式,连接设备时需要用户授权 - 这是为了防止恶意设备执行 DMA 攻击 或以其他方式干扰硬件(参见 Thunderstrike 2)。

Linux 当前支持的模式有

  • none - 无安全保护,默认连接和初始化所有设备。在 BIOS 设置中,这通常称为Legacy mode(传统模式)。
  • user - 每次连接设备时都需要用户授权。在 BIOS 设置中,这通常称为Unique ID(唯一 ID)。
  • secure - 需要用户授权,但设备随后会被记住,无需重新授权。在 BIOS 设置中,这通常称为One time saved key(一次性保存密钥)。
  • dponly - 仅限 DisplayPort 功能,不允许其他设备。在 BIOS 设置中,这通常称为Display Port Only(仅显示端口)。

安全级别通常在固件级别配置;建议至少设置为 secure。可以使用以下命令查询此设置的状态

$ cat /sys/bus/thunderbolt/devices/domain0/security
提示: 用户空间解决方案如 bolttbtAUR 可用于授权设备。

图形前端

自动连接任何设备

只想连接任何设备而无需任何手动操作的用户可以创建一个 udev 规则,如 99-removable.rules 中所示

/etc/udev/rules.d/99-removable.rules
ACTION=="add", SUBSYSTEM=="thunderbolt", ATTR{authorized}=="0", ATTR{authorized}="1"

强制供电

许多 OEM 包含一种方法,可用于强制 Thunderbolt 控制器的电源处于开启状态。如果机器支持,这将通过 WMI 总线和一个名为 force_power 的 sysfs 属性暴露出来 [2]

当连接的设备失去连接或控制器自行关闭时,强制供电可能特别有用。

要强制电源开启/关闭,请将 1 或 0 写入此属性,例如强制供电

# echo 1 > /sys/bus/wmi/devices/86CCFD48-205E-4A77-9C48-2021CBEDE341/force_power
注意: 无法查询当前的 force_power 状态。

故障排除

PCI 总线未注册

有时,当连接 Thunderbolt 设备时,PCI 总线可能未注册。这表现为屏幕工作正常,而 USB 设备无法在您的计算机上注册。这可以通过发出 PCI 重新扫描来解决

# echo 1 > /sys/bus/pci/rescan

自动 PCI 总线重新扫描

对于 PCI 总线未注册的持续问题,可以使用 udev 规则配置自动重新扫描。这将每当连接 Thunderbolt 设备时触发重新扫描。

创建 PCI 重新扫描 bash 脚本

/usr/local/bin/thunderbolt-rescan.sh
#!/bin/bash
echo 1 > /sys/bus/pci/rescan

使其可执行

# chmod +x /usr/local/bin/thunderbolt-rescan.sh

接下来创建一个 udev 规则,该规则在 thunderbolt 连接时触发

/etc/udev/rules.d/98-thunderbolt-rescan.rules
ACTION=="add", SUBSYSTEM=="thunderbolt", RUN+="/usr/local/bin/thunderbolt-rescan.sh"

增加热插拔总线大小和内存

某些主板的固件没有向内核报告足够的总线和内存大小,导致驱动程序加载失败。将以下内容添加到内核命令行以手动设置大小。

pci=hpbussize=0x33,hpmemsize=256M

参见