編譯內核

了解內核;內核設計體系:單內核,微內核

    linux:單內核設計,但充分借鑒了微內核體系的設計優點;為內核引入了模塊化機制;

內核的組成部分一般有三種;

    kernel:內核核心,一般為bzimage (bzip2格式所壓縮的內核映像文件),這個文件通常位于/boot/目錄下,名稱為vmlinuz-VERSION-release;

    kernel object:內核對象,即內核模塊,一般放置與/lib/modules/VERSION-release/ 

        注意:內核模塊與內核核心版本一定要嚴格匹配;

編譯的時候的內核模塊的選擇

    [ ]:N :這表示不編譯此功能

    [M]:Module:這表示編譯為內核模塊,編譯成內核模塊的用處在于,用到時在臨時裝載,不用時可以不裝載,最多只是占用磁盤空間,而不占用內核內存空間

    [*]:Y:這表示直接編譯進內核核心;要編譯進內核核心的功能必須是最核心的,近乎所有人都用到的功能;但是編譯成模塊有一個缺陷,因為他支持動態裝載和卸載,因此我們一般只能夠在用到此模塊時還要臨時把其轉載進來才能用,這中間就產生了一個時間差。如果是要是在內核核心直接提供的話,上來就可以用了。就沒有這個時間差了。但是這個時間差幾乎可以忽略不計。

    注意:不是所有功能都可以編譯成模塊的,有些功能要么選擇編譯進核心,要么不選擇,而不支持模塊化編譯。內核:內核模塊支持動態裝載和卸載


ramdisk:輔助性文件,并非必須,這取決與內核是否能直接驅動rootfs(根文件系統)所在的設備;

    借助與ramdisk能加載的內容包括;

        目標設備驅動,例如SCSI設備的驅動;

        邏輯設備驅動,例如LVM設備的驅動;

        文件系統,例如xfs文件系統;

    ramdisk是一個簡裝版的根文件系統;因此內核一旦用到了ramdisk在內存中;那這個時候他起始已經有根了,這個根是位于內存中的根,這個時候如果內核不做根切換動作的話,那這個系統其實就已經啟動完成了。但是這樣的缺陷就是數據無處存放,萬一斷電了,數據操作系統和修改的操作系統全部都沒了,為了避免這樣的尷尬,我們還是應該把操作系統放在一個持久性存儲設備上,這就是為什么多數情況下要做根切換的原因,所以說ramdisk僅僅是為了讓內核能夠找到真正的根文件系統。

注意:在操作系統啟動完成以后起始內核就已經加載完成了,我們能看到的內核文件與我們這次啟動已經沒有關系了,無論怎么修改,其都沒有辦法生效了。除非重啟,不過對于內核4.0版本以后據說可以打補丁,不用重啟可以直接讓其生效。


內核信息獲?。簎name命令:顯示系統的信息

選項;

    -r:內核的(releace)發行號

    -n:顯示當前主機名

    -v:內核的版本號(編譯版本)

    -a:顯示所有信息

內核模塊信息獲取和管理:

    lsmod命令:列出模塊;顯示內容來自于/proc/modules

        有三個字段:模塊名稱;模塊大??;被引用次數以及被什么模塊所引用

    modinfo命令:顯示單個模塊文件的相關信息

        -F field:僅顯示指定字段的信息

        -n:顯示文件路徑

    文件:/boot/vmilnuz-VERSION-release

modprobe命令:從內核中動態裝載模塊或從內核中卸載模塊

    使用格式:modprobe [-r] module_name

    動態裝載模塊modprobe module_name

    動態卸載模塊modprobe -r module_name

    注意:對正在使用中的內存模塊,千萬不要去隨意卸載

    depmod命令:對模塊生成依賴關系(內核模塊依賴關系文件的生成工具)

模塊裝載和卸載的另一組命令:

    insmod命令:插入模塊

    insmod [filename] [module options]

    filename:模塊文件的文件的路徑;

    rmmod命令:刪除模塊

    rmmod [module_name]


ramdisk文件的管理:

(1)mkinit命令

    為當前使用中的內核重新制作ramdisk文件

    # mkinitrd [option…] [<initrd-image>]<kernel-version>

        –with=<module>:除了默認模塊之外需要裝載至initramfs中的模塊,

        –preload=<module>:initramfs所提供的模塊需要預先裝載的模塊;

        示例:]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

