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 (Intel の最新版)

./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 モジュールは init スクリプト qat_service にロードされ、そこでプログラム adf_ctl を使用して QAT サービスを初期化します。この qat_service は、最後に実行されるサービスとしてスケジュールされます。

基本qat_service的に、qat エンジンを起動するプログラムを起動するadf_ctlため、モジュールの読み込み順序の問題だけではありません。その前に、zfs の modprobing を adf_ctl実行する必要があります。

私の見るところ、zfs には、zfs のルート パーティションの initramfs にモジュールをロードするための dracut モジュール zfs-dracut が付属しています。

ZFS で Intel QAT を使用した経験を共有できる人はいますか?

理想的には、ZFS をロードする前に initramfs で QAT の init を実行するために、zfs dracut モジュールの前に配置される dracut モジュールを作成したいと考えています。

答え1

dracut を使用したカスタム initramfs でなんとか動作させることができました...

02zfsexpandknowledgezfs:およびの dracut モジュールを除外する必要があります 90zfs

次に、qat のカスタム モジュールを追加します。

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

89qat の中に 2 つのファイルを置きます:

[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 の経験が豊富な人が助けてくれるかもしれませんか?

関連情報