2006年10月31日

请把我在你们叶子上的连接修改为http://www.gfrog.cn

对此给您带来的不便,我深表歉意.

顺路说,无意中路过这里的朋友们,从各种叶子跳到这里的朋友们,以及各种不认识我的朋友们,

请在你们的收藏夹里添加上http://www.gfrog.cn,或者在你的叶子上加上http://www.gfrog.cn,

顺便到http://www.gfrog.cn 这里踩个脚印,告诉青蛙有一个人来过青蛙的池塘吧,谢谢大家.

2006年09月29日

http://www.gfrog.cn/

特此公告,欢迎访问.

2005年10月01日



打开电源启动机器几乎是电脑爱好者每天必做的事情,面对屏幕上出现的一幅幅启动画面
,我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢
?相信有的朋友还不是很清楚,本文就来介绍一下从打开电源到出现Windows的蓝天白云时
,计算机到底都干了些什么事情。


首先让我们来了解一些基本概念。第一个是大家非常熟悉的BIOS(基本输入输出系统)
,BIOS是直接与硬件打交道的底层代码,它为操作系统提供了控制硬件设备的基本功能。
BIOS包括有系统BIOS(即常说的主板BIOS)、显卡BIOS和其它设备(例如IDE控制器、SCS
I卡或网卡等)的BIOS,其中系统BIOS是本文要讨论的主角,因为计算机的启动过程正是在
它的控制下进行的。BIOS一般被存放在ROM(只读存储芯片)之中,即使在关机或掉电以后,
这些代码也不会消失。

  第二个基本概念是内存的地址,我们的机器中一般安装有32MB、64MB或128MB内存,这
些内存的每一个字节都被赋予了一个地址,以便CPU访问内存。32MB的地址范围用十六进制
数表示就是0~1FFFFFFH,其中0~FFFFFH的低端1MB内存非常特殊,因为最初的8086处理器
能够访问的内存最大只有1MB,这1MB的低端640KB被称为基本内存,而A0000H~BFFFFH要保
留给显示卡的显存使用,C0000H~FFFFFH则被保留给BIOS使用,其中系统BIOS一般占用了
最后的64KB或更多一点的空间,显卡BIOS一般在C0000H~C7FFFH处,IDE控制器的BIOS在C
8000H~CBFFFH处。

  第一步: 当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不
