Newcomers to linux are warned that this procedure may b0rk proprietary drivers and some third-party non-free software. Before proceeding to build your own kernel you should be proficient in searching google for solutions. If you b0rk your machine with this procedure then you're basically on your own because you've installed an unsupported kernel. You have been warned. If you have a spare hard disk, you are urged to perform a full backup before proceeding.
I use the NVIDIA proprietary driver and don't need to make any adjustments for it in the steps below. I cannot tell you if the same applies to the AMD proprietary driver.
Important
These instructions are for Linux Mint 18.2. They should work on other editions but if you're not using 18.2 then you'll need to make any adjustments without my help.
Introduction
For high-end machines it is highly recommended to install a low-latency kernel. A low-latency kernel is fractionally (imperceptibly) slower than a generic kernel, but it offers fantastic support for high-end multi-core CPUs and load sharing. The difference a low-latency kernel makes is very much noticeable when playing videos, doing video transcoding and performing other CPU intensive tasks. Additionally Mint 18.2 uses gcc version 5.4, which is capable of implementing CPU optimisations for Ryzen processors. Unfortunately these optimisations are not enabled by default in the kernel, so we must build our own kernel to activate them.
The reason for compiling a Ryzen-specific kernel is to deal with (for example)
certain bugs with the Ryzen processor, which, funnily enough, aren't found in the newer ThreadRipper series, and to obtain the benefits of CPU optimisations specific to the Ryzen CPU. The goal is increased stability.
Prerequisites
- DO NOT overclock. Compiling while overclocking triggers one of the Ryzen bugs this
procedure is intended to defeat. If you find that all userland applications, keyboard,
mouse and desktop environment suddenly switch off but the computer remains on,
congratulations, you've triggered the bug. - Pack a lunch box and a flagon of ice water. One of the steps takes quite some time. The
download size is over 1.1GB so be aware of that if you're on a metered connection. - In case you do b0rk your machine, be aware that you can enter GrUB and select a
previous kernel. Usually you hold down the left shift key during boot if you don't
normally see the GrUB menu. - In case you do b0rk your machine and can't recover using a previous kernel, make sure
you have access to a spare device that can access the internet so you can search
Go-ogle[1] for solutions, but it shouldn't come to this. - If you've had to do anything to your system to get it running properly, make sure that
you have sufficient notes to recreate the steps. For example, you may have to reinstall
wifi drivers.
Source: Ubuntu Mainline builds wikiFirst, if one is using select proprietary or out-of-tree modules (ex. vitualbox, nvidia, fglrx, bcmwl, etc.) unless there is an extra package available for the version you are testing, you will need to uninstall the module first, in order to test the mainline kernel. If you do not uninstall these modules first, then the upstream kernel more than likely will not boot.
The kernel will boot, but you may have to reinstall "out-of-tree modules", possibly including wifi drivers, from a terminal. Use Ctrl-Alt-F1 if X won't start and issue the appropriate commands to reinstall your video drivers. Alternatively you can boot the new kernel in recovery mode from the GrUB menu. Virtualbox should be ok because newer versions no longer rely on dkms.
Step 1: Install development tools
Start a terminal and stay in your home directory. If you prefer to build your kernel in /usr/src then make the necessary adjustments, otherwise just issue these commands:
Code: Select all
sudo apt install git build-essential kernel-package fakeroot libncurses5-dev libssl-dev ccache -y
Code: Select all
gcc --version
Code: Select all
mkdir build_kernel
cd build_kernel
This next step is where you'll need your packed lunch and flagon of ice water. I have a T5 connection so the download is reasonably quick but it won't be so for many people.
Code: Select all
git clone -b linux-4.13.y git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Code: Select all
cd linux-stable/
~/build_kernel/linux-stable/
You may want to make a backup copy of the sources before you proceed to the next step just in case something goes wrong. I always do this and I recommend that you do also. You can use your file manager to copy/paste the
build_kernel
directory to a safe place. If something goes wrong, you can just delete the botched sources directories and replace them with copy/paste. Then you can start afresh.Go back into the terminal and issue this command to apply the patch:
Code: Select all
patch -p1 < enable_additional_cpu_optimizations_for_gcc_v4.9+_kernel_v4.13+.patch
Code: Select all
catweazel@Fenella ~/build_kernel/linux-stable $ patch -p1 < enable_additional_cpu_optimizations_for_gcc_v4.9+_kernel_v4.13+.patch
patching file arch/x86/include/asm/module.h
patching file arch/x86/Kconfig.cpu
patching file arch/x86/Makefile
patching file arch/x86/Makefile_32.cpu
Step 3: Prepare to configure the kernel
In the terminal, issue these commands to copy your current kernel config and rebiuld the copied config for the patch you applied earlier:
Code: Select all
cp /boot/config-`uname -r` .config
yes '' | make oldconfig
Code: Select all
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
[...]
Kernel Live Patching (LIVEPATCH) [Y/n/?] y
#
# configuration written to .config
#
Code: Select all
nano -w .config
CONFIG_DEBUG_INFO
as the search term. You should be taken to a line that reads:
Code: Select all
# CONFIG_DEBUG_INFO is not set
CONFIG_DEBUG_INFO=n
<--- You are replacing the entire line, including the #.Type ctrl-o and press enter to save changes, and ctrl-x to exit.
Finally for this step, build the kernel make scripts with this command:
Code: Select all
make scripts
Issue this command:
Code: Select all
make menuconfig
Code: Select all
Processor type and features --->
[*] Symmetric multi-processing support
[*] AMD ACPI2Platform devices support
Processor family (MZEN) --->
(X) AMD Zen
[*] Supported processor vendors --->
[*] Support AMD processors
[*] SMT (Hyperthreading) scheduler support
[*] Multi-core scheduler support
Preemption Model (Preemptible Kernel (Low-Latency Desktop)) --->
[*] 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 --->
<*> AMD Opteron/Athlon64 PowerNow!
<*> AMD frequency sensitivity feedback powersave bias
Device Drivers --->
[*] IOMMU Hardware Support --->
[*] AMD IOMMU support
<*> AMD IOMMU Version 2 driver
--->
). Use the left and right arrow keys to select the save and exit options. Use the space key to mark a module <*>
. Note that when you go down one level (--->
) in the menu system, you use the Exit
button to go back up. At the top level, Exit
will exit menuconfig.When performing this step, don't be tempted to switch off other Intel options. Since you're not using an Intel processor, these items will never get executed in the kernel so they just take up space. If you know what you're doing then you can disable whatever you like, but if you've got little or no experience with the kernel, leave the Intel options alone.
When all the settings above have been set, save your changes and exit.
Step 5: Compile the kernel
Important
It is not necessary to issue the
make clean
command the first time you build your kernel but you should do it anyway. Note that you will need to issue make clean
before you recompile if your compile fails. Alternatively if you made a backup as described above, delete the old source directories and just copy/paste your backup for a fresh start.Important
The
make
command below uses NN
to represent the number of jobs or threads. You should replace NN
with the number of threads supported by your Ryzen CPU. In my case it's 16 so on my machine I use make -j 16 deb-pkg LOCALVERSION=-ryzen
. Don't forget, replace NN
with the number of threads.
Code: Select all
make clean
make -j NN deb-pkg LOCALVERSION=-ryzen
Code: Select all
INSTALL debian/headertmp/usr/include/linux/usb/ (11 files)
INSTALL debian/headertmp/usr/include/linux/wimax/ (1 file)
INSTALL debian/headertmp/usr/include/asm/ (62 files)
dpkg-deb: building package 'linux-firmware-image-4.13.8-ryzen' in '../linux-firmware-image-4.13.8-ryzen_4.13.8-ryzen-1_amd64.deb'.
dpkg-deb: building package 'linux-headers-4.13.8-ryzen' in '../linux-headers-4.13.8-ryzen_4.13.8-ryzen-1_amd64.deb'.
dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_4.13.8-ryzen-1_amd64.deb'.
dpkg-deb: building package 'linux-image-4.13.8-ryzen' in '../linux-image-4.13.8-ryzen_4.13.8-ryzen-1_amd64.deb'.
dpkg-source: info: using source format '3.0 (custom)'
dpkg-source: info: building linux-4.13.8-ryzen in linux-4.13.8-ryzen_4.13.8-ryzen-1.dsc
dpkg-source: warning: missing information for output field Standards-Version
dpkg-genchanges: including full source code in upload
Step 6: Install the kernel
Go up one level in the terminal to
~/build_kernel
using the cd
command and list the files:Code: Select all
cd ..
ls -l
Code: Select all
-rw-rw-r-- 1 Fenella Fenella 3059 Oct 21 10:17 linux-4.13.8-ryzen_4.13.8-ryzen-1_amd64.changes
-rw-rw-r-- 1 Fenella Fenella 1246 Oct 21 10:17 linux-4.13.8-ryzen_4.13.8-ryzen-1.debian.tar.gz
-rw-rw-r-- 1 Fenella Fenella 1187 Oct 21 10:17 linux-4.13.8-ryzen_4.13.8-ryzen-1.dsc
-rw-rw-r-- 1 Fenella Fenella 161366410 Oct 21 10:05 linux-4.13.8-ryzen_4.13.8-ryzen.orig.tar.gz
-rw-r--r-- 1 Fenella Fenella 963984 Oct 21 10:14 linux-firmware-image-4.13.8-ryzen_4.13.8-ryzen-1_amd64.deb
-rw-r--r-- 1 Fenella Fenella 10839168 Oct 21 10:15 linux-headers-4.13.8-ryzen_4.13.8-ryzen-1_amd64.deb
-rw-r--r-- 1 Fenella Fenella 50864894 Oct 21 10:17 linux-image-4.13.8-ryzen_4.13.8-ryzen-1_amd64.deb
-rw-r--r-- 1 Fenella Fenella 949990 Oct 21 10:15 linux-libc-dev_4.13.8-ryzen-1_amd64.deb
drwxrwxr-x 27 Fenella Fenella 4096 Oct 21 10:17 linux-stable
Next, install the .deb files:
Code: Select all
sudo dpkg -i linux*.deb
Code: Select all
Setting up linux-image-4.13.8-ryzen (4.13.8-ryzen-1) ...
Error! Bad return status for module build on kernel: 4.13.8-ryzen (x86_64)
Consult /var/lib/dkms/ndiswrapper/1.60/build/make.log for more information.
Error! Bad return status for module build on kernel: 4.13.8-ryzen (x86_64)
Consult /var/lib/dkms/virtualbox-guest/5.0.40/build/make.log for more information.
The virtualbox plumbing is complaining in the second error. This can be ignored as it will be fixed when you reboot.
Reboot into your shiny new kernel. To see it in a terminal:
Code: Select all
uname -a
Code: Select all
Linux Fenella 4.13.8-ryzen #1 SMP PREEMPT Sat Oct 21 10:13:25 AEDT 2017 x86_64 x86_64 x86_64 GNU/Linux
Code: Select all
sudo apt install --reisntall ndiswrapper