现在,渐渐地,渐渐地找到了高考的感觉,高考之后再也没有现在这么忙碌过,充实过……

连续的课程,搞的我有点忙乱。第二天上课的这个小LINUX作业,从一开始我就错误不断。第天上完课回住的地方,什么也不干就做这个,花费了3个晚上和一个周未下午的时间才最终完成。然而这一切的根源是课上开小差,反把那名将“ernel-2.6.30.5-i686.cfg重命名为.config文件”理解成了把其后缀改为.conf了,一连几个晚上纠结于此,影响了休息~

这中间的无数次都要崩溃了,什么物理硬盘不足,断电,马虎等等,好几次我都想放弃了,反正估计也就我做的次数最多了现在,别人一两遍就做成了,而我却做了七遍之多,真是有点灰心丧气了。不过,还算不错,总算没有半途而废!

在此小小胜利之际写下这篇文档,为后面的学习敲个警钟!

下面是编译一个带有WEB服务器功能的小型LINUX的全部过程!

前提:

1、一个作为宿主机的Linux;本文使用的是Redhat Enterprise Linux 5.4

2、在宿主机上提供一块额外的硬盘作为新系统的存储盘,为了降低复杂度,这里添加使用一块IDE接口的新硬盘;(用IDE在虚拟机里效率更高,刚从同学那里学到

3Linux内核源码,busybox源码;本文使用的是目前最新版的linux-2.6.34.1busybox-1.16.1

说明:本文是一个step by step的实做指南;

一、为系统上的新硬盘建立分区,这里根据需要先建立一个大小为100M的主分区作为新建系统的boot分区和一个512M的分区作为目标系统(即正在构建的新系统,后面将沿用此名称)的根分区;100M的分区格式化后将其挂载至/mnt/boot目录下;512M的分区格式化后将挂载至/mnt/sysroot目录;

操作如下:

# fdisk /dev/hda

展开后用到:

:查看当前硬盘上的分区情况

:创建新分区

  n  下面的选项:

      p  建立主分区

      e  建立扩展分区

分区之后,进行如下操作

# partprobe               //重读分区表

格式化新建的分区 类型为ext3

#mkfs.ext3 /dev/hda1

#mkfs.ext3 /dev/hda2

#mkdir /mnt/boot

#mkdir /mnt/sysroot

挂载磁盘:

#mount /dev/hda1 /mnt/boot

#mount /dev/hda2 /mnt/sysroot

说明:

1、此处的bootsysroot的挂载点目录名称尽量不要修改,尤其是boot目录,否则您必须保证后面的许多步骤都做了相应的改动;

2、新建系统的boot目录也可以跟根目录在同一个分区,这种方式比独立分区还要简单些,因此这里将不对此种方法再做出说明;

二、编译内核源代码,为新系统提供一个所需的内核(本例中的源代码包都位于/usr/src目录中)

# cd  /usr/src

# tar jxvf linux-2.6.34.1.tar.bz2

# ln  -sv  linux-2.6.34.1  linux    

//为简化过过程可将提供的.cfg改名为.config注意是.config,是个隐藏文件),添加到linux文件夹下,可为后期编译内核省下大量时间

# cd linux

图形界面下选择所需的功能:

# make menuconfig

根据您的实际和规划选择所需要的功能;本实例计划制作一个具有网络的功能的tiny linux且不打算使用内核模块,因此,这里选择把本机对应的网卡驱动直接编译进了内核。作者使用的是vmware Workstation虚拟机,所以,所需的网上驱动是pcnet32的,其它的均按需要选择。选择完成后需要保存至当前目录下.config文件中。

内核编译开始: 

# make  SUBDIR=arch/

将编译之后的内核复制到未来真正的boot目录下:

# cp arch/x86/boot/bzImage  /mnt/boot

# make menuconfig

三、编译busybox

# cd /usr/src

# tar  -jxvf  busybox-1.16.1.tar.bz2

# cd  busybox-1.16.1

# make menuconfig

说明:

1、此处需要选择 Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,而完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可;这里采用静态办法。

2、修改安装位置为/mnt/sysroot;方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值为/mnt/sysroot

编译安装:

# make  install

安装后的文件均位于/mnt/sysroot目录中;但为了创建initrd,并实现让其启动以后将真正的文件系统切换至目标系统分区上的rootfs,您还需要复制一份刚安装在/mnt/sysroot下的busybox至另一个目录,以实现与真正的根文件系统分开制作。我们这里选择使用/mnt/temp目录;

# mkdir -pv /mnt/temp

# cp -r /mnt/sysroot/*  /mnt/temp

四、制作initrd

# cd  /mnt/temp

1、建立rootfs

# mkdir -pv  proc  sys  etc/init.d  tmp  dev  mnt/sysroot

2、创建两个必要的设备文件:

# mknod  dev/console  c  5  1

# mknod  dev/null  c  1  3

3、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现它:

# rm  linuxrc    //要么删了,要么重命名

# vim  init

添加如下内容:******//mdev -s                *********相当于udev   动态创建dev下的设备文件

#!/bin/sh

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mdev -s    

mount -t ext3 /dev/hda2  /mnt/sysroot

exec  switch_root  /mnt/sysroot  /init      //切换真正的文件系统

给此脚本执行权限:

chmod  +x  init

4、制作initrd

解释:initrd初始RAM磁盘)是在系统引导过程中挂载的一个临时的根文件系统,用来支持两阶段的引导过程 

