Linux核心實時補丁PREEMPT_RT安裝
Linux打實時核心PREEMPT_RT補丁,及編譯核心過程總結如下:
1、下載核心kernel及preempt-rt;
Kernel:http://www.kernel.org/pub/linux/kernel/(儘量下載形如linux-2.6.33.tar.gz的,形如linux-2.6.33.7tar.gz的沒有complete
preemption(Real-Time)選項,且打補丁時也可能出錯)
2、解壓kernel及preemp-rt;
3、在/usr/src/目錄下mkdir rt-preempt-linux;
4、copy kernel(linux-2.6.33.6) and preempt(patch-2.6.33.3-rt26) to the rt-preempt-linux;
5、copy preempt-rt(patch-2.6.33.3-rt26) to the kernel(linux-2.6.33.6) directory;
6、change directory to kernel(linux-2.6.33.6) directory;
7、patch -p1 < patch-2.6.33.3-rt26
下面是核心配置過程:
8、
$ make mrproper 刪除目錄下殘留的.o檔案和其他從屬檔案,
拷貝原系統的.config 到 新下載的核心檔案根目錄下;(假如使用下載的核心自帶的.config檔案可能會出現module找不到現象)
copy /usr/src/kernel/2.6.32-431.el6.i686/.config /usr/src/rt-preempt-linux/linux-2.6.33.6/
也可以直接執行 make oldconfig, 而不用copy。
9、
$make menuconfig
選擇processor type and features
->preemption mode
->complete preemption(Real-Time)
10、
選擇Thread Softing 和 Thread Hardings
11、
返回上一級
選擇Device Driver
->去掉Staging Drivers
下面是核心編譯過程:
12、
$make -jn
(n 是要衍生的作業書,在實際中,每個處理器上一般衍生一個或兩個作業。例如在一個雙核處理器上可以使用$make -j4)13、
$make modules_install
$mkinitrd /boot/initramfs-2.6.33-rt7.img 2.6.33-rt7
14、
$make install
15、檢視引導項是否已配好
$cat /boot/grub/grub.conf
16、假如是多系統的話,將grub.conf 拷貝到Windows的c:\NST\menu.lst後,並把對應的碟符修改成在windows下的表示即可。(參考點選開啟連結)
例如:安裝linux-3.12.24後,在CentOS的/boot/grub/grub.conf(or /etc/grub.conf)為:
title CentOS (3.12.24-rt37)
root (hd2,5)
kernel /boot/vmlinuz-3.12.24-rt37 ro root=UUID=7482efc1-7e35-4a09-a3b7-64256ce7aee2 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /boot/initramfs-3.12.24-rt37.img
拷貝到windows下的menu.lst後為:
title CentOS (3.12.24-rt37)
root (hd1,5)
kernel (hd1,5)/boot/vmlinuz-3.12.24-rt37 ro root=UUID=7482efc1-7e35-4a09-a3b7-64256ce7aee2 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd (hd1,5)/boot/initramfs-3.12.24-rt37.img
備註:假如出現modules 找不到的錯誤,嘗試yum -y upgrade kernel kernel-devel 後在make install;或者參考本文後的網路參考#2;萬一不行換一個linux版本編譯。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
網路參考#1:
一、RTPREEMT_RT簡介
標準的Linux 核心只能能夠滿足軟中斷的要求,為使用者空間提供簡基本的Posix操作,但是不對固定的時間點做保證。Ingo Molnar's 的實時搶佔補丁(文中為:PREEMPT_RT)和 ThomasGleixner的具有高解析度的通用時鐘事件層,Linux增加了硬事實能力。
PREEMPT_RT 補丁因起了工業界的關注。由於它簡潔的設計和與核心的mainline的一致性,所以,它的硬實時和企業實時應用程式出現在專業的視訊到工業控制領域。(根據[1]翻譯)
二、獲取PREEMPT_RT
方法一:通過git下載最新的程式碼
這樣下載後的程式碼不需要打補丁,已經是最新的程式碼了。
方法二: 分別下載核心程式碼和補丁
下載的核心和補丁要對應,如kernel為linux-2.6.33.7.tar.bz2,補丁為patch-2.6.33.7.2-rt30.bz2。
三、打補丁的方法(通過git獲取的不需要打補丁)
$tar xfv linux-2.6.33.7.tar.bz2 $ cd linux-2.6.33.7 $ bzcat ../patch-2.6.33.7.2-rt30.bz2 | patch -p1
四、核心配置
$make menuconfig
4.1在“Processor typeand features”中
(1)選擇“Complete Preemption(Real-Time)”
(2)選擇“ThreadSoftirqs”和“ThreadHardirqs”
2. 在”Device Drivers”中,去掉“Staging Drivers”
由於Staging不穩定,導致編譯報錯[2]:
LD [M] drivers/net/bnx2x.o
make: *** [drivers] 錯誤 2
[email protected]:~/Experiment/linux/linux-2.6.33.7$ make
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
VDSOSYM arch/x86/vdso/vdso-syms.lds
VDSOSYM arch/x86/vdso/vdso32-int80-syms.lds
VDSOSYM arch/x86/vdso/vdso32-syscall-syms.lds
VDSOSYM arch/x86/vdso/vdso32-sysenter-syms.lds
VDSOSYM arch/x86/vdso/vdso32-syms.lds
LD arch/x86/vdso/built-in.o
LD arch/x86/built-in.o
LD drivers/staging/built-in.o
CC [M] drivers/staging/comedi/drivers/quatech_daqp_cs.o
drivers/staging/comedi/drivers/quatech_daqp_cs.c:70: error: field ‘eos’has incomplete type
drivers/staging/comedi/drivers/quatech_daqp_cs.c: In function‘daqp_interrupt’:
drivers/staging/comedi/drivers/quatech_daqp_cs.c:291: error: implicitdeclaration of function ‘up’
drivers/staging/comedi/drivers/quatech_daqp_cs.c: In function‘daqp_ai_insn_read’:
drivers/staging/comedi/drivers/quatech_daqp_cs.c:405: error: implicit declarationof function ‘sema_init’
drivers/staging/comedi/drivers/quatech_daqp_cs.c:418: error: implicitdeclaration of function ‘down_interruptible’
drivers/staging/comedi/drivers/quatech_daqp_cs.c: In function‘daqp_cs_attach’:
drivers/staging/comedi/drivers/quatech_daqp_cs.c:1045: warning: assignmentfrom incompatible pointer type
make[4]: *** [drivers/staging/comedi/drivers/quatech_daqp_cs.o] 錯誤 1
make[3]: *** [drivers/staging/comedi/drivers] 錯誤 2
make[2]: *** [drivers/staging/comedi] 錯誤 2
make[1]: *** [drivers/staging] 錯誤 2
make: *** [drivers] 錯誤 2
五、編譯
$make -jn
(n 是要衍生的作業書,在實際中,每個處理器上一般衍生一個活兩個作業。例如在一個雙和處理器上可以使用$make -j4)[3]
#make install
#make modules_install
#cd /boot
#mkinitramfs -k -o initrd.img-2.6.33.7.2-rt 2.6.33.7.2-rt30
(這一步是必須的,否則是起不來系統的)
六、修改grub.cfg
在grub.cfg中找到debian原有的一段配置檔案,修改紅色部分就可以了。
menuentry 'Debian GNU/Real Time Linux, with Linux2.6.33.7.2-rt30' --class debian --class gnu-linux --classgnu --class os {
insmod part_msdos
insmod ext2
set root='(hd0,msdos2)'
search --no-floppy --fs-uuid --set a9f7fdc4-3975-4e23-aa13-6e22d35d6ad9
echo 'Loading Linux 2.6.33.7.2--rt30 ...'
linux /boot/vmlinuz-2.6.33.7.2-rt30root=UUID=a9f7fdc4-3975-4e23-aa13-6e22d35d6ad9 ro quiet
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-2.6.33.7.2-rt
}
修改後,重啟就可以選擇進入系統了
七、基準測試
在這裡下載基準測試程式:
下載後解壓,
$make all
測試:
非實時核心:
[email protected]:/home/unanao/Experiment/linux/rt-tests# ./cyclictest -t1 -p 80-n -i 10000 -l 10000
policy: fifo: loadavg: 0.02 0.16 0.14 2/303 3109
T: 0 ( 2599) P:80 I:10000 C: 10000 Min: 8 Act: 48 Avg: 108 Max: 8294
[email protected]:/home/unanao/Experiment/linux/rt-tests# ./cyclictest -t1 -p 80-i 500 -l 100000
policy: fifo: loadavg: 0.21 0.14 0.12 1/306 3129
T: 0 ( 2690) P:80 I:500 C: 10000 Min: 10 Act: 31 Avg: 77 Max: 7943
實時核心:
[email protected]:/home/unanao/Experiment/linux/rt-tests# ./cyclictest -t1 -p 80-n -i 10000 -l 10000
policy: fifo: loadavg: 0.02 0.16 0.14 2/303 3109
T: 0 ( 3107) P:80 I:10000 C: 10000 Min: 6 Act: 54 Avg: 65 Max: 282
[email protected]:/home/unanao/Experiment/linux/rt-tests# ./cyclictest -t1 -p 80-i 500 -l 100000
policy: fifo: loadavg: 0.21 0.14 0.12 1/306 3129
T: 0 ( 3129) P:80 I:500 C: 100000 Min: 12 Act: 75 Avg: 91 Max: 418
比較可知實時核心的實時性更好。
八、參考文件
[3]《Linux 核心設計與實現》
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
網路參考#2
yum install ncurses-devel (這個包在make menuconfig時要用到,本人測試過)
2、到www.kernel.org下載核心linux-2.6.22.6.tar.gz
將新核心copy到/usr/src
# tar -jxvf linux-2.6.27.tar.bz2
# cd linux-2.6.27
# make mrproper
# make menuconfig (這裡就是設定編譯成模組或是否編譯進核心或不選)
# make clean
# make bzImage
# make modules
# make modules_install 後可以執行make install 自動化完成
# mkinitrd /boot/initrd_2.6.27.img 2.6.27
執行mkinitrd命令時,提示”No module dm-mem-cache found for kernel 2.6.27, aborting.”時,表明該版本的mkinitrd有bug。
解決方法,1是當使用mkinitrd時,使用”-without-dmraid”這個引數。2是在使用mkinitrd之前,先建立一個noraid檔案。建立方法如下:
# echo “DMRAID=no” > /etc/sysconfig/mkinitrd/noraid
# chmod 755 /etc/sysconfig/mkinitrd/noraid
然後再執行mkinitrd命令。
這裡我採用了第一種辦法
# mkinitrd /boot/initrd-2.6.27.img 2.6.27 –without-dmraid
執行完mkinitrd後,就要在啟動選單中增加編譯好的核心資訊,以便啟動時可以選擇核心版本。
# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.27
# cp System.map /boot/System.map-2.6.27
開啟/etc/grub.conf檔案,增加以下內容到檔案結尾。
title CentOS (2.6.27)
root (hd0,0)
kernel /vmlinuz-2.6.27 ro root=LABEL=/
initrd /initrd-2.6.27.img
儲存,重啟,進行grub的啟動選單中,選擇”CentOS(2.6.27)”,即可使用編譯好的核心。
第二種方法 如果你覺得make modules_install後面的步驟太麻煩的話,就直接用下面的命令讓系統幫你做好了
# make install
下面是執行時的提示資訊:
sh /usr/src/linux-2.6.27/arch/x86/boot/install.sh 2.6.27 arch/x86/boot/bzImage System.map “/boot”
WARNING: No module dm-mem-cache found for kernel 2.6.27, continuing anyway
WARNING: No module dm-message found for kernel 2.6.27, continuing anyway
WARNING: No module dm-raid45 found for kernel 2.6.27, continuing anyway
這些只是提示,對系統沒有什麼影響,經本人查閱相關的資料。
可能是核心和mkinitrd的BUG,大家可以參考一下這篇文章
通過給核心打dm-raid45這個補丁,可以解決掉”WARNING: No module dm-raid45 found for kernel 2.6.29.4, continuing anyway”這個提示
http://people.redhat.com/~heinzm/sw/dm/dm-raid45/
至於其他的兩個沒有仍然找不到解決的辦法
更簡單的yum -y upgrade kernel kernel-devel
# make mrproper 刪除目錄下殘留的.o檔案和其他從屬檔案, $ make mrproper 刪除目錄下殘留的.o檔案和其他從屬檔案,