Как сделать изменения в /sys/module/*/parameters постоянными?

Вопрос или проблема

Недавно у меня возникла проблема, когда после загрузки клавиатура не работала. Мне нужно было отключить и снова подключить ее, чтобы использовать.
Проблема заключалась в том, что мой usb переходил в режим автопрерывания, что можно отключить с помощью echo -1 >/sys/module/usbcore/parameters/autosuspend.

Но теперь через некоторое время в работе /sys/module/usbcore/parameters/autosuspend снова содержит 2. Я подозреваю, что это было вызвано обновлением моего ядра.

Есть ли способ сделать так, чтобы этот параметр не менялся с обновлениями?
Я читал о загрузке модулей и предоставлении параметров в /etc/modprobe.d или /etc/module-load.d, но не смог найти синтаксис, как это сделать.

Это не вызвано обновлением вашего ядра — это просто вызвано перезагрузкой. /sys не является “реальной” файловой системой на диске — это прямой доступ к интерфейсам ядра, но представленный как виртуальная файловая система. Поэтому ничего не записывается в таком виде, чтобы сохраняться постоянно, когда вы вносите изменения в эти файлы. (Или “файлы”, как я полагаю.)

Как вы где-то читали, вы можете задать параметр на командной строке ядра. В случае, описанном вами выше, это будет usbcore.autosuspend=-1

У нас есть статья о настройке параметров командной строки ядра на Fedora Linux в журнале Fedora. Кратко:

 grubby --update-kernel=ALL --args="usbcore.autosuspend=-1" 

и тогда это будет сохраняться после перезагрузки (и всех последующих обновлений ядра).

https://wiki.archlinux.org/title/Kernel_module#Using_modprobe.d

Так что я полагаю, в вашем случае вы могли бы достичь этого, создав файл /etc/modprobe.d/usbcore.conf

И разместите следующий контент там:

options usbcore autosuspend=-1

Я думаю, также имеет смысл обновить образ initramfs после изменения этих настроек. Команда для обновления изображения варьируется в зависимости от системы. В arch linux она выглядит примерно так:

mkinitcpio -P

https://wiki.archlinux.org/title/Mkinitcpio

Вы должны попробовать sudo dracut --force. Это пересоберет initramfs и загрузит его при загрузке.

РЕДАКТИРОВАТЬ: dracut в основном пересобирает initramfs/initrd для предварительной загрузки модулей блочных устройств, распаковывает этот архив в RAM диск, монтирует и использует его как начальную корневую файловую систему.

Ответ или решение

Для обеспечения устойчивости изменений параметров в /sys/module/*/parameters, необходимо учитывать, что файловая система /sys не сохраняет данные между перезагрузками. Это виртуальная файловая система, которая обеспечивает интерфейс взаимодействия с ядром в реальном времени, и изменения в ней теряются при каждом перезапуске системы.

Теория

Существует несколько способов добиться того, чтобы параметры определённых модулей ядра оставались постоянными между перезагрузками:

  1. Конфигурация параметров модуля через командную строку ядра (GRUB). Параметры могут быть заданы непосредственно в командной строке ядра. Это позволяет задать параметры, которые будут применяться на этапе загрузки системы.

  2. *Использование конфигурационных файлов в /etc/modprobe.d/.conf**. Эти файлы позволяют определить параметры, которые будут применены при загрузке модуля. Данный метод особенно полезен для случаев, когда модуль может быть загружен и выгружен многократно.

  3. Использование инициализационного скрипта (rc.local или аналогов). Это менее предпочтительный метод, так как предполагает выполнение скриптов после завершения загрузки системы, но иногда это единственный способ для специфических конфигураций.

Пример

В вашем случае, проблема связана с тем, что параметр autosuspend для модуля usbcore принимает значение по умолчанию (например, 2) после каждого перезапуска. Чтобы предотвратить это, вы можете использовать один из вышеупомянутых методов.

1. Конфигурация через командную строку ядра

Самый надежный способ — это задать параметр напрямую в конфигурации загрузчика GRUB. Это можно сделать с помощью утилиты grubby, которая редактирует параметры загрузки ядра во всех конфигурациях. Например:

grubby --update-kernel=ALL --args="usbcore.autosuspend=-1"

2. Использование /etc/modprobe.d/

Создайте файл usbcore.conf в директории /etc/modprobe.d/:

echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/usbcore.conf

После этого может потребоваться обновление образа initramfs, чтобы изменения вступили в силу при следующей загрузке. На различных системах это может быть сделано разными командами:

  • На Arch Linux:

    sudo mkinitcpio -P
  • На дистрибутивах, базирующихся на Red Hat, таких как CentOS или Fedora:

    sudo dracut --force

Применение

После применения изменений необходимо перезагрузить систему, чтобы убедиться в том, что параметры применены. С помощью команды cat вы можете проверить текущее значение параметра после загрузки:

cat /sys/module/usbcore/parameters/autosuspend

Ожидаемое значение будет равно -1, если все шаги были выполнены корректно.

Кроме того, иметь резервную копию конфигурационных файлов и регулярно проверять систему после обновлений ядра будет полезным, чтобы гарантировать, что изменения сохраняются.

Знание, как правильно настроить сохранение параметров модуля, позволяет избежать множества проблем, связанных с производительностью и поведением оборудования, подключенного к вашей системе, таких как клавиатура в вашем примере. Это не только способствует стабильности системы, но также улучшает пользовательский опыт.

Оцените материал
Добавить комментарий

Капча загружается...