0038 — Linux Drivers
— Какой самый простой способ отобрать оружие у клерика Грамматона?
— Попросить его.
Какой самый простой способ установить драйверы в Linux?
- Определить аппаратный идентификатор нужного устройства.
- Найти в репозиториях нужный пакет.
Определение идентификатора устройства
Аппаратный идентификатор устройства состоит из двух шестнадцатеричных чисел, разделённых двоеточием, например:
8086:a2a1
Здесь:
8086
— идентификатор производителя, Vendor ID (VID). Например, значение8086
соответствует Intel Corporation, а10de
— NVIDIA Corporation.a2ah
— идентификатор устройства, Product ID (PID).
Для определения идентификатора устройства в Debian следует использовать утилиту lcpsi
.
Перед первым использованием рекомендуется обновить базу идентификаторов:
sudo update-pciids
При вызове утилиты lspci
без параметров она возвращает набор строк вида:
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) (rev 07)
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
00:16.0 Communication controller: Intel Corporation 200 Series PCH CSME HECI #1
00:17.0 SATA controller: Intel Corporation 200 Series PCH SATA controller [AHCI mode]
00:1b.0 PCI bridge: Intel Corporation 200 Series PCH PCI Express Root Port #17 (rev f0)
00:1c.0 PCI bridge: Intel Corporation 200 Series PCH PCI Express Root Port #1 (rev f0)
00:1c.4 PCI bridge: Intel Corporation 200 Series PCH PCI Express Root Port #5 (rev f0)
00:1d.0 PCI bridge: Intel Corporation 200 Series PCH PCI Express Root Port #9 (rev f0)
00:1f.0 ISA bridge: Intel Corporation Z370 Chipset LPC/eSPI Controller
00:1f.2 Memory controller: Intel Corporation 200 Series/Z370 Chipset Family Power Management Controller
00:1f.3 Audio device: Intel Corporation 200 Series PCH HD Audio
00:1f.4 SMBus: Intel Corporation 200 Series/Z370 Chipset Family SMBus Controller
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V
01:00.0 VGA compatible controller: NVIDIA Corporation TU106 [GeForce RTX 2070 Rev. A] (rev a1)
01:00.1 Audio device: NVIDIA Corporation TU106 High Definition Audio Controller (rev a1)
01:00.2 USB controller: NVIDIA Corporation TU106 USB 3.1 Host Controller (rev a1)
01:00.3 Serial bus controller: NVIDIA Corporation TU106 USB Type-C UCSI Controller (rev a1)
04:00.0 USB controller: ASMedia Technology Inc. ASM2142/ASM3142 USB 3.1 Host Controller
05:00.0 Non-Volatile memory controller: Phison Electronics Corporation E12 NVMe Controller (rev 01)
Чтобы получить только идентификаторы, используйте ключ -n
:
lspci -n
Результат:
00:00.0 0600: 8086:3ec2 (rev 07)
00:01.0 0604: 8086:1901 (rev 07)
00:14.0 0c03: 8086:a2af
00:16.0 0780: 8086:a2ba
00:17.0 0106: 8086:a282
00:1b.0 0604: 8086:a2e7 (rev f0)
00:1c.0 0604: 8086:a290 (rev f0)
00:1c.4 0604: 8086:a294 (rev f0)
00:1d.0 0604: 8086:a298 (rev f0)
00:1f.0 0601: 8086:a2c9
00:1f.2 0580: 8086:a2a1
00:1f.3 0403: 8086:a2f0
00:1f.4 0c05: 8086:a2a3
00:1f.6 0200: 8086:15b8
01:00.0 0300: 10de:1f07 (rev a1)
01:00.1 0403: 10de:10f9 (rev a1)
01:00.2 0c03: 10de:1ada (rev a1)
01:00.3 0c80: 10de:1adb (rev a1)
04:00.0 0c03: 1b21:2142
05:00.0 0108: 1987:5012 (rev 01)
Более полезным будет использование ключа -nn
:
lspci -nn
Результат:
00:00.0 Host bridge [0600]: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers [8086:3ec2] (rev 07)
00:01.0 PCI bridge [0604]: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) [8086:1901] (rev 07)
00:14.0 USB controller [0c03]: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller [8086:a2af]
00:16.0 Communication controller [0780]: Intel Corporation 200 Series PCH CSME HECI #1 [8086:a2ba]
00:17.0 SATA controller [0106]: Intel Corporation 200 Series PCH SATA controller [AHCI mode] [8086:a282]
00:1b.0 PCI bridge [0604]: Intel Corporation 200 Series PCH PCI Express Root Port #17 [8086:a2e7] (rev f0)
00:1c.0 PCI bridge [0604]: Intel Corporation 200 Series PCH PCI Express Root Port #1 [8086:a290] (rev f0)
00:1c.4 PCI bridge [0604]: Intel Corporation 200 Series PCH PCI Express Root Port #5 [8086:a294] (rev f0)
00:1d.0 PCI bridge [0604]: Intel Corporation 200 Series PCH PCI Express Root Port #9 [8086:a298] (rev f0)
00:1f.0 ISA bridge [0601]: Intel Corporation Z370 Chipset LPC/eSPI Controller [8086:a2c9]
00:1f.2 Memory controller [0580]: Intel Corporation 200 Series/Z370 Chipset Family Power Management Controller [8086:a2a1]
00:1f.3 Audio device [0403]: Intel Corporation 200 Series PCH HD Audio [8086:a2f0]
00:1f.4 SMBus [0c05]: Intel Corporation 200 Series/Z370 Chipset Family SMBus Controller [8086:a2a3]
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection (2) I219-V [8086:15b8]
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU106 [GeForce RTX 2070 Rev. A] [10de:1f07] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation TU106 High Definition Audio Controller [10de:10f9] (rev a1)
01:00.2 USB controller [0c03]: NVIDIA Corporation TU106 USB 3.1 Host Controller [10de:1ada] (rev a1)
01:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU106 USB Type-C UCSI Controller [10de:1adb] (rev a1)
04:00.0 USB controller [0c03]: ASMedia Technology Inc. ASM2142/ASM3142 USB 3.1 Host Controller [1b21:2142]
05:00.0 Non-Volatile memory controller [0108]: Phison Electronics Corporation E12 NVMe Controller [1987:5012] (rev 01)
Здесь уже видны и человекочитаемые названия, и аппаратные идентификаторы.
Что ж, теперь все знают, что в материнской плате моего компьютера установлен звуковой чип Intel Corporation 2000 Series PCH HD Audio.
Поиск нужного пакета
Для работы звуковой карты необходим драйвер. Его можно найти в интернете, собрать, установить и т. д. Но есть путь попроще — найти нужный пакет в репозиториях Debian. Именно по этой причине в /etc/apt/sources.list
для стандартных репозиториев Debian (начиная с Bookworm) следует включить компонент non-free-firmware
. Если убрать комментарии, то этот файл должен выглядеть так:
deb http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free
deb http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free
deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware contrib non-free
Порядок действий:
Обновите список пакетов:
sudo apt-get update
Найдите пакеты со словом
firmware
в названии и отфильтруйте те, что содержат словоintel
в названии:apt-cache search firmware | grep intel
Результат:
firmware-intel-sound - Binary firmware for Intel sound DSPs intel-microcode - Processor microcode firmware for Intel CPUs
Очевидно, пакет
intel-microcode
— не тот, что нам нужен.Установите пакет
firmware-intel-sound
:sudo apt-get install firmware-intel-sound --yes
Перезагрузите компьютер.
Блокировка модуля ядра с драйвером Realtek
Шаги из этого раздела нужно выполнять в следующих случаях:
Звук по-прежнему работает через раз.
Для звуковой карты Intel используется модуль ядра с драйвером Realtek. Чтобы определить, какие модули ядра используются устройством, выполните команду:
lspci -k
Например, в моём случае вывод для звуковой карты был таким:
00:1f.3 Audio device: Intel Corporation 200 Series PCH HD Audio Subsystem: ASUSTeK Computer Inc. 200 Series PCH HD Audio Kernel driver in use: snd_hda_intel snd_hda_codec_realtek Kernel modules: snd_hda_intel snd_hda_codec_realtek
Создайте в каталоге
/etc/modprobe.d/
файлrealtek-blacklist.conf
со следующим содержимым:blacklist snd_hda_codec_realtek
Перезагрузите компьютер.
Наверное, есть какой-то способ избежать этого и загрузить драйвер «на лету», но в моём случае помогла только перезагрузка.
Состояние служб pipewire
На сайте linux.org.ru подсказали, что проблема может быть в службах pipewire
. Это очередная лучшая система управления звуком в Linux, которая пришла на замену Pulse Audio — другой лучшей системе управления звуком в Linux, которая в своё время заменила другую лучшую систему управления звуком в Linux — ALSA.
Для проверки состояния Pipewire нужно выполнить команду:
systemctl status --user pipewire.service pipewire-pulse.service
В моём случае, например, вывод был таким:
● pipewire.service - PipeWire Multimedia Service
Loaded: loaded (/usr/lib/systemd/user/pipewire.service; enabled; preset: enabled)
Active: active (running) since Sat 2023-12-30 15:39:52 MSK; 3h 5min ago
TriggeredBy: ● pipewire.socket
Main PID: 1368 (pipewire)
Tasks: 2 (limit: 19024)
Memory: 8.5M
CPU: 11.182s
CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service
└─1368 /usr/bin/pipewire
дек 30 15:39:52 dunaevsky systemd[1101]: Started pipewire.service - PipeWire Multimedia Service.
дек 30 15:39:52 dunaevsky pipewire[1368]: mod.rt: Can't find org.freedesktop.portal.Desktop. Is xdg-desktop-portal running?
дек 30 15:39:52 dunaevsky pipewire[1368]: mod.rt: found session bus but no portal
дек 30 15:39:52 dunaevsky pipewire[1368]: mod.rt: RTKit error: org.freedesktop.DBus.Error.AccessDenied
дек 30 15:39:52 dunaevsky pipewire[1368]: mod.rt: could not set nice-level to -11: Отказано в доступе
дек 30 15:39:52 dunaevsky pipewire[1368]: mod.rt: RTKit error: org.freedesktop.DBus.Error.AccessDenied
дек 30 15:39:52 dunaevsky pipewire[1368]: mod.rt: could not make thread 1623 realtime using RTKit: Отказано в доступе
дек 30 15:39:53 dunaevsky pipewire[1368]: spa.alsa: 'front:1': capture open failed: Устройство или ресурс занято
дек 30 15:39:53 dunaevsky pipewire[1368]: mod.adapter: 0x564e30272900: can't get format: Устройство или ресурс занято
● pipewire-pulse.service - PipeWire PulseAudio
Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.service; enabled; preset: enabled)
Active: active (running) since Sat 2023-12-30 15:39:52 MSK; 3h 5min ago
TriggeredBy: ● pipewire-pulse.socket
Main PID: 1374 (pipewire-pulse)
Tasks: 2 (limit: 19024)
Memory: 35.5M
CPU: 17.947s
CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire-pulse.service
└─1374 /usr/bin/pipewire-pulse
дек 30 15:39:52 dunaevsky systemd[1101]: Started pipewire-pulse.service - PipeWire PulseAudio.
дек 30 15:39:52 dunaevsky pipewire-pulse[1374]: mod.rt: Can't find org.freedesktop.portal.Desktop. Is xdg-desktop-portal running?
дек 30 15:39:52 dunaevsky pipewire-pulse[1374]: mod.rt: found session bus but no portal
дек 30 15:39:52 dunaevsky pipewire-pulse[1374]: mod.rt: RTKit error: org.freedesktop.DBus.Error.AccessDenied
дек 30 15:39:52 dunaevsky pipewire-pulse[1374]: mod.rt: could not set nice-level to -11: Отказано в доступе
дек 30 15:39:52 dunaevsky pipewire-pulse[1374]: mod.rt: RTKit error: org.freedesktop.DBus.Error.AccessDenied
дек 30 15:39:52 dunaevsky pipewire-pulse[1374]: mod.rt: could not make thread 1625 realtime using RTKit: Отказано в доступе
После перезапуска служб вывод изменился:
● pipewire.service - PipeWire Multimedia Service
Loaded: loaded (/usr/lib/systemd/user/pipewire.service; enabled; preset: enabled)
Active: active (running) since Sat 2023-12-30 18:45:33 MSK; 11s ago
TriggeredBy: ● pipewire.socket
Main PID: 90583 (pipewire)
Tasks: 2 (limit: 19024)
Memory: 4.1M
CPU: 42ms
CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service
└─90583 /usr/bin/pipewire
дек 30 18:45:33 dunaevsky systemd[1101]: Started pipewire.service - PipeWire Multimedia Service.
● pipewire-pulse.service - PipeWire PulseAudio
Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.service; enabled; preset: enabled)
Active: active (running) since Sat 2023-12-30 18:45:43 MSK; 1s ago
TriggeredBy: ● pipewire-pulse.socket
Main PID: 90750 (pipewire-pulse)
Tasks: 2 (limit: 19024)
Memory: 1.4M
CPU: 21ms
CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire-pulse.service
└─90750 /usr/bin/pipewire-pulse
дек 30 18:45:43 dunaevsky systemd[1101]: Started pipewire-pulse.service - PipeWire PulseAudio.
Пользователь eugrus предложил такое решение — выключить службу pipewire-pulse.service
:
systemctl --user disable pipewire-pulse.service --now
В моём случае не помогло. Добавил себе в ~/.bashrc
псевдоним для команды перезапуска Pipewire:
alias resound='systemctl --user restart pipewire.service pipewire-pulse.service
Так и живу: включил компьютер, перезапустил службу звука, можно работать. Linux под суд. Была бы возможность — переехал бы на FreeBSD (не факт, что стало бы лучше).