AMD의 새로운 프로세서가 가격대비 성능이 좋아지면서 각광을 받고 있습니다. 왜냐하면, 라이젠 cpu 전에는 인텔 cpu에서 절대적인 성능이 뒤떨어져서 선택 자체에서 걸려지는 경우가 대부분이었습니다. 이제는 인텔 cpu의 절반 가격의 cpu로 비슷한 성능을 내기 때문에 충분히 구매 욕구가 생깁니다.
한편 윈도우 OS에서는 점유율이 워낙 높다보니 출시와 동시에 즉각적인 지원이 이루어지고 있습니다. 그러나 상대적으로 리눅스는 새로운 cpu의 성능을 100% 내기 위해서는 커널 코드의 작성이 필요합니다.
이와 같은 상황에서 라이젠 시스템에서 데비안를 설치 운영하기 위해서 필요한 정보들을 모아 봅니다.
필요한 패키지 설치 아래 부분을 먼저 읽으시고, Quick version 아래 부분을 읽으십시오!!
Quick version
아래의 긴 버전이 귀찮은 분들은 축약된 버전을 이용하십시오:
- sudo apt install git build-essential fakeroot libncurses5-dev libssl-dev bison flex amd64-microcode lz4
- 여기 아래에서 적당한 두 파일을 받으십시오:
linux-source-5.18_5.18.2-generic.orig.tar.gz linux-source-5.18_5.18.2-generic-1.diff.gz
- tar xvf linux-source-5.18_5.18.2-generic.orig.tar.gz
- gunzip linux-source-5.18_5.18.2-generic-1.diff.gz
- cd linux-source-5.18.2-generic
- patch -p1 < ../linux-source-5.18_5.18.2-generic-1.diff
- vi localversion
- make menuconfig
- scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
- scripts/config --disable DEBUG_INFO
- 간혹 위의 명령으로도 디버그 정보를 포함하는 경우가 있습니다. 이때, Kernel hacking->Compile-time checks and compiler options에서 해당 설정을 N으로 바꾸어서 해결할 수 있습니다.
- make clean
- NUM_THREADS=16
- time make -j $NUM_THREADS CFLAGS="-march=native -Ofast" bindeb-pkg
- cd ..
- sudo dpkg -i linux-*.deb
- sudo vi /etc/default/grub
- reboot
참고:
- 현재는 5.18 버전에 대한 소스가 존재합니다.
- localversion은 커널 이름이므로 원하는 것으로 바꿀 수 있지만, 굳이 바꾸지 않으셔도 됩니다.
- menuconfig를 여러분의 시스템에 맞게 수정할 수 있으며, 아래의 내용을 참조하십시오. Processor family와 Tree-based hierarchical RCU leaf-level fanout value 정도를 바꿀 수 있습니다. 뒤의 값을 바꾸면, 그럽 옵션을 같이 수정할 수 있습니다.
- NUM_THREADS를 여러분의 시스템에 맞게 수정할 수 있으며, 아래의 내용을 참조하십시오.
exclude debian patches
데비안uxd 커널을 만들기 위해, 데비안 패치 중에서 다음을 제외할 필요가 있습니다.
- debian/gitignore.patch
- Changes to support package build system 전부
- debian/sched-autogroup-disabled.patch
- debian/add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by-default.patch
- bugfix/all/disable-some-marvell-phys.patch
- bugfix/all/fs-add-module_softdep-declarations-for-hard-coded-cr.patch
데비안 커널 컴파일
데비안 커널 패키지는 데비안에서 제공된 패치를 포함하고 있습니다. 데비안 식으로 커널을 만들 수 있을지 모르지만, 아마도 여러 아키텍처에 걸쳐 만들어져서 시간이 많이 걸릴 수 있습니다.
게다가, 커널 패키지가 만들어지는 스크립트는 데비안 패키징과 달라서 패치를 수행해야 하는 지점을 찾기가 쉽지 않습니다.
한편, 5.18 실험 버전에는 패키가 85개 있습니다. 이것을 하나씩 패치하는 것은 상당히 귀찮은 일입니다. 그래서, 생각나는데로 한 줄씩 읽어서 패치를 진행하도록 스크립트를 만들었습니다:
#!/bin/bash
while read LINE; do
patch -p1 < debian/patches/$LINE
done < debian/patches/series
- chmod +x debian_patch.sh
- 데비안 패치 디렉토리 debian/patches를 아래 패치가 진행된 디렉토리 kernel_source/debian/ 디렉토리 아래로 복사합니다.
- vi debian/patches/series (파일에서 공백 줄과 주석 줄을 모두 제거합니다)
:g/^$/d
:g/^#/d
- ./debian_patch.sh
- find . -name "*.rej"
마지막 명령 출력에서 아무런 메시지가 없으면, 이상없이 패치가 진행된 것입니다. 만약 rej 파일이 존재하면, 해당 파일이 어떤 패치에 포함되어 있는지 확인해서 해당 패치를 제거하고 처음부터 다시 시도할 수 있습니다.
필요한 패키지 설치
설치 프로그램 중에 커널 압축 프로그램이 커널 버전마다 기본값이 바뀌고 있어서, 오류가 발생할 수 있습니다. Debian_on_Ryzen_CPU/Troubleshootings#binary_subprocess를 확인하십시오. 먼저 다음의 패키지를 설치합니다.
- sudo apt install git build-essential fakeroot libncurses5-dev libssl-dev ccache lz4
이것 외에도 다음 패키지가 설치되지 않았다면, 설치하십시오:
- sudo apt install bison flex
마지막으로 일부 펌웨어, 예를 들어, microcode_amd를 설치해야 할 수도 있습니다:
- sudo apt install amd64-microcode firmware-amd-graphics firmware-linux-nonfree firmware-misc-nonfree
패치 진행
커널 소스는 커널 개발 사이트에서 우분투 패치는 우분투 메인라인 PPA에서 가져오고, 젠투 링크로부터 Ryzen CPU 패치는 받아 오는데, gcc 버전과 커널 버전에 맞게 받아야 합니다.
- mkdir kernel
- cd kernel
- wgit https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.17.5.tar.xz
새로운 커널에 대한 타르볼이 리누스 토발즈에 의해 제공되었음에도 불구하고, 홈페이지에서 정보가 갱신되지 않는 경우가 있습니다. 이런 경우에, 리누스 토발즈 커널 정보 링크에서 직접 소스 코드를 받을 수 있습니다.
- wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.6.17/0001-base-packaging.patch
- wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.6.17/0002-Debian-SAUCE-add-vmlinux.strip-to-BOOT_TARGETS1-on-p.patch
- wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.6.17/0003-Debian-SAUCE-tools-hv-lsvmbus-add-manual-page.patch
- wget https://raw.githubusercontent.com/graysky2/kernel_compiler_patch/master/more-uarches-for-kernel-5.8%2B.patch
받은 파일들을 패치합니다.
- xz -d linux-5.17.5.tar.xz
- Debian on Ryzen CPU/Verify Linux kernel tarball with pgp
- tar xvf linux-5.17.5.tar
- cd linux-5.17.5
- 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
- pathc -p1 < ../enable_additional_cpu_optimizations_for_gcc_v10.1+_kernel_v5.8+.patch
설치된 커널의 설정을 가져와서 적용합니다.
- cp /boot/config-5.10.0-13-amd64 .config
이제 커널 옵션을 일부 변경할 수 있습니다:
- make menuconfig
커널 옵션
젠투는 커널을 컴파일을 해서 사용하기 때문에 커널과 관련된 정보가 즉각적으로 제시가 됩니다. 젠투 위키의 Ryzen 정보를 확인해서 커널 컴파일을 시도해 볼 수 있겠습니다. 아래의 내용을 확인합니다.
Processor type and features --->
[*] Symmetric multi-processing support
[*] Support x2apic
[*] AMD ACPI2Platform devices support
Processor family --->
(X) AMD Zen (MZEN)
( ) AMD Zen 2 (MZEN2)
( ) AMD Zen 3 (MZEN3)
[*] Supported processor vendors --->
[*] Support AMD processors (NEW)
[*] SMT (Hyperthreading) scheduler support
[*] Multi-core scheduler support
[*] Machine Check / overheating reporting
[*] AMD MCE features
Performance monitoring --->
<*> AMD Processor Power Reporting Mechanism
[*] AMD microcode loading support
Power management and ACPI options --->
CPU Frequency scaling --->
Default CPUFreq governor (ondemand) --->
<*> ACPI Processor P-States driver
[ /*] Legacy cpb sysfs knob support for AMD CPUs
< > AMD Opteron/Athlon64 PowerNow!
<*> AMD frequency sensitivity feedback powersave bias
Device Drivers --->
Generic Driver Options --->
(amd-ucode/microcode_amd_fam17h.bin) External firmware blobs to build into the kernel binary
(/lib/firmware) Firware blobs root directory
[*] IOMMU Hardware Support --->
[*] AMD IOMMU support
<*> AMD IOMMU Version 2 driver
[*] Hardware Monitoring support --->
<*> AMD Family 10h+ temperature sensor
<*> AMD Family 15h processor power
[*] X86 Platform Specific Device Drivers --->
<*> AMD SoC PMC driver
데비안 커널 설정에 대부분 이미 설정이 되어 있습니다. 위에서 나온 내용중에 Processor family, Performance monitoring, Firmware loader만 새롭게 설정하세요. Firmware loader입력시에는 위의 것만 입력하면 아래의 것은 자동으로 입력됩니다.
RCU
1세대 cpu에서 소프트 프리즈가 발생할 경우에 RCU를 설정해 볼 수 있으며, 다음과 같이 추가하십시오:
General setup --->
[*] RCU Subsystem --->
[*] Make expert-level adjustments to RCU configuration
[*] Force selection of TASKS_RCU
[*] Force selection of Tasks Rude RCU
[*] Force selection of Tasks Trace RCU
(64) Tree-based hierarchical RCU fanout value
(16) Tree-based hierarchical RCU leaf-level fanout value
[*] Offload RCU callback processing from boot-selected CPUs
[*] Offload RCU callback processing from all CPUs by default
[ ] Tasks Trace RCU readers use memory barriers in user and idle
커널 5.x에서 커널 그럽 옵션에 매개변수를 추가해야 했지만, 6.0부터 커널 컴파일에서 옵션, 밑에서 2번째를 선택함으로써 그럽 옵션을 사용하지 않아도 됩니다.
모든 설정이 끝났으면 Save를 눌러서 .config에 설정을 저장해 둡니다.
버전 번호 수정
커널 버전은 출시와 함께 제공되는 타르볼 내부의 Makefile에서 기록되어 있습니다.
한편, 정식 출시 전의 rcX는 ''EXTRAVERSION'' 파일에서 추가적으로 커널 버전을 수정할 수 있지만, 사용하지 않는 것이 좋겠습니다.
어쨌든, 기본적으로 제공하는 버전, 6.0.3은 Makefile에 기록되어 있으므로, 추가적인 정보를 제공하기 위해 몇 가지 방법이 있습니다.
- 커널 옵션 General setup -> Local version에 기록할 수 있습니다.
- 이것은 .config 파일에서 CONFIG_LOCALVERSION="-generic"과 같이 기록되므로, 이 파일에서 직접 수정할 수도 있습니다.
- localversion이라는 파일에 -generic이라는 내용을 적어줄 수 있습니다.
컴파일 옵션에 LOCALVERSION=-generic와 같이 설정할 수 있습니다.
dbg 생성하지 않기
커널 컴파일 후에 패키지를 만들면서 디버깅 심볼을 가진 500M dbg 패키지를 묶는데 시간이 너무 걸립니다. 다음과 같이 제거해 줍니다.
- scripts/config --disable DEBUG_INFO
커널 컴파일
다음과 같이 커널을 만듭니다: 라이젠 7은 코어 개수가 8개(16개 쓰레드)입니다. 라이젠 5는 코어가 6개(12개 쓰레드)입니다. 자신에 맞게 수정해 줍니다. 만약 cpu 정보를 모르신다면, 다음과 같이 쓰레드의 개수를 알아낼 수 있습니다.
- cat /proc/cpuinfo | grep processor | wc -l
- sudo apt install libelf-dev
- make clean
- NUM_THREADS=24
그런 다음 아래와 같이 실행합니다:
- time make -j $NUM_THREADS deb-pkg
커널 설치
다음과 같이 커널을 설치합니다:
- cd ..
- sudo dpkg -i linux-*.deb
다시 컴파일
SSD는 쓰기를 가능한 적게 하는 것이 수명에 직접 관련되므로, 패키지를 만든 후에, 가능한 그 소스를 이용해서 다음 커널을 컴파일하기를 원할 것입니다. 다음 커널 버전이 출시되었을 때, 증분 패치를 통해서 이 작업을 수행할 필요가 있습니다.
이때, 이전 정보가 남아 있으면, 오류가 발생하면서 컴파일이 진행되지 않을 수 있습니다. 아래의 디렉토리를 삭제하고 컴파일을 진행해 보십시오.
- rm -rf debian/linux-image
- rm -rf debian/linux-headers
- rm -rf debian/linux-libc-dev
Reduce compile time
커널 컴파일 시간을 줄이기 위해, 시스템에 불필요한 모듈을 컴파일하지 않을 필요가 있습니다. 다음 명령은 현재 시스템에서 로딩되어 있는 모듈만 설정하도록 도와줍니다.
- make localmodconfig
이 결과는 .config 파일에 덮어쓰기 때문에, 현재의 .config 파일을 백업한 후에 진행하시기 바랍니다.
한편, USB 디바이스는 이르 수행하기 전에 모듈이 올라오도록 꽂아둘 필요가 있습니다.
게다가, 특정 디바이스가 동작하지 않을 수 있으며, 이 때에는 해당 모듈을 확인해서 menuconfig 명령으로 수정할 수 있습니다.