반응형

 

현재 가상머신에 올려진 우분투의 커널 버전은 위와 같이 5.15.0-48-generic 이다.

 

최근에 Rust 언어를 지원하는 커널 6.0이 나왔는데, 최신 버전의 커널을 빌드한 후 설치하여 우분투의 커널을 업그레이드 한다.

 

리눅스 커널 빌드 및 설치 과정은 크게 나누었을 때 아래와 같다.

1. 파일 다운로드 및 압축 해제

2. 기본 패키지 설치

3. 커널 구성

4. 커널 빌드

5. 커널 설치

 

또한 리눅스 커널은 커널이므로 리눅스 배포판(ex. Ubuntu)에서 최신 커널을 다운로드하고 구성하고 빌드하고 설치한다.

 

빌드 및 설치 과정에서 일어나는 에러들과 해결책들은 맨 아래에 모아서 적어두었다.

(블로그 내용대로 따라하면 에러 없이 진행 되겠지만, 에러가 발생한다면 맨 아래의 에러 내용들을 확인해본다.)

(물론 모든 에러에 대한 해결 방법이 있는 것이 아니므로 에러가 발생하면 에러 메세지를 구글에 검색해본다.)

 


1. 압축된 리눅스 커널 다운로드

 

리눅스 커널 공식 사이트 : https://www.kernel.org

 

 

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.0.tar.xz

 

우분투에서 위의 공식 홈페이지에 접속해 압축된 6.0 커널 파일을 사이트 내의 노란색 버튼을 눌러 다이렉트로 다운로드하거나 위의 명령어를 우분투 내의 터미널에 입력한다.

 


2. 압축된 커널 파일 압축 해제

 

tar xvf linux-6.0.tar.xz

 

다운로드 한 압축된 커널 파일을 위의 명령어를 통해 압축 해제한다.

 


3. 필요한 패키지들을 설치

- 아래의 패키지들을 설치한 후 추후에 진행하다가 명령어를 찾을 수 없는 에러가 난다면 그때그때 필요한 툴들을 설치하면 된다.

 

sudo apt-get -y install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

 

패키지 패키지 설명
git 개발 중인 소스 코드에서 모든 변경 사항을 추적하고 기록하며, 또한 변경 사항을 되돌릴 수 있다.
fakeroot 가짜 root 환경을 만드는 패키징 도구
build-essential C, C++, GCC 및 G++와 같은 개발 도구를 설치한다.
ncurses-dev 텍스트 기반 터미널(CUI)용 API를 제공하는 프로그래밍 라이브러리이다.
xz-utils 파일을 빠르게 압축 및 압축 해제할 수 있도록 제공해주는 패키지
libssl-dev 데이터를 암호화 하고 인터넷 연결을 보호하는 SSL과 TSL를 지원한다.
bc(Basic Calculator) 명령문의 대화형 실행을 지원하는 수학적 스크립팅 언어
flex(Fast Lexical Analyzer Generator) 문자를 토큰으로 변환하는 문자 분석기를 생성한다.
libelf-dev ELF 파일(실행 파일, 코어 덤프 및 객체 코드) 관리를 위한 공유 라이브러리를 발행한다.
bison 문법 설명을 C 프로그램으로 변환하는 GNU parser 생성기

 

sudo apt install dwarves zstd

 


4. 커널 구성(Configuration Kernel)

- 빌드하려는 커널의 세부 설정을 구성하는 과정이다.

 

cd

cp -v /boot/config-$(uname -r) ./.config

make menuconfig

 

압축을 해제하면 커널 소스들이 있는데 이미 이 소스 파일들을 빌드할 수 있는 Makefile은 작성되어 포함되어 있다.

 

 

위와 같이 이미 존재하는 우분투(현재 사용 중인 리눅스 배포판)의 Configuration 파일을 cp 명령어로 복사해두고, make menuconfig 명령어를 입력해 커널 구성 작업을 진행하는데

 

사실 make config 명령어를 치면 커널 구성 작업을 진행할 수 있지만, make menuconfig 명령어를 이용하면 모든 설정값을 메뉴 UI를 통해 선택할 수 있다.

 

 

이미 존재하는 우분투의 configuration 파일을 복사하여 해당 파일을 이용해 커널 구성 작업을 하는 이유는

시스템에 존재하는 펌웨어, 파일 시스템, 메모리 그리고 네트워크 등의 특성에 맞게 여러 가지 설정 옵션들을 선택해야 하는데 설정 값들의 양이 너무 방대하고, 자신의 시스템 환경에 대한 상당한 지식을 필요로 하므로 완벽하게 설정 값들을 설정할 수 없기 때문이다.

 

그렇기에 자신의 리눅스 배포판이 사용한 config 설정을 그대로 사용하는 것이 좋다.

 

 

설정된 설정 값들은 커널 소스 디렉토리에 .config 라는 이름의 파일로 저장되므로 이미 존재하는 설정 파일을 현재 디렉토리에 .config 파일로 복사한다.

 

 

 

