LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4980|回复: 7

**从源代码建立一个极小的Linux**

[复制链接]
发表于 2004-11-18 15:17:45 | 显示全部楼层 |阅读模式
**从源代码建立一个极小的Linux**

====================================================
原作:Greg O'Keefe,gcokeefe@postoffice.utas.edu.au
      version:0.8, September 2000
原文:http://web.rsise.anu.edu.au/~okeefe/p2b/

作者:Arthur Yang, arthuryang@online.cq.cn
      2004年11月

译者注:本文并非逐字对照翻译,而是以原文为参考重新创作。

=====================================================

作者声明这个极小的Linux系统太小,还不能直接用于实际工作,如果要建立一个实用的Linux,请参阅Linux From Scratch(LFS)系列文章


LFS中文网站:http://lfs.linuxsir.cn


======
0 简述
======
简单的说,作者在一个单独的分区上设置了Linux的各个目录,将一个内核映象放在boot目录中,安装glibc、sysvinit、bash(bash要求

安装ncurses)、util-linux(包括getty和login)以及sh-utils(使用其中的stty),然后用lilo启动该分区,即可到达bash提示符。

我将尝试用grub来替代lilo启动系统。到达bash提示符后,进一步研究如何安装一套编译工具。这个思路和LFS是相反的:LFS首先创建了

编译工具,然后在虚拟根目录下编译内核及其他工具,最后启动。


==========
1 准备工作
==========
首先要一个已经安装好并可以使用的Linux发行版,比如Red Hat或者Debian,我使用的是Debian Sarge网络安装版。我们将用这个Linux系

统在一个单独的分区上建立一个新的Linux系统。我们要建立的新系统称为目标系统(target system),而原来那个Linux系统称为源系统

(source system),这里源系统也是宿主系统(host system)兼编译系统(build system),下面主要使用宿主系统这个术语。

我使用sarge-i386-netinst.iso用默认设置重新安装了一个系统。使用了两个虚拟IDE硬盘,各2G,在第一个虚拟硬盘上安装系统。最好使

用一个分区。注意新安装的系统要正确设置DNS(我使用192.168.1.2的Debian通过ADSL拨号作为网关,域名服务器Name Server不能使用

192.168.1.2,而应该使用192.168.1.2上/etc/resolv.conf中的域名服务器,即修改新安装系统上的/etc/resolv.conf)。我使用的apt服

务器为http://mirrors.geekbone.org(de ... b来启动系统。

源系统上需要安装的东东有:
ftpd                ftp服务器。用于从其他机器上传文件到源系统中。
gcc                GNU的gcc编译器。附带安装了binutils和cpp。使用apt安装:apt-get install gcc
------------------
另,按安装gcc时apt的建议和推荐安装相关的工具:
atp-get install binutils-doc cpp-doc make manpages-dev autoconf automake libtool flex bison gdb gcc-doc gcc-3.3-doc libc

-dev* libc6-dev*
------------------
g++                GNU的C++编译器。
patch                打补丁的工具。
ncurses-dev        使应用程序可以在终端直接控制屏幕显示的库。
bzip2                处理bz2格式的压缩包。
以上的软件包可用apt-get install name安装(name是软件包名字,比如g++)。


需要准备的源代码包有:
make_devices                        来自LFS软件包,是一个脚本文件,内容参见附录A,已加上中文注释。
linux-2.6.9.tar.bz2                Linux内核源代码,可以从ftp.kernel.org、ftp://mirrors.geekbone.org/kernel/v2.6/(中国大陆

)以及其他站点上下载。
glibc-2.3.3.tar.bz2                GNU的C标准库。同时还应该准备glibc-linuxthreads-2.3.3.tar.bz2,即外挂的多线程支持库,它和

glibc不是同一项目,因此不在一起。二者都可以在ftp://ftp.gnu.org/gnu/glibc/ 下载。
ncurses-5.4.tar.gz                使应用程序可以在终端直接控制屏幕显示的库。ftp://ftp.gnu.org/gnu/ncurses/ 下载。
sysvinit-2.85.tar.gz                系统启动和关闭时使用的工具,如init、shutdown、halt、reboot等,参见其中doc目录下的Install

文件。ftp://ftp.cistron.nl/pub/people/miquels/software 下载。               
bash-3.0.tar.gz                        bash,一种shell。可以从ftp://ftp.gnu.org/gnu/bash/ 下载。
sh-utils-2.0.tar.gz                shell中使用的一些小型工具,比如chroot、date、echo等,参见其中的README文件。可以从

ftp://ftp.gnu.org/gnu/sh-utils/ 下载。
util-linux-2.11r.tar.bz2        一些实用工具,比如mount、fdisk等,参见其中的README文件及各源代码目录下的说明。

ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux/ 下载,但速度较慢,可以从google上搜索一下。
coreutils                        系统重要工具,比如ls等。

注意:ftp://mirrors.geekbone.org上面 ... 从那里下载。


==========
2 文件系统
==========
第二个虚拟硬盘的设备文件是/dev/hdb。我使用cfdisk命令来对该硬盘分区:
cfdisk /dev/hdb
将得到提示:该硬盘没有分区表,是否使用空分区表先?按y回车。
按左右键可以移动下面的选项中光标,按上下键可以移动分区表中的光标(现在分区表中显示Free Space,即只有空余空间,尚无分区)

,按回车键选择。先选择New,选择Primary(主分区),大小为1700MB(虚拟硬盘大小为2G,留300M作为虚拟内存使用的交换分区),选

择Beginning(从该硬盘的开始地址开始这个分区),这样分区表上就有了hdb1,选择Bootable(设置该分区可启动),可看见hdb1的

Flags下有了Boot符号。下移到Free Space,选择New,选择primary,用默认大小(300-400MB),这样分区表上就有了hdb2,再左右移动

选择Type,按任意键继续,输入82(设置该分区类型为交换分区)后回车。

最后选择Write,输入yes后回车(要输入yes三个字母才行),最后选择Quit或直接按q键退出。

我将在/dev/hdb1上建立ext3文件系统:
mkfs.ext3 /dev/hdb1
然后在/dev/hdb2上建立交换分区:
mkswap /dev/hdb2

这样就建立好了目标系统的文件系统了。将/dev/hdb1挂接到宿主系统中:(必须是root用户)
mount /dev/hdb1 /mnt/target
(可能需要先建立/mnt/target目录:mkdir -p /mnt/target)
这里是挂到/mnt/target目录,也可以是其他目录。后面的操作都使用该目录,想使用其他目录请做相应改动。

Linux下的目录结构和命名是有一定规范的,我们将要新建的系统和LFS一样,都需要遵循FHS规范(这里使用的是2.3版)。规范文档参见

