Linux下編譯內核
內核編譯:
編譯內核就是把內核的相關文件重新生成。
內核編譯前期準備:
Linux kernel下載網址:https://www.kernel.org/下載需要編譯的內核版本。
在虛擬機中安裝開發工具包組:Development Tools,可以使用yum grouplist 查找。
[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"
在虛擬機中安裝ncurses包。
[root@centos7 cd]# yum -y install –disablerepo=mage ncurses*
編譯內核虛擬機環境:centos 7。
編譯之前確認本機硬件信息 (普通編譯、交叉編譯)。
Linux內核設計體系:
Linux內核采用單內核體系設計、但充分借鑒了微內核設計體系的優點,為內核引入模塊化機制。
Linux內核組成部分:
kernel:內核的核心文件,通常放置在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE;
示例:
[root@centos6 ~]# ls /boot
config-2.6.32-642.el6.x86_64 grub lost+found System.map-2.6.32-642.el6.x86_64
efi initramfs-2.6.32-642.el6.x86_64.img symvers-2.6.32-642.el6.x86_64.gz
vmlinuz-2.6.32-642.el6.x86_64
[root@centos6 ~]#
kernel object:內核對象,一般放置在/lib/modules/version-release/目錄下,大部分為以.ko結尾的驅動模塊文件。
查看內核版本:
uname命令:
uname – print system information
uname [OPTION]…
-n:顯示主機名稱;
-r:顯示版本信息;
-a:顯示所有信息;
示例:
[root@centos6 Desktop]# uname -r
2.6.32-642.el6.x86_64
[root@centos6 Desktop]#
內核模塊命令:
lsmod命令:
顯示由核心已經裝載的內核模塊;顯示的內容來自于/proc/modules文件。
示例:
[root@centos6 Desktop]# lsmod | grep "ext4"
ext4 379655 3
jbd2 93252 1 ext4
mbcache 8193 1 ext4
[root@centos6 Desktop]#
modinfo命令:
顯示模塊的詳細描述信息;
modinfo [ -0 ] [ -F field ] [ -k kernel ] [ modulename|filename… ]
-n:顯示模塊文件路徑;
-p:顯示模塊參數;
-a:顯示作者信息;
-d:顯示驅動文件描述信息;
-l:查看許可證;
示例:
[root@centos6 Desktop]# modinfo -n e1000
/lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
[root@centos6 Desktop]#
內核模塊管理:
modprobe命令:
裝載或卸載內核模塊;
選項:
-l:列出所有裝載的內核模塊;
-r:下載內核模塊; 或 rmmod命令
示例:
[root@centos6 Desktop]# modprobe -r e1000
[root@centos6 Desktop]# lsmod | grep e1000
[root@centos6 Desktop]# modprobe e1000
[root@centos6 Desktop]# lsmod | grep e1000
e1000 134863 0
[root@centos6 Desktop]#
depmod命令:
內核模塊依賴關系文件及系統信息映射文件的生成工具,不要隨便執行。
insmod命令:指定模塊文件,不自動解決依賴模塊,需手動解決依賴關系。
insmod `modinfo -n exportfs`
insmod `modinfo -n xfs`
rmmod命令:
rmmod [modulename]
示例:卸載xfs模塊驅動
rmmod xfs
/proc目錄:
內核把自己內部狀態信息及統計信息,以及可配置參數通過proc偽文件系統加以輸出。
參數:只讀:輸出信息
可寫:可接受用戶指定的新值來實現對內核某功能或特性的配置。
sysctl命令:用于查看或修改修改/proc/sys目錄中的諸多參數。修改的參數臨時生效。
選項:
-a:查看所有參數;
-w:臨時設置某一參數;
-p:重新讀取/etc/stsctl.conf配置文件,使其參數更改生效。
內核中的路由轉發:
/proc/sys/net/ipv4/ip_forward
常用的幾個參數:
net.ipv4.ip_forward 開啟/禁用路由轉發
net.ipv4.icmp_echo_ignore_all 開啟/禁用ping命令
vm.drop_caches=3 清理內存cache。
kernel.shmall 默認16G,有時需要調大,充分發揮機器硬件性能。
示例:設置臨時開啟路由轉發功能。等同于 echo命令設置。
1)[root@centos6 Desktop]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@centos6 Desktop]#
2)echo命令:設置臨時關閉路由轉發功能。
[root@centos6 Desktop]# echo "0" > /proc/sys/net/ipv4/ip_forward
[root@centos6 Desktop]# cat /proc/sys/net/ipv4/ip_forward
0
[root@centos6 Desktop]#
/sys目錄:
sysfs:為用戶使用的偽文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息,有些參數是可以修改的,用于調整硬件工作特性。
udev通過此路徑下輸出的信息動態為各設備創建所需要設備文件,udev是運行用戶空間程序。
專用工具:udevadmin hotplug
udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目錄。
ramdisk管理:
mkinitrd命令:
為當前正在使用的內核重新制作ramdisk文件;需在急救模式下操作。
mkinitrd initramfs-`uname -r `.img `uname -r`
dracut命令:
為當前正在使用的內核重新制作ramfs文件;需在急救模式下操作。
dracut initramfs-`uname -r `.img `uname -r`
編譯內核:
(1)準備好開發環境。
(2)獲取目標主機上硬件設備的相關信息。
(3)獲取目標主機系統功能的相關信息。
(4)獲取內核源代碼包。https://www.kernel.org/
開發環境準備:
包組:
1、Development Tools 開發工具包。
2、在虛擬機中安裝make menuconfig依賴的ncurses包。
ncurses-5.9-13.20130511.el7.x86_64
目標主機硬件設備相關信息:
CPU:
#cat /proc/cpuinfo 查看CPU信息
# lscpu 查看CPU信息
#arch 查看架構
硬件設備:
pci設備:
lspci -v
lsusb -v
lsblk 塊設備
內核編譯安裝:
安裝開發包組;
下載源碼文件;
.config:準備文本配置文件;
make menuconfig:配置內核選項;
make [-j #] :編譯內核 ,使用#個CPU并發編譯;
make modules_install:安裝驅動模塊至/lib/modules/目錄下。
make install :安裝內核相關文件。
(1)安裝內核文件到本機/boot目錄下。
(2)生成initramfs偽根文件系統。
(3)編輯/boot/grub2/grub.cfg配置文件
編譯內核:
配置內核選項:
支持“更新”模式進行配置:make help
1)make config:基于命令行以遍歷的方式去配置內核中可以配置的每個選項;
2)make menuconfig:基于ncurses的文本窗口界面;
3)make gconfig:基于GTK(GNOME)環境窗口界面;
4)make xconfig:基于QT(KDE)環境的窗口界面;
支持“全新配置”模式進行配置
1)make defconfig:基于內核為目標平臺提供的“默認”配置進行配置;
2)make allyesconfig:所有選項均回答為“yes”;
3)make allnoconfig:所有的選項均回答為“no”;
內核編譯:
全編譯:make [-j #]
編譯內核的一部分功能:
1)只編譯某目錄中的相關代碼:
示例:編譯打開內核對ntfs文件系統功能以模塊化方式支持,同時支持寫權限。
[root@centos7 ~]# cd /usr/src/linux
[root@centos7 linux]# make fs/ntfs/ntfs.ko (其中文件名需要自己寫,事先不存在)
2)只編譯一個特定的模塊:
示例:只編譯e1000驅動模塊;
[root@centos7 ~]# cd /usr/src/linux
[root@centos7 linux]# make drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉編譯:
編譯的目標平臺與當前平臺不相同;
#make ARCH=arch_name
例如:
#make ARCH=arm
要獲取特定目標平臺的使用幫助;
#make ARCH=arch_name help
例如:
#make ARCH=arm help
在已經執行過編譯操作的內核源代碼中做重新編譯,需要事先做清理操作:
make clean:清理大多數編譯生成的文件,但會保留config文件等。
make mrproper:清理所有編譯生成的文件,config及某些備份文件。
make distclean:清理所有編譯生成的文件基本清理到編譯前的狀態。
開始編譯內核:
內核編譯前期準備:
Linux kernel下載網址:https://www.kernel.org/下載需要編譯的內核版本。
在虛擬機中安裝開發工具包組:Development Tools,可以使用yum grouplist 查找。
[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"
在虛擬機中安裝make menuconfig依賴的ncurses包。
[root@centos7 cd]# yum -y install –disablerepo=mage ncurses*
編譯內核虛擬機環境:centos 7。
編譯之前確認本機硬件信息 (普通編譯、交叉編譯)。
1)將下載好的kernel文件copy到root目錄下。
[root@centos7 ~]# ll -h linux-3.18.42.tar.xz
-rwxrw-rw-. 1 root root 78M sep 20 21:50 linux-3.18.42.tar.xz
[root@centos7 ~]#
2)在虛擬機中安裝開發工具包組:Development Tools,可以使用yum grouplist 查找。
[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"
3)解壓linux-3.18.42.tar.xz內核包到/usr/src目錄下。
[root@centos7 ~]# tar xvf linux-3.18.42.tar.xz -C /usr/src
4)cd到/usr/src目錄下,為linux-3.18.42創建軟鏈接。
[root@centos7 ~]# cd /usr/src/
[root@centos7 src]# ln -s linux-3.18.42/ linux
[root@centos7 src]# ll
total 4
drwxr-xr-x. 2 root root 6 jun 9 2014 debug
drwxr-xr-x. 3 root root 34 sep 20 22:12 kernels
lrwxrwxrwx. 1 root root 14 sep 20 23:16 linux -> linux-3.18.42/
drwxrwxr-x. 23 root root 4096 sep 17 18:55 linux-3.18.42
查看解壓縮后的內核文件大小。
[root@centos7 src]# cd linux
[root@centos7 linux]# du -sh .
633M .
[root@centos7 linux]#
5)拷貝本機/boot/config-3.10.0-229.el7.x86_64內核編譯模板文件到/usr/src/linux/.config
編譯內核時默認會對這個.config文件。
[root@centos7 linux]# cp -rf /boot/config-3.10.0-229.el7.x86_64 /usr/src/linux/.config
[root@centos7 linux]# wc -l .config
5310 .config
[root@centos7 linux]#
6)在/usr/src/linux/目錄下執行make menuconfig對.config文件進行更改操作。
1)make menuconfig 是依賴于ncurses包的,如果沒有安裝需要進行安裝。
[root@centos7 linux]# yum -y install –disablerepo=mage ncurses*
2)在/usr/src/linux/目錄下執行make menuconfig對.config文件進行更改操作。
[root@centos7 linux]# make menuconfig
general setup 配置:補充kernel version后的version info
關閉藍牙
打開內核對ntfs文件系統功能以模塊化方式支持,同時支持寫權限。
執行exit到首頁,再次執行exit退出,并選擇yes保存操作更改。
現在在看一下/usr/src/linux/.config文件的大小。
root@centos7 linux]# du -sh .
634M .
[root@centos7 linux]#
這時我們發現比更改前多了1M。
7)使用make命令開始對內核編譯。
make -j # 指定本機編譯內核CPU的個數,并行編譯。
查看本機CPU個數:
[root@centos7 linux]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
……………………….
[root@centos7 linux]#
開始編譯內核:Need to wait for a period of time
[root@centos7 linux]# make -j 4
查看編譯后的/usr/src/linux目錄大小:
[root@centos7 linux]# du -sh .
7,0G .
[root@centos7 linux]#
查看是否編譯生成了ntfs.ko文件
[root@centos7 linux-3.18.42]# find -name "*.ko" | grep "ntfs"
./fs/ntfs/ntfs.ko
[root@centos7 linux-3.18.42]#
8)安裝模塊至 /lib/modules目錄下。
[root@centos7 linux]# make modules_install
9)安裝內核相關文件。
(1)安裝內核文件到本機/boot目錄下。
(2)生成initramfs偽根文件系統。
(3)編輯/boot/grub2/grub.cfg配置文件
[root@centos7 linux]# make install (一條命令,以上三步全部搞定)
sh ./arch/x86/boot/install.sh 3.18.42-zhengyibolinux arch/x86/boot/bzImage \
System.map "/boot"
[root@centos7 linux]#
到/boot目錄下查看發現已經多了一個內核文件。
到/boot/grub2/grub.cfg文件中查看發現已經多了一個新內核信息。
10)重啟 reboot,使用新內核啟動。
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/48371