2004年12月04日

众所周知Apache是目前最优秀的HTTP服务器。实际上它不仅能当作服务器使用,也能够被用来架设代理服务器。本文就如何使用Apache架设HTTP代理服务器进行说明。


本文将基于Win32版的Apache 2.0.47进行说明。以前的Apache 1.x版配置方法稍有不同,但这里不作说明。


首先是Apache的安装。从http://www.apache.org上下载Apache的安装程序,双击安装程序进行安装。安装好之后屏幕右下方系统托盘中会出现一个红色的羽毛状图标,那就是Apache的控制程序。单击此图标以启动Apache服务器。这时打开IE并在IE的地址栏中输入http://localhost/应当能够看到Apache的欢迎画面。


接下来我们修改Apache的配置文件使其支持HTTP代理服务器功能。用文本编辑器打开httpd.conf文件。该文件位于Apache安装目录的conf目录下。如果你在安装Apache的时候没有改变安装路径,那么它应当位于C:\Program Files\Apache Group\Apache\conf\httpd.conf。


首先要添加代理服务器模块。找到下面这几行:


#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so


去掉前面的#号使相应的模块生效。然后使用托盘中的Apache控制程序重新启动Apache。(也可以使用命令行net stop apache2然后net start apache2命令进行服务器重启。)这时Apache应该能够正常启动,虽然现在它还不是代理服务器。


然后我们在配置文件中加入下面这一行:


ProxyRequests   On


然后再次重新启动Apache。这时Apache就是HTTP代理服务器了。打开IE,选择菜单“工具→Internet选项→连接→局域网设置”,选中“为LAN使用代理服务器”,然后在下方的地址中填入127.0.0.1,端口填写80。填好之后确定,此时如果能够通过IE连接到Internet,则说明代理配置正确无误。
(注:此处的端口80是httpd.conf中Listen指令指定的端口号。如果你修改了Listen命令使Apache监听其他端口,那么在IE的设置中也请做相应的改变。另外,如果你使用拨号连接的话,那么请在“工具→Internet选项→连接”中修改相应的拨号连接的代理设置,而不要修改局域网代理设置)


接下来我们尝试一下访问控制。编辑httpd.conf,加入下面的设置:


<Proxy *>
Order allow,deny
Allow from all
Deny from 127.0.0.1
</Proxy>


此配置的意思是,允许除本地计算机之外的所有计算机访问代理。然后重新启动Apache。再次试图使用IE连接Internet,你会收到类似于下面的信息:


Forbidden
You don’t have permission to access http://www.google.com/ on this server.


说明本地计算机已经被禁止使用代理。而相反地,下面的设置:


<Proxy *>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>


的意思是,仅允许本地计算机使用代理服务器。


Proxy指令后面的*号表示客户端使用代理服务器访问的目的地址。在上面两个例子中,*号表示所有地址,即禁止使用代理服务器访问所有地址。而如果想仅禁止某一些地址时,可以参考下面的例子:


<Proxy http://www.google.com/>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Proxy>

<Proxy http://www.yahoo.co.jp/r/*>
    Order allow,deny
    Allow from all
    Deny from 127.0.0.1
</Proxy>


上面这个例子的意思是,仅允许本地计算机访问http://www.google.com/,并且禁止本地计算机对于http://www.yahoo.co.jp/r/下的资源的访问。由于Apache的Proxy指令目前还不能够支持多个目标地址,也就是说不能写成<Proxy http://www.google.com/ http://www.yahoo.co.jp>的形式,因此如果你想对多个目标地址做出限制时,必须使用多个Proxy指令。


如果想对所有使用者(而不仅仅是部分使用者)访问某些地址做出限制时,可以使用ProxyBlock的指令:


ProxyBlock microsoft co.jp www.google.com


上面这条指令阻挡了三种目标地址:包含microsoft的地址,包含co.jp的地址,包含www.google.com的地址。但是实际使用IE测试时你会发现,http://www.google.com/http://www.google.co.kr/(Google韩国站)将都不能访问,而http://www.google.co.kr/并没有满足上面阻挡的规则。这是因为,Apache启动时将对阻挡地址中看起来像是主机名或者域名的字符串进行域名解析,如果解析成功就阻止掉相应的目标IP地址。而www.google.co.krwww.google.com的IP地址相同,因此www.google.co.kr也同时被阻挡了。另外,由于Apache试图去解析域名,因此当你使用ProxyBlock时,Apache的启动时间会变长。


另外要注意,如果写ProxyBlock *,那么将不能通过该代理服务器来访问任何地址。


最后再介绍一下二级代理。使用Apache可以做二级代理,即让本身已经是代理服务器的Apache通过其他的代理服务器来连接Internet。加入以下指令:


ProxyRemote * http://12.34.56.78:8080


即可让Apache将12.34.56.78:8080作为代理服务器。ProxyRemote指令之后的第一个参数表示协议名称或目标地址,例如:


ProxyRemote ftp http://12.34.56.78:8080    # 对于所有ftp请求使用二级代理
ProxyRemote http://www.google.com/ http://12.34.56.78:8080    # 当访问www.google.com时使用二级代理


 

2004年12月02日

部署一个小公司的Intranet,要在软件上花费多少钱?我们假设要开一个50人的软件公司,其中30人为开发人员,20人为管理人员。公司为每个员工配置一台预装Windows XP Pro的台式机用于日常工作。另外需要一台服务器作为文件服务器、打印服务器、网关等。

