制作vmware镜像,vmware创建

  制作vmware镜像,vmware创建

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

  1.在VMware上添加新的IDE磁盘。

  2.将这个磁盘分区为/dev/hdb1 /dev/hdb2,然后格式化为ext3文件系统。

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

  前提说完了,就可以分别做boot和root了!那我们开始吧。

  制作启动分区:

  initrd.gz

  其实initrd.gz是一个小根目录,里面还包含了目录bin sbin lib etc proc sys dev mnt,还有一个重要的脚本文件init,实现了从这个小根目录到我们真正根目录的转换功能。最后,为了确保我们的Linux足够小,我们将上述所有内容压缩到initrd.gz中。

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

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

  将busybox-1.20.2.tar.bz2-c /tmp解压到/tmp目录

  Cd/tmp/busybox-1.20.2切换到/tmp/busybox-1.20.2目录。

  Makemenuconfig用图形窗口编译busybox。

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

  确保使用/tmp/busybox-1.20.2/目录中的命令。

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

  所以我需要下载一个更高版本的内核头文件,放在/tmp/busybox-1 . 20 . 2/include/MTD/

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

  mkdir/tmp/busybox-1 . 20 . 2/include/mtd创建MTD目录

  CD/tmp/busybox-1 . 20 . 2/include/MTD/switch到这个目录

  CP/usr/src/Linux-2 . 6 . 38 . 5/include/MTD/ubi-user . h ./将头文件复制到当前目录。

  Cd/tmp/busybox-1.20.2,然后切回到原来的busybox目录。

  Makeinstall继续安装。

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

  比较/_install/*/mnt/boot-a将_install目录中的所有文件复制到/mnt/boot目录中。

  Cd/mnt/boot切换到/mnt/boot目录,也就是我们小linux的引导。

  可以说,直到现在,我们才在书写我们真正的initrd.gz。

  我们发现/mnt/boot目录中缺少很多目录,所以我们手动添加了一些。

  DiretCProcsyslib/modules/dev mnt/sysroottmp-p mnt/sys root是为了切换根而创建的。

  创建我们的开发设备文件。

  mknoddev/consolec51

  mknoddev/nullc13

  为了真正驱动我们的根文件系统,我们需要让initrd.gz拥有可以驱动根分区的ext3模块,所以我们需要将ext3模块复制到/mnt/boot/lib/modules目录。

  Modinfoext3。ext3文件系统中有哪些库文件?

  Modinfojbd检查jbd是否依赖于其他模块。

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

  CP/lib/modules/2 . 6 . 18-308 . el5/kernel/fs/ext3/ext3 . ko/mnt/lib/modules/

  CP/lib/modules/2 . 6 . 18-308 . el5/kernel/fs/jbd/jbd . ko/mnt/lib/modules/

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

  Vim/mnt/boot/init创建初始化脚本

  #!/bin/sh

  Mount-tprocproc/proc在小根目录上挂载proc到/proc,它的文件系统是proc

  Mount-tsysfssysfs/sys把小根目录上的sysfs挂载到/sysfs,它的文件系统是sysfs

  Insmod/lib/modules/jbd.ko加载jbd模块

  Insmod/lib/modules/ext3.ko加载ext3模块。

  Mdev-s这是busybox提供的功能之一,用来检测dev下所有的设备文件和内核映射文件proc。

  Mount-text 3/dev/hda 2/mnt/sysroot在/mnt/sys root下挂载根目录

  exec _ root/MNT/sys root/sbin/init完成小根到真根的转化。

  Chmod xinit授予init执行权限。

  目前我们看到的是:

  我们把这些内容全部打包压缩,也就是我们一直所说的initrd.gz。

  找到。 cpio-Hnewc-quiet-o gzip-9/mnt/boot/initrd . gz

  grub

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

  Grub-install-root-directory=/mnt/dev/hdb创建grub目录,并指定我们的引导目录的父目录是/mnt,并且引导在/dev/hdb磁盘上。

  Cd/mnt/boot/grub切换到grub目录

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

  vim/mnt/boot/grub/grub.conf

  Default=0设置默认启动哪个内核,因为我们的小linux只有一个内核,所以写0就行了。

  Timeout=10设置用户选择内核的持续时间,默认为10秒。

  TitleYINSHUOLinux这是我们内核的标题,可以随意写。

  Root(hd0,0)标记了我们内核所在分区的位置,也就是第一个磁盘上的第一个分区。

  Kernel/vmlinuz-2.6.18-308.el5这是我们内核的位置

  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/目录下,所以内核中的模块

  将CP/boot/vmlinuz-2 . 6 . 18-308 . el5/mnt/boot/vmlinuz-2 . 6 . 18-308 . el5复制到/mnt/boot/目录中

  到目前为止,我们所有与boot相关的文件都创建好了,然后真正的根分区的文件也创建好了。

  制作根分区:

  bin sbin库等进程系统开发引导

  是时候去initrd.gz了。我们使用busybox来模拟bin、sbin和usr目录中我们需要的所有脚本。在制作真正的根分区时,我们也使用同样的方法。

  所有这些内容在initrd.gz都有提及。

  CP/tmp/busybox-1 . 20 . 2/_ install/*/mnt/sys root/-a

  cd/mnt/sysroot

  rmlinuxrc-f

  mkdir-pprocsysetc/RC . d/init . dtmpdev/ptsbootvar/log lib/modules

  mknod/mnt/sys root/dev/console C51

  mknod/mnt/sysroot/dev/nullc13

  内核初始化后,需要管理init进程,管理init的配置文件是/etc/inittab,定义了系统默认的启动级别,操作系统的初始化,虚拟终端的启动等。OS的初始化需要一个非常重要的配置文件,即/etc/rc.d/rc.sysinit,这是操作系统可以启动的核心文件。所以我们还需要在小linux的相应目录下创建/mnt/sysroot/etc/inittab、/mnt/sysroot/etc/fstab、/mnt/sysroot/etc/sysctl.conf和/mnt/sys root/etc/RC . d/RC . sysinit。

  让我们首先编辑/mnt/sysroot/etc/inittab文件。

  Vim/mnt/sysroot/etc/inittab创建inittab文件

  * sysinit:/etc/rc.d/rc.sysinit表示使用/etc/RC . d/RC . sysinit脚本执行系统初始化。

  * respawn:-/bin/sh表示一旦退出/bin/sh,系统将立即重新启动/bin/sh。

  * shutdown:/bin/umount-a-r表示当执行shut down时,系统卸载所有文件系统。

  接下来,编写文件/mnt/sysroot/etc/fstab,该文件在系统初始化期间负责/etc/fstab中的所有设备。

  Vim/mnt/sysroot/etc/fstab创建/fstab文件

  在fstab中设置各种参数

  Proc/procprodefaults 00表示将proc挂载到/proc,文件系统类型为proc,选项为默认选项,所以不备份也不检查。

  Sysfs/sysSysfsdefaults00表示将sysfs挂载到/sys,文件系统类型为sysfs,选项为默认选项,所以不备份也不检查。

  /dev/hda1/bootext3defaults00表示将/dev/hda1挂载到/boot。文件系统类型是ext3,该选项是默认选项,因此不进行备份或检查。

  /dev/hda2/ext3defaults00表示将/dev/hda2挂载到/。文件系统类型是ext3,该选项是默认选项,因此不进行备份或检查。

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

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

  vim/mnt/sys root/etc/sysctl . conf创建一个内核参数文件。

  Net.ipv4.ip_forward=1 1表示打开网络。

  kernel . hostname=yinshuo.linuxtest将主机名设置为yin Shuo . Linux test。

  然后,我们按照前面寻找ext3和jbd模块的方法复制pcnet32模块及其依赖的mii模块,ext3和jbd模块是VMware的虚拟网卡驱动。

  CP/lib/modules/2 . 6 . 18-308 . el5/kernel/drivers/net/pcnet 32 . ko/mnt/sys root/lib/modules/pcnet 32 . ko

  CP/lib/modules/2 . 6 . 18-308 . el5/kernel/drivers/net/MII . ko/mnt/sys root/lib/modules/MII . ko

  现在我们来编写系统初始化脚本文件/mnt/sys root/etc/RC . d/RC . sysinit。

  vim/mnt/sys root/etc/RC . d/RC . sysinit创建一个系统初始化文件。

  #!/bin/sh

  echo-e t 033[31 myinshuolitlelinux 033[0m 以红色字体显示YinShuolittleLinux。

  Mount-tprocproc/proc挂载proc到/proc,文件系统类型是proc

  Mount-tsysfssysfs/sys将sysfs挂载到/sys,文件系统类型为sysfs

  mount-or mount,rw/以读写方式重新装载根文件系统。

  Mdev-s检测所有设备,并在dev下创建设备文件。

  Mount-a在/etc/fstab下挂载所有设备

  Sysctl-p使内核参数文件/etc/sysctl.conf立即生效。

  Insmod/lib/modules/mii.ko加载内核模块mii

  Insmod/lib/modules/pcnet32.ko加载内核模块pcnet32

  Ifconfiglo127.0.0.1/8设置本地环回ip=127.0.0.1网络掩码=255.0.0.0

  Ifconfigeth0172.16.106.9/16设置网卡的IP eth 0=172 . 16 . 106 . 9 net mask=255 . 255 . 0 . 0

  CHX/mnt/sys root/etc/RC . d/RC . sysinit授予/mnt/sys root/etc/RC . d/RC . sysinit执行权限。

  至此,我们的根分区的生产已经完成。

  创建虚拟机:

  创建一个新的虚拟机,并将其命名为linuxtext。

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

  选择我们的IDE磁盘。

  我们的小虚拟机也创造出来了。

  我们的Linux的启动过程:

  步骤:

  :首先grub会寻找内核的位置。根据grub.conf文件中配置的信息,会提示我们选择哪个内核。这个选择界面需要10秒钟。

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

  :在用户空间中,将首先执行/etc/inittab中的内容。首先会启动/etc/rc.d/rc.sysinit初始化操作系统,包括显示‘殷硕小Linux’字样;挂载虚拟文件;并重新挂载我们的根文件系统进行读写;检测所有硬件设备并创建设备文件;挂载/etc/fstab中的所有内容;设置网卡选项和主机名,最后操作系统初始化完成。

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

  这是我们简单的Linux的操作过程。让我们拭目以待!

  见证奇迹的时刻:

  运行我们的小Linux

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

  我们来验证一下。

  Ifconfig查看已启动的网络设备

  主机名查看主机名

  然后验证是否有busybox,在小linux中是否有创建文件的执行权限。

  Ls/bin查看/bin下的内容。

  触摸/tmp/chenggongde在/tmp/目录下创建一个名为chenggongde的文件。

  至此,制作一个简单的Linux就告一段落了。当然很简单,还有很多需要改进的地方,比如内核编译,用户登录。这些问题都没有解决。这次做Linux的目的是了解和学习Linux的启动过程,对理解Linux有一个更清晰的框架。

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

制作vmware镜像,vmware创建