다른 커널용으로 컴파일된 커널 모듈 로드에 실패했습니다.

다른 커널용으로 컴파일된 커널 모듈 로드에 실패했습니다.

임베디드 Linux를 실행하는 임베디드 장치에 커널 ip_gre.ko모듈을 로드하여 gre.ko장치가 GRE 프로토콜을 지원하고 싶습니다. 임베디드 Linux 장치의 커널을 변경하고 싶지 않기 때문에 다음을 시도합니다.장치 커널을 다시 설치하는 대신 커널 모듈을 사용하세요.

운좋게도 장치에 대한 커널 소스 코드가 있어서 컴파일 ip_gre.ko하고 gre.ko모듈화할 수 있습니다. 그러나 insmod다음 메시지와 함께 장치에서 로드 모듈을 사용하면 실패합니다.

$ insmod gre.ko
insmod: can't insert 'gre.ko': Resource temporarily unavailable
$ insmod ip_gre.ko
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol
insmod: can't insert 'ip_gre.ko': unknown symbol in module, or unknown parameter
$ dmesg
GRE over IPv4 demultiplexor drvier
gre: can't add protocol
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol

내 장치에는 모듈을 로드할 수 있는 충분한 메모리가 있습니다( free190700/239760이 무료로 표시됨).

이런 일이 발생하는 이유와 가능한 해결 방법을 알려주실 수 있나요?

고쳐 쓰다:

이는 .config장치에서 실행 중인 커널과 위의 두 모듈용으로 컴파일된 커널 간의 차이점입니다.

$ diff config_for_running_kernel config_for_kernel_compiled_for_modules
299c299, 301
< # CONFIG_NET_IPGRE_DEMUX is not set
---
> CONFIG_NET_IPGRE_DEMUX=m
> CONFIG_NET_IPGRE=m
> CONFIG_NET_IPGRE_BROADCAST=y
963c965
< CONFIG_PPTP=y
---
> CONFIG_PPTP=m

CONFIG_PPTP종속성 으로 인해 CONFIG_NET_IPGRE_DEMUX오류 메시지 없이 커널을 모듈로 컴파일해야 합니다.

이러한 차이점으로 인해 위의 오류 메시지가 발생할 수 있습니까? 그렇다면 해결 방법을 알려주실 수 있나요...? (이러한 문제와 해결 방법을 알려줄 수 있는 다른 참고 자료가 있으면 매우 감사하겠습니다.)

답변1

커널 모듈을 분석하고 수정하여 이 문제를 해결했습니다. 커널 모듈 소스 코드를 분석한 결과 Gilles가 언급한 것처럼 커널 모듈을 로드하려면 호환 가능한 커널 옵션에 집중해야 한다는 것을 알 수 있습니다. gre기존 모듈이 프로토콜 ID 와 동일한 pptp프로토콜 ID를 사용했기 때문에 커널 모듈을 로드하면 문제가 발생했습니다 . 모듈이 활성화되지 않은 커널은 프로토콜 ID 로 사용됩니다 .IPGRE_PROTOgregreIPGRE_PROTOpptp

관련 정보