太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU内部自动
恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已经开始稳定供电
了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按
下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号)
,CPU马上就从地址FFFF0H处开始执行指令,从前面的介绍可知,这个地址实际上在系统B
IOS的地址范围内,无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到
系统BIOS中真正的启动代码处。

  第二步: 系统BIOS的启动代码首先要做的事情就是进行POST(Power-On Self Test
,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作,
例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初始化,如果
系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(
此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的
长短和次数代表了错误的类型。在正常情况下,POST过程进行得非常快,我们几乎无法感
觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。

  第三步: 接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的
起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代
码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化信息,介绍
生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其
它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备


  第四步: 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其
中包括有系统BIOS的类型、序列号和版本号等内容。

 第五步: 接着系统BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,
并同时在屏幕上显示内存测试的进度,我们可以在CMOS设置中自行决定使用简单耗时少或
者详细耗时多的测试方式。

  第六步: 内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,
包括硬盘、CD-ROM、串口、并口、软驱等设备,另外绝大多数较新版本的系统BIOS在这一
过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。

  第七步: 标准设备检测完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配
置系统中安装的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备
的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。

  第八步: 到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏
并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及
它们使用的资源和一些相关工作参数。

  第九步: 接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展
系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数
据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数据只在系
统硬件配置发生改变后才会更新,所以不是每次启动机器时我们都能够看到"Update ESC
D… Success"这样的信息,不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windo
ws 9x不相氖莞袷剑谑荳indows 9x在它自己的启动过程中会把ESCD数据修改成自己
的格式,但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数
据格式改回来,如此循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这
就是为什么有些机器在每次启动时都会显示出相关信息的原因。

  第十步: ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用
户指定的启动顺序从软盘、硬盘或光驱启动。以从C盘启动为例,系统BIOS将读取并执行硬
盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读取并执行这
个活动分区的分区引导记录,而分区引导记录将负责读取并执行IO.SYS,这是DOS和Windo
ws 9x最基本的系统文件。Windows 9x的IO.SYS首先要初始化一些重要的系统数据,然后就
显示出我们熟悉的蓝天白云,在这幅画面之下,Windows将继续进行DOS部分和GUI(图形用
户界面)部分的引导和初始化工作。

  如果系统之中安装有引导多种操作系统的工具软件,通常主引导记录将被替换成该软
件的引导代码,这些代码将允许用户选择一种操作系统,然后读取并执行该操作系统的基
本引导代码(DOS和Windows的基本引导代码就是分区引导记录)。   

  上面介绍的便是计算机在打开电源开关(或按Reset键)进行冷启动时所要完成的各种
初始化工作,如果我们在DOS下按Ctrl+Alt+Del组合键(或从Windows中选择重新启动计
算机)来进行热启动,那么POST过程将被跳过去,直接从第三步开始,另外第五步的检测
CPU和内存测试也不会再进行。我们可以看到,无论是冷启动还是热启动,系统BIOS都一次
又一次地重复进行着这些我们平时并不太注意的事情,然而正是这些单调的硬件检测步骤
为我们能够正常使用电脑提供了基础。

注意
不要在 n 命令的第二种形式后使用 l 命令。还要注意,如果现在使用 w(写入)命令,Windows 2000 将使用名称 File2.dat 保存正在调试的文件 File1.exe。为避免出现此结果,应该总是在 l 或 w 命令之前立即使用 n 命令的第一种形式。

 

Debug:O(输出)

 


将字节值发送到输出端口。
o port byte-value
参数
port
通过地址指定输出端口。端口地址可以是 16 位值。
byte-value
指定要指向 port 的字节值。
有关从输入端口读取字节值的信息,请参看Debug I(输入)。
范例
要将字节值 4Fh 发送到地址为 2F8h 的输出端口,请键入以下命令:
o2f8 4f

Debug:P(执行)

执行循环、重复的字符串指令、软件中断或子例程;或通过任何其他指令跟踪。
p [= address] [number]
参数
=address
指定第一个要执行指令的位置。如果不指定地址,则默认地址是在 CS:IP 寄存器中指定的当前地址。
number
指定在将控制返回给 Debug 之前要执行的指令数。默认值为 1。
有关运行当前在内存中程序的信息,请参看Debug G(转向)。
有关执行指令的信息,请参看Debug T(跟踪)。
说明
控制传送到要测试的程序
当 p 命令将控制从 Debug 传送到要测试的程序时,该程序不间断运行,直到循环、重复字符串指令、软件中断或者完成了指定地址的子例程为止,或者直到执行了指定数量的机器指令为止。控制返回到 Debug。
地址参数的限制
如果 address 参数没有指定段,Debug 将使用被测试程序的 CS 寄存器。如果省略 address,程序将从 CS:IP 寄存器所指定的地址开始执行。必须在 address 参数之前使用等号 (=) 以便将它与 number 参数区分。如果在指定地址处的指令不是循环、重复的字符串指令、软件中断或子例程,则 p 命令与 Debug t(跟踪)命令的作用相同。
使用 p 命令显示的邮件
当 p 执行完一段说明后,Debug 显示出程序的寄存器内容、标志的状态以及下一段将要被执行的指令的解码形式。
警告
不能使用 p 命令跟踪只读内存 (ROM)。
范例
假定正在测试的程序在地址 CS:143F 处包含一个 call 指令。要运行 call 目标位置的子程序然后将控制返回到 Debug,请键入以下命令:
p=143f
Debug 按以下格式显示结果:
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2246 ES=2246 SS=2246 CS=2246 IP=1443 NV UP EI PL NZ AC PO NC
2246:1442 7505 JNZ 144A

Debug:Q(退出)

停止 Debug 会话,不保存当前测试的文件。
当您键入 q 以后,控制返回到 DOS 的命令提示符。
q
参数
该命令不带参数。
有关保存文件的信息,请参看Debug W(写入)。

Debug:R(寄存器)

显示或改变一个或多个 CPU 寄存器的内容。
r [register-name]
参数

如果在没有参数的情况下使用,则 r 命令显示所有寄存器的内容以及寄存器存储区域中的标志。
register-name
指定要显示其内容的寄存器名。
有关显示内存部分内容的信息,请参看Debug D(转储)。
有关反汇编字节的信息,请参看Debug U(反汇编)。
说明
使用 r 命令
如果指定了寄存器名称,Windows 2000 将显示以十六进制标记表示的寄存器的 16 位值,并将冒号显示为提示符。如果要更改包含在寄存器中的值,除非键入新值并按 ENTER 键;否则,请按 ENTER 键返回 Debug 提示符。
有效寄存器名
以下是 register-name 的有效值:ax、bx、cx、dx、sp、bp、si、di、ds、es、ss、cs、ip、pc 及 f。ip 和 pc 都引用指令指针。
如果指定寄存器名称,而不是从前面的列表中指定,Windows 2000 将显示以下消息:
br error
使用 f 字符而不是寄存器名
如果键入 f 字符代替寄存器名,Debug 将每个标记的当前设置显示为两字母代码,然后显示 Debug 提示符。要更改标志的设置,请从下表中键入适当的两字母代码:
标志名
设置
清除
溢出
ov
nv
方向
dn(减)
up(增)
中断
ei(启用)
di(禁用)
正负
ng(负)
pl(正)

zr
nz
辅助进位
ac
na
奇偶校验
pe(偶校验)
po(奇校验)
进位
cy
nc
可以按任何顺序键入新的标志值。不需要在这些值之间留出空格。要停止 r 命令,请按 ENTER 键。任何没有指定新值的标志保持不变。
用 r 命令显示的邮件
如果为标记指定了多个值,Debug 将显示以下消息:
df error
如果指定没有在前面的表中列出的标志代码,Debug 将显示以下消息:
bf error
在这两种情况下,Debug 将忽略所有在无效项目之后指定的设置。
Debug 的默认设置
在启动 Debug 时,会将段寄存器设置到空闲内存的低端,指令指针设置为 0100h,清除所有标志,并且将其余寄存器设置为零,除了被设置为 FFEEh 的 sp 之外。

Debug:R

范例
要查看所有寄存器的内容、所有标记的状态和当前位置的指令解码表,请键入以下命令:
r
如果当前位置是 CS:11A,显示外观将类似于以下内容:
AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000
DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC
04BA:011A CD21 INT 21
要只查看标志的状态,请键入以下命令:
rf
Debug 按以下格式显示信息:
NV UP DI NG NZ AC PE NC – _
现在,您可以按任意顺序键入一个或多个有效的标志值,其中可以有或没有空格,如下所示:
nv up di ng nz ac pe nc – pleicy
Debug 结束 r 命令并显示 Debug 提示符。要查看更改,请键入 r 或 rf 命令。Debug 将显示以下内容:
NV UP EI PL NZ AC PE CY – _
按 ENTER 返回到 Debug 提示符。

Debug:S(搜索)

在某个地址范围搜索一个或多个字节值的模式。
s range list
参数
range
指定要搜索范围的开始和结束地址。
list
指定一个或多个字节值的模式,或要搜索的字符串。用空格或逗号分隔每个字节值和下一个字节值。将字符串值包括在引号中。
说明
如果 list 参数包含多个字节值,Debug 将只显示出现字节值的第一个地址。如果 list 只包含一个字节值,Debug 将显示指定范围内出现该值的所有地址。
范例
假定需要查找包含值 41 并且范围从 CS:100 到 CS:110 的所有地址。为此,请键入以下命令:
scs:100 110 41
Debug 按以下格式显示结果:
04BA:0104
04BA:010D
-
以下命令在 CS:100 到 CS:1A0 的范围内搜索字符串"Ph"。
scs:100 1a0 "Ph"

Debug:T(跟踪)

(SORRY,Debug:T部分暂缺,如果哪位网友有此部分,请通知我)
AoGo补充:
从当前段地址开始执行指定的代码数,每执行一次显示所有寄存器(包括标志寄存器)的值。
如:t 10
假设当前在CS:100,那么将从CS:100开始执行10行代码,并且将显示每一行代码执行后寄存器的变化。)

Debug:U(反汇编)

反汇编字节并显示相应的原语句,其中包括地址和字节值。反汇编代码看起来象已汇编文件的列表。
u [range]
参数

如果在没有参数的情况下使用,则 u 命令分解 20h 字节(默认值),从前面 u 命令所显示地址后的第一个地址开始。
range
指定要反汇编代码的起始地址和结束地址,或起始地址和长度。
有关集成记忆码的信息,请参看Debug A(汇编)。
有关显示内存部分内容的信息,请参看Debug D(转储)。
范例
要反汇编 16 (10h) 字节,从地址 04BA:0100 开始,请键入以下命令:
u04ba:100l10
Debug 按以下格式显示结果:
04BA:0100 206472 AND [SI+72],AH
04BA:0103 69 DB 69
04BA:0104 7665 JBE 016B
04BA:0106 207370 AND [BP+DI+70],DH
04BA:0109 65 DB 65
04BA:010A 63 DB 63
04BA:010B 69 DB 69
04BA:010C 66 DB 66
04BA:010D 69 DB 69
04BA:010E 63 DB 63
04BA:010F 61 DB 61
如果只显示从 04BA:0100 到 04BA:0108 特定地址的信息,请键入以下命令:
u04ba:0100 0108
Debug 显示以下内容:
04BA:0100 206472 AND [SI+72],AH
04BA:0103 69 DB 69
04BA:0104 7665 JBE 016B
04BA:0106 207370 AND [BP+DI+70],DH

Debug:W(写入)

AoGo:只对COM有效,因为EXE是带有重定位信息的,而Debug无法产生重定位信息所以无法写入EXE。
将文件或特定分区写入磁盘。
要将在 BX:CX 寄存器中指定字节数的内容写入磁盘文件,请使用以下语法:
w [address]
要略过 Windows 2000 文件系统并直接写入特定的扇区,请使用以下语法:
w address drive start number
参数
address
指定要写到磁盘文件的文件或部分文件的起始内存地址。如果不指定 address,Debug 程序将从 CS:100 开始。
drive
指定包含目标盘的驱动器。该值是数值型:0 = A, 1 = B, 2 = C,等等。
start
指定要写入第一个扇区的十六进制数。
number
指定要写入的扇区数。
有关指定用于 w 命令的文件的信息,请参看Debug N(名称)。
有关将文件或文件扇区内容加载到内存中的信息,请参看Debug L(加载)。
说明
必须在启动 Debug 时或者在最近的 Debug n(名称)命令中指定磁盘文件的名字。这两种方法都可以将地址 CS:5C 处文件控制块的文件名正确地编排格式。
在使用不带参数的 w 命令之前重新设置 BX:CX
如果使用了 Debug g(转向)、t(跟踪)、p(执行)或 r(寄存器)命令,必须在使用无参数的 w 命令之前,将 BX:CX 寄存器复位。
将修改后的文件写入磁盘
如果修改文件但不更改文件名、长度或起始地址,Debug 仍然可以正确地将文件写入源磁盘位置。
w 命令的限制
不能用该命令写入 .exe 或 .hex 文件。
警告
因为略过 Windows 2000 文件句柄,所以写入特定的分区非常危险。如果键入错误的值,则磁盘文件结构很容易被损坏。
范例
假定要将起始地址为 CS:100 的内存内容写入到驱动器 B 的磁盘中。需要将数据从磁盘的逻辑扇区号 37h 开始并持续 2Bh 个扇区。为此,键入以下命令:
wcs:100 1 37 2b
当写操作完成时,Debug 再次显示 Debug 提示符。

Debug:XA(分配扩展内存)

分配扩展内存的指定页面数。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xa [count]
参数
count
指定要分配的扩展内存的 16KB 页数。
有关使用扩展内存的其他 Debug 命令的信息,请参看Debug XD(释放扩展内存)、Debug XM(映射扩展内存页)或 Debug XS(显示扩展内存状态)。
说明
如果指定的页面数可用,则 Debug 将显示消息,此消息表明所创建的句柄的十六进制数;否则,Debug 将显示错误消息。

Debug:XA

范例
要分配扩展内存的 8 个页面,请键入以下命令:
xa8
如果命令成功,Debug 将显示类似的以下消息:
Handle created=0003

Debug:XD(释放扩展内存)

释放指向扩展内存的句柄。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xd [handle]
参数
handle
指定要释放的句柄。
有关使用扩展内存的其他 Debug 命令的信息,请参看Debug XA(分配扩展内存)、Debug XM(映射扩展内存页) 或 Debug XS(显示扩展内存状态)。
范例
要释放句柄 0003,请键入以下命令:
xd 0003
如果命令成功,Debug 将显示下列消息:
Hdle 0003 deallocated

Debug:XM(映射扩展内存页)

将属于指定句柄的扩展内存逻辑页映射到扩展内存的物理页。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xm [lpage] [ppage] [handle]
参数
lpage
指定要映射到物理页 ppage 的扩展内存的逻辑页面号。
ppage
指定将 lpage 映射到的物理页面号。
handle
指定句柄。
有关使用扩展内存的其他 Debug 命令的信息,请参看Debug XA(分配扩展内存)、Debug XD(释放扩展内存)或 Debug XS(显示扩展内存)。
范例
要将句柄 0003 的逻辑页 5 映射到物理页 2,请键入以下命令:
xm 5 2 0003
如果命令成功,Debug 将显示下列消息:
Logical page 05 mapped to physical page 02

Debug:XS(显示扩展内存状态)

显示有关扩展内存状态的信息。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xs
参数
该命令不带参数。
有关使用扩展内存的其他 Debug 命令的信息,请参看Debug XA(分配扩展内存)、Debug XD(释放扩展内存)或Debug XM(映射扩展内存页)。
说明
Debug 显示的信息有如下格式:
Handle xx has xx pages allocated
Physical page xx = Frame segment xx
xx of a total xx EMS pages have been allocated
xx of a total xx EMS handles have been allocated
范例
要显示扩展内存信息,请键入以下命令:
xs
Debug 显示与以下类似的信息:
Handle 0000 has 0000 pages allocated
Handle 0001 has 0002 pages allocated
Physical page 00 = Frame segment C000
Physical page 01 = Frame segment C400
Physical page 02 = Frame segment C800
Physical page 03 = Frame segment CC00
2 of a total 80 EMS pages have been allocated
2 of a total FF EMS handles have been allocated

汪伦伟xc_wangwei@163.com
国防科技大学博士研究生
2005 年 3 月

本文阐述如何以一个现有的 RedHat Linux系统安装盘为蓝本,定制符合需要的 Linux 系统安装盘。





1 引言
通常由于某种实际应用,需要一个包含所有最近更新的RPM包的操作系统发布盘,以备在安装时一次完成所有的更新操作,或者是想定制一个有自己特色的操作系统发布盘,如将自己开发的应用程序通过创建RPM包,加入到操作系统中,在系统安装时一次完成,形成包含自己产品的操作系统发布盘。这些都需要重新生成安装盘,而且生成安装盘也是十分必要的,因为操作系统发布商在每一次正式发布后,总会对一些漏洞进行更新处理,有些还是与安全相关的,在重新生成安装盘时就可以将这些bug修复添加进你自己定制的安装盘中,对一些设备新开发的驱动程序提供支持也需要重新生成安装盘。

在一些嵌入式具体应用中,由于其对操作系统的要求较具体,不需要当前操作系统安装盘中自带的那么多的功能,如Fedora Core 2当前有4张安装盘,它包含了许多其它的应用,如office、娱乐和游戏等等,而一些具体的应用根本不需要这么多的功能,因此,它们常常需要基于一个版本的操作系统,然后对之进行相应的裁减,使之能满足具体应用的实际需要,而不需要其它的多余的功能。因此,通过操作系统安装盘的定制,可以根据自己或实际的需要,选择有用的软件包,组成安装盘,从而通过定制操作系统的安装,满足具体应用的需要。

我们在定制操作系统安装盘之前,必须有一个蓝本作为安装盘的基础,比如是Red Hat 9.0安装盘或Fedora Core 2安装盘,也可以是Red Hat 9.0或Fedora Core 2安装盘的iso文件,这些我们可以从Red Hat的网站或其它一些网站上下载。现假设我们已经有了Fedora Core 2的安装盘,下面我们先大略看一下Fedora Core 2的安装盘里面的内容。

在安装盘中有一个目录为Fedora,它包含了发布盘的核心内容,如下:




drwxr-xr-x 2 root root 2048 May 13 2004 base
drwxr-xr-x 2 root root 77824 May 13 2004 RPMS

RPMS目录包含Fedora Core 2发布盘的主要部分,它是一些RPM文件。RPM包通常包含二进制可执行文件、有关的配置文件和文档,我们可以参考RPM帮助以获得更多信息。

base 目录中包含一些在安装过程中所需要的文件,如comps.xml文件,它定义哪个组件包含哪些RPM包以及RPM包之间的依赖关系,需要注意的是,在 comps.xml文件中表示哪个组件有哪些RPM包采用的是RPM包名,而不是包的文件名。比如perl-5.8.3-18.i386.rpm这个文件名,在comps.xml中所表示的RPM包名为perl。对于comps.xml文件,我们会在后面作进一步解释。另一个重要的文件是hdlist文件,它包含了RPM目录中的所有RPM包大部分的头文件,这意味着在RPM包中相互依赖关系可以通过读取hdlist文件而决定,而不需要读所有的RPM 包。hdlist文件的另一个作用是将包名映射到文件名,如将perl包名映射到perl-5.8.3-18.i386.rpm,这意味着如果你想更新 RPM包或添加你自己的包到RPM目录中,你就需要更新hdlist这个文件,这会在后面进行描述。

2 RPM操作
RPM (Redhat Package Management)是由RedHat开发的,在Linux系统下的系统包管理工具。它的目标是:使包的安装和卸载过程更容易,它能够证实一个包是否已经正确安装了,可以简化包的建立过程,可以从源代码建立整个包,它能用于不同的体系结构。RPM系统已经成为现在Linux系统下包管理工具事实上的标准,并且它也移植到很多商业的unix系统之下。

2 RPM操作
RPM (Redhat Package Management)是由RedHat开发的,在Linux系统下的系统包管理工具。它的目标是:使包的安装和卸载过程更容易,它能够证实一个包是否已经正确安装了,可以简化包的建立过程,可以从源代码建立整个包,它能用于不同的体系结构。RPM系统已经成为现在Linux系统下包管理工具事实上的标准,并且它也移植到很多商业的unix系统之下。

RPM包由包标签对它标识,包标签包含软件名,软件版本,包的发行版本几部分。在包的内部还包含包的建立时间,包的内容描述,安装包的所有文件的大小,数字签名以证实包的完整性等信息。RMP包还包含包内的文件信息,其中包括:每个文件的文件名,每个文件的权限,文件的属组和拥有者,每个文件的md5校验和,文件的内容等。

RPM包管理系统提供了下列功能:安装新的包,卸载旧的包,将一个旧包升级为新的包,获得已经安装包的信息等。

Red Hat发布盘主要是由一些RPM包组成。RPM包的名字包含一个后缀:arch.rpm,arch 指的是体系结构,对于Intel平台的有i386、i586、i686等,你所安装的包必须要与机器上的共享库的版本相匹配。如果你发现某个RPM包没有安装,你可以自己安装。任何时候,你都可以(必须是root用户)安装RPM包。RPM命令使用轻参考相关资料。

3 RPM包创建过程
为了完成RPM包的创建,需要执行以下步骤:

  • 执行spec文件prep节的命令和宏;
  • 检查文件列表的内容;
  • 执行spec文件build节的命令和宏;
  • 执行spec文件install节的命令和宏,同时也执行文件列表中的宏;
  • 创建二进制包文件;
  • 创建源码包。

为了执行打包的工作,RPM需要一系列目录完成建立的工作。正常的目录结构通常由一个顶级目录和五个子目录构成。这五个子目录分别是:

  1. SOURCES——包含原始的源文件和补丁文件。
  2. SPECS——–包含控制RPM包建立过程的spec文件。
  3. BUILD——–包含源码解包和软件建立的目录。
  4. RPMS———包含建立过程创建的二进制包文件。
  5. SRPMS——–包含建立过程创建的源码包文件。

除了上述这五个主要的目录外,在RPMS或SRPMS目录下通常还会有关于RPM包目标平台的目录。例如,i386、i586、i686等代表与Intel兼容cpu的平台,noarch目录下的RPM包代表可以在任何平台下执行。

3.1 SPEC文件
spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件。spec文件包含建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个目录下。这个文件一般分为如下的几节:

(1) Preamle(序言)

序言包含用户请求包的信息时所显示的内容。它可以包含包的功能描述、包的软件版本、版权信息和所属的包组等。Summary 是一行关于该软件包的描述,Name 是该软件包的基名,Version 是该软件的版本号,Release 是 RPM 本身的版本号,如果修复了 spec 文件中的一个错误并发布了该软件同一版本的新 RPM,就应该增加发行版号。License 应该给出一些许可术语(如:"GPL"、"Commercial"、"Shareware"),Group 标识软件类型。那些试图帮助人们管理 RPM 的程序通常按照组列出 RPM。您可以在usr/share/doc/rpm-4.0.4/GROUPS 文件看到一个 Red Hat 使用的组列表(假设您安装的 RPM 版本是 4.0.4)。但是您还可以使用那些组名以外的名称。Source0、Source1等等给这些源文件命名(通常为 tar.gz 文件)。%{name} 和 %{version} 是 RPM 宏,它们扩展成为头中定义的 rpm 名称和版本。

要注意的是,你不要在 Source 语句中包含任何路径。缺省情况下,RPM 会在 /usr/src/redhat/SOURCES 中寻找文件,请将您的源文件复制或链接到那里。(要使 spec 文件尽量可移植的话,应当尽量避免嵌入自己开发机器上的假想路径。其他开发人员就可以指示 RPM 在别的目录下查找源文件,而不用修改您的 spec 文件。)

接下来的部分从 %description 行开始。您应该在这里提供该软件更多的描述,这样任何人使用 rpm -qi 查询您的软件包时都可以看到它。您可以解释这个软件包做什么,描述任何警告或附加的配置指令,等等。

(2) Prep节

Prep 节进行实际的打包准备工作,它是使用节前缀%prep表示的。一般而言,这一节的主要工作是检查标签语法是否正确,删除旧的软件源程序,对包含源程序的 tar文件进行解码。如果包含补丁(patch)文件,将补丁文件应用到解开的源码中。它一般包含%setup与%patch两个命令。%setup用于将软件源码包解开,执行%patch可将补丁文件加入解开的源程序中。

%setup
-n newdir———将压缩的软件源程序在newdir目录下解开。
-c —————在解开源程序之前先创建目录。
-b num————在包含多个源程序时,将第num个源程序解压缩。
-T—————-不使用缺省的解压缩操作。

例如:

%setup -T -b 0
/*解开第一个源程序文件。*/
%setup -c -n newdir
/*创建目录newdir,并在此目录之下解开源程序。*/
%patch
%patchN——-这里N是数字,表示使用第N个补丁文件,等价于%patch -P N
-p0———–指定使用第一个补丁文件,-p1指定使用第二个补丁文件。 -s————在使用补丁时,不显示任何信息。
-b name——-在加入补丁文件之前,将源文件名上加入name。若为指定此参数,则缺省源文件加入.orig。
-T————将所有打补丁时产生的输出文件删除。

(3) Build节

这一节主要用于编译源码,它是使用节前缀%build表示的。这一节一般由多个make命令组成。

(4) Install节

这一节主要用于完成实际安装软件必须执行的命令,它是使用节前缀%install表示的。这一节一般是由make install指令构成,但是有时也会包含cp、mv、install等指令。

这一节还能指定在用户安装的系统上,包安装时运行的脚本。这样的脚本称为安装(卸载)脚本。它可以指定包安装前、包安装后、包除去前、包除去后的系统必须运行的外壳程序段。在用户安装的系统上,为了验证一个包是否已经成功安装的验证脚本也可由这一节指定。

(5) Clean节

这一节所描述的内容表示在完成包建立的工作之后,自动执行此节下的脚本进行附加的清除工作,它是使用节前缀%clean表示的。一般而言,这一节的内容是简单地使用rm -rf $RPM_BUILD_ROOT命令,不需要指定此节的其它内容。

(6) 文件列表

这一节指定构成包的文件的列表,它是使用节前缀%files表示的。此外,它还包含一系列宏控制安装后的文件属性和配置信息。

%files 列出应该捆绑到 RPM 中的文件,并能够可选地设置许可权和其它信息。在 %files 中,您可以使用 %defattr 来定义缺省的许可权、所有者和组;%defattr(-,root,root) 会安装 root 用户拥有的所有文件,使用当 RPM 从构建系统捆绑它们时它们所具有的任何许可权。

可以用 %attr(permissions,user,group) 覆盖个别文件的所有者和许可权。可以在 %files 中用一行包括多个文件。可以通过在行中添加 %doc 或 %config 来标记文件。%doc 告诉 RPM 这是一个文档文件,因此如果用户安装软件包时使用 –excludedocs,将不安装该文件。您也可以在 %doc 下不带路径列出文件名,RPM 会在构建目录下查找这些文件并在 RPM 文件中包括它们,并把它们安装到 /usr/share/doc/%{name}-%{version}。以 %doc 的形式包括 README 和 ChangeLog 这样的文件是个好主意。

%config 告诉 RPM 这是一个配置文件。在升级时,RPM 将会试图避免用 RPM 打包的缺省配置文件覆盖用户仔细修改过的配置。

注意:如果在 %files 下列出一个目录名,RPM 会包括该目录下的所有文件。通常这不是您想要的,特别对于 /bin 这样的目录。

(7) 改动日志

这一节主要描述软件的开发记录,它是使用节前缀%changlog表示的。这个段的内容是为了开发人员能详细的了解该软件的开发过程,对于包的维护极有好处。

3.2 创建RPM包
如果我们需要对RPM包作修改,那么我们首先需要将源码包取来,比如我们要修改内核,那么我们可以从网上或光盘中取到内核的源代码RPM包,如kernel -2.6.5-1.358.src.rpm,将源码包解开:rpm -i kernel-2. 6.5-1.358.src.rpm,则该RPM中的内容将存放在目录/usr/src/redhat/SOURCES和 /usr/src/redhat/SPEC目录中,前者存放的是源码、补丁以及一些配置文件等,后者存放的是包对应的spec文件,如kernel- 2.6.spec,现在你就可以对内核进行修改。假定我们想另外再对内核打一个补丁,比如说:mypatch-2.6.5.patch,你需要将这个补丁文件复制到/usr/src/redhat/SOURCES/目录下,然后编辑kernel-2.6.spec文件。你需要先在定义补丁文件的最后加入对你补丁文件的初始定义,如:




............
Patch10000: linux-2.6.0-compile.patch
# Patch10010: linux-2.6.0-module-license.patch
Patch10030: mypatch-2.6.5.patch /*新加入的补丁文件的定义*/

# END OF PATCH DEFINITIONS
............

然后在文件的后面加入对内核打补丁命令:




............
%patch10000 -p1
%patch10030 -p1   /*新加入的打补丁命令*/
# END OF PATCH APPLICATIONS
............

如果你还想对内核做其它的修改,你可以修改相应的文件或添加相应的文件,然后修改kernel-2.6.spec文件。当spec文件修改完成之后,你只需要执行 rpmbuild -ba kernel-2.6.spec 就可以生成所需要的RPM包了。另外需要注意的是,以生成内核包为例,假如我们想生成kernel-smp-2.6.5-1.358.i686.rpm 包,在kernel-2.6.spec文件中包含有一些开关选项,比如,在文件的开头需要定义创建哪些内核的RPM包,如:




%define buildup 1
%define buildsmp 0
%define buildsource 1

在通常情况下,在执行rpmbuild -ba kernel-2.6.spec 命令后,会创建一个kernel-2.6.5-1.358.i386.rpm、kernel-source-2.6.5-1.358.i386.rpm和源码RPM包kernel-2.6.5-1.358.src.rpm。因此,当你需要创建支持SMP的内核的RPM包时,需要修改kernel- 2.6.spec文件开头时的定义为:




%define buildup 1
%define buildsmp 1
%define buildsource 1
%define -target_cpu i686

此外,在文件的开头还需要定义-target_cpu 为i686,从而创建i686的内核RPM包,并且需要对/usr/lib/rpm目录下面的一些宏重新定义,比如当前目录下面的macros文件,需要重新定义arch 和build_arch为i686。最后,执行命令 rpmbuild -ba kernel-2.6.spec –with smp 就可以。当然,如果对内核进行了相应的修改,就必须生成多个内核RPM包,以适用于多个arch,如kernel-2.4.18-3-i586- smp.rpm, kernel-2.4.18-3-athlon.rpm等。

4 操作系统安装盘的定制过程
你需要将原来操作系统发布盘上的内容拷贝到本机硬盘中,根据有几张发布盘而生成几个目录,比如Fedora Core 2有四张盘,你则需要在系统上生成四个目录,如disc1、disc2、disc3、disc4,分别将这四张盘上内容拷贝到这四个目录中,然后对相应的 RPM包进行更新。

4 操作系统安装盘的定制过程
你需要将原来操作系统发布盘上的内容拷贝到本机硬盘中,根据有几张发布盘而生成几个目录,比如Fedora Core 2有四张盘,你则需要在系统上生成四个目录,如disc1、disc2、disc3、disc4,分别将这四张盘上内容拷贝到这四个目录中,然后对相应的 RPM包进行更新。

首先找到你想更新的RPM包,将新的RPM替换旧包。当然你也可以根据你的需要新增或删除RPM包,需要注意的是,你需要在comps.xml文件中将新增加或删除的RPM包名加入某个组件中,并且注意其与其它RPM包的依赖关系,也就是说你所放置的包的位置要恰当,否则它会依赖于在它之前而没有加入系统的某个RPM包。

4.1 编辑comps.xml文件
在生成安装盘之前,需要注意对comps.xml文件进行修改。这个文件用来告知安装程序anaconda,用户选择了某个组是应该有哪些包需要安装,定义了在安装过程中,包是如何被捆绑在一起的。在Red Hat 8.0以前版本的发布盘中,对应的文件为comps,它只是一个简单的文本文件,在Red Hat 8.0之后的版本中,用comps.xml代替了原来的comps文件。comps.xml是一个XML文件,易于对内容进行分析和说明。

comps.xml文件开始是说明xml的版本和DTD断言,然后进入以标记开始的文件的主体内容。如:







comps.xml主要由三部分组成,首先是组列表,它描述了在安装过程中需要的不同的组(或组件),包括组名、组的描述和包含的RPM包;其次是组的层次结构,它将组分成不同的类,并定义了组的一个顺序,从而可以决定哪些组需要先安装;最后为一系列RPM包以及它们之间的依赖关系。

下面分别介绍comps.xml文件的这三部分:

(1) 组列表

在系统安装时,需要用到一个组中的一些属性,下面就是属性列表以及它们如何使用。一个组被定义在和标记之内.

一个简单的组定义可以是:





somegroup
Sample Group
true
false
This is a silly sample group

bash
cpio


下面分别说明组定义中一些参数的含义:

  • id:组的id仅仅是在comps.xml文件中作为该组的一个标识,这是必须的;
  • name:表示用户可以看到的组的名字,它也是必须的;
  • default:它表示在系统安装过程中,当选择定制(custom)安装时,该组是否在缺省情况下被选中。如果没有说明,则缺省情况下为不选中。
  • uservisible:它表示该组在缺省情况下是否在安装时可以看到,如果没有说明,缺省设置为YES,为可以看到。
  • description:它表示对该组进行简短的描述,这是必须的;
  • packagelist:它说明在该组内的一系列安装包,这也是必须的。
    packagereq:包名
    属性:
    • type:当进行安装时,判定对应的包是否是组的"强制"部分、或"缺省"部分或"可选"部分。它可以是"mandatory"、"default"或"optional"之一。
    • requires:它说明只有当它所需要(依赖)的包也安装情况下,此包才安装进系统。

(2)组层次结构

它描述了组的树状层次结构,组层次结构定义在和标记之间,由定义的
Random Groups

somegroup



一个类由下面这些属性组成:

  • name: 它表示类名,是必须的;
  • subcategories: 它表示此类的一些子类,由一列表和 元素组成
    • subcategory: 前面定义的组的id

(3)RPM包

此部分说明要安装的RPM包,它定义在 和标记之内。一个简单的RPM包部分可以如:





bash

mktemp
bash
glibc
libtermcap


  • name:它指的是RPM包名,是必须的。
  • dependencylist:它说明此包对应的依赖的RPM包。
    • dependency:此包需要的包的名字

4.2 产生完整的comps.xml文件
上述说明的comps.xml文件中的RPM包部分是是自动产生的,为了形成完全的comps.xml文件,需要在系统中安装comps-extras RPM包,然后进行下面的操作:

4.2 产生完整的comps.xml文件
上述说明的comps.xml文件中的RPM包部分是是自动产生的,为了形成完全的comps.xml文件,需要在系统中安装comps-extras RPM包,然后进行下面的操作:

  • 将comps.xml文件中的原来的RPM包部分删除;
  • 运行:
    /usr/share/comps-extras/getfullcomps.py comps.xml /path/to/tree arch >/root/filelist 在此,/path/to/tree是Red Hat Linux操作系统安装盘内容存储的地方,arch指的是体系结构,为i386。注意的是,假定comps.xml已经存放 /path/to/tree/arch/RedHat/base/目录下,将此输出重定向到一个临时文件,如/root/filelist。
  • 将comps.xml文件中最后一行内容(为)删除
  • 将前面生成的临时文件添加到comps.xml中
  • 再将添加到comps.xml文件中

通过新增你的包到comps.xml文件,你可以根据你的需要做你自己的发布盘,确信你的包在缺省情况下会被安装。需要注意的一件事是你更新的包与其它包的依赖关系,这是你需要处理的,要注意你更新的包所应该放置的位置。另外,不要在文件中随意增加或删除其余的空格。在修改comps.xml之前,也最好对最初的comps.xml做个备份,以备恢复使用。

4.3 重新编译安装程序,调整安装阶段
安装程序是不可能一次就加载进来的,必须分阶段进行,通常我们就称为"stage"。第一个阶段所用程序很小,只有这样才能从一张软盘、tftp服务器等等上面加载。通常这个阶段程序包含的只有一个精简过的Linux内核和在后续步骤当中必要的一些驱动程序(比如SCSI)。

要采用一个新的RedHat安装,就会需要很多的映像,最明显的就是引导安装盘本身(从软驱或者光驱安装)的boot.img,但是我们也需要对从硬盘、网络文件系统等安装方式提供支持。

RedHat就此提供了很好的脚本命令,只需一个简单的操作就可以完成所有的操作。这些脚本的工作就是把某些RPM包的内容提取出来,然后用来生成各安装步骤所用程序的映像。

所再强调的是,我们必须保证安装了anaconda-runtime:

#rpm -i anaconda-runtime-xxxxx-i386.rpm

接着进入目录/usr/lib/anaconda-runtime,这里我们会看到一些非常有用的脚本,比如:

  • mk-images.i386:包涵有创建启动磁盘时i386的专门设置(通常情况下,网络和pcmcia)以及辅助磁盘驱动程序。在此您可以改变启动映像中所包含的模块,比如说在网络启动磁盘有:


    ......
    NETWORKMODULES="$COMMONMODULES nfs 3c59x eepro100 tulip pcnet32
    ne2k-pci 8139too"
    ........
  • buildinstall 这是主要的。


    #cd /usr/lib/anaconda-runtime
    #./buildinstall ~/disc1/

    这个脚本命令会在~/disc1/images目录下更新一些的文件。

4.4 生成新的hdlist文件
当安装时,安装程序需要依赖光盘上的Fedora/base/hdlist文件,它包含的是所有可用的RPM包的必要信息,这些信息在安装过程当中是用来显示每一个包的用途以及解决用户选择软件包后的依赖性问题。

用以生成hdlist文件的程序叫做genhdlist,它是由anaconda-runtime这个包产生的。现在的genhdlist多了一个新的参数:–withnumbers,是用来记录hdlist文件中每个RPM包的媒介代号。

分步处理的过程如下:




#rpm -i anaconda-runtime-xxxxx-i386.rpm
#cd /usr/lib/anaconda-runtime
#./genhdlist -- withnumbers ~/disc1 ~/disc2 ~/disc3 ~/disc4

整个过程只需要执行一个脚本,见附录一:kernel-update.sh。

如果你在系统中添加了RPM包,那么在生成安装盘之前,最好将这四张盘上的内容复制到一个目录下,然后修改附录一的脚本文件,运行脚本,先网络安装一次,看是否存在包的依赖关系问题。如果没有,则可以生成安装盘。

5 生成iso映象
当前面系统进行网络安装成功后,则可以生成iso映象,然后进行刻盘,执行的操作如下:

5 生成iso映象
当前面系统进行网络安装成功后,则可以生成iso映象,然后进行刻盘,执行的操作如下:


# build disk 1
cd ~/disc1 /*假设我们将第一张盘的内容放置在此外*/
mkisofs -R -J -T -no-emul-boot -boot-load-size 4 -boot-info-table -V fedora -b isolinux/isolinux.bin -c isolinux/boot.cat -o /iso/exm-disc1.iso .
/*使用mkisofs工具生成iso映象,将生成的iso映象放在/iso目录中*/
# build disk 2
cd ~/disc2 /*采用同样的方法,生成第二个iso,依次。*/
mkisofs -R -J -T -V fedora -o /iso/exm-disc2.iso .

在生成iso映象之后,需要对它进行测试,你可以将它挂接到某个地方,比如:




mount -o loop /iso/exm1-disc1.iso /mnt

在生成安装iso(exm-disc1.iso)之后,我们可以将它复制到windows系统中,采用刻录程序进行刻录,然后可以从光盘安装,进行安装测试。

附录一:kernel-update.sh

附录一:kernel-update.sh



#!/bin/sh

# current working directory
BASE=`pwd`

# generate hdlists
mkdir -p $BASE/SOURCES
echo
echo Copying disc1 to SOURCES directory, please wait...
cp -Rf $BASE/disc1/* $BASE/SOURCES
echo Copying disc2 to SOURCES directory, please wait...
cp -Rf $BASE/disc2/* $BASE/SOURCES
echo Copying disc3 to SOURCES directory, please wait...
cp -Rf $BASE/disc3/* $BASE/SOURCES
echo Copying disc4 to SOURCES directory, please wait...
cp -Rf $BASE/disc4/* $BASE/SOURCES
echo

echo Make sure anaconda, anaconda-runtime is installed...
rpm -U $BASE/SOURCES/Fedora/RPMS/anaconda-*.rpm

# generate hdlists*
cd /usr/lib/anaconda-runtime
./genhdlist --withnumbers $BASE/disc1 $BASE/disc2 $BASE/disc3 $BASE/disc4
# generate the package ordering
./pkgorder $BASE/SOURCES i386 |tee /root/pkgorder.txt

./buildinstall --pkgorder /root/pkgorder.txt --version 1 --product "Fedora" --release "Fedora" $BASE/SOURCES

$BASE/SOURCES
cp -apRf $BASE/SOURCES/images/* $BASE/disc1/images
cp -apRf $BASE/SOURCES/isolinux/* $BASE/disc1/isolinux
cp -apRf $BASE/SOURCES/RedHat/base/* $BASE/disc1/RedHat/base

echo Cleaning up...
rm -rf $BASE/SOURCES
关于作者
汪伦伟,男,国防科技大学博士研究生,研究方向为安全操作系统。您可以通过电子邮件
xc_wangwei@163.com跟他联系。



Debian New Maintainers’ Guide
—————————–

Josip Rodin

version 1.2, 6 April 2002.


——————————————————————————-


Copyright Notice
—————-

Copyright (C) 1998-2002 Josip Rodin.

This document may be used under the terms the GNU General Public
License version 2 or higher.

This document was made using with these two documents as examples:

Making a Debian Package (AKA the Debmake Manual), copyright (C) 1997
Jaldhar Vyas.

The New-Maintainer’s Debian Packaging Howto, copyright (C) 1997 Will
Lowe.


——————————————————————————-




目录
——–

1. 起步
1.1. 你需要的程序
1.2. 附加信息

2. 第一步
2.1. 选择你的程序
2.2. 获取程序,进行试验
2.3. 包的名称和版本
2.4. Initial "debianization"

3. 修改源代码
3.1. 在子目录安装
3.2. 不一致的库

4. debian/下需要的东西
4.1. `control’文件
4.2. `copyright’文件
4.3. `changelog’文件
4.4. `rules’ file

5. Other files under debian/
5.1. README.Debian
5.2. conffiles.ex
5.3. cron.d.ex
5.4. dirs
5.5. docs
5.6. emacsen-*.ex
5.7. init.d.ex
5.8. manpage.1.ex, manpage.sgml.ex
5.9. menu.ex
5.10. watch.ex
5.11. ex.package.doc-base
5.12. postinst.ex, preinst.ex, postrm.ex, prerm.ex

6. Building the package
6.1. Complete rebuild
6.2. Quick rebuild

7. Checking the package for errors

8. Uploading the package

9. Updating the package
9.1. New Debian revision
9.2. New upstream release
9.3. Verifying package upgrades

10. Where to ask for help


——————————————————————————-


1. 起步
——————————–

本文试着描述如何来建立Debian包,并且用实际的例子加以说明。有句罗马
谚语是 Longum iter est per preaecepta, breve et efficax per exempla!
(It’s a long way by the rules, but short and efficient with examples!
虽然是技术文章也不乏它的艺术性:-))。

Debian之所以成为如此优秀的发行版,一个重要的原因是有一个非常优秀的包
管理机制。尽管现在有众多Debian格式的软件包,但有时你还是需要安装一些
列表中没有的软件。你也许想知道如何才能制作自己的程序包,可能你认为这
是非常困难的事。假如你确实是个Linux新手,那么它真的很难。但如果你是新
手,你现在也不会读这篇文档。(老外废话就是多,后面不说了)

有一件事是肯定的,要正确地创建和维护Debian包,你需要很多时间。要确定
没有错误,需要维护者有一定的技术能力和dilligent。

这篇文档解释了每一个细致的步骤,帮助你创建第一个包,并使你获得打包的
经验。

最新版的文档可以在http://www.debian.org/doc/maint-guide/和
http://debian.linuxforum.net/doc/manuals/maint-guide/上找到。


1.1. 你需要的程序
————————————–

在开始之前,你需要确定你已经正确地安装了一些额外的包。注意这个列表
中的包并没有`essential’或`required’的标记 – 我们认为你已安装了这些包。

这个版本的文档已经将包升级到了Debian 2.2(`potato’)和3.0(`woody’)。

下面的包来自于标准的Debian安装,所以你可能已经安装了。尽管如此,我们
还是应该用`dpkg -s `检查一下。

* `dpkg-dev’ – 包含解包(unpack)、构造(build)和上载(upload)Debian
源码包的工具。 (see dpkg-source(1))

* `file’ – 这个方便的程序能确定一个文件是什么类型。(see file(1))

* `gcc’ – GNU C 编译器,必需的,如果你的程序是用C语言写的。(see gcc(1))
这个包也牵涉(pull in)到一些其它的包,比如`binutils’。它包括了
组装和链接目标文件的程序(see `info binutils` in the binutils-doc
package)和`cpp’- C预处理器。(see cpp(1))

* `g++’ – GNU C++ 编译器,必需的,如果你的程序是用C++写的。(see g++(1))

* `libc6-dev’ – gcc创建目标文件需要链接的C类库和头文件。(see `info libc`
in the `glibc-doc’package)

* `make’ – 通常创建一个程序有好几步,如果你不想一边又一边地输入相同
的命令,那么你能用这个程序创建`Makefile’(see `info make`)来自动完
成这一过程。

* `patch’ – 这个有用的工具可以获得包含差别列表(由diff程序产生)的文件,
并且将它应用到源文件上,生成一个修补过的版本(see patch(1))。

* `perl’ – Perl是一个用来类Unix系统上的解释型脚本语言,通常指"Unix’s
Swiss Army Chainsaw". (see perl(1))

你可能也需要安装下面的包:

* `autoconf’ and `automake’ – 许多新的程序使用配置脚本和Makefiles,
用这些辅助程序来进行预处理。(see `info autoconf`, `info automake`)

* `dh-make’ and `debhelper’ – dh-make 是创建样包框架所必需的。它还要
使用一些debhelper来创建包。它们不是必需的东西,但对于新的维护者来
说是强烈推荐的。它使得整个过程很容易开始和后继控制。(see
dh_make(1), debhelper(1),/usr/share/doc/debhelper/README)

* `devscripts’ – 包含一些很好的、有用的脚本,对维护者可能很有用,但
它们也不是必需的。(see /usr/share/doc/devscripts/README.gz)

* `fakeroot’ – 这个工具可以让你模拟为root,这对于构造过程的有些部分
是必要的。(see fakeroot(1))

* `gnupg’ – 能让你digitally _sign_ packages的工具。这非常的重要,如
果你想将你的程序发布给其他人。并且当你的工作包含在Debian发行版中时,
你当然需要做这些事。(see gpg(1))

* `g77′ – GNU Fortran 77 编译器,必需的,如果你的程序是用Frotran写的。(see g77(1))

* `gpc’ – GNU Pascal编译器,必需的,如果你的程序用Pascal编写。
这儿值得注意的是`fp-compiler’,Free Pascal Compiler,在这个工作中使
用也很不错。(see gpc(1), ppc386(1))

* `imake’ and `xmkmf’ – 一些程序,通常是为X11做的,也使用这些程序来从
一组宏中生成Makefiles。(see imake(1), xmkmf(1))

* `lintian’ – Debian的包检查器。在你构造包后让你知道任何常见的错误,
并解释发现的错误。(see lintian(1),
/usr/share/doc/lintian/lintian.html/index.html)

以下是非常重要的文档,你应该和本文档一起阅读:

* `debian-policy’ – the Policy includes explanations of the
structure and contents of the Debian archive, several OS design
issues, the Filesystem Hierarchy Standard (which says where each
file and directory should be) etc. For you, the most important
thing is that it describes requirements that each package must
satisfy to be included in the distribution. (see
/usr/share/doc/debian-policy/policy.html/index.html)

* `developers-reference’ – for all matters not specifically about
the technical details of packaging, like the structure of the
archive, how to rename, orphan, pick up packages, how to do NMUs,
how to manage bugs, when and where to upload etc. (see
/usr/share/doc/developers-reference/developers-reference.html/index.html)

以上的简短介绍只是告诉你每一个包是做什么的。在开始之前请完整阅读每一
个程序的文档,最少是它们的的标准用法。现在做看起来很累,但稍后你会对
你所读的东西感到很高兴。

Note: `debmake’ is a package that contains some programs that function
similar to dh-make, but its specific use is _not_ covered in this
document, because it is _deprecated_. Please refer to the Debmake
manual (http://www.debian.org/~jaldhar/) for more information.


1.2. 附加信息
———————-

你能够制作两种包,源码包和二进制包。源码包包含了能够编译为程序的代
码。二进制包包含的仅仅是完成的程序。不要混淆了程序的源码和程序的源码
包。如果想了解更多术语上的细节,请阅读其它的手册。

在Debian中,"维护者"(maintainer)是指制作包的人,"溯源作者"
(upstream author想不到好词了:-))指程序的作者。在Debian之外,"溯源
维护者"是目前维护程序的人。通常作者和溯源维护者是同一个人,有时甚至
连维护者也是同一个人。如果你制作一个程序,并且想在Debian中获取,你可
以成为一个维护者自由提交你的程序。

在你构造你的包以后,如果你想你的程序在下一个发行版中出现(如果程序有
用,为什么不了),那么你需要成为一个官方的Debian维护者。相关过程在
Developer’s Reference中有描述。请阅读。


——————————————————————————-


2. 第一步
————–


2.1. 选择你的程序
————————

你可能已经选择了要创建的包。首先你需要检查发行版中是否已经包含了这
个包。如果你是用的是 `stable’,那么最好在
http://www.debian.org/distrib/packages上查询。如果你正使用’unstable’,
用下面的命令检查:

dpkg -s program
dpkg -l ‘*program*’

如果包已经存在,那么安装它就行了!如果是孤立包–它的维护者是
"Debian QA Group",那么你可以来维护它。参考孤立包的列表
(http://www.debian.org/devel/wnpp/orphaned)和包的过继列表
(http://www.debian.org/devel/wnpp/rfa_bypackage)确定所选的包
确实需要获取。

如果你有能力维护这个包,那么获取源码(比如用`apt-get source
packagename’)并检查。不幸的是本文档并不包含如何过继包的完整
信息。让人感到欣慰的是你不必花大量的时间来弄清楚包是如何工作
的,因为其他人早已为你做好了最初的工作。但是你还是应该继续读
下去,下面的建议对你的工作还是很有用的。

如果包是新的,并且你想在Debian中看到它,那么照下面的做:

* 在继续工作前,检查没有其他人也在维护这个包
(http://www.de.debian.org/devel/wnpp/being_packaged).如果
已经有人在维护了,你觉得有必要,那么可以联系他们。否则,
寻找其它感兴趣的、没人维护的程序。

* 依据the Debian Free Software Guidelines
(http://www.debian.org/social_contract#guidelines),如果
是自由软件,那么程序必须有许可证。如果它不遵守这些协议,
但是可以自由的发布,那么它就能包含在`contrib’或`non-free’中。
如果你不确定它应该放在什么位置上,那么把许可证的内容贴到
上,征求意见。

* program certainly should _not_ run setuid root, or even better -
it shouldn’t need to be setuid or setgid to anything.

* program should not be a daemon, or something that goes in */sbin
directories, or open a port as root.

* 程序最后应该是二进制、可执行的,类型库很难处理。

* 它应该有详细的文档,或者(且)代码要容易理解。

* 你应该联系程序的作者,确定他们同意将程序打包。能与作者进行
商议是很重要的,防止程序有任何的细节问题,因此,不要试图将未
维护的部分打进包中。

* 最后你必须确定它能工作,并且试过好几次。(你应该做很多事,
而不至这一条)

当然这些只是安全措施,保护你免受愤怒的用户的攻击,如果你做错了一些
事(in some setuid daemon…)。当你获得了足够的打包经验的时候,
你能够做这样的包。但即使是经验丰富的开发者,在他们有疑问的时候,
他们也会参考debian-mentors的邮件列表。那里的人们会很乐意帮助你的。

要获取更多的信息,请查阅Developer’s Reference。


2.2. 获取程序,进行试验
————————————

你要做的第一件事是寻找并下载原始的包。我假定你已经拥有了源代码。
自由Unix程序的源代码通常是tar/gzip格式的,后缀名为.tar.gz,通常
有一个被称为program-version的子目录,所有的源代码都在里面。如果
你得到的程序是其它类型的(比如,文件名以".Z"或".zip"结尾),那么
用合适的工具解包,或者在你不知道如何正确解包的情况下,可以在
debian-mentors的邮件列表上询问。(提示:讨论组`file archive.extension`)

作为例子,我选用`gentoo’这个程序,一个X GTK+文件管理器。注意这
个程序已经被打过包了,并且自这个文档第一次写好以来,版本发生了
巨大的变化。

在家目录下创建一个子目录,叫’debian’或’deb’或者其它你认为合适的
名字(比如本文的 ~/gentoo/就不错)。将下载的文件放在里面,解压
(用`tar xzf gentoo-0.9.12.tar.gz`)。确定没有错误,甚至是一些不
相关的错误,因为在别人的系统上解包就很有可能会有问题,他们的解包
工具不一定会忽略这些异常。

现在你有了另一个子目录,叫’gentoo-0.9.12′。进入这个目录,完整地
阅读提供的文档。一般会有文件叫README*, INSTALL*, *.lsm或者 *.html。
通过阅读你必须知道如何正确编译和安装程序。(大多数情况下,我们假定
你想安装到/usr/local/bin目录下,你不用管这些,更多的内容会在
Section 3.1, `Installation in a subdirectory’中涉及)。

