环境:一台运行操作系统 FC3 的主机   一块额外硬盘(/dev/hdd)(为了叙述的方便,称之为第2硬盘)

定制过程:

一 编译内核

编译内核是具体定制 Linux 系统的第一步,根据定值的目标及机器的硬件特性进行内核选项的选择,选定一个内核版本(如linux-2.6.11.1),进行编译。
编译内核的过程以及内核选项的选择不再详述(这个不能统一,需要根据具体需求而变化)。编译内核用到的命令:
# make mrproper
# make xconfig (config/menuconfig/xconfig 根据情况选其一)
# make bzImage
# make modules
# make modules_install
# make install (修改grub:默认用grub引导系统)
编译完内核之后,可以在/boot目录下看到新生成的内核 vmlinuz-2.6.11.1 ,在 /lib/modules/2.6.13.1/ 中存放新内核的模块文件
编译完内核并且能成功启动之后,生成的上述文件备用.

二 编译busybox

1 busybox简介

Busybox 由 Debian GNU/Linux 的 Bruce Perens 首先开发使用.Busybox 编译出一个单个的独立执行程序叫做 busybox。它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序包括vi, init, sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat ... 等功能.它只有1M左右的大小,却几乎可以容纳所有常用的Linux命令.我们要做的系统受到空间的限制,要拿出尽可能多的空间来安装MySQL,Apcahe,PHP等软件服务,在能够实现基本功能的基础上,选用busybox能够有效的减少系统所用的空间.

2 配置busybox

#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig
#make
#make install

注意:在配置busybox过程中要注意的问题
@修改 busybox 的 init.c 文件(busybox-1.00/init/init.c),设定系统要执行的第一个程序为你定制的系统启动时的文件如:/etc/rc #define INIT_SRCIPT "/etc/rc"

@编译busybox时的一些必选项

#General Configuration
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
通过这个选项以/etc/busybox.conf 做为busybox的配置文件

#Build Options
Build BusyBox as a static binary (no shared libs)
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.

#Installation Options
Don't use /usr
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.

在配置完busybox之后,得到了busybox目录下的_install目录,这个目录中存有我们需要的系统命令包含 bin sbin 文件夹.备用.

三 建立文件系统

1 将第2硬盘格式化,并建立ext2文件系统,然后挂载到主盘的一个目录中(如/mnt/hdd).在这个目录下建立系统的目录结构.第2硬盘格式化分区如下:

# fdisk -l

Disk /dev/hdd: 1750 MB, 1750896640 bytes
15 heads, 63 sectors/track, 3618 cylinders
Units = cylinders of 945 * 512 = 483840 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdd1   *         1      3600   1700968+  83  Linux
/dev/hdd2          3601      3618      8505    5  Extended
/dev/hdd5          3601      3618      8473+  83  Linux

2 到第2硬盘中建立文件系统


#cd /mnt/hdd
# mkdir usr boot etc var home dev proc mnt tmp

将busybox目录中_install目录里的文件拷贝到 /mnt/hdd 目录中.

#cp -r busybox/_install/* /mnt/hdd

现在在 /mnt/hdd 目录下基本具有了一个简单的操作系统所需要得目录.

### 登陆成功后看到的结果

ysl / # ls
bin         dev         home        lost+found  proc        sbin        usr
boot        etc         lib         mnt         root        tmp         var
ysl / #

将主机系统 /dev 目录下的内容都拷贝到 /mnt/hdd/dev 中,(需要哪些选项可以根据定制系统的具体需要选择)

3 建立 /mnt/hdd/etc 目录下的配置文件

ysl /etc # ls
default         gshadow-        mail            passwd-         rc.modules      ssh
fstab           hosts           mtab            profile         resolv.conf
group           init.d          my.cnf          protocols       shadow
group-          inittab         network.script  rc              shadow-
gshadow         issue           passwd          rc.conf         shells
ysl /etc # ls default/
K09zaptel   K11mysqld   K14network  S01network  S04mysqld   S06zaptel
K10httpd    K13sshd     K15exit     S03sshd     S05httpd
ysl /etc # ls init.d/
EXIT     httpd    mysqld   network  sshd     zaptel
ysl /etc #

具体配置文件简介

default  目录中存放 /etc/init.d/ 目录里启动和关闭系统以 S 和 K 开头的链接文件
fstab  列举计算机当前"可以安装"的文件系统.在计算机启动时, /etc/rc 中 /bin/mount -a 命令的参数
group group- gshadow gshadow- passwd  系统管理的一些文件,用户,密码等
hosts  包含本地网络中主机的列表
init.d  目录中存放系统安装的服务。系统在启动和关闭时,要操作这个目录下的服务
inittab  系统启动时运行的第一个程序是 init,init 通过 /etc/inittab 控制进程的启动
issue  系统登陆时显示的内容
mail  存放 sendmail 配置文件的目录,后面详述
mtab  这将随着 /proc/mount 文件的改变而不断改变。换句话说,文件系统被安装和卸载时,改变会立即反映到此文件中
my.cnf  mysql 数据库的配置文件,后面详述
network.script  启动网络服务时运行的脚本
profile bash shell 的登陆脚本,可用来限制历史纪录等
protocols  列举系统中用到的协议
rc  系统运行的第一个脚本
rc.conf  系统启动运行的参数,各种服务都给予这个参数运行
rc.modules  系统要加载启动的模块
resolv.conf  互联网络用于地址解析时的参考文件
shells  列举系统的 shell
ssh  ssh 服务配置目录

