1. 前言
今天我將會給大家帶來如何定制一個屬于自己linux系統,也就是編譯內核,那為什么要編譯內核呢?
內核,是一個操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統管理,決定著系統的性能和穩定性。Linux作為一個自由軟件,在廣 大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統度身定制一 個更高效,更穩定的內核,就需要重新編譯內核
對開源操作系統(主要是指Linux)的內核源代碼在本機進行有針對性的編譯,就叫做內核編譯。
編譯內核的目的主要是改變內核的默認選項,比如內核原來不支持某硬件,原因是內核的相應選項默認狀態是disactivated,需要改變。
編譯內核將會有更多的選擇,有些功能需要啟用,而有些功能不需要啟動,啟用我們需要的某些功能,關閉那些無用的功能,按照自己的要求來定制和優化內核,減少空間,定制一個代碼少的內核,還能系統運行的速度和性能
其次還有就是有些愛搗鼓的朋友們學習和研究,可以多加嘗試。那接下來我們就跟大家展示如何去編譯內核。
準備編譯環境,centos6安裝完成的一個操作系統(并且機器上已經安裝過編譯環境),內核 文件,虛擬機軟件,我這里的用的事vmware
首先我們在centos6上添加一塊硬盤,便于待會給小型的linux分區,添加硬盤在系統關機的情況下添加
添加一個scsi類型的磁盤,大小為5G即可,在添加磁盤時,最后要選擇磁盤存放的位置,我這里指定的事桌面,以便待會好找,你們也可以放到一個自己好找的地方即可。硬盤文件時以vmdk結尾的文件
添加好硬盤之后我們這里開啟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
這樣兩個分區就分好了,分區完成執行格式化命令
mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
格式化完成,創建掛載點掛載分區
mkdir /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
創建grub
grub-install –root-directory=/mnt /dev/sdb ,grub安裝完成后,查看/mnt/boot/下面有沒有一個叫做grub的目錄, 如果存在說明已經安裝成功,如果不存在,請重新安裝grub
我們掛載的/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
編譯內核之前請確保你的centos6安裝了編譯安裝環境,如果沒有請創建yum倉庫,然后安裝編譯安裝環境,主要安裝"Development Tools"和“Server Platform Development”,我這里已經安裝過了
編譯環境安裝完成后,我們進到源碼目錄去,/usr/src/linux,然后執行make allnoconfig生成一個.confgi的文件
而后執行make menuconfig (這里要提醒一下,如果有朋友是用xshell鏈接到虛擬機的,需要將xshell全屏,不然會報錯,會因為你的寬度不夠,而打不開GUI界面)
使用方法:選擇某項使用空格,當顯示是*時表示編譯進內核,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查看一下你虛擬機上的網卡型號
UNIX: socket monitoring interface (套接字接口)/Unix domain sockets
Device Drivers–>Network device support –> Ethernet driver support (NEW)
我的網卡是intel所以選擇如圖
Network core driver support (NEW)
完成上述的定制之后,就來開始編譯安裝了執行make bzImage,這個編譯的過程有點長,稍微耐心等待
編譯完成的文件在/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
6、創建虛擬機
在vmware上新建一個虛擬機,將制作好系統的磁盤裝載洗虛擬機里面,然后開機啟動。前面的創建 我就省略了,到創建磁盤的我截圖放在下面,選擇系統版本是選擇2.x64位內核,我們這邊編譯的事2.6.x的內核
將創建好的磁盤放入之后,就開始開機了,至此一個小型的linux就編譯安裝完成了。
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/27565