내 시스템은 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_fops
가 struct proc_ops *proc_ops
. 더 자세히 살펴보면 owner
구조체의 멤버를 완전히 제거하고 및 read
멤버 의 이름을 및 로 write
바꾸는 것을 볼 수 있습니다 .proc_read
proc_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의 주요 변경 사항에 대한 광범위한 질문보다는 이 답변이 솔루션을 제공하는 데 도움이 될 수도 있습니다. 질문에 연결된 저장소에 대한 몇 가지 추가 관찰 사항이 있습니다.
- 그것은 가지고있다풀 요청 열기몇 년 동안 저장소 소유자의 의견도 없이 내 솔루션과 비슷한 방식으로 이 문제를 해결하여 다음과 같은 결론을 내렸습니다.
- 이 모듈은 실제로버려진 소프트웨어, 그리고 (가장 중요한 것은),
- 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
.