Linux內核編譯以及自制Linux系統

內核編譯

單內核體系設計、但充分借鑑了微內核設計體系的優點,爲內核引入模塊化機制。


內核組成部分:

    kernel: 內核核心,一般爲bzImage,通常在/boot目錄下,名稱爲vmlinuz-VERSION-RELEASE;

    kernel object: 內核對象,一般放置於/lib/modules/VERSION-RELEASE/

        [ ]: None

        [M]: 表示模塊化安裝

        [*]: 表示打到內核核心

    輔助文件: ramdisk

          initrd

           initramfs


運行中的內核:

    uname命令:

    uname - print system information

    uname[OPTION]...

        -n: 顯示節點名稱;

        -r: 顯示VERSION-RELEASE;

        -a:顯示所有信息

wKiom1fiOI6QQHWnAAA1HTcGoL4326.png


lsmod命令:

    顯示由核心已經裝載的內核模塊

    顯示的內容來自於: /proc/modules文件


示例:可以看見已經加載的模塊

wKioL1fiOe3CDgQQAAAg8LutKDU814.png


modinfo命令:

    顯示模塊的詳細描述信息

    modinfo[ -k kernel ] [ modulename|filename... ]

        -n: 只顯示模塊文件路徑

        -p: 顯示模塊參數

        -a: author

        -d: description

        -l: license


示例:顯示模塊的詳細信息

wKioL1fiOl2QWcdGAABjr2G0STw357.png


modprobe命令:

    裝載或卸載內核模塊

modprobe [ -C config-file ] [ modulename] [ module parame-ters... ] 安裝內核

    配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf

modprobe [ -r ] modulename... 卸載內核模塊


示例1:卸載網卡驅動,然後發現沒有eth那些網卡配置信息了

wKiom1fiPBHxoNCIAAAl49NAc84581.png

示例2:加載網卡驅動

wKiom1fiPBbBwbgIAABZVurztyk229.png


depmod命令:

    內核模塊依賴關係文件及系統信息映射文件的生成工具

裝載或卸載內核模塊:

insmod命令:指定模塊文件,不自動解決依賴模塊

    insmod[ filename ] [ module options... ]

    insmod`modinfo–n exportfs`

    lnsmod`modinfo–n xfs`

rmmod

    rmmod[ modulename]

    rmmod xfs

    rmmod exportfs


內核相關目錄

/proc目錄:

    內核把自己內部狀態信息及統計信息,以及可配置參數通過proc僞文件系統加以輸出

    參數:只讀:輸出信息

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

/proc/sys

    (1) sysctl命令用於查看或設定此目錄中諸多參數

        sysctl-w path.to.parameter=VALUE

        sysctl-w kernel.hostname=mail.magedu.com

    (2) echo命令通過重定向方式也可以修改大多數參數的值

        echo "VALUE" > /proc/sys/path/to/parameter

        echo “websrv” > /proc/sys/kernel/hostname

/sys目錄:

    sysfs:爲用戶使用的僞文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是可以修改的,用於調整硬件工作特性。

    udev通過此路徑下輸出的信息動態爲各設備創建所需要設備文件,udev是運行用戶空間程序

    專用工具:udevadmin, hotplug

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


sysctl命令

    默認配置文件:/etc/sysctl.conf

    (1) 設置某參數

        sysctl-w parameter=VALUE

    (2) 通過讀取配置文件設置參數

        sysctl-p [/path/to/conf_file]

內核中的路由轉發:

    /proc/sys/net/ipv4/ip_forward

常用的幾個參數:

    net.ipv4.ip_forward

    net.ipv4.icmp_echo_ignore_all

    vm.drop_caches


ramdisk文件的製作

(1) mkinitrd命令    爲當前正在使用的內核重新制作ramdisk文件

    mkinitrd /boot/initramfs-$(uname-r).img $(uname-r)

(2) dracut命令    爲當前正在使用的內核重新制作ramdisk文件

    dracut /boot/initramfs-$(uname-r).img $(uname-r)


示例:假如initramfs文件丟失,恢復之

刪除initramfs文件,然後重啓

