Ubuntu Kernel Compile

os/LINUX 2017. 5. 11. 12:47

0. 절차

  가. 설치한 우분투 버전의 커널 버전과 동일한 커널 컴파일 및 설치


  나. 커널 버전 업 및 다운 그레이드를 위한 커널 컴파일 및 설치


1. 준비사항

  가. OS: Ubuntu 16.04.2 LTS 64bits


  나. Linux Kernel: 4.8.0


2. 커널 준비

  가. $ sudo apt update && sudo apt upgrade: 커널 컴파일에 필요한 툴을 설치하기 전 현재 패키지를 업데이트

    1) sudo: root 권한으로 명령어 수행

    2) apt: 우분투 패키지 매니저

      가) update: 패키지 업데이트

      나) upgrade: 패키지 업그레이드

    3) &&: 앞의 명령어가 정상 종료(성공)했다면 다음 명령어를 실행

    4) sudo apt upgrade로 커널 업그레이드됨(4.8.0-36 -> 4.8.0-51)

  나. $ sudo apt install build-essential kernel-package libncurses5-dev bison flex libssl-dev


3. 커널 컴파일(설치한 우분투 버전과 동일한 커널 버전)

  가. 커널 가져오기

    1) $ uname -r: 커널버전 확인

      가) uname: 시스템 정보 출력

        (1) -r: kernel release

      나) 4.8.0-51-generic: 커널 4.8.0

    2) https://www.kernel.org/pub/linux/kernel/ 에서 설치된 커널과 동일한 커널 가져오기

      가) https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.tar.xz 받기

      나) gz, bz2(V2.x이하 대), xz이 있으며 압축 형식만 다름

    3) 컴파일용 디렉토리 생성 및 커널 압축해제

      가) $ mkdir kernel: 사용자 홈디렉토리에 생성(ex) /home/user/kernel)

      나) kernel 디렉토리에 linux-4.8.tar.xz 이동(ex) ~$ mv Downloads/linux-4.8.tar.xz kernel/

      다) 압축해제

        (1) tar xvJf linux-4.8.tar.xz: xz파일 확장자를 가지는 압축 파일을 해제

          (가) tar: 파일을 묶거나 풀기(압축 및 해제 지원)

            (1) x: 풀기

            (2) v: 확인(묶거나 풀리는 파일을 표시)

            (3) J: xz 파일 포맷, bz2는 j, gz는 z

            (4) f: 파일지정

        (2) linux-4.8 커널 디렉토리가 생성됨

      라) linux-4.8 커널 디렉토리가 생성됨


  나. 커널 컴파일

    1) $ cd linux-4.8: linux-4.8 커널 디렉토리로 이동

      가) $ cd linux-4.8

    2) 커널 config 파일 가져오기

      가) $ cp /boot/config-4.8.0-51-generic .config: boot 디렉토리의 커널 컨피그 파일을 .config로 변경

        (1) .config가 실제 컨피그 설정파일이며 boot 디렉토리에는 현재 커널시 설정한 컨피그 파일이 저장되어 있으므로 그 파일을 활용

      나) $ make menuconfig: 콘솔에서 커널 설정

        (1) curses.h 에러가 나므로 해당 패키지 설치

          (가) $ sudo apt install -y libncurses5-dev

            a. install: 패키지 설치

            b. -y: 패키지와 관련한 의존성 패키지가 있을 시 물어보지 않고 설치

      다) 현재 설치된 커널과 동일한 설정을 가지는 커널 컴파일 상황이므로 빠져나가기(ESC)

    3) 커널 컴파일 및 설치

      가) $ fakeroot make-kpkg -j 2 --initrd --append-to-version=-user kernel-image kernel-headers: 커널 컴파일

        (1) fakeroot: 실제 root 권한없이 빌드시 필요한 root 권함을 줌

        (2) make-kpkg:

          (가) -j: 컴파일에 사용할 프로세서 수

          (나) --initrd: 램디스크 생성

          (다) --append-to-version: 컴파일된 커널의 버전 뒤에 붙는 이름

          (라) kernel-image: 커널 이미지 생성

          (마) kernel-headers: 커널 헤더 생성

            (a) 최근에는 kernel-headers 생성서 에러가 발생함

            (b) touch REPORTING-BUGS로 해결

        (3) make-kpkg 명령이 없어서 에러 발생하므로 해당 패키지 설치

          (가) $ sudo apt install -y kernel-package

        (4) 커널 컴파일중 opensslv.h 에러 발생

          (가) $ sudo apt install -y libssl-dev

      나) $ cd ..: 상위 디렉토리에 컴파일된 커널.deb가 생성

      다) $ sudo dpkg -i *.deb: 커널 이미지 및 헤더를 설치

        (1) dpkg: 데비안 패키지 매니저

          (가) -i: 설치

    4) 컴파일된 커널 확인

      가) uname -r을 하여 컴파일된 커널을 확인


4. 최신 커널 컴파일

  가. git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git: git으로 최신 커널 가져오기

    1) git 명령이 없어 에러가 나므로 git 설치

      가) sudo apt install git

    2) git으로 가져오는 것이 웹에서 가져오는 것보다 느림


  나. cd linux-stable: linux-stable 디렉토리로 이동


  다. cp ../linux-4.8/.config .: 상위 디렉토리의 하위 디렉토리 linux-4.8에서 커널 컨피그 파일을 최신 커널 디렉토리에 복사

    1) ..: 상위 디렉토리

    2) .: 현재 디렉토리


  라. make oldconfig: 이전 커널 버전의 설정 파일을 이용하여 최신 커널 버전의 설정 파일로 적용하고 추가된 기능을 사용 유무를 확인

    1) 모르는 기능에 대해서는 넘기기(엔터)를 함

  마. 이후의 사항에 대해서는 전과 동일함

AND