更新当前正在使用的内核模块的完整过程是什么?

更新当前正在使用的内核模块的完整过程是什么?

我有一台带有自定义 ZFS 内核模块(0.8.x 与提供的 0.7.x)的服务器 18.04。

定期,当我更新内核时,我必须重新编译 ZFS 内核模块,否则它将被自动禁用。

上次我不得不花了一些时间才完成它,所以这次我想提前知道所涉及的正确步骤。

我认为

  1. 更新内核和内核源代码
  2. 下载模块源并编译模块
  3. 删除以前的 kmod 包并安装新的

但是,由于需要内核模块来访问一些当前已挂载的文件系统,下一步该怎么做呢?只需重新启动即可挂载新模块?

我也需要在某个时候启用自动导入服务,请参阅https://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot

答案1

如果您更新当前正在运行的内核的模块,则需要停止使用该模块(即:umount所有文件系统),rmmod zfs让新模块可用,然后modprobe zfs再次加载它。重新启动通常更容易,但如果需要,您可以在其他地方找到示例来帮助在系统运行时完成此操作。

  1. # # Stop using the module
  2. # rmmod zfs
  3. # modprobe zfs

如果你希望每次更新内核时自动编译并安装模块更新,你可能会感兴趣知识管理系统. 有一个伟大的DKMS 包装指南其中详细讨论了这一点。

这个想法是,你有一个模块,或者对内核的一些更改,你想在每次内核更新时应用它。你可以在apt更新使用的内核时自动编译和安装模块。你可以在 VirtualBox 中找到很好的例子,也可以在NVIDIA DKMS 驱动程序

另一个很好的例子是patjak 的 bcwc_pciebcwc_pcie. 编译或facetimehd模块并将其提供给新内核的过程是记录

设置 DKMS(内核更新时自动编译)

这假设您已经遵循了 Debian/Ubuntu deb 软件包步骤。您需要验证dkms.conf模块名称facetimehd和版本号0.1是否正确,然后更新或调整使用和的dkms.conf说明。-m-v

  • 安装所需的软件包:# apt install debhelper dkms
  • 如果已安装,删除旧包:# dpkg -r bcwc-pcie
  • 创建一个工作目录:# mkdir /usr/src/facetimehd-0.1
  • 切换到 git repo 目录:$ cd bcwc_pcie
  • 复制文件:# cp -r * /usr/src/facetimehd-0.1/
  • 改变到该目录:# cd /usr/src/facetimehd-0.1/
  • 删除所有以前的 deb 和备份:# rm backup-*tgz bcwc-pcie_*deb
  • 清除以前的编译:# make clean
  • 使用 DKMS 注册新模块:# dkms add -m facetimehd -v 0.1
  • 构建模块:# dkms build -m facetimehd -v 0.1
  • 构建 Debian 源包:# dkms mkdsc -m facetimehd -v 0.1 --source-only
  • 构建 Debian 二进制包:# dkms mkdeb -m facetimehd -v 0.1 --source-only
  • 将 deb 复制到本地:# cp /var/lib/dkms/facetimehd/0.1/deb/facetimehd-dkms_0.1_all.deb /root/
  • 删除本地构建文件:# rm -r /var/lib/dkms/facetimehd/
  • 安装新的 deb 包:# dpkg -i /root/facetimehd-dkms_0.1_all.deb

如果您遇到任何问题,请阅读有关制作 DKMS 包的指南: http://www.xkyle.com/building-linux-packages-for-kernel-drivers/


此示例中唯一缺少的部分bcwc_pcie是此代码库未更新,而您正在编译的模块代码可能会随时间而变化。如果您能找到最新的下载,与您尝试编译的源的特定版本相比。

dkms.conf我们可以看看DKMS 社区文档

$ cat dkms.conf 
MAKE="make -C src/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C src/ clean"
BUILT_MODULE_NAME=awesome
BUILT_MODULE_LOCATION=src/
PACKAGE_NAME=awesome
PACKAGE_VERSION=1.1
REMAKE_INITRD=yes

您还可以添加选项以在构建或安装之前或之后调用脚本,提供额外的(条件)make 命令、修补命令等。dkms.conf 实际上源自 shell 脚本,因此如果需要,可以进行相当多的欺骗。这些选项和更多内容在 man dkms 中的 dkms.conf 部分中有描述。

手册页

PRE_BUILD= 在执行构建之前要运行的脚本的名称。路径应相对于源的根目录给出。

您可以创建一个目录来包含下载并提取的脚本最新版本的 ZFS为构建做准备。这将有助于自动化该过程。您可以使用git或下载并提取latest源代码。以下是如何确定 ZFS 的最新下载 URL 的示例:

$ curl -s https://api.github.com/repos/zfsonlinux/zfs/releases/latest | jq '.assets[].browser_download_url' | tr -d '"' | grep -E 'tar.gz$'
https://github.com/zfsonlinux/zfs/releases/download/zfs-0.8.1/zfs-0.8.1.tar.gz

您提到了禁用服务带来的麻烦systemd。设置您自己的 ZFSdkms设置是否可以解决此问题?您是否安装了依赖于实际zfs-dkms软件包的软件包,从而导致其发生冲突?至少,您可以挂接POST_INSTALL并运行systemctl enable以启用正在禁用的任何服务。


话虽如此,ZFS 是一个非常流行的文件系统,应该已经有一个可用的 DKMS 包。这似乎是真的,而且zfs-dkms有售宇宙。您可以查看这个包的具体信息,看看它是否已经可以满足zfs-dkms您的需求。

相关内容