这一过程是从程序到程序的改变,但许多现在的程序都来自于一个`configure’
脚本,它基于你的系统来配置源码,并确认你的系统能够进行编译。在用
`./configure`配置后,程序通常用`make`进行编译。有一些支持`make check`,
运行它包括了一个自检。将程序安装到目标目录下通常用`make install`来
完成。

现在试着编译、运行你的程序,确定它能正常工作,并且在安装或运行期间
不会破坏其它的东西。

同样,你可以用`make clean` (或`make distclean`更好)来清理构造目录
。有时甚至有`make uninstall`来卸载所有安装的文件。


2.3. 包的名称和版本
—————————–

你的打包工作应该从完全干净的源目录开始,或者重新将源码解包。

为了正确地构造包,你必须使程序的原始名称为小写,并且应将应将源码的
目录改变为-的形式。

如果程序的名称不是由一个单词组成的,将其缩短为一个单词,或使用
缩写。例如程序"John’s little editor for X",包应该命名为johnledx,或
jle4x或其它你喜欢的,只要符合一些合理的限制,比如20个字符。

同样要检查程序的确切版本号。如果部分软件不是用X.Y.Z的形式标示版本,
但有一种形式的日期,那么可以用日期作为版本号,但要预留一个"0.0."
(这只是为了防止溯源者某天想发布一个新的版本,比如1.0)。因此,如果发行
的日期是1998年12月19日,那么版本号就是0.0.19981219。

有些程序根本就没有数字标识,这种情况下你需要与溯源维护者联系,看他们
是否有其它的追踪修订方法。


2.4. Initial "debianization"
—————————-

确定在源码目录下,使用这个命令:

dh_make -e your.maintainer@address -f ../gentoo-0.9.12.tar.gz

当然,用你的e-mail替换"your.maintainer@address"字符串,为了包含在变更
目录和其它文件中,并且文件名有最初源码文件的名字。更多信息参阅dh_make(1)。

接着会有一些信息。它会问你要创建那种类型的包。Gentoo是简单的二进制包,
它只创建一个二进制文件,即一个deb文件,因此我们选在第一个选项,用`s’键
查看屏幕上的信息,用键确认。

