Linux核心編譯與安裝:4.4.0-21→4.14.0
1. 背景
從事Linux環境下開發工作,一直想自己玩,純屬好奇,沒撒背景。
2. 編譯環境
zg-Linux etc # uname–a(檢視核心)
Linux zg-Linux 4.4.0-21-generic #37-UbuntuSMP Mon Apr 18 18:34:49 UTC 2016 i686 i686 i686 GNU/Linux
zg-Linux etc # lsb_release–a(檢視釋出版本)
No LSB modules are available.
Distributor ID: LinuxMint
Description: Linux Mint 18 Sarah
Release: 18
Codename: sarah
3. 編譯步驟
1) 下載核心原始碼
從https://www.kernel.org/pub/linux/kernel/網站上下載最新的Linux核心***(我下載的是linux-4.14.tar.xz,也就是4.14穩定版核心的第一個版本,不是最新)。
2) 部署核心原始碼
開啟終端,更改使用者許可權為root。
輸入mv linux-4.14.tar.gz /usr/src ------> 目的是把下載的核心原始碼檔案移到/usr/src目錄;
輸入cd /usr/src切換到該目錄下;
輸入tar zxvf linux-4.14.tar.gz ------>
說明:如果下載的是的.tar.xz檔案:先用 xz -d xxx.tar.xz 將 xxx.tar.xz解壓成 xxx.tar 然後,再用 tar xvfxxx.tar來解包。
輸入cd linux-4.14,切換到該目錄下;
輸入cp /boot/config-,然後按下Tab鍵,系統會自動填上該目錄下符合條件的檔名,然後繼續輸入 .config ------> 目的是使用在boot目錄下的原配置檔案。
簡單說明:
1. 操作可能需要root許可權;
2. 將下載的核心原始碼拷貝到/usr/src目錄並解壓;
3. 將當前系統的配置拷貝至待編譯的原始碼目錄,也就是以當前系統的配置編譯原始碼
3) 配置核心
配置核心的方法很多,主要有如下幾種:
1. #make menuconfig //基於ncurse庫編制的圖形工具介面
2. #make config //基於文字命令列工具,不推薦使用
3. #make xconfig //基於X11圖形工具介面
4. #make gconfig //基於gtk+的圖形工具介面
由於對Linux還處在初學階段,所以選擇了簡單的配置核心方法,即make menuconfig。在終端輸入make menuconfig,等待幾秒後,終端變成圖形化的核心配置介面。進行配置時,大部分選項使用其預設值,只有一小部分需要根據不同的需要選擇。
對每一個配置選項,使用者有三種選擇,它們分別代表的含義如下:
<*>或[*]——將該功能編譯進核心
[]——不將該功能編譯進核心
[M]——將該功能編譯成可以在需要時動態插入到核心中的程式碼
說明:筆者輸入make menuconfig 後並沒有配置其他核心編譯配置(因為還不是特別懂),只是試了下此流程,是可用的。
4) 編譯核心
這步是時間最長的一個步驟,一般在2個小時左右。
編譯核心只需在終端(目錄:/usr/src/linux-4.14) 輸入:
make
(或者make –jN 以多執行緒編譯,N代表執行緒數,我的電腦是雙核4執行緒,N填了4),然後等待編譯的完成。
5) 編譯和安裝核心模組
make –j4 modules_install
6) 安裝核心
make –j4 install
7) 生成啟動
1. 產生initramfs image映像
zglinux src # mkinitramfs-o /boot/initrd.img-4.14.0
Warning: No support for locale: en_US.utf8
man解釋:
The mkinitramfs script generates an initramfs image. The initramfs is a compressed cpio archive.The archive can be used on a different box of the same arch with the corresponding Linux kernel. mkinitramfs is meant foradvanced usage. On your local box update-initramfs calls mkinitramfs with therelevant parameters. update-initramfs keepssha1sum of generated initramfs. It takes care to generate backups andeventually runs the bootloader.
翻譯:產生initramfs映像檔案,它是一個壓縮了cpio包。
2. 更新initramfs
zglinux src # update-initramfs-c -k 4.14.0
update-initramfs: Generating/boot/initrd.img-4.14.0
W: Possible missing firmware/lib/firmware/radeon/si58_mc.bin for module radeon
…
Warning: No support for locale: en_US.utf8
man解釋:
The update-initramfs script manages your initramfs images on your local box. Itkeeps track of(記錄、追蹤) the existing initramfs archives in /boot. There are three modes of operation create,update or delete. You must at leastspecify one of those modes.
3. 產生(更新)啟動配置
zglinux src # update-grub2
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zerovalue when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.14.0
Found initrd image: /boot/initrd.img-4.14.0
Found linux image:/boot/vmlinuz-4.4.0-21-generic
Found initrd image:/boot/initrd.img-4.4.0-21-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
done
man解釋:
update-grub is a stub for runninggrub-mkconfig -o /boot/grub/grub.cfg to generate a grub2 config file.
4. 檢視啟動配置檔案:/boot/grub/grub.cfg
用vim搜尋出有4.14.0的啟動項,到目前為止應該都成功了。
說明:以上步驟涉及到linux的啟動流程,請參閱其他文章:
4. 重啟
1) 重啟前:
zglinux grub # uname -a
Linux zglinux 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 1818:34:49 UTC 2016 i686 i686 i686 GNU/Linux
2) 重啟後
[email protected] ~ $ uname -a
Linux zglinux 4.14.0 #1 SMP Sun Mar 11 00:22:41 CST 2018 i686i686 i686 GNU/Linux
5. 結果:
實驗成功,之前安裝的ssh、smb等都不受影響。整個過程斷斷續續花費5個小時左右,包括第一次/usr目錄爆滿導致重新分割槽裝系統。
6. 可能出錯點:
1) #make menuconfig(配置核心階段)
報錯1(重灌系統前):
In file included fromscripts/kconfig/mconf.c:23:0:
scripts/kconfig/lxdialog/dialog.h:38:20:fatal error: curses.h: No such file or directory
報錯2(裝系統後):
zglinux linux-4.14 # make menuconfig
HOSTCC scripts/basic/fixdep
*** Unable to find the ncurses libraries orthe
*** required header files.
*** 'make menuconfig' requires the ncurseslibraries.
***
*** Install ncurses (ncurses-devel) and tryagain.
***
scripts/kconfig/Makefile:202: recipe fortarget 'scripts/kconfig/dochecklxdialog' failed
make[1]: ***[scripts/kconfig/dochecklxdialog] Error 1
Makefile:548: recipe for target'menuconfig' failed
make: *** [menuconfig] Error 2
原因:
兩個錯誤原因相同,因為make menuconfig是基於ncurse庫編制的圖形工具介面來配置核心,其依賴ncurses庫,所以需要安裝ncurses包:
apt-get installlibncurses5-dev
2) make編譯核心階段(步驟4)
報錯:
scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h: No suchfile or directory
原因:
編譯環境沒有openssl庫,所以需要安裝ssl包:
apt-get installlibssl-dev
3) 裝系統後make編譯報錯
報錯:
scripts/basic/fixdep.c:105:23:fatal error: sys/types.h: No such file or directory
原因:
沒有安裝libc的庫:
apt-get installlibc6-dev
4) 編譯告警(可忽略,重灌之後的好像沒有了,也不太清楚,因為重灌系統後的編譯過程我沒看,直接洗漱去了)
WARNING: modpost: Found 1 sectionmismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
5) zg-Linux etc # df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 392M 22M 371M 6% /run
/dev/sda1 14G 13G 623M 96% / ----快用爆了,最後還是用爆了
最後---確實把/目錄用爆了,編譯終止,看來要重新換系統了
ld: final link failed: No space left ondevice
scripts/Makefile.modpost:125: recipe fortarget 'drivers/net/wireless/p54/p54common.ko' failed
make[1]: ***[drivers/net/wireless/p54/p54common.ko] Error 1
此問題導致我重新分割槽重新裝了一次系統,具體分割槽、重灌linux系統請參考其他文章。此處只貼上我重灌的分割槽:
[email protected] ~ $ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.8G 0 1.8G 0% /dev
tmpfs 392M 6.5M 386M 2% /run
/dev/sda1 19G 3.0G 15G 18% /
/dev/sda7 138G 14G 118G 11% /usr
tmpfs 2.0G 876K 2.0G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda6 9.1G 411M 8.2G 5% /boot
/dev/sda8 290G 82M 275G 1% /home
cgmfs 100K 0 100K 0% /run/cgmanager/fs
tmpfs 392M 16K 392M 1% /run/user/1000
7. 參考:
1) bug解決
2) 編譯流程
8. 附圖幾張:
1) 核心編譯配置頁面(網上抄來,我的也一樣,忘記截圖了)
2) 重啟後的系統核心---沒騙你的。
相關推薦
Linux核心編譯與安裝:4.4.0-21→4.14.0
1. 背景從事Linux環境下開發工作,一直想自己玩,純屬好奇,沒撒背景。2. 編譯環境zg-Linux etc # uname–a(檢視核心)Linux zg-Linux 4.4.0-21-generic #37-UbuntuSMP Mon Apr 18 1
linux核心編譯與解除安裝
linux開行版的自帶核心不一定能滿足linux學習和某些特殊的要求,這時我們就不得不根據自己的需求重新安裝核心。這裡我介紹一些常用編譯核心的步驟。 編譯核心 一、一定是下載滿足需求的核心啦。 二、選擇核心配置:
ARM版Linux核心編譯與裁剪
Win7下使用Oracle VM VirtualBox搭建的Ubuntu11.10虛擬機器 1、建立交叉編譯環境: 下載交叉編譯器arm-linux-gcc-3.4.1.tar.bz2 tar jxvf arm-linux-gcc-3.
關於fedora上linux核心編譯和安裝
裝了幾次,方法比較簡單: 1.在核心目錄下,管理員許可權執行:make menuconfig 此時在desk-live 系統下可能沒有gcc ,無法make,裝gcc即可:yum install gcc 。順便裝了g++也可以:yum install gcc g++ 不管是
Linux 下編譯並安裝配置 Qt 4.53全過程
雙擊 win port 環境 簡單的 類型 http you ner 最近準備做 Nokia 的 Symbian,Maemo 下觸摸屏開發。考慮到程序的跨平臺可移植性,最終選擇使用 Qt 開發。相對來說,國內關於 Qt 相關文檔並不算很多。作者將 Linux
Maven本地jar包部署與安裝:dubbox-2.8.4.jar
Dubbox前身是阿里巴巴的Dubbo專案,阿里巴巴解散了Dubbo團隊後,由噹噹網繼續維護此專案,改名為Dubbox,但是沒有提交到Maven中央倉庫(突然發現阿里巴巴又開始進行dubbo維護了,停止維護時的版本是2.5.3,現在是2.6.4)這些就不管了,現在我手動將Dubbox的jar包安裝到本地倉庫中
鳥哥的Linux私房菜讀書筆記--核心的編譯與安裝
1、編譯核心與核心模組 [[email protected] linux-3.10.89]# make vmlinux <==未經壓縮的核心 [[email protected] linux-3.10.89]# make modules <
4.Linux核心設計與實現 P31---淺析程序終結關鍵do_exit(轉)
程序在退出時,必須釋放它所擁有的資源,並通過某種方式告訴父程序。程序的退出一般是顯示或隱式地呼叫了eixt(),或者接受了某種訊號。不過什麼原因退出,最終都呼叫了do_exit。用於程序退出的系統呼叫有兩個exit和exit_group,exit只是終止某個程序,而exit_group整個執行緒中的程序。它們
Linux實戰第九篇:基於Centos6.9+7.4主備DNS服務器搭建實戰
服務器搭建 word uda notes centos6 fcc bfc data 閱讀 個人筆記分享(在線閱讀): http://note.youdao.com/noteshare?id=7898fa39596740bfcc9ca42ad643f045&sub=28A00
Linux 環境下 PHP 擴展的變異編譯與安裝
font spa mysql 所有 sqli 技術 php 操作 size (操作系統 Centos7, 已安裝 mysqli 為例) 1,進入到 PHP 解壓後的源碼包的的 ext 文件夾 2,查看是否存在 mysqli 擴展 => ls 3,這裏既是所有 PHP
編譯linux核心原始碼,安裝、刪除核心
Linux核心編譯、安裝流程 本部落格屬於原創,轉載請註明來源 此處只講linux核心編譯步驟至於安裝虛擬機器,安裝ubuntu作業系統請自行百度 環境資訊: Linux作業系統:ubuntu16.04 核心版本:4.15.0-29-generic 需要編譯和安裝的核心原始碼
作業系統實驗一:linux核心編譯及新增系統呼叫
編譯環境 VMWare Ubuntu Desktop Ubuntu 18.04.1映象下載地址:點我下載 裝ubuntu很簡單,網上教程一大堆,記憶體分配多點。 新增系統呼叫步驟 解壓linux核心 想辦法,把上面的linux核心弄到ubuntu裡面,可
作業系統課程設計(一):linux核心編譯及新增系統呼叫
1.實驗目的 通過實驗,熟悉Linux作業系統的使用,掌握構建與啟動Linux核心的方法;掌握使用者程式如何利用系統呼叫與作業系統核心實現通訊的方法,加深對系統呼叫機制的理解;進一步掌握如何向作業系統核心增加新的系統呼叫的方法,以擴充套件作業系統的功能。 2.實
例項:tasklet實現軟中斷(學習《Linux核心設計與實現》記錄)
tasklet是通過軟中斷實現的,tasklet本身也是軟中斷。 關於tasklet更詳細的知識,還是建議看一下《Linux核心設計與實現》 本貼子只介紹一下具體的流程。 驅動程式原始碼: #include <linux/init.h> #include <linu
例項:基於4412-實現新增自己的系統呼叫函式(學習《Linux核心設計與實現》 記錄)
學習筆記: 在學習《linux核心設計與實現》過程中,瞭解到: 在Linux中,系統呼叫是使用者空間訪問核心的唯一手段(除異常和陷入之外)。 系統呼叫主要有三個作用: ①:為使用者空間提供一個硬體的抽象介面。 ②:系統呼叫保證了系統的穩定和安全。 ③:為了實現多工和虛擬記憶體(應用程
打造自己的專屬linux(四):Linux核心編譯過程簡介
linux在前不久剛釋出了最新的3.0核心,在linux的學習中,瞭解核心的編譯是一個必不可少的功課。前幾天,學習了linux核心的編譯流程,在此總結下,大家來一起學習。 以最新的3.0核心為例,我下載的是linux3.0.1 下載地址:http://www.kernel.
linux 核心編譯驅動模組ko的配置以及載入模組解除安裝模組例項測試
linux 核心編譯驅動模組ko的配置以及載入模組、解除安裝模組例項測試一、要讓linux系統支援動態載入驅動模組必須先對linux 核心進行相關的配置,不然編譯不過,載入模組也會載入失敗甚至導致裝置重啟。1、勾選核心Enable loadable module suppor
Linux核心編譯及CentOS系統安裝
1、程式包的編譯安裝 命令:./configure, make, make install (1)./configure:檢查編譯環境的依賴關係,並設定編譯引數; (2)make:編譯過程,make不是編譯工具,而是專案構建工具,其呼叫各所需的編譯工具執行編譯操作; (3)make
linux核心移植與編譯
在瞭解了核心及其相關知識之後,就要著手核心移植的實驗了。 使用make menuconfig出現問題請移步make: *** 沒有規則可以建立目標“menuconfig”。 停止。 Linux核心移植與編譯 1.linux核心的下載 實驗開始之前,你需要自行下載li
Linux核心編譯和grub安裝注意事項(修改預設啟動項)
一般的過程不多說。 下載核心原始碼,make menuconfig , make , make modules_install, make install等一系列。 要注意的事情: 1.安裝模組時,要用特殊引數,否則編譯出來的initrd.img特別大有300M,而