http://www.pathname.com/fhs/
在/mnt/target目录下建立若干必需的目录:
cd /mnt/target
mkdir bin boot dev etc home lib mnt root sbin tmp usr var
mkdir var/{lock,log,run,spool}
mkdir usr/{bin,include,lib,local,sbin,share,src}
mkdir -p usr/share/man/man{1,2,3,4,5,6,7,8,9}

所建立的目录树为:
/mnt/target(/dev/hdb1)
├bin        (关键系统命令)
├boot         (用于启动的文件,如内核映象,grub等)
├dev        (设备文件)
├etc        (系统配置文件)
├home        (用户目录,系统中每个用户都在这里有一个以用户id为名称的子目录)
├lib        (共享的库和内核模块)
├mnt        (临时挂接其他文件系统于某子目录)
├root        (root用户的主目录)
├sbin  (关键的系统管理命令,比如reboot、init等)
├tmp        (临时文件目录)
├─usr (用户的程序、文档、库等)
│  ├bin        (一般的系统命令)
│  ├include        (供用户使用的标准头文件)
│  ├lib        (编程用的库和软件包)
│  ├local        (安装于本地的各种程序、数据和文件等,
│  │           一般有bin、etc、include、lib、man、
│  │           sbin、share、src等子目录,本地用户安
│  │           装的程序应放在/usr/local/bin中,
│  │           /usr/bin中放的是一般的系统命令,
│  │           提供给所有用户使用)
│  ├sbin        (一般的系统管理命令)
│  ├share        (本来用于存放架构无关的数据,现在主要
│  │  │         用于存放帮助和文档,分别在子目录man和doc中)
│  │  └man
│  │    ├man1
│  │    ├man2
│  │    ├man3
│  │    ├man4
│  │    ├man5
│  │    ├man6
│  │    ├man7
│  │    ├man8
│  │    └man9
│  └src        (所有的源代码都应放在这里,包括内核的源代码)
└─var        (存放各种数据,包括各种日志和邮件等)
    ├lock        (用于锁定的标志文件)
    ├log        (日志文件)
    ├run        (当前正在运行的进程所使用的数据)
    └spool        (等待后来程序处理的数据)

由于很多软件都默认使用/usr/man目录,因此在usr目录下做一个符号连接:
ln -s share/man usr/man

==============
3 建立设备文件
==============
在dev目录中需要建立设备文件,这可不是mkdir或者touch可以办到的了,因为设备文件是特殊文件,需要使用mknod才行。
可以使用脚本文件来建立这一系列设备文件。附录A中是一个较齐全的脚本文件,我加上了中文注释,供参考。我试用过,好像不行,看来

真的仅供参考了。值得一读的是其中有点Shell脚本的注释,或许可以有所收获。
这里使用一个较简单的脚本文件,内容和注释如下。

#!/bin/sh
#只选择了一些最基本的设备
#****************************************************************************
#                         TTY 终端设备
#****************************************************************************
MODE=620
# 当前的虚拟终端
mknod -m $MODE tty0 c 4 0
# 一般使用8个虚拟终端设备,就是用ALT+Fn(n=1,2,3...8)切换的那些虚拟终端,这里
# 只用了两个
mknod -m $MODE tty1 c 4 1
mknod -m $MODE tty2 c 4 2

# 系统控制台
mknod -m $MODE console c 5 1



#****************************************************************************
#                         硬盘和光驱
#****************************************************************************
MODE=660
# 第一个IDE设备(也可能是光驱)
mknod -m $MODE hda b 3 0 ; chgrp $GROUP hda
# 该设备上的第一个分区
mknod -m $MODE hda1 b 3 1 ; chgrp $GROUP hda1
# 该设备上的第二个、第三个……(还可以添加更多——谁会分这么多分区?)
mknod -m $MODE hda2 b 3 2 ; chgrp $GROUP hda2
mknod -m $MODE hda3 b 3 3 ; chgrp $GROUP hda3
mknod -m $MODE hda4 b 3 4 ; chgrp $GROUP hda4
# ...

# 第二个IDE设备(也可能是光驱)
mknod -m $MODE hdb b 3 64 ; chgrp $GROUP hdb
# 该设备上的第一个分区
mknod -m $MODE hdb1 b 3 65 ; chgrp $GROUP hdb1
# 该设备上的第二个、第三个……(还可以添加更多——谁会分这么多分区?)
mknod -m $MODE hdb2 b 3 66 ; chgrp $GROUP hdb2
mknod -m $MODE hdb3 b 3 67 ; chgrp $GROUP hdb3
mknod -m $MODE hdb4 b 3 68 ; chgrp $GROUP hdb4
# ...

# 第n个IDE设备如法炮制

#****************************************************************************
#                         内存设备
#****************************************************************************
MODE=660
# Null 设备,写入到该设备的数据都被丢弃
mknod -m $MODE null c 1 3

将这些内容写入到一个文件中,比如叫makedev.sh,然后赋予执行权限(root用户才行):
chmod 755 makedev.sh
移动到/dev目录下:
mv makedev.sh /mnt/target/dev
然后执行它即可:
/mnt/target/dev/makedev.sh


==========
4 编译内核
==========
已经有很多文章介绍如何编译内核了,这里就简略的说一下。
将linux-2.6.9.tar.bz2放到(宿主系统的)/usr/src目录下解压缩:
mv linux-2.6.9.tar.bz2 /usr/src
cd /usr/src
tar xvjf linux-2.6.9.tar.bz2

进入解压缩后的目录:
cd linux-2.6.9

配置内核:
make menuconfig
这里是编译内核中最关键的一步,附录B中是我的配置文件,供参考。

配置完之后:
make
将生成的内核文件复制到boot目录:
cp arch/i386/boot/bzImage /mnt/target/boot/vmlinuz-2.6.9



==========
5 尝试启动
==========
修改宿主系统的/boot/grub/menu.1st,即在文件末尾添加如下内容:

title   New Linux
root    (hd1,0)
kernel  /boot/vmlinuz-2.6.9 root=/dev/hdb1 rw
boot

当然也可以用下面的命令来添加:
cat >> /boot/grub/menu.1st <<"EOF"
title   New Linux
root    (hd1,0)
kernel  /boot/vmlinuz-2.6.9 root=/dev/hdb1 rw
boot
EOF

然后重启,选择New Linux选项启动,前面是大篇大篇的系统启动信息,真是激动人心。

但是,且慢!

屏幕停下来了,启动失败了。这是因为现在还只有一个内核,没有初始化进程init,更没有shell。内核引导完毕后将会试图启动init进程

,它是所有进程的父进程。


