RomKK
关注java技术!

RedHat linux inittab详解

一、什么是init
    init是Linux系统操作中不可缺少的程序之一。 是一个由内核启动的用户级进程。
内核启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式来启动其他用户级的进程或服务。所以,init始终是第一个进程(其PID始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
二、运行级别
    运行级就是操作系统当前正在运行的功能级别。这个级别从1到6,具有不同的功能。其功能级别如下:
# 0 - 停机(千万不能把initdefault 设置为0 )
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 - 没有用到
# 5 - X11 (xwindow)
# 6 - 重新启动 (千万不要把initdefault 设置为6——把被你黑掉的linux的initdefault设置为0或6也算是拒绝服务攻击噢!)
除此之外还有ABC三个运行级别,但在RHLinux中都没有意义。
这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)
三、运行级别的配置
    运行级别的配置是在/etc/inittab行内进行的,如下所示:
12 : 2 : wait : / etc / init.d / rc 2
各字段解释如下:
id:runlevels:action:process
  id:是一个任意指定的四个字符以内的序列标号,在本文件内必须唯一;使用老版本的libc5(低于5.2.18)或a.out库编译出来的 sysvinit限制为2字符。注意:像getty之类的登陆进程必须使id字段与tty编号一致,如tty1需要id=1,许多老版本的登陆进程都遵循这种规则。
  runlevels:表示这一行适用于运行那个/些级别(这里是2,可以有多个,表示在相应的运行级均需要运行);另外sysinit、boot、bootwait这三个进程会忽略这个设置值。
  action:表示进入对应的runlevels时,init应该运行process字段的命令的方式,常用的字段值及解释在附录内。例子中的wait表示需要运行这个进程一次并等待其结束。
  process:具体应该执行的命令。例子中的/etc/init.d/rc命令启动运行级别2中应该运行的进程/命令,并负责在退出运行级时将其终止(当然在进入的runlevel中仍要运行的程序除外。)
当运行级别改变,并且正在运行的程序并没有在新的运行级别中指定需要运行,那么init会先发送一个SIGTERM 信号终止,然后是SIGKILL。
有效的action值如下:
  respawn:表示init应该监视这个进程,即使其结束后也应该被重新启动。
  wait:   init应该运行这个进程一次,并等待其结束后再进行下一步操作。
  once:   init需要运行这个进程一次。
  boot:   随系统启动运行,所以runlevel值对其无效。
  bootwait:随系统启动运行,并且init应该等待其结束。
  off:     没有任何意义。
  initdefault:系统启动后的默认运行级别;由于进入相应的运行级别会激活对应级别的进程,所以对其指定process字段没有任何意义。如果inittab文件内不存在这一条记录,系统启动时在控制台上询问进入的运行级。
  sysinit:  系统启动时准备运行的命令。比如说,这个命令将清除/tmp。可以查看/etc/rc.d/rc.sysinit脚本了解其运行了那些操作。
  powerwait:允许init在电源被切断时,关闭系统。当然前提是有U P S和监视U P S并通知init电源已被切断的软件。RH linux默认没有列出该选项。
  powerfail:  同powerwait,但init不会等待正在运行的进程结束。RH linux默认没有列出该选项。
  powerokwait:当电源监视软件报告“电源恢复”时,init要执行的操作。
  powerfailnow:检测到ups电源即将耗尽时,init要执行的操作,和powerwait/powerfail不同的哟。
  ctrlaltdel:允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。我是设置成打印一句骂人的话了^o^。
  kbrequest:监视到特定的键盘组合键被按下时采取的动作,现在还不完善。
  ondemand:A process marked with an ondemand runlevel will be executed whenever the specified ondemand runlevel is called.  However, no runlevel change will occur (ondemand runlevels are ‘a’, ‘b’,and ‘c’),(英语太菜,那个however不知道该怎么翻译才好。惭愧!)
     补充:
   1、关于进入单用户模式,一般都是采用设置initdefault为1或者在grub/lilo中指定一个“single”或“emergency” 命令行参数来实现。其实另外还有一个更干净的方法,编辑:
kernel /vmlinuz-2.6.9-22.EL ro root=/bin/sh,这样init就直接启动一个shell,其他任何进程都没有启动哦,够干净吧!
   2、系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。
posted @ 2007-07-24 22:43 RomKK 阅读(231) | 评论 (0) | 编辑 收藏
 
配置一个安全的Linux DHCP服务器

DHCP是动态主机配置协议.这个协议用于向计算机自动提供IP地址,子网掩码和路由信息。网络管理员通常会分配某个范围的 IP 地址来分发给局域网上的客户机。当设备接入这个局域网时,它们会向 DHCP 服务器请求一个 IP 地址。然后 DHCP 服务器为每个请求的设备分配一个地址,直到分配完该范围内的所有 IP 地址为止。已经分配的 IP 地址必须定时地延长借用期。这个延期的过程称作 leasing,确保了当客户机设备在正常地释放 IP 地址之前突然从网络断开时被分配的地址可以归还给服务器。本文以Redhat Linux 9.0为例,介绍如何建立一个完整和安全的DHCP服务器。
一、建立DHCP服务器配置文件
可以使用Redhat Linux 9.0自身携带rpm包安装。安装结束后, DHCP 端口监督程序 dhcpd 配置文件是 /etc 目录中的名为 dhcpd.conf 的文件。下面手工建立/etc/dhcpd.conf文件。/etc/dhcpd.conf通常包括三部分:parameters、declarations 、option。
1. DHCP配置文件中的parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户。主要内容见表1:
参数 解释
ddns-update-style 配置DHCP-DNS 互动更新模式。
default-lease-time 指定确省租赁时间的长度,单位是秒。
max-lease-time 指定最大租赁时间长度,单位是秒。
hardware 指定网卡接口类型和MAC地址。
server-name 通知DHCP客户服务器名称。
get-lease-hostnames flag 检查客户端使用的IP地址。
fixed-address ip 分配给客户端一个固定的地址。
authritative 拒绝不正确的IP地址的要求。
2. DHCP配置文件中的declarations (声明):用来描述网络布局、提供客户的IP地址等。主要内容见表2:
声明 解释
shared-network 用来告知是否一些子网络分享相同网络。
subnet 描述一个IP地址是否属于该子网。
range 起始IP 终止IP 提供动态分配IP 的范围。
host 主机名称 参考特别的主机。
group 为一组参数提供声明。
allow unknown-clients ﹔deny unknown-client 是否动态分配IP给未知的使用者。
allow bootp;deny bootp 是否响应激活查询。
allow booting﹔deny booting 是否响应使用者查询。
filename 开始启动文件的名称,应用于无盘工作站。
next-server 设置服务器从引导文件中装如主机名,应用于无盘工作站。
 
3. DHCP配置文件中的option(选项):用来配置DHCP可选参数,全部用option关键字作为开始,主要内容包括见表3:
选项 解释
subnet-mask 为客户端设定子网掩码。
domain-name 为客户端指明DNS名字。
domain-name-servers 为客户端指明DNS服务器IP地址。
host-name 为客户端指定主机名称。
routers 为客户端设定默认网关。
broadcast-address 为客户端设定广播地址。
ntp-server 为客户端设定网络时间服务器IP地址。
time-offset 为客户端设定和格林威治时间的偏移时间,单位是秒。
注意:如果客户端使用的是视窗操作系统,不要选择“host-name”选项,即不要为其指定主机名称。
下面是一个笔者使用的DHCP配置文件,这是一个C类网络,共126个IP地址可以分配的例子。读者可以复制后使用,注意红色部分是必须要修改的。
ddns-update-style interim;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.254;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option domain-name-servers 192.168.1.3;
option domain-name "www.cao.com"; #DNS名称#
option domain-name-servers 192.168.1.3;
option time-offset -18000;
range dynamic-bootp 192.168.1.128 192.168.1.255;
default-lease-time 21600;
max-lease-time 43200;
host ns {
hardware ethernet 52:54:AB:34:5B:09;#运行DHCP的网络接口的MAC地址#
fixed-address 192.168.1.9;
}
}
二、建立客户租约文件
运行DHCP服务器还需要一个名为 dhcpd.leases 的文件,保持所有已经分发出去的 IP 地址。在Redhat Linux 发行版本中,该文件位于 /var/lib/dhcp/ 目录中。如果您通过 RPM 安装 ISC DHCP,那么该目录应该已经存在。dhcpd.leases的文件格式为:
Leases address {statement}
一个典型的文件内容如下:
lease 192.168.1.255 { #DHCP服务器分配的IP地址#
starts 1 2005/05/02 03:02:26; # lease 开始租约时间#
ends 1 2005/05/02 09:02:26; # lease 结束租约时间#
binding state active;
next binding state free;
hardware ethernet 00:00:e8:a0:25:86; #客户机网卡MAC地址#
uid "\001\000\000\350\240%\206"; #用来验证客户机的UID标示#
client-hostname "cjh1"; #客户机名称#
}
注意lease 开始租约时间和lease 结束租约时间是格林威治标准时间(GMT),不是本地时间。
第一次运行DHCP服务器时dhcpd.leases是一个空文件,也不用手工建立。如果不是通过 RPM 安装 ISC DHCP,或者 dhcpd 已经安装,那么您应该试着确定 dhcpd 将其 lease 文件写到何处,并确保该文件存在。也可以手工建立一个空文件:
#touch /var/lib/dhcp/dhcpd.leases
三、启动和检查DHCP服务器
使用命令启动DHCP服务器:
#service dhcpd start
使用ps命令检查dhcpd进程:
#ps -ef | grep dhcpd
root 2402 1 0 14:25 ? 00:00:00 /usr/sbin/dhcpd
root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd
使用检查dhcpd运行的端口:
# netstat -nutap | grep dhcpd
udp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd

