Debianでは、「互換性のないポインタ型」のためにdkmsのインストールが失敗しますが、Ubuntuでは失敗するのはなぜですか?

Debianでは、「互換性のないポインタ型」のためにdkmsのインストールが失敗しますが、Ubuntuでは失敗するのはなぜですか?

私のシステムは、Debian 11を実行しているIntel nuc(NUC6CAYH)です。 acpiを介してプログラム可能なLEDと対話するためにカーネルモジュールをインストールしようとしています。 Ubuntu 20.04 LTSと同じシステムにこのモジュールを正常にインストールしましたが、Debian 11ではインストールに失敗しました。

ドライバーはここにあります:https://github.com/milesp20/intel_nuc_led

私のインストールプロセス:

git clone https://github.com/milesp20/intel_nuc_led.git
cd intel_nuc_led
sudo make dkms-deb
sudo dpkg -i /var/lib/dkms/intel-nuc-led/1.0/deb/intel-nuc-led-dkms_1.0_all.deb

最後のコマンドの出力:

Selecting previously unselected package intel-nuc-led-dkms.
(Reading database ... 89355 files and directories currently installed.)
Preparing to unpack .../intel-nuc-led-dkms_1.0_all.deb ...
Unpacking intel-nuc-led-dkms (1.0) ...
Setting up intel-nuc-led-dkms (1.0) ...
Removing old intel-nuc-led-1.0 DKMS files...

------------------------------
Deleting module version: 1.0
completely from the DKMS tree.
------------------------------
Done.
Loading new intel-nuc-led-1.0 DKMS files...
Building for 5.10.0-10-amd64
Building for architecture x86_64
Building initial module for 5.10.0-10-amd64
Error! Bad return status for module build on kernel: 5.10.0-10-amd64 (x86_64)
Consult /var/lib/dkms/intel-nuc-led/1.0/build/make.log for more information.
dpkg: error processing package intel-nuc-led-dkms (--install):
 installed intel-nuc-led-dkms package post-installation script subprocess returned error exit status 10
Errors were encountered while processing:
 intel-nuc-led-dkms

そして、次のログファイルを確認してください。

DKMS make.log for intel-nuc-led-1.0 for kernel 5.10.0-10-amd64 (x86_64)
Tue 21 Dec 2021 02:26:47 PM EST
make: Entering directory '/usr/src/linux-headers-5.10.0-10-amd64'
  CC [M]  /var/lib/dkms/intel-nuc-led/1.0/build/nuc_led.o
/var/lib/dkms/intel-nuc-led/1.0/build/nuc_led.c: In function ‘init_nuc_led’:
/var/lib/dkms/intel-nuc-led/1.0/build/nuc_led.c:475:75: error: passing argument 4 of ‘proc_create’ from incompatible pointer type [-Werror=incompatible-pointer-types]
  475 |         acpi_entry = proc_create("nuc_led", nuc_led_perms, acpi_root_dir, &proc_acpi_operations);
      |                                                                           ^~~~~~~~~~~~~~~~~~~~~
      |                                                                           |
      |                                                                           struct file_operations *
In file included from /var/lib/dkms/intel-nuc-led/1.0/build/nuc_led.c:36:
/usr/src/linux-headers-5.10.0-10-common/include/linux/proc_fs.h:109:122: note: expected ‘const struct proc_ops *’ but argument is of type ‘struct file_operations *’
  109 | struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct proc_ops *proc_ops);
      |                                                                                                   ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
cc1: some warnings being treated as errors
make[2]: *** [/usr/src/linux-headers-5.10.0-10-common/scripts/Makefile.build:285: /var/lib/dkms/intel-nuc-led/1.0/build/nuc_led.o] Error 1
make[1]: *** [/usr/src/linux-headers-5.10.0-10-common/Makefile:1846: /var/lib/dkms/intel-nuc-led/1.0/build] Error 2
make: *** [/usr/src/linux-headers-5.10.0-10-common/Makefile:185: __sub-make] Error 2
make: Leaving directory '/usr/src/linux-headers-5.10.0-10-amd64'

要約すると、Ubuntu 20.04 LTSではkernelを使用してビルドとインストールがうまくいきますが5.4.0-91、kernelを使用するDebian 11では失敗します5.10.0-10

ありがとうございます。

答え1

Linuxカーネルv5.6の主な変更点

これには以下が含まれます。Linuxカーネルの変更バージョン5.6で導入されたproc_create APIの場合、幸いなことにそれ以降のリリースバージョンにビルドするのに必要なコードの変更は非常に少なくなります。

つまり、proc_createの4番目のパラメータstruct file_operations *proc_fopsstruct proc_ops *proc_ops。より詳しく見ると、owner構造体のメンバーを完全に削除し、readメンバーの名前をおよびにwrite変更することがわかります。proc_readproc_write

カーネルからそれをビルドするには、nuc_led.cファイルを開き、置き換えます。ライン446-450次のコードスニペットを使用します(または、これらの変更とモジュールのビルドシステムとDKMS構成に対するその他の変更を含むパッチファイルへのリンクを表示するには、この応答の次のセクションを読んでください)。

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
static struct proc_ops proc_acpi_operations = {
    .proc_read     = acpi_proc_read,
    .proc_write    = acpi_proc_write,
};
#else
static struct file_operations proc_acpi_operations = {
    .owner    = THIS_MODULE,
    .read     = acpi_proc_read,
    .write    = acpi_proc_write,
};
#endif

さらなる観察

具体的には、この参照ユースケースに関連して、カーネルバージョン5.6の主な変更に関する広範な質問ではなく、この回答がソリューションを提供するのに役立ちます。質問にリンクされたリポジトリに関するいくつかの追加の観察があります。

  1. 持っているプール要求を開く長年にわたり、リポジトリ所有者の意見もなく、私の解決策と同様の方法でこの問題を解決し、次の結論を下しました。
  2. このモジュールは実際に放棄されたソフトウェア、そして(最も重要なことは)、
  3. DKMS システムとその構成に関して知られているいくつかの悪いケースを扱います。

レビューファイルの生成そしてそれに対応するdkms.confリポジトリ内のファイルを見て、実行中のシステムを起動するために使用されたバージョンではなく、複数のカーネルバージョンに対して正しく構築されていないという暫定的な結論に達しました。前に私の仮説をテストすることができます)。 Kubuntu 21.10「Impish Indri」でテストされ、v5.15およびv5.16カーネルで正常に構築されました。私はそれらを次のようにマージしました。GitHub Gistを介して共有されたパッチファイルしたがって、以下を使用してリポジトリのローカルレプリカに簡単に適用できますcurl https://gist.githubusercontent.com/RogueScholar/02624d2e8a6d9e286dbece73f48106db/raw/f6c0b1e82f970f2c3c74c5f91ec42059ba1e8f13/Add-conditional-for-proc_create-API-changes-in-kernel-5.6+.patch | git apply -v --index

関連情報