(2) dracut命令;較為底層的,用于生成ramdisk文件的命令

    # dracut [option…] [<image> [<kernel version>]]

    示例:]# dracut /boot/initramfs-$(uname -r).img $(uname -r)


內核信息輸出的偽文件系統:

    /proc:內核狀態及統計信息的輸出接口;同時,還提供一個配置接口,這個配置接口是/proc/sys;

    有兩種參數:只讀和可寫

        只讀:只用于信息輸出;例如/proc/#/*

        可寫:作用是可接受用戶指定一個“新值”來實現對內核某功能或特性的配置:/proc/sys/

    /proc/sys:

    net/ipv4/ip_forward 相當于 net.ipv4.ip_forward

    那么既然可寫,怎么寫呢?因為所謂的系統調優操作主要就是改這兩個目錄,一個是/proc/sys/,一個是/sys/下的很多參數

修改其值的方式有兩種;

(1)sysctl命令;專用與查看或設定/proc/sys目錄下參數的值

    sysctl [option] [variable[=value]]

    查看:

    # sysctl -a 

    # sysctl variable

    # cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

    修改其值:

    # sysctl -w variable=value

(2)文件系統命令(cat,echo)

    查看:

    # cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

    設定:

    # echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FILE

    注意:上述兩種方式的設定僅當前運行內核有效;

