다음 커널을 설치했습니다.
[root@localhost ~]# uname -r
2.6.32-573.el6.x86_64
다음 커널 소스 코드는 다음과 같습니다.
리눅스-2.6.32-573.1.1.el6.x86_64
나는 이 커널 소스 코드를 사용하여 내 커널용 커널 모듈을 컴파일하려고 합니다.
커널 소스 Makefile에서 EXTRAVERSION 설정을 편집했습니다.
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# cat Makefile | grep "EXTRAVERSION ="
EXTRAVERSION = 2.6.32-573.el6.x86_64
그리고 다음 명령을 사용하여 모듈을 컴파일합니다.
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# make M=~/hw/
LD /root/hw/built-in.o
CC [M] /root/hw/hello_world.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/hw/hello_world.mod.o
LD [M] /root/hw/hello_world.ko.unsigned
NO SIGN [M] /root/hw/hello_world.ko
하지만 설치하려고 하면 다음과 같은 오류가 발생합니다.
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# insmod ~/hw/hello_world.ko
insmod: error inserting '/root/hw/hello_world.ko': -1 Invalid module format
modinfo의 출력은 다음과 같습니다.
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# modinfo ~/hw/hello_world.ko
filename: /root/hw/hello_world.ko
license: GPL
srcversion: A8BB878B88F36D3A046026C
depends:
vermagic: 2.6.32-573.el6.x86_64 SMP mod_unload modversions
커널 소스를 설치하지 않고 현재 커널용 모듈을 컴파일할 수 있습니까?
추가 정보:
운영 체제: 최소 CentOS 6.7. 바이너리를 배포합니다.
이 가이드를 따르십시오:http://wiki.centos.org/HowTos/I_need_the_Kernel_Source
그리고 여기에서 linux-2.6.32-573.1.1.el6.x86_64의 소스 코드를 다운로드했습니다.
http://vault.centos.org/6.7/updates/Source/SPackages
특정 커널에 대한 소스 코드를 다운로드할 수 있다는 것을 알고 있지만 궁극적으로는 소스 코드(여전히 2.6.32)를 찾을 수 없는 커널 버전에 대한 모듈을 실제로 빌드하고 싶기 때문에 이 작업을 수행하고 싶습니다. 이것.
답변1
실제로 여기서 주의해야 할 두 가지 사항이 있습니다.
우리가 사용하고 있는 소스와 동일하게 실행되는 커널 버전입니다. 이전에 컴파일된 커널에는 최신 버전에서 사용할 수 있는 모든 종속성이 없을 수 있으므로 최신 커널 소스로 외부 모듈을 컴파일하는 것은 최신 버전에만 존재하는 코드 부분에 따라 달라질 수 있습니다. 따라서 외부 모듈을 사용하는 경우 최신 버전의 커널을 사용하는 것이 좋습니다.
2. 커널 컴파일에 사용되는 .config 파일은 파일 시스템의 /boot/config(현재 버전)*에서 커널 소스 코드의 최상위 디렉터리에 있는 .config로 복사할 수 있습니다. 현재 버전은 uname -r에서 얻을 수 있습니다.
따라서 실행 중인 버전(uname -r 명령으로 확인)이 다운로드한 소스 코드와 동일하지 않으면 새 커널을 컴파일하여 사용하거나 실행 중인 커널과 동일한 버전의 커널을 다운로드해야 합니다. 커널 컴파일의 경우 부팅 디렉터리에 있는 구성 파일을 사용하여 위와 같이 복사합니다.
그런 다음 일반적인 방법으로 외부 모듈을 계속 컴파일하고 문제 없이 실행 중인 커널을 로드할 수 있습니다.