Linux 版 (精华区)

发信人: atach (Ata), 信区: Linux
标  题: FreeBsd历险
发信站: 哈工大紫丁香 (Sat Jun  7 17:45:54 2003)


FreeBSD浅度历险 

    可能是刚刚过完年的原故,也可能是因为家里刚刚添了一个小宝宝的原因。过完年的
这一个多月,我怎么也没有办法刹下心来写程序。每天坐在计算机前不是看电影就是在网
上毫无目地的闲逛。一天在www.linuxsir.com的bbs上看到一个关于FreeBSD启动Gnome速度
神速的帖子。这引起了我极大的兴趣,顿感手痒难奈。 

我以前听说过FreeBSD,但从来没玩过。在我以前的感觉中,FreeBSD是专门运行在服务器
上,用命令行操作的专用操作系统。哈哈,纯粹一个FreeBSD菜鸟。这篇文章记录了我安装
、配置FreeBSD的过程。写这篇文章的目的一方面是为了防止我过一段时间忘记了安装的细
节;另一方面是为了同FreeBSD迷们分享经验,对于像我一样的初学者可以少走一些弯路。
 

1、安装哪个版本的FreeBSD 

由于我对FreeBSD一无所知,因此像这么简单的问题都成了大问题。为了找到答案,我翻遍
了linuxsir的bbs。在那里有很多FreeBSD大虾关于版本问题的介绍,大致情况如下: 

  a)4.7。它是FreeBSD-4的当前稳定发行版。 
  b)4.8。它当前的版本是RC2。 
  c)5.0。它是FreeBSD的一个新分支,据说对中文支持不是太好。 
   
我选择了4.7版。呵呵,我这人就是落后。当别人都在装RedHat 8.0的时候,我却装7.3。
呵呵,比较省心嘛。 

2、如何获取FreeBSD 

这对我来说,也是一个大问题。我在网上找了半天,也没找到一个比较快的下载FreeBSD的
FTP站点。最后没办法了,就去FreeBSD的老家ftp.freebsd.org试试,居然下载速度是150
k/s,爽。如果使用wget访问ftp.freebsd.org,需要附加参数--passive-ftp。 
wget --passive-ftp -r ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAG
ES/4.7/ 

FreeBSD 4.7一共有5张光盘: 
-rw-r--r--   1 ftpuser  ftpusers 639729664 Oct 10 00:11 4.7-disc1.iso 
-rw-r--r--   1 ftpuser  ftpusers 666075136 Oct  9 09:17 4.7-disc2.iso 
-rw-r--r--   1 ftpuser  ftpusers 654835712 Oct  8 12:13 4.7-disc3.iso 
-rw-r--r--   1 ftpuser  ftpusers 648937472 Oct  8 12:47 4.7-disc4.iso 
-rw-r--r--   1 ftpuser  ftpusers 198672384 Oct 10 01:07 4.7-mini.iso 

我后来才知道,其实只需要下载4.7-mini.iso这张光盘就行了。在FreeBSD中,安装软件基
本上都是通过Ports完成的。 

3、安装FreeBSD 

在写安装系统这部分前,我现介绍一下我的机器配置: 

  CPU  PIII 733 
  Memory 512M 
  IDE0  60G Dos 
  IDE1  15G  
  IDE2  15G Linux 
  IDE3  CDROM 
  Sound  cs4281 
  Video  Radeon7500 
  Mouse  ps/2 
  Network  VIA VT6102 Rhine II 10/100BaseTX + ADSL 
   
我使用FreeBSD的硬盘安装方式安装FreeBSD。把FreeBSD的光盘镜像拷到一个FAT32分区里
。制作了两张安装启动软盘。这两张软盘的镜像分别是floppies/kern.flp和floppies/mf
sroot.flp。 

DOS/Windows下执行: 
  TOOLS\RAWRITE FLOPPIES\KERN.FLP A: 
  TOOLS\RAWRITE FLOPPIES\MFSROOT.FLP A: 
   
Linux下执行: 
  dd if=kern.flp of=/dev/fd0 
  dd if=mfsroot.flp of=/dev/fd0 
   
用软盘引导机器,终于看到了FreeBSD的安装界面了。呵呵,真是出奇的简陋,甚至还比不
上早期SCO UNIX的安装界面。在安装界面里我选择硬盘安装,结果提示我找不到FreeBSD安
装文件,什么原因?切换到Windows下,上网查了半天资料才知道FreeBSD的安装文件必需
方在一个Dos主分区里,而且存放文件的目录必需是分区根目录下的FREEBSD目录。这安装
程序真是够弱智的了,远远比不上现在RedHat的安装程序。一顿翻箱倒柜后,终于找到了
一块4年前的2G硬盘。把FreeBSD安装文件拷这块硬盘上,并把它挂到IDE0上。这回FreeBS
D的安装程序终于找到的安装文件。 

在网上看到FreeBSD的分区概念与Windows和Linux有所不同。下面这段话是我摘录自http:
//www.powerba.com/develop/os/unix/article/20010601003.htm。 

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

我个人感觉slice的作用应该等同于windows的扩展分区。我打算在IDE1上的硬盘上安装Fr
eeBSD。由于没有经验,一切采取默认设置: 
  a)在整块硬盘上建立一个slice。 
  b)在slice建立FreeBSD分区,默认分区方式。 
  c)安装Boot Manager到IDE1的MBR(ad1)。 
  d)安装软件种类选择All,安装Ports。呵呵,当时我根本就不知道Ports是什么。反正