再说一次,作为一个新的维护者,你可能会在创建多部件的二进制包或类型库
时感到气馁。它并不是很难,但确实需要更多的知识,因此我们这里不讨论它。

请注意,你只要运行一次dh_make,如果你在同样的、已经"debianized"的目录
再运行的话,它就会出错。这也意味着,你可以在将来用一个不同的方法发布一
个修订版或新的版本。参阅Chapter 9 `Updating the package’。


——————————————————————————-


3. 修改源代码
———————–

通常程序安装在/usr/local子目录下。但Debian包不一定要用这个目录,因为
它是为系统管理员(或用户)保留的私有空间。这意味着你必须察看你的程序
构造系统,通常用Makefile开始。脚本make(1)会用来自动构造这个程序。关于
Makefiles的更多细节,参阅Section 4.4, “rules’ file’。

注意如果你的程序使用GNU automake(1) 且/或 autoconf(1),那么意味着源码
包含Makefile.am 且/或 Makefile.in文件,在个别情况下,你需要修改这些文
件。因为每次调用automake都会用Makefile.am产生的信息重写Makefile.in,并
且每次使用./configure也会发生同样的事。编辑Makefile.am需要一些automake
的知识,你可以阅读automake的相关信息。尽管编辑Makefile.in和编辑Makefile
是一样的,但一定要注意变量,比如任何用’@'引起来的字符串,像@CFLAGS@或
@LN_S@,在调用./configure时它们都会被实际的字符串所替代。

Also note that there isn’t space here to go into _all_ the details of
fixing upstream sources, but here are a few problems people often run
across.


3.1. 在子目录安装
———————————–

大多数程序都有办法将自己安装到已有的目录结构中,因此它们的二进制文件会
包含在你的$PATH中,在一般的位置你可以找到它们的文档和手册。但是,如果
你那么做, 那么程序会安装在其它的文件中间。这样的话会使你的打包工具很
搞清楚哪些文件属于你的包,哪些不属于。

因此你需要做一些其它的事:将程序安装在一个临时目录中,这样方便用工具
来制作.deb包。当用户安装你的包时,所有需要在用户机器上安装的东西都包
含在这个目录中,唯一不同的是dpkg会把这些文件安装在root目录下。

临时目录通常创建在解开的源码包的debian/目录下,通常叫 `debian/tmp’或
`debian/packagename’。

记住尽管你需要把程序装在debian/packagename下,但在放置到root目录中的
时候仍然需要正确地处理,例如在从.deb包安装的时候。因此,在包文件中不
应该建立硬代码(hardcode),如/home/me/deb/gentoo-0.9.12/usr/share/gentoo’。

对于使用GNU autoconf的程序,这会十分得容易。大多数这样的程序都有
默认设置的makefiles,允许程序安装到任何一个子目录下,记住/usr(例如)
是规范的前缀。当它检测到你的程序使用autoconf,dh_make会自动使用来
自动完成这些事情,因此你也可以跳过这一节。但对于其它的程序,你可能
必须检查并修改Makefiles。

这是gentoo’s Makefile的相关部分:

# Where to put binary on ‘make install’?
BIN = /usr/local/bin

# Where to put icons on ‘make install’?
ICONS = /usr/local/share/gentoo

我们看到文件会被安装到`/usr/local’下,修改这些路径:

