編譯內核制作小型的linux

1.  前言

      今天我將會給大家帶來如何定制一個屬于自己linux系統,也就是編譯內核,那為什么要編譯內核呢?

內核,是一個操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統管理,決定著系統的性能和穩定性。Linux作為一個自由軟件,在廣 大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統度身定制一 個更高效,更穩定的內核,就需要重新編譯內核

對開源操作系統(主要是指Linux)的內核源代碼在本機進行有針對性的編譯,就叫做內核編譯。

編譯內核的目的主要是改變內核的默認選項,比如內核原來不支持某硬件,原因是內核的相應選項默認狀態是disactivated,需要改變。

編譯內核將會有更多的選擇,有些功能需要啟用,而有些功能不需要啟動,啟用我們需要的某些功能,關閉那些無用的功能,按照自己的要求來定制和優化內核,減少空間,定制一個代碼少的內核,還能系統運行的速度和性能

其次還有就是有些愛搗鼓的朋友們學習和研究,可以多加嘗試。那接下來我們就跟大家展示如何去編譯內核。

準備編譯環境,centos6安裝完成的一個操作系統(并且機器上已經安裝過編譯環境),內核 文件,虛擬機軟件,我這里的用的事vmware

首先我們在centos6上添加一塊硬盤,便于待會給小型的linux分區,添加硬盤在系統關機的情況下添加

123.jpg

       添加一個scsi類型的磁盤,大小為5G即可,在添加磁盤時,最后要選擇磁盤存放的位置,我這里指定的事桌面,以便待會好找,你們也可以放到一個自己好找的地方即可。硬盤文件時以vmdk結尾的文件

123.1.jpg

       添加好硬盤之后我們這里開啟centos6這個虛擬機了,開機之后fdisk -l一下查看硬盤有沒有加載進去,由于我們添加的是第二塊磁盤所以磁盤的編號是/dev/sdb,找到磁盤后我們開始分區,并格式化,創建兩個目錄,便于 我們存放系統文件,我這里是在/mnt目錄下創建boot 和sysroot

fdisk  -l 查看硬盤有沒有加載,加載之后執行下面的命令

分區

fdisk /dev/sdb

n–>p–>1—回車—>+100M—->w

n–>p–>1—回車—>+512M—->w

kpartx  /dev/sdb

123.jpg

這樣兩個分區就分好了,分區完成執行格式化命令

mke2fs -t ext4 /dev/sdb1

mke2fs -t ext4 /dev/sdb2

123.2.jpg

格式化完成,創建掛載點掛載分區

mkdir /mnt/{boot,sysroot}

mount /dev/sdb1 /mnt/boot

mount /dev/sdb2 /mnt/sysroot

123.4.jpg

創建grub

grub-install –root-directory=/mnt /dev/sdb ,grub安裝完成后,查看/mnt/boot/下面有沒有一個叫做grub的目錄, 如果存在說明已經安裝成功,如果不存在,請重新安裝grub

123.5.jpg

我們掛載的/mnt/boot目錄就是我們制作新系統里面的啟動分區,sysroot目錄就是根分區,正常系統根分區下面有很多目錄,那我們也要在sysroot下面創建目錄

cd /mnt/sysroot
mkdir  -pv etc/{rc.d,init.d}  bin  sbin  root  home   dev proc sys lib lib64 var/log  src usr/{local,share}  boot

     2、下載內核文件

       我們到內核的官當站點去下載http://www.kernel.org,這里我給大家演示的是2.6.13版本的內核編譯,朋友們盡量下載跟你當前系統內核版本要高的內核文件。

     3、釋放源代碼

       從官當下載下來的內核是一個壓縮文件,內核的源代碼就放在這個壓縮文件里面,如果你下載到你的windows機器里面我們可以用xmanger的xftp將內核文件上傳到虛擬機里面,我這里呢是穿到/root目錄下面

解壓源代碼放到/usr/src/目錄下,解壓完成我們創建一個鏈接文件,將linux-version(內核版本)鏈接到linux

tar  -xf   tar xf linux-3.13.6.tar.xz  -C /usr/src (解壓過程稍微有點慢,耐心等待一下)

解壓完成后,鏈接文件到linux 

ln -sv  linux-3.13.6/ linux

