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
查看當前內核版本 uname -a
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
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,已切換
2.4測試RT內核
#下載rt測試集
sudo apt install rt-tests
#跑cyclictest測試
sudo cyclictest -p95 -t1 -n
補充
- 虛擬機測實時的準確性限制
- vCPU搶佔
- 宿主機負載
- 虛擬時鐘
- 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