LINUX 系統管理實務
第八組:校能調教 (Kernel Tunning)

101213531

涂書維

101213515

林家敏

101213538

陳姝妤
目錄
壹、

題目發想-改善我們的科技。 ....................................................................... 2

貳、

我們所使用到的設備、來源。 ..................................................................... 3

參、

在軟體方面所使用到的。 ............................................................................ 3

肆、

實作的過程。 .............................................................................................. 3

一、過程 ............................................................................................................ 3
二、問題、解決.................................................................................................. 7
伍、

課程上教學所使用到的技巧。 ..................................................................... 8

陸、

實際成果 ..................................................................................................... 8

一、圖表比較 ..................................................................................................... 8

i.

CPU ............................................................................................................ 8

ii.

Multithreaded .............................................................................................. 9

iii.

I/O ............................................................................................................ 10

柒、

參考、附件、來源。 ................................................................................. 11
壹、 題目發想-改善我們的科技。
因為 RPI 本身的硬體限制,使得需要做大量運算的工作,得花費相當多的
時間。為了改善這個問題,我們希望透過交叉編譯與核心調校減少工作所需的時
間。

SLAVE

1. RPI 設定檔

個人電腦

2. Arm 函式庫

HOST
Raspberry Pi

4.

編譯完成

移回 Raspberry
Pi

3. Raspbian
核心映像檔

介紹 HOST、SLAVE
1.交叉編譯指的是將編譯核心的工作從 Raspberry Pi 上轉交給其它 SLAVE 電腦
執行,為了完成這個工作,我們需要先從 Raspberry Pi 上抓取設定檔至 SLAVE
電腦。
2.因 SLAVE 可能與 Host 電腦有不同的架構,所以我們需要在 SLAVE 電腦建立
HOST 的編譯環境。
3.編譯完成後會產生一個壓縮映像檔。
4.我們將映像檔解壓縮後,就能移回 Raspberry Pi 上,正常執行。
貳、 我們所使用到的設備、來源。
名稱

細項

一台個人電腦

來源

CPU: Intel Core i5-3470 CPU
@ 3.20GHz

隨身碟一支

16GB

B13 實驗室提供

Raspberry Pi 一台

課堂提供

參、 在軟體方面所使用到的。
一、RPI 核心原始碼:
二、GCC
三、交叉編譯工具
四、Benchmark SysBench
五、以上軟體來源我們都是從 RPI 官網取得的。

肆、 實作的過程。
過程
1. Cross – Compiling
 設定環境



$ apt-get update && apt-get dist-upgrade//更新來源及套件庫



$ apt-get git
(Binary Utilities) (Header 相關)



$ apt-get binutils



$ apt-get newlib(new library)



$ apt-get gcc(C 語言編譯工具)



說明:
//為了讓 SLAVE 看懂 HOST 的 GCC,需要在 SLAVE 上安裝 HOST 硬體架
構的編譯環境。
// HOST:想編譯的硬體環境;SLAVE:你使用的編譯環境。
// RPI 需要 arm 的 hp-gnueabi toolchain,保險起見可以搜尋所有的 gcc
hp-gnueabi 硬體相關套件並全部安裝起來。

$mkdir /cc
//建立獨立資料夾以存放 Cross-Compiling 所需的所有套件及工具。

2. 編譯模組核心並安裝
(在獨立資料夾內)
$ git clone git://github.com/raspberrypi/firmware.git
// 韌體
$ git clone git://github.com/raspberrypi/linux.git
// raspberian 核心
$ git clone git://github.com/raspberrypi/tools.git
// CC 工具
$export
CCPREFIX=/cc/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm
2708hardfp-linux-gnueabi$export
PATH=$PATH:/cc/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bc
m2708hardfp-linux-gnueabi// 加入 excutable toolchain 路徑與環境變數。
// 加入 excutable toolchain 路徑方便 MAKE 執行。

(Optional)
// 當遇到問題時匯出這兩個 CC 用變數
$export
CC=/rpi/cc/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708
hardfp-linux-gnueabi-gcc
$export xbuild="arm-bcm2708hardfp-linux-gnueabi-"
( in /cc/linux )
$ make mrproper
// 清除之前的 MAKE 記錄 ( Optional )
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
// 也可用 make dep,修改 kernel、硬體相關的選項
$make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4
// 編譯核心,如果是多核心環境可以加上-j{N}參數,用 N 個核心編譯加快速度