# Where to put binary on ‘make install’?
BIN = $(DESTDIR)/usr/bin

# Where to put icons on ‘make install’?
ICONS = $(DESTDIR)/usr/share/gentoo

为什么是这些路径而不是其它的呢?因为Debian包从不在`/usr/local’下安装
文件 — 那是为系统管理员预留的目录。在Debian系统上这样文件会在`/usr’
下。

二进制文件、图标、文档等的确切位置在Filesystem Hierarchy Standard (see
/usr/share/doc/debian-policy/fhs/)中指定。我推荐你浏览一下,阅读与你的
包相关的章节。

因此,我们把二进制文件安装在/usr/bin目录下,而不是/usr/local/bin下,
指南在/usr/share/man/man1下,而不是/usr/local/man/man1下等。注意,在
gentoo的makefile中并没有提到指南,但是因为Debian的原则要求每个程序都
要有一个,所以我们会在后面做一个,安装在/usr/share/man/man1目录下。

一些程序不使用makefile变量来定义这样的路径。这意味着你可能必须编辑实际
的C源文件,为的是修改它们以使用正确的位置。但是在哪里,查找什么呢?你
可以用这条命令:

grep -rn usr/local/lib *.[ch]

Grep会在源码包中迭代运行,一旦有所发现,就会告诉你文件的名称和行号。

