Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】
系统: Ubuntu 18.04.5
当前内核: 5.4.0-72-generic
待安装实时内核: 5.6.19-rt12
1、查看当前内核版本
通过uname -r
命令查看当前内核版本
2、下载内核和补丁
内核下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/
补丁下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
国内阿里镜像内核下载地址(下载速度快): https://mirrors.aliyun.com/linux-kernel/
国内阿里镜像补丁下载地址(下载速度快): https://mirrors.aliyun.com/linux-kernel/projects/rt/
【注意】查找离自己目前内核最接近的 kernal 并下载,然后根据下载的内核版本下载补丁,内核版本和补丁版本要保持一致。
由于我目前的内核版本是5.4.0-72-generic,进到v5 . x/,找到linux 5.6.19.tar.xz,下载该内核,然后下载与该内核对应的补丁patch-5.6.19-rt12.patch.xz 。
- 创建内核存放目录、将下载好的内核和补丁移到该目录下、打补丁
mkdir ~/rt_kernal
cd ~/下载
cp linux-5.6.19.tar.xz patch-5.6.19-rt12.patch.xz ../rt_kernal/
cd ../rt_kernal/
xz -cd linux-5.6.19.tar.xz | tar xvf -
cd linux-5.6.19
xzcat ../patch-5.6.19-rt12.patch.xz | patch -p1
3、配置内核
在boot文件夹下可以找到与当前内核版本匹配的 config 文件,例如:config-5.4.0-72-generic 。将其拷贝到当前目录~/rt_kernal/linux-5.6.19 下并命名为 .config
sudo cp /boot/config-5.4.0-72-generic .config
- 安装相关依赖包
sudo apt-get install libncurses-dev bison flex bc libelf-dev
sudo apt-get install libssl-dev
- 开始配置
make oldconfig
回车,直到出现选择的选项,选择
Fully Preemptible Kernel (RT)
然后一直回车到结束
4、编译内核
make -j12 deb-pkg #根据处理器决定编译线程数
由于我的是12线程,所以这里是12,同时开始,编译更快。
编译结束后,给内核打 deb 包的时候报错:
解决办法:
直接修改 .config 文件,把CONFIG_MODULE_SIG_ALL,CONFIG_MODULE_SIG_KEY和CONFIG_SYSTEM_TRUSTED_KEYS三项注释掉,编译时系统会自动生成一次性密钥来加密,另外记得把CONFIG_DEBUG_INFO=y去掉,不然新内核带debug信息超大。
然后重新make -j12 deb-pkg
奈斯!可以发现现在编译成功了。
5、安装 deb 包
经过上面的编译过程,应该会在和linux压缩包同目录下生成3个或者4个.deb格式的安装包,安装所有生成的包
sudo dpkg -i ../linux-headers-5.6.19-rt12_5.6.19-rt12-1_amd64.deb ../linux-image-5.6.19-rt12_5.6.19-rt12-1_amd64.deb ../linux-libc-dev_5.6.19-rt12-1_amd64.deb
报错 again
这里主要看那个 ERROR,根据它的提示,打开 make.log 文件,查看导致问题出现的原因:
原来是因为英伟达显卡驱动不支持 PREEMPT_RT 实时内核,网上查了好大功夫竟然没有查询到相关解决办法,那现在如果不官这个英伟达显卡驱动的事儿看看实时内核是否安装成功了呢?
6、reboot 并验证
reboot
然后进入 ubuntu 高级选项,发现已经有了刚刚安装的实时内核!
enter 启用该内核(不带有recovery mode字样的那一个),开机后
uname -r
查看当前系统内核
发现确实是刚刚安装的实时内核了,但由于英伟达显卡驱动不支持这个实时内核的原因,我的扩展屏幕用不了了。
7、参考
Ubuntu18.04实时内核补丁(realtime kernel,Preempt_rt)的安装
Ubuntu / Linux 实时内核 RT Preempt 安装-Ubuntu18.04 内核
给linux内核打实时补丁preempt_rt
以上就是我 ubuntu 18.04安装实时内核的过程记录,以便日后查看,也可以为需要的朋友提供一点帮助,如果哪位朋友发现了实时内核怎么解决英伟达显卡驱动的问题,请戳我一下或者分享个链接,多多指教!
后续来啦!在 ZYL师姐的帮助下,找到了为实时内核安装 nvidia 显卡驱动的解决办法,整理在下边喏
8、给实时内核安装 nvidia 显卡驱动
8.1 进入之前的非实时内核系统中查看nvidia 驱动版本号
打开终端,输入nvidia-smi
,显示结果如下:
可见驱动版本为460.160.00,那么我们需要下载对应版本的
.run
文件显卡驱动,nvidia版本显卡驱动快捷下载地址,点击链接进入界面发现没有我的460.160.00版本,那么只好把这卸载掉,安装一个别的。
8.2 卸载 nvidia 驱动(非实时内核中)
sudo apt-get remove --purge nvidia*
卸载完成后reboot
重启
8.3 查看适配的 nvidia 版本(非实时内核中)
ubuntu-drivers devices
可见我的推荐版本是470,所以就安装个470的呗
8.4 安装推荐版本的 nvidia 驱动(非实时内核中)
sudo apt-get upgrade
sudo apt-get install nvidia-driver-470
安装完成后reboot
重启
重启后再次查看 nvidia 驱动版本,打开终端,输入nvidia-smi
,显示结果如下:
可见已经在非实时内核下成功安转了470.86版本的 nvidia 显卡驱动。
再次进入nvidia版本显卡驱动快捷下载地址,进入470.86,下载NVIDIA-Linux-x86_64-470.86.run
下载完成后,将 .run 文件放到主目录下,然后reboot进入实时内核。
8.5 安装 nvidia 驱动(实时内核中)
此处参考 ubuntu打实时内核补丁教程以及安装后显卡驱动问题解决方法,非常感谢,整理如下:
进入实时内核后,在主目录中打开终端,输入sudo gedit install_nvidia.sh
,这里要注意,之前的 .run 驱动文件和install_nvidia.sh
脚本文件都在主要目录下。
将下面脚本代码拷贝到install_nvidia.sh
中
#!/bin/bash
BUILD_BASE=`pwd`
NV_FILE="NVIDIA-Linux-x86_64-xxx.run" # 这里改成自己下载的.run文件名(之前安装过的)
#NV_URL="https://us.download.nvidia.cn/XFree86/Linux-x86_64/430.50/${NV_FILE}" # 之前已经下好了显卡驱动.run文件,就不用从网上下载了,直接注释掉,而且如果要下载的话,则慢
NEED_TO_COMPILE_NV_KO=1
function clean_env() {
[ -d ./${NV_DIR} ] && rm -rf ./${NV_DIR}
}
function check_env() {
# check if in rt kernel
uname -r | grep rt 1>/dev/null 2>&1
if [ $? -ne 0 ]
then
echo "Not in rt kernel, Please install apollo kernel and reboot machine first."
exit 2
fi
# check if nv ko already in kernel
if [ ! -f /lib/modules/`uname -r`/kernel/drivers/video/nvidia.ko ]
then
export NEED_TO_COMPILE_NV_KO=1
fi
}
function prepare_nv() {
## download nv install file from nvidia home page
#if [ ! -f ./${NV_FILE} ]
#then
# echo "Downloading ${NV_FILE} from nvidia website..."
# wget ${NV_URL} -O ${NV_FILE}
# if [ $? -ne 0 ]
# then
# echo "Downloading ${NV_FILE} failed, please check your network connection!"
# rm -rf ./${NV_FILE}
# exit 1
# fi
#fi
###########上面是下载驱动的代码,我们已经提前下载好了,就不需要这段代码了,直接注释掉############
# +x
chmod +x ./${NV_FILE}
echo "Extracting nvidia install run file..."
./${NV_FILE} -x 1>/dev/null 2>&1
NV_DIR="`echo ${NV_FILE} | awk -F '.run' '{print $1}'`"
NV_VERSION="`echo ${NV_FILE} | awk -F '-' '{print $4}' | awk -F '.run' '{print $1}'`"
export NV_DIR
export NV_VERSION
export NVIDIA_SOURCE="${NV_DIR}/kernel"
}
function install_lib() {
NV_LIB_OUTPUT_PATH="/usr/lib/x86_64-linux-gnu/"
NV_BIN_OUTPUT_PATH="/usr/bin/"
[ -f ./${NV_DIR}/libnvidia-ml.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libnvidia-ml.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/libnvidia-fatbinaryloader.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libnvidia-fatbinaryloader.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/libnvidia-ptxjitcompiler.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libnvidia-ptxjitcompiler.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/libcuda.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libcuda.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/nvidia-modprobe ] && /bin/cp -f ./${NV_DIR}/nvidia-modprobe ${NV_BIN_OUTPUT_PATH}
[ -f ./${NV_DIR}/nvidia-smi ] && /bin/cp -f ./${NV_DIR}/nvidia-smi ${NV_BIN_OUTPUT_PATH}
chmod +x /usr/bin/nvidia*
chmod +s /usr/bin/nvidia-modprobe
# link for nvidia
/bin/rm -rf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
/bin/ln -s /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.${NV_VERSION} /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
/bin/ln -s /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
/bin/rm -rf /usr/lib/x86_64-linux-gnu/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so.1
/bin/ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.${NV_VERSION} /usr/lib/x86_64-linux-gnu/libcuda.so.1
/bin/ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so
# take effect
/sbin/ldconfig 1>/dev/null 2>&1
}
function build_nv() {
if [ ${NEED_TO_COMPILE_NV_KO} == 0 ]
then
return
fi
NVIDIA_MOD_REL_PATH='kernel/drivers/video'
NVIDIA_OUTPUT_PATH="/lib/modules/`uname -r`/${NVIDIA_MOD_REL_PATH}"
CPUNUM=`cat /proc/cpuinfo | grep processor | wc | awk -F " " '{print $1}'`
export IGNORE_PREEMPT_RT_PRESENCE=true
cd ${NVIDIA_SOURCE} && make -j ${CPUNUM} module
cd ${BUILD_BASE}
unset IGNORE_PREEMPT_RT_PRESENCE
mkdir -p ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia.ko ] && cp ${NVIDIA_SOURCE}/nvidia.ko ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia-modeset.ko ] && cp ${NVIDIA_SOURCE}/nvidia-modeset.ko ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia-drm.ko ] && cp ${NVIDIA_SOURCE}/nvidia-drm.ko ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia-uvm.ko ] && cp ${NVIDIA_SOURCE}/nvidia-uvm.ko ${NVIDIA_OUTPUT_PATH}
depmod -a
}
# check environment
check_env
# prepare for nvidia
prepare_nv
# build nvidia.ko
build_nv
# install user lib
install_lib
# clean environment
clean_env
echo "Done to install nvidia kernel driver and user libraries."
将上述脚本中第四行代码中的xxx
更改为我的新 nvidia 驱动版本号 470.86
,修改完毕,保存。
添加可执行权限:chmod +x ./install_nvidia.sh
运行脚本:sudo ./install_nvidia.sh
成功安装后 reboot
重启后输入nvidia-smi
,能够看到显卡驱动信息,安转完成,现在可以在实时内核中正常使用扩展屏幕了,very奈斯!!