프로젝트를 진행하다 리눅스 커널모듈을 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파일로 크로스컴파일을 할 것이다.
'프로그래밍 > Linux' 카테고리의 다른 글
리눅스 특정파일 특정열에 문자삽입 (0) | 2016.01.11 |
---|---|
우분투에서 안드로이드 미러링 사용하기(seven-square) (0) | 2015.12.10 |
Linux Personal repository 만들기 (0) | 2015.10.22 |
vmware ubuntu disk 확장(sda1) (7) | 2015.10.22 |
npm express, EJS 사용하기 (0) | 2015.09.09 |