四、配置DHCP客户端
通常网管员使用选择手工配置 DHCP 客户,需要修改 /etc/sysconfig/network 文件来启用联网;并修改 /etc/sysconfig/network-scripts 目录中每个网络设备的配置文件。在该目录中,每个设备都有一个叫做 ifcfg-eth? 的配置文件,eth?是网络设备的名称。 如eth0等。如果你想在引导时启动联网,NETWORKING 变量必须 被设为 yes。 除了此处之外/etc/sysconfig/network 文件应该包含以下行:
NETWORKING=yes
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
五、DHCP配置常见错误排除
通常配置DHCP 服务器很容易,不过,在这里有一些技巧可以帮助您避免出现问题。对服务器而言,要确保网卡正常工作,并具备广播功能。对客户机而言,还要确保客户机的网卡正常工作。最后,要考虑网络的拓扑,并考虑客户机向 DHCP 服务器发出的广播消息是否会受到阻碍。另外如果dhcpd进程没有启动,那么可以浏览 syslog 消息文件来确定是哪里出了问题。这个消息文件通常是 /var/log/messages。
典型故障:
1.DHCP服务器配置完成,没有语法错误。但是网络中的客户机却没办法取得IP地址。
通常是Linux DHCP服务器沒有办法接收來自255.255.255.255 的 DHCP 客户机的Request 封包造成的。一般是Linux DHCP服务器的网卡没有设置具有MULTICAST功能。为了让dhcpd(dhcp程序的守护进程)能够正常的和DHCP客户机沟通,dhcpd必须传送封包到255.255.255.255这个IP地址,但是有些Linux系统里255.255.255.255这个IP地址被用来做为监听区域子网域(local subnet)广播的 IP地址,所以需要在路由表(routing table)里加入255.255.255.255以激活MULTICAST功能;
使用命令:
route add -host 255.255.255.255 dev eth0
如果报告错误消息:255.255.255.255:Unkown host
那么请先修改/etc/hosts加入一行:
255.255.255.255 dhcp
2. DHCP客户端程序和DHCP服务器不兼容
由于Linux有许多发现版本,不同版本使用DHCP客户端程序和DHCP服务器也不相同。Linux提供了四种DHCP客户端程序:pump, dhclient, dhcpxd, 和dhcpcd。了解不同Linux发行版本的服务器端和客户端程序对于常见错误排除是必要的。笔者曾经遇到过使用SuSE Linux 9.1 DHCP服务器和使用Mandrake Linux 9.0客户机不兼容的情况。此时就必须更换客户端程序。方法是先停止客户机的网络服务,卸载原程序,安装和服务器端兼容程序。附表:主要Linux发行版使用的DHCP客户端。
发行版本
缺省 DHCP客户端 可选 DHCP 客户端 DHCP客户端启动
脚本 附加配置文件
Red Hat Linux 9.0 dhclient 无 /sbin/ifup /etc/sysconfig/network,
/etc/sysconfig/network-scripts/ifcfg-eth0
Debian Linux 3.0 dhclient 无 /sbin/ifup /etc/network/interfaces,
/etc/dhclient.conf
Mandrake Linux 9.1 dhclient dhcpcd, dhcpxd, pump /sbin/ifup /etc/sysconfig/network,
/etc/sysconfig/network-scripts/ifcfg-eth0,
/etc/dhclient-eth0.conf
SuSE Linux 9.1 dhcpcd dhclient /sbin/ifup-dhcp /etc/sysconfig/network/dhcp,
/etc/sysconfig/network/ifcfg-eth0
六、DHCP服务器的安全
1. 在指定网络接口启动DHCP服务器
如果你的Linux系统连接了不止一个网络界面,但是你只想让 DHCP 服务器启动其中之一,你可以配置 DHCP 服务器只在那个设备上启动。在 /etc/sysconfig/dhcpd 中,把界面的名称添加到 DHCPDARGS 的列表中:
DHCPDARGS=eth0
或者直接使用命令:
Echo “DHCPDARGS=eth0”>> /etc/ sysconfig/dhcpd
这样对于带有两个网卡的防火墙机器,更加安全:一个网卡可以被配置成 DHCP 客户来从互联网上检索 IP 地址;另一个网卡可以被用作防火墙之后的内部网络的 DHCP 服务器。仅指定连接到内部网络的网卡使系统更加安全,因为用户无法通过互联网来连接它的守护进程。
2. 让DHCP服务器在监牢中运行
所谓“监牢”就是指通过chroot机制来更改某个软件运行时所能看到的根目录,即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。这样即使出现被破壞或被侵入,所受的損傷也较小。
将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为chroot jail(chroot“监牢”)。如果要在“监牢”中运行dhcpd,而事实上根本看不到文件系统中那个真正的目录。因此需要事先创建目录,并将dhcpd复制到其中。同时dhcpd需要几个库文件,可以使用ldd(library Dependency Display缩写)命令,ldd作用是显示一个可执行程序必须使用的共享库。
ldd dhcpd
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
这意味着还需要在“监牢”中创建lib目录,并将库文件复制到其中。手工完成这一工作是非常麻烦的,此时可以用jail软件包来帮助简化chroot“监牢”建立的过程。
(1)Jail软件的编译和安装
Jail官方网站是:http://www.jmcresearch.com/ ,最新版本:1.9a。
#Wget http://www.jmcresearch.com/static/dwn/projects/jail/jail_1.9a.tar.gz
#tar xzvf jail.tar.gz ;cd jail/src
#make; make install
(2)用jail创建监牢
jail软件包提供了几个Perl脚本作为其核心命令,包括mkjailenv、addjailuser和addjailsw。
mkjailenv:创建chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。addjailsw:从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。addjailuser:创建新的chroot“监牢”用户。
首先停止目前dhcpd服务,然后建立chroot目录:
#/sbin/service dhcpd start
#mkjailenv /chroot/
mkjailenv
A component of Jail (version 1.9 for linux)
http://www.gsyc.inf.uc3m.es/~assman/jail/
Juan M. Casillas
Making chrooted environment into /chroot
Doing preinstall()
Doing special_devices()
Doing gen_template_password()
Doing postinstall()
Done.
下面的例子展示为“监牢”添加dhcpd程序的过程
# addjailsw /chroot/ -P /usr/sbin/dhcpd
addjailsw
A component of Jail (version 1.9 for linux)
http://www.gsyc.inf.uc3m.es/~assman/jail/
Juan M. Casillas
Guessing dhcpd args(0)
Warning: file /chroot//lib/tls/libc.so.6 exists. Overwritting it
Warning: file /chroot//lib/ld-linux.so.2 exists. Overwritting it
………
Done.
不用在意那些警告信息,因为jail会调用ldd检查dhcpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。接下来将dhcpd的相关文件拷贝到“监牢”中:
# mkdir -p /chroot/dhcp/etc
# cp /etc/dhcpd.conf /chroot/dhcp/etc/
# mkdir -p /chroot/dhcp/var/state/dhcp
# touch /chroot/dhcp/var/state/dhcp/dhcp.leases
此时的“监牢”目录结构见图1。
图1 “监牢”目录结构
重新启动dhcpd:
[root@www root]# /chroot/usr/sbin/dhcpd
使用ps命令检查dhcpd进程:
#ps -ef | grep dhcpd
root 2402 1 0 14:25 ? 00:00:00 /chroot/usr/sbin/dhcpd
root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd
注意此时进程名称已经改变,使用检查dhcpd运行的端口:
# netstat -nutap | grep dhcpd
udp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd
端口号没有改变。现在dhcpd已经成功运行在“监牢”中。
到此为止一个这样,一个完整和安全的 DHCP服务器就完成了。


