zoukankan      html  css  js  c++  java
  • 在VMware上制作一个简单的Linux

    大体思路

    boot root
    initrd.gz grub vmlinuz-2.6.18-308.el5 bin sbin lib etc proc sys dev boot

     

    有以上内容我们就可以运行一个非常简单的Linux,只需要往里面添加各种配置文件,就可以启动我们所需要的各种服务。在制作之前,我们先做一些准备工作。

    1、在VMware上添加一块新的IDE磁盘

    2、将这块盘分区,/dev/hdb1 /dev/hdb2,之后格式化为ext3的文件系统

    3、挂载/dev/hdb1到/mnt/boot;挂载/dev/hdb2到/mnt/sysroot

    前提工作做完之后,我们就可以分别制作boot和root了!那么我们就开始吧

    制作boot分区:

    initrd.gz

    initrd.gz其实是一个小的root,它也包含bin sbin lib etc proc sys dev mnt这些目录,并且还有一个重要的脚本文件init,实现从这个小root到我们真正的root的转换的功能。最终为了保证我们的Linux体积足够小,我们就把以上的全部压缩成了initrd.gz

    但是为了保证我们的小linux能够实现各种功能,我们只添加目录是不够的,因此我们使用busybox来虚拟bin sbin usr下的各种程序。因此我们要先制作一个busybox。

    我们下载稳定版的busybox版本busybox-1.20.2.tar.bz2

    1. tar -xf busybox-1.20.2.tar.bz2 -C /tmp  把busybox-1.20.2.tar.bz2解压到/tmp目录下
    2. cd /tmp/busybox-1.20.2  切换到 /tmp/busybox-1.20.2目录下
    3. make menuconfig  使用图形窗口对busybox进行编译

    进入图形界面后,重要的一项是把busybox所依赖的库文件做进busybox本身,这个库只提供给busybox调度使用;

    1. make install  要确保在/tmp/busybox-1.20.2/目录下使用命令

    但是我们会发现安装并不成功

    因此我需要下载一个更高版本的内核头文件,然后把它放在/tmp/busybox-1.20.2/include/mtd/

    ,因为我虚拟机上有linux-2.6.38.5的内核头文件,所以我就直接复制到上面目录下就可以了

    1. mkdir /tmp/busybox-1.20.2/include/mtd                 创建mtd目录 
    2. cd /tmp/busybox-1.20.2/include/mtd/                   切换至该目录下 
    3. cp /usr/src/linux-2.6.38.5/include/mtd/ubi-user.h ./  把头文件复制到当前目录下 
    4. cd /tmp/busybox-1.20.2                                再切回原busybox目录下 
    5. make install                                          继续安装就可以了 

    安装完成后,会在/tmp/busybox-1.20.2/目录下生成一个_install的目录,这表明我们的busybox安装成功了,并且_install目录下有我们所需要的bin sbin usr目录和各种程序脚本。

    1. cp ./_install/* /mnt/boot -a                    把_install目录下的所有文件复制到/mnt/boot目录下 
    2. cd /mnt/boot  在切换到/mnt/boot目录下,即我们的小linux的boot

    可以说现在才开始编写我们真正的initrd.gz

    我们发现/mnt/boot目录下缺少很多目录,所以我们手动添加几个进去

    1. mkdir etc proc sys lib/modules/ dev mnt/sysroot tmp -p  创建mnt/sysroot是为了实现根的切换

    创建我们的dev设备文件conlolenull

    1. mknod  dev/console  c  5  1 
    2. mknod  dev/null  c  1  3 

    我为了能够真正的驱动我们的根文件系统,因此我们需要让initrd.gz有能够驱动根分区的ext3模块,因此我们需要复制ext3的模块到/mnt/boot/lib/modules目录下。

    1. modinfo ext3  查看ext3文件系统所以来的库文件都有哪些

     

    1. modinfo jbd  查看jbd是否依赖其他的模块

    把ext3和jbd的模块都放在对应的/mnt/lib/modules/目录下

    1. cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko /mnt/lib/modules/
    2. cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko /mnt/lib/modules/

    接下来是要编辑init的脚本文件,init关系到我们能否把initrd的root转换成真正的root,关系到能否驱动我们真正的root文件系统,关系到能够装载我们已经安装的ext3和jbd模块,因此init脚本非常的重要,也是initrd.gz的核心。

    1. vim /mnt/boot/init  创建init脚本
    1. #!/bin/sh 
    2. mount -t proc proc /proc  挂载小root上的proc到/proc,其文件系统为proc
    3. mount -t sysfs sysfs /sys  挂载小root上的sysfs到/sysfs,其文件系统为sysfs
    4. insmod /lib/modules/jbd.ko  装载jbd模块
    5. insmod /lib/modules/ext3.ko  装载ext3模块
    6.  
    7. mdev -s  这是busybox提供的功能之一,用于探测dev下的所有设备文件和内核映射文件proc
    8. mount -t ext3 /dev/hda2 /mnt/sysroot  挂载root到/mnt/sysroot下
    9. exec switch_root /mnt/sysroot /sbin/init  完成从小root到真正的root的转换
    1. chmod +x init  给init执行权限

    至此我们看到的内容是:

    我们把这些全部的内容都打包并且压缩起来,就是我们一直所说的initrd.gz

    1. find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz 

    grub

    grub目录下包含寻找内核和启动内核所需要的各个阶段的文件,这些文件不需要我们去编写,只要用grub-install命令就可以实现;但是我们需要写grub的配置文件grub.conf来设定一些参数;

    1. grub-install --root-directory=/mnt /dev/hdb  创建grub目录,指定我们的boot目录的父目录为/mnt,Boot在/dev/hdb磁盘上
    1. cd /mnt/boot/grub  切换到grub目录下

    我们来编写配置文件grub.conf

    1. vim /mnt/boot/grub/grub.conf 
    1. default=0  设定默认启动第几个内核,因为我们的小linux只有一个内核,所以写上0就可以了
    2. timeout=10  设定用户选择内核的时长,默认是10秒
    3. title   YINSHUO Linux  这是我们内核的标题,可以任意编写
    4.         root (hd0,0)  标记了我们内核所在的分区的位置,这里表示第一块磁盘上的第一个分区上
    5.         kernel /vmlinuz-2.6.18-308.el5  这是我们内核所在的位置
    6.         initrd /initrd.gz          这是我们initrd文件所在的位置

    到此我们的grub文件也算是配置完毕了


    ●vmlinuz-2.6.18-308.el5

    因为内核的编译复杂且缓慢,因此我并没有自己编译新的内核,而是使用的原有的vmlinuz-2.6.18-308.el5内核,所以我只是把原有的/boot/vmlinuz-2.6.18-308.el5复制到了/mnt/boot/目录下,因此内核中的各个模块也没有做任何修改;

    1. cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz-2.6.18-308.el5 复制到/mnt/boot/目录下

    到此为止我们所有的跟boot有关的文件都创建完毕了,之后就是创建真正的root分区的文件

     

    制作root分区:

    bin sbin lib etc proc sys dev boot

    在制作initrd.gz是时候我们使用busybox虚拟出了各种我们所需要的binsbinusr目录下我们所需要的脚本,在制作真正的root分区的时候我们也使用同样的方法。

    这些内容都在initrd.gz中提到

    1. cp /tmp/busybox-1.20.2/_install/* /mnt/sysroot/ -a 
    2. cd /mnt/sysroot 
    3. rm linuxrc -f 
    4. mkdir -p proc sys etc/rc.d/init.d tmp dev/pts boot var/log lib/modules
    5. mknod /mnt/sysroot/dev/console c 5 1 
    6. mknod /mnt/sysroot/dev/null c 1 3 

    内核初始化完成后就要进行init进程的管理,而管理init的配置文件是/etc/inittab文件,/etc/inittab定义了系统默认启动级别,操作系统的初始化,虚拟终端的启动等内容;而OS的初始化需要用到一个非常重要的配置文件,即/etc/rc.d/rc.sysinit,这个文件是操作系统能够启动的核心文件。因此我们在小linux中也要创建相对应目录下的/mnt/sysroot/etc/inittab,/mnt/sysroot/etc/fstab,/mnt/sysroot/etc/sysctl.conf,和/mnt/sysroot/etc/rc.d/rc.sysinit这些个文件

    我们先来编辑/mnt/sysroot/etc/inittab文件

    1. vim /mnt/sysroot/etc/inittab  创建inittab文件
    1. ::sysinit:/etc/rc.d/rc.sysinit 表示执行系统初始化,使用的是/etc/rc.d/rc.sysinit脚本 
    2. ::respawn:-/bin/sh  表示系统一旦退出/bin/sh,则会立即重新启动/bin/sh
    3. ::shutdown:/bin/umount -a -r  表示当执行shutdown的时候,系统卸载所有的文件系统

    接下来编写/mnt/sysroot/etc/fstab这个文件,它是保重系统初始化过程中挂载/etc/fstab中的所有设备

    1. vim /mnt/sysroot/etc/fstab 创建/fstab文件

     设置fstab中的各项参数

    1. proc      /proc      proc      defaults        0 0  表示把proc挂载至/proc,文件系统类型是proc,选项是默认选项,不备份也不检查
    2. sysfs     /sys       sysfs     defaults        0 0  表示把sysfs挂载至/sys,文件系统类型是sysfs,选项是默认选项,不备份也不检查
    3. /dev/hda1 /boot      ext3      defaults        0 0  表示把/dev/hda1挂载至/boot,文件系统类型是ext3,选项是默认选项,不备份也不检查
    4. /dev/hda2 /          ext3      defaults        0 0  表示把/dev/hda2挂载至/,文件系统类型是ext3,选项是默认选项,不备份也不检查

     只要在/mnt/sysroot/etc/rc.d/rc.sysinit中使用mount -a的命令,就意味着,系统初始化启动的时候会自动挂载/etc/fstab中我们所设置的这些设备,并挂载到相应的位置。

     

    之后我们来编写内核参数文件/mnt/sysroot/etc/sysctl.conf

    1. vim /mnt/sysroot/etc/sysctl.conf  创建内核参数文件
    1. net.ipv4.ip_forward = 1  1表示开启网络
    2. kernel.hostname=yinshuo.linuxtest  设置主机名为 yinshuo.linuxtest 

     我们再按照之前寻找ext3和jbd模块的方法来复制pcnet32模块和他所依赖的mii模块,他们是VMware虚拟出的网卡驱动

    1. cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/pcnet32.ko 
    2. cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko /mnt/sysroot/lib/modules/mii.ko 

    现在我们来编写系统初始化脚本文件/mnt/sysroot/etc/rc.d/rc.sysinit

    1. vim /mnt/sysroot/etc/rc.d/rc.sysinit  创建系统初始化文件
    1. #!/bin/sh 
    2. echo -e "\t\033[31mYinShuo little Linux\033[0m"  以红色字体显示YinShuo little Linux
    3. mount -t proc proc /proc  挂载proc到/proc,文件系统类型为proc
    4. mount -t sysfs sysfs /sys  挂载sysfs到/sys,文件系统类型为sysfs
    5. mount -o  remount,rw  /   重新以读写的方式挂载根文件系统
    6.  
    7. mdev -s   探测所有设备,并在dev下创建设备文件
    8.  
    9. mount -a  挂载/etc/fstab下的所有设备
    10.  
    11. sysctl -p  使内核参数文件/etc/sysctl.conf立即生效
    12.  
    13. insmod /lib/modules/mii.ko  装载内核模块mii
    14. insmod /lib/modules/pcnet32.ko  装载内核模块pcnet32
    15.  
    16. ifconfig  lo  127.0.0.1/8  设置本地回环ip=127.0.0.1 netmask=255.0.0.0
    17. ifconfig eth0 172.16.106.9/16  设置网卡eth0的ip=172.16.106.9 netmask=255.255.0.0
    1. chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit  给/mnt/sysroot/etc/rc.d/rc.sysinit执行权限

     至此我们的root分区的制作也制作完毕


    创建虚拟机:

    创建一个新的虚拟机,起名字为linuxtext

     使用我们之前创建的IDE磁盘

     选择我们的IDE磁盘

    我们的小虚拟机也创建完毕


    我们制作的Linux的启动流程:

    步骤:

    ①:首先grub会去寻找内核所在的位置,根据grub.conf文件中配置的信息,会提示我们去选择哪一个内核,这个选择界面会有10秒钟的时间。

    ②:找到内核后,内核会进行初始化,探测所有硬件和加载它所需要的各种驱动,同时为了启动真正的root文件系统,initrd.gz就要提供真正root所需要的ext3文件系统和模块,挂载设备文件,initrd.gz的最后一步是转换自己的小root到真正的root上,并完成自己的使命,然后内核会接着启动用户空间的第一个进程init,之后内核初始化结束。

    ③:在用户空间中,首先会执行/etc/inittab中的内容,首先是启动/etc/rc.d/rc.sysinit进行操作系统的初始化,包括显示出"YinShuo little Linux"这个字样;挂载伪文件;和重新挂载我们的根文件系统为读写的方式;探测所有的硬件设备,并创建设备文件;挂载/etc/fstab中所有的内容;设置网卡选项和设置主机名,最终操作系统初始化结束。

    /etc/rc.d/rc.sysinit任务完成后,/etc/inittab会启动第二项内容,直接进入到/bin/sh界面,提供用户交互界面,我们是可以用各种命令。

    这便是我们简单Linux的运作流程,我们来拭目以待吧!


    见证奇迹的时刻:

     运行我们的小Linux

     看到这里说明我们成功了!

     我们来验证一下

    1. ifconfig    查看启动的网络设备
    2. hostname  查看主机名

     再验证是否有busybox,是否能在小linux中有执行权限来创建文件

    1. ls /bin 查看/bin下的内容 
    2. touch /tmp/chenggongde  在/tmp/目录下创建文件名为chenggongde文件


    至此,制作一个简单的Linux就算告一段落了。当然,它非常的简单,也有很多需要完善的地方,比如说内核的编译和用户的登录,这些问题都没有解决。本次制作Linux的目的更多的是在于认识和学习Linux的启动过程,为Linux的理解有更清晰的框架。

    此Linux虽小,但会有羽翼丰满的一天的!

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2994142.html
Copyright © 2011-2022 走看看