$cd /cc/tools/mkimage
./imagetool-uncompressed.py ../../linux/arch/arm/boot/zImage
// 會在目前目錄(mkimage)產生 kernel.img。

$mkdir /cc/rslt

// 建立獨立資料夾存放 Output。

$mkdir /cc/rslt/boot
$mv kernel.img /cc/rslt/kernel_new.img
(開始編譯模組)
$cd /cc/
(mkdir:modules, in cc)
$cd /cc/linux/
$ make modules_install ARCH=arm CROSS_COMPILE=${CCPREFIX}
INSTALL_MOD_PATH=../modules

//安裝模組。

// 將新 kernel 需要的 firmware、module 及 lib 複製出來。
$cp /cc/modules/lib cc/rslt/
$cp /cc/firmware/boot/ bootcode.bin fixup.dat fixup_cd.dat start.elf /cc/rslt/boot
$cp /cc/firmware/hardfp/opt/vc /cc/rslt/

// mount RPI 的 SD 卡(ex. /tm2)
$cp -r /cc/rslt/lib /tm2/
$cp -r /cc/rslt/boot /tm2/boot/
$cp -r /cc/rslt/vc /tm2/opt/
$cp /cc/rslt/kernel_new.img /tm2/boot/

// 如果要修改 RPI 的 /boot/config.txt 就改成
kernel=kernel_new.img
#kernel=kernel.img

// 如果要修改 RPI 的 /boot/config.txt 就改成
#kernel=kernel_new.img
kernel=kernel.img
最後在 RPI 的 BIOS 裡面更換開機時讀取新的核心映像檔 到此核心編譯就
,
完成了。
問題、解決
1.

RPI 設定檔

SLAVE
個人電
2. Arm

HOST
4. 編譯完成

Raspberry Pi

移回 Raspberry Pi

3. Raspbian

核心映像檔

函式庫
腦

如果在編譯前,沒有先設定好編譯環境的話,編譯時會在執行到原始碼中某
一行發生錯誤,此時跳出的錯誤訊息會讓使用者難以發現造成此狀況的真正原
因。
而且,在編譯時發生問題,我們需要做各種檢查以刪除各種可能性,首先第
一個想到的可能是路徑設定 excutable toolchain 路徑設定錯誤 再來還要確認原
,
始碼是否正確下載成功,以及 toolchain 的 link 是否正確。一般來說,我們很難
馬上確立問題點是 slave 上的 library 缺失。
經過一連串的摸索,最終我在某一篇建構手機 ADT 環境的文章中找到了編譯
ARM 相關程式需要的函式庫與套件,才解決了這個問題。
伍、 課程上教學所使用到的技巧。
1.

Aptitude
1.

說明:aptitude search gcc

2.

Cat 確認文件檔內容

3.

Man

4.

Mkdir 建立資料夾

5.

cp -a 拷貝目錄,保留所有的資訊(ex.權限)

6.

ifconfig 找到自己的 IP 位置

陸、 實際成果
一、 圖表比較
CPU
我們用 SysBench 進行新舊核心之間的效能測試,每次測試都是執行
SysBench 30 次,之後算出平均值的結果。
測試一:我們用執行時間短的工作來做效能測試。
測試二:我們用執行時間長的工作來做效能測試。

3
平 2.5
均
執 2
行 1.5
時 1
間 0.5
秒 0

Old
New

( )

Mod
Test1

Test2
CPU

從測試結果可以知道新舊核心之間的 CPU 運算之間並沒有顯著的差異。

Multithreaded
測試三:我們利用 Sysbench 的 multithreaded test 進行新舊核心之間的效能測試
測試結果可以看出新核心有較高效率的排程策略。
( )

平
均
執
行
時
間
秒

6.8
6.7
6.6
6.5
6.4
6.3
6.2
6.1

Old
New
Mod
Test3
Multithreaded
因此能顯著的提升效率

I/O
測試四:我們利用 Sysbench 的 I/O test 進行新舊核心之間的效能測試
( )

平
均
執
行
時
間
秒

2.9
2.8
2.7
2.6
2.5
2.4
2.3
2.2

Old
New
Mod
Test4
I/O

測試結果可以看出新核心能大幅的提升效率。

柒、 參考、附件、來源。
Raspberry Pi 台灣樹莓派
http://www.raspberrypi.com.tw/resources/
鳥哥的 Linux 私房菜
http://linux.vbird.org/linux_basic/0520source_code_and_tarball.php
ARM 核心交叉編譯
http://oss.org.cn/ossdocs/rt_embed/arm_linux.html
Farnell 所提供的技術文件

