在VMware上制作一个简单的Linux

摘要:
最后,为了确保我们的Linux足够小,我们将上述所有内容压缩到initrd.gz中。所以我们需要先做一个busybox。

大体思路

bootroot
initrd.gzgrubvmlinuz-2.6.18-308.el5bin 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-xfbusybox-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. makemenuconfig 使用图形窗口对busybox进行编译

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

在VMware上制作一个简单的Linux第1张

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

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

在VMware上制作一个简单的Linux第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. makeinstall继续安装就可以了

安装完成后,会在/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

在VMware上制作一个简单的Linux第3张

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

  1. mkdiretcprocsyslib/modules/devmnt/sysroottmp-p 创建mnt/sysroot是为了实现根的切换

创建我们的dev设备文件conlolenull

  1. mknoddev/consolec51
  2. mknoddev/nullc13

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

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

在VMware上制作一个简单的Linux第4张

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

在VMware上制作一个简单的Linux第5张

把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-tprocproc/proc 挂载小root上的proc到/proc,其文件系统为proc
  3. mount-tsysfssysfs/sys 挂载小root上的sysfs到/sysfs,其文件系统为sysfs
  4. insmod/lib/modules/jbd.ko 装载jbd模块
  5. insmod/lib/modules/ext3.ko 装载ext3模块
  6. mdev-s 这是busybox提供的功能之一,用于探测dev下的所有设备文件和内核映射文件proc
  7. mount-text3/dev/hda2/mnt/sysroot 挂载root到/mnt/sysroot下
  8. execswitch_root/mnt/sysroot/sbin/init 完成从小root到真正的root的转换
  1. chmod+xinit 给init执行权限

至此我们看到的内容是:

在VMware上制作一个简单的Linux第6张

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

  1. find.|cpio-Hnewc--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目录下

在VMware上制作一个简单的Linux第7张

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

  1. vim/mnt/boot/grub/grub.conf
  1. default=0 设定默认启动第几个内核,因为我们的小linux只有一个内核,所以写上0就可以了
  2. timeout=10 设定用户选择内核的时长,默认是10秒
  3. titleYINSHUOLinux 这是我们内核的标题,可以任意编写
  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. rmlinuxrc-f
  4. mkdir-pprocsysetc/rc.d/init.dtmpdev/ptsbootvar/loglib/modules
  5. mknod/mnt/sysroot/dev/consolec51
  6. mknod/mnt/sysroot/dev/nullc13

内核初始化完成后就要进行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/procprocdefaults00 表示把proc挂载至/proc,文件系统类型是proc,选项是默认选项,不备份也不检查
  2. sysfs/syssysfsdefaults00 表示把sysfs挂载至/sys,文件系统类型是sysfs,选项是默认选项,不备份也不检查
  3. /dev/hda1/bootext3defaults00 表示把/dev/hda1挂载至/boot,文件系统类型是ext3,选项是默认选项,不备份也不检查
  4. /dev/hda2/ext3defaults00 表示把/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[31mYinShuolittleLinux\033[0m"以红色字体显示YinShuolittleLinux
  3. mount-tprocproc/proc 挂载proc到/proc,文件系统类型为proc
  4. mount-tsysfssysfs/sys 挂载sysfs到/sys,文件系统类型为sysfs
  5. mount-oremount,rw/ 重新以读写的方式挂载根文件系统
  6. mdev-s 探测所有设备,并在dev下创建设备文件
  7. mount-a 挂载/etc/fstab下的所有设备
  8. sysctl-p 使内核参数文件/etc/sysctl.conf立即生效
  9. insmod/lib/modules/mii.ko 装载内核模块mii
  10. insmod/lib/modules/pcnet32.ko 装载内核模块pcnet32
  11. ifconfiglo127.0.0.1/8 设置本地回环ip=127.0.0.1 netmask=255.0.0.0
  12. ifconfigeth0172.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

在VMware上制作一个简单的Linux第8张

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

在VMware上制作一个简单的Linux第9张

选择我们的IDE磁盘

在VMware上制作一个简单的Linux第10张

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

在VMware上制作一个简单的Linux第11张


我们制作的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

在VMware上制作一个简单的Linux第12张

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

在VMware上制作一个简单的Linux第13张

我们来验证一下

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

在VMware上制作一个简单的Linux第14张

在VMware上制作一个简单的Linux第15张

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

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

在VMware上制作一个简单的Linux第16张

在VMware上制作一个简单的Linux第17张


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

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

免责声明:文章转载自《在VMware上制作一个简单的Linux》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux/ubuntu目录解释Sublime Text关闭自动更新下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java之jar命令详解

  1. JAR 文件包   JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFES...

扩展ubuntu /home磁盘空间

步骤一,parted -l 修复 提示错误 GPT PMBR size mismatch (60062499 != 60995327) will be corrected by w(rite). 步骤二,查看磁盘空闲空间,并利用空闲空间建立新分区 sudo fdisk /dev/sda   使用m查看帮助,n 建立新的分区,w保存新分区。 步骤三,重新mo...

windows 下 note 版本管理-nvm

Windows环境下nvm的安装及使用 首先需要说明的是: nvm不支持Windows!!!,但是有替代品,也就是nvm-windows,类似git和git for windows一样。 第一步:点击下载 nvm,打开该项目在github上面的下载页面后,我们选择latest中的第一个:nvm-noinstall.zip,点击下载。 image.pn...

智能客户端(SmartClient)

引文 http://dev.csdn.net/develop/article/16/16270.shtm  智能客户端(SmartClient)     本文主要讨论基于企业环境的客户端应用程序模型,由于本人曾经从事过传统的客户端/服务器两层结构应用程序和基于.net平台的多层结构应用程序的开发,因此本文将着重描述.net平台上的智能客户端应用程序模型,并...

Linux终端的几个常用快捷方式,记下!

一、初识linux的终端种类:本地、远程    查看本终端命令:     #tty 命令,看到当前所处的终端     #(w)who 命令,看到系统中所有登录的用户     其中,tty 终端为表示在本地命令行模式下打开的终端;pts/0,1,2,3 终端为虚拟终端,多为图形界面下打开的终端或者远程登录的终端                     (这个...

Linux下修改MySQL数据库字符编码为UTF-8解决中文乱码

由于MySQL编码原因会导致数据库出现乱码。 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码。 具体操作: 1、进入MySQL控制台 >mysql -uroot -p #输入密码进入 >status; #查看当前MySQL运行状态,如下图所示:  ...