%20%E2%80%94%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5%20initramfs%20%D1%81%20dracut.png)
Мы хотели бы запустить ZFS с разгрузкой QAT для сжатия и контрольных сумм.
Дистрибутив — 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 загружаются в скрипте инициализации qat_service, где для инициализации служб QAT используется программа adf_ctl. Эта служба qat_service запланирована как последняя для запуска!
По сути, они qat_service
запускают программу adf_ctl
для запуска движков QAT, поэтому проблема не только в порядке загрузки модулей: перед этим
adf_ctl
необходимо запустить modprobing для ZFS.
Как я вижу, в комплект zfs входит модуль dracut zfs-dracut для загрузки модулей в initramfs для корневых разделов в zfs.
Есть ли у кого-нибудь опыт использования Intel QAT с ZFS?
В идеале мы хотели бы написать модуль dracut, который будет предшествовать модулю zfs dracut для выполнения инициализации QAT в initramfs перед загрузкой ZFS.
решение1
У меня вроде как заработало с кастомным initramfs с dracut...
Необходимо исключить модули dracut для zfs:
02zfsexpandknowledge
и 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
которые создают образ initramfs "foobar.img" для текущего ядра.
Я не знаю почему, но модули не загружаются в правильном порядке, если вы также сохраняете модули zfs-dracut: 02zfsexpandknowledge
и 90zfs
.
Может быть, кто-то с большим опытом работы с dracut сможет помочь?