posted @ 2007-07-24 22:42 RomKK 阅读(339) | 评论 (0) | 编辑 收藏
 
Linux快速构建apache web服务器

Apache服务器的最新稳定发布版本是httpd-2.2..0,官方下载地址是:http://httpd.apache.org/download.cgi。我们通过下面的步骤来快速的搭建一个web服务器。
1、    下载源码文件httpd-2.2.0.tar.gz 到linux服务器的某个目录。
2、    解压文件 # tar zxvf httpd-2.2.0.tar.gz .
3、    配置 # ./configure –refix=/usr/local/apache //指定安装目录,以后要删除安装就只需删除这个目录。
4、    编译和安装。 # make ; make install .
5、    编写启动脚本,把它放到目录 /etc/rc.d/init.d/里,这里取名为httpd,其内容如下:
  #!/bin/bash
#description:http server
#chkconfig: 235 98 98
case "$1" in
  start)
      echo "Starting Apache daemon..."
      /usr/local/apache2/bin/apachectl -k start
      ;;
  stop)
      echo "Stopping Apache daemon..."
      /usr/local/apache2/bin/apachectl -k stop
      ;;
  restart)
      echo "Restarting Apache daemon..."
      /usr/local/apache2/bin/apachectl -k restart
      ;;
  status)
      statusproc /usr/local/apache2/bin/httpd
      ;;
     
  *)
      echo "Usage: $0 {start|stop|restart|status}"
      exit 1
      ;;
Esac
注意:#description:http server 这一行必须加上,否则在执行命令 # chkconfig –add httpd 时会出现“service apache does not support chkconfig”的错误报告。#chkconfig: 2345 98 98 表示在执行命令 # chkconfig –add httpd 时会在目录 /etc/rc2.d/ 、/etc/rc3.d/ /etc/rc5.d 分别生成文件 S98httpd和 K98httpd。这个数字可以是别的。
6、    执行命令 # chkconfig –add httpd ,进入目录/etc/rc3.d/检查是否生成文件 S98httpd及K98httpd.
7、    启动服务 # service httpd start .
posted @ 2007-07-24 22:41 RomKK 阅读(196) | 评论 (0) | 编辑 收藏
 
Linux内核编译过程详解(kernel2.6.7)

花了几天才编译成功kernel2.6.7,其过程真可谓艰辛.古语有云:"苦尽甘来!"现在终于可以乐上一阵了.由于许多朋友对操作的顺序及某些重要的配置知之甚少或知之不详,往往病急乱投医.加之网上的信息多且烦杂,使得编译内核成功率不高,甚至造成原来的系统崩溃的也不在少数.我就是其中一个。
  
  其实,编译内核并不是一件难事.如果能按照正确的方法来操作,最多花上一个半小时就能搞定.是不是很受鼓舞呀!
  
  废话少说,现在我们马上开始.我原来的系统是redhat9.0,内核2.4.20-8,编译的内核2.6.7,仅供参考.
  
  共分为四部分:编译前准备->编译配置->编译过程->运行内核的常见问题
  
  一 编译前准备
  
  1)下载一份内核源代码,我下的是linux-2.6.7.tar.bz2,你可在如下地址下载它或者是更新的版本.
  
  http://kernel.org/pub/linux/kernel/v2.6/
  
  2) 下载最新版本的module-init-tools( "module-init-tools-3.0.tar.gz" and "modutils-2.4.21-23.src.rpm")
  
  http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz
  
  http://www.kernel.org/pub/linux/kernel/people/rusty/modules/modutils-2.4.21-23.src.rpm
  
  3)安装module-init-tools. 它会替代depmod [/sbin/depmod]和其他工具.
  
  tar -zxvf module-init-tools-3.0.tar.gz
  
  cd module-init-tools-3.0
  
  ./configure --prefix=/sbin
  
  make
  
  make install
  
  ./generate-modprobe.conf /etc/modprobe.conf
  
  4)安装modutils-2.4.21-23.src.rpm. 你可能会看到"user rusty and group rusty not existing"的警告. 没关系,你只需强制安装就是了.如果你不对Redhat 9和Redhat 8做这几步, 你将会在"make modules_install"这一步时出现问题.
  
  rpm -i modutils-2.4.21-23.src.rpm
  
  rpmbuild -bb /usr/src/redhat/SPECS/modutils.spec
  
  rpm -Fi /usr/src/redhat/RPMS/i386/modutils-2.4.21-23.i386.rpm
  
  5)解压缩内核源代码.把下载的源代码包放到目录/usr/src下,然后
  
  cd /usr/src
  
  tar xvfj linux-2.6.7.tar.bz2
  
  cd linux-2.6.7
  
  二 编译配置
  
  在这一部分涉及几个重要模块的配置请,特别注意.一般用"make menuconfig"命令来配置内核.
  
  输入以上命令后出现一个菜单界面,用户可以对需要的模块.下面着重讲几个重要的配置
  
  1)文件系统
  
  请务必要选中ext3文件系统,
  
  File systems--->
  
  
•  Ext3 journalling file system support
  
  
•  Ext3 Security Labels
  
  
•  JBD (ext3) debugging support
  
  以上三项一定要选上,而且要内建(即标*). 这个非常重要,在配置完后一定要检查一下.config文件有没有"CONFIG_EXT3_FS=y"这一项. 如果不是"CONFIG_EXT3_FS=y"而是"CONFIG_EXT3_FS=m",你在运行内核时就会遇上以下错误: pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed
  
  2)网卡驱动
  
  请务必把自己网卡对应的驱动编译进内核,比较普遍的网卡是realtek 8139,以下就是这种网卡的配置,以供参考
  
  Device Drivers--->
  
  Networking support--->
  
  Ethernet (10 or 100Mbit) --->
  
  <*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL)
  
  <*> RealTek RTL-8139 PCI Fast Ethernet Adapter support
  
  3)声卡驱动
  
  也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是i810_audio,以下就是这种声卡的配置,以供参考
  
  Device Drivers --->
  
  Sound --->
  
  <*> Sound card support
  
  Advanced Linux Sound Architecture --->
  
  <*> Advanced Linux Sound Architecture
  
  <*> Sequencer support
  
  < > Sequencer dummy client
  
  <*> OSS Mixer API
  
  <*> OSS PCM (digital audio) API