部分配置文件如下:
####################/etc/inittab
#
# /etc/inittab
#
# INIT
console::sysinit:/etc/rc sysinit ## /etc/rc 是与 busybox 的 init.c 中定义所对应的
::respawn:/sbin/getty 38400 tty1 linux ## Linux 系统的用户登陆终端
::respawn:/sbin/getty 38400 tty2 linux
::respawn:/sbin/getty 38400 tty3 linux

# SHUTDOWN
::ctrlaltdel:/sbin/reboot ## 启动过程中对Ctrl Alt Delete 三键同时按下的处理
::shutdown:/etc/rc shutdown ## 关机处理

####################/etc/fstab
#
# /etc/fstab
#
/           /         ext2      defaults       1         1
proc        /proc     proc      defaults       0         0

####################/etc/rc
#!/bin/sh
#
#/etc/rc
#

export PATH=/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/local/mysql/bin:/usr/local/http/bin

## INIT ##

if [ $1 = "sysinit" ]
then
/bin/mount -a
mount -t proc none /proc
mount -n -o remount,rw  /

if [ -r /etc/rc.modules ]
then
for i in `grep -v "#"  /etc/rc.modules`
do
modprobe -q $i 2> /dev/null
done
sleep 5
fi

. /etc/rc.conf

if [ "$AUTOMODS" ]
then
if [ ! -r /etc/rc.modules ]
then
for i in "$AUTOMODS"
do
modprobe -q $i 2> /dev/null
done
fi
fi

for i in `ls /etc/default/S*`
do
$i init
done

/usr/bin/clear

fi

## SHUTDOWN ##

if [ $1 = shutdown ]
then
for i in `ls /etc/default/K*`
do
$i stop
done
sync
sleep 2
/bin/umount -a -r 2> /dev/null > /dev/null
fi

####################/etc/rc.conf
# 设定 rc.conf 文件是因为这个文件中存放系统服务的公共变量,维护方便,也可以不设定。
## Interfaces ##
EXTIF=eth0
INTIF=eth1

## Changed to resolve conflicts ##
INTIP=192.168.101.1
INTNM=255.255.255.0

## System Domainname ##
DOMAIN=root
HOSTNAME=ysl

## STATIC IP config (You can set your static IP) ##
#EXTIP="192.168.25.2"
#EXTNM="255.255.255.0"
#EXTGW="192.168.25.1"
#DNS="192.168.1.1 192.168.1.2 192.168.1.3"

## Autoload Modules ##
AUTOMODS="rtc 3c59x typhoon tulip eepro100 natsemi forcedeth
8139cp 8139too via-rhine pcnet32 acenic e1000 ns83820 r8169 tg3"

####################/etc/profile
#
export PATH="/usr/local/mysql/bin:/usr/local/http/bin:$PATH:/usr/bin:/bin:/usr/sbin:/sbin"

# This fixes the backspace when telnetting in.
if [ "$TERM" != "linux" ]; then
        stty erase ^?
fi

PS1='\[\033[01;31m\]\h \[\033[01;34m\]\W \$ \[\033[00m\]'
PS2='> '
PS4='+ '

alias ll='ls -l'
alias ..='cd ..'
alias ...='cd ../..'
alias md='mkdir'
alias rd='rmdir'
alias less='more'

#################### end

4 配置系统的库文件

系统及各个服务启动运行所需要的库文件是建立文件系统的难点和重点,比如 /bin/bash 的库文件如果没有,那么系统是启动不了的,所以这一部分必须要谨慎。
在主机系统的 /lib, /usr/lib 等目录下都是系统启动服务及安装软件时用到的库文件.在主机系统的 /bin 目录下用 ldd 命令可以看到各个可执行文件分别都和那些动态库连接如

[root@ysl bin]# ldd bash
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x00cb7000)
        libdl.so.2 => /lib/libdl.so.2 (0x0016d000)
        libc.so.6 => /lib/tls/libc.so.6 (0x001c9000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x001b3000)
[root@ysl bini]#

这就是说要运行 bash 必须要将 /lib/libtermcap.so.2 /lib/libdl.so.2 /lib/tls/libc.so.6 /lib/ld-linux.so.2 库文件拷贝到定制系统的相关位置,注意其中有的是链接文件,要将链接文件和原文件都拷贝过去。

根据定制系统的要求,将相关的库文件拷贝到 /mnt/hdd/lib /mnt/hdd/usr/lib 文件中.

在拷贝主机系统的 /lib 目录下的相关库文件的同时,不要忘了在最初编译内核过程中在主机系统的 /lib/modules 目录下生成的新内核的加载模块,系统要正常启动这些模块是不能缺少的,将主机系统下 /lib/modules/1.6.11.1 文件夹完全拷贝到第2硬盘的相对位置中。

文件系统建立完成,相应的库文件也拷贝完毕,整个操作系统的框架就建立起来了。下面介绍如何启动这个系统

四 制作引导grub

将主机系统的grub相关文件拷贝到第2硬盘中,并在此盘上创建独立的引导系统.系统的启动要用到操作系统的内核,因此要将在前面编译的内核文件拷贝到新作的系统中.
# cp /boot/vmlinuz-2.6.11.1 /mnt/hdd/boot/
# cp /boot/grub/stage1 /boot/grub/stage2 /boot/grub/e2fs_stage1_5 /mnt/hdd/boot/grub
执行grub的安装
# grub
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
然后编辑grub.conf文件,指出系统启动时的内核和路径.

五 测试系统

如果没有什么大的问题,那么一个根据自己需求定制的Linux操作系统已经完成,启动进行测试,看能否登陆.如果能够登陆则进行下一步工作,如果不能,需要针对具体的问题,进行必要的修改.