%20-%20initramfs%20personalizado%20com%20dracut.png)
Gostaríamos de executar o ZFS com descarregamento QAT para compactações e somas de verificação.
A distribuição é Centos 8.2 com o kernel padrão:
[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
para o QAT temos:
qat1.7.l.4.11.0-00001 (mais recente da Intel)
./configure --enable-icp-trace --enable-icp-debug --enable-icp-log-syslog --enable-kapi
make
make install
para ZFS temos:
[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
O problema é a ordem de carregamento do módulo: o ZFS não usa corretamente o QAT porque o módulo zfs é carregado antes do QAT. Não apenas isso, mas os módulos QAT são carregados em um script de inicialização qat_service onde o uso de um programa adf_ctl é feito para iniciar os serviços QAT. Este qat_service está agendado como o último serviço a ser executado!
Basicamente qat_service
, lança um programa adf_ctl
para iniciar os motores qat, portanto, não é apenas um problema de ordem de carregamento do módulo: antes que o modprobing para zfs
adf_ctl
seja executado.
Pelo que vejo, o zfs vem com um módulo dracut zfs-dracut para carregar os módulos no initramfs para partições raiz no zfs.
Alguém tem experiência para compartilhar sobre o uso do Intel QAT com ZFS?
Idealmente, gostaríamos de escrever um módulo dracut que vá antes do módulo zfs dracut para executar o init do QAT no initramfs antes de carregar o ZFS.
Responder1
Eu meio que consegui trabalhar com um initramfs personalizado com dracut ...
Você deve excluir os módulos dracut para zfs:
02zfsexpandknowledge
e 90zfs
.
Em seguida, você adiciona um módulo personalizado para qat:
[root@dellqat ~]# cd /usr/lib/dracut/modules.d/
[root@dellqat modules.d]# mkdir 89qat
dentro do 89qat você coloca dois arquivos:
[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
}
e
[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;
ambos os arquivos devem ser chmod 755.
você então reconstrói a imagem com dracut:
dracut foobar.img $(uname -r) --force -v
que cria a imagem initramfs "foobar.img" para o kernel atual.
Não sei por que, mas os módulos não carregam na ordem correta se você mantiver também os módulos zfs-dracut: 02zfsexpandknowledge
e 90zfs
.
Talvez alguém com mais experiência com dracut possa ajudar?