http://www.element14.com/community/community/raspberry-pi?view=documents

Linux 期末報告

  • 1.
    LINUX 系統管理實務 第八組:校能調教 (KernelTunning) 101213531 涂書維 101213515 林家敏 101213538 陳姝妤
  • 2.
    目錄 壹、 題目發想-改善我們的科技。 ....................................................................... 2 貳、 我們所使用到的設備、來源。..................................................................... 3 參、 在軟體方面所使用到的。 ............................................................................ 3 肆、 實作的過程。 .............................................................................................. 3 一、過程 ............................................................................................................ 3 二、問題、解決.................................................................................................. 7 伍、 課程上教學所使用到的技巧。 ..................................................................... 8 陸、 實際成果 ..................................................................................................... 8 一、圖表比較 ..................................................................................................... 8 i. CPU ............................................................................................................ 8 ii. Multithreaded .............................................................................................. 9 iii. I/O ............................................................................................................ 10 柒、 參考、附件、來源。 ................................................................................. 11
  • 3.
    壹、 題目發想-改善我們的科技。 因為 RPI本身的硬體限制,使得需要做大量運算的工作,得花費相當多的 時間。為了改善這個問題,我們希望透過交叉編譯與核心調校減少工作所需的時 間。 SLAVE 1. RPI 設定檔 個人電腦 2. Arm 函式庫 HOST Raspberry Pi 4. 編譯完成 移回 Raspberry Pi 3. Raspbian 核心映像檔 介紹 HOST、SLAVE 1.交叉編譯指的是將編譯核心的工作從 Raspberry Pi 上轉交給其它 SLAVE 電腦 執行,為了完成這個工作,我們需要先從 Raspberry Pi 上抓取設定檔至 SLAVE 電腦。 2.因 SLAVE 可能與 Host 電腦有不同的架構,所以我們需要在 SLAVE 電腦建立 HOST 的編譯環境。 3.編譯完成後會產生一個壓縮映像檔。 4.我們將映像檔解壓縮後,就能移回 Raspberry Pi 上,正常執行。
  • 4.
    貳、 我們所使用到的設備、來源。 名稱 細項 一台個人電腦 來源 CPU: IntelCore i5-3470 CPU @ 3.20GHz 隨身碟一支 16GB B13 實驗室提供 Raspberry Pi 一台 課堂提供 參、 在軟體方面所使用到的。 一、RPI 核心原始碼: 二、GCC 三、交叉編譯工具 四、Benchmark SysBench 五、以上軟體來源我們都是從 RPI 官網取得的。 肆、 實作的過程。 過程 1. Cross – Compiling  設定環境  $ apt-get update && apt-get dist-upgrade//更新來源及套件庫  $ apt-get git
  • 5.
    (Binary Utilities) (Header相關)  $ apt-get binutils  $ apt-get newlib(new library)  $ apt-get gcc(C 語言編譯工具)  說明: //為了讓 SLAVE 看懂 HOST 的 GCC,需要在 SLAVE 上安裝 HOST 硬體架 構的編譯環境。 // HOST:想編譯的硬體環境;SLAVE:你使用的編譯環境。 // RPI 需要 arm 的 hp-gnueabi toolchain,保險起見可以搜尋所有的 gcc hp-gnueabi 硬體相關套件並全部安裝起來。 $mkdir /cc //建立獨立資料夾以存放 Cross-Compiling 所需的所有套件及工具。 2. 編譯模組核心並安裝 (在獨立資料夾內) $ git clone git://github.com/raspberrypi/firmware.git // 韌體 $ git clone git://github.com/raspberrypi/linux.git // raspberian 核心 $ git clone git://github.com/raspberrypi/tools.git // CC 工具 $export CCPREFIX=/cc/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm
  • 6.
    2708hardfp-linux-gnueabi$export PATH=$PATH:/cc/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bc m2708hardfp-linux-gnueabi// 加入 excutabletoolchain 路徑與環境變數。 // 加入 excutable toolchain 路徑方便 MAKE 執行。 (Optional) // 當遇到問題時匯出這兩個 CC 用變數 $export CC=/rpi/cc/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708 hardfp-linux-gnueabi-gcc $export xbuild="arm-bcm2708hardfp-linux-gnueabi-" ( in /cc/linux ) $ make mrproper // 清除之前的 MAKE 記錄 ( Optional ) $ make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig // 也可用 make dep,修改 kernel、硬體相關的選項 $make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig $ make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4 // 編譯核心,如果是多核心環境可以加上-j{N}參數,用 N 個核心編譯加快速度 $cd /cc/tools/mkimage ./imagetool-uncompressed.py ../../linux/arch/arm/boot/zImage // 會在目前目錄(mkimage)產生 kernel.img。 $mkdir /cc/rslt // 建立獨立資料夾存放 Output。 $mkdir /cc/rslt/boot $mv kernel.img /cc/rslt/kernel_new.img
  • 7.
    (開始編譯模組) $cd /cc/ (mkdir:modules, incc) $cd /cc/linux/ $ make modules_install ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=../modules //安裝模組。 // 將新 kernel 需要的 firmware、module 及 lib 複製出來。 $cp /cc/modules/lib cc/rslt/ $cp /cc/firmware/boot/ bootcode.bin fixup.dat fixup_cd.dat start.elf /cc/rslt/boot $cp /cc/firmware/hardfp/opt/vc /cc/rslt/ // mount RPI 的 SD 卡(ex. /tm2) $cp -r /cc/rslt/lib /tm2/ $cp -r /cc/rslt/boot /tm2/boot/ $cp -r /cc/rslt/vc /tm2/opt/ $cp /cc/rslt/kernel_new.img /tm2/boot/ // 如果要修改 RPI 的 /boot/config.txt 就改成 kernel=kernel_new.img #kernel=kernel.img // 如果要修改 RPI 的 /boot/config.txt 就改成 #kernel=kernel_new.img kernel=kernel.img 最後在 RPI 的 BIOS 裡面更換開機時讀取新的核心映像檔 到此核心編譯就 , 完成了。
  • 8.
    問題、解決 1. RPI 設定檔 SLAVE 個人電 2. Arm HOST 4.編譯完成 Raspberry Pi 移回 Raspberry Pi 3. Raspbian 核心映像檔 函式庫 腦 如果在編譯前,沒有先設定好編譯環境的話,編譯時會在執行到原始碼中某 一行發生錯誤,此時跳出的錯誤訊息會讓使用者難以發現造成此狀況的真正原 因。 而且,在編譯時發生問題,我們需要做各種檢查以刪除各種可能性,首先第 一個想到的可能是路徑設定 excutable toolchain 路徑設定錯誤 再來還要確認原 , 始碼是否正確下載成功,以及 toolchain 的 link 是否正確。一般來說,我們很難 馬上確立問題點是 slave 上的 library 缺失。 經過一連串的摸索,最終我在某一篇建構手機 ADT 環境的文章中找到了編譯 ARM 相關程式需要的函式庫與套件,才解決了這個問題。
  • 9.
    伍、 課程上教學所使用到的技巧。 1. Aptitude 1. 說明:aptitude searchgcc 2. Cat 確認文件檔內容 3. Man 4. Mkdir 建立資料夾 5. cp -a 拷貝目錄,保留所有的資訊(ex.權限) 6. ifconfig 找到自己的 IP 位置 陸、 實際成果 一、 圖表比較 CPU 我們用 SysBench 進行新舊核心之間的效能測試,每次測試都是執行
  • 10.
    SysBench 30 次,之後算出平均值的結果。 測試一:我們用執行時間短的工作來做效能測試。 測試二:我們用執行時間長的工作來做效能測試。 3 平2.5 均 執 2 行 1.5 時 1 間 0.5 秒 0 Old New ( ) Mod Test1 Test2 CPU 從測試結果可以知道新舊核心之間的 CPU 運算之間並沒有顯著的差異。 Multithreaded 測試三:我們利用 Sysbench 的 multithreaded test 進行新舊核心之間的效能測試 測試結果可以看出新核心有較高效率的排程策略。
  • 11.
  • 12.
    ( ) 平 均 執 行 時 間 秒 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2 Old New Mod Test4 I/O 測試結果可以看出新核心能大幅的提升效率。 柒、 參考、附件、來源。 RaspberryPi 台灣樹莓派 http://www.raspberrypi.com.tw/resources/ 鳥哥的 Linux 私房菜 http://linux.vbird.org/linux_basic/0520source_code_and_tarball.php ARM 核心交叉編譯 http://oss.org.cn/ossdocs/rt_embed/arm_linux.html Farnell 所提供的技術文件 http://www.element14.com/community/community/raspberry-pi?view=documents