1、實驗環境linux
Vmware15.5, Ubuntu18.04, linux-5.6.14內核(以這個環境爲例)shell
2、準備工做ubuntu
1. 安裝好虛擬機,安裝Ubuntu系統。(本次實驗用的是虛擬機沒有用雙系統,由於實驗中有一要求是實現文件交互,因此採用虛擬機,稍後也會下載相應工具)vim
(另外,若是電腦配置夠的話,能夠將虛擬機配置高端一點,由於後面 make 這個步驟很花時間。)app
2. 下載linux-5.6.14內核(https://www.kernel.org/)(linux內核官網,下載壓縮包tarball便可)工具
3. 如今咱們就須要下載VMware Tools,一個能夠將文件從主機拖入客戶機的工具。(由於目前虛擬機掛起狀態,因此它不可選)flex
4. VMware Tools下載完成以後,會有一個CD圖標。而後咱們進入所在路徑 /media,能夠將壓縮包拖入桌面,進行解壓。es5
解壓命令:sudo tar -zxvf VMware Tools-...... (直接用Tab鍵補全文件名稱以避免出錯)
spa
解壓完成後,進入/vmware-tools-distrib路徑,後執行命令 sudo ./vmware-install.pl 開始安裝,一路回車。線程
由於我已經安裝過,就再也不截圖演示。若是安裝出現問題,能夠自行百度。
安裝完成後,重啓虛擬機。
5. 如今咱們能夠將下載的linux-5.6.14壓縮包拖入虛擬機。若不能拖入則說明VMware Tools安裝出問題。
拖入後,執行命令 sudo mv linux-5.6.14.tar.xz /usr/src 而後進入/usr/src路徑,執行命令 sudo tar -xvf linux-5.6.14.tar.xz
就可看到生成linux-5.6.14文件夾。
到此咱們的準備工做就完成了。
3、實驗過程
(實驗過程我以root用戶進行,經過命令 su 就可進入 root用戶。若是報錯有多是沒有設置密碼,輸入 sudo passwd,設置密碼便可)
咱們先來看一下默認的內核。在終端輸入 uname -a。(這個是重裝虛擬機以前的圖,因此虛擬機、用戶名稱不同。無傷大雅)
下來咱們開始編譯本身的內核:
1. cd linux-5.6.14,進入該路徑。咱們經過 make 來編譯內核,因此咱們須要環境和依賴。
1. apt install gcc
2. apt install make
3. apt install gcc make libncurses5-dev openssl libssl-dev
4. apt install pkg-config
5. apt install bison
6. apt install flex
7. apt install libelf-dev
安裝完成咱們就能夠進行下一步工做。執行命令 make nconfig ,進入下面界面(若是make nconfig過程當中報錯,按照錯誤提示安裝相應依賴便可)。
咱們將內核名稱自行命名。進入 General setup ,修改 Local version。修改完成後保存(此處會保存爲.config),後退出。
在此步驟作一點說明,此處咱們僅修改了名稱,別的選項都是默認。由於選項設置麻煩,因此不作說明,但這會致使下一步
make的時候比較費時間。能夠自行在網上找簡潔的 .config 文件,將文件拷到虛擬機便可。
2. 好了, .config 文件咱們已經完成了。下一步就開始 make。執行命令 make -j4 (4個線程跑,會快不少。-j4 是可選項,取決於
你的虛擬機配置)。這一步驟須要 3h 左右(我第一次跑三小時,後來4線程跑一個多小時。這個過程會有 warning 內存過大,
這個不用管,注意warning信息,若是須要能夠暫停更改環境配置)。
3. 通過漫長的等待,make 這步終於完成了。而後執行命令 make modules_install 。
4. 執行命令 make install。完成後重啓虛擬機。
好啦。到此內核編譯就完成了。咱們開始內核引導,必需要看到屬於本身的內核~
重啓事後,終端執行 cd /boot/ 。System.map - * 就是要用的東西。
執行命令 sudo update initramfs -c -k 5.6.1418130500337-ssc (這裏用你的文件名稱替換哦!)
完成後執行命令 sudo update-grub 。會生成一個.img文件,這是由內核源碼生成的內核鏡像。
咱們須要修改grub,執行命令 cd /boot/grub/ ,修改 grub.cfg文件。執行命令 sudo vim grub.cfg
到這裏就已經修改完成了。重啓虛擬機。
再次進入執行命令 uname -a , 即可看到本身的內核。
4、總結與心得
這裏說一下對內核的一些瞭解。ubuntu = kernel + users application + shell,是一個介於通常程序與硬件之間的東西。
好比c語言中的 printf(), 就是 printf() -> c庫中的printf() -> c庫中的write() -> kernel中的 write()。
下一篇是打算是關於系統調用,這也是實驗內容之一。
實驗的完成也是磕磕絆絆,全部的失敗都歸結於錯誤的開始。由於這是幾天前完成的實驗,我沒有保留
完整的實驗現場,因此中間內容可能展現不到位,不過若是有錯歡迎評論指出,初學者的路還很長。