•  OSS Sequencer API
  
  <*> RTC Timer support
  
  PCI devices --->
  
  <*> Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111
  
  Open Sound System --->
  
  < > Open Sound System (DEPRECATED)
  
  以上三项配置关系到新内核能否正常运行,请备加注意.其他的配置如果不是很了解,大可以按默认的选择.
  
  三 编译
  
  按如下命令编译,大概需要一个多小时,大可以好好放松一下
  
  make bzImage
  
  make modules
  
  make modules_install
  
  make install
  
  运行新内核之前,请检查一下/boot/grub/grub.conf的内容,下面的配置可作参考
  
  # grub.conf generated by anaconda
  
  #
  
  # Note that you do not have to rerun grub after making changes to this file
  
  # NOTICE: You have a /boot partition. This means that
  
  # all kernel and initrd paths are relative to /boot/, eg.
  
  # root (hd0,0)
  
  # kernel /vmlinuz-version ro root=/dev/hdc3
  
  # initrd /initrd-version.img
  
  #boot=/dev/hdc
  
  default=1
  
  timeout=10
  
  splashimage=(hd0,0)/grub/splash.xpm.gz
  
  title Red Hat Linux (2.6.7)
  
  root (hd0,0)
  
  kernel /vmlinuz-2.6.7 ro root=LABEL=/
  
  initrd /initrd-2.6.7.img
  
  title Red Hat Linux
  
  root (hd0,0)
  
  kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
  
  initrd /initrd-2.4.20-8.img
  
  四 运行内核的常见问题
  
  1)RPM问题
  
  进入编译好的内核后,与RPM相关的命令有些不能使用,并出现下列错误:
  
  rpmdb: unable to join the environment
  
  error: db4 error(11) from dbenv->open: Resource temporarily unavailable
  
  error: cannot open Packages index using db3 - Resource temporarily unavailable (11)
  
  error: cannot open Packages database in /var/lib/rpm
  
  no packages
  
  解决方法是执行“export LD_ASSUME_KERNEL =2.2.25”命令,也可以将其写入/etc/bashrc。
  
  2)Sound问题
  
  声音部分的模块名也改变了。我的笔记本原来的声卡驱动是i810_audio,现在已改为snd-intel8x0。因此需要把下面的内容添加到/etc/modprobe.conf中:
  
  alias char-major-14 soundcore
  
  alias sound snd-intel8x0
  
  alias sound-slot-0 snd-intel8x0
  
  alias snd-card-0 snd-intel8x0
  
  alias sound-service-0-0 snd-mixer-oss
  
  alias sound-service-0-1 snd-seq-oss
  
  alias sound-service-0-3 snd-pcm-oss
  
  alias sound-service-0-8 snd-seq-oss
  
  alias sound-service-0-12 snd-pcm-oss
  
  install snd-intel8x0 /sbin/modprobe --ignore-install sound-slot-0 &&
  
  { /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1; /bin/true; }
  
  remove snd-intel8x0
  
  { /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1; /bin/true; };
  
  /sbin/modprobe -r --ignore-remove sound-slot-0
  
  然后执行“modprobe sound”加载声音模块,并使用下列命令检验声卡驱动:
  
  #cat /proc/asound/cards
  
  显示结果如下:
  
  0 [SI7012]: ICH - SiS SI7012
  
  SiS SI7012 at 0xdc00, irq 11
  
  3)VMware问题
  
  解决方法是:
  
  ◆ 将/usr/bin/vmware-config.pl中所有的“/proc/ksyms”替换为“/proc/kallsyms”。使用“sed”命令可以达到这个目的。
  
  ◆ 重新运行该脚本,使用内核头文件编译新的内核模块。在编译过程中如发生错误,应该进入/usr/lib/vmware/modules/source,使用下面的命令将vmnet.tar解包:
  
  #tar xvf vmnet.tar
  
  ◆ 进入vmnet-only目录修改bridge.c文件。将“atomic_add(skb->truesize, &sk->wmem_alloc);”修改为“atomic_add(skb->truesize, &sk->sk_wmem_alloc);”,并用类似的方式将“protinfo”改为“sk_protinfo”。
  
  ◆ 再次把vmnet-only目录用下面的命令重新打包为vmmon.tar:
  
  #tar cvf vmmon.tar v
posted @ 2007-07-24 22:40 RomKK 阅读(254) | 评论 (0) | 编辑 收藏
 
Linux系统中集群及其配置实例

集群系统(Cluster)主要解决下面几个问题:
高可靠性(HA)。利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
高性能计算(HP)。即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。
负载平衡。即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
在实际应用中,最常见的情况是利用集群解决负载平衡问题,比如用于提供WWW服务。在这里主要展示如何使用LVS(Linux Virtial Server)来实现实用的WWW负载平衡集群系统。
LVS简介
LVS是章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,比如RedHat的Piranha,TurboLinux公司的Turbo Cluster等,都是基于LVS的核心代码的。在现实的应用中,LVS得到了大量的部署,请参考http: //www.linuxvirtualserver.org/deployment.html
关于Linux LVS的工作原理和更详细的信息,请参考http://www.linuxvirtualserver.org。
LVS配置实例
通过Linux LVS,实现WWW,Telnet服务的负载平衡。这里实现Telnet集群服务仅为了测试上的方便。
LVS有三种负载平衡方式,NAT(Network Address Translation),DR(Direct Routing),IP Tunneling。其中,最为常用的是DR方式,因此这里只说明DR(Direct Routing)方式的LVS负载平衡。
1、网络拓扑结构。
 
如图1所示,为测试方便,4台机器处于同一网段内,通过一交换机或者集线器相连。实际的应用中,最好能够将虚拟服务器vs1和真实服务器rs1, rs2置于于不同的网段上,即提高了性能,也加强了整个集群系统的安全性。
2、服务器的软硬件配置
首先说明,虽然本文的测试环境中用的是3台相同配置的服务器,但LVS并不要求集群中的服务器规格划一,相反,可以根据服务器的不同配置和负载情况,调整负载分配策略,充分利用集群环境中的每一台服务器。
这3台服务器中,vs1作为虚拟服务器(即负载平衡服务器),负责将用户的访问请求转发到集群内部的rs1,rs2,然后由rs1,rs2分别处理。
client为客户端测试机器,可以为任意操作系统。
4台服务器的操作系统和网络配置分别为:
vs1: RedHat 6.2, Kernel 2.2.19
vs1: eth0 192.168.0.1
vs1: eth0:101 192.168.0.101
rs1: RedHat 6.2, Kernel 2.2.14
rs1: eth0 192.168.0.3
rs1: dummy0 192.168.0.101
rs2: RedHat 6.2, Kernel 2.2.14
rs2: eth0 192.168.0.4
rs2: dummy0 192.168.0.101
client: Windows 2000
client: eth0 192.168.0.200
其中,192.168.0.101是允许用户访问的IP。
虚拟服务器的集群配置
大部分的集群配置工作都在虚拟服务器vs1上面,需要下面的几个步骤:
重新编译内核。
首先,下载最新的Linux内核,版本号为2.2.19,下载地址为:http://www.kernel.org/,解压缩后置于/usr/src/linux目录下。
其次需要下载LVS的内核补丁,地址为:http://www.linuxvirtualserver.org/software/ipvs- 1.0.6-2.2.19.tar.gz。这里注意,如果你用的Linux内核不是2.2.19版本的,请下载相应版本的LVS内核补丁。将ipvs- 1.0.6-2.2.19.tar.gz解压缩后置于/usr/src/linux目录下。
然后,对内核打补丁,如下操作:
[root@vs2 /root]# cd /usr/src/linux
[root@vs2 linux]# patch -p1 < ipvs-1.0.6-2.2.19/ipvs-1.0.6-2.2.19.patch
下面就是重新配置和编译Linux的内核。特别注意以下选项:
1 Code maturity level options--->
*  [*]Prompt for development and/or incomplete code/drivers
2 Networking部分:
 [*] Kernel/User netlink socket
  [*] Routing messages
  <*> Netlink device emulation
* [*] Network firewalls
  [*] Socket Filtering
  <*> Unix domain sockets
* [*] TCP/IP networking
  [*] IP: multicasting
  [*] IP: advanced router
  [ ] IP: policy routing
  [ ] IP: equal cost multipath
  [ ] IP: use TOS value as routing key
  [ ] IP: verbose route monitoring
  [ ] IP: large routing tables
  [ ] IP: kernel level autoconfiguration
* [*] IP: firewalling
  [ ] IP: firewall packet netlink device
* [*] IP: transparent proxy support
* [*] IP: masquerading
  --- Protocol-specific masquerading support will be built as modules.
* [*] IP: ICMP masquerading
  --- Protocol-specific masquerading support will be built as modules.
* [*] IP: masquerading special modules support
*  IP: ipautofw masq support (EXPERIMENTAL)(NEW)
*  IP: ipportfw masq support (EXPERIMENTAL)(NEW)
*  IP: ip fwmark masq-forwarding support (EXPERIMENTAL)(NEW)
* [*] IP: masquerading virtual server support (EXPERIMENTAL)(NEW)
  [*] IP Virtual Server debugging (NEW) <--最好选择此项,以便观察LVS的调试信息
* (12) IP masquerading VS table size (the Nth power of 2) (NEW)
*  IPVS: round-robin scheduling (NEW)
*  IPVS: weighted round-robin scheduling (NEW)
*  IPVS: least-connection scheduling (NEW)
*  IPVS: weighted least-connection scheduling (NEW)
*  IPVS: locality-based least-connection scheduling (NEW)
*  IPVS: locality-based least-connection with replication scheduling (NEW)
* [*] IP: optimize as router not host
*  IP: tunneling
  IP: GRE tunnels over IP
  [*] IP: broadcast GRE over IP
  [*] IP: multicast routing
  [*] IP: PIM-SM version 1 support
  [*] IP: PIM-SM version 2 support
* [*] IP: aliasing support
  [ ] IP: ARP daemon support (EXPERIMENTAL)
* [*] IP: TCP syncookie support (not enabled per default)
  --- (it is safe to leave these untouched)
  < > IP: Reverse ARP
  [*] IP: Allow large windows (not recommended if <16Mb of memory)
  < > The IPv6 protocol (EXPERIMENTAL)
