Ubuntu 16.04 - Compile Custom Kernel For Ryzen Feat. Centos
** 라이젠 1700 리눅스 관련 상품 오픈으로 인해 테스트 진행 도중 서버가 다운 되는 현상이 발생 되었습니다. 리눅스는 fedora 25, ubuntu 16.04, centos 7 , centos 6 테스트 진행하였고, 전부 같은 현상이 발생 하였습니다.(일부는 cpu가 반도막 나고, 커널이 깨지는 현상이 발생.) 해당 문제점을 해결하기 위해 구글링하여 해결 법을 찾았으나.. 이게 완벽한 해결책이 될지는 모르겠지만 .. 테스트는 계속 되어야 할 것 같습니다.
** 안전성 확인사항으로 해당 스펙 및 작업을 진행합니다.
1. RYZEN cpu 생산 33주차 이상.
2. BIOS 펌웨어 최신 업데이트 ==> 현재는 바이오스 업뎃은 안하고 테스트 진행중 입니다.
3. kernel 4.13 이상 , RCU_NOCB (커널에서 offload rcu callbacks 모듈추가)
4. ASLR 비활성화 (아래대로 진행시 리부팅 하면 초기화 되기 때문에 rc.local 에 등록 해주기로함)
** 테스트 메인보드
- MSI b350m mortar 박격포
- GIGABYTE GA-AB350M-Gaming 3
- BIOSTAR biostar b350 gt3
* RYZEN 서버 보드가 없는 관계로 데스크탑 보드에서 테스트 진행 했습니다.
** 참고 및 자료 **
http://blog.programster.org/ubuntu-16-04-compile-custom-kernel-for-ryzen
http://root.uabid.com-centos-6/
https://www.tecmint.com/disable-lock-blacklist-package-updates-ubuntu-debian-apt/
** [ Ubuntu 16.04 ] **
** [ Ryzen 안정성을 얻으려면 ASLR 을 비활성화 해야합니다 . ] # echo 0 > /proc/sys/kernel/randomize_va_space
** [ 패키지 설치 ] # sudo apt install git build-essential kernel-package fakeroot libncurses5-dev libssl-dev ccache -y ** [ 커널을 복제할 영역생성 ] # cd ~ # mkdir kernelbuild # cd kernelbuild # git clone -b linux-4.13.y git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git ** [ 소스코드로 가서 기본설정 커널 빌드진행] # cd linux-stable # cp /boot/config-`uname -r` .config # yes '' | make oldconfig ** [ RYZEN 용 커널 수정 ] # make menuconfig ** 해당 화면이 출력되면 [ / ] 키를 눌러 RCU_NOCB 를 찾습니다. ** 해당 화면이 출력되면 1 을 눌러서 진행 ** 현재 상태에서 spacebar 를 누르면 아래와 같은 화면으로 넘어 갑니다. ** spacebar다시 누르면 RCU 구성을 고급 조정할 수 있습니다. ** Offload RCU callback processing from boot-selected CPUs 를 spacebar 를 눌러 * 체크 하고 키보드 오른쪽 방향키로 Save를 선택합니다. ** 저장파일명이 나오면 .config 파일에 저장합니다. ** 방향키로 Exit 선택하고, 해당 작업을 여러번하여 콘솔로 나오게 합니다. ** [ 커널 빌드 ] * 해당 작업은 1700으로 16Thread로 진행 하기 때문에 16을 기입하고, 하이퍼쓰레딩이 없거나 해당 쓰레드 보다 낮을 경우 그게 맞는 수를 입력합니다. # make clean # NUM_THREADS=16 # make -j $NUM_THREADS deb-pkg LOCALVERSION=-custom ** [ 커널 설치 ] # cd .. # sudo dpkg -i linux-firmware-image-4.13.4-custom_4.13.4-custom-1_amd64.deb # sudo dpkg -i linux-libc-dev_4.13.4-custom-1_amd64.deb # sudo dpkg -i linux-headers-4.13.4-custom_4.13.4-custom-1_amd64.deb # sudo dpkg -i linux-image-4.13.4-custom-dbg_4.13.4-custom-1_amd64.deb # sudo dpkg -i linux-image-4.13.4-custom_4.13.4-custom-1_amd64.deb ** 커널생성시 직접 만드는 것이 제일 좋겠지만, 시간적 여유가 없다면, 만들어진 커널 사용해도 됩니다. https://drive.google.com/open?id=1lsAfgF3QKxbDselo9kpaLOg3QCsXLodA ** [커널에 매개변수 추가] # sudo vim /etc/default/grub ... GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="rcu_nocbs=0-15" GRUB_CMDLINE_LINUX="" ... ** GRUB_CMDLINE_LINUX_DEFAUL =" " 안에 rcu_nocbs=0-15 내용 추가. cpu0-15까지 총 16Thread # sudo update-grub # sudo reboot ** 부팅 후 확인 root@ubuntu:/home/smileserv# dmesg | grep RCU [ 0.000000] Hierarchical RCU implementation. [ 0.000000] RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=16. [ 0.000000] Tasks RCU enabled. [ 0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16 [ 0.000000] Offload RCU callbacks from CPUs: 0-15. [ 0.076000] Hierarchical SRCU implementation.
** [ Cnetos 7 ] **
** Centos 7 커널 업데이트로 ubuntu 보다는 간단하게 진행 됩니다.
** 커널을 업데이트 하고 나면 offload rcu callback process 모듈이 탑재가 된듯합니다. 해서 커널 매개변수에만 등록 해주면 될듯 합니다.
** [ Ryzen 안정성을 얻으려면 ASLR 을 비활성화 해야합니다 . ] # echo 0 > /proc/sys/kernel/randomize_va_space
** [ Cnetos7 커널 설치 ] # rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # yum --enablerepo=elrepo-kernel install kernel-ml* -y (kernel header 와 dev 까지 설치 해야 하기 때문에..) * http://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 커널이 계속 업데이트 되면서 최신버젼들은 저장소에 바로 업데이트가 안되는듯 합니다. 위 저장소에서 확인후 header, tool, 등을 rpm설치 해주시길 바랍니다. ** [ 커널 변경 ] [root@localhost ~]# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2 CentOS Linux (4.14.13-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-693.11.6.el7.x86_64) 7 (Core) CentOS Linux (3.10.0-123.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-5ad196165824407781c3fc7be9873864) 7 (Core) [root@ceph08:43:30:~]# grub2-set-default "CentOS Linux (4.14.13-1.el7.elrepo.x86_64) 7 (Core)" [root@ceph08:43:47:~]# grub2-editenv list saved_entry=CentOS Linux (4.14.13-1.el7.elrepo.x86_64) 7 (Core) ** [커널에 매개변수 추가] # vim /etc/default/grub ... GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="rcu_nocbs=0-15" GRUB_CMDLINE_LINUX="" ... ==> 해당 라인에 매개 변수가 들어가 있다면 맨뒤에 한칸띄우고 입력 [root@ceph08:43:54:~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.14.13-1.el7.elrepo.x86_64 Found initrd image: /boot/initramfs-4.14.13-1.el7.elrepo.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-327.28.2.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-327.28.2.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-669f739bf32840a2bb8eb8c7997e50ee Found initrd image: /boot/initramfs-0-rescue-669f739bf32840a2bb8eb8c7997e50ee.img ** [ 리부팅 및 확인 ] # reboot
** [ Cnetos 6 ] **
** Centos 6은 Centos7 처럼 커널 업데이트 진행시 똑같은 kernel-4.14 버전때의 커널이 올라가지만 offload rcu callback process 모듈이 없기때문에 ubuntu처럼 커널 컬파일을 다시 해야 합니다.
** [ Ryzen 안정성을 얻으려면 ASLR 을 비활성화 해야합니다 . ] # echo 0 > /proc/sys/kernel/randomize_va_space
** [ 패키지 설치 ]
yum install -y ncurses-devel gcc make rpm-build redhat-rpm-config
** [ 커널 다운 및 빌드준비 ]
* 커널 및 패치는 www.kernel.org 에서 받으시면 됩니다.
[root@localhost /]# cd /usr/local/src
[root@localhost src]# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.14.tar.xz
[root@localhost src]# wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14-rt1.patch.gz
[root@localhost src]# tar xvf linux-4.14.14.tar.xz
[root@localhost src]# cd linux-4.14.14
[root@localhost src]# zcat ../patch-4.14-rt1.patch.gz | patch -p1
[root@localhost src]# cp /boot/config-`uname -r` .config
** [ RYZEN 용 커널 수정 ]
** 해당 작업은 위의 ubunbu 사진들과 동일 합니다. 참고 바랍니다.
** [ 커널 빌드 ]
[root@localhost src]# make clean
[root@localhost src]# make -j 16 binrpm-pkg
** 빌드는 패키지타입만 변경되고 동일 진행 합니다. ryzen1700 16thread 기준이기에 16으로 진행 합니다.
** 해당 버젼으로 커스텀한 커널 공유 합니다. 필요하신 분들은 사용하세요 **
https://drive.google.com/open?id=1kRuSbBsSpg3PzQ9pARn3STXB58khPcMd
** [ 커널 설치 ]
[root@localhost src]#ll /root/rpmbuild/RPMS/x86_64
total 52668
-rw-r--r--. 1 root root 52726496 Jan 23 15:07 kernel-4.14.14_rt1-1.x86_64.rpm
-rw-r--r--. 1 root root 1202148 Jan 23 15:07 kernel-headers-4.14.14_rt1-1.x86_64.rpm
[root@localhost src]# cd /root/rpmbuild/RPMS/x86_64
[root@localhost x86_64]# rpm -Uvh kernel-*
Preparing... ########################################### [100%]
1:kernel ########################################### [100%]
2:kernel-headers ########################################### [100%]
** [ 커널 순서 변경 및 커널 매개변수 추가 ]
[root@localhost src]# vi /boot/grub/grub.conf
....
default=0 ===> 현재 숫자에서 아래 커널 순서대로 0부터. 지금은 제일 처음이기에 0으로 입력
timeout=5
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (4.14.14-rt1)
root (hd0,1)
kernel /boot/vmlinuz-4.14.14-rt1 ro root=UUID=8afaa612-4241-4808-9007-b68bedbd5664 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet rcu_nocbs=0-15
initrd /boot/initramfs-4.14.14-rt1.img
....
* grub.conf에서 kernel 라인 맨 끝에 "rcu_nocbs=0-15" 추가 후 저장
** [ 리부팅 및 확인 ]
[root@localhost src]# reboot
[root@localhost ~]# dmesg | grep RCU
Hierarchical RCU implementation.
RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=16.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16
Offload RCU callbacks from CPUs: 0-15.
Hierarchical SRCU implementation.
** 커널 업데이트 방지를 합니다. 당분간 안정 버전이 나오기 전 까지는 커스텀 버전으로 사용해야 할 것 같습니다.** [ CENTOS * 커널 업데이트 방지 ] [root@localhost11:29:34:~]# yum update --exclude=kernel* {"업데이트할 패키지"} ** [ CENTOS 커널 영구 방지 ] [root@localhost11:29:34:~]# vi /etc/yum.conf exclude=kernel* <== 추가함. 또는 [root@localhost11:29:34:~]# vi /etc/sysconfig/kernel # UPDATEDEFAULT specifies if new-kernel-pkg should make # new kernels the default UPDATEDEFAULT=yes ==> no변경 # DEFAULTKERNEL specifies the default kernel package type DEFAULTKERNEL=kernel ======================================================================================= ** [ ubuntu * 커널 업데이트 방지 ] 상태 유지 ex) # apt-mark hold apache2 상태 유지 제거 ex) # apt-mark unhold apache2 ** [ ubuntu * 커널 영구 방지 ] # vi /etc/apt/preferences 또는 # vi /etc/apt/preferences.d/official-package-repositories.pref ** 아래 내용 추가 Package:(Here, '*' means all packages) Pin: release * Pin-Priority: ex) Package: kernel Pin: release o=Ubuntu Pin-Priority: 1