首页 > 代码库 > 基于宿主机制作一个小系统

基于宿主机制作一个小系统

一、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

基于宿主机制作一个小系统