上面,带*号的为必选项。
然后就是常规的编译内核过程,不再赘述,请参考编译 Linux 教程
在这里要注意一点:如果你使用的是RedHat自带的内核或者从RedHat下载的内核版本,已经预先打好了LVS的补丁。这可以通过查看/usr/src/linux/net/目录下有没有几个ipvs开头的文件来判断:如果有,则说明已经打过补丁。
编写LVS配置文件,实例中的配置文件如下:
#lvs_dr.conf (C) Joseph Mack mack@ncifcrf.gov
LVS_TYPE=VS_DR
INITIAL_STATE=on
VIP=eth0:101 192.168.0.101 255.255.255.0 192.168.0.0
DIRECTOR_INSIDEIP=eth0 192.168.0.1 192.168.0.0 255.255.255.0 192.168.0.255
SERVICE=t telnet rr rs1:telnet rs2:telnet
SERVICE=t www rr rs1:www rs2:www
SERVER_VIP_DEVICE=dummy0
SERVER_NET_DEVICE=eth0
#----------end lvs_dr.conf------------------------------------
将该文件置于/etc/lvs目录下。
使用LVS的配置脚本产生lvs.conf文件。该配置脚本可以从http: //www.linuxvirtualserver.org/Joseph.Mack/configure-lvs_0.8.tar.gz 单独下载,在ipvs-1.0.6-2.2.19.tar.gz包中也有包含。
脚本configure的使用方法:
[root@vs2 lvs]# configure lvs.conf
这样会产生几个配置文件,这里我们只使用其中的rc.lvs_dr文件。
修改/etc/rc.d/init.d/rc.local,增加如下几行:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_always_defrag
# 显示最多调试信息
echo 10 > /proc/sys/net/ipv4/vs/debug_level
配置NFS服务。这一步仅仅是为了方便管理,不是必须的步骤。假设配置文件lvs.conf文件放在/etc/lvs目录下,则/etc/exports文件的内容为:
/etc/lvs ro(rs1,rs2)
然后使用exportfs命令输出这个目录:
[root@vs2 lvs]# exportfs
如果遇到什么麻烦,可以尝试:
[root@vs2 lvs]# /etc/rc.d/init.d/nfs restart
[root@vs2 lvs]# exportfs
这样,各个real server可以通过NFS获得rc.lvs_dr文件,方便了集群的配置:你每次修改lvs.conf中的配置选项,都可以即可反映在rs1,rs2的相应目录里。
修改/etc/syslogd.conf,增加如下一行: kern.*  /var/log/kernel_log
这样,LVS的一些调试信息就会写入/var/log/kernel_log文件中.
real server的配置
real server的配置相对简单,主要是是以下几点:
配置telnet和WWW服务。telnet服务没有需要特别注意的事项,但是对于www服务,需要修改httpd.conf文件,使得apache在虚拟服务器的ip地址上监听,如下所示:
Listen 192.168.0.101:80
关闭real server上dummy0的arp请求响应能力。这是必须的,具体原因请参见ARP problem in LVS/TUN and LVS/DR(http://www.linuxvirtualserver.org/arp.html)。关闭dummy0的arp响应的方式有多种,比较简单地方法是,修改/etc/rc.d/rc.local文件,增加如下几行: echo 1 > /proc/sys/net/ipv4/conf/all/hidden
ifconfig dummy0 up
ifconfig dummy0 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.0 up
echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden
再次修改/etc/rc.d/rc.local,增加如下一行:(可以和步骤2合并)
echo 1 > /proc/sys/net/ipv4/ip_forward
LVS的测试
好了,经过了上面的配置步骤,现在可以测试LVS了,步骤如下:
分别在vs1,rs1,rs2上运行/etc/lvs/rc.lvs_dr。注意,rs1,rs2上面的/etc/lvs目录是vs2输出的。如果您的 NFS配置没有成功,也可以把vs1上的/etc/lvs/rc.lvs_dr复制到rs1,rs2上,然后分别运行。
确保rs1,rs2上面的apache已经启动并且允许telnet。
然后从client运行telnet 192.168.0.101,如果登录后看到如下输出就说明集群已经开始工作了:(假设以guest用户身份登录)
[guest@rs1 guest]$-----------说明已经登录到服务器rs1上。
再开启一个telnet窗口,登录后会发现系统提示变为:
[guest@rs2 guest]$-----------说明已经登录到服务器rs2上。
然后在vs2上运行如下命令:
[root@vs2 /root]ipvsadm
运行结果应该为:
IP Virtual Server version 1.0.6 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.101:telnet rr
-> rs2:telnet Route  1 1 0
-> rs1:telnet Route  1 1 0
TCP 192.168.0.101:www rr
-> rs2:wwwRoute  1 0 0
-> rs1:wwwRoute  1 0 0
至此已经验证telnet的LVS正常。
然后测试一下WWW是否正常:用你的浏览器查看http://192.168.0.101/是否有什么变化?为了更明确的区别响应来自那个real server,可以在rs1,rs2上面分别放置如下的测试页面(test.html):
我是real server #1 or #2
然后刷新几次页面(http://192.168.0.101/test.html),如果你看到“我是real server #1”和“我是real server #2”交替出现,说明www的LVS系统已经正常工作了。
但是由于Internet Explore 或者Netscape本身的缓存机制,你也许总是只能看到其中的一个。不过通过ipvsadm还是可以看出,页面请求已经分配到两个real server上了,如下所示:
IP Virtual Server version 1.0.6 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.101:telnet rr
-> rs2:telnet Route  1 0 0
-> rs1:telnet Route  1 0 0
TCP 192.168.0.101:www rr
-> rs2:wwwRoute  1 0 5
-> rs1:wwwRoute  1 0 4
或者,可以采用linux的lynx作为测试客户端,效果更好一些。如下运行命令:
[root@client /root]while true; do lynx -dump http://10.64.1.56/test.html; sleep 1; done
这样,每隔1秒钟“我是realserver #1”和“我是realserver #2”就交替出现一次,清楚地表明响应分别来自两个不同的real server。
调试技巧
如果您的运气不好,在配置LVS的过程中也许会遇到一些困难,下面的技巧或许有帮助:
首先确定网络硬件没有问题,尤其是网线,ping工具就足够了。
使用netstat查看端口的活动情况。
使用tcpdump查看数据包的流动情况。
查看/var/log/kernel_log文件。
posted @ 2007-07-24 22:39 RomKK 阅读(183) | 评论 (0) | 编辑 收藏
 
Linux下Tomcat与Apache Web服务器的整合

1、引言
基于Web技术的Internet/Intranet近年来已经得到了广泛的应用,Intranet是以TCP/IP协议为基础、以Web为核心的企业内部网,用户通过低成本、简单易用的客户浏览器就能随时随地到企业的Web站点上查阅自己所需的数据。浏览器客户端操作界面的一致性避免了C/S模式客户端程序的多样性,而服务器端的开放和基于标准的连接方案使企业很方便地通过Internet同外界联系;同时,Web信息动态的、交互式的发布方式从根本上改变了企业的服务质量,增加了企业的商业机会。
在许多用户看来,一个Web网站的成败主要在于它所提供的内容和功能,而支持这些内容和功能的Web服务器起着非常重要的作用。
2、Tomcat容器
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。
Tomcat是稳固的独立的Web服务器与Servlet Container,不过,其Web服务器的功能则不如许多更健全的Web服务器完整,如Apache Web服务器(举例来说,Tomcat没有大量的选择性模块)。不过,Tomcat是自由的开源软件,而且有许多高手致力于其发展。
2.1 Linux下安装Tomcat
        在安装Tomcat之前需要安装j2sdk(Java 2 Software Development Kit),安装j2sdk的步骤如下:
1)到http://www.java.sun.com下载j2sdk ,如j2sdk-1_4_2_04-linux-i586-rpm.bin。
2)在终端中转到j2sdk-1_4_2_04-linux-i586-rpm.bin所在的目录,输入命令chmod +x j2sdk-1_4_2_04-linux-i586-rpm.bin,添加执行的权限。
3)执行命令./j2sdk-1_4_2_04-linux-i586-rpm.bin,生成j2sdk-1_4_2_04-linux-i586.rpm的文件。
4)执行命令chmod +x j2sdk-1_4_2_04-linux-i586.rpm,给j2sdk-1_4_2_04-linux-i586.rpm添加执行的权限。
5)执行命令 rpm –ivh j2sdk-1_4_2_04-linux-i586.rpm ,安装j2sdk。
6)安装界面会出现授权协议,按Enter键接受,把j2sd安装在/usr/java/j2sdk1.4.2_04。
7)设置环境变量,在 /etc/profile.d/目录下建立文件java.sh,文件的内容如下:
#set java environment
export JAVA_HOME=/usr/java/j2sdk1.4.2_04
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:/usr/java/jdbc
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
8)执行命令chmod 755 /etc/profile.d/java.sh,给java.sh分配权限。
9)在终端中分别执行命令javac –help和java –version,如果看到有关的信息,则表示j2sdk已成功安装。
    接下来安装tomcat,安装tomcat的步骤如下:
