基于主机的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


你可能感兴趣的:(grub,内核裁剪)