본문 바로가기
리눅스

데비안 리눅스에서 커널 컴파일과 커널 패키징.

by 다움위키 2024. 9. 22.

원문 보기: https://dawoum.duckdns.org/wiki/Linux_kernel/Kernel_Compile_on_Debian_Linux
 
리눅스에서, 커널 컴파일은 굳이 필요하지 않을 수도 있습니다. 보통 최신 커널은 각 배포판마다 존재하고 해당 바이너리를 설치함으로써 현재 설치된 커널보다 더 최근의 커널을 이용할 수 있습니다.
어쨌든, 무슨 이유에서든지 커널 컴파일이 필요할 수 있습니다. 예를 들어, 위의 바이너리 커널 설치가 되지 않거나, 현재 가진 컴퓨터의 부품이 제대로 작동하지 않거나, 성능 향상을 위해, 취미로, ....
먼저, 컴퓨터 부품, 하드웨어 문제는 Firmware/Linux kernel firmware를 먼저 고려해야 할 수도 있습니다.
한편, 커널과 관련된 여러 소스들이 있지만 크게 차이를 느끼지 못할 수 있고, 필요하다면 나중에 해당 소스에서 제공하는 패치를 적용함으로써 추가할 수 있으므로, 여기서는 그 과정은 제외합니다. 이와 관련하여 Debian on Ryzen CPU를 읽어 보십시오.
이 문서는 가능한 커널 컴파일 과정을 간략히 줄이면서, 데비안 패키징을 만드는 과정을 소개하려고 합니다. 앞서 소개한 Debian on Ryzen CPU 뼈대 부분에 대한 글입니다.

Installing dependency program

커널 컴파일에 필요한 여러 프로그램들이 있습니다. 데비안에서 다음 패키지가 필요할 것입니다:

  • sudo apt install git build-essential fakeroot libncurses5-dev libssl-dev ccache lz4
  • sudo apt install bison flex
  • sudo apt install amd64-microcode firmware-amd-graphics firmware-linux-nonfree firmware-misc-nonfree

마지막에 펌웨어 설치는 자신의 컴퓨터 부품에 따라 다르기 때문에, 부품에 필요한 펌웨어가 무엇인지 확인하시기 바랍니다. 예를 들어, 인텔 cpu는 intel-microcode, 인텔 그래픽 카드는 firmware-Intel-graphics를 설치해야 합니다. Nvidia 그래픽 카드는 여기서 소스를 받아서 드라이버를 설치할 것이므로 별도로 설치할 필요가 없지만, firmware-nvidia-graphics는 설치해 두시기 바랍니다. 보통 Nvidia, VMWare, VirtualBox와 같은 외부 드라이버는 마이너 버전 출시와 함께 오류가 발생할 가능성이 높으므로 여기서 정보를 확인하십시오.
이것들 외에도 별도로 필요한 프로그램이 있을 수 있고, 오류 메시지를 확인해서 설치하시기 바랍니다.

Get kernel source and debian packaging patch

리눅스에서는 여러 커널 소스가 있지만, 모두는 kernel.org에서 제공하는 소스에 패치를 추가한 것일 뿐입니다. 여기에서도 여러 버전이 존재하지만, 배포판에서 제공하는 커널을 사용하지 않으려면, mainline 소스를 이용하는 것이 바람직합니다.
2024년 9월 말 기준, mainline: 6.11이 가장 최신 버전이며, 옆에 있는 tarball 링크를 누르면 커널 소스가 다운로드됩니다.
이제, 데비안 패키징에 필요한, 요즘은 사용하지 않는 우분투 패치를 받습니다:

커널 소스와 3개의 패치 파일을 하나의 디렉토리에 두고 다음 과정을 진행합니다:

  • tar xvf linux-6.11.tar.xz
  • cd linux-6.11
  • patch -p1 < ../0001-base-packaging.patch
  • patch -p1 < ../0002-Debian-SAUCE-add-vmlinux.strip-to-BOOT_TARGETS1-on-p.patch
  • patch -p1 < ../0003-Debian-SAUCE-tools-hv-lsvmbus-add-manual-page.patch

Kernel options

커널 컴파일에서 가장 힘든 부분이 이것입니다. 자신이 필요한 것에 따라 달라지기 때문에, 리눅스에 대한 상당한 지식이 없을 때에는 배포판에서 제공하는 커널 설정을 가져올 수 있습니다.
그러나, 특정 배포판의 커널 설정을 사용하면, 일반적인 목적에 해당하는, 즉, 모든 사람들에게 공통으로 쓰일 수 있는 대부분을 모듈에 포함한 커널을 만들게 됩니다. 문제는 이런 설정은 커널 컴파일에 상당한 시간이 걸린다는 것입니다. 게다가, 이런 식이라면, 굳이 자신의 커널을 만들어서 사용할 이유가 없어 보입니다.
이를 개선하기 위해, 현재 시스템에서 사용되고 있는, 아마도 배포판에서 제공하는 커널에서 제공하는 모듈 중 현재 작동하는 모듈만 포함하도록 옵션을 설정할 수 있습니다;

  • make localmodconfig

