%20%E2%80%93%20benutzerdefiniertes%20Initramfs%20mit%20Dracut.png)
Wir möchten ZFS mit QAT-Offloading für Komprimierungen und Prüfsummen ausführen.
Die Distribution ist Centos 8.2 mit dem Standardkernel:
[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
für die QAT haben wir:
qat1.7.l.4.11.0-00001 (neueste Version von Intel)
./configure --enable-icp-trace --enable-icp-debug --enable-icp-log-syslog --enable-kapi
make
make install
für ZFS haben wir:
[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
Das Problem ist die Ladereihenfolge der Module: ZFS verwendet QAT nicht richtig, da das ZFS-Modul vor QAT geladen wird. Darüber hinaus werden die QAT-Module in einem Init-Skript qat_service geladen, in dem das Programm adf_ctl verwendet wird, um die QAT-Dienste zu initialisieren. Dieser qat_service ist als letzter auszuführender Dienst geplant!
Grundsätzlich qat_service
wird ein Programm adf_ctl
zum Starten der Qat-Engines gestartet. Daher handelt es sich nicht nur um ein Problem der Ladereihenfolge der Module, sondern zunächst
adf_ctl
muss Modprobing für ZFS ausgeführt werden.
So wie ich sehe, wird zfs mit einem Dracut-Modul namens zfs-dracut geliefert, um die Module in initramfs für Root-Partitionen in zfs zu laden.
Hat jemand Erfahrungen mit der Verwendung von Intel QAT mit ZFS, die er teilen möchte?
Idealerweise würden wir gerne ein Dracut-Modul schreiben, das vor dem ZFS-Dracut-Modul läuft, um die Initialisierung von QAT in Initramfs durchzuführen, bevor ZFS geladen wird.
Antwort1
Ich habe es mit einem benutzerdefinierten Initramfs mit Dracut irgendwie zum Laufen gebracht ...
Sie müssen die Dracut-Module für zfs:
02zfsexpandknowledge
und ausschließen 90zfs
.
Anschließend fügen Sie ein benutzerdefiniertes Modul für qat hinzu:
[root@dellqat ~]# cd /usr/lib/dracut/modules.d/
[root@dellqat modules.d]# mkdir 89qat
In 89qat legen Sie zwei Dateien ab:
[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
}
Und
[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;
Beide Dateien müssen chmod 755 sein.
Anschließend erstellen Sie das Image mit Dracut neu:
dracut foobar.img $(uname -r) --force -v
welches das Initramfs-Image „foobar.img“ für den aktuellen Kernel erstellt.
Ich weiß nicht, warum, aber die Module werden nicht in der richtigen Reihenfolge geladen, wenn Sie auch die zfs-dracut-Module behalten: 02zfsexpandknowledge
und 90zfs
.
Vielleicht kann jemand mit mehr Erfahrung mit Dracut helfen?