一、Linux系统的启动流程
1、启动程序
Linux系统的启动流程为:POST-->BIOS(BootSequence)-->MBR(bootloader,446)-->
Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab)。
首先上电自检POST:它负责完成对cpu、主板、内存、软硬盘子系统、显示子系统(包括显示缓存)、串并行接口、键盘、CD-ROM光驱等的检测。主要检查硬件的好坏。
紧接着就是BIOS进行硬件相关初始化,之后定义可启动设备的运行顺序,接下来开始进行启动设备数据的读取。
MBR即主引导分区(512字节),其中前466字节存放Bootloader(引导装载程序),64字节为分区信息,2字节标记MBR是否有效。
之后启动内核Kernel,装载启动模块,运行系统的第一个进程。
2、系统的组成部分
组成部分:
核心文件:/boot/vmlinuz-VERSION-release 内核
CentOS 5: /boot/initrd-VERSION-release.img工具程序:mkinitrd
CentOS 6: /boot/initramfs-VERSION-release.img工具程序:mkinitrd,dracut
模块文件:/lib/modules/VERSION-release
3、引导加载程序Grub
在MBR中,Linux常用的应到加载程序为Grub。其重要功能有:提供菜单、并提供交互式接口;加载用户选择的内核或操作系统;为菜单提供了保护机制。它的运行阶段可以分为:
1st stage: 位于MBR中,为了引导2nd stage
1.5 stage: 位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展
2nd stage: 位于boot基本磁盘分区中,GRUB的引导程序(/boot/grub/)。
二、在Vmvare上基于宿主机制作一个小系统
1、制作的系统说明:
在Vmware上以CentOS6.5宿主机,加在一块磁盘(/dev/sdb)在上面制作目标机,制作的系统功能有能装载网卡驱动,并配置IP地址;系统启动进程通过init脚本。宿主机上的配置:
2、给目标磁盘分区将分别挂载
[root@mylinuxmnt]#fdisk-l/dev/sdb Disk/dev/sdb:5368MB,5368709120bytes 255heads,63sectors/track,652cylinders Units=cylindersof16065*512=8225280bytes Sectorsize(logical/physical):512bytes/512bytes I/Osize(minimum/optimal):512bytes/512bytes Diskidentifier:0x58ff3d53 DeviceBootStartEndBlocksIdSystem /dev/sdb111321060258+83Linux /dev/sdb2133394210451583Linux [root@mylinuxmnt]#mount-text2/dev/sdb1/mnt/boot [root@mylinuxmnt]#mount-text2/dev/sdb2/mnt/sysroot/
3、安装grub到目标磁盘
[root@mylinuxmnt]#grub-install--root-directory=/mnt/dev/sdb ProbingdevicestoguessBIOSdrives.Thismaytakealongtime. Installationfinished.Noerrorreported. Thisisthecontentsofthedevicemap/mnt/boot/grub/device.map. Checkifthisiscorrectornot.Ifanyofthelinesisincorrect,fixitandre-runthescript`grub-install'. (fd0)/dev/fd0 (hd0)/dev/sda (hd1)/dev/sdb [root@mylinuxboot]#ls grublost+found
4、复制内核和initrd文件
[root@mylinuxboot]#cp/boot/vmlinuz-2.6.32-431.el6.x86_64/mnt/boot/vmlinux [root@mylinuxboot]#cp/boot/initramfs-2.6.32-431.el6.x86_64.img/mnt/boot/initramfs.img [root@mylinuxboot]#ls grubinitramfslost+foundvmlinux
5、创建目标主机的根文件系统
[root@mylinuxboot]#mkdir-pv/mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bi n,sbin,boot,srv,mnt,media,hoome,root} [root@mylinuxboot]#tree/mnt/sysroot/ /mnt/sysroot/ ├──bin ├──boot ├──dev ├──etc │└──rc.d ├──hoome ├──lib ├──lib64 ├──lost+found ├──media ├──mnt ├──proc ├──root ├──sbin ├──srv ├──sys ├──usr └──var
6、移植bash等到目标机根文件系统
在这里我是用自己写的一个小脚本,它可以复制自己输入的命令,如(ifconfig、insmod、mv、ls、cp、mount等)以及所依赖的库文件。脚本如下:
#!/bin/bash #Time:2016-09-01 # Desdir=/mnt/sysroot [-d$Desdir]||mkdir-p$Desdir whiletrue;do read-p"Pleaseinputacommand:"Command if[["$Command"!="quie"]];then ldd`which$Command`2>/dev/null|grep-o"/[^[:space:]]\{1,\}.*[[:space:]]">>a.txt whilereadLINE;do [-d${Desdir}`dirname$LINE`]||mkdir-p${Desdir}`dirname$LINE` [-f${Desdir}${LINE}]||cp$LINE${Desdir}${LINE} filecmd=`which$Command|grep-o"/.*"` [-d${Desdir}`dirname$filecmd`]||mkdir-p${Desdir}`dirname$filecmd` [-f$Desdir$filecmd]||cp$filecmd$Desdir$filecmd done<a.txt rm-fa.txt else exit0 fi done
7、为grub提供配置文件
default=0 timeout=5 titleMylinuxLittleLinux root(hd0,0) kernel/vmlinuzroroot=/dev/sda2quietselinux=0init=/bin/bash initrd/initramfs.img
8、写启动文件init
由于要配置网卡功能,所以要移植网卡驱动模块到目标机,在我的宿主机中使用的网卡驱动模块为e1000.ko 所以复制此模块,在init中配置文件中装载。
[root@mylinuxhome]#cp/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/pcnet32.ko/mnt/sysroot/lib/modules/ [root@mylinuxhome]#vim/mnt/sysroot/sbin/init #!/bin/bashecho"WelcomtoLinux" mount-n-tprocproc/proc mount-n-tsysfssysfs/sys insmod/lib/modules/pcnet32.ko ifconfiglo127.0.0.1/8 ifconfigeth0192.168.1.142/16 mount-n-oremount,rw/dev/sda2/ /bin/bash
9、测试目标机器