1)访问http://jakarta.apache.org/tomcat/index.html,下载二进制版的tomcat,如jakarta-tomcat-5.5.10.tar.gz,解压到/usr/local目录:
cd /usr/local
gzip –zxvf jakarta-tomcat-5.5.10.tar.gz
2)修改$tomcat/bin/startup.sh和shutdown.sh文件,
export JAVA_HOME=/usr/java/j2sdk1.4.2_04
export CATALINA_HOME=/usr/local/tomcat-5.5.10
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:/usr/java/jdbc
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
3)执行startup.sh即可在http://localhost:8080/ 访问到tomcat的缺省面页.
2.2单独运行Tomcat的优点
1)容易架设。下载Tomcat,设定一些配置,就完成了。不需要花费时间将Web服务器的连接器整合至其它的Web服务器中。
2)不需要担心连接器。永远不需要排除在其它Web服务器与Tomcat之间的任何性能或联机方面的问题。
3)有较佳的安全防护。相对于其它以C、C++所编写的Web服务器,Tomcat比较能忍受远程缓冲区溢位的攻击。因为Tomcat的Java虚拟机是位于网络及操作系统之间,它可以防止几乎所有类型的缓冲区溢位攻击。使用Tomcat的安全防护领域,可以指定对各个资源的访问。
4)容易移植。可以将Tomcat服务器(以及应用程序)移植到不同的服务器、操作系统甚至架构上。因为Tomcat是以Java编写的,因此可以将其整个目录结构的内容复制到其它计算机上运行,而完全不需要任何改变,甚至于新的计算机的架构与原来的不同也一样。
2.3单独运行Tomcat的缺点
1)Tomcat的支持软件比较少。Tomcat内建Web服务器的支持软件比Apache httpd Web服务器少。
2)Tomcat的Web服务器功能少。相对于Tomcat Web服务器,Apache httpd服务器有更完整的功能。
3)虽然Tomcat运行速度快,但还没有Apache httpd快。Tomcat服务器比Apache httpd慢,不过,它还在改进中,而且仍然非常快,快到足以运行今日大多数的企业网站,只是在提供静态页面内容上没有Apache快。
3、Apache Web服务器
Apache是根据NCSA的服务器发展而来的,NCSA是最早出现的Web服务器程序之一,由伊利诺斯大学Urbana-Champaign分校的美国国家超级计算应用中心开发。在发展初期,Apache主要是一个基于UNIX系统的服务器,它的宗旨就是建成一个基于UNIX系统的、功能更强、效率更高并且速度更快的WWW服务器,这就决定了它是从其他的服务器演变而来的,并且添加了大量补丁来增强它在某一方面的性能,所以它就被命名为“APA+CHy Server(一个补丁组成的服务器)”。发展到今天,Apache已经被移植到很多平台上了。
Apache的开发遵循GPL协议,由全球的志愿者一起开发和维护。在保持强大的功能及不断更新的同时,它仍然是免费的,并且公开源代码。
3.1 安装Apache服务器
可以通过以下三种方法安装Apache服务器。
1)如果安装的Linux版本中带用Apache的话,就在选择所要安装的服务器的时候,将httpd这个服务选上,Linux安装程序将自动完成Apache的安装工作,并做好基本的配置。
2)使用可执行文件软件包,这比较适合那些对编译工作不是太熟悉的初级用户,因为它相对比较简单。下载软件包apache_1.2.4.e.tar.gz ,执行命令tar xvzf apache_1.2.4.e.tar.gz 完成安装工作。如果使用的是RedHat Linux的话,也可以下载apache_1.2.4.rpm软件安装包,然后使用rpm –ivh apache_1.2.4.rpm命令安装。
3)如果想把Apache服务器充分利用起来的话,就一定要自己编译Apache 定制其功能。 下载包含Apache源代码的软件包apache_1.2.4.tar.gz;然后用tar命令将它解开;将当前目录改变为Apache源代码发行版的src目录;将配置样本文件(Configuration.tmpl)复制为Configuration文件;编辑Configuration文件中的配置选项:
Makefile配置选项:一些编译选项:
. “CC=”一行指定用什么编译软件编译,一般为“CC=gcc”;如果需要将额外的标志(参数)指定给C编译软件,可以使用:
EXTRA_CFLAGS=
EXTRA_LFLAGS=
如果系统需要特殊的库和包含文件,可以在这里指定它们:
EXTRA_LIBS=
EXTRA_INCLUDES=
如果要改变代码优化设置的话,须将下面一句去掉注释,然后改成所需要的值:
#OPTIM=-O2
Rule配置选项:用来决定需要什么功能,一般情况下无需改变。
模块配置:模块是Apache的组成部分,它为Apache内核增加新功能。通过使用模块配置,可以自定义在Apache服务器中需要什么功能,这个部分也是Apache灵活性的表现。模块配置行如下所示:
AddModule modules/standard/mod_env.o
如果需要Apache服务器具备什么功能,就将那个模块用AddModule语句加到配置文件Configuration中去。
下面列出了Apache的模块功能:
模块名                         功能                                                     缺省
mod_access                 提供基于主机的访问控制命令                                     y
mod_actions                能够运行基于MIME类型的CGI脚本或HTTP请求方法                      y
mod_alias                能执行URL重定向服务                                         y
mod_asis                 使文档能在没有HTTP头标的情况下被发送到客户端                 y
mod_auth                 支持使用存储在文本文件中的用户名、口令实现认证                 y
mod_auth_dbm                   支持使用DBM文件存储基本HTTP认证                         n
mod_auth_mysql                        支持使用MySQL数据库实现基本HTTP认证                            n
mod_auth_anon                        允许以匿名方式访问需要认证的区域                            y
mod_auth_external                支持使用第三方认证                                         n
mod_autoindex                        当缺少索引文件时,自动生成动态目录列表                         y
mod_cern_meta                        提供对元信息的支持                                         n
mod_cgi                         支持CGI                                                 y
mod_dir                         能够重定向任何对不包括尾部斜杠字符命令的请求                 y
mod_env                                 使你能够将环境变量传递给CGI或SSI脚本                         n
mod_expires                 让你确定Apache在服务器响应请求时如何处理Expires                          y
mod_headers                 能够操作HTTP应答头标                                 y
mod_imap                 提供图形映射支持                                         n
mod_include                 使支持SSI                                                 n
mod_info                                 对服务器配置提供了全面的描述                                 y
mod_log_agent                         允许在单独的日志文件中存储用户代理的信息                         n
mod_log_config                        支持记录日志                                                      y
mod_log_referer                          提供了将请求中的Referer头标写入日志的功能                 n
mod_mime                 用来向客户端提供有关文档的元信息                        y
mod_negotiation                        提供了对内容协商的支持                                 y
mod_setenvif                 使你能够创建定制环境变量                                 y
mod_speling                 使你能够处理含有拼写错误或大小写错误的URL请求                     n
mod_status                 允许管理员通过WEB管理Apache                                 y
mod_unique_id         为每个请求提供在非常特殊的条件下保证是唯一的标识                               n
在src目录下执行:“. /configure”;
编译Apache:执行命令“make”;
将编译好的可执行文件httpd复制到/etc/httpd/bin目录下;将Apache发行版的配置文件:access.conf、httpd.conf、mime.types、srm.conf文件复制到/etc/httpd/conf目录下。到此为止,安装完成。
3.1单独运行Apache httpd的优点
   1)Apache httpd比Tomcat内建的Web服务器快。
   2)较多的软件支持。Apache httpd有庞大的支持软件链接库。
3)启动与停止快。一般来说,Apache httpd的启动与停止时间都比Tomcat短。
3.2单独运行Apache httpd的缺点
   1)架设比较困难。比起单独运行Tomcat,安装Apache Web服务器并让它与Tomcat协同运行要复杂很多。
   2)会拖慢动态网页内容的服务。
   3)安全漏洞。Apache httpd比较容易受到缓冲区溢位的攻击。
   4)升级比较复杂。
