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의 주요 변경 사항

여기에는 다음이 포함됩니다.리눅스 커널 변경버전 5.6에 도입된 proc_create API의 경우 다행히 그 이후 출시된 버전으로 빌드하는 데 필요한 코드 변경 사항이 매우 적습니다.

즉, proc_create의 네 번째 매개변수 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.

관련 정보