我有一台带有自定义 ZFS 内核模块(0.8.x 与提供的 0.7.x)的服务器 18.04。
定期,当我更新内核时,我必须重新编译 ZFS 内核模块,否则它将被自动禁用。
上次我不得不花了一些时间才完成它,所以这次我想提前知道所涉及的正确步骤。
我认为
- 更新内核和内核源代码
- 下载模块源并编译模块
- 删除以前的 kmod 包并安装新的
但是,由于需要内核模块来访问一些当前已挂载的文件系统,下一步该怎么做呢?只需重新启动即可挂载新模块?
我也需要在某个时候启用自动导入服务,请参阅https://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot
答案1
如果您更新当前正在运行的内核的模块,则需要停止使用该模块(即:umount
所有文件系统),rmmod zfs
让新模块可用,然后modprobe zfs
再次加载它。重新启动通常更容易,但如果需要,您可以在其他地方找到示例来帮助在系统运行时完成此操作。
# # Stop using the module
# rmmod zfs
# 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
您的需求。