Ubuntu安装RT Linux补丁

22

我想将我的通用Ubuntu转换为实时Ubuntu,通过修补/安装RT Linux内核来实现,但无法找到简单的设置步骤。有人能帮忙提供步骤吗?

5个回答

21

对此没有直接的文档,但是在一些测试之后,我能够通过以下步骤解决。请注意这些步骤可能会根据您阅读此内容的时间而有所变化,截至2018-19-20-21年。

步骤0 - 创建一个工作目录

创建一个工作目录

#Move to working directory
mkdir ~/kernel && cd ~/kernel

步骤1 - 下载内核和补丁

前往https://www.kernel.org/pub/linux/kernel/,下载所需版本的内核到 ~/kernel。同样地,前往https://www.kernel.org/pub/linux/kernel/projects/rt/,下载与下载的内核版本相同的RT补丁。我使用的内核和补丁是linux-4.9.115.tar.gz和patch-4.9.155-rt93.patch.gz。

步骤2 - 解压缩内核

tar -xzvf linux-4.9.115.tar.gz

步骤 3 - 打补丁内核

#Move to kernel source directory
cd linux-4.9.115
gzip -cd ../patch-4.9.115-rt93.patch.gz | patch -p1 --verbose

第四步 - 启用实时处理 此步骤需要使用libncurses-dev。

sudo apt-get install libncurses-dev libssl-dev

下一个命令将在终端中启动一个图形菜单来生成配置文件。

make menuconfig

前往该位置并进行相应更改。

##Graphical Menu##

Processor type and features ---> [Enter]
Preemption Model (Voluntary Kernel Preemption (Desktop)) [Enter]
Fully Preemptible Kernel (RT) [Enter] #Select

[Esc][Esc]

Kernel hacking --> [Enter]
Memory Debugging [Enter]
Check for stack overflows #Already deselected - do not select


[Esc][Esc]


[Right Arrow][Right Arrow]

<Save> [Enter]

.config

<Okay> [Enter]

<Exit> [Enter]


[Esc][Esc]


[Right Arrow]
<Exit> [Enter]

步骤 5 - 编译内核

make -j20
sudo make modules_install -j20
sudo make install -j20

第6步 - 验证和更新 在 /boot 目录中验证是否生成了 initrd.img-4.9.115-rt93、vmlinuz-4.9.115-rt93 和 config-4.9.115-rt93,并更新 grub。

cd /boot
ls
sudo update-grub

确认在/boot/grub/grub.cfg文件中是否存在包含文本“menuentry 'Ubuntu, with Linux 4.9.115-rt93'”的菜单项。

要更改grub中的默认内核,请将/etc/default/grub中的GRUB_DEFAULT值编辑为所需的内核。

注意:0是第一个菜单项。

7 - 重新启动并验证

sudo reboot

系统重启后,打开终端并使用uname -a命令来检查内核版本,应该看起来像下面这样

Linux abhay-home 4.9.115-rt93 #1 SMP PREEMPT RT Mon May 13 03:32:57 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux

注意:“SMP PREEMPT RT”表示您的系统正在运行实时内核。


