Мне всегда было интересно, почему после каждого обновления системы мне приходилось перезагружать машину, чтобы смонтировать USB-устройство.
1 ответ
Во время обновления пакета linux
(как и любого другого пакета) все файлы, принадлежащие старой версии, удаляются. Сюда входят все модули ядра, находящиеся в каталоге /lib/modules/<version>
. Таким образом, система больше не может автоматически загружать модули для этой версии.
Например:
Вы загружаетесь с использованием ядра
4.12.99
, но позже обновите пакет до4.13.0
.При подключении нового типа устройства (для которого модули еще не загружены), система по- прежнему выглядит в каталоге для текущей версии, то есть
/lib/modules/4.12.99
Но поскольку пакет был обновлен, файлов больше нет.
(Обратите внимание, что это влияет только на обновления, которые изменили текущий пакет ядра. Если это происходит каждый раз, то, возможно, вы недостаточно часто обновляете систему ...)
У вас есть несколько возможных обходных путей:
Вы можете временно понизить версию пакета ядра до любой версии, которая в данный момент работает; переподключите устройства; и обновите снова. Как только необходимые модули будут загружены, они останутся загруженными.
Вы можете узнать, какие модули часто используются (например, что необходимо для флешек), и загрузить их при загрузке. Опять же, после загрузки они останутся загруженными и больше не будут зависеть от обновлений.
- В только что перезагруженной системе запустите
lsmod | awk '{print $1}' | sort > before.txt
для получения списка присутствующих модулей. - Подключите свои флешки, адаптеры, мыши, все, что вы часто используете. Это приведет к загрузке всех необходимых модулей.
- Запустите
lsmod | awk '{print $1}' | sort > after.txt
для создания обновленного списка. - Используйте
diff before.txt after.txt
чтобы определить новые имена. - Наконец, создайте файл
/etc/modules-load.d/something.conf
содержащий только имена, полученные на шаге № 4, по одному на строку.
- В только что перезагруженной системе запустите
Если бы это был Gentoo или подобный дистрибутив, вы могли бы скомпилировать те же функции в самом ядре (т.е. не в виде модулей), чтобы они постоянно присутствовали.
В некоторых сложных случаях (когда вы уже знаете имя модуля, но не можете ни перезагрузиться, ни получить правильную версию), если обновление было только между второстепенными выпусками (например, с 4.13.1 до 4.13.2), есть вероятность, что вы можете просто
insmod
новый файл модуля, и он все равно будет работать, несмотря на несовпадение версий.