安裝好內核後,試試能不能啓動它。能啓動的話,檢查 dmesg 看看有沒有隱藏的錯誤。試試下面的功能:php
網絡(Wifi 或者網線)是否可用?html
ssh 是否可用?linux
使用 ssh 遠程傳輸文件。git
使用 git clone 和 git pull 命令。github
用用網絡瀏覽器。瀏覽器
查看 email。網絡
使用 ftp, wget 等軟件下載文件。ssh
播放音頻視頻文件。函數
連上 USB 鼠標等設備。工具
使用 dmesg 查看隱藏的問題,對於定位新代碼帶來的 bug 是一個好方法。通常來講,dmesg 不會輸出新的 crit, alert, emerg 級別的錯誤信息,也不該該出現新的 err 級別的信息。你要注意的是那些 warn 級別的日誌信息。請注意 warn 這個級別的信息並非壞消息,新代碼帶來新的警告信息,不會給內核帶去嚴重的影響。
dmesg -t -l emerg
dmesg -t -l crit
dmesg -t -l alert
dmesg -t -l err
dmesg -t -l warn
dmesg -t -k
dmesg -t
下面的腳本運行了上面的命令,而且將輸出保存起來,以便與老的內核的 dmesg 輸出做比較(LCTT:老內核的 dmesg 輸出在本系列的第二篇文章中 有介紹)。而後運行 diff 命令,查看新老內核 dmesg 日誌之間的不一樣。這個腳本須要輸入老內核版本號,若是不輸入參數,它只會生成新內核的 dmesg 日誌文件後直接退出,再也不做比較(LCTT:話是這麼說沒錯,但點開腳本一看,沒輸參數的話,這貨會直接退出,連新內核的 dmesg 日誌也不會保存的)。若是 dmesg 日誌有新的警告信息,表示新發布的內核有漏網之「蟲」,這些 bug 逃過了自測和系統測試。你要看看,那些警告信息後面有沒有棧跟蹤信息?也許這裏有不少問題須要你進一步調查分析。
執行壓力測試的一個好辦法是同時跑三四個內核編譯任務。下載各類版本的內核,同時編譯它們,並記錄時間。比較新內核跑壓力測試和老內核跑壓力測試所 花的時間,而後能夠定位新內核的性能。若是新內核跑壓力測試的時間比老內核的更長,說明新內核的部分模塊性能退步了。性能問題很難調試出來。第一步是找出 哪裏致使的性能退步。同時跑多個內核編譯任務對檢測內核總體性能來講是個好方法,可是這種方法涵蓋了多個內核模塊,好比內存管理、文件系統、DMA、驅動 等(LCTT:也就是說,這種壓力測試沒辦法定位到是哪一個模塊形成了性能的降低)。
time make all
咱們能夠在 Linux 內核自己找到多種測試方法。下面介紹一個很好用的功能測試工具集: ktest 套件
ktest 是一個自動測試套件,它能夠提供編譯安裝啓動內核一條龍測試服務,也能夠跑交叉編譯測試,前提是你的系統有安裝交叉編譯所須要的軟件。ktest 依賴於 flex 和 bison。詳細信息請參考放在 tools/testing/ktest 目錄下的文檔,你能夠自學成材。另外還有一些參考資料教你怎麼使用 ktest:
咱們來玩玩自測吧。內核源碼的多個子系統都有本身的自測工具,到目前爲止,斷點、cpu熱插拔、efivarfs、IPC、KCMP、內存熱插拔、 mqueue、網絡、powerpc、ptrace、rcutorture、定時器和虛擬機子系統都有自測工具。另外,用戶態內存的自測工具能夠利用 testusercopy 模塊來測試用戶態內存到內核態的拷貝過程。下面的命令演示瞭如何使用這些測試工具:
編譯測試:
make -C tools/testing/selftests
測試所有:(有些測試須要 root 權限,你須要以 root 用戶登入系統而後運行命令)
make -C tools/testing/selftests run_tests
只測試單個子系統:
make -C tools/testing/selftests TARGETS=vm run_tests
在 tools/testing 目錄下的另外一個測試套件是 fault-injection。failcmd.sh 腳本用於檢測 slab 和內存頁分配器的錯誤。這些工具能夠測試內核可否很好地從錯誤狀態中恢復回來。這些測試須要用到 root 權限。下面簡單介紹了一些當前能提供的錯誤檢測方法。隨着錯誤檢測方法的增長,這份名單也會不斷增加。最新的名單請參考 Documentation/fault-injection/fault-injection.txt 文檔。
failslab (默認選項)
產生 slab 分配錯誤。做用於 kmalloc(), kmemcachealloc() 等函數(LCTT:產生的結果是調用這些函數就會返回失敗,能夠模擬程序分不到內存時是否還能穩定運行下去)。
fail_page_alloc
產生內存頁分配的錯誤。做用於 allocpages(), getfree_pages() 等函數(LCTT:同上,調用這些函數,返回錯誤)。
fail_make_request
對知足條件(能夠設置 /sys/block//make-it-fail 或 /sys/block///make-it-fail 文件)的磁盤產生 IO 錯誤,做用於 generic_make_request() 函數(LCTT:全部針對這塊磁盤的讀或寫請求都會出錯)。
fail_mmc_request
對知足條件(能夠設置 /sys/kernel/debug/mmc0/fail_mmc_request 這個 debugfs 屬性)的磁盤產生 MMC 數據錯誤。
你能夠本身配置 fault-injection 套件的功能。fault-inject-debugfs 內核模塊在系統運行時會在 debugfs 文件系統下面提供一些屬性文件。你能夠指定出錯的機率,指定兩個錯誤之間的時間間隔,固然本套件還能提供更多其餘功能,具體請查看 Documentation/fault-injection/fault-injection.txt。 Boot 選項可讓你的系統在 debugfs 文件系統起來以前就能夠產生錯誤,下面列出幾個 boot 選項:
failslab=
fail_page_alloc=
fail_make_request=
mmc_core.fail_request=[interval],[probability],[space],[times]
fault-injection 套件提供接口,以便增長新的功能。下面簡單介紹下增長新功能的步驟,詳細信息請參考上面提到過的文檔:
使用 DECLARE_FAULT_INJECTION(name) 定義默認屬性;
詳細信息可查看 fault-inject.h 中定義的 struct fault_attr 結構體。
配置 fault 屬性,新建一個 boot 選項;
這步可使用 setup_fault_attr(attr, str) 函數完成,爲了能在系統啓動的早期產生錯誤,添加一個 boot 選項這一步是必需要有的。
添加 debugfs 屬性;
使用 fault_create_debugfs_attr(name, parent, attr) 函數,爲新功能添加新的 debugfs 屬性。
爲模塊設置參數;
爲模塊添加一些參數,對於配置錯誤屬性來講是一個好主意,特別是當新功能的應用範圍受限於單個內核模塊的時候(LCTT:不一樣內核,你的新功能可能須要不一樣的測試參數,經過設置參數,你的功能能夠沒必要爲了迎合不一樣內核而每次都從新編譯一遍)。
添加一個鉤子函數到錯誤測試的代碼中。
should_fail(attr, size) —— 當這個鉤子函數返回 true 時,用戶的代碼就應該產生一個錯誤。
應用程序使用這個 fault-injection 套件能夠指定某個具體的內核模塊產生 slab 和內存頁分配的錯誤,這樣就能夠縮小性能測試的範圍。
via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2
來源: linuxjournal
原文: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2 做者: Shuah Khan
譯者: bazz2
本文是原創投遞或翻譯投遞,Linux中國首發地址:http://linux.cn/article-3630-1.html
歡迎轉載,敬請在正文中標註並保留原文/譯文連接和做者/譯者等信息