본문 바로가기

programming/Linux

우분투 커널 5.0업그레이드 및 커널 수정 [How to upgrade linux Kernel 5.0~ on ubuntu 18.04 LTS with kernel compile]

전에 작성한 ukuu를 사용한 방법보다 추천하는 방법이다.

이유는 kernel source를 직접 다룰수 있고 커널에 필요한 모듈이 있으면 source해당 디렉토리에서 make하고 바로 insmod 할 수 있기 때문이다.

  • 커널 소스다운로드
  • 커널 컴파일
  • 커널 설치

1) 커널 소스 다운로드

http://kernel.org

[

The Linux Kernel Archives

www.kernel.org

](https://www.kernel.org/)

위 사이트에서 커널 소스를 다운로드 할수 있습니다.

저는 stable인 5.1.5를 다운로드 했습니다.

2) 커널 컴파일

커널 컴파일에 앞서 필요한 패키지를 설치해야 합니다.

$ sudo apt-get update

apt-get 업데이트

$ sudo apt-get install build-essential libncurses5 libncurses5-dev bin86 kernel-package libssl-dev bison flex libelf-dev

커널 컴파일에 필요한 패키지 설치

그후 다운로드한 커널을 /usr/src로 이동시킵니다.

$ sudo mv 다운로드한장소/커널소스압축파일명 /usr/src

$ cd /usr/src

$ sudo xz -d 커널소스압축파일명.tar.xz
$ sudo tar xf 커널소스압축파일명.tar

$ cd 커널소스디렉토리

그후 config파일을 복사해야 합니다.

config파일에는 커널의 설정등이 저장되어 있습니다.

수정해서 사용하셔도 되고 수정없이 사용해도 됩니다.

현재 커널의 버전을 확인하고 그버전의 config파일을 복사합니다.

명령어 중간에 tap을 두번 누르면 해당 이름들을 출력합니다.

복사후 menuconfig를 통해 빌드할 커널의 설정을 해줍니다.

$sudo make menuconfig

이경우 파란색 창이 뜨면서 메뉴를 선택할 수 있습니다.

저는 변경없이

LOAD ->[.config] OK

을 누르고 현재 커널의 설정을 불러왔고

SAVE ->[.config] OK

저장했습니다.

이제 커널 컴파일을 할 준비가 되었습니다.

$ grep -c processor /proc/cpuinfo

해당 명령어를 입력해서 cpu의 코어 개수를 출력합니다.

커널 컴파일은 시간이 오래걸리기 때문에 모든 코어를 다쓰는개 좋습니다.

(저는 한시간 수업 다녀오니 끝나있었습니다. 보통 30분정도 걸립니다.)

저는 코어의 개수가 6개여서 멀티 코어 옵션에 6을 주겠습니다. (# 대신 숫자 6)

$ sudo make-kpkg --J # --initrd --revision=1.0 kernel_image

3) 커널 설치

커널컴파일이 완료되면 이미지 파일이 생성됩니다.

.deb파일은 /usr/src에 생성됩니다.

$ sudo dpkg -i 이미지명.deb

해당 명령어를 통해서 설치후 재부팅 하면 커널버전이 달라진것을 확인할 수 있습니다.

 

 


 

업그레이드가 아니라 현재 커널을 수정하고 할때

 

이후에 또 커널 컴파일을 진행하게 되었다. 

 

그 이유는 ..

모듈 컴파일 진행할때 /kernel/sched/core.c안의 tg_get_cfs_quota함수를 사용하고 싶었다.

/kernel/sched/core.c 에서EXPORT_SYMBOL_GPL(tg_get_cfs_quota)

사용하는 모듈에서 extern tg_get_cfs_quota 하였으나

make이후 insmod할때 Unknown symbol tg_get_cfs_quota (err -2) 이라는 에러가 발생했다.

 

cat /proc/kallsyms | grep tg_get_cfs_quota

 

결과 위치는 알려져 있었다.

하지만 코드에서 EXPORT_SYMBOL을 하지않아 링킹이 되지 않아 심볼 주소를 해석할 수가 없었다.

즉 수정한 코드가 커널에 반영되어있지 않은것..
심볼 주소를 수동으로 바이너리(.ko)에 넣어줄 수는 있지만 커널컴파일이 더빠르고 안전하다고 판단했다.

 

방법은 위와 같으니 일부 생략하겠습니다.

 

1. 사용하는 폴더를 복사한뒤(버전관리가 잘되고 있다면 폴더를 복사 안해도 됩니다.)

2. 그 커널 코드(linux-5.1.5-kwlee)를 수정하고

3. make 

4. dpkg

 

make 결과 현재 커널버전이름옆에+가 붙여진 deb생성
커널수정결과

 

현재 커널을 수정하는것도 업데이트와 방법은 같다.

추 후에 같은 버전의 커널을 여러 번 빌드 하게 될 경우 '--revision=' 뒤에 숫자를 올리면 된다.

'--revision=1.0' '--revision=2.0' 이런식으로 숫자만 입력하면 된다.

이때 같은 숫자를 입력하면 +형태로 커널버전이 명시되는것 같다.