制作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虽小,也会有羽翼丰满的一天!