티스토리 뷰
리눅스 서버를 이용해서 모듈을 수정하거나 라이브러리를 원하는 대로 수정해야하는 경우 커널 코드를 수정해야합니다.
커널 코드를 한번 다운받고 원하는 버젼의 커널을 설치한 이후에는, 수정한 코드 컴파일만 다시 해주면 쉽게 적용할 수 있기 때문에 익혀놓으면 커널을 다루기 굉장히 편리합니다 !
커널 다운로드
원하는 커널 버젼을 선택하여 다운받을 수 있습니다. 저는 5.10 버젼의 커널 코드가 필요하여 5.10으로 다운받아서 사용했습니다.
만약 5.6버젼이 필요한 경우에는 git clone -b v5.6 .... 명령어를 이용하면 됩니다. 정상적으로 커널 소스가 다운로드 되면 현재 디렉토리에 linux 디렉토리가 생성됩니다.
git clone -b v5.10 --single-branch --depth 1 https://github.com/torvalds/linux.git
Ubuntu에서 커스텀 커널 설치
커스텀 커널을 설치하기 전 필요한 라이브러리를 설치합니다.
sudo apt update
sudo apt upgrade
sudo apt install libncurses5-dev flex bison libssl-dev wget
이후 소스코드가 있는 linux 디렉토리로 이동합니다. 그리고 현재 리눅스 커널 설정파일을 가져옵니다.
uname -r 명령어는 현재 커널의 버젼을 확인하는 명령어입니다.
cp /boot/config-$(uname -r) .config
config 설정파일을 정상적으로 가져온 후 vi Makefile을 입력하면 위 사진과 같은 화면이 나옵니다. EXTRAVERSION 항목이 최초에는 비어있는 상태입니다. EXTRAVERSION = -DongUk 처럼 설정해주면 자신이 만든 커널임을 표시할 수 있습니다. 5.10.0-DongUk과 같이 표기됩니다. 해당 항목을 표기하지 않으면 정확히 어떤 버젼이 커스텀 버젼인지 파악하기 힘들 수 있습니다.
커스텀 커널 컴파일
현재 리눅스 서버의 CPU 코어 개수를 확인하는 명령어입니다. 컴파일 하는 과정이 시간이 오래 걸리기 때문에 사용할 수 있는 코어를 최대한 활용하는 것이 좋습니다. 저의 경우에는 32코어임을 확인할 수 있습니다.
grep -c processor /proc/cpuinfo
이제 커스텀 커널을 컴파일하기 위한 준비가 끝났습니다. 위에서 파악한 코어개수를 이용해 -j32 옵션을 붙여줍니다.
마지막에 sudo update-grub을 하지 않으면 커널이 등록되지 않습니다.
sudo oldconfig
sudo make -j32
sudo make modules_install -j32
sudo make install -j32
sudo update-grub
커스텀 커널을 기본 커널로 설정
위 과정을 모두 마치고 난 이후, 부팅 시 기본 커널을 커스텀 커널로 설정해줘야 합니다. Femu 환경에서는 부팅 시 원하는 커널 버젼을 선택해 들어오기 때문에 따로 설정할 필요가 없지만, Qemu 환경에서는 반드시 설정해야합니다.
아래 명령어를 입력하면 menuentry 값을 확인할 수 있습니다.
grep -A100 submenu /boot/grub/grub.cfg | grep menuentry
여기서 Advanced options의 $menuentry_id_option 값과 커스텀 커널의 $menuentry_id_option을 확인합니다. 그리고 나서 두 $menuentry_id_option 값을 '>' 을 이용해 병합합니다. 위 사진에서는 아래와 같습니다.
gnulinux-advanced-796005ea-7157-4f1e-9dc4-db0b51c89950>gnulinux-5.10.0-kiJung+.old-advanced-796005ea-7157-4f1e-9dc4-db0b51c89950
이 값을 복사한 후 vi /etc/default/grub을 실행해 GRUB_DEFAULT 값에 넣어주면 기본 커널로 설정이 완료됩니다.
sudo update-grub, sudo reboot를 수행한 후 uname -r을 입력하면 커스텀 커널로 부팅된 것을 확인할 수 있습니다.
재컴파일
원하는 소스 코드를 수정하고 적용하기 위해서는 컴파일이 필수입니다. 그렇다면 위 과정을 계속해서 반복해야 할까요? 아닙니다. 최초 컴파일을 한 이후에는 sudo make, sudo make modules_install, sudo make install 과정과 reboot만 실행하면 재컴파일을 할 수 있습니다.
소스 코드를 수정하고 컴파일 하는 과정에서 확인할 수 있는 오류는 sudo make 과정에서 확인할 수 있습니다. 저는 따로 쉘 파일을 만들어 재컴파일 과정을 좀 더 편리하게 진행하고 있습니다. compile.sh 라는 파일을 만들고 해당 파일의 권한 설정을 sudo chmod 644 compile.sh로 변경합니다. compile.sh 파일 내부는 아래와 같습니다.
#!/bin/bash
sudo make -j32
sudo make modules_install -j32
sudo make install -j32
'Linux' 카테고리의 다른 글
[Linux] Device Mapper (dm-zoned) (0) | 2022.10.28 |
---|---|
[Linux] 커널 디버깅 하는 방법 / printk, ftrace(trace_printk) (4) | 2022.10.13 |
[Linux] cscope 설치 및 사용법 (0) | 2022.06.15 |
[Linux] 우분투 서버에서 리눅스 컨테이너(LXC) 생성하기 (0) | 2022.04.30 |
[Linux] ZNS(Zone NamedSpace)의 개념과 ZNS SSD (0) | 2022.04.30 |
- Total
- Today
- Yesterday
- 프로젝트
- Spring
- 파이썬
- 2차 데모데이
- 알림기능개선기
- 3차 데모데이
- CI/CD
- 환경 별 로깅 전략 분리
- 회고
- 스프링MVC
- 스프링 프레임워크
- jpa
- 네트워크
- 팀프로젝트
- 우테코
- dm-zoned
- 스프링 Logback
- ZNS
- 8주차 회고
- 5주차 회고
- 피움
- 우테코 회고
- 피움 6주차 회고
- java
- dm-zoned 코드분석
- 스프링 부트
- 런칭 페스티벌
- 알림개선기
- 백준
- ZNS SSD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |