了解 DKMS 与 KABI

在 Linux 中,DKMS 和 KABI 是两个与内核模块和驱动程序管理相关的术语,它们具有不同的含义和作用。

DKMS (Dynamic Kernel Module Support):

  • DKMS 是一个框架,旨在允许用户空间的软件(如第三方内核模块)在 Linux 内核升级时自动重新编译和安装。这是为了维护内核模块和当前运行内核版本之间的兼容性。

  • 当您安装了使用 DKMS 的内核模块(如 zfs-dkms),每当系统内核更新时,DKMS 会自动重新构建该模块以适应新的内核版本,这样用户就不需要手动重新编译模块。

  • DKMS 非常适合于滚动更新的系统或者那些经常需要更新内核的情况,因为它简化了内核模块的维护过程。

KABI (Kernel Application Binary Interface):

  • KABI 是指 Linux 内核的应用程序二进制接口,它定义了内核提供给加载的模块(如驱动程序)的稳定符号和接口。只要 KABI 保持稳定,预编译的内核模块就可以在新的内核版本上运行而无需重新编译。
  • 一些 Linux 发行版(如 Red Hat Enterprise Linux 和其衍生发行版)承诺在一个主要版本的生命周期内保持 KABI 稳定。这意味着为这些内核编译的模块可以在同一主要版本的任何未来更新中使用,而无需担心兼容性问题。
  • KABI 的稳定性对于企业环境非常重要,因为它允许管理员安全地应用内核更新而不会破坏现有的内核模块。

总的来说,DKMS 是一个帮助自动处理内核模块编译的系统,而 KABI 是 Linux 内核提供的一组稳定的接口,保证了内核模块的二进制兼容性。这两者都是为了解决内核更新可能带来的模块兼容性问题,但它们的方法和适用场景不同。

了解 zfs-dkms 与 zfs-kmod

zfs-dkms 是 ZFS 文件系统的 DKMS 实现方式。它会利用 DKMS 框架来自动为新的内核版本重新编译 ZFS 内核模块。这种方式提供了灵活性和方便性,特别是在那些频繁更新内核的系统上。

  • zfs-dkms 包含了 ZFS 文件系统的动态内核模块源码。

  • DKMS 代表 Dynamic Kernel Module Support(动态内核模块支持),可以在内核更新时自动重新编译并安装内核模块。

  • 当您安装 zfs-dkms 并更新内核时,dkms 系统会自动为新的内核版本重新构建 ZFS 模块,从而确保 ZFS 文件系统在内核更新后依然可以正常工作。

  • zfs-dkms 在不同版本的内核上更加灵活,因为它不依赖于预编译的模块。

zfs-kmod(包名: kmod-zfs)是 ZFS 文件系统的预编译内核模块,它符合特定 Linux 发行版所提供的 KABI。使用这种方式,您直接安装特定内核版本的预编译模块,无需在本地编译。这通常用于那些内核更新不频繁,或者需要保持内核接口稳定性的环境中。

  • kmod-zfs 包含了为特定内核版本预编译的 ZFS 内核模块。
  • 这些模块是专门为配合您当前运行的内核而构建的,因此它们不需要重新编译即可立即使用。
  • 当您更新内核时,您必须确保也有一个与新内核版本匹配的 kmod-zfs 包可用,否则 ZFS 文件系统可能无法加载或工作。
  • kmod-zfs 更适合在内核更新不频繁或者在稳定性至关重要的环境中使用,因为它避免了重新编译的需要,但这也意味着在内核更新后,您需要等待或寻找新版本的 kmod-zfs。

依赖源安装

1
2
sudo yum install elrepo-release -y
sudo yum install epel-release -y

OpenZFS 存储库 安装 ZFS 包

官网:https://zfsonlinux.org/

1
sudo yum install -y https://zfsonlinux.org/epel/zfs-release-2-3$(rpm --eval "%{dist}").noarch.rpm

确保使用的是 dkms 包

1
2
sudo yum config-manager --enable zfs
sudo yum config-manager --disable zfs-kmod

安装开发者工具依赖

1
sudo yum groupinstall "Development Tools" -y

删除旧内核开发工具

1
sudo yum remove kernel-devel

因为删除旧内核的时候会同时删除 openssl-devel,所以在安装新的 kernel-devel 之前,先安装 openssl-devel,安装的 kernel-devel 必须与现有内核版本一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 安装回上一步额外删除的 openssl-devel
sudo yum install openssl-devel

# 查询当前可安装的最新版本
sudo yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel-lt-devel --showduplicates

# 执行 uname -r 查看自己的内核版本
# 如果内核版本和可安装的版本不一致,优先尝试,安装自己内核对应版本的工具包
sudo yum install -y kernel-lt-devel-$(uname -r)

# 如果没有提供,那么就执行下面的步骤,同时安装同版本的内核和工具包
# 以查询到的最新版本为准安装内核和对应的内核工具包
# 同时安装内核和内核工具包
dnf --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-6.1.96-1.el9.elrepo kernel-lt-devel-6.1.96-1.el9.elrepo


# 预期结果如下
$ rpm -qa | grep kernel
kernel-srpm-macros-1.0-13.el9.noarch
kernel-modules-core-5.14.0-427.13.1.el9_4.x86_64
kernel-core-5.14.0-427.13.1.el9_4.x86_64
kernel-modules-5.14.0-427.13.1.el9_4.x86_64
kernel-5.14.0-427.13.1.el9_4.x86_64
kernel-core-5.14.0-427.22.1.el9_4.x86_64
kernel-modules-core-5.14.0-427.22.1.el9_4.x86_64
kernel-modules-5.14.0-427.22.1.el9_4.x86_64
kernel-tools-libs-5.14.0-427.22.1.el9_4.x86_64
kernel-tools-5.14.0-427.22.1.el9_4.x86_64
kernel-5.14.0-427.22.1.el9_4.x86_64
kernel-headers-5.14.0-427.22.1.el9_4.x86_64
kernel-lt-core-6.1.96-1.el9.elrepo.x86_64
kernel-lt-modules-6.1.96-1.el9.elrepo.x86_64
kernel-lt-6.1.96-1.el9.elrepo.x86_64
kernel-lt-devel-6.1.96-1.el9.elrepo.x86_64 # <--------------- 注意这里
kernel-devel-5.14.0-427.22.1.el9_4.x86_64
kernel-devel-matched-5.14.0-427.22.1.el9_4.x86_64
$ uname -r
6.1.96-1.el9.elrepo.x86_64 # kernel-lt-devel-6.1.96-1.el9.elrepo.x86_64 的版本必须和 这里的一致

如果上面选择了升级了原有内核,则需要重新更新下引导

1
2
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

安装 zfs-dkms

1
sudo yum install -y zfs-dkms

查看状态

1
2
$ dkms status
zfs/2.1.15, 6.1.96-1.el9.elrepo.x86_64, x86_64: installed

一般上一步会已经安装 zfs 了,本步骤重复执行确保正确

1
sudo dkms install zfs/2.1.15

安装命令行工具

1
sudo yum install -y zfs