在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设备文件conlole和null


  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虚拟出了各种我们所需要的bin,sbin和usr目录下我们所需要的脚本,在制作真正的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虽小,但会有羽翼丰满的一天的!

时间: 2024-10-31 02:23:06

在VMware上制作一个简单的Linux的相关文章

如何在Linux上制作一个屏幕录像视频教程

一图胜千言,一个精心设计的指导视频更是能给你带来良好体验.Linux上有你需要的制作有用且高质量教学视频的所有工具.我们将用强大的kdenlive视频编辑器和Audacity音频录制器和编辑器制作一个简单的屏幕录像,并学习如何在YouTube上分享精彩的屏幕录像. 一台安装了Kdenlive和Audacit软件的Linux系统PC,一个质量好的麦克风或耳机,和一个YouTube的帐号就是你需要准备的全部.(是的,除了Youtube还有很多其他的免费视频共享服务,你也可以使用它们.)YouTube

flash制作一个简单的音乐动画教程

  很多同学都对Flash感兴趣 ,下面小编就教教大家如何用flash做一个简单的动画. 通过这个设计充分地将FLASH动画的现况分析出来了,本设计是根据选定音乐.人物的设定.剧本的创作.场景的布置等.首先就是选歌,一部好的MTV就得有一首贯穿全场的好歌,其次就是根据歌意确定主题和场景的布置,最后围绕剧情制造出MTV. 工具/原料 Flash PS 一首自己感兴趣的歌 素材照片 方法/步骤 1.2 Flash软件的特点 FLASH的全称是Macromedia flash,后来又被adobe收购了

photoshop制作一个简单又时尚的UI按扭

在这个教程里,将和童学们分享如何使用photoshop制作一个简单又时尚的UI按扭,这个按扭可以用在电子商务网站,或者是网店上. 1.新建一个文档(ctrl+N)大小为:600*600(虽然我们按扭的大小:170*50,但是尺寸大方便我们的修改) 2.选择"圆角矩形工具"并设圆角"5px"绘制一个大小为:170*50 的圆角矩形.(可以使用标尺定位) 3.新建一个图层,按组合键"ctrl+enter"把路径转化为选区,并填充黑色. 双击这个图层给

word制作一个简单的贺卡

  word制作一个简单的贺卡           1.在插入下点击图片按钮.   2.然后,在弹出的对话框中找到有图片的文件夹,再选中图片,选中右下角的插入按钮即可. 3.插入图片后的效果.(如下图所示) 4.再在图片下画一个跟图片差不多的文本框.再用鼠标选中文本框,点击鼠标右键,弹出下拉选项,选择插入文字即可. 5.插入光标后,在输入祝福文字即可. 6.输好文字后,就可以选着文字,更改其文字颜色,使其更加好看.(如下图) 7.还可更改前面两个文字的大小,使其更加美观.

实例学习SSIS(一)--制作一个简单的ETL包

原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)--使用日志记录和错误流重定向 实例学习SSIS(五)--理论介绍SSIS 参考内容:SQLServer2005的帮助文档. ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqltut9/html/d6d5bb1f-4cb1-4605-9cd6-f60

制作一个简单的app的过程

问题描述 制作一个简单的app的过程 请问谁能帮忙推荐一个制作app的完整视频,,就是是先设计界面还是怎么样?或者详述一下过程 解决方案 我是先设计界面,包括页面的跳转也一起写好,然后再添加数据库和响应函数,视频教程没有,但是有一本挺不错的电子书,上面是根据实例一个个的向读者渗透安卓的知识,如果想要的话可以私下联系我 解决方案二: 一个简单的arm开发板的制作过程[Android开发]找乐,一个笑话App的制作过程记录 解决方案三: 先做界面,界面元素名会在后台程序中用到.

PHP开发制作一个简单的活动日程表Calendar_php实例

材料取之深入PHP与JQuery开发,这本书实际上就是讲述一个活动日程表. 此文章适合从其它语言(如java,C++,python等)转到php,没有系统学习php,或者是php初学者,已经对程序有较深理解的朋友 以上为文件目录结构,public为程序根目录,目的是为了安全方面的考虑,把核心程序放在外界访问不到的地方. 本地的演示地址为:http://localhost/index.php 首先是数据库的脚本: /* Navicat MySQL Data Transfer Source Serv

Illustrator制作一个简单的音乐符号图标教程

给各位Illustrator软件的使用者们来详细的解析分享一下制作一个简单的音乐符号图标的教程. 教程分享: 1.在Ai软件中,新建一个800*800的文档,选择圆角矩形工具,画一个圆角图形,并填充颜色,如图所示   2.然后选择矩形工具,画一个矩形图形,并填充颜色,再选择钢笔工具,勾出如下的图形,并填充颜色,如图所示     3.接着选择椭i圆工具,画一个椭圆图形,并填充颜色,再选择直线工具,画一条直线,描边改为4pt,如图所示     4.接下来再选择钢笔工具,勾出如下的图形,并填充颜色,如

用导航控制器制作一个简单的登陆显示

用导航控制器制作一个简单的登陆显示 1.Empty项目的创建+AppDelegate的修改 #import "DXWAppDelegate.h" #import "LoginViewController.h" @implementation DXWAppDelegate - (void)dealloc { [_window release]; [super dealloc]; } - (BOOL)application:(UIApplication *)applic