(3)配置文件:/etc/sysctl.conf,/etc.sysctl.d/*.conf

    立即生效的方式:sysctl -p [/PATH/TO/CONFIG_FILE]


內核參數:

net.ipv4.ip_forward:核心轉發

vm.drop_caches:回收內存所用的內核參數

kernel.hostname:主機名

net.ipv4.icmp_echo_ignpre_all:忽略所有發往本主機的ping操作

/sys目錄:

sysfs:主要用于輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設置參數;對此些參數的修改,即可定制硬件設備的工作特性

udev:通過讀取/sys目錄下的硬件設備信息按需為各硬件設備創建文件;udev是用戶空間程序;專用工具(用來創建設備文件):devadmin,hotplug;

udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d/目錄下,以及/usr/lib/udev.rules.d/目錄下;


如何編譯內核:

程序包的編譯安裝三個步驟:

./configure,make,makeinstall

前提:開發環境(開發工具,開發庫),頭文件:/usr/include

開源:源代碼–>可執行格式

發行版的主要作用:以“通用”的目標;避免讓用戶去手動編譯

前提

(1)準備好開發環境;

(2)獲取目標主機上硬件設備的相關信息;為什么要獲取硬件設備的相關信息呢?我們編譯內核的時候要選擇驅動的,如果我們有一個驅動沒有選好,編譯完了會發現啟動不了 ,結果就是得重新啟動老版本內核改了內核配置重新編譯,而一次編譯根據硬件平臺所選定的功能不同從二十分鐘到兩個小時不等,內核代碼數是非常大的。

(3)獲取到目標主機系統功能的相關信息,例如要啟用文件系統;

(4)獲取內核源代碼包:www.kernel.org

如何準備開發環境:

    centos6:

    包組:

        Development Tools

        Server Platform Development

    centos7:

    包組:

        Development Tools

        Server Platform Development

        注意:確保包組中有安裝*ncurses-devel*這個包

獲取目標主機上硬件設備的相關信息;

    CPU:

        ~]# cat /proc/info

        ~]# lscpi

        ~]# x86info -a

    PCI設備:

        ~]# lspci

        -v

        -vv

        ~]# lsusb

        -v

        -vv

        ~]# lsblk

了解全部硬件設備信息:

    ~]# hal -device


內核編譯過程:

步驟:

獲取源代碼

~]# tar xf linux-3.10.67.tar.xz -C /usr/src

~]# cd /usr/src

~]# ln linux-3.10.67 linux

~]# cd linux

~]# make menuconfig 配置內核選項

~]# make [-j #(表示多線程同時編譯)]:編譯內核,可使用-j指定編譯線程數量

~]# make modules_install 安裝內核模塊

~]# make install 安裝內核核心

重啟系統,選擇使用新內核

如果是遠程連接執行編譯的話建議將下面這幾個選項運行在screen命令:

screen命令:

打開screen:~]# screen

拆除screen: Ctrl+a,d

列出screen: ~]# screen -ls

連接至screen: ~]# screen -R SCREEN_ID

關閉screen: ~]# exit

過程詳細說明

(1)配置內核選項

  支持“更新”模式進行配置:在已有的.config文件的基礎之上進行“修改”配置;

        (a)make cofig:基于命令行以遍歷的方式去配置內核中可配置的每個選項

        (b)make menuconfig:基于cureses的文本配置窗口

        (c)make gconfig:基于GTK開發環境的窗口界面;“桌面平臺開發”

        (d)make xongfig:基于QT開發環境的窗口界面;

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

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

        (b)make allnoconfig:所有選項均為“no”

(2)編譯

        (a)多線程編譯:make [-j #]

        (b)編譯內核中的一部分代碼;

        (i)只編譯某子目錄中的相關代碼

            # cd /usr/src/linux

            # make path/to/dir

        (ii)只編譯一個特定的模塊

            # cd /usr/src/linux

            # make path/to/dir/file.ko

        (c)如何交叉編譯:

            目標平臺與當前編譯操作所在的平臺不同;

            # make ARCH=arch_name

            如果要獲取特點目標平臺的使用幫助:

            # make ARCH=arch_name help

(3)如何在執行過編譯操作的內核源碼樹上做重新編譯:

    事先清理操作:

        # make clean:清理編譯生成的絕大多數文件,但會保留config,及編譯外部模塊所需要的文件;

        # make mrproper:清理編譯生成的所有文件,包括配置生成的config文件及某些備份文件;

        # make distclean:相當于mrproper,額外清理各patches以及編輯器備份文件



示例

安裝開發包組

]# yum groupinstall "Development Tools","Server Platform Development"

blob.png

獲取內核源代碼

blob.png

]# tar xvf linux-3.10.10.tar.xz -C /usr/src 解壓源碼包
]# cd /usr/src/ 切換至解壓文件
]# ln -sv linux-3.10.10 linux 創建連接
`linux' -> `linux-3.10.10'
]# cd /usr/src/linux 進入內核解壓目錄
]# cp /boot/config-$(uname -r) ./.config (此命令為可選,/boot/config為內核模塊的模版)
]# make menuconfig 配置內核選項

blob.png

]# make -j 2 [-j #(表示多線程同時編譯,這里我指明2線程)] 編譯過程耗時,待完成之后執行下一條命令
]# make modules_install 安裝內核模塊
]# make install 安裝內核核心 
]# reboot 重啟使用新內核

blob.png


原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/46190

(0)
M20-1馬星M20-1馬星
上一篇 2016-09-21
下一篇 2016-09-21

相關推薦

  • mysql.主從復制.讀寫分離.高可用.集群實戰

    架構圖如下: 1.按照架構圖所示,準備機器,做好時間同步,主機名解析 192.168.42.150 node1 [proxySQL keepalived]192.168.42.151 node2 [proxySQL keepalived]192.168.42.152 node3 [mysql-master wha]192.168.42.153 node4 […

    Linux干貨 2017-07-14
  • 馬哥教育網絡班22期+第5周課程練習

    1、顯示當前系統上root、fedora或user1用戶的默認shell;     cat /etc/passwd | grep -E '^(root|fedora|user1)\>' | awk -F …

    Linux干貨 2016-10-17
  • awk多分隔符

    awk的-F參數可以指定新的分隔符,有些時候可能需求指定多個分隔符,比如下面的內容 [root@N1 ~]# netstat -an | grep ESTAB udp 0 0 192.168.1.120:35570 212.47.249.141:123 ESTABLISHED udp 0 0 192.168.1.120:55589 108.59.2.24:1…

    Linux干貨 2017-08-09
  • 在 Linux 下你所不知道的 df 命令的那些功能

    原文出處: xmodulo   譯文出處:linux.cn – mtunique   歡迎分享原創到運籌維幄 問題: 我知道在Linux上我可以用df命令來查看磁盤使用空間。你能告訴我df命令的實際例子使我可以最大限度得利用它嗎?   對于磁盤存儲方面,有很多命令行或…

    Linux干貨 2015-03-02
  • N26第二周博客作業

    1、  Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 常見的文件查看命令有:cat,tac,head,tail,more,less,stat,touch 常見的文件管理命令有:cp,mv,rm 常見的目錄管理命令:mkdir,rmdir 以下進行詳細介紹: 1.1  文件查看命令 l  ca…

    Linux干貨 2017-02-03
欧美性久久久久