Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】

本文详细记录了在Ubuntu18.04上安装5.6.19-rt12实时内核的过程,包括查看当前内核版本、下载内核和补丁、配置编译内核、安装deb包以及解决编译时遇到的问题。此外,还介绍了如何在实时内核中安装NVIDIA驱动,包括卸载旧驱动、安装新驱动以及编写和执行安装脚本来解决实时内核与NVIDIA驱动的兼容性问题。
摘要由CSDN通过智能技术生成


系统: 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奈斯!!

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值