內核升級
目標:
升級Linux內核隨意改變,可從舊版本到新版本,也可由新版本降低到舊版本。
當前環境:
Vmware虛擬機中安裝Ubuntu 14.04 LTS 其Linux內核為3.19.2用uname -a可以查看所有版本信息
虛擬機配置為:內存1G,硬盤20G,其它默認設置。Ubuntu安裝時選擇的是“使用整塊硬盤”。
內核升級准備工作:
1,首先需要到www.kernal.org下載最新的Linux內核源碼。這里下載的是3.14.3版本。
2,需要正確編譯內核,需要安裝gcc以及安裝相應的依賴包和庫,Ubuntu中已經自帶了gcc編譯器,但是仍然需要安裝一些其它的類庫,整個過程可以使用Ubuntu的apt-get install命令方便的完成。
具體命令為:sudo apt-get install build-essential
網絡上有些說明中還指出,需要安裝 kernel-package這個東西,因此也一並裝上了。
sudo apt-get install kernel-package
為了方便下載,我把Linux 3.14.3源碼包下載在了windows中文件名為linux-3.14.3.tar.xz,要將它復制到虛擬機的Linux里,直接復制顯然不可以,因此使用SSH方式復制。
為實現SSH登錄和傳送文件,需要安裝openSSH,只需要安裝Server就可以。同樣可以使用sudo apt-get install openssh-server命令完成。
安裝完成后使用FileZilla軟件,通過sFtp協議登錄並將源碼復制到linux中。
復制完成后,就可以正式開始升級內核了。
內核編譯前的配置:
進入Linux系統,為了不出現權限問題,我直接用su -命令用root用戶操作。Ubuntu是一個桌面系統,可能是出於安全性考慮,Ubuntu安裝好后不能直接用su命令切換root,會提示su認證失敗,這是由於Ubuntu鎖住了root用戶,這時只需要執行sudo password命令,修改UNIX密碼即可,密碼就是安裝Ubuntu時設置的那個。
創建一個目錄(我直接在根目錄下創建了一個linux-kernel目錄)用來作為編譯內核的工作目錄,將下載的Linux源碼包復制到 /linux-kernel工作目錄下並用命令 tar -xvJf解壓
tar -xvJf linux-3.14.3.tar.xz
解壓后得到一個文件夾,cd 進去之后可以看到目錄中有以下內容:
根據readme文檔,不建議將內核解壓到/usr/src目錄下,因此,工作目錄設置在/linux-kernel下。但是有好多教程上說放在src目錄也沒有問題,這里沒有嘗試。
執行 make mrproper,如果是剛解壓的包,沒必要執行這個操作,但是為了安全,我也執行了,雖然什么反應都沒有。
執行make menuconfig配置:
出現了這個錯誤,根據提示內容,這是因為缺少ncurses庫,根據網上的解決方法,直接用下面的命令就可以自動安裝:
sudo apt-get install libncurses5-dev
不過為了練習也是為了測試一下gcc是否工作正常,我從網上下載了源碼包,嘗試手動安裝,首先解壓包到一個目錄,然后進入該目錄,執行sudo ./configure腳本進行配置。
整個過程該腳本會自動完成配置,並且在最后提示各個組件安裝到的目錄。
配置完成后執行make,等待編譯完成……這個大概就用了幾分鍾時間。
編譯完成后,執行 sudo make install安裝,沒有報錯,說明已經安裝好了。
回到編譯Linux的工作目錄,再次進行make menuconfig 這時就可以正常配置了。網上有些教程說可以使用原來系統的配置文件,因此我復制c下原來的內核配置文件,然后命名為 .config
cp /boot/config-3.13.0-24-generic ./.config
此時,工作目錄的內容如下
安裝好ncurses庫之后,再次執行make menuconfig就可以正常配置了,配置界面如下:
在配置界面中選擇Load項,然后加載.config 文件,然后Save一下,最后Exit退出。
內核編譯:
接下來執行make進行編譯,編譯過程用了相當長的時間,如果是多核處理器,可以使用make -j4將編譯拆分成4個線程進行。下面的圖片是編譯過程的截圖:
由於用的是虛擬機,所以編譯過程持續了三個多小時,然而中間竟然出現這個錯誤……查資料得知,這個錯誤可能是沒有swap分區或者swap分區空間不足導致的。
用free -m查看后如下(這已經是第二天了,中間關閉了電腦,因此數據不是當時出錯時的):
swap分區有509M,說明不是沒有swap而是分區大小不夠,在后來的編譯過程中,我用free命令查看過內存,發現swap已經使用了200m多,隨着編譯過程還會繼續增加,所以swap分區大小不夠是非常可能的,重新分區不太方便,因此增加一個文件用作swap
創建目錄 /swap,在此目錄下用dd命令創建一個文件作swapfile作為swap使用,並激活該swap,這里count我寫了1024k也就是創建1G大小的空間。
命令如下:
mkdir /swap
cd /swap
dd if=/dev/zero of=swapfile bs=1024 count=1024k
mkswap swapfile
swapon swapfile
現在交換分區已經達到了1533mb,感覺應該足夠了。然后進入工作目錄,執行make mrproper后重新編譯內核……
這個swap文件在每次開機后並不會自動加載,而是每次都需要執行swapon命令才可以,網上有些解決方案是將這個swap信息寫到配置文件/etc/fstab中。
再次編譯之前,我修改了一些配置,去掉了用不到的文件系統支持模塊以及無線網絡等功能用來減少編譯的文件。
也不知道過了多長時間……反正這次終於沒有出錯了。
內核安裝:
執行make module_install安裝內核模塊
這個過程要比編譯快很多。
最后執行make install安裝新內核
執行完成后,新的內核就被自動安裝到系統之中,不需要進行額外的配置就可以重啟進入新內核。
重啟之后,再次使用uname -a之后,可以看到新的版本信息以及編譯時間等信息,這時,Linux內核版本已經變成3.14.3
至此,內核升級完成。
總結:
內核升級的過程並不復雜,總結起來,整個過程就是:下載源碼包 -- 解壓 -- make mrproper清理 -- make menuconfig配置 -- make編譯-- make module_install安裝模塊 -- make install安裝內核 -- 重啟這幾個步驟,其中每次遇到問題都需要根據提示信息自己分析並查找相關資料,查找資料的過程就是一個學習的過程,通過解決這些問題,可以逐步明確Linux系統的內容和“脾氣”,Linux說到底還是需要動手,多動手才能理解透徹,才能用的上手。
刪除kernel啟動項
如果要在GRUB啟動項中刪除之前自己編譯安裝的kernel版本,則只需要將/lib/modules和/boot目錄下的安裝時copy過來的相關東西刪除。然后再
調用sudo update-grub,它會自動刪除/boot/grub/grub.cfg中對應的kernel版本的啟動項。