首先需要购买的就是服务器的操作系统。我们选择Windows Server 2003企业版。
  + Windows Server 2003简体中文企业版一份,39946元
  + 每客户端访问许可45份,45 * 310元=13950元(由于服务器软件中已经包含了5个客户端访问许可)

然后要为每台计算机配备一套Office办公软件。
  + Office 2003简体中文专业版50份,50 * 3822元=191100元

为开发人员购置Visio绘图软件。
  + Visio 2003简体中文标准版30份,30 * 1761=52830元

为每名开发人员配备一套开发工具。为了节约开支我们选择VS.NET 2003的专业版,而不是企业开发版。
  + VStudio .NET 2003中文专业版(简体)OLP NL 30份,30 * 7287元=218610元
MSDN就算了,太贵了买不起。

公司中至少应该有一名美工负责软件界面,为他配备一套Photoshop。我在Adobe中国网站上没有找到产品报价,只好使用美元了。
  + Adobe Photoshop CS一份,649美元,合人民币5322元(美元汇率按照820计算)

为了制作产品文档,需要购买一份Adobe Acrobat。
  + Adobe Acrobat 7.0 Standard一份,299美元,合人民币2452元

公司还需要维护一个网站,所以要为美工再配备一套网页制作工具。
  + Macromedia Dreamweaver MX 2004一份,399美元,合人民币3272元

以上简单算了一下开一个公司所需要花费的软件费用,总计为52.75万元。

恐怕这个是目前最好用的网络分析工具了:

Ethereal:  http://www.ethereal.com/

目前最新版本为0.10.7,仍属于beta测试阶段,但已经能够支持602种网络协议的自动分析,支持高度可定制的过滤器功能,支持为包标记颜色以便于查看,在某些方面的功能要比Sniffer强大很多。而且它能够直接浏览tcpdump、Sniffer、NetXray等程序抓到的包。最诱人之处是它是一个基于GPL协议的开放源代码软件。

由于最近很多人询问关于如何在内网架设FTP的问题,因此在这里把经验总结一下供大家分享。


本文将分为四个部分。第一部分阐述“什么是内网架设FTP”的问题。第二部分分析FTP协议的原理。第三部分阐述在内网中架设FTP服务器时会遇到的问题以及解决方法,使外网的用户能够访问位于内网的FTP服务器。第四部分为总结。建议读者能够将这五部分全部读完。如果只想要一个快速安装指南,那么请阅读第一部分和第四部分。


本文所使用的FTP服务器为proftpd。


1. 内网FTP服务器的概念


设想下面的这种环境:几台计算机组成一个局域网,该局域网中拥有一台DHCP服务器负责为局域网中每台计算机分配IP地址。其中有一台计算机(或网络设备)作为网关(可以与DHCP服务器为同一台设备),网关通过拨号或其他方式连接到Internet,获取一个真实IP地址。局域网内的计算机通过网关的转发来实现与Internet的连接。我们定义该局域网内部为内网,相对地,定义Internet为外网。


举个例子,假设我们拥有两台计算机A、B和一个拥有拨号和DHCP功能的网关G。各自的网络配置如下:


网关G:
局域网IP地址:192.168.0.1(由网关硬件指定)
局域网子网掩码:255.255.255.0(由网关硬件指定)
广域网IP地址:12.34.56.78(拨号之后获得)


计算机A:
局域网IP地址:192.168.0.10(通过网关的DHCP功能获得)
局域网子网掩码:255.255.255.0(通过网关的DHCP功能获得)
网关:192.168.0.1(通过网关的DHCP功能获得)


计算机B:
局域网IP地址:192.168.0.11(通过网关的DHCP功能获得)
局域网子网掩码:255.255.255.0(通过网关的DHCP功能获得)
网关:192.168.0.1(通过网关的DHCP功能获得)


这样,从A、B发出的所有网络请求都会被发送到网关G(192.168.0.1),网关再将这些请求变换之后通过12.34.56.78发送到Internet,以实现A、B与Internet的连接。


需要提醒一点的是,你的网关必须拥有端口映射(Port Mapping)的功能(也称转发,Forwarding),这是下文架设服务器的先决条件。所谓端口映射功能,就是指网关能够将从外网发送到网关的指定端口的包转发到内网中指定的IP地址上。举个例子,假如我们定义了如下一条规则:将端口21映射到192.168.0.10上。那么


从外网发送到网关的一个包,其信息为
源地址:200.12.34.56:7890,目的地址:12.34.56.78:21


那么网关将修改该包的目的地址,结果为
源地址:200.12.34.56:7890,目的地址:192.168.0.10:21


并将该包发送到局域网中的192.168.0.10上。这样对于192.168.0.10来说,这个包仿佛是从Internet上直接发给自己的一样。


 


2. FTP协议原理


一般我们说,FTP协议使用TCP端口21。实际上这这并不准确;FTP协议使用TCP的21端口传送的是控制命令,同时使用随机端口来传送数据。也就是说,下载一个文件至少需要在客户端与服务器之间建立两个TCP连接,这两个连接分别称为控制连接和数据连接。


控制连接总是由客户端主动连接服务器的21端口来建立的;而数据连接则不一定。根据数据连接的建立方式的不同,FTP传送方式可分为主动方式和被动方式两种。主动方式下,服务器连接客户端的某个端口以建立数据连接;被动方式下,客户端连接服务器的某个端口来建立数据连接。


