Linux下編譯內核

                       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]#

    2echo命令:設置臨時關閉路由轉發功能。

       [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

   1make config:基于命令行以遍歷的方式去配置內核中可以配置的每個選項;

   2make menuconfig:基于ncurses的文本窗口界面;

   3make gconfig:基于GTKGNOME)環境窗口界面;

   4make xconfig:基于QTKDE)環境的窗口界面;

 

  支持“全新配置”模式進行配置

   1make defconfig:基于內核為目標平臺提供的“默認”配置進行配置;

   2make allyesconfig:所有選項均回答為“yes”;

   3make 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文件copyroot目錄下。

       [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文件進行更改操作。

        1make menuconfig 是依賴于ncurses包的,如果沒有安裝需要進行安裝。

           [root@centos7 linux]# yum -y install –disablerepo=mage ncurses*

        

        2)在/usr/src/linux/目錄下執行make menuconfig.config文件進行更改操作。

            [root@centos7 linux]# make menuconfig

    blob.png

general setup 配置:補充kernel version后的version info

   blob.png 

關閉藍牙

  blob.png 

打開內核對ntfs文件系統功能以模塊化方式支持,同時支持寫權限。

  blob.png 

執行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

(0)
zhengyibozhengyibo
上一篇 2016-09-21
下一篇 2016-09-21

相關推薦

  • Linux基礎知識—文件系統和常用命令解讀

    一、    計算機組成         計算機組成(Computer Composition)指的是計算機系統結構(Computer Architecture)的邏輯實現,包括機器機內的數據流和控制流的組成及邏輯設計等。其任務是在指令集系統結構確定分配給硬件系…

    Linux干貨 2016-09-18
  • Python修飾器的函數式編程

    Python的修飾器的英文名叫Decorator,當你看到這個英文名的時候,你可能會把其跟Design Pattern里的Decorator搞混了,其實這是完全不同的兩個東西。雖然好像,他們要干的事都很相似——都是想要對一個已有的模塊做一些“修飾工作”,所謂修飾工作就是想給現有的模塊加上一些小裝飾(一些小功能,這些小功能可能好多模塊都會用到),但又不讓這個小…

    Linux干貨 2016-08-15
  • Linux 目錄結構

    Linux 目錄結構 1.     前言     Linux 是一種開源的,且非常流行的操作系統,發行版本眾多。為了統一和規范linux系統的主要目錄名及其用途,提出了FHS標準,FHS是File Hierarchy Standard的簡寫。Linu…

    Linux干貨 2015-07-26
  • Linux文件系統的創建、檢測、修復、分區等工具的使用

    一、文件系統管理 什么是文件系統?     我的理解是文件系統是對磁盤上的數據和文件結構的管理規范。     如果文件系統沒有繼承性,那么以前文件系統的數據就無法傳到新的文件系統中。     Linux的文件系統有這么幾種:ext2, ex…

    系統運維 2016-03-03
  • Google 開源技術protobuf

    1.  Protobuf簡介        protobuf是google提供的一個開源序列化框架,類似于XML,JSON這樣的數據表示語言,其最大的特點是基于二進制,因此比傳統的XML表示高效短小得多。雖然是二進制數據格式,但并沒有因此變得復雜,開發人員通過按照一定的語法定義結構化的消息格式,然后送給命令行…

    系統運維 2015-04-04
  • 文件系統

            文件系統表現為單個統一的層次結構:從目錄/開始并通過若干數量的子目錄繼續向下擴展,/也叫做根目錄。這種單一的層次系統和 Windows 的不一樣,后者的分區有專門的名字空間。        &n…

    Linux干貨 2016-02-28
欧美性久久久久