커널 모듈을 하나만 만드는 방법은 무엇입니까?


34

Linux 커널 모듈에 주식 우분투 14.04 커널이 우연히 발생하는 버그가 있습니다 (충돌).

그래서 추가 커널 출력을 추가하기 위해 단일 커널 모듈 의 소스 만 편집 / 패치 하려고합니다 . 문제의 커널 모듈은 부팅 할 필요가 없습니다. 따라서 initrd 이미지를 업데이트 할 필요가 없습니다.mvsas

많은 정보를 읽었으며 (아래 그림 참조) 설정 및 빌드 프로세스 혼란을 찾으십시오. 두 가지 레시피가 필요합니다.

  1. 빌드 환경을 한 번 설정 / 구성
  2. 이 커널 모듈 ( .c.h) 의 소스 파일 을 편집하고 해당 편집을 새 커널 모듈 ( .ko) 로 변환 한 후 수행 할 단계

사용 된 소스는 다음과 같습니다.



아마이 기사도 도움이 될 것입니다 : stackoverflow.com/questions/8744087/…
Oleg Kokorin

답변:


32

커스텀 모듈을 만들기위한 레시피는 세 부분으로 나뉘어 야합니다.

한 번 설정

$ cd ~
$ apt-get source linux-source-3.13.0 

mvsas 특정 드라이버 소스 파일을 복사하기에는 너무 게으르다. 모두 현재 작업 디렉토리로 복사하십시오. 경우 apt-get에 대한 오류 메시지가 결과 없는 소스 URI는 다음 하단에 노트 # 4를 참조하십시오.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

커널 모듈을 만드는 데 필요한 일부 파일이 준비됩니다.

각 커널 버전

$ apt-get install linux-headers-$(uname -r)

그러면 / lib / modules에 해당 커널 버전에 대한 헤더 및 Ubuntu 커널 구성 파일이 설치됩니다.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

이는 insmod 또는 modprobe를 사용하여 모듈을로드 할 때 " no symbol version for module_layout " 메시지를 방지합니다 .

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

이렇게하면 원래 (Ubuntu 빌드) 커널 모듈의 이름이 바뀌어 사용자 지정 패치 된 커널 모듈이로드됩니다.

각 편집

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

편집 용입니다.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

이것은에 .ko저장된 Stock Ubuntu 배포판의 커널 구성을 사용하여 커널 모듈 파일을 컴파일하고 빌드합니다 /lib/modules/$(uname -r)/.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

/lib/modules/$(uname -r)/extra/배포 커널 모듈 파일의 이름을 바꾸지 않은 경우 배포 모듈을 덮어 쓰지 않고에 커널 모듈을 설치 합니다. 이 mvsas 경우에는 depmod 도 실행 됩니다.

$ lsmod | grep mvsas

이로 인해 출력이 발생하면 mvsas 모듈을 modprobe -r mvsas먼저 ( )로 언로드해야합니다 .

$ sudo modprobe -v mvsas

새 커널 모듈을로드해야합니다.

출력 /lib/modules/.../extra/mvsas.ko이로드되고 있는지 확인하십시오 .

Modprobe 오류 : 삽입 할 수 없습니다

경우 modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)에 따라 verbose modprobe 출력에서 ​​잠시 동안 insmod커널 기본 위치에서 모듈을로드하려고 한다는 것을 알 수 있습니다. 예를 들면 다음과 같습니다.

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

이 경우 depmod 를 수동으로 실행 하고 모듈을 다시로드해야합니다.

# depmod
# sudo modprobe -v mvsas

노트

  1. 결과 .ko모듈 파일이 Ubuntu에서 배포 한 원래 모듈 파일보다 크기가 큰 (예 : 20 배) 큰 경우가 있습니다. 이 경우 make prepare단계는 커널 구성 파일을 디버깅하는 Linux 개발자를 작성했으며 소스 디렉토리에서 빌드 중입니다. 귀하의 -CPARAM은 예상대로 작동하지 않을 수 있습니다.
  2. 내가 좋아하는 다른 명령과 가이드 본 make modules_prepare과를 make M=scripts/mod하지만 난이이 경우에 필요한 생각하지 않습니다.
  3. Linux 개발자 디버그 구성을 다음으로 대체 -C /lib/modules/$(uname -r)/build하여 사용할 수 있습니다.-C /usr/src/linux-headers-$(uname -r)
  4. 기본 설정에서는 apt-get source linux-sourceserror를 반환합니다 E: You must put some 'source' URIs in your sources.list. 이 문제를 해결하려면 첫 줄 /etc/apt/sources.list의 주석 처리를 제거하여 (앞에서 제거) 파일 을 수정할 수 있습니다 . Ubuntu 17.10의 예 : . run을 실행 하면 명령이 소스를 제공합니다. 작업을 수행하는 GUI 방법도 설명되어있는 이 질문을 참조하십시오 .#deb-srcdeb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restrictedsudo apt-get update

오류가 발생했습니다 : / bin / sh : arm-none-linux -gnueabi-gcc : 찾을 수 없음
Dr.jacky

$(uname-r)분명히 잘못되었습니다 ... shell내장 전화를해야합니다 :$(shell uname -r)
Albus Dumbledore

2
@AlbusDumbledore 또한 작동하지 않는 경우 $(shell uname -r)가 있습니다 . 왜 $(uname -r)그렇게 잘못 되었습니까?
Pro Backup

에서 새로 업데이트 된 파일 echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confdepmod볼 수 있도록 전화 해야 했습니다 .../extra.
Martin Pecka

1
모듈 서명 오류로 어떻게해야합니까? ```INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko at main.c : 158 :-SSL 오류 : 02001002 : 시스템 라이브러리 : fopen : 파일 또는 디렉토리가 없습니다 : bss_file.c : 175-SSL 오류 : 2006D080 : BIO 루틴 : BIO_new_file : 파일 없음 : bss_file.c : 178 sign-file : certs / signing_key.pem : 해당 파일이나 디렉토리가 없습니다```
Envek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.