主动方式的连接过程如下:
1. 客户端用随机端口连接服务器的21端口,建立控制连接,并发送用户名和密码进行登录。
2. 客户端打开一个随机端口P进行监听,并通过控制连接将自己的IP地址和P端口的信息通知服务器。
3. 服务器用自己的随机端口连接客户端的端口P,建立数据连接,并进行数据传送。
4. 数据传送完毕之后,数据连接断开。
5. 客户端通过控制连接发送结束命令,以断开控制连接,FTP交互过程结束。


被动方式的连接过程如下:
1. 客户端用随机端口连接服务器的21端口,建立控制连接,并发送用户名和密码进行登录。(与主动方式相同)
2. 客户端通过控制连接通知服务器使用被动方式。
3. 服务器选择一个随机端口P进行监听,并通过控制连接将自己的IP地址和P端口的信息通知客户端。
4. 客户端用自己的随机端口连接服务器的端口P,建立数据连接,并进行数据传送。
5. 数据传送完毕之后,数据连接断开。(与主动方式相同)
6. 客户端通过控制连接发送结束命令,以断开控制连接,FTP交互过程结束。(与主动方式相同)


举个实际的例子来说明。下文中以S:开头的为服务器返回的信息,C:开头的为客户端命令。
主动方式:
S: 220 ProFTPD 1.2.10 Server(控制连接建立,服务器返回欢迎信息)
C: USER foo(发送用户名)
S: 331 Password required for foo.
C: PASS mypassword (发送密码)
S: 230 User foo logged in. (登录成功)
C: SYST (获取服务器类型)
S: 215 UNIX Type: L8
C: PWD (获取当前目录)
S: 257 “/” is current directory.
C: PORT 192,168,0,11,10,171 (客户端监听端口2731,并将IP地址和端口2731通过PORT命令通知服务器。2731为10*256+171)
S: 200 PORT command successful
C: TYPE A (设置传输方式为文本方式)
S: 200 Type set to A
C: LIST (发出获取文件列表的命令)
S: 150 Opening ASCII mode data connection for file list (服务器尝试连接客户端的2731端口以建立数据连接)
(通过数据连接发送文件列表……)
S: 226 Transfer complete. (文件列表传送完毕,数据连接断开)
C: QUIT (退出命令)


被动方式:
S: 220 ProFTPD 1.2.10 Server(控制连接建立,服务器返回欢迎信息)
C: USER foo(发送用户名)
S: 331 Password required for foo.
C: PASS mypassword (发送密码)
S: 230 User foo logged in. (登录成功)
C: SYST (获取服务器类型)
S: 215 UNIX Type: L8
C: PWD (获取当前目录)
S: 257 “/” is current directory.
C: PASV (通知服务器使用被动方式)
S: 227 Entering Passive Mode (192,168,0,10,132,29).
(服务器监听端口33821,并将IP地址和端口33821通过PORT命令通知服务器。33821为132*256+29)
C: TYPE A (设置传输方式为文本方式)
S: 200 Type set to A
C: LIST (发出获取文件列表的命令)
S: 150 Opening ASCII mode data connection for file list (客户端尝试连接服务器的33821端口以建立数据连接)
(通过数据连接发送文件列表……)
S: 226 Transfer complete. (文件列表传送完毕,数据连接断开)
C: QUIT (退出命令)


3. 内网FTP服务器的问题及解决方案


在这里我们沿用第一部分的网络实例,并假设FTP服务器架设在计算机A(192.168.0.10)上。


1. 如何使外网的客户端能够与内网的FTP服务器建立控制连接


由于控制连接的服务器端端口为21,因此我们只需要在网关的端口映射上添加一条规则,将21端口映射到192.168.0.10即可。


2. 如何建立数据连接


在主动方式下,数据连接由服务器发起,相当于内网的服务器主动去连接外网的客户端,这种连接可以穿过网关正常建立,因此不需要做任何特殊设置即可实现。问题是被动连接。由于被动方式下服务器会监听随机端口并需要将自己的IP地址和端口号通知客户端,这样就产生了以下两个问题:
a) 服务器仅知道自己的内网IP地址(192.168.0.10),它会将这个IP地址通知给外网的客户端,而客户端从外网是无法连接这个内网IP地址的(客户端不知道该如何路由);
b) 服务器需要监听随机端口,范围为1024-65535,出于安全起见,也考虑到可能存在其它的服务也使用该范围内的端口,因此不可能在网关上将这些端口全部映射给192.168.0.10。


由于以上的问题的存在,我们经常可以看到连接服务器时下方的连接日志停在
150 Opening ASCII mode data connection for file list
处迟迟不动,这就是因为被动数据连接无法建立。


对此proftpd提供了如下的解决方案。
a) 通过MasqueradeAddress命令指定服务器通知给客户端的IP地址。即使得FTP服务器不再将自己的内网IP地址192.168.0.10通知给客户端,而是将MasqueradeAddress命令指定的IP地址通知给客户端。在proftpd.conf中添加如下命令:
MasqueradeAddress 12.34.56.78 (指定为网关的外网地址)


如果网关的外网地址不固定(例如通过拨号获取IP的情况),那么你需要为你的网关申请一个动态域名,并用MasqueradeAddress命令将域名指定给服务器。
MasqueradeAddress myftpserver.vicp.net


b) 通过PassivePorts命令来限制被动方式下监听的端口的范围。例如
PassivePorts 60000 65535
这样服务器在被动方式下将仅使用60000-65535之间的端口,而不是原来的1024-65535。然后在网关上添加规则,将60000-65535的所有端口映射到192.168.0.10上。


这样,外网的客户端就可以正常访问FTP服务器了。