=======
6 Glibc
=======
和Linux中的其他程序一样,初始化进程init需要连接到C库。Linux中使用的C库一般是GNU C标准库,即glibc。因此目标系统中首先需要

安装glibc。
glibc可是个大东东,至少要使用300多M空间,作者使用Celeron 433/64M花了33分钟才完成编译,事实上使用虚拟机并不比他快多少。

glibc的安装需要使用源代码之外的一个单独目录。
将glibc-2.3.3.tar.bz2放到(宿主系统的)/usr/src目录下解压缩:
mv glibc-2.3.3.tar.bz2 /usr/src
cd /usr/src
tar xvjf glibc-2.3.3.tar.bz2
然后需要使用多线程支持库glibc-linuxthreads-2.3.3.tar.bz2。将其放到(宿主系统的)/usr/src目录下,再到glibc-2.3.3目录下解压

缩:
mv glibc-2.3.3.tar.bz2 /usr/src
cd /usr/src/glibc-2.3.3
tar xvjf ../glibc-linuxthreads-2.3.3.tar.bz2
接下来就建立一个源代码之外的单独目录glibc-build,到那里去编译:
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.3/configure --prefix=/usr \
  --enable-add-ons=linuxthreads
make
make install_root=/mnt/target install


==========
7 SysVinit
==========
系统初始化完毕后产生的第一个进程就是init进程,后面所有进程都是它的子进程。sysvinit-2.85.tar.gz就是Linix System V的init程

序。
将sysvinit-2.85.tar.gz放到(宿主系统的)/usr/src目录下解压缩:
cd /usr/src
tar xvfz sysvinit-2.85.tar.gz
然后进入该目录中src子目录开始编译,并安装到/mnt/target目录:
cd sysvinit-2.85/src
make
ROOT=/mnt/target make install
注意:因为宿主系统是Debian,因此需要手动添加initctl设备:
cd /mnt/target/dev
mknod -m 600 initctl p

但是,此时并没有安装配置脚本文件。系统启动时,init进程将会寻找/etc/inittab这个配置文件。
下面是一个非常简陋的inittab文件:
--------------------------------------------
#默认运行级别
id:3:initdefault:

# 对于运行级别2和3,在虚拟控制台上运行登录程序getty。
# getty 后面的115200表示连接速率,tty1表示第一个虚拟终端。
1:23:respawn:/sbin/getty 115200 tty1
2:23:respawn:/sbin/getty 115200 tty2
--------------------------------------------

如果现在重启,选择New Linux选项启动,仍然启动失败。注意到上面的inittab文件中使用/sbin/getty程序,而该程序还没有安装。


=======
8 getty
=======
getty和login都在util-linux-2.11r.tar.bz2中。
将util-linux-2.11r.tar.bz2放到(宿主系统的)/usr/src目录下解压缩并进入该目录:
cd /usr/src
tar xvjf util-linux-2.11r.tar.bz2
cd util-linux-2.11r
首先设置两个变量:
export LDFLAGS="-static"
export DESTDIR=/mnt/target
这两个变量分别用于指示连接器使用静态连接和指示目标目录。
运行
./configure
由于配置程序将会根据现在使用的编译系统来配置,因此需要修改MCONFIG文件。
其中HAVE_SHADOW=yes改为HAVE_SHADOW=no

由于其中disk-utils中有两个程序会编译出错,因此需要修改改目录中的Makefile。
cd disk-utils
修改其中Makefile。找到
SBIN=   mkfs  mkswap blockdev elvtune fsck.minix mkfs.minix mkfs.bfs
将其中的blockdev和elvtune删去。然后返回上层目录,开始编译和安装:
cd ..
make
make install

重启试试看先。
提示为
(none) login:

但是,现在还进不去,因为没有shell,需要安装bash。即使安装了bash,现在也进不去,因为还没有passwd文件,不管输入什么用户名,

login都提示Password:,但是因为找不到用户名对应的密码,所以总是提示Login incorrect。因此,需要在新系统中的etc目录下建一个

passwd,内容为:
root::0:0:root:/root:/bin/sh

要是觉得那个none不爽,可以在etc目录下建一个issue的文件,文件内容就是提示内容,可以使用\n表示换行。但现在这个系统中什么都

没有,包括最熟悉的ls。甚至连reboot命令后都不能自动重启,必须手动按reset键才行。

========
安装bash
========
bash使用了ncurses库,这是一种使应用程序可以在终端直接控制屏幕显示的库。因此,需要先安装ncurses-5.4.tar.gz:
cd /usr/src
tar xvzf ncurses-5.4.tar.gz
cd ncurses-5.4
./configure --prefix=/mnt/target/
make && make install
然后安装bash:
cd /usr/src
tar zxvf bash-3.0.tar.gz       
cd bash-3.0
./configure --prefix=/mnt/target
make && make install

由于很多地方使用的shell都是sh,因此建立一个符号映射文件:
ln -s bash /mnt/target/sh


现在重启,输入root回车,就可以看见-sh-3.00#的提示了!


========
系统工具
========
ls是一个程序,包括在coreutils软件包中,因此需要安装该软件包。
cd /usr/src
tar xvjf coreutils-
cd coreutils-
./configure --prefix=/mnt/target
make && make install

重启后,现在可以使用ls命令了。

====
小结
====
看起来也到达shell提示符了,似乎是成功了。但是我们现在所建立的系统还并不令人满意:首先,它不是一个最小的系统,我们只是简单

的把软件包整个装上去了,没有加以取舍。其次,它并不完整,配置文件、编译器等还有很多工作要做。
下一步该做点什么?这取决于你做这样一个系统做什么用。我做这样一个系统目的是为了研究怎样在嵌入式系统上使用Linux,因此我不需

要编译工具,而且也需要进一步取舍,并且,还需要做一些交叉编译的准备工作。也许有人是为了研究Linux本身。一般来说,我个人认为

,除了研究内核源代码之外,把Linux系统整个的结构剖析清楚也是非常值得做的工作。现在Linux系统中有那么多的配置文件、设备文件

、工具程序等等,那些才是我们真正需要的?我觉得从现在建立的这个残破不全的系统开始,我们可以发现更多的内容。
要完善这个系统,可以参考LFS中关于建立系统配置文件和设备文件的内容。另一方面就是弄一套完整的编译工具到这个系统,让它可以自

给自足。

我觉得先做一个简单的系统再完善它,不失为另一种LFS的途径。但我的目标不是做LFS,因此,想要研LFS的朋友,我们看来要分道扬镳了

。不过,有句常见于武侠小说和神怪小说中的名言:“一理通,万法融”,在研究Linux的过程中,最关键的还是弄明白其原理和架构。








==================
附录A make_devices
==================


#!/bin/sh

