博客 / 詳情

返回

Linux如何切換到PREEMT_RT實時內核?

1.實時linux介紹

Linux實時核區分了單核方法(如PREEMPT_RT)和雙核方法(如Xenomai)。

雙核方法比單核方法早了好幾年。該方法使用一個獨立的實時微內核與傳統Linux內核並行運行,增加了硬件與Linux內核之間處理實時需求的層。實時代碼優先於用户空間,只有在沒有執行實時代碼時才允許運行。

雙核方法雖然具有優異的實時性能,但缺點是固有的複雜性。正如德國嵌入式開發公司Linutronix的Jan Altenberg所説:

“問題在於需要有人維護微內核並在新硬件上支持它。這是一項巨大的努力,而開發社區規模並不大。此外,由於Linux並非直接運行在硬件上,需要硬件抽象層(HAL)。有兩件事要維護,通常落後於主流Linux開發。”

這一缺陷導致不同開發者試圖通過修改Linux內部的調度來修補現有Linux內核,形成了後來的單內核系統。內核本身經過調整,具備實時支持。PREEMPT_RT是一組補丁,旨在使內核即使在關鍵部分中也能完全搶佔。更詳細的解釋請參考Ubuntu的詳細指南。

切換RT內核方式目前支持:

  • Pro Client 方式(個人免費五台設備)
  • Universe APT 方式(Real-time Ubuntu 的 deb 包已在 Universe 倉庫開放獲取,覆蓋 LTS 與部分 interim,可直接通過 APT 安裝)
  • Debian 套件安裝
  • 內核重新編譯

2.APT方式切換RT內核

本文只介紹作者操作過程中實際使用的方式,其餘方式通過參考鏈接的形式放在後文。

2.1 查看當前系統狀態

查看當前操作系統版本lsb_release -a

image.png

查看當前內核版本 uname -a

image.png

generic表示是通用內核,PREEMPT_DYNAMIC表示為動態搶佔模式

2.2下載實時內核包

sudo apt update
sudo apt install ubuntu-realtime

# 拿到GRUB 菜單裏的啓動項名稱,切換內核需要使用
grep menuentry /boot/grub/grub.cfg

根據輸出內容可得,版本有:

Ubuntu, with Linux 6.8.0-90-generic

Ubuntu, with Linux 6.8.0-87-generic

Ubuntu, with Linux 5.15.0-1032-realtime

image.png

2.3切換到RT內核

2.3.1 臨時切換

方法一:

重啓後按住Esc(UEFI)或 Shift(Legacy BIOS),直到出現grub菜單,在菜單裏選擇切換到

Advanced options for Ubuntu
    └── Ubuntu, with Linux 5.15.0-1032-realtime

在虛擬機裏可能無法進入grub菜單頁面,使用方法二

方法二:

#臨時指定下一次為rt內核
sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-1032-realtime" #"子菜單路徑 + menuentry 名稱"
#重啓
reboot

2.3.2 永久切換

#把啓動項寫入/boot/grub/grubenv
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-1032-realtime"

#確定grub是否設置了永遠啓動第0個菜單項
micro /etc/default/grub
- GRUB_DEFAULT=0
+ GRUB_DEFAULT=saved
+ GRUB_SAVEDEFAULT=true

#更新grub
update-grub

#重啓系統
reboot

查看內核 uname -a,已切換

image.png

2.4測試RT內核

#下載rt測試集
sudo apt install rt-tests

#跑cyclictest測試
sudo cyclictest -p95 -t1 -n

補充

  1. 虛擬機測實時的準確性限制
  • vCPU搶佔
  • 宿主機負載
  • 虛擬時鐘
  1. GRUB相關配置文件:
  • /etc/default/grub:改“默認啓動項、超時、是否顯示菜單”等的地方
  • /etc/grub.d/:生成菜單的腳本目錄
  • /boot/grub/grub.cfg:最終生成的菜單配置(自動生成)
  • /boot/grub/grubenv:保存 saved_entry 這類“記憶默認項”的環境文件(grub-set-default 會寫這裏)

update-grub 的作用就是:讀取 /etc/default/grub + /etc/grub.d/ → 重新生成 /boot/grub/grub.cfg

參考鏈接

linux-realtime/doc/PreemptRt.md 在主線 ·2b-t/linux-realtime ·GitHub

How to enable Real-time Ubuntu - Real-time Ubuntu documentation

How to enable Real-time Ubuntu - Ubuntu Pro Client documentation

linux-realtime/doc/RealTimeLinux.md 在主頁 ·2b-t/linux-realtime ·GitHub

https://ubuntu.com/blog/enable-real-time-ubuntu

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.