# find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 -n > /mnt/boot/initrd.gz

五、建立真正的根文件系统

# cd  /mnt/sysroot

1、建立rootfs

# mkdir -pv  proc  sys  etc/init.d  tmp  dev  boot  var/log lib

2、创建两个必要的设备文件

mknod  dev/console  c  5  1      

 //console是个只输出的设备,功能很简单,只能在内核中访问 

# mknod  dev/null  c  1  3

3、建立系统初始化脚本文件

# vim  etc/init.d/rcS

添加如下内容:

  

#!/bin/sh

echo -e "            Welcome to  \033[31mToyLinux\033[0m\n                "

echo -e "Mounting the filesystem .................[  \033[32mOK\033[0m  ]"

mount -t proc proc /proc

mount -t sysfs  sysfs  /sys

echo -e "Creating the files of device ............[  \033[32mOK\033[0m  ]"

mdev -s

echo -e "Mounting the filesystem .................[  \033[32mOK\033[0m  ]"

mount -a

echo -e "Remounting the root filesystem ..........[  \033[32mOK\033[0m  ]"

mount  -o  remount,rw  /

echo -e "Starting the log daemon .................[  \033[32mOK\033[0m  ]"

syslogd

klogd

echo -e "Configuring loopback interface ..........[  \033[32mOK\033[0m  ]"

ifconfig  lo  127.0.0.1/24

# END

而后让此脚本具有执行权限:

chmod +x  etc/init.d/rcS

4、配置init及其所需要inittab文件

# cd  /mnt/sysroot

# mv  linuxrc  init

# vim  etc/inittab   

添加如下内容:

::sysinit:/etc/init.d/rcS       //busybox习惯用rcS

console::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r                 卸载所有挂载

5、为系统准备一个文件系统表配置文件/etc/fstab

# vim  etc/fstab

添加如下内容:

/dev/hda2               /                       ext3    defaults        1 1

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/hda1               /boot                   ext3    defaults        0 0

6、由于在rcS文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送至/var/log/messages文件;

# vim  etc/syslog.conf

添加如下一行:

*.info    /var/log/messages

六、好了,至此一个简易的基于内存运行的小系统已经构建出来了,我们接下来为此系统创建所需的引导程序

# grub-install  --root-directory=/mnt  /dev/hda

说明:此处的/dev/hda为目标系统所在的那块新磁盘;

接下来为grub建立配置文件:

# vim  /mnt/boot/grub/grub.conf

添加类似如下内容:

default 0

timeout 3

color light-green/black light-magenta/black

title ToyLinux (2.6.34.1)

root (hd0,0)

kernel /bzImage ro root=/dev/hda2 quiet

initrd /initrd.gz

接下来将此块硬盘接入一个新的主机(这里使用的是虚拟机),启动一下并测试使用。