#由Matthias S. Benkmann编写
#此脚本文件包含了大部分Linux下的设备,它们使用mknod命令来创建相应的设备文件,但大多数都已经被注释起来,因为毕竟一个系统上

要使用的设备是其中的少数。
#
#脚本中默认使用的设备是大多数系统都可能使用到的。Linux下的设备文件并不是存在一个设备文件就一定要有该设备才行,有很多设备

文件是暂时用不着的,比如scci设备等,只是造出来放着备用而已。

#注意:默认情况下没有创建旧版主从pty设备,这里假设了系统内核支持Unix98 pty,并且假设系统使用“mount -t devpts devpts

/dev/pts”命令来挂接devpts文件系统,或者是在/etc/fstab文件中设定了挂接该文件系统(LFS手册中使用的方法)。一般来说,我们不

会使用这个pty设备,缺少这个也不会影响系统的启动或系统在本地终端上的使用,但对于像xterm和ssh等就需要使用pty设备:或者是旧

版pty或者是Unix98 pty。如果一定要使用旧版pty,就自己查找“Pseudo-TTY”来添加该设备。

###################################
# 预备动作                        #
# 赶时间就快进100行直接看设备列表 #
###################################


#组定义。等号左边是本脚本文件中使用的组,等号右边是Linux系统中对应的组(参见Linux系统中/etc/group文件)。只有在指定组操作

才使用这些组,比如让一组用户只读使用某设备等。

audio=audio
cdrom=disk
system=sys
console=tty
dialout=dialout
disk=disk
floppy=floppy
ibcs2=root
mouse=root
game=$mouse
private=root
public=root
readable=root
video=root
obscure=root
symlinks=root
generic=disk
vcs=tty
tty=tty
kmem=kmem
printer=lp
tape=tape

#本脚本文件中使用的组(也就是上面提到的)有:

groups='audio cdrom system console dialout disk floppy ibcs2 mouse
     game private public readable video obscure symlinks generic
     vcs tty kmem printer tape'

set -u  #当执行参数扩展时,把非环境变量作为错误处理,即如果在命令中使用非环境变量,shell将显示错误信息。

#由于mknod没有强制选项,因此下面需要先删除所有允许创建的设备,以便重新创建该设备。而那些不允许创建的设备,即使禁用它们并

再次运行此脚本也不能删除它们。
#下面的命令实际上是首先用sed命令对本脚本文件自身的内容进行替换,并将替换过的内容输出到标准输出,再通过运行shell来执行标准