编辑这些文件,用usr/*代替/usr/local/。小心,别搞坏了其它的代码!:-)

在你找到install标记后(寻找`install:’开头的行,一般都有效),重新命名所有
的引用目录,除了在Makefile中定义的。gentoo预先定义的install标记是这样的:

install: gentoo
install ./gentoo $(BIN)
install icons/* $(ICONS)
install gentoorc-example $(HOME)/.gentoorc

修改后是这样的:

install: gentoo-target
install -d $(BIN) $(ICONS) $(DESTDIR)/etc
install ./gentoo $(BIN)
install -m644 icons/* $(ICONS)
install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc

你一定注意到在其它命令之前有一个`install -d’命令。原始的makefile并没有它,
因为在系统中通常已经有/usr/local/bin和其它的目录,在运行过`make install`
以后。然而,因为我们要在自己的空目录(或者是不存在的目录)中安装,所以我
们必须创建每一个目录。

我们同样可以在末尾增加其它的东西,比如附件文档的安装,这些文档有时是溯源
作者忽略的。

install -d $(DESTDIR)/usr/share/doc/gentoo/html
cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

细心的读者会发现我将`gentoo’改为`gentoo-target’。这叫做不相关错误的修改:-)

只要你的改变不是特定的与Debian包相关,那么当然可以把它们发给溯源维护者,
这样他们可以在程序的下一个版本中包含它们,这对每个人都有用。同样需要记住,
你做的修改不要针对先前的某个Debian或Linux(甚至是Unix),然后再发给他们,
即使它们便于移植。这会让你的修改更容易应用。

注意你不必发送debian/*文件。


3.2. 不一致的库
————————

有一个普遍的问题:从一个平台到另一个平台的库经常是不一样的。比如,
Makefile能够包含一个库的引用,而这个库在Debian系统中根本没有。在这种
情况下,你需要修改它为Debian中有的库,并且有同样的效果。

因此,如果在Makefile(或Makefile.in)中有这么一行(而且你的程序不能编译):

LIBS = -lcurses -lsomething -lsomethingelse

把它改成这样就好了:

LIBS = -lncurses -lsomething -lsomethingelse

(考虑到libncurses包现在有一个libcurses.so的符号链接,作者认为这不是个最好
的例子,但他又想不到一个更好的。欢迎你提出好的建议 :-)


——————————————————————————-


4. debian/下需要的东西
——————————-

在源码目录下有一个新的子目录叫`debian’。里面有很多的文件,为了定制包的
行为,我们需要修改它。它们中重要的文件是`control’, `changelog’,
`copyright’和’rules’,这些是所有包都需要的。


4.1. `control’文件
——————-

这个文件包含了许多的值,这些值是`dpkg’, `dselect’和其它一些包管理工具
用来管理包时使用的。

这是dh_make为我们创建的control文件:

1 Source: gentoo
2 Section: unknown
3 Priority: optional
4 Maintainer: Josip Rodin
5 Build-Depends: debhelper (>> 3.0.0)
6 Standards-Version: 3.5.2
7
8 Package: gentoo
9 Architecture: any
10 Depends: ${shlibs:Depends}
11 Description:
12

(我增加了行号。)

1-6行是源码包的控制信息。

第1行是源码包的名称。

第2行是源码包加入的发行版中的位置。

也许你注意到了,Debian分成了几个部分: main (the free
software), non-free (the not really free software) 和 contrib (free
software that depends on non-free software)。在这些大分类之下,逻辑
上的小分类,他们简短地描述了有些什么包。因此,我们用`admin’代表管理
员专用的程序,`base’代表基本工具,`devel’代表开发工具,`doc’代表文
档,`libs’代表库,`mail’代表e-mail readers and daemons,`net’代表
network apps and daemons,`x11′代表X11程序,这些在其它的地方不再适用。

我们把它改成x11。("main/"前缀已经应用,因此我们可以忽略。)

第3行描述了用户安装的包的重要程度。参阅Policy manual来设置这一行。
"optional"优先权通常用于新的包。

Section和priority被`dselect’这样的前端使用,当他们对包排序和选择默认
包时。一旦你把包上传到Debian上,这两部分的值会被档案管理员重写,并且
他们会用email通知你。

由于这是个一般优先权的包,并且不会和其它的冲突,所以我们仍然用"optional"。

第4行事维护者的名字和email。确定在使用email的时候为这行加上一个有效
的头"To: ",因为在你上传后,错误追踪系统会使用它来给你汇报错误。避免
使用逗号(commas)、&(ampersands)和圆括号(parenthesis)。

第5行包括了构造你的包所必需的包的列表。一些包如gcc和make已经有了,参阅
`build-essential’包以获取更多细节。如果需要一些非标准编译器或其它工具
你需要在`Build-Depends’这一行中写明。如果有多个用逗号分开;阅读依赖性的
解释以了解这一行的更多语法。

你同样要有Build-Depends-Indep, Build-Conflicts和其它的行。这些数据会被
Debian的自动打包软件使用,为的是为其它平台创建二进制包。参阅Policy manual
以获得更多关于build-dependencies的信息;参阅Developers’ Reference以获得
更多关于平台和移植软件的信息。

你可以用这个找出需要哪些包,在构造你的包的时候:

strace -f -o /tmp/log ./configure
# or make instead of ./configure, if the package don’t use autoconf
for x in `dpkg -S $(grep open /tmp/log|perl -pe ’s!.* open\(\"([^\"]*).*!$1!’ |grep "^/"| sort | uniq| grep -v "^\(/tmp\|/dev\|/proc\)" ) 2>/dev/null|cut -f1 -d":"| sort | uniq`; do echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), "; done

Gentoo恰好也需要`xlibs-dev’, `libgtk1.2-dev’和`libglib1.2-dev’,因此我们
把它们添加到`debhelper’之后。

第6行是这个包所遵守的Debian Policy标准的版本,也就是你在制作包时读到
的Policy manual的版本号。

第8行是二进制包的名称。通常跟源码包的名称是一样的,但不一定要这样。

第9行描述了二进制包能够编译的CPU的体系(类型)。我们依然用"any",因为
dpkg-gencontrol(1)会根据编译的机器添上合适的值。

如果你的包是独立体系(比如,a shell或Perl script或一篇文档),那么就把它
改为"all",阅读后面的Section 4.4, “rules’ file’,关于使用`binary-indep’
规则来代替`binary-arch’。

第10行表示了Debian包管理系统的最有效的特征。包之间以多种方式相互依赖。
除了Depends:,还有一些关系也是推荐的,如Recommends:,
Suggests:, Pre-Depends:, Conflicts:, Provides:, 和 Replaces:。

包管理工具在处理这些关系时也是以同样的方式来对待的;如果不是这样,它会
有相应的解释。(参阅 dpkg(8), dselect(8), apt(8), aptitude(1)等。)

依赖性的解释:

* Depends:

The package will not be installed unless the packages it depends
on are installed. Use this if your program absolutely will not
run (or will cause severe breakage) unless a particular package
is present.

* Recommends:

Frontends such as dselect or aptitude will prompt you to install
the recommended packages along with your package; dselect will
even insist. dpkg and apt-get will ignore this field, though.
Use this for packages that are not strictly necessary but are
typically used with your program.

* Suggests:

When a user installs your program, all frontends will likely
prompt them to install the suggested packages. dpkg and apt-get
won’t care. Use this for packages which will work nicely with
your program but are not at all necessary.

* Pre-Depends:

This is stronger than Depends:. The package will not be
installed unless the packages it pre-depends on are installed
_and correctly configured_. Use this _very_ sparingly and only
after discussing it on the debian-devel mailing list. Read:
don’t use it at all. :-)

* Conflicts:

The package will not be installed until all the packages it
conflicts with have been removed. Use this if your program
absolutely will not run or will cause severe problems if a
particular package is present.

* Provides:

For some types of packages where there are multiple alternatives
virtual names have been defined. You can get the full list in
the
/usr/share/doc/debian-policy/virtual-package-names-list.txt.gz
file. Use this if your program provides a function of an
existing virtual package.

* Replaces:

Use this when your program replaces files from another package,
or completely replaces another package (used in conjunction with
Conflicts:). Files from the named packages will be overwritten
with the files from your package.

所有这些字段都有统一的语法。它们是一个包名称的列表,用逗号分开。这些
包的名称也可以组成另一个包名称列表,用`|’分隔。

这些字段可以限定它们能够使用的每个包的特别版本。版本号列在了包名称后
面的圆括号内,而且还可以包含下面列出的一个关系。可用的关系是:`<<’,
`<=’, `=’, `>=’ and `>>’ 分别代表严格低于,低于或等于,确切地等于,
大于或等于,严格大于。例如:

Depends: foo (>= 1.2), libbar1 (= 1.3.4)
Conflicts: baz
Recommends: libbaz4 (>> 4.0.7)
Suggests: quux
Replaces: quux (<< 5), quux-foo (<= 7.6)

最后一个你需要知道的特征是 ${shlibs:Depends}。在你的包构造和安装在临时
目录以后,dh_shlibdeps(1)会为二进制文件和库寻找它,确定它们的共享库的
依赖性并检测它们在哪些包里,比如libc6或xlib6g。它会传递列表给dh_gencontrol(1),
dh_gencontrol(1)会在合适的位置填上它,你不需要担心它。

上面说的这些,我们可以让Depends:这一行保留它原来的样子,在`Suggests: file’
之后插入另一行,因为gentoo可以使用其它程序/包提供的一些特性。

第11行是简短的描述。大多数人的屏幕是80列宽,因此不要超过60个字符。我把
它改成"A fully GUI configurable X file manager using GTK+"。

第12行是详细详细描述。它可以是一段描述包详细信息的文字。每行的第一列
应该是空的。不能有空白行,但你可以用只用一个 .(点)来代替。而且在详细描
述之后有一个空行,但不能再有其它的东西。

最后,这是更新后的control文件:

1 Source: gentoo
2 Section: x11
3 Priority: optional
4 Maintainer: Josip Rodin
5 Build-Depends: debhelper (>> 3.0.0), xlibs-dev, libgtk1.2-dev, libglib1.2-dev
6 Standards-Version: 3.5.2
7
8 Package: gentoo
9 Architecture: any
10 Depends: ${shlibs:Depends}
11 Suggests: file
12 Description: A fully GUI configurable X file manager using GTK+
13 gentoo is a file manager for Linux written from scratch in pure C. It
14 uses the GTK+ toolkit for all of its interface needs. gentoo provides
15 100% GUI configurability; no need to edit config files by hand and re-
16 start the program. gentoo supports identifying the type of various
17 files (using extension, regular expressions, or the ‘file’ command),
18 and can display files of different types with different colors and icons.
19 .
20 gentoo borrows some of its look and feel from the classic Amiga file
21 manager "Directory OPUS" (written by Jonathan Potter).

(我增加了行号。)


4.2. `copyright’文件
———————

这个文件包含了包的溯源信息,版权和许可证信息。它的格式规范中并没有规定,
但内容是有规定的(section 13.6 "Copyright information")。

dh_make默认创建的,看起来是这样的:

1 This package was debianized by Josip Rodin on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from
5
6 Upstream Author(s):
7
8 Copyright:
9
10

(我增加了行号)

这个文件中要增加的重要的东西是包获取的地址和目前的版权注释和许可证。
你必须包括完整的许可证,除非它是一个通用自由软件许可证,如GNU GPL或LGPL,
BSD或Artistic许可证,在你能够引用到合适的文件时,这些文件在每个已有
Debian系统中的/usr/share/common-licenses/目录下。

简言之,gentoo的copyright文件看起来是这样的:

1 This package was debianized by Josip Rodin on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from: ftp://ftp.obsession.se/gentoo/
5
6 Upstream author: Emil Brink
7
8 This software is copyright (c) 1998-99 by Emil Brink, Obsession
9 Development.
10
11 You are free to distribute this software under the terms of
12 the GNU General Public License.
13 On Debian systems, the complete text of the GNU General Public
14 License can be found in the file `/usr/share/common-licenses/GPL’.

在开始安装系统以前, 必须决定要使用多大的硬盘空间来安装 FreeBSD, 而且必须决定 partition 应该如何分割. 因为一旦你安装完系统以后, 再想改变一个 partition 的大小就必须把资料备份出来再重新分区、格式化(format)。 

  一般情况下, 你必须准备一个 primary partition 给 FreeBSD, *BSD 传统上只能装在 primary 上。FreeBSD 经过修改可以使用逻辑分区(logical partition), 但开机区还是必须是 primary。

 在FreeBSD中,分区的概念与DOS/WIN系统略有不同。FreeBSD将一块 硬盘分成最多四个slice(片段),每一个slice上又可以分成最多8个partition(分区)。也 就是说FreeBSD将DOS/Windows里的一个分区看作一个slice。在以后的叙述中,将采用FreeBSD 的概念,即slice和partition的硬盘分区术语。

 FreeBSD最多可以将一个slice分成8个partition,分别称之为a,b,c,d,e,f,g,h, 传统上a,b,c,d分区有特殊的意义,a表示root分区,b表示swap分区,c表示整个slice,d表示整个硬盘 从FreeBSD-2.0.5 Release开始,FreeBSD发展了新的slice概念,只有c内定位整个slice,其他都可 自由使用,但一般还是遵循传统观念,即a:root,b:swap,efgh:其他。

 下表展示了一个典型的硬盘分区情况。

  

 对非BSD的slice,是没有a,b,c,d等分区概念的,另外对于DOS扩展分区上的逻辑分区是定义为从s5开始编号的slice。即wd0上的dos扩展分区上的第一个逻辑分区为wd0s5,第二个逻辑分区为wd0s6。

 硬盘分割策略一:

 对 FreeBSD 的新使用者, 建议只把你的 BSD slice 分割成为两个区块,一个是 a, 当做 root partition 放所有文件, 另一个是 b, 用作 swap. (当然 a 要够大根据你要安装的文件的大小确定)

 硬盘分割策略二:

 如果有比较大的硬盘,则可以将硬盘分成多个partition,如:
 partition a:100M for / (含/bin /sbin /etc /var kernel)
 partition b:64M for swap
 partition e:1000M for /usr
 partition f:500M for /home
 这样可以在重新安装系统时不损坏/home下存放的自己的文档资料。

 上面的分割策略只是一个建议,你还是需要根据自己的需要决定如何进行分区,在你安装过几次系统之后就会找到自己喜欢的分区方法了。

在得到听峰兄弟的消息后,小弟第一时间进行了实现,在我的debian上成功啦!

听峰兄弟原贴:
—————————————————
USB摄像头的兄弟们注意啦!有驱动了!

Sunplus, Etoms, Conexant, Z-star ~ Vimicro, Sonix, Zoran, IcMedia ~ TransVision

摄像头的驱动有了,
http://www.qbik.ch/usb/devices/showdr.php?id=98

作者网站
http://mxhaard.free.fr/download.html
支持硬件列表
http://mxhaard.free.fr/spca5xx.html

刚刚下载,不知是否能安装成功,系统大家同时努力,各自找到各自系统和设备的安装方法。
快去下载吧。
—————————————————


具体安装方法:
1.准备工作:确认videodev 模块是否存在 modprobe -l | grep videodev,如果没有,则如下安装之:
1.a进入linux源码目录(位置可能因人而异),以我机为例:
deb3:/datas/kernel2.6/linux-2.6.9#
1.b
如果编译过内核:
i. sed -i ‘/=m$/d’ .config
ii. vim .config
找到CONFIG_VIDEO_DEV 那行,改为 CONFIG_VIDEO_DEV=m (前面#干掉),保存
iii. make modules
iv. cp drivers/media/video/videodev.ko /lib/modules/2.6.9/kernel/drivers/media/video/
注意:1.一定要cp,不能make modules_install 2. 2.6.9 换成你的内核版本号
如果没编译过:
make menuconfig时选上
Device Drivers —-> Multimedia devices –> <> Video for Linux
2. http://mxhaard.free.fr/download.html
下载得到 spca5xx-20050109.tar.gz [当前最新]
2.解压 #tar zxvvf spca5xx-20050109.tar.gz
3.进入此目录 spca5xx-20050109 后 # make 成功后 # make install
4.看看2个驱动是否都能正常加载
modprobe videodev
modprobe spca50x

[不知为何,我进行到此步时,modprobe -l 列表为空了,用 insmod /lib/modules/..../videodev.ko 也行]
5.如果加载成功,则驱动安装部分已经完成。下面几步是安装软件gqcam
6.确认 /dev/video 是否存在,如果没有则
# mknod /dev/video c 81 0
# chmod 744 /dev/video
7.apt-get install gqcam
8.启动 gqcam ,看看成功没?(如果开始没有影像,先stop capture 再 start capture)

********************************************
说明 实现环境
PII400 128M IBM390x notepad + debian3.1 2.6.9

usb 摄像头


Bus 001 Device 004: ID 0ac8:301b Z-Star Microelectronics Corp.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0×0ac8 Z-Star Microelectronics Corp.
idProduct 0×301b
bcdDevice 1.00
iManufacturer 1 Z-Star Corp.
iProduct 2 PC Camera
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 193
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
Remote Wakeup
MaxPower 160mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0000 1x 0 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0080 1x 128 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×00c0 1x 192 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 3
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0100 1x 256 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 4
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0180 1x 384 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 5
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0200 1x 512 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 6
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0300 1x 768 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 7
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×03ff 1x 1023 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0008 1x 8 bytes
bInterval 10

Bus 001 Device 001: ID 0000:0000
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0×0000
idProduct 0×0000
bcdDevice 2.06
iManufacturer 3 Linux 2.6.9 uhci_hcd
iProduct 2 Intel Corp. 82371AB/EB/MB PIIX4 USB
iSerial 1 0000:00:02.2
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0002 1x 2 bytes
bInterval 255
Hub Descriptor:
bLength 9
bDescriptorType 41
nNbrPorts 2
wHubCharacteristic 0×000a
No power switching (usb 1.0)
Per-port overcurrent protection
bPwrOn2PwrGood 1 * 2 milli seconds
bHubContrCurrent 0 milli Ampere
DeviceRemovable 0×00
PortPwrCtrlMask 0×01

记录一下 以备不时之需 
           
default        0
timeout        5
color cyan/blue white/blue

title        Debian GNU/Linux, kernel 2.6.8-2-686
root        (hd0,0)
kernel        /boot/vmlinuz-2.6.8-2-686 root=/dev/hda1 ro
initrd        /boot/initrd.img-2.6.8-2-686
savedefault
boot

title        Debian GNU/Linux, kernel 2.6.8-2-686 (recovery mode)
root        (hd0,0)
kernel        /boot/vmlinuz-2.6.8-2-686 root=/dev/hda1 ro single
initrd        /boot/initrd.img-2.6.8-2-686
savedefault
boot


摘自http://www.linuxaid.com.cn/forum/

#
# 基于 NCSA 服务的配置文件。
#
#这是Apache服务器主要配置文件。
#它包含服务器的影响服务器运行的配置指令。
#参见以取得关于这些指令的详细信息
#
#不要只是简单的阅读这些指令信息而不去理解它。
#这里只是做了简单的说明,如果你没有参考在线文件,你就会被警告。
#

#这些配置指令被分为下面三个部分:
#1. 控制整个Apache服务器行为的部分(即全局环境变量)
#2. 定义主要或者默认服务参数的指令,也为所有虚拟主机提供默认的设置参数
#3. 虚拟主机的设置参数
#
#配置和日志文件名:如果你指定的文件名以"/"开始(win32下以"dirver:/"),
#服务器将使用绝对路径,如果文件名不是以"/"开始的,那么它将把ServerRoot
#的值附加在文件名的前面,例如,对"logs/foo.log",如果ServerRoot的值
#为"/usr/local/apache2",则该文件应为"/usr/local/apache2/logs/foo.log"
#


##第一区:全局环境参数
#
#这里设置的参数将影响整个Apache服务器的行为;
#例如Apache能够处理的并发请求的数量等。
#
#ServerRoot:指出服务器保存其配置、出错和日志文件等的根目录。
#
#注意!如果你想要将它指定为NFS或其它网络上的位置,
#请一定要去阅读与LockFile有关的文档(可能在
#)。
#这将会使你自己也能解决很多问题。
#
#路径的结尾不要添加斜线。
#
ServerRoot "/usr/loacl/apache2"

#
#串行访问的锁文件必须保存在本地磁盘上
#

#LockFile logs/accept.lock

#ScoreBoardFile:用来保存内部服务进程信息的文件。
#如果未指明(默认),记分板(scoreboard)将被保存在一个匿名的共享内存段中,
#并且它不能被第三方软件所使用。
#如果指定了,要确保不能使用两个Apache使用同一个记分板文件,
#这个记分板文件必须保存在本地磁盘上。
#

#ScoreBoardFile logs/apache_runtime_status

#
#PidFile:记录服务器启动进程号的文件。
#

PidFile logs/httpd.pid

#
#Timeout:接收和发送前超时秒数
#
Timeout 300

#
#KeepAlive:是否允许稳固的连接(每个连接有多个请求),
#设为"Off"则停用。
#
KeepAlive On

#
#MaxKeepAliveRequests:在稳固连接期间允许的最大请求数,
#设为0表示无限制接入。
#我们推荐你将其设为一个较大的值,以便提高性能
MaxKeepAliveRequests 100

#
#KeepAliveTimeout:在同一个连接上从同一台客户上接收请求的秒数
#
KeepAliveTimeout 15

##
##Server-Pool大小设定(针对MPM的)
##

# prefork MPM
# StartServers:启动时服务器启动的进程数
# MinSpareServers:保有的备用进程的最小数目
# MaxSpareServers:保有的备用进程的最大数目
# MaxClients:服务器允许启动的最大进程数
# MaxRequestsPerChild:一个服务进程允许的最大请求数

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestPerChild 0

# worker MPM
# StartServers:服务器启动时的服务进程数目
# MaxClients:允许同时连接的最大用户数目
# MinSpareThreads:保有的最小工作线程数目
# MaxSpareThreads:允许保有的最大工作线程数目
# ThreadsPerChild:每个服务进程中的工作线程常数
# MaxRequestsPerChild:服务进程中允许的最大请求数目

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

# perchild MPM
# NumServers:服务进程数量
# StartThreads:每个服务进程中的起始线程数量
# MinSpareThreads:保有的最小线程数量
# MaxSpareThreads:保有的最大线程数量
# MaxThreadsPerChild:每个服务进程允许的最大线程数
# MaxRequestsPerChild:每个服务进程允许连接的最大数量

NumServers 5
StartThreads 5
MinSpareThreads 5
MaxSpareThreads 10
MaxThreadsPerChild 20
MaxRequestsPerChild 0

# WinNT MPM
# ThreadsPerChild:服务进程中工作线程常数
# MaxRequestsPerChild:服务进程允许的最大请求数

ThreadsPerChild 250
MaxRequestsPerChild 0

# BeOS MPM
# StartThreads:服务器启动时启动的线程数
# MaxClients:可以启动的最大线程数(一个线程等于一个用户)
# MaxRequestsPerThread:每个线程允许的最大请求数

StartThreads 10
MaxClients 50
MaxRequestsPerThread 10000

# NetWare MPM
# ThreadStachSize:为每个工作线程分配的堆栈尺寸
# StartThreads:服务器启动时启动的线程数
# MinSpareThreads:用于处理实发请求的空闲线程数
# MaxSpareThreads:空闲线程的最大数量
# MaxThreads:在同一时间活动的最大线程数
# MaxRequestPerChild:一个线程服务请求的最大数量,
# 推荐将其设置为0,以实现无限制的接入

ThreadStackSize 65536
StartThreads 250
MinSpareThreads 25
MaxSpareThreads 250
MaxThreads 1000
MaxRequestPerChild 0

# OS/2 MPM
# StartServers:启动的服务进程数量
# MinSpareThreads:每个进程允许的最小空闲线程
# MaxSpareThreads:每个进程允许的最大空闲线程
# MaxRequestsPerChild:每个服务进程允许的最大连接数

StartServers 2
MinSpareThreads 5
MaxSpareThreads 10
MaxRequestsPerChild 0

#
# Listen:允许你绑定Apache服务到指定的IP地址和端口上,以取代默认值
# 参见指令
# 使用如下命令使Apache只在指定的IP地址上监听,
# 以防止它在IP地址0.0.0.0上监听
#
# Listen 12.34.56.78:80

Listen 80

#
# 动态共享支持(DSO)
#
# 为了能够使用那些以DSO模式编译的模块中的函数,你必须有相应的"LoadModule"行,
# 因此,在这里包含了这些指令,以便能在使用它之前激活。
# 那些静态编译的模块不需要在这里列出 (即以"httpd -l"列出的模块)
#
# 示例:
# LoadModule foo_module modules/mod_foo.so
#

#
# ExtendedStatus:当调用"server-status"时,控制Apache是产生"全"状态
# 信息(ExtendedStatus On),还是产生基本信息(ExtendedStatus Off)。
# 默认为off
#
# ExtendedStatus On

### 第二区:"主"服务配置
#
# 这一区建立被 "主" 服务器用的指令值,以回应那些不被
# 定义处理的任何请求。
# 这些数值也提供默认值给后面定义的容器。
# 如果中有定义,那么这里定义的指令值将被
# 中的定义所覆盖。
#

#
# 如果你想使httpd以另外的用户或组来运行,你必须在开始时以root方式启动
# 然后再将它切换为你想要使用的用户或组。
#
# User/Group:运行httpd的用户和组
# 在SCO (ODT3)上使用"User nouser"和"Group nogroup"
# 在HPUX上,你可能不能以nobody身份使用共享内存,建议创建一个www用户。
# 注意一些核心(kernel)在组ID大于60000时拒绝setgid(Group)或semctl(IPC_SET),
#节在这些系统上不要使用"Group #-1"。
#
User nobody
Group #-1

#
# ServerAdmin:你的邮件地址,当发生问题时Apache将向你发出邮件。
# 作为一个出错文档,这个地址显示在server-generated页上,
# 例如:admin@your-domain.com
#
ServerAdmin kreny@sina.com

#
# ServerName指定Apache用于识别自身的名字和端口号。
# 通常这个值是自动指定的,但是我们推荐你显式的指定它以防止启动时出错
#
# 如果你为你的主机指定了一个无效的DNS名,server-generated重定向将不能工作。
# 参见UseCanonicalName指令
#
# 如果你的主机没有注册DNS名,在这里键入它的IP地址
# 无论如何,你必须使用它的IP地址来提供服务,
# 这里使用一种容易理解的方式重定向服务
ServerName www.dalouis.com:80

#
# UseCanonicalName:决定Apache如何构造URLS和 SERVER_NAME 和 SERVER_PORT 的指令。
# 当设置为 "Off"时,Apache会使用用户端提供的主机名和端口号。
# 当设置为"On",Apache会使用ServerName指令的值。
#
UseCanonicalName Off

#
# DocumentRoot:你的文档的根目录。默认情况下,所有的请求从这个目录进行应答。
# 但是可以使用符号链接和别名来指向到其他的位置。
#
DocumentRoot "/home/redhat/public_html"

#
# Apache可以存取的每个目录都可以配置存取权限(包括它的子目录)。
#
# 首先,我们配置一个高限制的特征。

# 这将禁止访问文件系统所在的目录,并添加你希望允许访问的目录块。
# 如下所示

Order Deny,Allow
Deny from all

#
# 注意从这里开始你一定要明确地允许哪些特别的特征能够被使用。
# – 所以,如果Apache没有象你所期待的那样工作的话,
# 请检查你是否在下面明确的指定它可用。
#

#
# 这将改变到你设置的DocumentRoot
#

#
# Options:这个指令的值可以是"None","All",或者下列选项的任意组合:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# 注意,"MultiViews"必须被显式的指定,"Options All"不能为你提供这个特性。
#
# 这个指令既复杂又重要,请参见
#"http://httpd.apache.org/docs-2.0/mod/core.html#optioins"以取得更多的信息。
#
Options FollowSymLinks

#
# AllowOverride控制那些被放置在.htaccess文件中的指令。
# 它可以是"All","None",或者下列指令的组合:
# Options FileInfo AuthConfig Limit
#
AllowOverride None

#
# 控制谁可以获得服务。
#
Order allow,deny
Allow from all

#
# UserDir:指定在得到一个~user请求时将会添加到用户home目录后的目录名。
#

UserDir public_html

# 为防止在UserDir指令上的漏洞,对root用户设置
# 象"./"这样的UserDir是非常有用的。
# 如果你使用Apache 1.3或以上版本,我们强烈建议你
# 在你的服务器配置文件中包含下面的行

UserDir disabled root

#
# 下面是一个使用UserDir指令使一个站点的目录具有只读属性的示例:
#
#
# AllowOverride FileInfo AuthConfig Limit Indexes
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludeNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#

#
# DirectoryIndex:定义请求是一个目录时,Apache向用户提供服务的文件名
#
# index.html.var文件(一个类型映象文件)用于提供一个文档处理列表,
# 出于同样的目的,也可以使用MultiViews选项,但是它会非常慢。
#
DirectoryIndex index.php index.html index.html.var

#
# AccessFileName:在每个目录中查询为目录提供附加配置指令的文件的文件名。
# 参见AllowOverride指令。
#
AccessFileName .htaccess

#
# 下面的行防止.htaccess和.htpasswd文件被Web客户查看。
#

Order allow,deny
Deny from all

#
# Typeconfig:定义在哪里查询mime.types文件。
#
TypeConfig conf/mime.types

#
# DefaultType:定义当不能确定MIME类型时服务器提供的默认MIME类型。
# 如果你的服务主要包含text或HTML文档,"text/plain"是一个好的选择;
# 如果大多是二进制文档,诸如软件或图像,你应使用
# "application/octer-stream"来防止浏览器象显示文本那样显示二进制文件。
#
DefaultType text/plain

#
# mod_mime_magic允许服务器从自己定义自己类型的文件中使用不同的线索(hints),
# 这个MIMEMagicFile指令定义hints定义所在的文件。
#

MIMEMagicFile conf/magic

#
# HostnameLookups:指定记录用户端的名字还是IP地址,例如,本指令为on时
# 记录主机名,如www.apache.org;为off时记录IP地址,204.62.129.132。
# 默认值为off,这要比设为on好得多,因为如果设为on则每个用户端请求都将会
# 至少造成对 nameserver 进行一次查询。
#
HostnameLookups Off

#
# EnableMMAP:控制是否进行内存转储(如果操作系统支持的话)。
# 默认为on,如果你的服务器安装在网络文件系统上(NFS),请关闭它。
# 在一些系统上,关闭它会提升系统性能(与文件系统类型无关);
# 具体情况请参阅http://httpd.apache.org/docs-2.0/mod/core.html#enablemmap
#
# EnableMMAP off

#
# EnableSendfile:控制是否使用sendfile kernel支持发送文件
# (如果操作系统支持的话)。默认为on,如果你的服务器安装在网络文件系统
# (NFS)上,请你关闭它。
# 参见http://httpd.apache.org/docs-2.0/mod/core.html#enablesendfile
#
# EnableSendfile off

#
# ErrorLog:错误日志文件定位。
# 如果你没有在内定义ErrorLog指令,这个虚拟主机的错误信息
# 将记录在这里。如果你在那儿定义了ErrorLog,这些错误信息将记录在你所
# 定义的文件里,而不是这儿定义的文件。
#
ErrorLog logs/error_log

#
# LogLevel:控制记录在错误日志文件中的日志信息数量。
# 可能的值包括:debug,info,notice,warn,error,crit,alert,emerg。
#
LogLevel warn

#
# 下面的指令为CustomLog指令定义格式别名。
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# 你需要安装了mod_logio.c模块才能使用%I和%O。
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

#
# 指定接入日志文件的定位和格式(一般日志格式)。
# 如果你没有在内定义这个指令,传输信息将记录在这里,
# 如果你定义了这个指令,则记录在你指定的位置,而不是这儿定义的位置。
#
CustomLog logs/access_log common

#
# 如果你想要记录agent和referer信息,可以使用下面的指令
#
# CustomLog logs/referer_log referer
# CustomLog logs/agent_log agent

#
# 如果你想要使用一个文件记录access,agent和referer信息,
# 你可以如下定义这个指令:
#
# CustomLog logs/access_log combined

#
# ServerTokens
# 这个指令定义包含在HTTP回应头中的信息类型。默认为"Full",
# 这表示在回应头中将包含模块中的操作系统类型和编译信息。
# 可以设为列各值中的一个:
# Full | OS | Minor | Minimal | Major | Prod
# Full传达的信息最多,而Prod最少。
#
ServerTokens Full

#
# 随意的添加包含服务器版本和虚拟主机名字一行信息到server-generated输出页中
# (内部错误文档,FTP目录列表,mod_status和mod_info输出等等,除了CGI错误
# 或自定义的错误文档以外)。
# 设为"EMail"将包含一个指向ServerAdmin的mailto:连接。
# 可以为如下值:On | Off | EMail
#
ServerSignature On

#
# Aliases:在这时添加你需要的别名,格式如下:
# Alias 别名 真实名
#
# 注意,如果你在别名的未尾包含了"/",那么在URL中也需要包含"/"。
# 因此,"/icons"不是这个示例中的别名。
# 如果别名中以"/"结尾,那么真实名也必须以"/"结尾,
# 如果别名中省略了结尾的"/",那么真实名也必须省略。
#
# 我们使用别名"/icons/"来表示FancyIndexed目录列表,如果你不使用、
# FancyIndexing,你可以注释掉它。
#
# Alias /icons/ "/usr/local/apache2/icons/"

#
# Options Indexes MultiViews
# AllowOverride None
# Order allow,deny
## Allow from all
#

#
# 这将改变ServerRoot/manual。这个别名提供了手册页所在的位置,
# 即使你改变了你的DocumentRoot。如果你对有无手册页并不在意的话,
# 你可以注释掉它。
#
Alias /manual "/usr/loacl/apache2/manual"

Options Indexes FollowSymLinks MultiViews IncludesNoExec
AddOutputFilter Includes html
Order allow,deny
Allow from all

#
# ScriptAlias:指定包含服务脚本的目录。
# ScriptAliases 本质上与Aliases一样,除了这里的文档在请求时做为程序处理处理以外。
# 尾部的"/"规则与Alias一样
#
ScriptAlias /cgi-bin/ "/usr/loacl/apache2/cgi-bin/"

# 这里是添加php 4支持的指令
AddType application/x-httpd-php .php
LoadModule php4_module modules/libphp4.so

#
# 添加mod_cgid.c设置,mod_cgid提供使用cgid进行通讯的UNIX套接字的
# 脚本接口路径。
#
# Scriptsock logs/cgisock

#
# 将"/usr/local/apache2/cgi-bin"改为你的ScriptAliased指定的CGI目录,
# 如果你配置了的话。
#

AllowOverride None
Options None
Order allow,deny
Allow from all

#
# Redirect允许你告诉客户端使用存在于服务器名字空间中的文档,
# 而不是现在的,这帮助客户定位那些改变了位置的文档。
# 例如:
# Redirect permanent /foo http://www.example.com/bar

#
# 控制server-generated目录列表显示的指令
#

#
# IndexOptions:控制server-generated目录列表显示特征。
#
IndexOptions FancyIndexing VersionSort

#
# AddIcon* 指令告诉服务器不同扩展名的图象文件如何显示,
# 只适用于FancyIndexed指令
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

#
# DefaultIcon 为那些没有显式定义图标的文件提供处理
#
DefaultIcon /icons/unknown.gif

#
# AddDescription允许你在server-generated索引后放置一个简短的说明。
# 只对FancyIndexed指令有效。
# 格式:AddDescription "说明" 文件名
#
# AddDescription "GZIP compressed document" .gz
# AddDescription "tar archive" .tar
# AddDescription "GZIP compressed tar archive" .tgz

#
# ReadmeName指定服务器默认查找的README文件的名字,并添加到目录列表中
#
# HeaderName指定目录列表前缀文件的文件名
ReadmeName README.html
HeaderName HEADER.html

#
# IndexIgnore指定目录索引忽略并且不包含在列表中的文件名集合,
# 支持shell类型的通配符。
#
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

#
# AddEncoding允许你在信息传送中使用(Mosaic/X 2.1+)解压缩信息,
# 注意:不是所有的浏览器都支持这个选项。
# 尽管名字相似,但是下列的指令与上面的FancyIndexing定制指令不同。
#
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz

#
# DefaultLanguage和AddLanguage允许你指定文档的语言。
# 这使你可以让用户用容易理解的语言浏览文档。
#
# 指定默认的语言,这意味着所有没有指定语言的包都将使用该语言。
# 多数情况下,你也许并不想设置它,除非你确信这样做是正确的。
# 通常,不使用确定的语言比使用错误的语言要好。
#
# DefaultLanguage nl
#
# 注意1:作为语言关键字的词缀毫无疑问是不能一样的–采用波兰
# 文的文档(网络标准语言代码是pl)将希望使用"AddLanguage pl .po"
# 来避免与perl脚本的一般词缀产生二义性。
#
# 注意2: 下面的例子举例说明在一些范例中语言的二字符缩写与它的国家
# 的二字符缩写不相同,例如 "Danmark/dk" 和 "Danmark/da" 的比较.
#
# 注意3: 在 "ltz" 的情况下我们使用三字符词缀,违犯了 RFC的规定,
# 运行中将修复它并使用RFC1766标准取得参考数据。
#
# Danish (da) – Dutch (nl) – English (en) – Estonian (et)
# French (fr) – German (de) – Greek-Modern (el)
# Italian (it) – Norwegian (no) – Norwegian Nynorsk (nn) – Korean (ko)
# Portugese (pt) – Luxembourgeois* (ltz)
# Spanish (es) – Swedish (sv) – Catalan (ca) – Czech(cz)
# Polish (pl) – Brazilian Portuguese (pt-br) – Japanese (ja)
# Russian (ru) – Croatian (hr)
#
AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .et
AddLanguage fr .fr
AddLanguage de .de
AddLanguage he .he
AddLanguage el .el
AddLanguage it .it
AddLanguage ja .ja
AddLanguage pl .po
AddLanguage ko .ko
AddLanguage pt .pt
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pt-br .pt-br
AddLanguage ltz .ltz
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .sv
AddLanguage cz .cz
AddLanguage ru .ru
AddLanguage tw .tw
AddLanguage zh-tw .tw
AddLanguage hr .hr

# LanguagePriority允许你在会话过程中优先使用一些语言。
#
# 以优先次序递减的方式列出它们。我们或多或少地采用按字母排列顺序的方式
# 排列它们。也许你想要改变这个顺序。
LanguagePriority en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv tw

#
# ForceLanguagePriority 允许你为MULTIPLE CHOICES(Prefer)[在通讯的情况下]
# 或NOT ACCEPTABLE(Fallback)[没有可接受的语言匹配的情况]提供一个结果页。
#
ForceLanguagePriority Prefer Fallback

#
# 为发送出的所有页指定默认的字符集,这总是一个好主意,并且为你的
# web站点的国际化打开了大门,这不正是你曾经想要的吗。同样地,指定
# 默认字符集有一些小的损害,如一个使用iso-8859-1(latin1)标准命令
# 的页面,除非以别的方式指定例如你仅仅以显式方式声明它。
# 也有一些与那些总是鼓励你使用默认字符集的javascropt和URL语法有关
# 的浏览器安全原因。
#
#AddDefaultCharset ISO-8859-1
AddDefaultCharse GB2312

#
# 一般以文件扩展名的方式使用字符集。也许你想要避免与语言扩展发生
# 碰撞,除非你在每次改变后都做了很好的测试。
# 参见http://www.iana.org/assignments/character-sets以取得字符集
# 的名字列表和它们各自的RFCs。
#
AddCharset ISO-8859-1 .iso8859-1 .latin1
AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen
AddCharset ISO-8859-3 .iso8859-3 .latin3
AddCharset ISO-8859-4 .iso8859-4 .latin4
AddCharset ISO-8859-5 .iso8859-5 .latin5 .cyr .iso-ru
AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb
AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk
AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb
AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk
AddCharset ISO-2022-JP .iso2022-jp .jis
AddCharset ISO-2022-KR .iso2022-kr .kis
AddCharset ISO-2022-CN .iso2022-cn .cis
AddCharset Big5 .Big5 .big5
# 对于俄语,使用了多个字符集(如何使用主要依靠客户端):
AddCharset WINDOWS-1251 .cp-1251 .win-1251
AddCharset CP866 .cp866
AddCharset KOI8-r .koi8-r .koi8-ru
AddCharset KOI8-ru .koi8-uk .ua
AddCharset ISO-10646-UCS-2 .ucs2
AddCharset ISO-10646-UCS-4 .ucs4
AddCharset UTF-8 .utf8

# 下面的字符集没有映射到一个特定的标准(iso)上,但是它们在浏览器
# 中被广泛的支持。注意那些大写字母。
# (它不应该,但是它是为兼容一些浏览器而做)
#
# 参见http://www.iana.org/assianments/character-sets以取得
# 它们的列表。但是浏览器支持较少。
#
AddCharset GB2312 .gb2312 .gb
AddCharset utf-7 .utf7
AddCharset utf-8 .utf8
AddCharset big5 .big5 .b5
AddCharset EUC-TW .euc-tw
AddCharset EUC-JP .euc-jp
AddCharset EUC-KR .euc-kr
AddCharset shift_jis .sjis

#
# AddType允许你为指定的文件类型添加或覆盖mime.types文件中配置的MIME
#
AddType application/x-tar .tgz
AddType image/x-icon .ico

#
# AddHandler允许你映射确定的文件扩展名到"handlers":
# 与文件类型无关的行为。这既能编译到服务器中也可以添加到Action指令
# 中(看下面)。
# 为了在ScriptAliased指令指定的以外使用CGI脚本:
#(要使它可用,你还需要在Options中添加"ExecCGI"。
#
# AddHandler cgi-script .cgi

#
# 对于那些包含他们自己的HTTP头的文件
#
# AddHandler send-as-is asis

#
# 对于server-parsed imagemap文件:
#
# AddHandler imap-file map

#
# agemap 文件:
#
#AddHandler imap- 文件映像

#
# 对于类型映像:(转移资源)
#(这是默认的设定以允许Apache的"It Worked"页能多种语言分发)。
#
AddHandler type-map var

#
# 过滤器允许你在将它发送到客户端前进行处理。
#
# 为了在服务器端分析包含(SSI)的.shtml文档:
# (要执行这个指令,你还需要在Options指令中添加"Includes"。)
#
# AddType text/html .shtml
# AddOutputFilter INCLUDES .shtml

#
# Action让你定义当调用匹配的媒体文件时将要执行的脚本。这将减少
# 那些经常使用的CGI脚本的URL路径名的重复输入。
# 格式:Action media/type /cgi-script/location
# 格式:Action handler-name /cgi-script/location
#

#
# 可配置的错误应答有三种风格:
# 1)plain text 2)local redirects 3) external redirects
#
# 一些示例:
# ErrorDocument 500 "The server made a boo boo."
# ErrorDocument 404 /missing.html
# ErrorDocument 404 "/cgi-bin/missing_handler.pl"
# ErrorDocument 402 http://www.example.com/subscription_info.html
#

#
# 综合应用这些指令,我们可以创建一个国际化的出错应答。
#
# 我们使用Alias来重定向任意/error/HTTP_.html.var应答到
# 我们的多语言错误消息集合。使用正确的文本替代它。
#
# 通过加入下面的行,你就能够改变这些消息的显示,而不必改变
# HTTP_.html.var文件。
#
# Alias /error/include/ "/your/include/path/"
#
# 以将/usr/local/apache2/error/include/下的文件拷贝到/your/inclue/path/下
# 开始,你可以创建你自己的文件集合,甚至是其于每个虚拟主机的。
# 不管你的ServerSignature如何设置,默认的包含文件将显示你的
# Aapche版本号和你的ServerAdmin邮件地址
#
# 国际化的错误文档需要mod_alias,mod_include和mod_negotiation三个
# 模块。要激活它们,取消下面30行的注释符号

# Alias /error/ "/usr/local/apache2/error/"
#
#
# AllowOverride None
# Options IncludesNoExec
# AddOutputFilter Includes html
# AddHandler type-map var
# Order allow,deny
# Allow from all
# LanguagePriority en de es fr it nl sv
# ForceLanguagePriority Prefer Fallback
#
#
# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
ErrorDocument 403 /error.php
# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
# ErrorDocument 410 /error/HTTP_GONE.html.var
# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
# ErrorDocument 415 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var

#
# 下面的命令更改标准的HTTP应答行为以处理己知的浏览器问题。
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

#
# 下面命令关闭对那些没有尾部"/"的目录的非GET请求的重定向,
# 这些命令修复了微软的采用DAV方法不能正确处理重定向的WEB文件夹的问题。
# Apple下的DAV文件系统和Gnome下的VFS对DAV的支持也是采用这样的方法
# 进行处理的。
#
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
BrowserMatch "^gnome-vfs" redirect-carefully

#
# 允许你使用URL:http://servername/server-status来通过mod_status生
# 成并报告服务器状态信息。改变.example.com为你自己的域名。
#
#
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .example.com
#

#
# 允许使用URL:http://servername/server-info来远程报告服务器配置信息
# (需要mod_info.c支持)。改变".example.com"为你自己的域名。
#
#
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .example.com
#

#
# 代理服务器命令,去掉下面的行使代理服务可用。
#
#
# ProxyRequests On
#
# Order deny,allow
# Deny from all
# Allow from .example.com
#

#
# 安装或关闭HTTP/1.1"通道"头处理。
# ("Full"添加服务器版本信息,"Block"移掉所有输出"通道"头信息。
# 可以设为下面各选项之一:Off | On | Full | Block
#
# ProxyVia On

# 最好为代理服务安装高速缓冲,去掉下面几行的注释符号:
# (没有CacheRoot则不缓冲)
#
# CacheRoot "/usr/local/apache2/proxy"
# CacheSize 5
# CacheGcInterval 4
# CacheMaxExpire 24
# CacheLastModifiedFactor 01
# CacheDefaultExpire 1
# NoCache a-domain.com another-domain.edu joes.garage-sale.com

#
# 代理命令结束。

#
# 附加的特定模块配置。
#

Include conf/ssl.conf

## 第三区:虚拟主机
#
# VirtualHost:你可以通过设置虚拟主机容器以实现在你的主机上保有多个
# 域名/主机名。大多数配置信息只使用基于名字的虚拟主机,因此服务器
# 不必担心IP地址的问题,下面的命令以*号代替虚拟主机名。
#
# 在你试着配置你的虚拟主机以前,请参见
# URL:http://httpd.apache.org/docs-2.0/vhosts/>以取得更多的信息。
#
# 你可以使用命令行选项"-S"来检验你的虚拟主机配置。

#
# 使用基于名字的虚拟主机。
#
# NameVirtualHost *

#
# 虚拟主机示例:
# 几乎所有的Apache命令都可以在虚拟主机容器中使用。
# 第一个虚拟主机区是用于向服务名未知的请求进行应答的配置。
#
#
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log commom
#