Intel DH895XCC 系列 QAT 和 ZFS (2.0.0) - 使用 dracut 自定义 initramfs

Intel DH895XCC 系列 QAT 和 ZFS (2.0.0) - 使用 dracut 自定义 initramfs

我们希望运行带有 QAT 卸载的 ZFS 来进行压缩和校验。

该发行版是带有标准内核的 Centos 8.2:

[root@dellqat ~]# uname -a
Linux dellqat 4.18.0-193.19.1.el8_2.x86_64 #1 SMP Mon Sep 14 14:37:00 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

对于 QAT,我们有:

qat1.7.l.4.11.0-00001(英特尔最新版本)

./configure --enable-icp-trace --enable-icp-debug --enable-icp-log-syslog --enable-kapi
make
make install

对于 ZFS,我们有:

[root@dellqat zfs_latest]# git status
On branch zfs-2.0-release
Your branch is up to date with 'origin/zfs-2.0-release'.

nothing to commit, working tree clean

export ICP_ROOT=/opt/A3C/qat1.7.l.4.11.0-00001
./configure --with-qat=/opt/A3C/qat1.7.l.4.11.0-00001
make
make install
ldconfig

问题在于模块加载顺序:ZFS 无法正确使用 QAT,因为 zfs 模块是在 QAT 之前加载的。不仅如此,QAT 模块还加载在初始化脚本 qat_service 中,其中使用程序 adf_ctl 来初始化 QAT 服务。此 qat_service 被安排为最后运行的服务!

基本上qat_service启动一个程序adf_ctl来启动 qat 引擎,因此它不仅仅是一个模块加载顺序的问题:之前 adf_ctl必须运行 zfs 的 modprobing。

据我所知,zfs 带有一个 dracut 模块 zfs-dracut,用于将 initramfs 中的模块加载到 zfs 中的根分区中。

有谁有使用 Intel QAT 和 ZFS 的经验可以分享吗?

理想情况下,我们希望编写一个 dracut 模块,该模块位于 zfs dracut 模块之前,用于在加载 ZFS 之前在 initramfs 中执行 QAT 的初始化。

答案1

我使用带有 dracut 的自定义 initramfs 让它工作......

02zfsexpandknowledge您必须排除 zfs :的 dracut 模块 90zfs

然后为 qat 添加自定义模块:

[root@dellqat ~]# cd /usr/lib/dracut/modules.d/
[root@dellqat modules.d]# mkdir 89qat

在 89qat 里面放入两个文件:

[root@dellqat modules.d]# cd 89qat/
[root@dellqat 89qat]# cat module-setup.sh 
#!/usr/bin/env bash

check() {
    return 0
}

depends() {
    return 0
}

installkernel() {
    instmods qat_dh895xcc
    instmods qat_api
    instmods usdm_drv
    instmods intel_qat
    instmods uio
}

install() {
    inst_hook pre-mount 10 "${moddir}/qat_start.sh"
    inst /etc/dh895xcc_dev0.conf /etc/dh895xcc_dev0.conf
    inst /usr/local/bin/adf_ctl /sbin/adf_ctl
    inst /usr/bin/sleep /sbin/sleep
}

[root@dellqat 89qat]# cat qat_start.sh
#!/bin/sh

modprobe -r qat_api;
/sbin/sleep 1;
modprobe -r qat_dh895xcc;
/sbin/sleep 1;
modprobe qat_dh895xcc;
/sbin/sleep 1;
modprobe qat_api;
/sbin/sleep 1;
/sbin/adf_ctl restart 1>/dev/null 2>&1;
/sbin/sleep 1;

两个文件均应为 chmod 755。

然后使用 dracut 重建图像: dracut foobar.img $(uname -r) --force -v

为当前内核创建“foobar.img”initramfs 映像。

02zfsexpandknowledge我不知道为什么,但是如果您还保留 zfs-dracut 模块:和90zfs,模块就不会按正确的顺序加载。

也许有更多使用 dracut 经验的人可以提供帮助?

相关内容