,让安装就先装上。 
   
很快,安装就结束了。这可不是FreeBSD有多快,而是安装程序根本就没装多少Package。
修改Bios,令IDE1为引导硬盘。于是,我就进入了FreeBSD。 


3、Boot Manager 

在进行其他配置之前,我想先解决多重引导问题。毕竟来回切换BIOS太麻烦了。当把Wind
ows和Unix类操作系统安装在一台机器上时,安装各种Boot Mananger的时候一定要小心。
以前,在使用RedHat 6.2的时候就曾经吃过大亏。那时候,胡里胡都地把lilo安装在Wind
ows所在硬盘的MBR上,结果Windows引导不起来了。后来,为了避免出错,我都是每种操作
系统单独使用一块硬盘,并在各自的MBR上安装Boot Manager。在以前,我甚至把Lilo安装
在软盘上,反正启动的时候只是读一个sector,慢也慢不到哪里。后来,我用Windows NT
的OS Loader进行多重引导。 

像以前在Linux下作的那样,我进行了一下操作: 

  a)dd if=/dev/ad1 of=bootsect.bsd bs=512 count=1 
  b)把bootsect.bsd拷贝到Windows的c:\下。 
  c)编辑boot.ini,添加一行c:\bootsect.bsd="FreeBSD 4.7"。 
  d)重新引导系统。 
   
这时候,我看到了NT OS Loader的Boot选择菜单。我想测试一下FreeBSD是否能够正常引导
,于是我选择了FreeBSD 4.7菜单项。OK,显示出来FreeBSD的Boot Manager菜单。我按键
F1,想引导FreeBSD。这时候: 

..........................灾难发生了!!! 
..........................别拦这我,我要跳楼!!! 

发生什么事情了?FreeBSD的Boot Manager居然又跳回了Windows OS Loader菜单了。怎么
回事?不清楚。我选择了Windows 2000,想进入Windows后,上网查查是怎么回事。但...
......Windows启动不起来了。我重新启动,再次尝试进入Windows结果还是一样。晕。我
赶紧跑到Linux下,用FDisk看看Windows的分区。..........发现,IDE0上的Windows分区
变成了IDE1上的FreeBSD分区了。也就是说IDE0上的硬盘的分区和IDE1上的硬盘的分区完全
一样了。晕毙。 

怎么会这样呢?Windows完蛋了,上不了网,我只好跑到FreeBSD里去查阅FreeBSD的HandBo
ok。HandBook关于FreeBSD和NT OS Loader是这样描述的: 

  a)如果FreeBSD和Windows安装在同一块硬盘上,可以把/boot/boot1直接拷贝到window
s下当做引导文件。 
  b)如果不是安装在同一块硬盘上,/boot/boot1不能引导FreeBSD。这时候就需要/boot
/boot0。但是不能简单的把boot0拷贝到Windows下。boot0相当于FreeBSD的Boot Manager
。该Manager每次运行的时候读取分区表,通过分区的active标志判断上次启动的操作系统
。当用Manager启动某个操作系统时,该Manager重写分区表。 
  
现在我知道了,刚才我执行的操作相当于(其实就是)把boot0拷贝到windows里了。这是
我见过的最缺德的一种Boot Manager了。你见过更缺德的么? 

至于说如何把Windows NT OS Loader和boot0联合到一起使用,我就不知道了。因为,我再
也没敢尝试。毕竟重新安装Windows需要很长的时间。在安装FreeBSD前,为了安全起见,
我把我现在正在做的项目Looking备份到我的数码相机中。但我的硬盘中的大量的资料全都
丢失了,特别是我们家宝宝从出生到现在的400多张相片。真是心疼呀! 

于是安装FreeBSD变成了安装Windows 2000。在安装Windows 2000的过程中,我在想:如果
Looking也没了,我该怎么办?改行,去开小买店。 

经过这次沉重的打击后,我真想放弃FreeBSD。呵呵,但那不是我的风格。不仅要FreeBSD
,而且一定要解决多重启动问题。FreeBSD的Boot Mannager不敢使了,就换一个更好的Bo
ot Mananger。我选择了Grub。 

cd /usr/ports/sysutils/grub 
make install clean 

