1. 程式人生 > >Linux核心實時補丁PREEMPT_RT安裝

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檔案和其他從屬檔案,