分类: LINUX
2006-07-30 22:26:25
由于操作系统的内核贴近硬件,需要对计算机的体系结构有所了解,例如CPU的工作原理、接口特性和BIOS调用等。读者千万别因为这些望而却步,这里将介绍Linux内核源码必备的配置,------linux2.4.X内核的功能十分强大,在他的基础上能开发许多很有高科技的产品.
如:硬件防火墙,硬件路由器.硬件交换机,硬件web服务器,硬件VPN,.....硬件设备.他们运行的平台大都是unix或linux.不过不同硬件
设备它们的linux选项配置内核不一样.在linux内核选项的基础上加一些专用的程序写在欣片上.
好了,大多硬件都是这样实现的......,当然,科技的东西需要技术,.........下面我们就配置一下.
一: 首先,我们来认识一下linux的源码,
#cd /usr/src/ (linux源码的位置,里面有几个文件可以用下一命令 )
# ls -al (你可以看到一个联接文件,linux-2.4.X.这时linux系统原文件的联接文件)
# cd linux-2.4.X (进入linux系统的联接文件)
在原文见中有一下目录: abi COPYING Documentation include kernel
Makefile README scripts
arch CREDITS drivers init
lib mm REPORTING-BUGS configs crypto fs
ipc MAINTAINERS net Rules.make
下面我们来分析他的代码结构(这里是以linux-2.4.x为历):
arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。
init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
ipc目录包含了核心进程间的通信代码。
modules目录存放了已建好的、可动态加载的模块。
fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
scripts目录包含用于配置核心的脚本文件。
documentation目录下是一些文档,是对每个目录作用的具体说明。
一般情况下每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。 -----不过他们的说明都是英文,没关系多看几边就OK!实际上这是一个反复的过程,不可能读一遍就理解。---在Window下也有一适合Linux内核阅读的工具称作Source Insight(可从下载)。我没有
用过因为我一直用的是linux.
好了linux的原代码就简单的分析的哲理:--下面我们进入的kernel!!! kernel的下载网站:ftp://ftp.kernel.org/pub/linux/kernel 如果没有错的话你就可以linux kernel许多不通的版本,这里我们用linux-2.4.x为例.
二(a):编译Kernel
把linux-2.4.10.tar.gz下载放到 /tmp下
#cd /tmp -zxvf linux-2.4.10.tar.gz (释放 tar 包)
#cd /linux-2.4.10 (如果没有的话释放后就是这个)
# make xconfig (make config 也可以) make xconfig 是图形界灭
(这时你看到的是linux下的内核选项,一切linux的选项都在这里-----\\所有linux系统的内核它用到的功能都不外乎这些
下面这些我不可能都一一说明,但防火墙能用到的都会作解释)
1. Code maturity level options
代码成熟等级。此处只有一项:prompt for development and/or incomplete code/drivers,
如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必须把该项选择为Y了;
否则可以把它选择为N。
2. Loadable module support
对模块的支持。这里面有三项:
Enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。
Set version inFORMation on all module symbols:可以不选它。
Kernel module loader:让内核在启动时有自己装入必需模块的能力,一定选上。
3. Processor type and features
CPU类型。内容蛮多的,不一一介绍了,有关的几个如下:
Processor family:根据你自己的情况选择CPU类型如:386,486 。
High Memory Support:大容量内存的支持。可以支持到4G、64G,一般可以不选,可以(off)默认。
Math emulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。
MTTR support:MTTR支持。可不选。
Symmetric multi-processing support:对称多处理支持。除非你富到有多个CPU,否则就不用选了。
4. General setup
这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。下面介绍一下经常使用的一些选项:
Networking support:网络支持。必须,没有网卡也建议你选上。
PCI support:PCI支持。如果使用了PCI的卡,当然必选。
PCI access mode:PCI存取模式。可供选择的有BIOS、Direct和Any,选Any吧。
Support for hot-pluggabel devices:热插拔设备支持。支持的不是太好,可不选。
PCMCIA/CardBus support:PCMCIA/CardBus支持。有PCMCIA就必选了。
System V IPC
BSD Process Accounting
Sysctl support:以上三项是有关进程处理/IPC调用的,主要就是System V和BSD两种风格。如果你不是使用BSD,就按照缺省吧。
Power Management support:电源管理支持。
Advanced Power Management BIOS support:高级电源管理BIOS支持。
Kernel support for Linux/Intel ELF binaries 必选:yes 补选肯可能会使多的程序无法执行.
5. Memory Technology Devic(MTD)
MTD设备支持。可不选,有几个也要选。
Normal PC flopp disk supper -----PC 软盘的支持.
Loopback devic suppor 可选:yes
RAM disk supper 在制作软盘启动是用到,选上
6. Parallel port support
并口支持。如果不打算使用串口,根据需要。
7. Plug and Play configuration
即插即用支持。虽然linux对即插即用目前支持的不如Windows好,但是还是选上吧,这样你可以拔下鼠标之类的体验一下Linux下即插即用的感觉。
8. Block devices
块设备支持。这个就得针对自己的情况来选了,简单说明一下吧:
Normal PC floppy disk support:普通PC软盘支持。这个应该必选。
XT hard disk support:
Compaq SMART2 support:
Mulex DAC960/DAC1100 PCI RAID Controller support:RAID镜像用的。
Loopback device support:
Network block device support:网络块设备支持。如果想访问网上邻居的东西,就选上。
Logical volume manager(LVM)support:逻辑卷管理支持。
Multiple devices driver support:多设备驱动支持。
RAM disk support:RAM盘支持。
9. Networking options
网络选项。这里配置的是网络协议。内容太多,一一介绍了,自己看吧,如果你对网络协议有所了解的话,应该可以看懂的。如果懒得看,使用缺省选项(肯定要选中TCP/IP networking哦)就可以了。让我们看看,TCP/IP、ATM、IPX、DECnet、Appletalk……支持的协议好多哦,IPv6也支持了,Qos and/or fair queueing(服务质量公平调度)也支持了,还有kHTTPd,不过这些都还在实验阶段。
你需要“Packet Socket”选项来与网卡进行通信而不需要在内核中实现网络协议
<*>Netlink deice emulation
<*>Network packet filtering()
<*>Network packet filtering()
<*>Network packet filtering debugging
<*>Socket Filtering
<*>Unix domain sockers UNIX domain sokers
<*>TCP/IP networking
[*] TCP/IP networking #选中并对其子项netfilter configration进行配制。
IP: Netfilter Configuration
[*] MAC address match support #mac地址匹配
[*] Packet type match support #数据包类型匹配
[*] netfilter MARK match support
[*] Multiple port match support #多端口匹配
[*] TOS match support #服务类型
[*] recent match support
[*] ECN match support
[*] DSCP match support
[*] AH/ESP match support
[*] LENGTH match support #数据包长度匹配
[*] TTL match support #生存时间支持
[*] tcpmss match support
[*] Helper match support
[*] Connection state match support #连接状态支持
[*] Connections/IP limit match support
[*] Connection tracking match support #连接跟踪去持
[*] Packet filtering
[*] REJECT target support
[*] Full NAT
[*] MASQUERADE target support #地址伪装支持
[*] REDIRECT target support
[*] NAT of local connections (READ HELP)
[*] Packet mangling
[*] TOS target support
[*] ECN target support
[*] DSCP target support
[*] MARK target support
[*] LOG target support #日志支持
[*] ULOG target support
[*] TCPMSS target support
[*] ARP tables support
[*] ARP packet filtering
[*] ARP payload mangling
[*] Network packet filtering (replaces ipchains) #选中它,tcp/ip networking选项中会增加一项我们需要的 子选项netfilter configruration
如果想要使netfilter支持更多功能的话,如对并发IP联接的限制。我们还需要去下载patch-o-matic包对内核升级.netfilter官方网站在不断推出特殊功能的升级包。
/18. ISDN subsystem
如果使用ISDN上网,这个就必不可少
10. Telephony Support
电话支持。linux下可以支持电话卡,这样你就可以在IP上使用普通的电话提供语音服务了。记住,电话卡可和modem没有任何关系哦。
我打字慢有的就打前俩个字....你知道就OK!
11. ATA/IDE/MFM/RLL suppor
Enhanced IDE/MFM/RLL --disk ---/floopy....这个必选:yes
<*>include IDE/ATA-2 DISK support 必选:yes
<*>Use multi-mode by default 必选:yes
<*>PCI IDE chipset support 必选:yes
<*>Generic PCI IDE chipset support 必选:yes
<*>Sharing IDE IDE insterrupts support 必选:yes
<*>Generic PCI bus-mase DMA support 必选:yes
<*>RZ1000 chipset bugfix/support 必选:yes
这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,如果你使用了比较特殊的设备,比如PCMCIA等,就到里面自己找相应的选项吧。
12. SCSI support
SCSI设备的支持。我没有SCSI的设备,所以根本就不用选,如果你用了SCSI的硬盘/光驱/磁带等设备,自己找好了。
13. Fusion MPT device support
需要Fusion MPT兼容PCI适配器,不用选。
14. I2O device support
需要I2O接口适配器支持,在智能Input/Output(I2O)体系接口中使用。
15. Network device support
网络设备支持。上面选好协议了,现在该选设备了,可想而知,内容肯定多得很。根据需要,我在网上看到别人在里面大概分类了:
有ARCnet设备、Ethernet(10 or 100 Mbit)、Ethernet(1000Mbit)、
Wireless LAN(non-hamradio)、Token Ring device、Wan interfaces、
PCMCIA network device support几大类。
我用的是10/100M的以太网,看来只需要选则这个了。还是10/100M的以太网设备熟悉,内容虽然多,一眼就可以看到我所用的RealTeck RTL-8139 PCI Fast Ethernet Adapter support,为了免得麻烦,编译到内核里面好了,不选M了,选Y。耐心点,一般说来你都能找到自己用的网卡。如果没有,你只好自己到厂商那里去要驱动了。
<*>Dummy net driver supper
<*>Ether (10 or 100M bit)
<*>PCI NE2000 and clones suppert
16. Amateur Radio support
配置业余无线广播。
17. IrDA(infrared)support
红外线支持。
18. ISDN subsystem
如果你使用ISDN上网,这个就必不可少了。
19. Old CD-ROM drivers(not SCSI、not IDE)
做的可真周到,原来那些非SCSI/IDE口的光驱谁还在用啊,自己选吧,用IDE的CD-ROM不用选。
20. Character devices
字符设备。这个内容又太多了:
[*] Virtual terminal 允许在XWindow中打开xterm和使用字符界面登录,在一个物理终端上打
开几个虚拟终端 , 打开这个选项。
[*] Support for console on virtual terminal 告诉内核将诸如模块错误、内核错误启动信息之类的警告信息发送到什么地方, 在字符界面 下,这些信息通常被发送到第一个虚拟终端(Virtual Terminal)(CTRL+ALT+F1)。 打开这个选项
[*] Standard/generic (8250/16550)and compatible UARTs)serial suppor
[*] Unix98 PTY support 如果你想使用远程使用自己机器上的xterm,比如通过telnet或者ssh,你必须打开“unix98 PTY support”选项
I2C support:I2C是Philips极力推动的微控制应用中使用的低速串行总线协议。如果你要选择下面的Video For linux,该项必选。
Mice:鼠标。现在可以支持总线、串口、PS/2、C&T 82C710 mouse port、PC110 digitizer pad,自己根据需要选择。
[*]ps/2 mouse suppor
Joysticks:手柄。即使在linux下把手柄驱动起来意义也不是太大,游戏太少了。
Watchdog Cards:虽然称为Cards,这个可以用纯软件来实现,当然也有硬件的。如果你把这个选中,那么就会在你的/dev下创建一个名为watchdog的文件,它可以记录你的系统的运行情况,一直到系统重新启动的1分钟左右。有了这个文件,你就可以恢复系统到重启前的状态了。
Video For linux:支持有关的音频/视频卡。
Ftape, the floppy tape device driver:
PCMCIA character device support:
21. File systems
文件系统。内容又太多了,老法子,在缺省选项的基础上进行修改。介绍以下几项:
Quota support:Quota可以限制每个用户可以使用的硬盘空间的上限,在多用户共同使用一台主机的情况中十分有效。(防火墙没有必要)
DOS FAT fs support:DOS FAT文件格式的支持,可以支持FAT16、FAT32。
ISO 9660 CD-ROM file system support:光盘使用的就是ISO 9660的文件格式。
(防火墙没有必要)
NTFS file system support:ntfs是NT使用的文件格式。
dev/pts 文件系统。
ext2 编译好的内核要放在ext2文件系统上
[*] /proc file system support:必选
[*] dev/pts file system for Unix98 PTYs
[*]QNX4 file sustem support
[*]ROM file system support
[*]Second extended fs support
/proc文件系统是linux提供给用户和系统进行交互的通道,建议选上,否则有些功能没法正确执行。
还有另外三个大类都归到这儿了:Network File Systems(网络文件系统)、Partition Types(分区类型)、Native Language Support(本地语言支持)。值得一提的是Network File Systems里面的两种:NFS和SMB分别是linux和Windows相互以网络邻居的形式访问对方所使用的文件系统,根据需要加以选择。
22. Console drivers
控制台驱动。一般使用VGA text console就可以了,标准的80*25的文本控制台。
23. Sound
声卡驱动。如果你能在列表中找到声卡驱动那自然最好,否则就试试OSS了。
24. USB supprot
USB支持。很多USB设备,比如鼠标、调制解调器、打印机、扫描仪等,在linux都可以得到支持,根据需要自行选择。
25. Kernel hacking
配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个功能
二(b):#make dep
#make
#make bzImage
这三个命令执行完后进入
#cd /tmp/linux-2.4.10/arch/i386/boot/ (有一个bzImage,他就是系统的内核)
OK! 我们已经完成了内核的生成-----如果煤油问题,bzImage是没有问题的.
# monut /dev/hdc1 /mnt (我们用的是IDE硬盘)
#mke2fs /dev/hdc1
三(a): 我们现在写系统的配制文件,启动文件,和其他文件.
系统必须包括支持完整Linux系统的全部东西,因此,它至少应包括以下几项:
• 基本文件系统结构
• 至少含有以下目录:/dev-- 设备, /proc-- proc 文件系统所需目录, /bin--基本程序运行所需的库函数, /etc---系统配置文件, /lib --共享函数库 ,/sbin ---重要的系统程序, /usr --附加应用程序, /tmp--临时文件,/mnt---装载其他磁盘节点 /home--家目录,..
• 最基本的应用程序,如sh, ls, cp, mv等
• 最低限度的配置文件,如rc, inittab, fstab等
• 设备:/dev/hd*, /dev/tty*, /dev/fd0
其中/proc,/mnt和/usr在此情况下都是空的,只需要用mkdir创建它们既可。其余的目录应根据需要分别创建,下面我一个一个的详细叙述。
OK!,接下来我们作busybox,不要问我为什么----反正要作,我开始也是这样作的.
三(b): 从网上下载: 下在到/tmp/ (busybox-1.1.0.tar.gz)
#cd /tmp
#tar -zxvf busybox-1.1.0.tar.gz
#cd busybox-1.1.0
主意:(1) 译的时候要静态编译,修改 Makefile 中的 DOSTATIC 参数,从false 改为 true,这样,编译出来的代码就不要依赖glibc了。
(2) 因为我们用的是 BusyBox 上的 init,与一般所使用的 init 不太一样,会先执行 /etc/init.d/rcS 而非 /etc/rc.d/rc.sysinit,为了做出来的 FloppyLinux 架构与 Redhat 的架构一样,所以修改了 BusyBox 中的 init.c底下是修到的部分内容∶
#ifndef INIT_SCRIPT
#define INIT_SRCIPT "/etc/rc.d/rc.sysinit"
#endif
)OK!
#make menuconfig <开始配置>
busybox也有很多选项,这里介绍一些注意点。
1. General Configuration
[*] Support for SUID/SGID handling
没有被授权的用户需要完成某项任务。一个例子是passwd程序,它允许用户改变口令,这就要求改变/etc/passwd文件的口令域。然而系统管理员决不允许普通用户拥有直接改变这个文件的权利。SUID的程序在运行时,将有效用户ID改变为该程序的所有者ID,使得进程在很大程度上拥有了该程序的所有者的特权。如果被设置为SUID root,那么这个进程将拥有超级用户的特权,当进程结束时,又恢复为原来的状态(解决了上述矛盾)。选中此项。
[*] Runtime SUID/SGID configuration via /etc/busybox.conf suid的配制文件 必需选
2. Build Options
[*] Build BusyBox as a static binary (no shared libs) (必需选)
说明:我们的系统只支持这重方式
建立程式的最后一个步骤便是连结;也就是将所有分散的小程式(pieces)组合起来,看看是否遗漏了些什么.很明显的,有一些事情是很多程式都会想做的---例如,打开文件(open files),接著所有与打开文件有关的小程序(pieces)就会以程序库的方式提供给你的程序.
当你用的是一静态的程序库时,连接器会找出程序所需的(bits),然后实际(physically)将它们拷贝到执行文件内.然而,对共享程序库而言,就不是这样了.共享程序库会在执行文件内留下一个符号(note),指明*当程序执行时,首先必须载入这个程式库
3. Login/Password Management Utilities
这一部分在很早以前的busybox版本是不提供的,可以使我们完成用户认证等功能。
[*] Use internal password and group functions rather than system functions 使用busybox自已的函数代替系统的函数。
4. Networking Utilities
[*]ip 网络地址 必需选
[*]telnetd 提供telnet服务的话,请选中他 必需选
[ ] udhcp Server/Client
5. System Logging Utilities 系统日志工具
6,其他的都是命令,根基需要用.
OK!
#make dep
#make
#make PREFIX=/mnt(目录) install (安装你要的目录)
OK! busybox的配置完成,
在 /mnt 下
#cp /rmp/buybox-1.1.0/_install/* /mnt (_install下有:bin,sbin,usr,目录和一个联接文件).
# cd /mnt
#mkdir boot dev etc proc var tmp mnt
#chmod 755 bin dev etc var tmp mnt
#chmod 555 proc
# cp /tmp/linux-2.4.10/Systrm.map .
#cd dev
#cp /dev/null .
#cp /dev/console .
#cp /dev/tty* .
#cp /dev/hd* .
#cp /dev/fd0 .
#cd boot
#mkdir grub
# cp /boot/grub/ stage1 stage2 grub.cong /mnt/boot/grub
ok ! /mnt 有(boot ,bin ,sbin usr, dev, etc, tmp,mnt,var,proc)目录
#cd etc
#touch inittab busybox.conf passwd shadow fstab group gshadow
#mkdir rc.d
#cd rc.d
# touch rc.sysinit network iptablesrules (iptables)
Ok! 现在我们些它的引导文件 (系统的架构已经架起)
在/mnt/etc/inittab中写:
#cd /mnt/etc
#vi inittab
写:
::sysinit:/etc/rc.d/rc.sysinit
tty1::respawn:/sbin/getty 9600 tty1
tty2::respawn:/sbin/getty 9600 tty2
#vi busybox
[SUID]
su = sx- root.500
#vi passwd
root::0:0:root:/:/bin/sh
test::501:500:Linux User,,,:/home/test:/bin/sh
#vi shadow
root::::::::
test:/Ir/:12423:0:99999:7:::
#vi group
root:x:0:test
test:x:500:
#vi gshadow
test:!::
#cd rc.d
#vi rc.sysinit
#!/bin/sh
/bin/mount /proc /proc -t proc
#挂载进程文件系统,给我们提供和内核交互的空间
/bin/mount none /dev/pts -t devpts
# 挂载devpts文件系统,使可以从telnet登陆
#set hostname
/bin/hostname LinuxRouter-1.2 #设置主机名
/etc/rc.d/netconfig #开启网络功能
/usr/sbin/telnetd #打开tlentd 守护进程
/usr/sbin/iptblesrules #开启网络规则
e. netconfig
#!/bin/sh
/sbin/ifconfig lo 127.0.0.1 netmask 255.255.255.0
/sbin/ifconfig eth0 159.226.139.5 netmask 255.255.255.192 up
ok! 一个简单的小系统作成了,下面我们可以在/mnt/etc/rc.d/iptablesrles 些策略了.你也可以在上面装iptables了?
下载:ftp://ftp.netfilter.org (软件包:iptables-1.2.8.tar.gz)
对了在/mnt/boot/grub/中 该grub.cong 的路径....(必需写正确)
#cd /
#grub
# root (hd1,0)
# setup (hd1,0)
#quit