4、Tomcat与Apache的整合
有几种将Tomcat整合到Apache httpd Web服务器的方法:
1)架使用不同的端口号分担负载。
该方法是最容易实现的,只需要在现成的网页目录中假如URL以连接到在同一台Web服务器机器上的Tomcat Web服务器端口(如8080)。实际上还是执行两个完整的Web服务器程序,彼此之间并没有真正的整合。
2)从Apache将请求发送至Tomcat的代理服务器。
该方法会在主服务器中使用HTTP的代理机制。代理机制常会用来将来自网关上运行的Web服务器的Web信息流重新路由至外部因特网上的网站。不过,也可以用来将网站区域或目录的信息流重导至Tomcat Web服务器。
3)使用mod_jk2连接器。
该方法使用运行于现有的Apache httpd Web服务器之内的连接器模块(如mod_jk),并经由特定的协议快速地将请求转送至Tomcat。这是将Tomcat连接至Apache httpd的标准方式。
4)单一进程中执行两个程序。
该方法通过让JVM在Apache httpd的进程空间中运行的方式,可以提供“完全整合”的功能。这是最有效的办法,但也是最依赖于服务器的实现。
posted @ 2007-07-24 22:35 RomKK 阅读(214) | 评论 (0) | 编辑 收藏
 
十种领带的打法(图解)

十种领带的打法:

双交叉结

    这样的领结很容易让人有种高雅且隆重的感觉,适合正式之活动场合选用该领结应多运用在素色且丝质领带上,若搭配大翻领的衬衫不但适合且有种尊贵感。

双环结

    能营造时尚感,适合年轻的上班族选用该领结完成的特色就是第一圈会稍露出于第二圈之外,可别刻意给盖住了啰。

交叉结

    这是对于单色素雅质料且较薄领带适合选用的领结对于喜欢展现流行感的男士不妨多加使用。

平结

    平结为最多男士选用的领结打法之一,几乎适用于各种材质的领带。

    要诀:领结下方所形成的凹洞需让两边均匀且对称。


posted @ 2007-07-24 22:26 RomKK 阅读(226) | 评论 (0) | 编辑 收藏
 
一个程序员的成长的六个阶段

第一阶段
此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。
第二阶段
此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。
第三阶段
此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。
第四阶级
此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。
这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想变不过来。
第五阶级
此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。
第六阶级
此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。
此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。
每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。
要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。
现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过这样的程序员一般在软件公司也能独当一面,完成一些软件的模块。
但是,也还有一大堆处在第一阶段的程序员,他们一般就能玩玩VB,做程序时,去找一堆控件集成一个软件.

posted @ 2007-07-24 22:22 RomKK 阅读(185) | 评论 (0) | 编辑 收藏
 
微软好员工的十个标准

1、对自己所在公司或部门的产品具有起码的好奇心是极为重要的一点。你必须亲自使用该产品。对于身处计算机行业的人来说,这一点怎么强调都不为过。当然,这一点同样适用于其他知识密集型领域,因为在这些领域内技术与应用发展更新极快,对其技术的掌握很难做到一劳永逸。如果你对这些产品没什么兴趣,你将很快落伍,并被淘汰出局。
 
2、在与客户交谈如何使用产品时,需要以极大的兴趣和传道士般的热情和执着打动客户,了解他们欣赏什么,不喜欢什么。同时必须清醒地知道本公司的产品有哪些不足,或哪里可以改进。
  
3、了解了客户的需求后,必须乐于思考如何让产品更贴近并帮助客户。
 
4、作为一个独立的员工,必须与公司制定的长期计划保持步调一致。员工需要关注其终身的努力方向,如提高自身及同事的能力。
  
5、在对于周遭事物具有高度洞察力的同时,必须掌握某种专业知识和技能。特别是一些大公司,他们要求员工迅速掌握专业技术。没有人能保证他目前拥有的技能仍适用于将来的工作,所以,好学精神是非常关键的。
  
6、非常灵活地利用那些有利于发展的机会。在微软,我们通过一系列方法为每一个人提供许多不同的工作机会。任何热衷参与微软管理的员工,都将被鼓励在不同客户服务部门工作。
  
7、一个好的员工会尽量去学习了解公司业务运作的经济原理,为什么公司的业务会这样运作?公司的业务模式是什么?如何才能盈利?员工必须了解导致本行业中企业盈利或亏损的原因,才能对自己所从事的工作的价值有更深入的理解。
  
8、关注竞争对手的动态。我非常欣赏那些随时注意整个市场动态的员工,他们会分析我们的竞争对手的可借鉴之处,并注意总结,避免重返竞争对手的错误。
  
9、好的员工善于动脑子。分析问题,但并不局限于分析。他们知道如何寻找潜在的平衡点,如何寻找最佳的行动时机。思考还要与实践相结合。好的员工会合理、高效地利用时间,并会为其他部门清楚地提出建议。
 
10、不要忽略了一些必须具备的美德,如诚实、有道德和刻苦,这些都是很重要的,在此无需赘言。

posted @ 2007-07-24 22:21 RomKK 阅读(189) | 评论 (0) | 编辑 收藏
 
Lucene 基础指南
Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,但api其实很简单的,它最主要就是做两件事:建立索引和进行搜索。
1. 建立索引时最重要的几个术语

* Document:一个要进行索引的单元,相当于数据库的一行纪录,任何想要被索引的数据,都必须转化为Document对象存放。
* Field:Document中的一个字段,相当于数据库中的Column ,Field是lucene比较多概念一个术语,详细见后。
* IndexWriter:负责将Document写入索引文件。通常情况下,IndexWriter的构造函数包括了以下3个参数:索引存放的路径,分析 器和是否重新创建索引。特别注意的一点,当IndexWriter执行完addDocument方法后,一定要记得调用自身的close方法来关闭它。只 有在调用了close方法后,索引器才会将存放在内在中的所有内容写入磁盘并关闭输出流。
* Analyzer:分析器,主要用于文本分词。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。
* Directory:索引存放的位置。lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。
* 段:Segment,是Lucene索引文件的最基本的一个单位。Lucene说到底就是不断加入新的Segment,然后按一定的规则算法合并不同的Segment以合成新的Segment。

lucene建立索引的过程就是将待索引的对象转化为Lucene的Document对象,使用IndexWriter将其写入lucene 自定义格式的索引文件中。

待索引的对象可以来自文件、数据库等任意途径,用户自行编码遍历目录读取文件或者查询数据库表取得ResultSet,Lucene的API只负责和字符串打交道。
1.1 Field 的解释

从源代码中,可以看出Field 构造函数如下:

Field(String name, byte[] value, Field.Store store)
Field(String name, Reader reader)
Field(String name, Reader reader, Field.TermVector termVector)
Field(String name, String value, Field.Store store, Field.Index index)
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)

在Field当中有三个内部类:Field.Index,Field.Store,Field.termVector。其中

* Field.Index有四个属性,分别是:
Field.Index.TOKENIZED:分词索引
Field.Index.UN_TOKENIZED:分词进行索引,如作者名,日期等,Rod Johnson本身为一单词,不再需要分词。
Field.Index:不进行索引,存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
Field.Index.NO_NORMS:;
* Field.Store也有三个属性,分别是:
Field.Store.YES:索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中,如文档的标题。
Field.Store.NO:原文不存储在索引文件中,搜索结果命中后,再根据其他附加属性如文件的Path,数据库的主键等,重新连接打开原文,适合原文内容较大的情况。
Field.Store.COMPRESS 压缩存储;
* termVector是Lucene 1.4.3新增的它提供一种向量机制来进行模糊查询,很少用。

上面所说的Field属性与lucene1.4.3版本的有比较大的不同,在旧版的1.4.3里lucene是通过Field.Keyword (...),FieldUnIndexed(...),FieldUnstored(...)和Field.Text(...)来设置不同字段的类型以达 到不同的用途,而当前版本由Field.Index和Field.Store两个字段的不同组合来达到上述效果。
还有一点说明,其中的两个构造函数其默认的值为Field.Store.NO和Field.Index.TOKENIZED。:

Field(String name, Reader reader)
Field(String name, Reader reader, Field.TermVector termVector)

* 限制Field的长度:
IndexWriter类提供了一个setMaxFieldLength的方法来对Field的长度进行限制,看一下源代码就知道其默认值为10000; 我们可以在使用时重新设置此参数。如果使用默认值,那么Lucene就仅仅对文档的前面的10000个term进行索引,超过这一个数的文档就不会被建立 索引。

