我总是想知道为什么每次系统更新后我都必须重新启动机器才能安装 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
只需新的模块文件,尽管版本不匹配,它仍然可以工作。