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目錄大?。?/span>

  [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 21:20
下一篇 2016-09-21 22:19

相關推薦

  • Linux手動編譯源代碼文件

    一、簡介     Linux系統上程序包安裝的方式多種多樣,一般來說可通過rpm包安裝、yum在線安裝等方式實現。但有時候為了實現某種功能,而這種功能在通常情況下又不是太常用或是因為其他原因,不能通過yum下載安裝或在網上沒有找到rpm包,只是找到了程序安裝包的源代碼的話,這種情況下我們就可以對源代碼直接進行編譯安裝,以便解決這種臨時需求…

    Linux干貨 2015-09-26
  • redis/twemproxy 客戶端連接異常

    對于一個DBA,客戶端連接異常問題可以說是家常便飯的事情,處理多了都想吐。 root cause無疑發生在三個地方,先找自身的原因,依次排查下去: 1)服務器端db的負載,如果負載太高,創建socket太慢引起超時。另外服務器端socket的個數太多,也可以導致創建連接需要很長的時間或者創建連接不成功。 2)網絡是夠有抖動,包括lvs/twemproxy重啟…

    Linux干貨 2015-04-03
  • 老王的心路歷程(二):下一站Web體驗監控產品

    在上一篇文章中,和大家聊到了建立Web應用體驗監控體系,經過了概念階段,也完成了技術選型,就進入了把實質性的產品研發階段。作為產品經理,時刻不敢忘記我們的產品目標:無限感知你的用戶,建立完備的體驗監控體系,驅動產品的設計、開發和運維! 一、一切皆操作 仔細分析終端用戶和Web應用及網站的交互過程,無論是打開頁面、點擊鏈接或按鈕,還是填寫表單、提交查詢,一切皆…

    2016-08-15
  • linux分區管理工具—fdisk

    一、關于為什么要分區       (1)為了數據的安全:當文件系統只有一個分區時,如果遇到分區需要格式化的情況,則硬盤里的數據無法保留,而如果提前對硬盤做了分區那么就可以很好地額解決這個問題;       (2)為了提升效率:硬盤(這里單指機械硬盤)分為外圈和…

    Linux干貨 2016-03-12
  • 數據的游戲:冰與火

    我對數據挖掘和機器學習是新手,從去年7月份在Amazon才開始接觸,而且還是因為工作需要被動接觸的,以前都沒有接觸過,做的是需求預測機器學習相關的。后來,到了淘寶后,自己憑興趣主動地做了幾個月的和用戶地址相關數據挖掘上的工作,有一些淺薄的心得。下面這篇文章主要是我做為一個新人僅從事數據方面技術不到10個月的一些心得,也許對你有用,也許很傻,不管怎么樣,歡迎指…

    Linux干貨 2016-08-15
  • 精解局域網訪問及共享(三)

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/155109    上一節中的2種情況都是默認的簡單共享,下面我們著重分析一下高級共享方式下的各種訪問情況。畢竟這種方式用的很普遍,而且在權限…

    Linux干貨 2015-03-25
欧美性久久久久