1.2 索引的合并、删除、优化

* IndexWriter中的addIndexes方法将索引进行合并;当在不同的地方创建了索引后,如果需要将索引合并,这时候使用addIndexes方法就显得很有意义。
* 可以通过IndexReader类从索引中进行文档的删除。IndexReader是很特别的一个类,看源代码就知道它主要是通过自身的静态方法来完成构造的。示例:

IndexReader reader = IndexReader.open("C:\\springside");
reader.deleteDocument(X); //这里的X是一个int的常数;不推荐这一种删除方法
reader.deleteDocument(new Term("name","springside"));//这是另一种删除索引的方法,按字段来删除,推荐使用这一种做法
reader.close();

* 优化索引:可以使用IndexWriter类的optimize方法来进行优先,它会将多个Segment进行合并,组成一个新的Segment,可以加 快建立索引后搜索的速度。另外需要注意的一点,optimize方法会降低建立索引的速度,而且要求的磁盘空间会增加。

2. 进行搜索时最常用的几个术语

* IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具。初始化IndexSearcher需要设置索引存放的路径,让查询器能定位索引而进行搜索。
* Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。
* QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。
* Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。Hits对象中主要方法有:

length(): 返回搜索结果的总数,下面简单的用法中有用到Hit的这一个方法
doc(int n): 返回第n个文档
iterator(): 返回一个迭代器

这里再提一下Hits,这也是Lucene比较精彩的地方,熟悉hibernate的朋友都知道hibernate有一个延迟加载的属性,同样, Lucene也有。Hits对象也是采用延迟加载的方式返回结果的,当要访问某个文档时,Hits对象就在内部对Lucene的索引又进行一次检索,最后 才将结果返回到页面显示。

3. 一个简单的实例:

首先把lucene的包放在classpath路径中去,写下面一个简单的类:

public class FSDirectoryTest {
//建立索引的路径
public static final String path = "c:\\index2";

public static void main(String[] args) throws Exception {
Document doc1 = new Document();
doc1.add( new Field("name", "lighter springside com",Field.Store.YES,Field.Index.TOKENIZED));

Document doc2 = new Document();
doc2.add(new Field("name", "lighter blog",Field.Store.YES,Field.Index.TOKENIZED));

IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.close();

IndexSearcher searcher = new IndexSearcher(path);
Hits hits = null;
Query query = null;
QueryParser qp = new QueryParser("name",new StandardAnalyzer());

query = qp.parse("lighter");
hits = searcher.search(query);
System.out.println("查找\"lighter\" 共" + hits.length() + "个结果");

query = qp.parse("springside");
hits = searcher.search(query);
System.out.println("查找\"springside\" 共" + hits.length() + "个结果");

}
}

执行的结果:

查找"lighter" 共2个结果
查找"springside" 共1个结果

4. 一个复杂一点的实例

* 在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件,随便起名啦,就叫"1.txt","2.txt"和"3.txt"啦
其中1.txt的内容如下:

springside社区
更大进步,吸引更多用户,更多贡献
2007年

而"2.txt"和"3.txt"的内容也可以随便写几写,这里懒写,就复制一个和1.txt文件的内容一样吧

* 下载lucene包,放在classpath路径中,然后建立索引:

/**
* author lighter date 2006-8-7
*/
public class LuceneExample {
public static void main(String[] args) throws Exception {

File fileDir = new File("c:\\s"); // 指明要索引文件夹的位置,这里是C盘的S文件夹下
File indexDir = new File("c:\\index"); // 这里放索引文件的位置
File[] textFiles = fileDir.listFiles();

Analyzer luceneAnalyzer = new StandardAnalyzer();
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
indexFile(luceneAnalyzer,indexWriter, textFiles);
indexWriter.optimize();//optimize()方法是对索引进行优化
indexWriter.close();
}

public static void indexFile(Analyzer luceneAnalyzer,IndexWriter indexWriter,File[] textFiles) throws Exception
{
//增加document到索引去
for (int i = 0; i < textFiles.length; i++) {
if (textFiles[i].isFile() && textFiles[i].getName().endsWith(".txt")) {
String temp = FileReaderAll(textFiles[i].getCanonicalPath(),"GBK");
Document document = new Document();
Field FieldBody = new Field("body", temp, Field.Store.YES,Field.Index.TOKENIZED);
document.add(FieldBody);
indexWriter.addDocument(document);
}
}
}
public static String FileReaderAll(String FileName, String charset)throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(FileName), charset));
String line = "";
String temp = "";
while ((line = reader.readLine()) != null) {
temp += line;
}
reader.close();
return temp;
}
}

* 执行查询:

public class TestQuery {
public static void main(String[] args) throws IOException, ParseException {
Hits hits = null;
String queryString = "社区";
Query query = null;
IndexSearcher searcher = new IndexSearcher("c:\\index");

Analyzer analyzer = new StandardAnalyzer();
try {
QueryParser qp = new QueryParser("body", analyzer);
query = qp.parse(queryString);
} catch (ParseException e) {
}
if (searcher != null) {
hits = searcher.search(query);
if (hits.length() > 0) {
System.out.println("找到:" + hits.length() + " 个结果!");
}
}
}
}

* 执行结果:
找到:3 个结果!

posted @ 2007-07-24 15:59 RomKK 阅读(241) | 评论 (0) | 编辑 收藏
 
仅列出标题
共4页: 上一页 1 2 3 4 下一页 
 
<2025年5月>
日一二三四五六
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 33
  • 文章: 0
  • 评论: 4
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(1)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类(32)

  • j2ee技术(2) (rss)
  • java基础(6) (rss)
  • Web技术(4) (rss)
  • 休闲娱乐(7) (rss)
  • 开源软件(2) (rss)
  • 操作系统(9) (rss)
  • 数据库技术(2) (rss)

随笔档案(33)

  • 2007年7月 (33)

搜索

  •  

最新评论

  • 1. re: 基于Swing的免费look and feel(有很多哟)[未登录]
  • 目前来看,java的GUI开发还是有所增强的,虽然还是有很多遗憾,比如eclipse不就是java的嘛
  • --romkk
  • 2. re: 基于Swing的免费look and feel(有很多哟)[未登录]
  • 咦,Java的GUI开发,心中的痛啊。还是不行,感觉。跟windows、mac、linux等开发出的程序比还是有很大差距的。而且要命的还有jre问题。实在比较致命。
  • --刘明
  • 3. re: 基于Swing的免费look and feel(有很多哟)
  • 介绍的短了些,有空去看看.
  • --sitinspring
  • 4. re: 基于Swing的免费look and feel(有很多哟)
  • 好像没有多少人对这个感兴趣哟!
  • --RomKK

阅读排行榜

  • 1. 优化RandomAccessFile类后完整版代码(1573)
  • 2. 基于Swing的免费look and feel(有很多哟)(1441)
  • 3. 强悍!一个中学女生报复后妈的真实经过(484)
  • 4. 机器猫全部剧场版的下载地址(470)
  • 5. 用Velocity和Javascript操作FCKeditor(424)
  • 6. AJAX+jsp无刷新验证码实例(415)
  • 7. 如果控制文件突然坏了,又没有备份,如何在最后防线恢复数据库?(377)
  • 8. 配置一个安全的Linux DHCP服务器(339)
  • 9. linux redhat9.0/fedora4.0下adsl上网和配置全过程(333)
  • 10. 花1K内存实现高效I/O的RandomAccessFile类(318)
  • 11. struts2.01学习笔记! (316)
  • 12. 应对listner.log不断变大,甚至导致数据库无法访问的问题(304)
  • 13. linux中的压缩文件(281)
  • 14. 基于java使用FCKeditor(266)
  • 15. 历史上最愚蠢的八大事件(259)
  • 16. Linux内核编译过程详解(kernel2.6.7)(254)
  • 17. Lucene 基础指南(241)
  • 18. RedHat linux inittab详解(231)
  • 19. 十种领带的打法(图解)(226)
  • 20. Javascript的IE和Firefox兼容性汇编(224)

评论排行榜

  • 1. 基于Swing的免费look and feel(有很多哟)(4)
  • 2. 优化RandomAccessFile类后完整版代码(0)
  • 3. 花1K内存实现高效I/O的RandomAccessFile类(0)
  • 4. 强悍!一个中学女生报复后妈的真实经过(0)
  • 5. 历史上最愚蠢的八大事件(0)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 RomKK