若是你用 git 下載源碼,就執行如下命令:html
cd linux-stablegit checkout linux-3.x.y
若是是直接下載壓縮文件,用如下命令進入源碼目錄:linux
cd linux-3.x.y
若是你想把內核安裝到本身的系統上,最安全的方法是使用你安裝好的發行版擁有的配置文件。你能夠在 /boot 目錄找到當前發行版的內核配置文件:git
cp /boot/config-3.x.y-z-generic .config
運行下面的命令,能夠在當前內核配置的基礎上修改一些小地方,而後產生新的內核配置文件。好比說新的內核比你的 Ubuntu 發行版自帶的內核多了些新功能,而你正好須要用到它們,這個時候你就要修改配置了。github
make oldconfig
完成配置後,就能夠編譯了:安全
make all
完成編譯後,安裝這個新的內核:app
sudo "make modules_install install"
上面的命令安裝新內核,並把新內核做爲啓動項添加到 grub 文件(LCTT:就是你下次開機時會多出一個開機選項)。好了你能夠重啓電腦,而後選擇新的內核啓動系統。等等!先別衝動,在重啓電腦以前,咱們保存下編 譯內核產生的日誌,用於比較和查找錯誤(若是有錯誤發生的話):測試
dmesg -t > dmesg_currentdmesg -t -k > dmesg_kerneldmesg -t -l emerg > dmesg_current_emergdmesg -t -l alert > dmesg_current_alertdmesg -t -l crit > dmesg_current_alertdmesg -t -l err > dmesg_current_errdmesg -t -l warn > dmesg_current_warn
正常的話,dmesg 不會輸出 emerg, alert, crit 和 err 級別的信息。若是你不幸看到這些輸出了,說明內核或者你的硬件環境有問題。spa
再介紹一些重啓前的須要執行的操做。誰也不能保證新內核可以正常啓動,因此請不要瀟灑地把老內核刪除,至少保留一個穩定可用的內核在系統上。修改一下 /etc/default/grub 文件:翻譯
使用 earlyprink=vga 做爲內核啓動選項,把系統早期啓動的信息打印到顯示屏上:debug
GRUB_CMDLINE_LINUX="earlyprink=vga"
將 GRUB_TIMEOUT 的值設置成10秒到15秒之間的值,保證在開機啓動的時候你有足夠的時間來選擇啓動哪一個內核:
取消對 GRUB_TIMEOUT 的註釋,並把它設置爲10:GRUB_TIMEOUT=10
註釋掉 GRUB_HIDDEN_TIMEOUT 和 GRUB_HIDDEN_TIMEOUT_QUIET
運行 update-grub 命令,更新 /boot 目錄下的 grub 配置文件:
sudo update-grub
如今能夠重啓系統了。新內核起來後,比較新老內核的 dmesg 信息,看看新的內核有沒有編譯錯誤。若是新內核啓動失敗,你須要經過老內核啓動系統,而後分析下爲何失敗。
若是你想開上內核快車道,追求與時俱進,那就去下載 mainline 狀態的內核或 linux-next 狀態的內核(LCTT:讀者可進入 kernel.org 獲取代碼,linux 代碼被分爲4種狀態:mainline, stable, longterm, linux-next)。安裝測試 mainline 狀態或 linux-next 狀態的內核,你就能夠在正式發佈以前幫助內核找到並修復裏面的 bug。
mainline 狀態的內核源碼:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
linux-next 狀態的內核源碼:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
編譯安裝這兩種內核的步驟與編譯安裝穩定版內核同樣。按以前講過的步驟來就好了。
Linux 內核的補丁是一個文本文件,包含新源碼與老源碼之間的差別。每一個補丁只包含本身所依賴的源碼的改動,除非它被特地包含進一系列補丁之中。打補丁方法以下:
patch -p1 < file.patchgit apply --index file.patch
兩種方法均可以打補丁。可是,若是你要打的補丁包含一個新文件,git 命令不能識別這個新增的文件,也就是說這個新文件在 git 裏面屬於 untracked 文件(LCTT:玩 git 的人對這個會比較熟悉,就是文件處於未被跟蹤的狀態,你須要使用 git add 命令將文件放入暫存區)。git diff 命令不會將這個文件的增量顯示出來,而且 git status 命令會顯示這個文件處於 untracked 狀態。
大多數狀況下,有個沒被跟蹤的文件,對於編譯安裝內核來講沒什麼問題,可是 git 操做就會出現一些問題了: git reset --hard 命令不會刪除這個新加的文件,而且接下來的 git pull 操做也會失敗。你有多種選擇來避免上面所說的情況:
選項1,不跟蹤這個新文件:
若是打補丁後新添加了文件,在 git reset --hard 前使用 git clean 命令來刪除沒有被跟蹤的文件。舉個例子,git clean -dfx 命令會強制刪除未被跟蹤的目錄和文件,忽略在 .gitigniore 文件內規定的文件。若是你不在意哪些文件會被刪除,你可使用 -q 選項讓 git clean 命令進入安靜模式,不輸出任何處理過程。
選項2,跟蹤新文件:
你能夠在使用 git apply --index file.patch 命令後讓 git 跟蹤打完補丁後新產生的文件(LCTT:使用 git add 命令),就是讓 git 把文件放入 index 區域。作完這個後,git diff 命令會將新文件的增量打印出來,git status 也會顯示者這是一個正常的新增文件。
via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,1
來源: linuxjournal
原文: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,1 做者: Shuah Khan
譯者: bazz2
本文是原創投遞或翻譯投遞,Linux中國首發地址:http://linux.cn/article-3629-1.html
歡迎轉載,敬請在正文中標註並保留原文/譯文連接和做者/譯者等信息