但是上面的方法并不是十全十美的。我们用MasqueradeAddress命令强制FTP通知网关的IP地址,这对于客户端位于外网的情况下是正确的,但是当客户端位于内网时,客户端可能会无法解析网关的IP地址,导致无法建立数据连接。


4. 总结


内网架设FTP服务器的方法:


1. 在proftpd.conf中利用MasqueradeAddress命令将网关的IP地址或域名指定给FTP服务器,例如
MasqueradeAddress myftpserver.vicp.net

MasqueradeAddress 12.34.56.78


然后通过PassivePorts命令来限制被动方式下监听的端口的范围,例如
PassivePorts 60000 65535


2. 在网关的端口映射上将第一步中指定的端口范围(例中为60000-65535)以及FTP端口21映射到FTP服务器的内网地址上。

2004年11月27日

注:这里的fdisk不是DOS中的fdisk,而是linux的fdisk。

我的硬盘上已经划分了好多分区,每个分区上都装了不同发行版的Linux。今天想再从剩下的空间中划出分区来安装Fedora Core 3,却失败了。察看了一下分区表的结构:

Disk /dev/hda: 80.0 GB, 80025280000 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot    Start       End    Blocks   Id  System
/dev/hda1   *         1      1275  10241406    7  HPFS/NTFS
/dev/hda2          1276      6374  40957717+   7  HPFS/NTFS
/dev/hda3          6375      7139   6144862+  83  Linux
/dev/hda4          7140      8663  12241530    f  Win95 Ext'd (LBA)
/dev/hda5          7140      7204    522081   82  Linux swap
/dev/hda6          7205      7690   3903763+  83  Linux
/dev/hda7          7691      8177   3911796   83  Linux
/dev/hda8          8178      8663   3903763+  83  Linux

从硬盘的分区结构来看,hda5-8已经占用了扩展分区hda4的全部空间,而硬盘上的剩余空间位于hda4之后。所以要想使用硬盘上最后的剩余空间,就必须要在hda的分区表上添加一个分区,而hda的分区表已经全部被占用(hda1-4),所以当然就不能添加更多分区了。

解决办法就只有扩大hda4的大小,让它能占用整个硬盘上的剩余空间,然后将新的分区划分到hda4中。

看了一下fdisk的帮助,好像没有能够直接修改分区大小的命令,没办法只好把分区删除再重建了。为了以防万一,首先执行 # dd if=/dev/hda of=/root/mbr bs=1 count=512 备份了一下MBR,然后将备份出的/root/mbr文件放到一个安全的地方。然后记下各个分区的起始地址和结束地址以备以后恢复分区时使用。用d命令删除hda4,这样位于hda4上的hda5-8就全部被删除了。然后用 n 命令新建分区,选择 e 表示建立扩展分区,分区的起始和结束地址就使用默认值也就是让它充满剩余的所有空间。然后用 t 命令将hda4的格式修改为W95 Ext’d (LBA),编号为f。然后根据以前记下的分区起始和结束地址信息,依次建立hda5-8。最后用p命令查看分区表结构如下:

Disk /dev/hda: 80.0 GB, 80025280000 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot    Start       End    Blocks   Id  System
/dev/hda1   *         1      1275  10241406    7  HPFS/NTFS
/dev/hda2          1276      6374  40957717+   7  HPFS/NTFS
/dev/hda3          6375      7139   6144862+  83  Linux
/dev/hda4          7140      9729  20804175    f  Win95 Ext'd (LBA)
/dev/hda5          7140      7204    522081   82  Linux swap
/dev/hda6          7205      7690   3903763+  83  Linux
/dev/hda7          7691      8177   3911796   83  Linux
/dev/hda8          8178      8663   3903763+  83  Linux

可以看出修改后的分区表除了hda4之外,其他的所有分区的结构都没有改变。这样位于hda9之后的8664-9729就可以拿出来划分新的分区了。

然后就是用 w 命令保存。为了保险起见,使用 fsck.ext3 命令检查了一下 hda6-8,保证没有出现错误。

2004年11月18日

最近Sun已为它的Solaris 10提供了免费的许可证,任何人只要在sun的网站上注册就可以获得任意数量的许可。Sun毫不隐讳地解释说,此举是为了与Redhat的战略相对抗。

虽然说Solaris 10免费,但是并不是完全的无偿,如果需要技术支持、升级等服务的话还是需要缴纳一定的费用的。据说如果在4台AMD CPU的计算机上部署Solaris 10的话,那么每年最多需要向Sun支付1495美元。

从Sun的网站上可以得到Solaris 10的免费下载:
http://wwws.sun.com/software/solaris/solaris-express/get.html

2004年11月16日

上次安装Debian的时候有网友推荐我试试Hiweed,今天就尝试着装了一下。

1. 安装

