Linux基礎(chǔ)教程之內(nèi)核編譯以及自制Linux系統(tǒng)
內(nèi)核編譯
單內(nèi)核體系設(shè)計(jì)、但充分借鑒了微內(nèi)核設(shè)計(jì)體系的優(yōu)點(diǎn),為內(nèi)核引入模塊化機(jī)制。
內(nèi)核組成部分:
kernel: 內(nèi)核核心,一般為bzImage,通常在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE;
kernel object: 內(nèi)核對(duì)象,一般放置于/lib/modules/VERSION-RELEASE/
[ ]: None
[M]: 表示模塊化安裝
[*]: 表示打到內(nèi)核核心
輔助文件: ramdisk
initrd
initramfs
運(yùn)行中的內(nèi)核:
uname命令:
uname – print system information
uname[OPTION]…
-n: 顯示節(jié)點(diǎn)名稱;
-r: 顯示VERSION-RELEASE;
-a:顯示所有信息
lsmod命令:
顯示由核心已經(jīng)裝載的內(nèi)核模塊
顯示的內(nèi)容來(lái)自于: /proc/modules文件
示例:可以看見(jiàn)已經(jīng)加載的模塊
modinfo命令:
顯示模塊的詳細(xì)描述信息
modinfo[ -k kernel ] [ modulename|filename… ]
-n: 只顯示模塊文件路徑
-p: 顯示模塊參數(shù)
-a: author
-d: description
-l: license
示例:顯示模塊的詳細(xì)信息
modprobe命令:
裝載或卸載內(nèi)核模塊
modprobe [ -C config-file ] [ modulename] [ module parame-ters… ] 安裝內(nèi)核
配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf
modprobe [ -r ] modulename… 卸載內(nèi)核模塊
示例1:卸載網(wǎng)卡驅(qū)動(dòng),然后發(fā)現(xiàn)沒(méi)有eth那些網(wǎng)卡配置信息了
示例2:加載網(wǎng)卡驅(qū)動(dòng)
depmod命令:
內(nèi)核模塊依賴關(guān)系文件及系統(tǒng)信息映射文件的生成工具
裝載或卸載內(nèi)核模塊:
insmod命令:指定模塊文件,不自動(dòng)解決依賴模塊
insmod[ filename ] [ module options… ]
insmod`modinfo–n exportfs`
lnsmod`modinfo–n xfs`
rmmod
rmmod[ modulename]
rmmod xfs
rmmod exportfs
內(nèi)核相關(guān)目錄
/proc目錄:
內(nèi)核把自己內(nèi)部狀態(tài)信息及統(tǒng)計(jì)信息,以及可配置參數(shù)通過(guò)proc偽文件系統(tǒng)加以輸出
參數(shù):只讀:輸出信息
可寫:可接受用戶指定“新值”來(lái)實(shí)現(xiàn)對(duì)內(nèi)核某功能或特性的配置
/proc/sys
(1) sysctl命令用于查看或設(shè)定此目錄中諸多參數(shù)
sysctl-w path.to.parameter=VALUE
sysctl-w kernel.hostname=mail.magedu.com
(2) echo命令通過(guò)重定向方式也可以修改大多數(shù)參數(shù)的值
echo “VALUE” > /proc/sys/path/to/parameter
echo “websrv” > /proc/sys/kernel/hostname
/sys目錄:
sysfs:為用戶使用的偽文件系統(tǒng),輸出內(nèi)核識(shí)別出的各硬件設(shè)備的相關(guān)屬性信息,也有內(nèi)核對(duì)硬件特性的設(shè)定信息;有些參數(shù)是可以修改的,用于調(diào)整硬件工作特性。
udev通過(guò)此路徑下輸出的信息動(dòng)態(tài)為各設(shè)備創(chuàng)建所需要設(shè)備文件,udev是運(yùn)行用戶空間程序
專用工具:udevadmin, hotplug
udev為設(shè)備創(chuàng)建設(shè)備文件時(shí),會(huì)讀取其事先定義好的規(guī)則文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目錄下
sysctl命令:
默認(rèn)配置文件:/etc/sysctl.conf
(1) 設(shè)置某參數(shù)
sysctl-w parameter=VALUE
(2) 通過(guò)讀取配置文件設(shè)置參數(shù)
sysctl-p [/path/to/conf_file]
內(nèi)核中的路由轉(zhuǎn)發(fā):
/proc/sys/net/ipv4/ip_forward
常用的幾個(gè)參數(shù):
net.ipv4.ip_forward
net.ipv4.icmp_echo_ignore_all
vm.drop_caches
ramdisk文件的制作:
(1) mkinitrd命令????為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname-r).img $(uname-r)
(2) dracut命令????為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件
dracut /boot/initramfs-$(uname-r).img $(uname-r)
示例:假如initramfs文件丟失,恢復(fù)之
刪除initramfs文件,然后重啟
會(huì)發(fā)現(xiàn)已經(jīng)登陸不進(jìn)去系統(tǒng)
此時(shí)進(jìn)入救援模式運(yùn)行進(jìn)行修復(fù)
修復(fù)完畢,重啟,會(huì)發(fā)現(xiàn)SELinux在檢查,稍等即可進(jìn)入系統(tǒng)
編譯內(nèi)核
前提:
(1) 準(zhǔn)備好開(kāi)發(fā)環(huán)境
(2) 獲取目標(biāo)主機(jī)上硬件設(shè)備的相關(guān)信息
(3) 獲取目標(biāo)主機(jī)系統(tǒng)功能的相關(guān)信息
例如:需要啟用相應(yīng)的文件系統(tǒng)
(4) 獲取內(nèi)核源代碼包
www.kernel.org
開(kāi)發(fā)環(huán)境準(zhǔn)備
包組(CentOS 6):
Server Platform Development
Development Tools
目標(biāo)主機(jī)硬件設(shè)備相關(guān)信息:
CPU:
# cat /proc/cpuinfo
# x86info -a
# lscpu
硬件設(shè)備
PCI設(shè)備:
lspci
-v
-vv
lsusb
-v
-vv
lsblk ?塊設(shè)備
了解全部硬件設(shè)備信息
hal-device
內(nèi)核編譯安裝系統(tǒng)
安裝開(kāi)發(fā)包組
下載源碼文件
.config:準(zhǔn)備文本配置文件
make menuconfig:配置內(nèi)核選項(xiàng)
make [-j #]
make modules_install:安裝模塊
make install :安裝內(nèi)核相關(guān)文件
安裝bzImage為/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
編輯grub的配置文件
(1) 配置內(nèi)核選項(xiàng)
支持“更新”模式進(jìn)行配置:make help
(a) make config:基于命令行以遍歷的方式去配置內(nèi)核中可配置的每個(gè)選項(xiàng)
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)環(huán)境窗口界面
(d) make xconfig:基于QT(KDE)環(huán)境的窗口界面
支持“全新配置”模式進(jìn)行配置
(a) make defconfig:基于內(nèi)核為目標(biāo)平臺(tái)提供的“默認(rèn)”配置進(jìn)行配置
(b) make allyesconfig: 所有選項(xiàng)均回答為“yes“
(c) make allnoconfig: 所有選項(xiàng)均回答為”no“
(2) 編譯
全編譯:make [-j #]
編譯內(nèi)核的一部分功能:
(a) 只編譯某子目錄中的相關(guān)代碼:
# cd /usr/src/Linux
# make dir/
(b) 只編譯一個(gè)特定的模塊:
# cd /usr/src/Linux
# make dir/file.ko
例如:只為e1000編譯驅(qū)動(dòng):
# make drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉編譯內(nèi)核:
編譯的目標(biāo)平臺(tái)與當(dāng)前平臺(tái)不相同才需要交叉編譯
# make ARCH=arch_name
要獲取特定目標(biāo)平臺(tái)的使用幫助
# make ARCH=arch_namehelp
# make ARCH=arm help
在已經(jīng)執(zhí)行過(guò)編譯操作的內(nèi)核源碼樹(shù)做重新編譯:
需要事先清理操作:
# make clean:清理大多數(shù)編譯生成的文件,但會(huì)保留config文件等
# make mrproper: 清理所有編譯生成的文件、config及某些備份文件
# make distclean:mrproper、patches以及編輯器備份文件
示例:簡(jiǎn)單Linux kernel內(nèi)核編譯過(guò)程
首先提示,此處用虛擬的同學(xué),盡量把虛擬機(jī)的核心數(shù)量調(diào)大一點(diǎn),跟實(shí)際的主機(jī)一樣就可以了,此處操作只是為了加快編譯的時(shí)間,編譯的時(shí)候會(huì)消耗大量的cpu資源,如果想繼續(xù)做其他操作的小伙伴,可以忽略此處
在系統(tǒng)里面可以查看到當(dāng)前系統(tǒng)的核心數(shù)量
進(jìn)行內(nèi)核操作,請(qǐng)自備Linux內(nèi)核。而且編譯內(nèi)核以前,請(qǐng)做好備份,編譯內(nèi)核的主版本,請(qǐng)盡可能跟原有的內(nèi)核版本相近,因?yàn)橹苯硬捎米钚碌膬?nèi)核版本,有可能會(huì)導(dǎo)致系統(tǒng)崩潰。
此處內(nèi)核可以到www.kernel.org下載
此次實(shí)驗(yàn)我們用的是Linux-3.18.41版本的內(nèi)核,當(dāng)前系統(tǒng)是3.10.0的版本的內(nèi)核
/usr/scr/kernels,此處目錄是存放內(nèi)核文件的地方,現(xiàn)在只有一個(gè)3.10版本的內(nèi)核
解壓新的內(nèi)核到/usr/src目錄下面
創(chuàng)建Linux-3.18-41的軟連接目錄Linux,此處的操作是為了后面的操作每次都需要內(nèi)核版本號(hào),一旦輸入錯(cuò)誤的話,就又得重來(lái)了(編譯兩小時(shí),報(bào)錯(cuò)5秒鐘)
復(fù)制原有系統(tǒng)的/boot/config-3.10.0-327.el7.x86_64的文件到/usr/src/Linux目錄下面為.config的文件
運(yùn)行make menuconfig命令來(lái)配置內(nèi)核選項(xiàng),如果此處有報(bào)錯(cuò)的話,例如下圖,表明一些編譯內(nèi)核的工具還沒(méi)有安裝,此處我們通過(guò)yum倉(cāng)庫(kù)來(lái)安裝一下相關(guān)的文件,此處除了報(bào)錯(cuò)的curses.h的文件以外,還有
Server Platform Development、Development Tools等工具是必須要安裝的,編譯以前需要查看一下工具是否都已經(jīng)安裝完畢。
安裝完相關(guān)的工具以后,重新運(yùn)行make menuconfig命令
此時(shí)我們已經(jīng)可以正常進(jìn)入編輯內(nèi)核選項(xiàng)的圖形化界面,在這里我們可以選擇我們需要的內(nèi)核功能
例如此處可以編譯內(nèi)核的名字,像本機(jī)內(nèi)核的3.10.0-327.el7.x86_64后面的-327.el7.x86_64就是在此處編輯
例如我們可以定義為-1.0_wanLinux
再看看其他功能,比如此處可以選擇windows的文件系統(tǒng)
可以看見(jiàn)有一個(gè)NTFS文件系統(tǒng)支持的選擇
按空格鍵可以選中此功能,此處的M表示以模塊化的方式來(lái)安裝此文件驅(qū)動(dòng),這樣的話在系統(tǒng)的 modules文件夾里面即可以查找到這個(gè)文件
再多按一次空格健會(huì)編程一個(gè)*,表示直接把此集成到內(nèi)核里面,在系統(tǒng)里面運(yùn)行的話是看不到此文件的
當(dāng)選擇好那些我們需要內(nèi)核參數(shù)以后,就可以選擇此處的保存
默認(rèn)保存.config的文件
上面的步驟準(zhǔn)備好以后,輸入make -j 4開(kāi)始編譯,此處的-j 4表示指定cpu的數(shù)量,因?yàn)槲疫@里核心數(shù)量是4,輸入完以后,內(nèi)核就開(kāi)始編譯了,此處需要等待很長(zhǎng)的時(shí)間
編譯完以后/lib/modules并不會(huì)馬上生成內(nèi)核的文件
此時(shí)回去/usr/src/Linux目錄下面運(yùn)行make modules_install安裝內(nèi)核模塊
上面的運(yùn)行完以后,我們可以看見(jiàn)/lib/modules目錄下面會(huì)多一個(gè)3.18.41的內(nèi)核文件,查看一下該目錄,居然有7G多,所以小伙伴們編譯的時(shí)候注意看一下磁盤的空間容量。
再運(yùn)行make install安裝內(nèi)核相關(guān)文件
安裝bzImage為/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
然后會(huì)發(fā)現(xiàn)/boot目錄下面多了內(nèi)核3.18.41的文件
進(jìn)入/boot/grub2/目錄下面查看grub.cfg文件
可以看見(jiàn)grub里面已經(jīng)有3.18.41內(nèi)核的加載選項(xiàng)
重啟電腦看看,可以發(fā)現(xiàn)有3.18.41內(nèi)核的啟動(dòng)選項(xiàng)
此時(shí)可以正常登陸進(jìn)來(lái),表示安裝新的內(nèi)核成功。
自制Linux示例
此處只是利用現(xiàn)有的Linux系統(tǒng)文件來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的Linux系統(tǒng),還缺乏許多功能
首先準(zhǔn)備一個(gè)空的磁盤,這里實(shí)驗(yàn)使用一個(gè)虛擬機(jī)的磁盤
分區(qū)并創(chuàng)建文件系統(tǒng)
fdisk/dev/sdb
分兩個(gè)必要的分區(qū)
/dev/sdb1對(duì)應(yīng)/boot /dev/sdb2對(duì)應(yīng)根/
mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2
掛載boot
mount /dev/sdb1 /mnt/boot
安裝grub
grub-install /dev/sdb?–root-directory=/mnt
安裝完grub以后可以查看一下sdb的mbr信息是否正常
恢復(fù)內(nèi)核和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/boot
建立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
創(chuàng)建一級(jí)目錄
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}
創(chuàng)建/etc/fstab掛載文件
復(fù)制bash和相關(guān)庫(kù)文件,這個(gè)是必須的
復(fù)制相關(guān)命令及相關(guān)庫(kù)文件,如:ls,cat,vim,reboot,hostname,mount,umount,tree等,非必須,但是最好還是安裝上,這些小命令部分能在小Linux上面跑,有些不能,因?yàn)橄到y(tǒng)文件并不是很全
注意:此處的copycmd.sh是自己編寫的腳本,內(nèi)容就是復(fù)制bash和ls之類這些相關(guān)的文件到/sysroot下面,當(dāng)然,此處也可以自行一個(gè)一個(gè)復(fù)制,只是比較麻煩
復(fù)制完可以看見(jiàn)bin和lib64等等目錄下面多了許多相關(guān)文件
復(fù)制完相關(guān)的文件,我們可以用chroot命令來(lái)切根試試能不能正常進(jìn)入,如果可以的話,應(yīng)該問(wèn)題就不大,完成此步驟以后就可以關(guān)機(jī)了
現(xiàn)在我們新建一個(gè)虛擬機(jī)測(cè)試一下剛那塊虛擬磁盤里面的系統(tǒng)看是否能正常運(yùn)行
虛擬機(jī)里面需要使用一塊現(xiàn)有的虛擬硬盤,其他的配置就跟平時(shí)創(chuàng)建虛擬機(jī)一樣即可
配置完虛擬機(jī)以后,開(kāi)機(jī)!
此時(shí)可以看見(jiàn)登陸的界面了!
正常進(jìn)入到系統(tǒng)了!界面有點(diǎn)像救援模式,(當(dāng)然此處可以把自制的小Linux系統(tǒng)安裝到u盤里面當(dāng)成系統(tǒng)盤運(yùn)行,就像windows老毛桃pe之類的)
在里面測(cè)試了一下之前復(fù)制的命令,有些可以,有些不可以,此處實(shí)驗(yàn)完畢。