OK,grub安装好了。FreeBSD的Ports真是个好东西。 
mkdir /boot/grub 
cp /usr/local/share/grub/i386-freebsd/* /boot/grub 

为了安全起见,我制作了一个grub启动软盘。 
dd if=/boot/grub/stage1 of=/dev/fd0 bs=512 count=1 
dd if=/boot/stage2 of=/dev/fd0 bs=512 seek=1 

用软盘启动进入grub交互界面。 
进入FreeBSD: 
  root   (hd1,0,a) 
  kernel /boot/loader 
   
进入Windows 2000 
  rootnoverify (hd0,0) 
  chainloader +1 

统统OK,Grub真是个好东东。根据上面的Grub命令编辑/boot/grub/menu.lst。我要把GRU
B安装到IDE1上,也就是FreeBSD所在硬盘的MBR上。在GRUB中执行以下GRUB命令。 

  find /boot/grub/stage1 
  root (hd1,0,a) 
  setup (hd1) 
   
OK,GRUB成功安装在IDE1的MBR上。reboot。但是,在GRUB中FreeBSD和Windows都不能启动
。怎么回事?回到FreeBSD中,我把GRUB安装到软盘上。 

  find /boot/grub/stage1 
  root (hd1,0,a) 
  setup (fd0) 

重新启动,一切正常,无论是Windows还是FreeBSD引导都没有问题。这真是见了鬼了。后
来我发现,把GRUB安装到哪个IDE的MBR上,哪个IDE上的硬盘对于GRUB来说就事hd0。在我
的这种情况下,GRUB中的hd分布如下: 

   IDE0  hd1 
   IDE1  hd0 
   IDE2  hd2 
   IDE3  hd3 

因此必需修改menu.lst中的hd。但是Windows系统在引导的时候,必需要在hd0上。这时候
就需要GRUB的map命令来互换hd0和hd1。修改后的menu.lst如下: 

default 0 
timeout 30 

title Windows 2000 
     map (hd0) (hd1) 
     map (hd1) (hd0) 
     rootnoverify (hd1,0) 
     chainloader +1 

title  FreeBSD 
     root   (hd0,0,a) 
     kernel /boot/loader 

这回,终于一切太平了。 

  

4、crazy mouse 

我玩FreeBSD的最初目的,就是想看看在FreeBSD下启动GNome是否像linuxsir上的那位大虾
所说的那么快。因此在解决了多重启动问题后,我立刻开始配置X-Window。 

  /stand/sysinstall 
   
开始配置鼠标和显示卡。但是,在配置鼠标的时候,却又遇到了问题。我的鼠标是PS/2光
电鼠标。在配置鼠标时,如果选择mouse type为ps/2,我的鼠标就会在屏幕上乱窜,成了
真正的疯狂老鼠。选择其他类型时,要么依然crazy,要么一动不动,变成了死老鼠。我的
天呀,我怎么这么倒霉呀。 

上网查资料,但没有什么解决办法。想尽各种办法,还是crazy依然。换个鼠标,立刻好使
。呵呵,但那不是我的风格。最后只好在FreeBSD的ps/2鼠标驱动上打主意。FreeBSD有一
点特别好,它的man资料非常齐全。查找设备驱动的资料的办法就事“man device—name”
。FreeBSD的ps/2鼠标的驱动名是psm。因此只需要man psm就可以查找psm的配置。关键在
于psm的flags。我关心的flags bit位如下: 

  bit 0-3 鼠标的采样率。它控制这鼠标的速度。在Windows中,ps/2鼠标的采样率是100
ppi。因此bit 3为1。 
  bit 4-7 是鼠标加速。windows中鼠标加速一般为中等。因此该4bit的值是8 
  bit 9  该bit如果置位,psm不去尝试识别鼠标的类型,只是把鼠标当做标准ps/2鼠标来
驱动。这是关键。 
   
这个flags可以在启动配置文件中设置,也可以通过编译内核设置。 

  a)在配置文件中设置:修改/boot/kernel.conf添加以下内容。 
   
    en psm0 
    ir psm0 12 
    f psm0 0x284 
     
  b)编译内核。在内核配置文件中把行 
   
    device          psm0    at atkbdc? irq 12 
    修改成 
    device          psm0    at atkbdc? flags 0x284 irq 12 

这样,疯狂老鼠终于被制服了。不过我也损失了一些东西:我不能使用鼠标的滚轮。尽管
我用不了mouse wheel,不过还是把mouse wheel的配置方法写在这里吧。首先要安装imwh
eel软件包,该软件包把鼠标的4、5健转换成相应的热键。因此要使用mouse wheel必需安
装该软件包。 

cd /usr/ports/x11/imwheel 
make install clean 

cp /usr/X11R6/etc/imwheelrc ~/.imwheelrc 
你可以根据个人喜好修改.imwheelrc文件。在.xinitrc中添加下面这行来启动imwheel。 


imwheel -k 

wheel ps/2鼠标一共有5个健。 
  1 left click 
  2 right click 
  3 middle click 
  4 wheel up 
  5 wheel down 
因此,你必需告诉moused哪个键是wheel健。在/stand/sysinstall程序的鼠标配置中,设
置mouse flages中加入'-z 4'。或者在/etc/rc.conf文件中加入一行: 
   moused_flags="-z 4" 

呵呵,这里所说的flages和上面的哪个flags可不是一回事呀。上面的那个是psm的flags,
这个是moused的flags。 

同时,你要告诉X-Windows关于wheel的信息。在InputDevice mouse中加入一下两行: 

        Option      "Buttons" "5" 
        Option      "ZAxisMapping" "4 5" 

当然,上面所说的配置只是对于5健ps/2鼠标而言。如果鼠标健多于5个,修改相应的数字
。 

  

5、ADSL 

在96年的时候,我使用Modem上网。那时候上网速度慢,而且花费昂贵,因此也没觉得Int
ernet对我有多么重要,主要的知识来源是书店。但现在的我没有Internet几乎不能活了。
每天查资料、写程序就是我的生活。 

配置完鼠标,我立刻就开始配置ADSL。这次比较顺利,在网上查查资料很快就配置成功了
。 

首先,查看kernel配置文件,是否有以下几项。如果没有把他们加上,并重新编译内核。
FreeBSD 4.7对ADSL是默认支持的,一般不用重新编译内核。 
  options NETGRAPH 
  options NETGRAPH_PPPOE 
  options NETGRAPH_SOCKET 
  options NETGRAPH_ETHER 
  options NETGRAPH_IFACE 

其次,修改/etc/ppp/ppp.conf添加以下内容: 
adsl: 
 set device PPPoE:网卡设备 #例如我的配置是set device PPPoE:vr0。 
 set mru 1492 
 set mtu 1492 
 set dial 
 set login 
 set ifaddr 10.0.0.1/0 10.0.0.2/0 
 add default HISADDR 
 nat enable yes 
 set authname a   #用户名 
 set authkey a   #口令 

如果不清楚设备是什么,查看rc.conf查找ifconfig_???。???一般就是具体的网络设备
,我的是vr0。如果没有,使用/stand/sysinstall配置。 

现在,就可以通过一下命令启动pppoe了。 
 ppp -dedicated adsl 
  
如果,你的ADSL是包月的,你可能更希望一开机就启动pppoe。特别是在FreeBSD中,没有
网络实在是寸步难行。可以在/etc/rc.conf中加入一下内容,来自动启动pppoe。 
  ppp_enable="YES" 
  ppp_mode="ddial" 
  ppp_nat="YES" 
  ppp_profile="adsl" 
上面的例子的最后一行中的adsl与/etc/ppp/ppp.conf的adsl段相对应,也就是二者要保持
一致。如果你的pppoe提供商也支持nat(NETWORK ADDRESS TRANSLATION),你不需要配置
gateway和dns。 

adsl modem不一定非要插在网卡上。可以把adsl modem插在hub上。我在网上看到很多文章
说用两块网卡配置adsl局域网接入的文章,我非常不理解。把adsl modem直接插到hub上不
是更简单么?这只需要把modem和hub之间的网线改成交叉线。对于如何制作交叉线感兴趣
的朋友,可参看http://data.96963.com/20030117/1037437.shtml。以前我有3台电脑,就
是用这种方法上网的,呵呵,天天约朋友到我家,上网打Diablo。 


6、XFree86和KDE 

终于要见识一下在FreeBSD下运行X-Window了。在FreeBSD 4.7中XFree86的当前版本是4.2
.1,KDE的当前版本是3.0.3。安装完FreeBSD 4.7后,不一定能进入你想要的Window Mana
ger。但配置起来很简单,编辑~/.xinitrc文件,如果没有该文件就创建该文件。根据你要
启动的WM类型修改该文件: 

  a)如果要启动KDE,在该文件中添加startkde。 
  b)如果要启动GNOME,在该文件中添加gnome-session。 
   
然后,运行startx就启动相应的WM了。或者,直接运行startx startkde或startx gnome-
session来启动KDE或GNOME。 

经过短暂的等待,我终于看到了我熟悉的KDE界面。在我的机器上,FreeBSD 4.7启动KDE和
GNOME并没有linuxsir上的那位大虾说的那么快。但说良心话,确实要比RedHat和MDK快一
些。 

不过,我很快就发现了新的问题,我的显卡刷新速度非常慢。当我用xf86config配置XWin
dow的时候,我没有看到我的显卡类型ATI Radeon 7500。因此我是直接编辑/etc/X11/XFC
onfig-4文件,强制指定显卡Driver是radeon。我用命令grep radeon /var/log/XFree86.
0.log来查看XFree86的启动日志,但没有发现任何radeon的内容。看来,我的radeon显卡
驱动没有被正确的加载。经过半天的网上搜索,我查到解决的办法可能只有两个: 

  a)安装drm-kmod包,来加载radeon.ko模块。 
  b)把XFree86升级到4.3。 
   
这时候,FreeBSD的Ports就发挥了巨大的威力。我首先安装了drm-kmod,过程如下: 

   whereis drm-kmod 
   显示:drm-kmod: /usr/ports/graphics/drm-kmod 
   cd /usr/ports/graphics/drm-kmod 
   make install clean 
    
很快,drm-kmod就安装成功了。这时候,我就可以看到一个新的模块radeon.ko了。我使用
命令kldload radeon.ko来加载该模块,但却出现了错误信息Data Format Error。真是奇
怪,我只好又上网查,据说可能是AGP兼容问题。看来只有使用b计划了: 

    cd  /usr/ports/x11/XFree86-4 
    make install clean 
     
通过ports安装XFree86比我想象中要快,因为它没有任何编译操作,好象直接安装的是bi
nary版。在安装XFree86-4之前,我同步了一下我的Ports,具体步骤如下: 

    如果没有安装cvsup包,先安装cvsup。 
    whereis cvsup 
    显示:/usr/ports/net/cvsup 
    cd /usr/ports/net/cvsup 
    make install clean 
    这样,cvsup就安装上了。把/usr/share/examples/cvsup/ports-supfile文件拷贝到
~/下,编辑~/ports-supfile。*default host一行的内容修改成ports所在的ftp地址。由
于Ports的体积非常大,一个压缩成tgz文件的Ports也要有17、8M,所以最好找一个镜像站
点。查阅一下FreeBSD的镜像,居然有一个国内镜像cvsup.cn.freebsd.org。现在执行如下
命令,同步Ports: 
     
    cvsup -g -L 2 ~/ports-supfile 
     
几分钟后ports升级完毕,又过了几分钟后,XFree86的升级就搞定了。启动XWindow,然后
查看/var/log/XFree86.0.log,果然已经升级到4.3了,而且radeon驱动家在正常。既然,
我已经把XFree86升级了,那么就把KDE也升级了吧。FreeBSD下的KDE的官方站点是freebs
d.kde.org。在那里,你可以下载kde3的binary release版。但是,我使用的是Ports来安
装kde3: 

   cd /usr/ports/x11/kde3 
   make install clean 
    
这时候,我看到了大量的编译信息。以前,我在SuSe下编译过一次kde3,那真是一个痛苦
的过程。所有的依靠关系你必须自己控制。但在FreeBSD的Ports中,一切变得那么简单。
Ports替我完成了所有得事情,呵呵,除了健入上面那两行命令。编译KDE可是个漫长的过
程,上次我差不多用了24小时。于是我关掉了显示器,睡觉去了。 

第二天,我看到了我的新KDE,KDE 3.1。很不错,很漂亮,那些图标还真有些XP风格。 


  

  

7、Ports、Package和Software 

现在我的FreeBSD还是一个非常纯净的系统,几乎没有安装什么软件包。在Linux下我常用
的软件wget和curl都没有安装。在安装Linux的时候我一般都选择安装所有的软件包,但有
99%的软件我不知道是干什么用的。之所以要选择全部安装是我担心错过什么,尽管RedHa
t上有rpm,但要成功的安装个软件包也不是件容易的事情,很多情况下要看你的运气和能
力了。 

在FreeBSD下的包管理机制是什么样的呢?FreeBSD也有一个包管理机制,但不象RedHat的
RPM只有一个rpm命令,FreeBSD的包管理是由一组命令组成的。由于每个命令的参数都很少
,因此看上去好象更容易使用。这些命令如下: 

  pkg_add           安装软件包 
  pkg_delete        卸载软件包 
  pkg_create        创建发布软件包 
  pkg_info          显示软件包信息 
  pkg_update        升级软件包 
  pkg_version       生成所有安装的软件包的摘要 
   
所有的pkg_???命令都支持软件包的依靠关系,而且自动处理能力非常强。呵呵,当然了p
kg_delete命令不是自动卸载所有的依靠的软件包,但如果你原意这么作也没什么不行的。
 

当前,我最常使用的是pkg_add和pkg_info。只需要简单的"pkg_add 包名_包版本.tgz"命
令就可以完成一个包的安装。如果这个包需要其他软件包该命令会自动安装的。如果你下
载了所有4张FreeBSD 4.7的ISO光盘,你就拥有了一个巨大的软件库。如果你想安装一个目
录中的所有package,只需要使用命令pkg_add *。但pkg_add只能一次性安装200个软件包
。如果你想一次性把那4个ISO里的package都安装上简单的使用pkg_add恐怕是不行的,但
也用不着在sysinstall中一个一个的选择,用下面的这个命令试试: 

cd 包所在的目录 
find . -name "*.tgz" -exec pkg_add {} \; 

呵呵,耐心等待吧。这方法虽然可行,但使用FreeBSD的人,恐怕没人原意这么作。 

我最喜欢的pkg_add方法是使用pkg_add的远程安装: 

pkg_add -r 包名 

该命令会到ftp.freebsd.org上自动下载并安装软件包,如果该软件包有依靠的没有安装的
软件包,它也会自动下载并安装。当然你可以不使用ftp.freebsd.org,而使用其他更快的
镜像站点。有一个环境变量FTP_PASSIVE_MODE对该命令是非常重要的,在默认情况下该环
境变量的值是YES。它控制着fetch操作使用passive模式,这是ftp.freebsd.org所要求的
。 

尽管FreeBSD上有数千个软件包,你可以用下面的这个命令看看,好象有6578个软件包。但
这还远不是全部。 

curl -l -s ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-4.7-release/L
atest/ | wc 

让我们使用下面的命令看看ports里有多少软件包: 

cd /usr/ports 
find . -name "pkg-descr" | wc 

现在,在我的ports里有8014个可安装的软件包。那么Ports到底是什么东西呢?Ports在我
的眼里是一个巨大的目录结构,它用这个结构逐级分类各种软件包,最终的目录是某个具
体的软件包。在某个具体的软件包所在的目录中一般有四个文件: 

  Makefile   
  distinfo   
  pkg-descr   
  pkg-plist  
   
文件distinfo包含了该软件包要从网络下载的一些文件的md5信息,或者什么都没有。pkg
-descr包含了包的描述信息,这些信息会注册到FreeBSD的包管理库中。当用pkg_info查看
某个包的内容时,该信息会显示出来。pkg_plist文件中包含了安装该包时要安装的文件和
目录以及卸载该包时要删除的文件和目录,这些信息也要注册到FreeBSD的包管理库中供p
kg_info和pkg_delete使用。FreeBSD的包管理库位于/var/db/pkg目录。 

这里最重要的文件时Makefile。它描述了这个包需要下载哪些文件,这个包依靠哪些包。
这个文件控制着下载、安装检测依靠关系的所有过程。它的工作过程可以说非常复杂,呵
呵,在浅度历险里就没有必要说了。不过,对于用户来说操纵却很简单。要安装一个包只
需要如下操作: 

  cd /usr/ports/??/??/包目录 
  make build install clean 
   
你可以不使用clean,但下载和编译所产生的临时文件可能非常巨大。像KDE这样的软件包
,可能要占用你数百兆的硬盘空间。由于Ports是从网上下载软件包然后再编译安装的,有
时某个网站可能上不去从而导致安装失败。在大多数情况下,不用担心会出现这种情况,
Ports首先会到该软件的主站上下载,如果不成功它会到Makefile所描述的其他站点上下载
,如果还不成功它会到ftp.freebsd.org上下载,如果ftp.freebsd.org上也没有,呵呵安
装失败。这种情况很少发生,但不是没有,比如sourceforge.net对国内用户是关闭的。呵
呵,该死的美国人。当我在安装mplayer的时候就遇到了这种情况,当时avifile.sourcef
orge.net就上不去,但也不是一点办法没有。你可以在网上找一个代理服务器,用浏览器
通过代理服务器到那个站点上,比如avifile.sourceforge.net。找到无法下载的软件包,
把它下载到/usr/ports/distfiles目录下。然后就继续make吧。 

在这里我反复提到ftp.freebsd.org,它是ports的默认主站。但它不是惟一选择,如果你
觉得它太慢了可以修改环境变量MASTER_SITES来指向其他镜像站点。 

如果你不知道某个软件在ports的哪个目录里,可以用下面的办法解决: 

  a)如果你知道软件的准确的名字,比如说wget,可以使用: 
    whereis wget 
     
  b)如果你不知道准确的名字,那就search一下吧: 
   
    cd /usr/ports 
    make search key=??? 
     
有人说Ports是BSD的招牌菜,这话真是一点没错,真是一道美味的大餐。 

剩下的就是安装安装再安装了。xmms,mplayer,opera,mozilla,phoenix,想装什么就
装什么吧。以前我一直担心支持FreeBSD的软件太少,现在我完全放心了。在安装phoenix
的时候会遇到perl版本太低的情况,使用use.perl port命令。 

  


8、FreeBSD的汉化 

这真是一件令人讨厌的事情,但也没有办法。这些汉化,其实大多数是对XFree86和MW进行
汉化,因此操作基本上和Linux上的汉化操作是一样的。把Windows的simsun.ttc拷贝道/u
sr/X11R6/lib/X11/fonts/TrueType/simsun.ttf。最简单的操作就是用KDE的字体安装程序
安装该字体。修改KDE的区域和辅助功能中的国家/地区和语言,修改KDE的外观和主题中的
字体。对于不同的shell添加以下内容: 

  a)对于sh或bash修改~/.profile添加: 
    LC_ALL=zh_CN.EUC 
    LANG=zh_CN.EUC 
    LC_CTYPE=zh_CN.EUC 
    export LC_ALL LANG LC_CTYPE 

  b)对于tcsh(这是FreeBSD默认的)修改~/.cshrc添加: 
    setenv  LC_ALL    zh_CN.EUC 
    setenv  LANG      zh_CN.EUC 
    setenv  LC_CTYPE  zh_CN.EUC 

当你再次进入KDE的时候,就可以看到很漂亮的中文界面了。对于KDE程序来说,这样汉化
就行了。但对于象xmms这样的非KDE程序来说,还是看不到simsun字体。没办法,只好执行
下面的操作: 

  a)安装ttfm包 
  b)生成simsun的fonts.dir等文件 
    cd /usr/X11R6/lib/X11/fonts/TrueType 
    ttfm --add xttfm simsun.ttf 
  c)修改XF86Config-4文件,在Files段里添加如下内容: 
    FontPath      "/usr/X11R6/lib/X11/fonts/TrueType" 
    在Module段里确保有如下一行: 
    Load  "xtt" 
     
重新进入KDE,这时xmms就可以看到simsun字体了。由于我很少使用GNOME,因此也就没有
汉化,也不知道如何汉化GNOME。 

汉化完字体后,就要添加汉子输入法了。我以前使用过chinput,感觉还行。报着试一下的
心情search了一下ports,居然有chinput。真是happy。 

  cd /usr/ports/chinese/chinput3 
  make build install clean 
   
修改~/.xinitrc,在启动WM的命令前,对于KDE来说就是startkde前,添加如下行: 

  export XMODIFIERS=@im=Chinput  
  chinput & 
   
重新进入KDE,使用CTRL+SPACE,呵呵,看到了输入Chinput输入法。但说实在的,chinpu
t真的是非常一般。上网找找,看看有没有更好的。于是,我在网上发现了一个非常好的中
文FreeBSD论坛,http://community.freebsdchina.org。在该论坛中有一篇安装xsim的文
摘http://community.freebsdchina.org/phpBB/viewtopic.php?t=1921。xsim是什么,不
知道,反正是个输入法。装一个试试。xsim在Ports里没有,到http://sourceforge.net/
projects/xsim上下载一个。下面的内容都是摘自上面说的那个帖子。 

下载xsim-0.3.9.4.tar.gz 
下载xsim--data-freebsd-gb2312.tar.gz 
下载到/tmp/xsim 
tar zxvf xsim-0.3.9.4.tar.gz 
tar zxvf xsim-data-freebsd-gb2312.tar.gz 
cd xsim-0.3.9.4 
请自行阅读安装说明 
./configure --with-cn-locale=EUC 
make 
make install 
cd ../ 
把xsim-data-freebsd-gb2312.tar.gz包中解开的文件放到(饱含了一个dat目录) 
把这个目录放到 
/usr/local/xsim/ 
中 

然后,进行一些确认工作 
确认存在/usr/X11R6/lib/X11/locale/zh_CN/XI18N_OBJS 
文件 
如果没有,可以拷贝这个/usr/X11R6/lib/X11/locale/zh/XI18N_OBJS 

修改/usr/X11R6/lib/X11/locale/zh_CN/XI18N_OBJS 
注释__XlcEucLoader的一行就行了 

修改.xinitrc或者xsession文件 
加入 
export XMODIFIERS=@im=XSIM 
xsim & 


我按照上面的内容逐步操作,很快操作完成。我退出KDE然后重新进入,呵呵,KDE起不来
了。提示DCOP错误。怎么回事?在.xinitrc中去掉XMODIFIERS和xsim后,KDE又正常了。后
来我发现,在我启动startx时的目录里发现一个xsim.core文件。哈哈,看来xsim在启动的
时候异常退出了。其实,这并不是上面的那个帖子有问题,而是我自作聪明。编译xsim之
前,我看了一下xsim的README.cn那个文件,里面提到它可以实现把自己状态创口放到kde
的任务条上。于是我在执行configure的时候添加了一个参数: 

  ./configure --with-cn-locale=EUC --enable-status-kde3 
   
我把--enable-status-kde3参数去掉重新配置编译: 
  ./configure --with-cn-locale=EUC 
  make clean  
  make  
  make install 
   
然后,进入KDE,这回一切正常。xsim很正常的调用出来了。但我感觉xsim也很一般。 


上面的错误虽然浪费了我很长时间,但让我对XIM服务器有了一定的了解,对我下面的配置
工作有了很大的帮助。如果在加载XIM服务器后,进入不了WM,比如KDE或GNOME,基本上就
是WM和XIM之间无法建立联接的原因。DCOP通讯超时,WM就退出了。无法建立联接基本上是
由下面两种原因造成的: 

  a)XIM服务器异常退出。就象上面发生的情况。 
  b)XIM服务器没有正常的初始化。这大多数始由于LC_ALL、LC_CTYPE和LANG这些locale环
境变量造成的。 
   
在BSD里,中文locale是zh_CN.EUC,这对于那些判断locale的输入法来说就成了很大的问
题。这些输入法都查看locale是否是zh_CN.GB2312或zh_CN。 

我在RedHat下使用过小企鹅输入法fcitx,挺好用的,在linuxsir上有它的很多信息。那么
,在FreeBSD上能不能用它呢?试试看把。我下载了小企鹅输入法的输入法的源代码包fci
tx-1.8.2.tar.gz。我对于XIM几乎没有什么了解,但连蒙带唬的编译软件包却是我的特长
。先make一下试试,呵呵出错。那就修改一下Makefile吧: 

  把Makefile中的如下内容 
  CFLAGS= -O2 -fno-strength-reduce 
  INC =  -I/usr/X11R6/include -I 
  LIB = -L/usr/X11R6/lib -lX11 
  修改成 
  CFLAGS= -O2 -fno-strength-reduce -DSIGUNUSED=32 
  INC =  -I/usr/X11R6/include -I. -I/usr/local/include/ 
  LIB = -L/usr/X11R6/lib -lX11 -L/usr/local/lib -liconv 

再make一下,呵呵,当然成功了。但fcitx还是不好使。嗯,研究研究。fcitx源代码写的
非常工整,看上去很养眼睛。软件模块划分也非常清楚,因此跟踪起来也非常容易。埃,
国内要是多一些这样的程序员就好了。fcitx的作者所在的公司真是好福气。 

大致上,我简单修改了fcitx的代码。由于我只是想让它再FreeBSD上运行,因此没有作什
么判断,而是暴力修改。 

修改文件xim.c,查找关键字IMOpenIM所在的行。删除该行,把它替换成如下内容: 

   ims = IMOpenIM (dpy, 
    IMModifiers, "Xi18n", 
    IMServerWindow, im_window, 
    IMServerName, imname, 
    IMLocale, "zh_CN", 
    IMServerTransport, transport, 
    IMInputStyles, input_styles, 
    IMEncodingList, encodings, 
    IMOnKeysList, on_keys, 
    IMProtocolHandler, MyProtoHandler, 
    IMFilterEventMask, filter_mask, 
    NULL); 

该行下面几行,有3个函数调用IMSetIMValues,可以注释掉。当然,不注释掉也行。呵呵
,但最后一个IMSetIMValues调用令我非常费解。 

现在,fcitx可以正常运行了,但看不到汉字。编辑文件window.c,查找关键字XCreateFo
ntSet,找到第二个匹配。第一个是XFT模式的。在函数XCreateFontSet前加一行: 

    setlocale (LC_CTYPE, "zh_CN.EUC"); 
     
重新make,make install。修改~/.xinitrc 文件,添加如下内容: 
  export XMODIFIERS=@im=fcitx 
  fcitx & 
   
重新进入KDE,一切OK。由于我没有仔细看fcitx的源代码,因此上面的修改是否要造成不
良后果,我就不知道了。不过这篇文章就是用fcitx在FreeBSD下写的。感谢fcitx的作者。
修改了你的代码,你可别生气呀。 

汉化的XFree86和KDE后,下一个要解决的问题就是FreeBSD的中文文件名问题。这才是真正
的FreeBSD汉化。不过操作起来很简单。在FreeBSD中,当你用ls中文文件名的时候,看到
的不是各种乱码,而是多个?号或者-号。这时候,需要安装gnuls和gbfs包。使用上面的
Ports操作,可以很容易安装他们。安装后reboot系统。你会在启动信息里看到一些错误信
息: 

module_register: module cd9660 already exists! 
linker_file_sysinit "cd9660.ko" failed to register! 17 

如果你没有看清楚,查看/var/log/message。查看/usr/local/etc/rc.d看到里面多了一个
启动脚本gbfs.sh。其内容是用kldload加载/usr/local/modules下的模块。到/usr/local
/modules/下看看,看到里面有两个模块文件cd9660.ko和msdos.ko。使用kldload来手动加
载cd9660.ko。依然显示上面的错误。上网查资料才知道,需要修改kernel配置文件注释掉
以下几行: 
options        MSDOSFS                 #MSDOS Filesystem 
options        CD9660                  #ISO 9660 Filesystem 
options        CD9660_ROOT             #CD-ROM usable as root, CD9660 required
 
然后重新编译并安装内核。ok先试试,反正FreeBSD编译内核的速度奇快。编译、安装内核
后,reboot。但错误依然。这是怎么回事?这时,我在想为什么要注释掉上面呢三行,难
道说要让FreeBSD不支持msdos和cd文件系统?显然不是,因为我还是可以mount上fat分区
。我想,这可能是要强制FreeBSD对msdos和cd文件系统的支持在module模式下运行。而我
在/etc/fstab中添加了在启动时mount我的fat分区的内容。因此FreeBSD先使用了原来的m
sdos.ko。当gbfs.sh加载自己的msdos.ko时,当然回出现错误了。ok,试试看。把/modul
es/cd9660.ko和/modules/msdos.ko备份一下。然后把/usr/local/modules/msdos.ko和/u
sr/local/modules/cd9660.ko拷贝到/modules下,删除/usr/local/etc/rc.d/gbfs.sh。r
eboot系统。在~/.cshrc下增加如下内容: 

  alias ls 'gnuls --show-control-chars' 

这回看看msdos下的中文文件名。哈哈,OK了。 

  


9、奇怪的UDMA错误 

每次我启动FreeBSD的时候,都会在dmesg中出现下面的错误: 

ad1s1a: UDMA ICRC error reading fsbn 255 of 96-127 (ad1s1 bn 255; cn 0 tn 4 sn
 3) retrying 

呵呵,可不是只出现一行,而是出现一打。有时,在控制台上还会反复出现。这时怎么回
事?以前没时间处理它,现在可要研究研究了。上网查查,基本上没有什么结果。看看ma
n吧。man ata。ata是ATA/ATAPI控制器的驱动。它说ata总是尝试使用控制器通道的最高速
率来初始化。在我的机器上就是udma66。如果初始化失败,它会把相应的通道降到PIO模式
。这就是上面那个错误的原因。但是可以使用atacontrol来控制。使用atacontrol mode 
0命令看看,我的IDE1果然工作在PIO4模式。我的BIOS告诉我,我的IDE1是udma33,使用a
tacontrol mode 0 1 udma33后,我的IDE1控制器,回到了udma33模式。但我不知道,pio
4和udma33在FreeBSD上的速度到底有多达的差距。我写了一个perl脚本来测算速度,脚本
如下: 

#!/usr/bin/perl 

`rm Looking.rar`; 
$t = time(); 
`cp /usr/Looking.rar .`; 
$t = time() - $t; 

print "$t\n"; 

Looking.rar这个文件有270M。我记录下了两种模式下运行该脚本的时间。 
                  REBOOT后第一次运行的速度           多次运行后的速度 
PIO4              57秒                              29秒 
UDMA33            27秒                              11秒 

这个速度上的差距真的是非常惊人。但我不知道如何强制ata在udma模式下运行,只好写了
一个脚本放到/usr/local/rc.d下,该脚本叫ata.sh,内容如下: 

/sbin/atacontrol mode 0 1 udma33 
/sbin/atacontrol mode 1 1 udma33 

尽管那些错误在启动的时候依然存在,但我的心里感觉好多了。 

  

10、后记 

我到http://www.kde-look.org/上找了一个好看的桌面开始了我幸福的FreeBSD生活。我做
的最后一件事情是删除了我的RedHat 7.3。这并不是说,FreeBSD比Linux强。我虽然是一
名程序员,但我不是搞系统内核的,我没有资格评判哪种系统更优秀。我只是一个玩家,
一个使用者。FreeBSD的纯净、单纯、强大,深深的赢得了我的心。世界上只有一个FreeB
SD,区别只是版本问题。FreeBSD是那么的不追求名利。你原意使是就使,FreeBSD绝不去
推销自己。而现在的Linux世界却充满了商业,令我的心真的很烦。现在,世界终于安宁了
。 
   
[前一篇]:   ASP.Net Web Page深入探讨(二)  
 
     

--

※ 来源:.哈工大紫丁香 bbs.hit.edu.cn [FROM: 202.118.250.177]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:207.997毫秒