Cgroup 코드를 수정 후 적용하기 위해서는 소스파일을 컴파일 후 make해서 리눅스 커널을 바뀐 코드로 교체해줘야 한다.
모든 작업은 root 계정에서 진행하였다.
우선 linux source들을 모아놓은 사이트에 가서 wget으로 코드를 다운받는다.
$wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.gz
이후 해당 파일을 /usr/src로 이동 후 압축 해제해 준다.
$mv linux-5.10.tar.gz /usr/src
$cd /usr/src
$tar xvf linux-5.10.tar.gz
압축 해제한 폴더로 이동하여 configuration 파일을 만들어야 하는데, 이는 현재 사용하는 커널의 것을 그대로 복사해서 만들었다.
$sudo cp /boot/config-{Current Kernel Version} ./.config
이제 컴파일을 해 줄 건데, 필요한 패키지를 설치한다. 내가 설치한 패키지 목록은 아래와 같다.
- build-essential: 컴파일에 필요한 필수 패키지들. GNU debugger, g++/GNU compiler등을 포함.
- libncurses5: Terminal Handling을 위한 Library
- libncurses5-dev: ncurses의 developer library
- bison: Context-free grammer를 LR / GLR로 변환해주는 패키지
- flex: Lexical pattern을 text로 인식하게 해 주는 패키지
- libssl-dev: Internet상의 통신을 보호하기 위한 패키지
- libelf-dev: High Level에서 ELF file을 읽고 쓸 수 있도록 해 주는 패키지
- bin86: 32bit 코드를 만들 수 있게 해 줌
- kernel-package: Linux kernel을 빌드하기 위해 필요한 utility들
- dwarves: pahole에 의존하는 더미 패키지
*pahole: shows and manipulates data structure layout
이제 컴파일을 진행해야 한다. 커널 컴파일은 시간이 오래 걸리기 때문에 컴퓨터의 CPU 코어 개수를 확인하여 전부 활용할 수 있도록 한다.
$nproc
얻어낸 CPU 코어 개수를 아래 명령어의 {coreNumber}부분에 넣어준다.
$sudo make-kpkg -j{coreNumber} --initrd --revision=1.0 kernel_image
컴파일에 시간이 굉장히 오래 걸리는데다 에러도 엄청 많이 난다. 한 3~4번 다시 한 것 같은데, 내가 찾은 에러 해결법을 몇 가지 적어보겠다.
make[2]: *** [debian/rules:6: build] Errore 2
dpkg-buildpackage: Errore: debian/rules build subprocess returned exit status 2
make[1]: *** [scripts/Makefile.package:77: deb-pkg] Errore 2
make: *** [Makefile:1464: deb-pkg] Errore 2
이 에러는 .config 파일의 CONFIG_SYSTEM_TRUSTED_KEYS 부분의 값을 ""로 넣어줘야 해결된다고 한다.
해결할 수 있는 명령어는 다음과 같다.
$scripts/config --disable SYSTEM_TRUSTED_KEYS
이 과정을 수행하니
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1106: vmlinux] Error 1
이런 에러가 나왔다. 위에서 말한 패키지인 dwarves를 설치해서 해결하였다.
$sudo apt install dwarves
컴파일이 완료되면 Linux 폴더의 상위 폴더(/usr/src)에 linux-image-{version}_amd64.deb라는 커널 이미지 파일이 생성된다. 이제 커널 이미지를 등록해주기만 하면 끝이다.
$cd ../
$sudo dpkg -i {KernelImageFile}
이후 시스템 리부트를 해 주면 커널이 성공적으로 업데이트되었음을 알 수 있다.
$sudo systemctl reboot
참고로 커널 버전 확인은
$uname -r
로 할 수 있다. 나는 기존의 커널 버전과 다른 코드를 가져와서 사용했기에 버전이 바뀐 것으로 커널이 잘 적용되었음을 확인하였다.
Reference:
https://ndb796.tistory.com/534
https://junshim.github.io/linux%20kernel%20study/Linux_Kernel_Compile/
https://stackoverflow.com/questions/61657707/btf-tmp-vmlinux-btf-pahole-pahole-is-not-available
http://emal.iptime.org/noriwiki/index.php/Linux_%EB%B9%8C%EB%93%9C
'ZNS Isolation with Linux Container' 카테고리의 다른 글
| Uftrace 사용법 (0) | 2022.07.10 |
|---|---|
| ZNS SSD에 관한 공부와 Zonefs 파일시스템 마운트 방법 (0) | 2022.07.10 |
| VNC Server 설정하기 (0) | 2022.06.23 |
| Linux Shell Commands (0) | 2022.06.23 |
| The Block I/O Layer (0) | 2022.05.24 |