1
我按照提到的所有步骤操作了,将默认的 grub 改为 6,但是在启动后运行 uname -a 命令返回的仍然是旧内核。 - Salman Azmat
菜单项列表中数值6可能有误,但是您可以安装最新的内核版本,Linux默认会选择最新的内核版本。如果您的默认内核是4.15.0,则在第1步下载内核4.16.0。如果您想要相同的版本,则非常规的方法是进入/boot/grub/grub.cfg并查找您的RT内核的菜单项,然后将其剪切并粘贴到第一个menuentry之前。这不是建议的方式,如果不小心就可能破坏引导加载程序,但我已经尝试了这种方法,并且它有效。希望能帮助到您!祝好运 :) - Abhay Nayak
还可以使用 make -j<#cores> deb-pkg 构建 Debian 包,然后使用 sudo dpkg -i linux-*.deb 安装它们。如果您想将内核应用于多个系统,则这很好。 - Wolfson
大家好,当我执行(sudo make modules_install -j20)时,出现错误,它说arch/x86/Makefile:148 CONFIG_X86_X32已启用,但没有binutilils支持。!该变量在我的.conf文件的第683行。我尝试通过更改=N和=n来禁用,但仍然启用!!我应该使用m吗?如何解决这个问题?请帮忙...另外,apt get install linux-rt(https://howtoinstall.co/en/linux-rt)和这些步骤之间有什么区别?我可以在现有内核上应用rt补丁。 - surya kiran

10

这里是针对 Ubuntu 19.10 及以上版本的内容,我修补了 Linux 5.4.5 rt 内核补丁,因为 Ubuntu 19.10 的基础版本 Linux 5.3 没有 rt 内核补丁。

0. 创建一个工作目录

# Make dir and move to working directory
$ mkdir ~/kernel && cd ~/kernel

1. 下载内核和补丁

https://www.kernel.org/ 下载内核和实时补丁。 您可以在以下位置获取它们:

(内核) https://www.kernel.org/pub/linux/kernel/
(实时补丁) https://www.kernel.org/pub/linux/kernel/projects/rt/

请注意,实时补丁和内核的版本应相同。我使用了 linux-5.4.5.tar.gzpatch-5.4.5-rt3.patch.gz

如果您已经在 ~/kernel 目录下下载了这些文件,请跳过下面的步骤,继续进行第二步。

# Move these zip file to ~/kernel
$ cd ~/Download
$ mv linux-5.4.5.tar.gz patch-5.4.5-rt3.patch.gz ~/kernel/.

2. 提取内核源码并打rt内核补丁

# Extract kernel sources
$ cd ~/kernel
$ tar xvzf linux-5.4.5.tar.gz

# Patch rt kernel
$ cd linux-5.4.5
$ gzip -cd ../patch-5.4.5-rt3.patch.gz | patch -p1 --verbose {}

3. 安装必要的软件包

如果你要使用menuconfig GUI,需要安装libncurses-dev软件包。当你编译内核时,需要安装flexbison软件包。

# For using gui
$ sudo apt install libncurses-dev libssl-dev

# For compiling kernel
$ sudo apt install flex bison

4. 为 RT 配置内核

$ make menuconfig

进入menuconfig GUI界面。

# Make preemptible kernel setup
General setup ---> [Enter]
Preemption Model (Voluntary Kernel Preemption (Desktop)) [Enter]
Fully Preemptible Kernel (RT) [Enter] #Select

# Select <SAVE> and <EXIT>
# Check .config file is made properly

请注意,GUI配置中不再有检查堆栈溢出选项。您可以通过搜索“溢出”来检查它。在图形菜单上键入 /overflow

5. 编译内核

$ make -j20
$ sudo make modules_install -j20
$ sudo make install -j20

6. 减轻内核镜像

就像之前 @mrRo8o7 所说,大的 initrd 镜像可能会导致内核崩溃。您可以通过以下方法解决这个问题:

# Strip unneeded symbols of object files
$ cd /lib/modules/5.4.5-rt3  # or your new kernel
$ sudo find . -name *.ko -exec strip --strip-unneeded {} +

# Change the compression format
$ sudo vi /etc/initramfs-tools/initramfs.conf
# Modify COMPRESS=lz4 to COMPRESS=xz (line 53)

COMPRESS=xz 

[:wq]

然后更新 initramfs

$ sudo update-initramfs -u

7. 验证并更新grub

请验证该目录并更新grub。

# Make sure that initrd.img-5.4.5-rt3, vmlinuz-5.4.5-rt3, and config-5.4.5-rt3 are generated in /boot
$ cd /boot
$ ls

# Update grub
$ sudo update-grub

8. 重新启动并验证

$ sudo reboot

# After the reboot
$ uname -a

然后您可以检查您的新内核版本。

Linux [PROMPT] 5.4.5-rt3 …

按照这些确切的指令和文件版本,我遇到了很多补丁失败的情况 - “修补文件{}...4个块中有4个失败 - 将拒绝保存到文件{}.rej。嗯...下一个补丁将创建文件{},该文件已经存在!假设-R?[n]还是应用?[n]”- 这正常吗?如何回答? - DavidJ
3
如果在第二步中省略了 "--verbose" 后面的 "{}",似乎它就能正常工作。 - DavidJ

4

安装新内核后(如@Abhay Nayak贴出的),我遇到了内核崩溃的问题。问题在于initrd镜像太大了。我通过以下步骤解决了这个问题:

步骤1- 剥离内核模块

cd /lib/modules/<new_kernel>
find . -name *.ko -exec strip --strip-unneeded {} +

步骤2 - 更改initramfs压缩方式

编辑文件/etc/initramfs-tools/initramfs.conf:

COMPRESS=xz

步骤三 - 更新initramfs

sudo update-initramfs -u
sudo update-grub2

2
“PREEMPT_RT”补丁已经逐渐应用到了Linux主线,并且从Ubuntu 22.04版本开始,可以通过几个简单的命令激活,具体步骤请参考这里
对于早期版本的Ubuntu,请注意您也可以从官方Debian软件包网页下载特定PREEMPT_RT内核的Debian软件包。如果您不关心精确的内核版本,我建议您这样做而不是自己重新编译内核!下载Debian文件后,您可以使用以下命令从下载目录安装:
$ sudo dpkg -i linux-image-rt-amd64_5.10.106-1_amd64.deb
$ sudo apt-get install -f

“linux-image-rt-amd64_5.10.106-1_amd64.deb”明显取决于您下载的版本。重新启动到新安装的内核(使用“$ uname -r”验证当前内核名称确实包含“rt”),然后您就可以开始了!
如果您真的想/必须编译内核,您可能需要在.config中设置以下内核标志,在$ make oldconfig(或$ make menuconfig)之后。
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""

否则,遵循其他评论者给出的步骤可能会导致编译过程失败并出现晦涩的错误消息。
我最近写了一份更详细的指南,介绍了所需步骤,在这里。 在此过程中,我还编写了两个脚本,使您可以从现有的Debian软件包安装它,或使用图形用户界面自己编译内核。 请查看Github 存储库

0

1 创建工作目录

mkdir ~/kernel && cd ~/kernel

2 下载内核源代码和实时补丁文件

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.209.tar.gz 
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.209-rt77.patch.xz

3 解压源文件

tar -xzf linux-5.4.209.tar.gz&
xz -d patch-5.4.209-rt77.patch.xz
# wait until tar -xzf linux-5.4.209.tar.gz job finish
cd linux-5.4.209
patch -p1 <../patch-5.4.209-rt77.patch

4 配置构建选项

cp /boot/config-5.15.0-43-generic .config
# install dependency
sudo apt update
sudo apt install make gcc libncurses-dev libssl-dev flex libelf-dev bison
# install menu GUI to set configuration option "The RT option"
make menuconfig

# In Graphic menu to set up as follows:
# General setup  —>
# Preemption Model (Voluntary Kernel Preemption (Desktop))  —>
# ( ) Fully Preemptible Kernel (Real-Time) # select
# then SAVE and EXIT

# disable some options to update config file
scripts/config --disable SYSTEM_TRUSTED_KEYS --disable SYSTEM_REVOCATION_KEYS --disable CONFIG_DEBUG_INFO_BTF

5 构建内核

sudo make 
# do a check as follows, there should not be any error then we succeed to build. 
sudo make -s >/dev/null

6 安装内核模块

sudo make modules_install install

7 配置引导加载程序选项

sudo vim /etc/default/grub
# to set GRUB_TIMEOUT=-1
# which means it will stop until you choose specific kernel when boot.

8 重新启动和验证

reboot
# choose your real-time kernel, like 5.4.209-rt77
# After you log in,
# print out your real-time kernel name
uname -r
# show scheduler options, it should differ from the generic-linux-kernel's.
cat /sys/block/sda/queue/scheduler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接