123.6.jpg

編譯內核之前請確保你的centos6安裝了編譯安裝環境,如果沒有請創建yum倉庫,然后安裝編譯安裝環境,主要安裝"Development Tools"和“Server Platform Development”,我這里已經安裝過了

123.7.jpg

編譯環境安裝完成后,我們進到源碼目錄去,/usr/src/linux,然后執行make allnoconfig生成一個.confgi的文件

123.8.jpg

而后執行make menuconfig (這里要提醒一下,如果有朋友是用xshell鏈接到虛擬機的,需要將xshell全屏,不然會報錯,會因為你的寬度不夠,而打不開GUI界面)

123.9.jpg

使用方法:選擇某項使用空格,當顯示是*時表示編譯進內核,M表示做成模塊,下面我會列出需要勾選的選項(全部做進內核),返回上級菜單使用ESC鍵

如果目標系統要做成是64位的話那我們就需要勾選這個選項了

64-bit kernel

加上本地內核版本號

Genral setup—> Local version – append to kernel release進去之后編輯就好比如el6-1.1.1

 

啟用內核模塊裝載

Enable loadable module support

 

處理器類型及特征,這項根據你的機器的cpu類型來選擇,我的是酷睿雙核的所以

 Processor type and features–>在這個菜單下面選擇Symmetric multi-processing support 
(多處理器支持)還有Processor family (Generic-x86-64)—>Core 2/newer Xeon

 

啟用PCI總線

Bus options (PCI etc.)–>PCI support(勾選)

 

設備驅動

 Device Drivers–>Fusion MPT device support (NEW)  –> Fusion MPT logging facility  
Device Drivers—>SCSI device support–>SCSI device support  和SCSI disk support (勾選上))
Device Drivers–>Fusion MPT device support (NEW) –>Fusion MPT ScsiHost drivers for SPI和Fusion MPT misc device (ioctl) driver(勾選上)

 

文件系統

filesystem –>The Extended 4 (ext4) filesystem

 

 

可執行文件格式

Executable file formats / Emulations–>  Kernel support for ELF binaries  、 Kernel support for scripts starting with #! 、Write ELF core dumps with partial segments (NEW) 

 

裝上鍵盤驅動

Device Drivers–>  Input device support–>Keyboards —> AT keyboard (默認是美式鍵盤)

 

鼠標驅動

