在时间的工作过程中,基于实际的工作环境,我们一个功能比较少的,简易的linux系统。
出于这样的考虑我们来打造一个简易的linux系统
首先了解linux的启动过程
1.加载bios的硬件信息以及进行自我检测 并根据设置取得第一个启动的设备
2.若以硬盘方式引导 读取并执行引导扇区 MBR(MBR包括三个部分, 第一boot loder 实际上是引导程序的第一段 linux引导程序有grub和 lilo 由于grub菜单比较大 分为两部分 所以将grub菜单的一部分写在512字节之中 占446B 64B分区表 几个分区 起始柱面结束柱面 剩下的就是标示码)
3.加载grub(引导程序)启动菜单(/\)
4.+加载内核(以只读方式进行挂载)
5.挂载根目录系统 启动init进程(所有进程的鼻祖)
6.读取/etc/inittab配置文件
7.执行/etc/rc.d/rc.sysint脚本
8.根据/etc/initab文件下的启动级别执行/etc/rc.d/rc下的脚本
9.执行/etc/rc.d/rc.local (开机脚本 期望开机自动执行的指令可以放在这个脚本里)
9.执行/etc/rc.d/rc.local (开机脚本 期望开机自动执行的指令可以放在这个脚本里)
打造一个简易的linux需要的东西:A.内核B.常用的驱动C.Inittab文件D.常用的指令E.库文件F.简单的应用
实验环境:一台宿主机 一个空白硬盘
第一步:对新的硬盘进行分区、格式化等相关操作
A、对新的硬盘进行分区
[root@localhost ~]# fdisk /dev/sdb
B、对新硬盘的分区进行格式化操作
[root@localhost ~]# mkfs -t ext3 /dev/sdb1
[root@localhost ~]# mkfs -t ext3 /dev/sdb2
C、建立挂载点将第二块分区挂载上
[root@localhost ~]# mkdir /mnt/root
[root@localhost ~]# mkdir /mnt/sysroot
[root@localhost ~]# mount /dev/sdb1 /mnt/root #新硬盘的引导分区
[root@localhost ~]# mount /dev/sdb2 /mnt/sysroot#新硬盘的根分区
第二步:在第二块硬盘的引导分区建立grub引导菜单
A、建立grub引导菜单
[root@localhost ~]# grub-install --root-directory=/mnt/ /dev/sdb#--root-directory #会试图在致命的目录下找到boot目录,在boot目录建grub
[root@localhost ~]# cd /mnt/boot
[root@localhost boot]# cd grub
B、Grub引导菜单已经建立 建立MBR
[root@localhost grub]# grub
C、内核和驱动的操作
内核的拷贝:
[root@localhost grub]# cp /boot/vmlinuz-2.6.18-164.el5 /mnt/boot/
驱动的编辑:
[root@localhost ~]# zcat /boot/initrd-2.6.18-164.el5.img | cpio -id
#查看旧的驱动并解压缩
重新打包驱动文件:
[root@localhost abc]# find . |cpio -o -H newc --quiet |gzip -9 -n >/mnt/boot/initrd.gz
D、编辑grub.conf
[root@localhost boot]# vim /mnt/boot/grub/grub.conf
第三步:init进程的阶段
A.首先建立一些需要的文件夹
在/mnt/sysroot下边建立和宿主机根目录下相同的文件夹
[root@localhost sysroot]# mkdir usr/bin
[root@localhost sysroot]# mkdir usr/sbin
[root@localhost sysroot]# mkdir etc/rc.d
B.将宿主机下的init拷贝到新硬盘相对应的文件夹下以及相应一些命令的拷贝
[root@localhost sysroot]# cp /sbin/init /mnt/sysroot/sbin/
由于手动拷贝库文件是很麻烦的 所以使用脚本拷贝 编辑一个脚本
#!/bin/bash
while [ true ];do
read -p "A COMMAND " COMMAND
COMMANDSTRING=`which $COMMAND`
cp -f $COMMANDSTRING /mnt/sysroot$COMMANDSTRING
/usr/bin/ldd $COMMANDSTRING > /root/1.txt
while read line ; do
if [ grep /lib $line &>/dev/null ];then
LIBSTRING=`echo $i |awk '{print $(( NF -1 ))}'`
#LINBANME=${LIBSTRING##*/}
#LIBPATH=${LIBSTRING%/*}
/bin/cp -f $LIBSTRING /mnt/sysroot$LIBSTRING
fi
done
done
运行脚本拷贝一些相应的指令
C、创建inittab
[root@localhost ~]# cd /mnt/sysroot/etc
[root@localhost etc]# vim inittab
根据inittab知道系统在进入任何级别都需要执行/etc/rc.d/rc.sysinit
建立rc.sysinit
[root@localhost etc]# vim rc.d/rc.sysinit
[root@localhost rc.d]# chmod a+x rc.sysinit
第四步、测试:在另外一台虚拟上测试