一、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@mylinux mnt]# fdisk -l /dev/sdb Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x58ff3d53 Device Boot Start End Blocks Id System /dev/sdb1 1 132 1060258+ 83 Linux /dev/sdb2 133 394 2104515 83 Linux [root@mylinux mnt]# mount -t ext2 /dev/sdb1 /mnt/boot [root@mylinux mnt]# mount -t ext2 /dev/sdb2 /mnt/sysroot/
3、安装grub到目标磁盘
[root@mylinux mnt]# grub-install --root-directory=/mnt /dev/sdb Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install‘. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb [root@mylinux boot]# ls grub lost+found
4、复制内核和initrd文件
[root@mylinux boot]# cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinux [root@mylinux boot]# cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img [root@mylinux boot]# ls grub initramfs lost+found vmlinux
5、创建目标主机的根文件系统
[root@mylinux boot]# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bi n,sbin,boot,srv,mnt,media,hoome,root} [root@mylinux boot]# 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 while true ; do read -p "Please input a command:" Command if [[ "$Command" != "quie" ]];then ldd `which $Command` 2> /dev/null | grep -o "/[^[:space:]]\{1,\}.*[[:space:]]" >> a.txt while read LINE ; 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 -f a.txt else exit 0 fi done
7、为grub提供配置文件
default=0 timeout=5 title Mylinux Little Linux root(hd0,0) kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash initrd /initramfs.img
8、写启动文件init
由于要配置网卡功能,所以要移植网卡驱动模块到目标机,在我的宿主机中使用的网卡驱动模块为e1000.ko 所以复制此模块,在init中配置文件中装载。
[root@mylinux home]# cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/ [root@mylinux home]# vim /mnt/sysroot/sbin/init #!/bin/bashecho "Welcom to Linux" mount -n -t proc proc /proc mount -n -t sysfs sysfs /sys insmod /lib/modules/pcnet32.ko ifconfig lo 127.0.0.1/8 ifconfig eth0 192.168.1.142/16 mount -n -o remount,rw /dev/sda2 / /bin/bash
9、测试目标机器
本文出自 “随风而飘” 博客,请务必保留此出处http://yinsuifeng.blog.51cto.com/10173491/1845785
原文地址:http://yinsuifeng.blog.51cto.com/10173491/1845785