Device Drivers–>  Input device support—>mice—-> PS/2 mouse (NEW(如果是ps/2的鍵盤選擇這項,如果是usb類型的鼠標則需要開啟usb的驅動)

 

 

Device Drivers–> USB support —>Support for Host-side USB/xHCI HCD (USB 3.0) support和 EHCI HCD (USB 2.0) support還有 OHCI HCD (USB 1.1) support(勾選那個就可以了)

 

編譯設備文件
 Device Drivers  —>Generic Driver Options –> Maintain a devtmpfs filesystem to mount at /dev /Automount devtmpfs at /dev, after the kernel mounted the rootfs

 

配置網絡功能

 Networking support —> Networking options —>選項太多,用圖來表示,我的虛擬機虛擬的網卡是intel的,你們最好使用lspci查看一下你虛擬機上的網卡型號

123.11.jpg

123.12.jpg

UNIX: socket monitoring interface (套接字接口)/Unix domain sockets

Device Drivers–>Network device support –> Ethernet driver support (NEW)

我的網卡是intel所以選擇如圖

 Network core driver support (NEW)

123.14.jpg

完成上述的定制之后,就來開始編譯安裝了執行make bzImage,這個編譯的過程有點長,稍微耐心等待

123.15.jpg

編譯完成的文件在/usr/src/linux/arch/x86/boot/bzImage復制到/mnt/boot/目錄下

cp  /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/

 

      4、編輯一些配置文件

cd /mnt/boot/grub    

編譯grub配置文件

cd /mnt/boot/grub   

vim grub.conf

default=0
timeout=3
title this  is my first linux (3.13.2)
         root(hd0,0)
         kernel /baImage ro root=/mnt/dev/sda2 init=/bin/bash

 

編輯啟動程序

cd /mnt/sysroot/sbin/

vim init

#!/bin/bash
echo -e "\tWelcome to \033[34mmy first linux\033[0m"
mount -n -t proc /proc
mount -n -t sysfs sysfs /sys
mount -n -t devtmpfs none /dev
mount -n -o remount,rw /dev/sda2
/bin/bash

 

      5、移植命令

      利用腳本一直一些命令到定制的主機上去,腳本內容如下,主要功能將已安裝好的系統的命令及庫文件移植到目標系統上,#!/bin/bash
#
target=/mnt/sysroot

clearCmd() {
  if which $cmd &> /dev/null; then
        cmdPath=`which –skip-alias $cmd`
  else
        echo "No such command"
        return 5
  fi
}

cmdCopy() {
        cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}

libCopy() {
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
        done
}

while true; do
  read -p "Enter a command: " cmd
  if [ "$cmd" == 'quit' ] ;then
        echo "quit"
        exit 0
  fi
  clearCmd $cmd
  [ $? -eq 5 ] && continue

  cmdCopy $cmdPath
  libCopy $cmdPath
done
     

編 寫完成后,給腳本一個執行權限,然后會提示你輸你想移植的命令,比如bash,cat ,fdisk ,mount ls ,touch ,ifconfig ,route, netstat ,tree ,mkdir ,rmdir,halt, shutdown,reboot等

最好將/mnt/sysroot/bin/bash 鏈接到文件名為sh

123.16.jpg

     6、創建虛擬機

       在vmware上新建一個虛擬機,將制作好系統的磁盤裝載洗虛擬機里面,然后開機啟動。前面的創建 我就省略了,到創建磁盤的我截圖放在下面,選擇系統版本是選擇2.x64位內核,我們這邊編譯的事2.6.x的內核

123.17.jpg

將創建好的磁盤放入之后,就開始開機了,至此一個小型的linux就編譯安裝完成了。

123.18.jpg

原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/27565

(0)
fszxxxksfszxxxks
上一篇 2016-08-03
下一篇 2016-08-03

相關推薦

  • Redhat kickstart 無人值守安裝

                       Redhat kickstart 無人值守安裝 一、PXE       PXE工作于Client/Server的網絡模式,支持可以通…

    系統運維 2016-09-21
  • locate,find文件查找

    locate | find *** locate 路徑中包含字符串 即匹配;      -n#     指定顯示結果前幾個      -b      只匹配路徑名中的基名      &nbs…

    Linux干貨 2016-08-15
  • 源碼編譯安裝http

    為什么需要編譯安裝軟件?   1、軟件在編譯期間需要配置:比如需要指定安裝路徑,定制模塊等功能;   2、軟件需要統一安裝路徑:在編譯安裝時可以方便指定這些路徑;   3、需要最新的版本:對于某些軟件來說可能需要最新的版本。 編譯前的準備工作:     1、安裝開發工具:make、gcc等…

    Linux干貨 2016-08-24
  • linux 文件管理命令

    cp 復制文件或者路徑 單源復制: cp [OPTION]…[-T] SOUTCE DEST 如果DEST不存在:則事先創建此文件,并復制源文件的數據流到DEST中 如果DEST存在:   如果DEST是非目錄文件:則覆蓋目標文件; 如果DEST是目錄,就在這個目錄中創建一個同名的文件,把源數據復制到這個文件中。 多源復制: cp [O…

    Linux干貨 2017-08-28
  • KVM部署及簡單使用

    KVM特點 KVM必須在具備Intel VT或AMD-V功能的x86平臺上運行。KVM包含一個為處理器提供底層虛擬化,可加載的核心模塊kvm.ko(kvm-intel.ko或kvm-AMD.ko)。使用一個經過修改的QEMU(qemu-kvm),作為虛擬機上層控制和界面。 由于KVM僅是一個簡單的虛擬化模塊,所以它的內存管理沒有自我實現,需借助于Linux內…

    Linux干貨 2016-02-14
  • Linux 第八天: 練習和作業

    Linux 第八天: (08月09日) 練習和作業       1刪除/etc/grub2.cfg所有以空白開頭的行行首空白字符 sed 's#^[[:space:]]\+##' /etc/grub2.cfgsed -r 's@^[[:space:]]+@@' /etc/grub2.cfg…

    Linux干貨 2016-08-11
欧美性久久久久