我这里是借助宿主机做的一个简单的Linux,我们只要知道一个Linux启动过程需要什么,这里制作就简单的多了。不过没有基础的也没关系,我写的很详细,没有基础的看了我写的步骤只要细心也是会做出来的,我这里的小Linux是很简单的,很多功能还不够全,但是能启动起来,一些简单的功能还是会完成的,回头我会把功能补全的,更新这个简单的Linux的。

 一、基本过程

  grub --> kernel --> initrd --> ROOTFS(/sbin/init,/bin/bash)

我们找一个硬盘装上grub而后给它提供内核内核借助于initrd能够去读取真正的文件系统,在根文件系统我们只需要提供一个/sbin/init,在提供一个/bin/bash,这个系统就能跑起来,但是只能执行内部的自带的命令,我们把其它的命令给它放进去,他就成了一个小的基本完整的linux了。

二、制作一个Linux详细过程

我们这里以当前系统为宿主机,再加一个IDE硬盘,我们先安装grub,然后分两个区,一个用来做boot,一个用来做跟。

制作一个简单的linux_制作

我们开机后用fdisk /dev/hda进行分区,下图是第一个分区,第二个分区相同只不过第三个框中是2第四个框中我们给它+512Mw为保存。

制作一个简单的linux_制作_02

下来我们就开始格式化,这里的-j是让它的文件系统为ext3的。

制作一个简单的linux_linux_03

我们开始挂载这两个分区,分别挂载在/mnt/boot/mnt/sysroot,没有这两个文件我们要在/mnt下创建文件bootsysroot了,然后开始挂载,但是挂载的分区要及时生效也要开机后也必须生效,要让它开机后生效我们要在/etc/fstab里面配置了,图片下面的两行就是在/etc/fstab文件中配置的,开机后也是有效的。

制作一个简单的linux_linux_04

在/etc/fstab文件中配置

/dev/hda1               /mnt/boot               ext3    defaults        0 0

/dev/hda2               /mnt/sysroot             ext3    defaults        0 0

下来我们就开始安装grub了,我们用grub-install --root-directory=/mnt /dev/had来安装。

制作一个简单的linux_linux_05

然后我们开始用cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz复制内核并重命名为vmlinuz。然后我们复制版本信息,但是前提我们发现initrd-2.6.18-308.el5文件是压缩格式,并且我们还要将里面的init文件里/dev/后面改为hda2。我们这里先创建一个文件夹,先把initrd-2.6.18-308.el5归档展开到这个文件夹中。

制作一个简单的linux_linux_06

制作一个简单的linux_linux_07

我们找到当前文件下的所有文件通过管道送给cpio命令进行归档,再通过管道送给gzip -9强压缩一下,然后保存至/mnt/boot/initrd.gz

制作一个简单的linux_linux_08

这里我们用vim /mnt/boot/grub/grub.conf还要配置grub中的grub.conf,内容为:

default=0

timeout=3

    title shuaige linux(2.6.18)

       root (hd0,0)

       kernel /vmlinuz

       initrd /initrd.gz

下来我们就要配置/mnt/sysroot目录下的目录,我们发现这个目录下面什么都没有我们就要创建一些目录。

制作一个简单的linux_制作_09

这时候我们就要把/sbin/init 复制到/mnt/sysroot/sbin下面,把/bin/bash 复制到/mnt/sysroot/bin下面,不仅仅复制这些我们还要把它们所依赖的库也要复制过来。

cp /sbin/init /mnt/sysroot/sbin

cp /bin/bash /mnt/sysroot/bin

制作一个简单的linux_linux_10

这个时候我们的linux基本上就可以跑了,我们用chroot /mnt/sysroot 来测一下。虽然这里的ls 还不能用。下来我们就要复制这些命令了。

制作一个简单的linux_linux_11

我们知道要想执行init文件我们就要执行/etc/inittab这个文件,所有我们先来配置/etc/inittab文件。【提示:这里都是相对路径,记好每个/etc前面还有/mnt/sysroot呢】

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

我们还要执行相关的/etc/rc.d/rc.sysinit中的脚本。

#!/bin/bash

#

echo -e "\tWelcome to \033[31mShuaiGe033[0m Linux"

/bin/bash

这里我们保存退出给它一个权限:chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit

这是我们来运行一下【提示:因为我们用的是虚拟机进行演示,所以我们每次要运行的时候都要多sync几下,这样可以同步到磁盘上,这样制作的linux出错概率变小】我们再打开一个虚拟机把加的那个硬盘导入进去,这样我们就启动这个小虚拟机了。

制作一个简单的linux_linux_12

这个系统虽然能跑起来了,但是里面的功能就太弱了,这里我们来把它加强一些,能让它执行一些一般的小命令。但是我们发现要是一个一个复制当前系统上的那就太痛苦了,因为他们所依赖的库太多了,有的还有别名。所以我们这里写一个脚本,来运行脚本,那就比较快了(这里脚本的内容就不多做解释了)。

  1. #!/bin/bash 
  2. DEST=/mnt/sysroot 
  3. libcp() { 
  4.   LIBPATH=${1%/*} 
  5.   [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH 
  6.   [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished." 
  7.  
  8. bincp() { 
  9.   CMDPATH=${1%/*} 
  10.   [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH 
  11.   [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH 
  12.  
  13.   for LIB in  `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do 
  14.     libcp $LIB 
  15.   done 
  16.  
  17. read -p "Your command: " CMD 
  18. until [ $CMD == 'q' ]; do 
  19.    ! which $CMD &> /dev/null && echo "Wrong command" && read -p "Input again:" CMD && continue 
  20.   COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"` 
  21.   bincp $COMMAND 
  22.   echo "copy $COMMAND finished." 
  23.   read -p "Continue: " CMD 
  24. done 

制作一个简单的linux_制作_13

这时候我们来测试一下,成功了。

制作一个简单的linux_制作_14

在切换之前我们先复制一个库文件过去,而且我们希望系统启动后自动装载这两个模块,而且装完以后还要给你的系统输入IP地址,开机后直接就有IP地址。

制作一个简单的linux_linux_15

拷贝模块:

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

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

要想开机后自动执行上面功能我们先要把lsmod复制过去,再设置vim /mnt/sysroot/etc/rc.d/rc.sysinit文件【提示:红色字体则为我们这次加入的内容】

#!/bin/bash

#

echo -e "\tWelcome to \033[31mShuaiGe\033[0m Linux"

insmod /lib/modules/mii.ko

insmod /lib/modules/pcnet32.ko

ifconfig eth0 172.16.58.21/16

ifconfig lo 127.0.0.1/8

/bin/bash

这时候我们开始切换【提示:切换之前必须sync

制作一个简单的linux_linux_16

这时候我们ifconfig一下,我们设置的IP地址已经设置成功,环回接口IP也设置成功了,这时候我们的小linux已经相对完善了。

制作一个简单的linux_linux_17