리눅스 커널 컴파일을 하자!!
우선 나는 우분투를 사용함을 밝힌다.
<커널컴파일은 직접 커널을 받아와야 잘됨>
커널 컴파일과 관련된 자료는 https://kernelnewbies.org/KernelBuild 을 참고하면 아주 좋다!
<커널컴파일은 직접 커널을 받아와야 잘됨>
지금 하려는 커널 컴파일의 방향성은, 현재 내 리눅스 커널 내에서 디바이스 드라이버나 모듈을 수정하였을 경우 어떻게 이를 컴파일해서 적용할지에 방향성을 맞춘다.
우선 내 리눅스 버전을 확인해야 한다.
#uname -r
하면 출력이 나의 경우
4.10.16
으로 나온다. 이걸 토대로 다음 경로에 들어간다.
#cd /usr/src/linux-4.10.16/
여기엔 내 현재 쓰는 리눅스에 대한 커널 코드가 들어있다. 그림을 보면 driver정보가 들어있는 drivers폴더도 있는데, 난 여기에 있는 ata 코드에 printk를 찍었기 떄문에 예시겸 이대로 가보자.
cd drivers/ata
vi libata-core.c
꼭 여기 코드를 예시로 할 이유는 없다. 다만 여기 코드의 ata_to_fis 함수에 printk("ata_tf_to_fis!\n"); 를 찍어보고 나는 커널컴파일을 시도하기로 하였다. 이걸 고치고 wq! 로 저장하고 원래 경로로 들어간다.
#cd /usr/src/linux-4.10.16/
여기서 make를 사용하면 비로소 커널 컴파일이 이루어진다. 다만, 이 전에 커널컴파일의 범위 를 설정하려면 다음을 입력한다.
#make nconfig
로컬 컴퓨터에 맞춘 짱 좋은 config생성하려면, -> 기억해두자. 많은 에러를 줄일 수 있다.
#make localmodconfig
로컬 컴퓨터에 맞춘 짱 좋은 config생성하려면, -> 기억해두자. 많은 에러를 줄일 수 있다.
#make localmodconfig
여기선 내가 컴파일하고 싶은 모듈들을 일일히 설정할 수 있다. 하지만 지금은 건드릴 필요가 없다. 여기를 나오고 make 고고싱하자!
#make
여기서 코어수가 4개라면 다음과 같은 방법으로 병렬적으로 빠른 make가 가능하다.
#make -j4
2개면 당연히 make -j2 이런식으로 입력하면된다. 허면 컴파일을 코어들이 나누어서 빠르게 수행하게 된다.
여기서 커널컴파일한데 좀 걸린다. 이 타이밍에서 커피한잔의 여유를 아는 품격있는 인간이되자.
마지막에 arch/x86/boot/bzaImage is ready가 뜨면 제대로 된녀석이다. 하지만 이 커널을 /boot/에 설치되어야 실제 적용이 되는 것이다. 그러기 위해 다음과 같은 명령어를 치자.
#make modules_install install
참, 여기까지 에러가 생겼다면 sudo권한을 주었는지 한번 살펴봐라. 리눅스는 아무한테나 컴파일을 허용하지 않을거다.
이 명령어를 치면
1. 새로 컴파일한 커널을 부트이미지에 설치
2. /lib/modules/4.10.16 에 모듈(.ko파일) 설치를 수행하게 된다. (4.10.16은 내 리눅스버전임)
그리고 실제 컴퓨터를 재부팅한다. 하면 새로 컴파일된 커널로 실행된다 ㅎㅎ
printk를 출력해보기위에선 터미널을 키고
#cat /proc/sys/kernel/printk
를 먼저 쳐볼 필요가 있다.
나의 경우에는
#4 4 1 7
로 출력이 되는데, 이 숫자는 (현재, 기본, 최소, 부팅시 ) 로그레벨을 의미한다. 현재 로그레벨이 기본 로그레벨보다 높아야 출력이 되므로 다음과 같이 친다.
#echo "7 6 1 7">/proc/sys/kernel/printk
이러고
#cat /proc/sys/kernel/printk
그 외에도 커널 출력 코드 :
#cat /proc/kmsg
#dmesg
#vi /var/log/syslog : 전부 출력
#tail -f /var/log/syslog : 현재 출력중인 상황을 볼 수 있다.
그 외에도 커널 출력 코드 :
#cat /proc/kmsg
#dmesg
#vi /var/log/syslog : 전부 출력
#tail -f /var/log/syslog : 현재 출력중인 상황을 볼 수 있다.
을 쳐보면
7 6 1 7
로 바뀐다. 지금부터는 terminal에 printk가 출력될 수 있는 것이다. 내가 방금 printk한 녀석을 실시간으로 뽑아 내려면
#cat /proc/kmsg
를 입력하면 된다. 그러면 놀랍게도 pritnk가 출력되는 것을 볼 수 있다 !!
//패스 다음에 더 해보고 업뎃!
그렇다면 좀더 빠르게, 모듈만 컴파일 할 순 없을까??
이렇게 해보자
#cd /usr/src/linux-4.10.16/
에서 다른 방식으로 컴파일 하는 것이다.
예를 들어 내가 ./drivers/ata/libata-core.c를 건드렸으므로 해당 모듈만을 컴파일하려면 다음과 같이 입력한다.
make drivers/ata/libata-core.ko
하면 이녀석 기준으로만 재 컴파일이 된다. 인데 .. 이녀석이 지금 안되므로 패스
커널 디버깅 모드!
이클립스로 앱실행시 커널까지 디버깅시키고 싶다는거임.
http://deathbytape.com/articles/2015/02/17/build-debug-linux-kernel.html
/usr/src/linux~~에서
vi .config한다.
글고 사이트에 적힌대로 수정해봐
//패스 다음에 더 해보고 업뎃!
그렇다면 좀더 빠르게, 모듈만 컴파일 할 순 없을까??
이렇게 해보자
#cd /usr/src/linux-4.10.16/
에서 다른 방식으로 컴파일 하는 것이다.
예를 들어 내가 ./drivers/ata/libata-core.c를 건드렸으므로 해당 모듈만을 컴파일하려면 다음과 같이 입력한다.
make drivers/ata/libata-core.ko
하면 이녀석 기준으로만 재 컴파일이 된다. 인데 .. 이녀석이 지금 안되므로 패스
커널 디버깅 모드!
이클립스로 앱실행시 커널까지 디버깅시키고 싶다는거임.
http://deathbytape.com/articles/2015/02/17/build-debug-linux-kernel.html
/usr/src/linux~~에서
vi .config한다.
글고 사이트에 적힌대로 수정해봐
댓글
댓글 쓰기