make menuconfig 명령어를 입력하면 위와 같이 뜨는데 변경할 게 없으므로 화살표 오른쪽 키를 이용해 Exit를 선택 후 enter를 눌러 진행한다.

 

만약 값을 수정했다면 Save를 눌러 저장을 하고 Exit로 나와야 한다.

 


5. 커널 소스 빌드 전 작업

 

scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS

 


6. 커널 빌드

 

make -j 2

or

make -j `cat /proc/cpuinfo | grep cores | wc -l`

 

커널 빌드는 위와 같이 make 명령어를 입력하면 커널 소스 디렉토리 안에 Makefile이 이미 있으므로 바로 수행된다.

(시간이 꽤 걸린다.)

 

 

 

위의 make 명령어에 -j 옵션은 --jobs 옵션의 약어로 한번에 수행할 수 있는 명령을 지정하는 옵션이다.

 

CPU 코어가 2개인 상태에서 위와 같이 -j 2라고 지정하면 프로세스가 2개가 생성되어 병행으로 수행되고, 수행 과정은 top 명령어로 확인할 수 있다.

(명령수 = 프로세스수)

 

위와 같이 -j N 옵션을 지정하면 지정된 수 N만큼 프로세스들을 생성하고, 필요에 따라 N개의 thread를 생성하여 컴파일을 병렬로 수행한다.

 

가장 이상적이게 코어 수를 지정하려면 "총 코어 갯수의 20%의 코어 수"를 추가하는 것이다.

즉, -j <숫자>와 같이 지정할 때 숫자 부분에 들어갈 수는 "(총 CPU 갯수 + (총 CPU 갯수 * 20%))"이다.

예를 들어 CPU가 총 2개라면 2의 20%는 0.4이고, 반올림하면 0이므로, 2 + 0 하여 "-j 2" 옵션이 가장 이상적으로 속도가 나온다.

 

계산하기 복잡하다면 위의 두 번째 사진과 같이 입력하면 된다.

 

참고)

리눅스에서 자신의 CPU 정보들을 확인하려면 아래와 같다.

# CPU 정보들 확인
cat /proc/cpuinfo

# CPU 전체 코어 개수
grep -c processor /proc/cpuinfo

# 물리적 CPU 개수
grep "physical id" /proc/cpuinfo | sort -u

# CPU 물리적 코어 개수
grep "cpu cores" /proc/cpuinfo | tail -l

 


7. 커널 설치

- 커널이 정상적으로 빌드되면 여러가지 모듈들이 생성되는데, 이 모듈 요소들을 알려주고, 부팅 시 커널이 자동으로 적재될 수 있도록 설정하는 과정

 

make modules

 

위의 명령어를 입력해 커널 모듈들의 요소를 알려준다.

 

이 작업은 꽤 많은 시간이 걸린다.

 

 

sudo make modules_install

 

위의 명령어를 입력해 디바이스 드라이버들을 설치해준다.

 

 

sudo make install

 

최종적으로 리눅스 커널을 설치하여 부팅 시 커널이 자동으로 적재될 수 있도록 부트 스트랩 루틴에게 새로운 커널의 위치를 알린다.

 

 


8. 재부팅

 

reboot

 

커널을 적용하기 위해 재부팅한다.

 


9. 커널 확인

 

 

리눅스 커널 6.0이 잘 설치되었다.


Error 1. 빌드 도중 "debian/canonical-certs.pem 타겟을 만들 규칙이 없습니다." 에러 발생

위와 같이 "debian/canonical-certs.pem 타겟을 만들 규칙이 없습니다." 에러가 뜬다면, 아래의 두 명령어 중 하나를 입력한다.

(에러가 안 뜬다면 Error1 부분은 건너뛰어도 된다.)

 

sciprts/config --disable SYSTEM_TRUSTED_KEYS

or

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

위와 같이 입력한 후 

 

다시 빌드를 진행하면 위와 같이 뜨는데 그냥 Enter를 눌러 진행한다.

 

 

 

Error 2. 빌드 도중 zstd not found 에러

sudo apt install zstd

 

zstd 패키지를 설치해준다.

 

 

 

Error 3. make modules 명령어 실행 도중 "debian/canonical-revoked-certs.pem 타겟을 만들 규칙이 없습니다." 에러 발생

위와 같이 debian/canonical-revoked-certs.pem 에러가 뜬다면 아래의 명령어를 입력한다.

(에러가 안 뜬다면 Error2 부분은 건너뛰어도 된다.)

scripts/config --disable SYSTEM_REVOCATION_KEYS

 

위의 명령어를 입력 후 다시 "make modules" 명령어를 입력한다.

 

 

그럼 이런 식의 문구가 뜨고 사용자로부터 입력값을 기다리는데 그냥 Enter를 눌러 진행한다.

 

 

 

Error 4. make modules 명령어 실행 도중"pahole(pahole) is not available" 에러 발생

 

위와 같이 pahole(pahole) is not available 에러가 뜬다면

 

sudo apt install dwarves

 

위와 같이 패키지를 설치해준 뒤 다시 "make modules" 명령어를 입력해 진행한다.

 

반응형

+ Recent posts