基於主機的linux裁剪,並自動安裝網卡模塊。

前言。

Linux系統啓動流程。

(1)POST(Power-onSelf Test:開機自檢)

(2)BIOS(BootSequence:指定啓動的設備讀取磁盤中操作系統內核文件)(3)MBR(BootLoader加載內核文件至內存)

(4)kernel(initramfs(centos6) :將內核解壓縮爲根目錄,加載合適的驅動程序,最後退出虛擬文件系統)

(5)/sbin/init(實現系統的初始化,負責管理用戶空間的進程)

(6)啓動shell

由此可知,裁剪內核關鍵在於步驟(3)(4)(5)

環境

虛擬機VMwareWorks,centos6.5

新建一臺1221,新添加一塊磁盤命名爲2 Hard Disk,默認是sdb

新建Mini Linx,選擇磁盤必須爲上述已存在的2.Hard Dis

步驟

(1)在1221新加的磁盤分區sdb1,sdb2。格式化(ext4格式),分別掛載至目錄/mnt/boot,/mnt/sysroot。

相信難不到大家的哦,所用命令如下。

fdisk /dev/sdb ;

mke2fs -t ext4 /dev/sdb1;

mkdir-pv /mnt/{boot,sysroot}

結果如下

wKiom1Ma1dPxv-kDAACVc7sNsCw125.jpg

(2)在sdb上安裝grub

注意此處的“--root-directory=/mnt”選項,sdb1是掛載在/mnt/boot上的,不要寫成--root-directory=/mnt/boot 了。

sdb對應的硬盤是hd1,但是這個編號1僅僅對次主機有效,換到一個單獨的主機上的時候就是hd0。

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

wKiom1Ma1pWxu8L7AACFNZJ2o5s843.jpg


(3)複製內核vmlinuz和內核加載部分硬件所依賴的initramfs

cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img

(4)創建Linux需要的一些基本文件(在Mini Linux系統上需要的)

mkdir -pv /etc/rc.d root boot dev proc sys tmp var usr srv lib lib64 bin sbin home mnt media

(5)移植bash和一些相關的命令至目標主機的根文件系統(後面網卡的配置需要)

wKiom1Ma3MnjWYh1AABD7OhIqjE666.jpg


(6)切換到/mnt/sysroot/bin/目錄下、給bash創建一個軟鏈接,同時測試bash是否移植成功

 ln -sv bash sh

wKioL1Ma3ZvxtE-sAABI4EAZ0_Q970.jpg

(7)在目標機的/boot/grub目錄中創建grub.conf,實現開機自檢

wKiom1Ma3pqAj-odAABPHkKPFDQ546.jpg

(8)爲了能夠實現開機啓動網卡,需要將宿主機上的網卡配置文件複製到目標機上,可以通過lsmod查看當前系統的所有模塊,可以通過modinfo 模塊名稱來查看模塊的詳細信息,同時複製模塊至目標主機lib/modules目錄。


wKioL1Ma5amBJQzNAAArB95P-0E300.jpg

wKioL1Ma5auAyJFuAAFWne3G-C0148.jpg

mkdir -p /mnt/sysroot/lib/modules

cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/

(9)爲了使系統能夠開機自動掛載一些文件系統和初始化一些服務,在目標機sbin/目錄創建init文件

wKiom1Ma5ySgCENQAABdfG0bsiw649.jpg

開啓Mini Linux可以看到

wKiom1Ma6HqBQAN-AACg4O02mUY016.jpg

網卡模塊安裝配置成功如下,

wKioL1Ma50TxNowfAADUcvKRH88194.jpg

也可ping通

wKiom1Ma52vwtLpKAACNrvdfpcU482.jpg


附:bincp.sh腳本(移植可執行程序的腳本、包括程序所依賴的庫文件)

#!/bin/bash
#定義目標目錄、也就是要拷貝到的那個目錄
target=/mnt/sysroot
#聲明清理命令的方法
clearCmd() {
#判斷命令是否存在、如果不存在就提示沒有找到命令
ifwhich$cmd &> /dev/null; then
#獲取命令的路徑
cmdPath=`which--skip-alias$cmd`
else
echo"No such command"
return5
fi
}
#定義拷貝命令的方法
cmdCopy() {
#獲取命令路徑、只取目錄部分
cmdDir=`dirname$1`
#判斷目錄是否存在、不否在就創建
[ -d ${target}${cmdDir} ] || mkdir-p ${target}${cmdDir}
#判斷要拷貝的命令否存在在、不存在就拷貝
[ -f ${target}${1} ] || cp$1 ${target}${cmdDir}
}
#定義拷貝庫文件的方法
libCopy() {
#循環所有獲得的命令所依賴的所有庫文件
forlib 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
}
#循環讓用戶輸入要拷貝的命令
whiletrue; do
read-p "Enter a command: "cmd
if[ "$cmd"== 'quit'] ;then
echo"quit"
exit0
fi
#調用清理命令方法
clearCmd $cmd
[ $? -eq5 ] && continue
#調用拷貝命令和庫文件的方法
cmdCopy $cmdPath
libCopy $cmdPath
done


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