Включаем звук при запуске с systemd и Gentoo


После каждой новой установки Gentoo у меня возникает одна и та же проблема, суть которой заключается в том, что alsa по умолчанию затыкает (mute) вывод на наушники. Включение через alsa-mixer помогает, по запускать псевдографическую утилиту после каждой перезагрузки — это как-то не Unix-way.

Стоит отметить, что конфигурация у меня своеобразная: у меня имеется встроенная глючная звуковая карта, поддерживаемая модулем «intel_hda». Суть ее проблем в том, что вывод на наушники на передней панели системного блока не работает до тех пор, пока ничего не включено в основное гнездо для колонок на задней панели. Так как колонок у меня нет, подключать туда нечего. Со временем я нашел выход из этой ситуации и стал втыкать в заднее гнездо пустой джек без провода.

Сегодня выяснилась еще одна вещь: кроме alsa-mixer помогает также и alsactl init, однако после нее звук подключается с минимальной громкостью на всех выходах. Решается эта проблема последующим запуском alsactl restore, после чего восстанавливается последнее сохраненное значение громкости и подключенных (muted/unmuted) выходов. Соответственно, записываются в кэш эти значения после запуска команды alsactl store. Можно, конечно, добавить первые две в автозагрузку при запуске, но крайне желательно было бы в таком случае еще и записывать значение громкости при выходе, а такого у нас в данном варианте решения проблемы не будет. Что же делать? А почему бы не оформить запуск и отключение звука в качестве сервиса?

Для этого нам понадобится создать скрипт для systemctl по адресу «/etc/systemd/system/alsa-init.service». В данном примере все, что до «.service» и после «…system/» — название сервиса, которое может быть таким, каким душа пожелает, но только без пробелов и в пределах разумного. В данном скрипте собираем краткие сведения о том, что и каким образом он исполняет:

[Unit]
Description=Alsa-Init

[Service]
Type=oneshot
ExecStartPre=-/usr/sbin/alsactl init
ExecStart=-/usr/sbin/alsactl restore
ExecStop=-/usr/sbin/alsactl store

[Install]
WantedBy=basic.target

В данном документе мы объявили, что перед запуском сервиса по восстановлению громкости необходимо сначала проинициализировать звуковые карты (alsactl init), а затем восстановить последнее сохраненное значение громкости (alsactl restore). В параметре «ExecStop» мы объявляем, что при выключении компьютера следует сохранить текущее на тот момент значение громкости и подключенных входов/выходов (при следующей загрузке будет автоматически восстановлено). Дефисы перед путями к alsactl указывают systemctl на то, что ему не следует обращать внимание на возникающие ошибки (почему-то вывод alsactl init для systemctl является ошибкой, хотя все отрабатывает нормально и без проблем с определением).

Теперь командой systemctl start alsa-init мы запускаем звук в системе и восстанавливаем значения громкости, а по systemctl stop alsa-init — только сохраняем текущие (обратите внимание, что alsa не завершается, но это можно поправить в случае необходимости переместив текущее значение «ExecStop» в «ExecStopPre» и добавив в «ExecStop» что-то, что завершает работу alsa). Тем не менее, пока наше дело не завершено. Осталось еще добавить наш новый сервис в загрузку по умолчанию при запуске системы:

systemctl enable alsa-init

Теперь все. Перезагружайте компьютер и больше не думайте о том, что нужно будет восстанавливать звук.


28.02.2016, 21:38
  Gentoo, Linux, Alsa, звук.
Просмотров: 6252.