문제는 현재 사용되고 있지 않고, 동적으로 로딩되는 모듈들은 이런 방식으로 옵션에 추가되지 않는다는 것입니다. 추가적인 일을 줄이기 위해, USB를 꼽아서, 블루투스를 활성화해서, 등을 한 후에 위의 명령을 실행하는 것이 좋습니다.
게다가, 모듈로 동작하지 않는 것들은 추가적으로 수동으로 설정을 해야 합니다. 예를 들어, CIFSD를 사용하기 위해 옵션을 추가할 필요가 있습니다.
이런 부분은 인터넷으로 검색해서 추가할 옵션을 찾을 수 있습니다. 검색의 경우에 'gentoo cifsd kernel option' 키워드로 검색하면, Gentoo Wiki의 Samba 페이지가 보일 것입니다. 그 내용을 확인해서 다음 명령을 사용해서 추가할 수 있습니다.

  • make menuconfig

더구나, 커널 옵션은 커널 버전에 따라 위치 등이 달라지기도 하기 때문에 주의가 필요합니다.
또한, 이 과정은 처음부터 완전히 수행되기 어려우므로, 처음 컴파일 후에 작동하지 않는 서비스나 디바이스 등이 있을 때, 추가적으로 커널 컴파일이 필요할 수 있습니다.

Kernel compile & installation

이제 준비 과정이 끝났습니다. 커널을 컴파일할 수 있습니다.
그 전에 자신의 CPU에 맞도록 커널 이미지를 만들 수 있습니다. 이 과정은 추가적으로 패치가 필요할 수도 있으며, 패치를 수행하지 않고 수행하려면, 다음과 같이 커널 컴파일 옵션을 추가함으로써 수행할 수 있습니다:

  • scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
  • scripts/config --disable DEBUG_INFO
  • NUM_THREADS=20
  • time make -j $NUM_THREADS KCFLAGS="-march=native -mtune=native" bindeb-pkg
  • cd ..
  • sudo dpkg -i linux-*.deb

위 과정에서 NUM_THREADS는 자신의 cpu 상황에 따라 달라지며, 다음 명령으로 개수를 확인한 후에, 그것보다 작거나 같게 선택할 수 있습니다. 크면 클수록 시간이 단축되지만, 다른 작업을 생각해서 적당히 선택하십시오.

  • cat /proc/cpuinfo | grep processor | wc -l

그 외 커널 컴파일 중에 여러 상황에 놓일 수 있으며, 다음 문서를 참조하십시오:

Kernel patch level upgrade

커널은 대체로 2개월마다 새로운 마이너 버전 (커널의 두 번째에 있는 숫자)이 출시됩니다. 게다가, 정기적이지 않고 필요에 따라 커널의 마지막 숫자 (세 번째 숫자, 6.11에서는 없음), 패치 레벨 업그레이드가 진행됩니다. 이때, 새롭게 전체 타르볼을 받지 않고, 패치를 받아서 진행할 수 있습니다.
예를 들어, 곧 6.11.1이 출시되면, kernel.org의 [patch] 부분에 링크가 새롭게 갱신되어, patch-6.11.1.xz로 바꿀 것입니다. 이것을 이전 커널 작업의 최상위 디렉토리, 이전에 커널 소스와 3개의 패치가 있는 디렉토리로 옮겨서 다음을 수행합니다:

  • xz -d patch-6.11.1.xz
  • cd linux-6.11
  • patch -p1 < ../patch-6.11.1

그런-다음 커널 컴파일을 수행할 수 있습니다.

Incremental patch

만약 6.11.2 버전의 커널이 출시될 때에는 mainline: 줄에 지금 활성화되어 있지 않는 [inc.patch]가 활성화 되어 patch-6.11.1-2.xz가 링크됩니다.
이제 이전과 마찬가지로 패치를 수행하고 커널 컴파일을 수행할 수 있습니다.
이것은 한번 푼 커널 소스는 다음 마이너 버전, 6.12가 출시되기 전까지는 지우지 말아야 한다는 것을 의미합니다.
더구나, 커널 옵션은 가장 최근 것이 linux-6.11/.config 파일로 기록됩니다. 따라서, 그 파일은 항상 백업을 해 두거나, 아니면 커널 소스 디렉토리를 보관하고 있어야 합니다.
보통은 새로운 마이너 버전 커널이 출시되면, 정상적으로 컴파일 설치 후에 아무런 이상이 없다고 판단되는 시기에 이전 마이너 버전 커널 소스를 지우는 전략을 세울 수 있습니다. 아니면 2개의 마이너 버전을 항상 보관한다는 전략도 좋겠습니다.

Troubleshootings

KCFLAGS

보통 같은 소스에 대해 커널 옵션을 변경해서 다시 컴파일할 경우도 생깁니다. 이때, 이전의 캐시된 내용을 사용해서 빠르게 컴파일이 완료됩니다. 예를 들어, 4분 정도에 커널 컴파일을 수행했다면, 캐시를 사용하면, 1분 내에 완료됩니다.
한편, KCFLAGS를 사용하면, 이전에 컴파일한 캐시를 전혀 사용하지 않는 것으로 보여서 시간적인 이득을 볼 수 없습니다.
따라서 가능하면, 필요한 것들은 커널에 패치를 수행해서 하는 것이 바람직해 보입니다.