프로젝트를 진행하다 리눅스 커널모듈을 deb파일로 만들 일이 생겼다.

한참을 찾아보다 dkms(dynamic kernel module support) makedeb기능을 알게되었다.


참고: https://wiki.kubuntu.org/Kernel/Dev/DKMSPackaging


1. dkms 설치

$sudo apt-get install dkms


2. Prepare source

커널 모듈 소스를 준비해야하는데 적어도 C file과 Makefile이 포함되어야 한다.


C소스


Makefile소스


위의 두 파일은 /usr/src/<module>-<module-version>에 넣자.

본 예제에서는 /usr/src/hello-0.1 로 생성하였다.


*주의: make: Nothing to be done for `all'. 일경우에는 vi Makefile에서 all: 밑에 명시된 부분을 tab으로 했는

지 띄어쓰기로 했는지 확인할것. tab으로 해야함(clean도 마찬가지)




3. dkms.conf 파일 생성

dkms.conf파일을 생성할 것인데 이 역시 동일 폴더 즉 /usr/src/hello-0.1폴더 내에 생성


패키지 이름과 패키지 버전은 정보를 필요로 하는데 폴더네임의 정보와 동일하게 한다.

폴더이름이 hello-0.1이기 때문에 패키지네임은 hello, 버전은 0.1이 된다.


- clean은 폴더를 clean up하는 명령어로 빌드 전 실행시킨다. make clean을 하면 쏵 지워짐

- make[0]은 커널 객체를 빌드하기 위한 첫번째 커맨드

- dest-module-location은 설치될 때 커널 object를 놓기 위한 장소를 설정

예를들어, /lib/modules/$kernelver/updates 일 때 /updates/dkms에 overrade됨

이것은 결국 /lib/modules/$kernelver/updates/dkms에 놓이는 것을 의미함

비록 이러한 정보들은 overrade될지라도 이것은 여전히 필요한 필드이다.

- autoinstall에서 yes는 부팅될 때 커널 object가 설치되고 빌드를 시도하는 것을 의미하고 이것은 만약 커널에 설치가 되어있을때 리빌트나 리인스톨을 하지 않는다


위의 내용까지 한 결과는 위의 화면과 같다.

dkms를 하기까지 준비과정은 끝났다.


4. dkms add

$sudo dkms add -m hello -v 0.1



dkms add를 하게 되면 /var/lib/dkms/hello/0.1의 폴더가 생성된다.



아직 빌드를 하지 않았기 때문에 build폴더에서 ls를 할 경우 출력되지 않는다.


5. dmks build

$sudo dkms build -m hello -v 0.1 



위의 명령어를 입력하면 위의 화면처럼 completed 된것을 확인할 수 있고 build 폴더에서 ls를 할 경우 파일들이 생성


또한 0.1하위로 uname-r 의 폴더가 생성되고 밑에는 hello.ko 커널 모듈이 생성되는 것을 확인할 수 있음




6. dkms install

$sudo dkms install -m hello -v 0.1


또한 모듈 트리를 확인할 수 있다.


모듈 확인!



모듈을 삭제하고 싶으면

$sudo dkms remove -m hello -v 0.1 --all


다른 버전의 커널을 하고 싶으면!?

$sudo dkms build -m hello -v 0.1 -k 2.6.31-14-generic




7. dkms mkdeb

뭐 위에껀 중요하지 않고 이제 mkdeb을 통해 deb패키지를 만들어보자

$sudo dkms mkdeb -m hello -v 0.1


오류가 발생하였다. 이는 debhelper를 설치하지 않았기 때문이다.

$sudo apt-get install debhelper


debhelper를 설치한 후 다시 

$sudo dkms mkdeb -m hello -v 0.1    를 입력해보자.


mkdeb completed 된 것을 확인할 수 있다.


이 deb파일은 /var/lib/dkms/hello/0.1/deb에 위치한다.


deb파일 상세 확인

$lesspipe hello-dkms_0.1_all.deb



다음번에는 같은 방식으로 raspberry파일로 크로스컴파일을 할 것이다.

반응형

+ Recent posts