输出的内容。注意反引号`(标准英文键盘中TAB键上面那个键)的使用:shell将首先两个反引号之间的内容,用运行结果(标准输出)替

换掉两个反引号及其之间的部分,再执行整条命令,这称为命令替换,$( )也做同样的事。
#sed所进行的替换是将以“mknod -m $MODE 设备名 ...”开头的行替换成“rm -f 设备名”。s操作后面的^[ \t]*用于去掉从行首开始的

空格或TAB,而$MODE后面的\([^ ]*\表示不为空格的字符串,小括号用于后面的引用。\1表示引用前面第一个小括号中的内容。s操作的p

标志表示在标准输出上显示发生替换操作的当前行。
sh -c "`sed -n $'s/^[ \t]*''mknod -m $MODE \([^ ]*\) .*/rm -f \1/p' $0`"

#下面检查组名称解析的情况,若不能正确解析,则只好根据/etc/group文件手动修改。

if [ "`id -gn root 2>&1`" != "root" ]; then
###如果root用户所在的组不是root则需要做下面的检查:(一般这种情况都不会发生)
  getgid() {
    line=`grep ^$1: /etc/group` || { echo $1 ; return 1; }
    echo "$line" | cut -d : -f 3
  }

  echo 1>&2 'NOTICE: Resolving group names using /etc/group'

  for g in $groups ;
  do
    eval $g=`getgid ${!g}`
  done         
fi


#############################################################################
#                                                                           #
#                              设  备  大  类  列  表                              #
#                                                                           #
#############################################################################

#############################################################################
GROUP=$console ; MODE=620
#############################################################################

#****************************************************************************
#                         TTY 终端设备
#****************************************************************************

    # 当前的虚拟终端
mknod -m $MODE tty0 c 4 0 ; chgrp $GROUP tty0

    # 一般使用8个虚拟终端设备,就是用ALT+Fn(n=1,2,3...8)切换的那些虚拟终端
mknod -m $MODE tty1 c 4 1 ; chgrp $GROUP tty1
mknod -m $MODE tty2 c 4 2 ; chgrp $GROUP tty2
mknod -m $MODE tty3 c 4 3 ; chgrp $GROUP tty3
mknod -m $MODE tty4 c 4 4 ; chgrp $GROUP tty4
mknod -m $MODE tty5 c 4 5 ; chgrp $GROUP tty5
mknod -m $MODE tty6 c 4 6 ; chgrp $GROUP tty6
mknod -m $MODE tty7 c 4 7 ; chgrp $GROUP tty7
mknod -m $MODE tty8 c 4 8 ; chgrp $GROUP tty8
    # mknod -m $MODE tty9 c 4 9 ; chgrp $GROUP tty9
    # mknod -m $MODE tty10 c 4 10 ; chgrp $GROUP tty10

    # ...............................................
    # mknod -m $MODE tty62 c 4 62 ; chgrp $GROUP tty62
    # 63rd virtual console
    # mknod -m $MODE tty63 c 4 63 ; chgrp $GROUP tty63


#****************************************************************************
#                         其他 TTY 设备
#****************************************************************************

    # 系统控制台
mknod -m $MODE console c 5 1 ; chgrp $GROUP console

#############################################################################
GROUP=$console ; MODE=666
#############################################################################

#****************************************************************************
#                         其他 TTY 设备
#****************************************************************************

    # 当前的 TTY 设备
mknod -m $MODE tty c 5 0 ; chgrp $GROUP tty


#############################################################################
GROUP=$tty ; MODE=666
#############################################################################

#****************************************************************************
#                         其他 TTY 设备
#****************************************************************************

    # PTY master multiplex(不知道是什么)
mknod -m $MODE ptmx c 5 2 ; chgrp $GROUP ptmx

#############################################################################
GROUP=$disk ; MODE=660
#############################################################################

#****************************************************************************
#                         RAM 盘
#****************************************************************************

    # 第一个
mknod -m $MODE ram0 b 1 0 ; chgrp $GROUP ram0
    # 第二个
mknod -m $MODE ram1 b 1 1 ; chgrp $GROUP ram1
    # mknod -m $MODE ram2 b 1 2 ; chgrp $GROUP ram2
    # mknod -m $MODE ram3 b 1 3 ; chgrp $GROUP ram3
    # ...

    # Initial RAM disk {2.6}
    # mknod -m $MODE initrd b 1 250 ; chgrp $GROUP initrd

#****************************************************************************
#                         循环设备(Linux网络必须使用的虚拟设备)
#****************************************************************************

    # 第一个
mknod -m $MODE loop0 b 7 0 ; chgrp $GROUP loop0
    # 第二个
mknod -m $MODE loop1 b 7 1 ; chgrp $GROUP loop1
    # ...

#****************************************************************************
#                         硬盘和光驱
#****************************************************************************

    # 第一个IDE设备(也可能是光驱)
mknod -m $MODE hda b 3 0 ; chgrp $GROUP hda
    # 该设备上的第一个分区
mknod -m $MODE hda1 b 3 1 ; chgrp $GROUP hda1
    # 该设备上的第二个、第三个……第七个分区(还可以添加更多——谁会分这么多分区?)
mknod -m $MODE hda2 b 3 2 ; chgrp $GROUP hda2
mknod -m $MODE hda3 b 3 3 ; chgrp $GROUP hda3
mknod -m $MODE hda4 b 3 4 ; chgrp $GROUP hda4
mknod -m $MODE hda5 b 3 5 ; chgrp $GROUP hda5
mknod -m $MODE hda6 b 3 6 ; chgrp $GROUP hda6
mknod -m $MODE hda7 b 3 7 ; chgrp $GROUP hda7
    # ...

    # 第二个IDE设备(也可能是光驱)
mknod -m $MODE hdb b 3 64 ; chgrp $GROUP hdb
    # 该设备上的第一个分区
mknod -m $MODE hdb1 b 3 65 ; chgrp $GROUP hdb1
    # 该设备上的第二个、第三个……第七个分区(还可以添加更多——谁会分这么多分区?)
mknod -m $MODE hdb2 b 3 66 ; chgrp $GROUP hdb2
mknod -m $MODE hdb3 b 3 67 ; chgrp $GROUP hdb3
mknod -m $MODE hdb4 b 3 68 ; chgrp $GROUP hdb4
mknod -m $MODE hdb5 b 3 69 ; chgrp $GROUP hdb5
mknod -m $MODE hdb6 b 3 70 ; chgrp $GROUP hdb6
mknod -m $MODE hdb7 b 3 71 ; chgrp $GROUP hdb7
    # ...

    # 第n个IDE设备如法炮制
    # mknod -m $MODE hdc b 22 0 ; chgrp $GROUP hdc
    # First partition on hdc
    # mknod -m $MODE hdc1 b 22 1 ; chgrp $GROUP hdc1
    # Second partition on hdc
    # mknod -m $MODE hdc2 b 22 2 ; chgrp $GROUP hdc2
    # ...

#****************************************************************************
#                         SCSI 硬盘 (0-15)
#****************************************************************************

    # 第一个 SCSI 硬盘
mknod -m $MODE sda b 8 0 ; chgrp $GROUP sda
    # 该硬盘上的第一个分区
mknod -m $MODE sda1 b 8 1 ; chgrp $GROUP sda1
    # 该硬盘上的第二个分区及更多分区
mknod -m $MODE sda2 b 8 2 ; chgrp $GROUP sda2
mknod -m $MODE sda3 b 8 3 ; chgrp $GROUP sda3
mknod -m $MODE sda4 b 8 4 ; chgrp $GROUP sda4
mknod -m $MODE sda5 b 8 5 ; chgrp $GROUP sda5
mknod -m $MODE sda6 b 8 6 ; chgrp $GROUP sda6
mknod -m $MODE sda7 b 8 7 ; chgrp $GROUP sda7
    # ...

    # 第二个 SCSI 硬盘
mknod -m $MODE sdb b 8 16 ; chgrp $GROUP sdb
    # 该硬盘上的第一个分区
mknod -m $MODE sdb1 b 8 17 ; chgrp $GROUP sdb1
    # 该硬盘上的第二个分区及更多分区
mknod -m $MODE sdb2 b 8 18 ; chgrp $GROUP sdb2
mknod -m $MODE sdb3 b 8 19 ; chgrp $GROUP sdb3
mknod -m $MODE sdb4 b 8 20 ; chgrp $GROUP sdb4
mknod -m $MODE sdb5 b 8 21 ; chgrp $GROUP sdb5
mknod -m $MODE sdb6 b 8 22 ; chgrp $GROUP sdb6
mknod -m $MODE sdb7 b 8 23 ; chgrp $GROUP sdb7
    # ...
   
    #更多的SCSI硬盘如法炮制

#############################################################################
GROUP=$dialout ; MODE=660
#############################################################################

#****************************************************************************
#                         TTY 设备
#****************************************************************************

    # 第一个 UART 串口
mknod -m $MODE ttyS0 c 4 64 ; chgrp $GROUP ttyS0
mknod -m $MODE ttyS1 c 4 65 ; chgrp $GROUP ttyS1
mknod -m $MODE ttyS2 c 4 66 ; chgrp $GROUP ttyS2
mknod -m $MODE ttyS3 c 4 67 ; chgrp $GROUP ttyS3
    # ...
    # 更多的 UART 串口
    # mknod -m $MODE ttyS191 c 4 255 ; chgrp $GROUP ttyS191


#############################################################################
GROUP=$floppy ; MODE=660
#############################################################################

#****************************************************************************
#                         软驱
#****************************************************************************

    # 第0个软驱控制器,第0个软驱,自动检测
mknod -m $MODE fd0 b 2 0 ; chgrp $GROUP fd0
    # 第0个软驱控制器,第1个软驱,自动检测
mknod -m $MODE fd1 b 2 1 ; chgrp $GROUP fd1
    # 其他的如法炮制
    # mknod -m $MODE fd2 b 2 2 ; chgrp $GROUP fd2
    # Controller 0, drive 3, autodetect
    # mknod -m $MODE fd3 b 2 3 ; chgrp $GROUP fd3

    # Controller 1, drive 0, autodetect
    # mknod -m $MODE fd4 b 2 128 ; chgrp $GROUP fd4
    # Controller 1, drive 1, autodetect
    # mknod -m $MODE fd5 b 2 129 ; chgrp $GROUP fd5
    # Controller 1, drive 2, autodetect
    # mknod -m $MODE fd6 b 2 130 ; chgrp $GROUP fd6
    # Controller 1, drive 3, autodetect
    # mknod -m $MODE fd7 b 2 131 ; chgrp $GROUP fd7


#############################################################################
GROUP=$kmem ; MODE=640
#############################################################################

#****************************************************************************
#                         内存设备
#****************************************************************************

    # 通过此设备读写物理内存
mknod -m $MODE mem c 1 1 ; chgrp $GROUP mem

    # 通过此设备读写内核内存空间
mknod -m $MODE kmem c 1 2 ; chgrp $GROUP kmem

#############################################################################
GROUP=$kmem ; MODE=660
#############################################################################

    # 通过此设备读写 I/O 端口
mknod -m $MODE port c 1 4 ; chgrp $GROUP port




#############################################################################
GROUP=$printer ; MODE=660
#############################################################################

#****************************************************************************
#                         并口
#****************************************************************************

    # 第一个
mknod -m $MODE parport0 c 99 0 ; chgrp $GROUP parport0
    # 第二个
mknod -m $MODE parport1 c 99 1 ; chgrp $GROUP parport1
    # mknod -m $MODE parport2 c 99 2 ; chgrp $GROUP parport2
    # ...

#****************************************************************************
#                         并口打印机
#****************************************************************************

    # 并口0上的打印机
mknod -m $MODE lp0 c 6 0 ; chgrp $GROUP lp0
    # 并口1上的打印机
mknod -m $MODE lp1 c 6 1 ; chgrp $GROUP lp1
    # mknod -m $MODE lp2 c 6 2 ; chgrp $GROUP lp2
    # ...



#############################################################################
GROUP=$mouse ; MODE=660
#############################################################################

#****************************************************************************
#                         非串行鼠标
#****************************************************************************

    # Logitech bus mouse
    # mknod -m $MODE logibm c 10 0 ; chgrp $GROUP logibm

    # PS/2端口的鼠标
mknod -m $MODE psaux c 10 1 ; chgrp $GROUP psaux

    # Microsoft Inport bus mouse
    # mknod -m $MODE inportbm c 10 2 ; chgrp $GROUP inportbm

    # ATI XL bus mouse
    # mknod -m $MODE atibm c 10 3 ; chgrp $GROUP atibm

    # Amiga mouse (68k/Amiga)
    # mknod -m $MODE amigamouse c 10 4 ; chgrp $GROUP amigamouse

    # J-mouse
    # mknod -m $MODE jbm c 10 4 ; chgrp $GROUP jbm

    # Atari mouse
    # mknod -m $MODE atarimouse c 10 5 ; chgrp $GROUP atarimouse

    # Sun mouse
    # mknod -m $MODE sunmouse c 10 6 ; chgrp $GROUP sunmouse

    # Second Amiga mouse
    # mknod -m $MODE amigamouse1 c 10 7 ; chgrp $GROUP amigamouse1

    # Simple serial mouse driver
    # mknod -m $MODE smouse c 10 8 ; chgrp $GROUP smouse

    # IBM PC-110 digitizer pad
    # mknod -m $MODE pc110pad c 10 9 ; chgrp $GROUP pc110pad

    # Apple Desktop Bus mouse
    # mknod -m $MODE adbmouse c 10 10 ; chgrp $GROUP adbmouse




#############################################################################
GROUP=$public ; MODE=666
#############################################################################

#****************************************************************************
#                         内存设备
#****************************************************************************

    # Null 设备,写入到该设备的数据都被丢弃
mknod -m $MODE null c 1 3 ; chgrp $GROUP null

    # Null 设备
mknod -m $MODE zero c 1 5 ; chgrp $GROUP zero

    # 写入到该设备时返回ENOSPC
mknod -m $MODE full c 1 7 ; chgrp $GROUP full



#############################################################################
GROUP=$readable ; MODE=444
#############################################################################

#****************************************************************************
#                         内存设备
#****************************************************************************

    # 非确定随机数发生器
mknod -m $MODE random c 1 8 ; chgrp $GROUP random

    # 快速但不够安全的随机数发生器
mknod -m $MODE urandom c 1 9 ; chgrp $GROUP urandom

    # Asyncronous I/O notification interface
    # mknod -m $MODE aio c 1 10 ; chgrp $GROUP aio




#############################################################################
GROUP=$symlinks
#############################################################################

#下面建立一些符号连接
ln -sfn /proc/self/fd fd ; chgrp $GROUP fd
ln -sfn fd/0 stdin ; chgrp $GROUP stdin
ln -sfn fd/1 stdout ; chgrp $GROUP stdout
ln -sfn fd/2 stderr ; chgrp $GROUP stderr
   
    # ln -sfn /proc/kcore core ; chgrp $GROUP core
   
    # ln -sfn ram0 ramdisk; chgrp $GROUP ramdisk
    # ln -sf qft0 ftape ; chgrp $GROUP ftape
    # ln -sf video0 bttv0 ; chgrp $GROUP bttv0
    # ln -sf radio0 radio ; chgrp $GROUP radio
   
   
#############################################################################
GROUP=$tty ; MODE=666
#############################################################################

#****************************************************************************
#                         伪终端主设备
#****************************************************************************
# 命名规则:
# * 主设备称为pty,从设备称为tty
# * 第四个字母取自pqrstuvwxyzabcde,依次表示了16个伪终端序列
# * 第五个字母取自0123456789abcdef,表示在伪终端序列中的位置
#
# 这是旧版(BSD)伪终端设备。Unix98终端使用/dev/ptmx设备按需请求
#****************************************************************************

    # First PTY master
    # mknod -m $MODE ptyp0 c 2 0 ; chgrp $GROUP ptyp0
    # Second PTY master
    # mknod -m $MODE ptyp1 c 2 1 ; chgrp $GROUP ptyp1
    # mknod -m $MODE ptyp2 c 2 2 ; chgrp $GROUP ptyp2
    # mknod -m $MODE ptyp3 c 2 3 ; chgrp $GROUP ptyp3

    # ...............................................
    # mknod -m $MODE ptyed c 2 253 ; chgrp $GROUP ptyed
    # mknod -m $MODE ptyee c 2 254 ; chgrp $GROUP ptyee
    # 256th PTY master
    # mknod -m $MODE ptyef c 2 255 ; chgrp $GROUP ptyef

#****************************************************************************
#                         伪终端从设备
#****************************************************************************

    # First PTY slave
    # mknod -m $MODE ttyp0 c 3 0 ; chgrp $GROUP ttyp0
    # Second PTY slave
    # mknod -m $MODE ttyp1 c 3 1 ; chgrp $GROUP ttyp1
    # mknod -m $MODE ttyp2 c 3 2 ; chgrp $GROUP ttyp2
    # mknod -m $MODE ttyp3 c 3 3 ; chgrp $GROUP ttyp3

    # ...............................................
    # mknod -m $MODE ttyee c 3 254 ; chgrp $GROUP ttyee
    # 256th PTY slave
    # mknod -m $MODE ttyef c 3 255 ; chgrp $GROUP ttyef


==================
附录B 内核配置参考
==================
我的内核配置文件,只使用尽量少的内容,没有虚拟内存,没有RAMDISK。可在此文件基础上修改自己需要的配置。


#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.9
# Tue Nov 16 15:41:51 2004
#
CONFIG_X86=y
CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y

#
# Code maturity level options
#
# CONFIG_EXPERIMENTAL is not set
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y

#
# General setup
#
CONFIG_LOCALVERSION=""
# CONFIG_SWAP is not set
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=14
CONFIG_HOTPLUG=y
# CONFIG_IKCONFIG is not set
CONFIG_EMBEDDED=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SHMEM=y
# CONFIG_TINY_SHMEM is not set

#
# Loadable module support
#
# CONFIG_MODULES is not set

#
# Processor type and features
#
CONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_X86_BIGSMP is not set
# CONFIG_X86_VISWS is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_ES7000 is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
CONFIG_MPENTIUMII=y
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not set
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_X86_GENERIC is not set
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_L1_CACHE_SHIFT=5
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
# CONFIG_HPET_TIMER is not set
# CONFIG_SMP is not set
CONFIG_PREEMPT=y
CONFIG_X86_UP_APIC=y
CONFIG_X86_UP_IOAPIC=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_TSC=y
# CONFIG_X86_MCE is not set
# CONFIG_TOSHIBA is not set
# CONFIG_I8K is not set
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set

#
# Firmware Drivers
#
CONFIG_NOHIGHMEM=y
# CONFIG_HIGHMEM4G is not set
# CONFIG_HIGHMEM64G is not set
# CONFIG_MATH_EMULATION is not set
# CONFIG_MTRR is not set
CONFIG_HAVE_DEC_LOCK=y

#
# Power management options (ACPI, APM)
#
# CONFIG_PM is not set
# CONFIG_PM_DEBUG is not set

#
# ACPI (Advanced Configuration and Power Interface) Support
#
# CONFIG_ACPI is not set
CONFIG_ACPI_BLACKLIST_YEAR=0

#
# CPU Frequency scaling
#
# CONFIG_CPU_FREQ is not set

#
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
#
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
# CONFIG_PCI_MSI is not set
# CONFIG_PCI_LEGACY_PROC is not set
# CONFIG_PCI_NAMES is not set
# CONFIG_ISA is not set
# CONFIG_MCA is not set
# CONFIG_SCx200 is not set

#
# PCMCIA/CardBus support
#
# CONFIG_PCMCIA is not set

#
# PCI Hotplug Support
#

#
# Executable file formats
#
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_AOUT=y
CONFIG_BINFMT_MISC=y

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_STANDALONE=y
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
CONFIG_FW_LOADER=y

#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set

#
# Parallel port support
#
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y
# CONFIG_PARPORT_OTHER is not set
CONFIG_PARPORT_1284=y

#
# Plug and Play support
#

#
# Block devices
#
CONFIG_BLK_DEV_FD=y
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_CRYPTOLOOP=y
CONFIG_BLK_DEV_NBD=y
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
# CONFIG_BLK_DEV_RAM is not set
# CONFIG_LBD is not set

#
# ATA/ATAPI/MFM/RLL support
#
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y

#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDEFLOPPY is not set
CONFIG_BLK_DEV_IDESCSI=y
# CONFIG_IDE_TASK_IOCTL is not set

#
# IDE chipset support/bugfixes
#
CONFIG_IDE_GENERIC=y
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_IDEPCI is not set
# CONFIG_IDE_ARM is not set
# CONFIG_BLK_DEV_IDEDMA is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_HD is not set

#
# SCSI device support
#
CONFIG_SCSI=y
# CONFIG_SCSI_PROC_FS is not set

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
# CONFIG_BLK_DEV_SR is not set
CONFIG_CHR_DEV_SG=y

#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set

#
# SCSI Transport Attributes
#
CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set

#
# SCSI low-level drivers
#
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_ISP is not set
# CONFIG_SCSI_QLOGIC_FC is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
CONFIG_SCSI_QLA2XXX=y
# CONFIG_SCSI_QLA21XX is not set
# CONFIG_SCSI_QLA22XX is not set
# CONFIG_SCSI_QLA2300 is not set
# CONFIG_SCSI_QLA2322 is not set
# CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_QLA6322 is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set

#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set

#
# Fusion MPT device support
#
# CONFIG_FUSION is not set

#
# IEEE 1394 (FireWire) support
#
# CONFIG_IEEE1394 is not set

#
# I2O device support
#
# CONFIG_I2O is not set

#
# Networking support
#
CONFIG_NET=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=y
CONFIG_UNIX=y
CONFIG_NET_KEY=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_FWMARK=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=y
CONFIG_NET_IPGRE=y
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
CONFIG_INET_TUNNEL=y

#
# IP: Virtual Server Configuration
#
# CONFIG_IP_VS is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
# CONFIG_BRIDGE_NETFILTER is not set

#
# IP: Netfilter Configuration
#
# CONFIG_IP_NF_CONNTRACK is not set
CONFIG_IP_NF_QUEUE=y
# CONFIG_IP_NF_IPTABLES is not set
CONFIG_IP_NF_NAT_NEEDED=y
# CONFIG_IP_NF_ARPTABLES is not set
CONFIG_IP_NF_COMPAT_IPCHAINS=y

#
# Bridge: Netfilter Configuration
#
# CONFIG_BRIDGE_NF_EBTABLES is not set
CONFIG_XFRM=y
CONFIG_XFRM_USER=y
# CONFIG_SCTP_HMAC_NONE is not set
# CONFIG_SCTP_HMAC_SHA1 is not set
# CONFIG_SCTP_HMAC_MD5 is not set
CONFIG_BRIDGE=y
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set

#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
# CONFIG_NET_SCH_CLK_JIFFIES is not set
# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
# CONFIG_NET_SCH_CLK_CPU is not set
# CONFIG_NET_CLS_ROUTE is not set

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y
CONFIG_DUMMY=y
CONFIG_BONDING=y
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set

#
# ARCnet devices
#
# CONFIG_ARCNET is not set

#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_NET_VENDOR_3COM is not set

#
# Tulip family network device support
#
# CONFIG_NET_TULIP is not set
# CONFIG_HP100 is not set
CONFIG_NET_PCI=y
CONFIG_PCNET32=y
CONFIG_AMD8111_ETH=y
CONFIG_AMD8111E_NAPI=y
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_DGRS is not set
# CONFIG_EEPRO100 is not set
# CONFIG_E100 is not set
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
CONFIG_8139TOO=y
CONFIG_8139TOO_PIO=y
CONFIG_8139TOO_TUNE_TWISTER=y
CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_VIA_VELOCITY is not set

#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_E1000 is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_R8169 is not set
# CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set

#
# Ethernet (10000 Mbit)
#
# CONFIG_IXGB is not set
# CONFIG_S2IO is not set

#
# Token Ring devices
#
# CONFIG_TR is not set

#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set

#
# Wan interfaces
#
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
CONFIG_PLIP=y
CONFIG_PPP=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_BSDCOMP=y
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set

#
# ISDN subsystem
#
# CONFIG_ISDN is not set

#
# Telephony Support
#
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set

#
# Input I/O drivers
#
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set
# CONFIG_SERIO_PCIPS2 is not set
# CONFIG_SERIO_RAW is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
# CONFIG_DIGIEPCA is not set
# CONFIG_DIGI is not set
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set
# CONFIG_SX is not set
# CONFIG_RIO is not set
# CONFIG_STALDRV is not set

#
# Serial drivers
#
# CONFIG_SERIAL_8250 is not set

#
# Non-8250 serial port support
#
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_PRINTER is not set
# CONFIG_PPDEV is not set
# CONFIG_TIPAR is not set

#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set

#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
CONFIG_HW_RANDOM=y
CONFIG_NVRAM=y
CONFIG_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set

#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
# CONFIG_FT_NORMAL_DEBUG is not set
# CONFIG_FT_FULL_DEBUG is not set
# CONFIG_FT_NO_TRACE is not set
# CONFIG_FT_NO_TRACE_AT_ALL is not set
# CONFIG_FT_STD_FDC is not set
# CONFIG_FT_MACH2 is not set
# CONFIG_FT_PROBE_FC10 is not set
# CONFIG_FT_ALT_FDC is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
# CONFIG_DRM_I830 is not set
# CONFIG_DRM_I915 is not set
# CONFIG_MWAVE is not set
# CONFIG_RAW_DRIVER is not set
# CONFIG_HANGCHECK_TIMER is not set

#
# I2C support
#
CONFIG_I2C=y
# CONFIG_I2C_CHARDEV is not set

#
# I2C Algorithms
#
CONFIG_I2C_ALGOBIT=y
# CONFIG_I2C_ALGOPCF is not set
# CONFIG_I2C_ALGOPCA is not set

#
# I2C Hardware Bus support
#
# CONFIG_I2C_PARPORT is not set
# CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_SCx200_ACB is not set
# CONFIG_I2C_PCA_ISA is not set

#
# Hardware Sensors Chip support
#
# CONFIG_I2C_SENSOR is not set
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM90 is not set

#
# Other I2C Chip support
#
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set

#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set

#
# Misc devices
#

#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set

#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set

#
# Graphics support
#
# CONFIG_FB is not set
CONFIG_VIDEO_SELECT=y

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_DUMMY_CONSOLE=y

#
# Sound
#
# CONFIG_SOUND is not set

#
# USB support
#
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set

#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y

#
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_UHCI_HCD=y

#
# USB Device Class drivers
#
# CONFIG_USB_BLUETOOTH_TTY is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_FREECOM is not set
CONFIG_USB_STORAGE_ISD200=y
# CONFIG_USB_STORAGE_DPCM is not set

#
# USB Human Interface Devices (HID)
#
# CONFIG_USB_HID is not set

#
# USB HID Boot Protocol drivers
#
CONFIG_USB_KBD=y
CONFIG_USB_MOUSE=y
# CONFIG_USB_AIPTEK is not set
# CONFIG_USB_WACOM is not set
# CONFIG_USB_KBTAB is not set
# CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set
# CONFIG_USB_EGALAX is not set
# CONFIG_USB_XPAD is not set
# CONFIG_USB_ATI_REMOTE is not set

#
# USB Imaging devices
#
# CONFIG_USB_MICROTEK is not set

#
# USB Multimedia devices
#
# CONFIG_USB_DABUSB is not set

#
# Video4Linux support is needed for USB Multimedia device support
#

#
# USB Network adaptors
#
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_USBNET is not set

#
# USB port drivers
#
# CONFIG_USB_USS720 is not set

#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set

#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_TIGL is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGETSERVO is not set

#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set

#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y
# CONFIG_XFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y

#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set

#
# DOS/FAT/NT Filesystems
#
# CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_NTFS_FS is not set

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y

#
# Miscellaneous filesystems
#
# CONFIG_HFSPLUS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set

#
# Network File Systems
#
# CONFIG_NFS_FS is not set
# CONFIG_NFSD is not set
# CONFIG_EXPORTFS is not set
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set

#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y

#
# Native Language Support
#
# CONFIG_NLS is not set

#
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
# CONFIG_FRAME_POINTER is not set
# CONFIG_EARLY_PRINTK is not set
# CONFIG_4KSTACKS is not set
CONFIG_X86_FIND_SMP_CONFIG=y
CONFIG_X86_MPPARSE=y

#
# Security options
#
# CONFIG_SECURITY is not set

#
# Cryptographic options
#
CONFIG_CRYPTO=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_MD4=y
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
# CONFIG_CRYPTO_WP512 is not set
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_BLOWFISH=y
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_SERPENT=y
# CONFIG_CRYPTO_AES_586 is not set
CONFIG_CRYPTO_CAST5=y
CONFIG_CRYPTO_CAST6=y
# CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_ARC4=y
# CONFIG_CRYPTO_KHAZAD is not set
CONFIG_CRYPTO_DEFLATE=y
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
CONFIG_CRYPTO_TEST=y

#
# Library routines
#
CONFIG_CRC_CCITT=y
CONFIG_CRC32=y
CONFIG_LIBCRC32C=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_X86_BIOS_REBOOT=y
发表于 2005-1-27 22:49:24 | 显示全部楼层
不错。
谢谢楼主!
回复 支持 反对

使用道具 举报

发表于 2005-1-28 15:43:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2005-2-3 09:28:13 | 显示全部楼层
搂主的想法和我不谋而合
回复 支持 反对

使用道具 举报

发表于 2005-2-13 23:02:22 | 显示全部楼层
很久前.象在那见过类同的文章.题目不同.
回复 支持 反对

使用道具 举报

发表于 2005-2-17 12:42:18 | 显示全部楼层
Post by ServerOnly
恐怕这个更好 http://sunsmart.8866.org/doc/buildMin/buildMin.html


这个连接怎么无效? 连http://sunsmart.8866.org都打不开
回复 支持 反对

使用道具 举报

发表于 2005-2-18 15:45:26 | 显示全部楼层
看来我得按照这种方法来试一试才行
回复 支持 反对

使用道具 举报

发表于 2005-11-10 10:25:01 | 显示全部楼层
Post by benu
这个连接怎么无效? 连http://sunsmart.8866.org都打不开

是呀,打不开。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表