0038 — Linux Drivers

Содержимое страницы

— Какой самый простой способ отобрать оружие у клерика Грамматона?

— Попросить его.

Какой самый простой способ установить драйверы в Linux?

  1. Определить аппаратный идентификатор нужного устройства.
  2. Найти в репозиториях нужный пакет.

Определение идентификатора устройства

Аппаратный идентификатор устройства состоит из двух шестнадцатеричных чисел, разделённых двоеточием, например:

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

Порядок действий:

  1. Обновите список пакетов:

    sudo apt-get update
    
  2. Найдите пакеты со словом 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 — не тот, что нам нужен.

  3. Установите пакет firmware-intel-sound:

    sudo apt-get install firmware-intel-sound --yes
    
  4. Перезагрузите компьютер.

Блокировка модуля ядра с драйвером 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
    
  1. Создайте в каталоге /etc/modprobe.d/ файл realtek-blacklist.conf со следующим содержимым:

    blacklist snd_hda_codec_realtek
    
  2. Перезагрузите компьютер.

    Наверное, есть какой-то способ избежать этого и загрузить драйвер «на лету», но в моём случае помогла только перезагрузка.

Состояние служб 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 (не факт, что стало бы лучше).