wKiom1fiQiWwXzdKAAAZF5cHP_E831.png

會發現已經登陸不進去系統

wKioL1fiQiWj52C_AAACOG-d_Ig797.png

此時進入救援模式運行進行修復

wKioL1fiQyqzTTKiAAAj7ZM9Lvc345.png修復完畢,重啓,會發現SElinux在檢查,稍等即可進入系統

wKiom1fiQ4KBrqejAAAKBb-gvNc890.png


編譯內核

前提:

    (1) 準備好開發環境

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

    (3) 獲取目標主機系統功能的相關信息

        例如:需要啓用相應的文件系統

    (4) 獲取內核源代碼包

        www.kernel.org

開發環境準備

包組(CentOS 6):

    Server Platform Development

    Development Tools

目標主機硬件設備相關信息:

    CPU:

    # cat /proc/cpuinfo

    # x86info -a

    # lscpu

硬件設備

PCI設備:

    lspci

        -v

        -vv

    lsusb

        -v

        -vv

    lsblk  塊設備

瞭解全部硬件設備信息

    hal-device


內核編譯安裝系統

安裝開發包組

下載源碼文件

.config:準備文本配置文件

make menuconfig:配置內核選項

make [-j #]

make modules_install:安裝模塊

make install :安裝內核相關文件

    安裝bzImage爲/boot/vmlinuz-VERSION-RELEASE

    生成initramfs文件

    編輯grub的配置文件


(1) 配置內核選項

    支持“更新”模式進行配置:make help

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

        (b) make menuconfig:基於curses的文本窗口界面

        (c) make gconfig:基於GTK (GNOME)環境窗口界面

        (d) make xconfig:基於QT(KDE)環境的窗口界面

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

        (a) make defconfig:基於內核爲目標平臺提供的“默認”配置進行配置

        (b) make allyesconfig: 所有選項均回答爲“yes“

        (c) make allnoconfig: 所有選項均回答爲"no“

(2) 編譯

全編譯:make [-j #]

編譯內核的一部分功能:

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

        # cd /usr/src/linux

        # make dir/

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

        # cd /usr/src/linux

        # make dir/file.ko

        例如:只爲e1000編譯驅動:

        # make drivers/net/ethernet/intel/e1000/e1000.ko

如何交叉編譯內核:

    編譯的目標平臺與當前平臺不相同才需要交叉編譯

    # make ARCH=arch_name

要獲取特定目標平臺的使用幫助

    # make ARCH=arch_namehelp

    # make ARCH=arm help

在已經執行過編譯操作的內核源碼樹做重新編譯:

    需要事先清理操作:

    # make clean:清理大多數編譯生成的文件,但會保留config文件等

    # make mrproper: 清理所有編譯生成的文件、config及某些備份文件

    # make distclean:mrproper、patches以及編輯器備份文件


示例:簡單linux kernel內核編譯過程

首先提示,此處用虛擬的同學,儘量把虛擬機的核心數量調大一點,跟實際的主機一樣就可以了,此處操作只是爲了加快編譯的時間,編譯的時候會消耗大量的cpu資源,如果想繼續做其他操作的小夥伴,可以忽略此處

wKiom1fflcrT5tFKAAC8v5gjsXw211.png

在系統裏面可以查看到當前系統的核心數量

wKiom1fflc6SSWhtAAAokc9jaRs788.png

進行內核操作,請自備linux內核。而且編譯內核以前,請做好備份,編譯內核的主版本,請儘可能跟原有的內核版本相近,因爲直接採用最新的內核版本,有可能會導致系統崩潰。

此處內核可以到www.kernel.org下載  

此次實驗我們用的是linux-3.18.41版本的內核,當前系統是3.10.0的版本的內核

wKioL1fh9BWAIEQZAAAGUu4I7EQ918.png

/usr/scr/kernels,此處目錄是存放內核文件的地方,現在只有一個3.10版本的內核

wKioL1fflcqx3E68AAAKZanLgRw217.png

解壓新的內核到/usr/src目錄下面

wKioL1fflcujrwYKAAAD_587FlA769.png

wKioL1fflcvyUr3RAAAO42FsnUI159.png

創建linux-3.18-41的軟連接目錄linux,此處的操作是爲了後面的操作每次都需要內核版本號,一旦輸入錯誤的話,就又得重來了(編譯兩小時,報錯5秒鐘)

wKiom1fflcvBXPlIAAAH3T7ACdE572.png

複製原有系統的/boot/config-3.10.0-327.el7.x86_64的文件到/usr/src/linux目錄下面爲.config的文件

wKioL1fflczjbHAEAAAHLYFr-zA654.png

運行make menuconfig命令來配置內核選項,如果此處有報錯的話,例如下圖,表明一些編譯內核的工具還沒有安裝,此處我們通過yum倉庫來安裝一下相關的文件,此處除了報錯的curses.h的文件以外,還有

Server Platform Development、Development Tools等工具是必須要安裝的,編譯以前需要查看一下工具是否都已經安裝完畢。

wKioL1fflcyiZHQOAAA3Do2m5Bk410.png

wKioL1fflc2zasTYAAADaaspNJY634.png

wKioL1fflc3yZ_p5AAB4LAi4X1M990.png

安裝完相關的工具以後,重新運行make menuconfig命令

此時我們已經可以正常進入編輯內核選項的圖形化界面,在這裏我們可以選擇我們需要的內核功能

wKioL1fflc7iYpN3AABJmDBY0fQ796.png

例如此處可以編譯內核的名字,像本機內核的3.10.0-327.el7.x86_64後面的-327.el7.x86_64就是在此處編輯


wKioL1fh_A6CCzYCAABunqT0cUY308.png

例如我們可以定義爲-1.0_wanlinux

wKiom1fh_A7BOH4aAAAPfcf0B78149.png

再看看其他功能,比如此處可以選擇windows的文件系統

wKioL1fh_BCgMxAdAABuJdIMmYU234.png

可以看見有一個NTFS文件系統支持的選擇

wKioL1fh_JThyYUXAAAKsOzDPB8368.png

按空格鍵可以選中此功能,此處的M表示以模塊化的方式來安裝此文件驅動,這樣的話在系統的 modules文件夾裏面即可以查找到這個文件

wKiom1fh_BHQiy-QAAAOT8JZljM287.png

再多按一次空格健會編程一個*,表示直接把此集成到內核裏面,在系統裏面運行的話是看不到此文件的

wKioL1fh_BGS1tFEAAAONrQWWgk571.png

當選擇好那些我們需要內核參數以後,就可以選擇此處的保存

wKioL1fh_BHCHxhjAAAEfxaf0t8003.png

默認保存.config的文件

wKioL1fh_R7Dngv2AAALz_O5L-8187.png

上面的步驟準備好以後,輸入make -j 4開始編譯,此處的-j 4表示指定cpu的數量,因爲我這裏核心數量是4,輸入完以後,內核就開始編譯了,此處需要等待很長的時間

wKioL1fflc_izO8eAABUUdb1yS8033.png

編譯完以後/lib/modules並不會馬上生成內核的文件

wKiom1fflc_w3K2MAAAGj_q0RIo493.png

此時回去/usr/src/linux目錄下面運行make modules_install安裝內核模塊

wKioL1fflc-AIxefAAAFKWkhEmE449.png

上面的運行完以後,我們可以看見/lib/modules目錄下面會多一個3.18.41的內核文件,查看一下該目錄,居然有7G多,所以小夥伴們編譯的時候注意看一下磁盤的空間容量。

wKioL1ffldCSgTr8AAALbURsEH8793.png

再運行make install安裝內核相關文件

安裝bzImage爲/boot/vmlinuz-VERSION-RELEASE

生成initramfs文件

wKiom1ffldHS7MmEAAAIv6quWkw224.png

然後會發現/boot目錄下面多了內核3.18.41的文件

wKioL1ffldHgplDiAAAg_j9QFac691.png

進入/boot/grub2/目錄下面查看grub.cfg文件

wKiom1ffldKxl2z1AAADLv2uVXE397.png

可以看見grub裏面已經有3.18.41內核的加載選項

wKiom1ffldLxJnxBAABupolqtH8245.png

重啓電腦看看,可以發現有3.18.41內核的啓動選項

wKioL1ffldKCnD6SAAAVp-at9hA161.png

此時可以正常登陸進來,表示安裝新的內核成功。

wKioL1ffldPit8D3AAAPkMTJBp4265.png


自制Linux示例

此處只是利用現有的linux系統文件來創建一個簡單的linux系統,還缺乏許多功能

首先準備一個空的磁盤,這裏實驗使用一個虛擬機的磁盤

wKiom1fh627zCjoQAACG_T5OMJg410.png

wKiom1fh627y6zJEAAAXB5_5rco329.png

分區並創建文件系統

fdisk/dev/sdb

分兩個必要的分區

/dev/sdb1對應/boot /dev/sdb2對應根/

mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2

wKioL1fh62-jgXavAAAbQkwwUyc208.png

wKiom1fh62_SiDrzAAA1HGj16fA958.png

掛載boot

mount /dev/sdb1 /mnt/boot

wKiom1fh63jz66UNAAAYGaPK6vw704.png

安裝grub

grub-install /dev/sdb --root-directory=/mnt

wKiom1fh68SCdoKRAABCm1KNRJ0897.png

安裝完grub以後可以查看一下sdb的mbr信息是否正常

wKioL1fh69iwy4GOAAC7iGdsRlM053.png

恢復內核和initramfs文件

cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/

cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/bootwKioL1fh63LAtfKQAABatVw6eWU671.png

建立grub.conf:

vim /mnt/boot/grub/grub.conf

title Hello_Linux

root (hd0,0)

kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash

initrd /initramfs-2.6.32-642.el6.x86_64.img

wKiom1fh63LxWSISAAAnFDwArCI996.png


創建一級目錄

mkdir/mnt/sysroot

mount /dev/sdb2 /mnt/sysroot

mkdir -pv /mnt/sysroot/

{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

wKiom1fh63SDVEvHAACdz7irj5U160.png

創建/etc/fstab掛載文件

wKiom1fh63XCWZ_6AAAffG_F-KY183.png

複製bash和相關庫文件,這個是必須的

複製相關命令及相關庫文件,如:ls,cat,vim,reboot,hostname,mount,umount,tree等,非必須,但是最好還是安裝上,這些小命令部分能在小linux上面跑,有些不能,因爲系統文件並不是很全

注意:此處的copycmd.sh是自己編寫的腳本,內容就是複製bash和ls之類這些相關的文件到/sysroot下面,當然,此處也可以自行一個一個複製,只是比較麻煩

wKioL1fh63WDHcTOAABTk1RnSvk957.png

複製完可以看見bin和lib64等等目錄下面多了許多相關文件

wKiom1fh63ijLnWbAAAXd1CdGfI938.png

wKioL1fh63Xy0_2RAAAyHuZ6kDI186.png

複製完相關的文件,我們可以用chroot命令來切根試試能不能正常進入,如果可以的話,應該問題就不大,完成此步驟以後就可以關機了

wKiom1fh72DxmE85AAADsGuefr0634.png

現在我們新建一個虛擬機測試一下剛那塊虛擬磁盤裏面的系統看是否能正常運行


wKioL1fh63aizw22AABVvpmd9FY836.png

虛擬機裏面需要使用一塊現有的虛擬硬盤,其他的配置就跟平時創建虛擬機一樣即可   

wKiom1fh8HOSglYXAABWVF_qzwI443.png

wKioL1fh8EDBYLlLAAFgDrvUZbw365.png

配置完虛擬機以後,開機!

此時可以看見登陸的界面了!

wKioL1fh63eD9MfUAAAZvzWotGI118.png

正常進入到系統了!界面有點像救援模式,(當然此處可以把自制的小linux系統安裝到u盤裏面當成系統盤運行,就像windows老毛桃pe之類的)

在裏面測試了一下之前複製的命令,有些可以,有些不可以,此處實驗完畢。

wKioL1fh63exBCOKAAAXZf1QLzs300.png




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章