Hiweed(http://linux.hiweed.com/)是Debian的一个汉化版,目前最新版本是0.55。安装盘很小,只有240M左右,很快就下载结束了。我采用了光盘方式安装,所以把它刻到光盘上。安装前听说0.55安装程序的分区工具有bug,会分区失败,所以我先启动了原有的Linux进行分区。我的系统的分区情况如下:
    /dev/hda1,10G,Windows 2000;
    /dev/hda2,40G,Windows 2000的数据盘;
    /dev/hda3,6G,Redhat Linux 9;
    /dev/hda4,扩展分区;
    /dev/hda5,512M,Linux交换区;
    /dev/hda6,4G,Debian GNU/Linux 3.0;
    /dev/hda7,4G,Linux数据盘;
于是又在最后增加了4G的一个分区/dev/hda8用于安装Hiweed。分区并格式化成ext3格式,然后使用Hiweed的安装盘启动系统。很顺利地到达分区的一步,把/dev/hda8挂接到/上,然后进行安装。

安装结束之后使用grub启动Hiweed成功。将后继的安装和设置工作做好之后,保存设置并退出,重新启动并进入原有的Redhat系统,修改/boot/grub/menu.lst增加如下几行:
    title Hiweed Linux
    root (hd0, 7)
    kernel /vmlinuz root=/dev/hda8
    initrd /initrd.img
然后重新启动,即可通过启动菜单来进入Hiweed了。

2. mplayer的安装

装好Hiweed之后,系统自动认出了我的声卡,而且使用xmms来播放mp3文件也没有问题了。为了能观看视频文件,决定安装一个mplayer。从hiweed的官方网站上看到安装mplayer需要下载一个mplayer的包,而这个包坏是没有被包含在Debian的官方站点上的。所以需要修改一下apt-get的镜像列表/etc/apt/sources.list文件,增加以下一行:
    deb http://debian.okey.net/debian-uo sid misc marillat rareware ustc java firefly
然后执行 # apt-get update,再 # apt-get install mplayer-686就可以了。

但是安装好mplayer之后运行时出错,说在库文件libavcodec2.so中找不到一个什么函数。查了一下网上的文档,得知最新的libavcodec2库中删除了那个函数,所以要想让mplayer运行还需要安装一个较老的版本的库文件。到网上下载了一个libfaad2-0_2.0.0-0.2.i386.deb,然后卸载原来的libfaad2-0库,安装这个新下载的库。安装之后mplayer就可以正常运行了。

安装mplayer的时候apt-get建议同时安装w32codecs包,顾名思义该包中应该包含了常用的视频插件。

经过测试,mplayer filename.avi可以很顺利地执行,但是播放DVDRip的时候会出现声音和图像不同步的情况。增加跳帧选项之后可以解决这个问题,命令行为 mplayer -framedrop filename.avi。虽然会丢失一些帧,不过基本上对观看没有影响。再有就是全屏模式,使用 -fs 参数可以以全屏模式来播放,但是播放的画面尺寸不会变化。虽然使用 -zoom 参数可以使用软件放缩,但是这会消耗大量的CPU资源,使得丢帧现象非常严重。因此只好使用 -vm 参数来改变屏幕分辨率,使得画面尽量接近全屏尺寸,命令行为 mplayer -fs -framedrop -vm filename.avi。或者指定视频输出设备来实现画面尺寸的缩放,实验了一下我的电脑上只有sdl方式可以使用并且能够达到较好的效果,命令行为 mplayer -fs -vo sdl -framedrop filename.avi。

mplayer可以支持字幕显示,可以使用 -sub 参数来读取字幕文件,也可以通过把字幕改成与视频文件同名的方式来显示字幕。

另外,由于安装了w32codecs包,通常的.rmvb文件也可以顺利地播放了,而且效果要比hiweed自带的realplayer好得多的多。

3. 游戏

说到游戏,首先想到的就是平常经常玩的GBA游戏了。VisualBoy Advance支持Linux,于是到它的官方网站上下载了VBA的Linux版。解压缩之后是一个可执行文件VisualBoyAdvance和一个配置文件VisualBoyAdvance.cfg。启动VBA,使用命令行 # ./VisualBoyAdvance romname.zip,游戏的画面出来了,不过音效比较差,而且键位设定为模拟器的默认键位设定。打开配置文件VisualBoyAdvance.cfg,首先修改soundQuality=1(原值为2,即22KHz音质,改成1为44KHz音质),然后选择使用MMX(disableMMX=0)。比较麻烦的是修改键位设定,键位设定的方式与Windows版VBA的配置方式不同,配置文件前的注释中说明,一个键由一个四位十六进制数表示,第一位为0表示控制设备为键盘,大于0则表示第几号手柄。当第一位为0时,后三位数字则为SDL库中的键盘定义值,需要参考SDL库的SDLkeysym.h头文件才能知道确切的值。于是先下载了最新版的SDL库(SDL-1.2.7.tar.gz),然后将其中的SDLkeysym.h头文件解压,对照此文件改好键位配置。修改后的键位配置如下:

Joy0_Left=0061        # A键
Joy0_Right=0064        # D键
Joy0_Up=0077        # W键
Joy0_Down=0073        # S键
Joy0_A=006b        # K键
Joy0_B=006a        # J键
Joy0_L=0074        # U键
Joy0_R=0069        # I键
Joy0_Start=0068        # H键
Joy0_Select=0066        # F键
Joy0_Speed=0020        # 空格键
Joy0_Capture=0125

这样基本上就与Windows下的设置差不多了。启动的时候加上 -F 参数可以使用全屏幕方式进行游戏。

4. 访问Windows

我的大部分资源(电影、音乐等)都放在另外一台电脑上,总不能说想在Linux下看电影、听音乐的时候现使用FTP下载吧。查了一下资料发现Samba可以实现Windows与Linux下的文件共享。

首先安装了一个smbclient包(同时需要安装libm4-0和samba-common两个包)。安装好之后使用 smbclient -L 192.168.0.10 就可以看到我的Windows计算机上的共享资源了,而使用 smbclient \\\\192.168.0.10\\Music 则可以像FTP客户端那样访问共享资源中的Music目录,也可以进行上传下载等操作。

只是距离理想状况还差一点点,我希望能够把Windows的共享资源加载到Linux的文件系统中。我知道有个叫做smbmount的命令可以做到这一点,但是该命令位于哪个包里我不敢确定。幸好通过命令行自动完成功能可以看到包的名字,即先输入 # apt-get install smb 然后按TAB键,系统会把能够安装的所有的以smb开头的包的名称都列在这里。居然能够判断当前需要什么参数,并将可能的参数列出来,这点要比Redhat只能对于文件名进行补齐要强大得多。找找看发现了一个名叫smbfs的包,感觉可能与smbmount有关,于是就安装。装完之后发现smbmount命令可以使用了。

使用 #smbmount \\\\192.168.0.10\\Music /mnt/smb 命令即可将Windows的共享资源加载到文件系统中。由于hiweed的默认语言设置为 zh_CN.GBK,所以共享资源中的中文文件名也能够完美地显示出来。

2004年11月08日

前一阵子下载了FreeBSD5.3 RC1版,本来想马上装的,结果安装时发现FreeBSD只能装在主分区上,而我的主分区都已经被Windows和Linux占用了,没办法只好作罢。最近得到一块4G的小硬盘,于是决定把它作为FreeBSD的领地。

使用第一张光盘启动计算机。不一会儿就进入了FreeBSD的引导菜单,选择第一项进入通常启动方式。之后启动的就是sysinstall的主菜单了。我想弄明白具体的安装过程,所以选择了Custom方式安装。

之后出来的菜单包括下面几个选项:Exit、Options、Partition、Label、Distributions、Media、Commit。首先选择Options,将安装媒体类型选为CDROM,超时时间的默认值是300秒,把它改成30秒免得万一光盘读不出来要等上5分钟。

然后选择Partition进入分区界面。第一次看见FreeBSD的分区工具,跟Linux完全不一样,许多看不懂的东西只能推测了。看了看大概能明白Slice就是分区,硬盘被标记为ad0、ad1等,硬盘上的分区(Slice)被称为ad0s1、ad1s1、ad1s2等。我选择了第二块硬盘ad1,确认是那块4G的硬盘之后才敢动手。本来想直接选择A-Use Entire Disk的,后来想到FreeBSD也需要交换区,所以还是自己分区吧。由于内存为512M,所以大概要为交换区留出500M空间来。参考了一下官方网站的文档,决定还是按照建议的方式进行安装,即/=128M,swap=512M,/var=256M,/usr=剩余。这样我的/usr上还大约剩余3.2G的空间,应该够用了吧。最后分区结果如下:ad1sd1=127M,ad1sd2=511M,ad1sd3=255M,ad1sd4=3217M。

之后是提示选择启动程序,由于我想使用第一块硬盘上Linux的grub来启动,所以这里选择了none。
下一步选择Label。试了一下用A来自动指定,系统居然说我的第一个分区太大而不能作为root分区。于是决定用C键手动创建Label,按照刚才的分区计划指定好各个分区的挂接点。指定结束之后按Q键退出。

感觉FreeBSD中挂接点上挂接的是Label而不是分区,而在一个分区中可以指定多个Label,各个Label的大小也可以分别指定,也就是说,FreeBSD的Label的概念就类似于Linux中的分区的概念,也就是说刚才分区的时候即使把整个硬盘都作为同一个分区也没问题。

下一步的Distribution就是要选择安装软件了,我选择了All。选择的时候系统弹出一个对话框向我推荐安装一个叫做FreeBSD ports collection的东西,据说是可以随时从网上下载软件包并自动安装的东西(很像Debian的apt系列),装就装吧。

下一步是选择安装媒体Media,前面在选项里面选过了,确认一下是CDROM就可以了。

最后Commit,开始安装。

安装的时候会有进度条提示安装到什么地方了,不过消息不是很详细。大约等了半个多小时吧,安装完毕,弹出一个提示框问我要不要再最后确认一次配置情况,选择是之后就又回到了刚才的安装界面,于是直接退出,返回到主菜单(就是选择Custom安装方式的那个菜单)。

在sysinstall的主菜单中选择“Configure”进行系统配置。Packages中可以增加其他的软件包(突然发现里面实际上还有很多没有安装的软件……),由于担心4G硬盘不够用,决定以后再装;Root Password是一定要设置的;Fdisk和Label可以查看分区和Label状况;User Management中增加一个自己常用的帐户(需要先增加一个组然后才能增加帐户,不像Redhat那样增加了帐户之后会自动建立组);Console中可以设置控制台字体等,为了避免由于控制台问题而不能正常显示内容就先免了,以后熟了再说吧;Time Zone是设置时区,选中之后系统问我系统时钟是不是UTC时钟,并建议如果不是UTC而是本地时钟的话一定要选No,所以当然选No了,然后配置好时区;Mouse可以配置控制台鼠标。

Network中可以设置许多网络配置以及网络服务等。首先选择Interface配置网卡(FreeBSD中的网卡叫做fxp0而不是eth0),在列表中选择自己的网卡,提示是否要支持IPv6,选择No,然后提示是否要尝试使用DHCP获取地址,我打算指定,所以选择No,然后配置好主机名、IP地址、域名服务器、网关等信息。配置好之后确定,提示是否要立即启动网卡,回答是,然后从局域网中其他的机器上试着ping了一下这台机器居然马上就通了。然后下面是配置ftp、http等各种网络服务,还是先算了吧。

然后后面的Security配置就忽略了,Startup中去掉了quota的选项,一个人用还用什么quota。下一项TTYs设置,选择之后系统提示说用不着改,不过出于好奇还是选了Yes,结果出来一个没见过的编辑器——好危险,幸好屏幕上方提示用^[退出,按Esc,[,系统菜单弹出来了,选择退出。后面的Options就是安装之前用过的那个了,HTML Docs就是阅读FreeBSD手册,而Load KLD需要软驱才能执行,我没有软驱,所以也不知道是干什么的,不过看名字也许是从软盘读入内核吧。

最后退出Configure菜单。退出之后发现没有什么可以选的东西了,于是选择退出安装,重新启动系统。

重启之后进入Linux的Grub(因为我没有安装FreeBSD的bootloader),按c进入命令行模式,输入root (hd1,0,a),(才发现原来BSD的文件系统要在分区编号后面再加一个参数,大概就是Label了)然后输入kernel /boot/kernel试图读取内核结果失败……后来想起Windows的启动是利用chainloader命令的,所以把命令改成rootnoverify (hd1,0,a); chainloader +1; boot,这下成功启动FreeBSD。

启动之后输入startx进入XWindow,啊,默认的窗口管理器是tvm,对此就不说什么了,不过分辨率居然是1280×960而且显示都偏到一边去了。准备改改显示设置,结果找了半天没找到XF86Config文件。在Login窗口中输入exit退出X,看了看X启动时的信息,发现原来FreeBSD也开始使用XOrg了,看来XFree86换了许可协议莫非大家都没有人用了。找了找还是没有发现配置文件在什么地方,于是试着敲了一下xorgcfg,居然启动了X的配置程序。试着配置了一下,保存时提示是否要保存为/usr/X11R6/lib/X11/xorg.conf,才知道原来不运行xorgcfg的话配置文件是不存在的。随便改了改,再启动startx进入X后发现分辨率还是不对,于是打开/usr/X11R6/lib/X11/xorg.conf手动修改,在最下端的Devices节中添加DefaultDepth 16,并在相应的色深为16的Subsection中添加Modes “1024×768″。重新启动X,这下分辨率正常了。然后在X下运行xvidtune,调整屏幕的位置,调整好之后点击“Show”按钮,然后将显示出的ModeLine值添加到/usr/X11R6/lib/X11/xorg.conf的Monitor节中,重新启动X,这下显示完全正常了。

最后就是重新启动系统进入Linux,在/boot/grub/menu.lst中加入FreeBSD的启动命令。

2004年11月07日

Redhat9自带的内核是2.4.20版,已经是几年以前的了,最近打算将它升级到最新的2.6.8.1内核。

1. 下载内核并做安装准备

首先到官方网站http://www.kernel.org/ 上下载了kernel-2.6.8.1。将其展开到/usr/src/下。参考了网上的一些文章,得知Redhat9要想成功编译2.6.8.1版内核需要升级两个工具:modutils和mkinitrd。modutils很好找,于是就找了一个module-init-tools3.0版,然后升级:

# ./configure –prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf

由于modutils3.0和Redhat9自带的modutils2.4版不兼容,所以需要在make之前使用make moveold命令将Redhat9自带的modutils2.4版的文件改名为.old,这样使得即使在使用原有的2.4内核时modutils能够调用旧版本的modutils来工作。

新版的modutils不再使用/etc/modules.conf,而是使用/etc/modprobe.conf。

至于mkinitrd,一时没有找到该软件,所以就没有装(不过到最后还是不得不装)。

2. 内核编译

然后进行内核配置。首先进入/usr/src/linux-2.6.8.1,执行make mrproper以保证内核源码干净,然后使用make menuconfig进行内核配置。2.6.8.1版的内核中已经默认选中了很多特性的模块支持,所以我基本上没有进行任何改动——主要增加了以下的几个选项。

  • Loadable Module support中的Module unloading
  • Processor type and feathures中的Preemptible Kernel
  • File System中的NTFS支持和NTFS写支持。
  • Device Drivers -> Graphics support中有个Logo configuration,觉得有点新鲜就选中了其中的Bootup Logo和Standard 244-color Linux logo;还有个Console display driver support,选中了里面的Framebuffer Console Support和Select compiled-in fonts和VGA 8×16font。注意Framebuffer Console Support一定要选成built-in不要选成module,否则启动时系统无法使用VESA的控制台。另外检查一下Graphics support中的Support for frame buffer devices和VESA VGA graphics support要被选中。

开始编译内核:

# make bzImage
# make modules
# make modules_install
# make install

make install之后检查/boot/grub/menu.lst,发现新内核的启动菜单已经自动添加上了。重新启动电脑,选择新的内核进行启动,结果Kernel panic,说找不到root=LABEL=/。查了一下资料发现原来2.6.8.1版内核不支持LABEL=/参数,于是重新启动时在grub中修改启动参数,删除了root=LABEL=/启动参数,结果还是Kernel panic,说找不到init程序。不得已重新启动,在grub中删除了initrd一行,结果启动成功。想想第二次Kernel panic时的错误信息是有关启动镜像initrd的错误,于是觉得是不是由于没有升级mkinitrd的缘故而导致initrd启动镜像与新的内核不兼容?于是找了一个mkinitrd-3.5.14-1的rpm包安装:

# rpm -e –nodeps mkinitrd
# rpm -i mkinitrd-3.5.14-1.i386.rpm

之后进入/usr/src/linux-2.6.8.1,执行make install,然后修改/boot/grub/menu.lst,去掉root=LABEL=/参数(以后每次make install之后都要进行这一步,麻烦)。重新启动,成功。看来mkinitrd还是要升级的。

3. 支持hotplug

2.8的内核中,/proc/ksyms变成了/proc/kallsyms,因此启动脚本/etc/rc.sysinit中相应的文件名都要跟着改变。为了兼容原有的2.4内核,需要添加以下几行:

#
# —– KERNEL 2.6.x support ——
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
fi

然后把rc.sysinit中出现的/proc/ksyms全部替换成$KSYMS即可。

4. 支持sys文件系统

2.8内核中的一部分设备信息已经由proc转移到sysfs中,因此需要在系统中增加对sysfs的支持。首先建立/sys目录,然后修改/etc/rc.sysinit,在mount -f /proc下增加:

if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi

在action $”Mounting proc filesystem: ” mount -n -t proc /proc /proc下增加:

if [ "$KERNELVER" = "2.6" ]; then
action $”Mounting sysfs filesystem: ” mount -n -t sysfs /sys /sys
fi

然后在/etc/fstab中增加:

none /sys sysfs defaults 0 0

最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:

将:
awk ‘$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk ‘$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}

5. 支持USB设备

修改/etc/modprobe.conf,寻找usb-controller,可以看到modutils自动生成的modprobe.conf文件中,usb模块名使用的还是原来的usb-ochi、usb-uhci等,而2.8内核中usb模块的名字已经变成了ohci-hcd等。所以需要将这里改成

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd
alias usb-controller2 uhci-hcd

6. rpm工具在2.8内核下不能使用的问题

启动到新的内核之下后,运行rpm -q glibc,你会发现rpm程序死在那里了,只能通过killall -9 rpmq来杀掉。可以通过下面这个方式来临时解决:

export LD_ASSUME_KERNEL=2.2.5

当然你可以将该行添加到~/.bashrc或/etc/bashrc中。

7. 百兆网卡不能正常工作的问题

安装好新内核之后试图下载其他的软件,发现速度奇慢,仿佛是在用10M网卡一样。查了一下资料得知可以用mii-tool来修改网卡的工作方式。执行

mii-tool -F 100baseTx-FD

以强制网卡工作在100M全双工方式下。原以为重新启动系统之后需要重新设置网卡工作方式,谁知启动之后执行mii-tool它报告说eth0: no autonegotiation, 100baseTx-FD, link ok,不知何故系统能够自动识别网卡的工作模式了。

8. 自定义启动Logo

以前在配置内核的时候选中了启动Logo的支持,现在只要在启动的时候加上参数vga=0×318就可以使用VESA方式启动并看到小企鹅的Logo了。

不过使用下面的方法可以将企鹅的Logo换成自己喜欢的任意图片。内核所能支持的图片格式为ppm,最大色数为224色。

首先准备一幅自己喜欢的图片(尺寸不要太大,因为是要编译到内核中的,太大了会增大内核的体积),然后将背景涂成黑色(由于控制台的背景就是黑色嘛)。然后将该图片保存成png格式,例如linuxlogo.png。在Linux下使用下面的命令:

# pngtopnm linuxlogo.png > linuxlogo.pnm
# pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
# pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm

然后用生成的linuxlogo224.ppm替换/usr/src/linux-2.6.8.1/drivers/video/logo/logo_linux_clut224.ppm(最好先做好备份),然后删除同一目录下的logo_linux_clut224.c文件,重新编译内核,安装之后别忘了修改/boot/grub/menu.lst,去掉root=LABEL=/并加上vga=0×318。启动之后就可以在屏幕左上方看到自己的Logo了。

 

2004年11月03日

前几天一直在试图在Sony C1上安装Fedora Core 2(http://www.donews.net/charlee/archive/2004/10/31/157517.aspx),最后虽然可以用了,但是终于因为速度太慢而放弃了。听说VineLinux在老机器上跑得比较好,所以今天下载了一个VineLinux3.0版来尝试一下。

与前天安装Fedora Core 2类似,使用VineLinux的启动光盘启动。Vine的启动界面做得还不错:

选择文本方式安装(试着选了一下图形方式安装,结果由于不能识别1024×400的分辨率而无法进行)。安装程序使用的是Redhat的anaconda,所以安装界面与Redhat 8.0以前的版本非常相似:

比较令人高兴的是,VineLinux能够直接认出PCMCIA接口的光驱,这样就可以从光盘上直接进行安装了,不必再去寻找镜像服务器。选择的包不多,所以大约用了半个小时就装完了。

最后安装结束之前安装程序anaconda出现了错误——可以说安装并没有正常结束。不过重新启动机器之后,VineLinux居然能够启动了。使用root登录,首先尝试一下启动X-window。可惜第一次启动失败,查了一下发现没有/etc/X11/XF86Config文件,于是就把以前用在Fedora Core 2上的配置文件原封不动地复制到/etc/X11中。再次使用startx启动,还是起不来。不过如果直接执行X的话没有问题,Xserver能够运行,这说明X方面的配置没有问题。

不知道为什么startx不能用,目前暂时的解决办法是,启动xinit,这样Xserver启动之后会出现一个控制台,利用该控制台执行gnome-session。退出的时候不能使用gnome中的logout,而需要在该控制台中使用logout命令。

不管怎样,Vine在这台笔记本上的性能表现还是令人满意的。由于没有装什么软件,所以启动了一下Gimp看看效果。

Gnome的主界面。

USB设备的自动识别。

Gimp。