Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1614318
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: BSD

2006-08-25 11:10:41

文章出处:
tid=645076&extra=page%3D1%26filter%3Ddigest

1:BSD简史

要了解 FreeBSD,首先要了解 BSD。本文介绍 BSD 的简要历史,通过了解 BSD 的发展历程,我们可以更好的理解 FreeBSD。

BSD是"Berkely Software Distribution"的缩写,意思是"伯克利软件发行版"。显然,BSD这个名称并不是我们现在所理解的操作系统,而且其原意也并非简单的操作系 统,而是一整套软件发行版的统称。从软件发行版到操作系统的演变是有历史过程的,这一点对FreeBSD很重要。

BSD的出现要追溯到上个世纪的七十年代,当加州大学伯克利分校的学生Bill Joy在1971年完成了"Berkely Software Distribution"的合并以后(包括Pascal系统和一个编辑器ex),就算是BSD诞生了第一个发行版,并且发行了大约三十份免费的系统拷 贝。

BSD的用户社团一直在不断扩大,到了1978年,软件发行版得到了更新和升级,结果产生了第二版的"Berkely Software Distribution",即2BSD,其中包括了增强的Pascal系统,vi和termcap(Unix用户一定会对vi和termcap这两个名 词感到非常亲切)。2BSD的系统拷贝也是免费的,并且其最后一个版本2.11BSD至今还在世界的各个角落运行着。

VAX计算机的普及导致了1979年末3BSD的诞生。3BSD是Berkely的第一个VAX发行版,同样也是Joy发布的,包含了C Shell和2BSD发行版中的大量附加程序,以及虚拟内存内核和标准32/V(Bell实验室的最后一个Unix版本,运行在VAX上)实用程序。

到了1980年10月,Joy推出了一个焕然一新的发行版本,称为4BSD,其中包括Pascal编译器、Franz Lisp系统和邮件处理系统。4BSD支持DARPA网络,版权的控制是以大学为单位的,而不是以单台计算机为基础计算。

1980年,一个命名为CSRG(Computer System Research Group,计算机系统研究小组)的小组被组建起来负责BSD的发行工作,并于1981年6月发行了称之为4.1BSD的新版本。请注意,不是5BSD。 由于AT&T觉得5BSD会使用户将它和AT&T Unix System V相混淆,Berkely同意改变BSD将来版本的命名规则,将版本号仅保留在4BSD上,以后只增加4后面的小版本号。

4.2BSD于1983年8月正式发布,在18个月内就签发了1000多份站点许可证,是非常具有知名度的版本。到了1986年6月,4.3BSD发布, 而到了1988年,CSRG发布了4.3BSD-Tahoe,这是第一个把BSD内核分解为依赖于机器和独立于机器的两部分的版本,这是非常有价值的,它 使BSD得以移植到众多不同的体系结构中。

由于BSD使用了AT&T Unix的部分源代码,当AT&T源代码许可证费用不断增加的时候,一些希望能够使用BSD代码为PC生产基于TCP/IP联网产品的厂商要求 Berkely将AT&T代码从BSD发行版中分离出来,并给他们签发单独的许可证条款,而不需要AT&T的源代码许可证。因此,到了 1989年6月,一个完全没有AT&T Unix代码的BSD版本诞生了,称之为"Networking Release 1"。这是第一套由Berkely发布的自由可再发行(freely-redistributable)的代码,,它允许被授权的用户以源代码或者二进制 的形式发布修改过的或为修改过的代码,并且可以不向Berkely申报版税,唯一要求是在源代码文件中原封不动的保留Berkely的版权声明,并且在含 有以上代码的其他产品文档中声明其产品包括来自于加州大学和其他贡献者的代码。这就是著名的BSD许可证的起源。

1990年初,CSRG发行了4.3BSD-Reno,这是一个过渡版本,此后CSRG几乎重写了整个BSD发行版本的所有代码,除了6个内核程序。正是 这六个程序导致了日后BSDI公司与USL(Unix系统实验室)的一场官司。重写的新版本被命名为Networking Release 2,于1991年6月推出,它的许可证条款与第一个版本完全相同,都允许自由可再发行。在这个版本发布后的6个月内,Bill Jolitz重写了那6个漏掉的内核程序,并很快发布了完整的可运行在386PC体系上的系统,它称之为386/BSD。

386/BSD版本发布后的几个月内,一群386/BSD用户组成了一个小组,他们开始维护和增强后续系统,这就是NetBSD。NetBSD侧重于支持 尽可能多的平台,并继续按照CSRG所建立的研究风格进行开发工作。在NetBSD小组正式成立后几个月,FreeBSD小组成立了,其宗旨是仅支持PC 体系并尽可能多的发行他们的系统(现在,作为一个相对独立的系统,FreeBSD已经能够支持Alpha和SPARC体系)。在90年代中期,从 NetBSD小组中分离出OpenBSD小组,他们的目标是提高系统的安全性,并借助了许多FreeBSD发行版本的安装特性。至此,目前最主要的三大 BSD小组完全成型。

在此以后,CSRG还继续发布了4.4BSD-Lite、4.4BSD-Encumbered以及4.4BSD-Lite, Release 2三个发行版本,并于1995年6月以后被解散,完成了对BSD发行的领导工作。

(注:本文数据参考了Marshall Kirk McKusick的文章"Twenty Years of Berkeley Unix --From AT&T-Owned to Freely Redistributable",McKusick是BSD发行的核心人物之一,同时也是BSD Daemon图标的版权所有者)


FreeBSD的起源

FreeBSD的发展历史



2:FreeBSD有什么优点?

官方文章:

FreeBSD实实在在的选择 [阅读次数: 147次]
作者:Georges Tarbouriech
中文翻译:Zer4tul <>

作者简介:


Georges是Unix的老用户了。他很喜欢这个伟大系统的这个免费版本。

摘要

是的,你在阅读的是《LinuxFocus》!但是还存在其他的自由Unix,并且它们十分有趣,也起着重要的作用。 本文是对另一个自由Unix:FreeBSD 的概述。


Why FreeBSD ?
当谈到免费的Unix时,人们通常认为“就是Linux”。 当然,Linux应用十分广泛,而且(几乎)每个人都听说过它。 新用户的数量一直在增长,媒体(不管是不是“专业”的)对它进行了很多宣传。 一个主要的原因是Linux专门运行在使用最广泛的Intel兼容计算机上。当然,它还可以运行在许多其它处理器上,因为Unix的一个理念就是“我们不 在意是什么处理器”。然而,如果Linux仅仅为一个特殊的处理器进行开发,它可能不会获得如此成功,或者,至少要艰难一些。
但免费的Unix并不是只有Linux:BSD家族也是。它有三个主要的分支:FreeBSD,NetBSD和OpenBSD。BSD是 “Berkeley Software Distribution”的缩写。如果你想了解更多的关于Unix历史的信息,你可以参考article 176。(经过考虑,那篇文章没有讨论关于BSD和System V之间的区别:那完全可以写一本书了。)
每个分支都有自己的特色:

NetBSD几乎可以在任何一种平台上运行,包括很多老计算机:姑且认为有30到40种不同的平台。NetBSD证明了我们前面提到的:Unix不在乎处 理器。如果你在家里或者在工作中有一台相当老的“垃圾”,这是你很好的选择。我在Amiga和Intel机器上使用NetBSD很多年,并且我感觉不错。

OpenBSD是最安全的Unix之一。它是一个很理想的服务器平台,当然,它也可以在许多处理器上运行。它可能是Internet上最多的被用作服务器的系统之一。但它作为家用用途却不是很理想,不过,每个人根据自己喜好来做选择……

FreeBSD是上面两种BSD的“综合体”。它专注于Intel和Alpha处理器,并且从OpenBSD那里“继承”了一部分安全体系。跟 Linux一样,它运行于Intel处理器使它成为应用最广泛的BSD之一。它也是家庭用户的一个很好的选择。但这并不是说你不能在工作中使用它!
这里还有一些关于FreeBSD的事情:他们(译注:指FreeBSD Core Team成员)与Apple公司“共享”Mac OS X的自由软件部分。并且,我很喜欢OS X……顺便说说,不要困惑:虽然OS X是基于BSD,但是它的内核跟FreeBSD的却没有任何关系。它使用的是已经在NeXTstep中使用的Mach内核,OS X的“父亲”:很明显,当NeXTstep于80年代末问世以来,这个内核发展了不少。
现在,我们见到了……让我们进一步深入吧。

获得并安装FreeBSD
和大多数自由软件一样,FreeBSD可以从FreeBSD的web站点上下载。很明显,这需要很高的连接速度。不用担心:你可以在世界上的任何地方找到FreeBSD的CD。
目前(在写本文的时候)的最新发行版是4.6。本文讨论的是i386发行版。
从CD-ROM(或其它介质)上安装FreeBSD十分简单……虽然它并没有图形界面来完成安装!你将会使用伪图形界面。只需要按照提示做, FreeBSD就会被安装到你的硬盘上。和通常的情况一样,你需要将你的硬盘进行分区,配置一些东西,比如网络连接或者甚至是内核(可选)。下面,你将见 到sysinstall,就像它的名字暗示的一样,它是一个很好的安装工具。你可以选择安装全部packages或者仅仅安装一部分。你可以在任何时候用 任何方式添加它们。
它的包管理方式也很简单。你可以象在Solaris下一样使用pkg命令,或者你可以选择使用ports。简而言之,pkg命令就像Linux的rpm或 者deb,而ports是一些需要通过make和make install进行编译的文件。换句话说:FreeBSD的操作跟Linux的没有什么大的不同或者有困难的地方。
让我们安装一个Linux兼容包——你应该安装它:它允许你在FreeBSD上编译和运行Linux的应用程序。
所有事情都是很简单的,并且为防万一,FreeBSD准备了一个很好的手册,它详细解释了每一个步骤。并且它有很多语言的版本(译注:在/usr/share/doc目录下可以看见以各个语言命名的目录,不同语言的手册就在相应的目录中)。
因此,没有必要在这上面花过多时间。

配置FreeBSD
再强调一次,我们的这篇文章不可能面面俱到。最重要的是知道核心文件在哪里。跟往常一样,你可以在/etc目录找到它们。它们被命名为rc.something并且可以管理很多不同的部分:常规配置、防火墙、网络、sysctl等。
rc.conf文件十分重要,正如它的名字一样,可以在这里调整系统配置。在这个文件中你可以告诉系统是否打开某些守护程序(sshd、sendmail 等),防火墙类型,你是否想激活内核级安全,你是否想激活IPv6等。在这里有很多选项,令人惊讶的是,你可以在被称作 /etc/defaults/rc.conf的默认文件中找到所有它们。不要误会,这个文件包括了默认设置,而不是范例。也就是说, /etc/rc.conf/etc/rc.conf是不考虑这些默认设定的。换句话说就是,不要将/etc/defaults/rc.conf复制到 /etc.rc.conf,也不要尝试修改/etc/defaults/rc.conf,应该在/etc/rc.conf中作更改。
在sysinstall所选择的项目将会被自动加入到/etc/rc.conf中(网卡配置,主机名,安全等级等)。
请格外注意:FreeBSD默认没有在/etc/inetd.conf中打开任何服务。这就是说,在第一次启动系统的时候,由inetd管理的守护程序(Daemon)默认应该是关闭的。以我的愚见,每个Unix系统都应该这样。无论如何,这是一个好主意!
另外的rc文件允许你配置防火墙或者sysctl,以及其他的东西。这理所当然的将我们引导到了调整FreeBSD的话题上。

调整FreeBSD
调整系统最好的工具之一是sysctl(在Linux下也一样)。你可以通过命令行来定义某些特殊值,或者(同时也建议你)写一个sysctl.conf文件,除非你使用命令行仅仅是来进行测试。
比如,如果你的机器被用作网关,通过命令sysctl -w net.inet.ip.forwarding=1可以使sysctl允许IP转发。如果想获得更高的安全性,你可以使用sysctl -w net.inet.ip.check_interface=1命令核对这些包是否到达目标IP所对应的网络界面。你可以通过使用sysctl来控制你的系 统的大部分行为:请参见man page。明显地,如果你希望将这些写入sysctl.conf文件,只需要将这些变量加入进去就可以了,而不必加入sysctl命令本身。 sysctl.conf文件使用variable = value格式。上面的例子可写为: net.inet.ip.forwarding=1
net.inet.ip.check_interface=1
当然,你的sysctl.conf文件支持超过两行的文件,因此它几乎可以在内核级控制控制任何东西。
在本文的开头,我们讨论了安全级。有从-1到3四个不同的等级,3代表最高安全级。建议你在选择之前了解每个等级。使用除了-1或者0之外的其它等级有可 能导致系统无法象你希望的那样运行。第一个缺点就是level 1将阻止你正常使用X服务器。你也不能加载或者卸载内核模块。
无论如何,高安全等级对于需要高安全性的特殊服务器来说是很有用的。作为一个家庭用户,你可以保持level 0,当然,这由你自己决定……
chflags命令也与安全等级有关。要想了解这个命令,请阅读man page:它是一个很有用的命令。
如果继续这个话题将把本文写成一个“安全配置FreeBSD”的文章,因此,让我们进入下一个章节。

升级FreeBSD
让我们假设你刚购买了FreeBSD 4.5CD。几天以后,FreeBSD 4.6就发布了。倒霉!
不必烦恼:FreeBSD有一个基于CVS的升级系统。你可以选择使用匿名CVS或者CVSup。前者比较容易使用,而后者更有效率。通过这些工具,你可以获得新的原码树(Source Tree),并且同步(Synchronize)它。
下面,你必须使用make buildworld命令编译所有新代码。如何进行编译在FreeBSD Handbook里已经十分详细的进行了阐述(译注:FreeBSD Handbook 1.73版中关于升级系统的部分Zer4tul已经完成了翻译工作,正在进行校对)。最重要的一点是它使你拥有一个紧跟升级步伐的崭新的系统。
但是,并不仅仅如此。跟通常情况一样,自由软件(Free Software)的弱点很快就会被发现,并且很快被修复。跟其它商业操作系统一个漏洞可以很久不被修复不同,自由软件社区的人们会以最快速度为你提供补 丁。很明显,你的工作就是检查系统中有什么地方需要补丁。FreeBSD的Web站点上有一个安全公告区(Security Section)提供各发行版的安全公告。你可以从那里下载.asc文件(文本文件)来获得你所需要知道的信息:关于系统问题的系统问题的描述和解决的方 法。其它Web站点为你提供的也是这些信息。比如linuxsecurity,CERT等。
这并不是说你必须升级你的系统。

更新FreeBSD
你并不想花过多的时间在了解系统漏洞上,是么?和其它免费Unix系统一样,FreeBSD为你提供了补丁。你可以直接获取这些补丁并且使用它们。对于 Linux用户来说,最大的不同就是你并非抓取一个修改过的包,而是一个补丁原码。这就是说你必须在打补丁之后重新编译内核,当然,这就意味着你的机器已 经装上补丁了。在Linux下也可以这样,但是人们通常是下载修正过后的包,例如rpm包,至少对于应用程序是这样,有时也下载被打过补丁的内核rpm 包。
Linux和FreeBSD最大的不同是内核。FreeBSD是基于BSD 4.4,并且没有不像Linux一样有不同的内核版本。这就是说,它的内核都是稳定版本,当然,它也受益于可加载模块。缺点就是如果你想让你的系统尽可能 安全的话,你必须比在Linux下更频繁的编译内核。
无论如何,相比Linux的体系,我更喜欢这样的方式,但这仅仅是我个人的意见。我并不认为三个不同的内核版本同时进行可以带来很好的稳定性。应用程序必 须从一个版本的内核“移植”到另外一个版本,特别是在安全方面。另外一个例子就是系统包:三个不同的内核版本,三个不同的软件组合!当然还有其它问题。
我极为尊敬那些参与这个伟大工程的人们,但是这是否就是正确的方法呢?改进通常是必要的,但是这是否代表我们随时随刻都必须更改所有东西呢?不必担心!
很明显,你也可以编译一个更符合你要求的内核……并且在那时,就跟在Linux下一样。完成这项工作的方法在FreeBSD Handbook中已经很详细的阐明了,因此,让我们转入其它话题。

应用程序
正如我们所说过的,大多数自由软件(虽然不是全部)都可以在FreeBSD下运行。你并不需要上面提到的那些Ports和包(Packages)。无论是什么类型的软件,你都可以在FreeBSD下将它们编译成可执行格式。
对于喜欢使用桌面环境的人来说,可以使用KDE和Gnome……并且它们被包括进了发行版。还包括很多窗口管理器(Window Magager)。GNUstep在FreeBSD下也可以很好的运行。要想编译它,你需要一个比发行版自带的更新的gcc版本:不必担心!直接抓取一个 相应的文件(Archive)并且编译它。很明显,GNUstep应用程序,象GNUMail.app、Gorm.app或者 ProjectBuilder.app也可以很好的运行。
真的,所有你可以在Linux上运行的软件都可以在FreeBSD上使用……并且还有更多其它软件! Really, all the software you run under Linux is available for FreeBSD... and there are many others!
比如,FreeBSD有很多关于安全工具。监控工具、管理工具等,这些都是发行版的一部分。
防火墙、代理服务器、端口扫描器、IDS等也可以使用。例如,你可以选择使用IPsec或者ipfw。你可以使用nessus、nmap、portsentry等。再强调一次,它们中的大部分是发行版的一部分,并且你可以自己抓取、编译并使用最新的版本。
我们已经讨论了关于桌面环境和窗口管理器,但是我们对于它们所依赖的东西——X Window System(译注:很多人把X Window叫做X Windows)——还只字未提。目前默认是XFree86 4.x。再FreeBSD 4.5之前,XFree86 3.x是默认设置。这就是说,你在发行版中有XFree86 4.x,但是安装进程通常选择安装XFree86 3.x。现在XFree86 4.x是默认设置,但是如果你愿意,你还是可以使用3.x版。

硬件
因为我们讨论的是基于i386的发行版,那么我们就来说说大多数可以在FreeBSD下工作的硬件,虽然它可能有一些古老了。例如一块3Com combo网卡在你使用ifconfig命令指定了媒体类型后就可以很好的工作。如果你使用的是BNC连接,只需要在/etc/rc.conf的 ifconfig行最后加入media 10base2/BNC就可以了。
某些老显卡也是这样:使用XFree86 4.x可以解决大多数问题。特别是对于老的ATI显卡来说。
总之,你可以参考FreeBSD Web站点的Hardware列表。

安全
我们已经提到了很多安全工具,比如防火墙、端口扫描器等。FreeBSD自带了许多安全工具。OpenSSH、OpenSSL、Kerberos、MD5 等都是发行版的一部分。跟通常情况一样,如果没有这些工具,你根本无法使用FreeBSD,当然,还得再重复一次,你必须检查万一可能有的漏洞。
一个新近的例子显示出了小心谨慎的重要性。假设你注意到了OpenSSH中被发现的漏洞。正确的做法是到它的主页上去下载修正版本(Corrected Version)。
是的,但是这还不够!一定要控制对这个包(Package)的校对。
这个关于OpenSSH的例子并非是杜撰出来的:几周以前,有人用一个被修改的档案替换了原来的。OpenSSH的人员很快作出了反应。但是,在这短短的 一段时间内下载并且没有进行档案校对的用户就安装上了一个“无效”的版本。因此,一定要进行校对……并且需要控制校对过程。
即使这已经超出了本文的范围,但是我们仍然坚持安全是第一位的。

网络通信
FreeBSD的网络功能十分先进。IPv6被管理得非常好。现在,网络通信功能和系统融为一体。如果你使用的ADSL或者Cable Modem,你可以很容易的将它们配置好。
许多ISP现在都使用PPPoE。FreeBSD通过一种很简单的方式支持它:ppp.conf中的几行就可以完成这个任务。如果是连接到PPPoA的 话,现在FreeBSD只支持Alcatel modem。这种情况在不久就会改变(或许现在就已经支持其它某些Modem了)。

相关文档
FreeBSD Handbook并不是仅有的可用文档。你还可以从FreeBSD Web站点找到FAQ、安装指南(Install Guide)等。另外一些比较重要的相关文档可以在找到。

接下来是什么?
这仅仅是对FreeBSD的一个很简短的介绍。这个系统跟其它免费Unix一样,也是非常有趣的。它有许多特点,很值得一试。很不幸,本文不能对它进行一个完整的概述,很多重要的特点没有提到。
使用FreeBSD比使用某些类似Windows的Linux发行版需要更多的Unix知识,但是其实它也很容易使用。
当然,有的没有任何Unix知识的人将遇到一些困难,因为他必须经常在更新系统后重新编译他的系统。虽然它将花费一些时间,但是,这是一个学习的好方法。今天的人们似乎忘记了,在最初的时候,Unix是开发者为开发者开发的,而不是为家庭用户或者普通用户。
他们很幸运,因为无论自由的还是商业的Unix改变了它们最初的方式。我们应该感谢哪些为此做出努力的开发者们。在80年代,现在的Linux用户中的大 多数将避开Unix,仅仅因为它那复杂的安装进程。发行版被储存在磁带上,并且安装阶段可能会持续一整天,而配置工作还需要一天来完成。我们并不是说的配 置应用程序!而今天,你可以在甚至不了解Unix的情况下使用它,比如Mac OS X。在90年代初已经被OS X的“父亲”,也就是NeXTstep变成事实。
这看上去好像跑题了,然而NeXTstep引领了免费Unix和商业Unix的潮流……以及一些其它系统!将Unix带给家庭用户将是一个挑战,并且它已 经展开了。祝贺所有参与这个挑战的人,无论他们工作是为了钱还是免费的。那些免费工作的人更应该被特别的提出并且给予更多的感谢
我十分看好FreeBSD和Apple的“共享”。两者都从对方那里通过正确的途径得到好处。商业软件通常利用自由软件……而不声张。Apple是这样, SGI也是。还有其它一些也一样……但是为了某些隐蔽的目的。无论如何,我还是认为有足够的空间提供给所有人……当然,想独自占有所有空间并且对Unix 不作出任何贡献的除外!
关于Linux的炒作淹没了其它免费Unix:迄今为止,还是如此之好。这也有它好的一面……这就是我使用FreeBSD的主要原因。当然,我还是在使用Linux(还有其它一些系统):我喜欢不同的感觉!


如果你打算给FreeBSD一个机会,本文将会变得更有意义。自己去体验它,你将会发现许多本文没有提到的东西。
我说过:we are living in a great ti!




3:我现在开始学习使用FreeBSD,我应该从什么地方开始?

Resources for Newbies


4:可以从什么地方得到FreeBSD的光盘?


5:我应该怎么安装FreeBSD?

(英文)
(中文)


6:有没有FreeBSD的初级教程?

最权威最好的是FreeBSD官方提供的Handbook
(英文)
(中文)

另外王波的使用大全,以及技术内幕也是不错的书籍。



7:如何编译FreeBSD内核?
... k/kernelconfig.html (英文)
(中文)


8:如何在FreeBSD下安装软件?
... handbook/ports.html (英文)
(中文)


9:如何管理系统帐号?
... handbook/users.html (英文)
(中文)

10:有一个命令foo,我想知道它的详细说明,怎么办?
用'man'命令,运行'man foo',另外,你也可以去查



11:我为什么不能用root连接我的telnet/ftp?
用root来连接telnet/ftp是一个再糟糕不过的想法,非常不安全。
FreeBSD默认禁止了这种做法,你可以用其他用户telnet到系统上以后在su成为root。
另外,强烈建议使用更安全的ssh/sftp来代替telnet/ftp。



12:我为什么不能su成为root?
只有wheel组的用户才能su成为root。


13:我的root密码丢失,我应该怎么办?
重新启动FreeBSD,当出现倒记时的时候按任意键(除了Enter),然后输入'boot -s',进入系统后先运行`#/sbin/mount -a`,现在你可以用`passwd`来修改root密码了。


14:怎么查看我的系统开了什么端口,运行了什么程序?
netstat 和 ps 会帮助你。


15:我发现我的系统开了一个xx的端口,我应该如何关闭上它?
安装lsof,然后用'lsof -in'查看是哪个程序打开了这个端口,然后关闭对应的进程(ps & kill)。


16:我想在系统启动的时候自动运行点什么,应该怎么做?
在/etc/rc.local里放上你要放的东西吧,没有看到这个文件就自己建立它。
另外你可以可以把你的命令保存为以.sh结尾的文件,然后把它放在/usr/local/etc/rc.d/中,不要忘了让它可执行。

17:我修改了/boot/loader.conf以后不能正常引导系统了,当机器开始加载/boot/defaults/loader.conf的时候(未加载完)机器停止响应,我应该怎么办?(黑夜编码人提供)

当机器启动时,出现 "-" 提示的时候按任意键(回车除外)进入"boot :"提示符,输入: boot kernel 此时机器开始启动。


18:我如何修改我的telnet登录时显示的信息?(黑夜编码人提供)

# vi /etc/gettytab
然后编辑:
default:
:cb:ce:ck:lc:fd#1000:im=Welcome to windows 2000 servern:sp#1200:
:if=/etc/issue:
保存退出。
试试重新telnet你的FreeBSD,将显示:
Welcome to windows 2000 server
login:


19:ports下有没有xxx这个软件?在哪个目录下?

cd /usr/ports
make search key=xxx | grep ^Path:
如果想按照软件的名字搜索
make search name=xxx
千万注意name和key之后不要有空格


20:FreeBSD的RELEASE、STABLE、CURRENT之间是什么关系

FreeBSD有两个主要的分支一个是STABLE分支,一个是CURRENT分支
STABLE分支是经过长时间测试的(一般是一年到两年),修正了主要的问题的系统分支,这个分支上通常不会有严重的系统级错误,也不会对系统的主要结构 进行修改。但是不代表STABLE分支是一成不变的,STABLE分支常常会加入很多外围的更新,比如从4.4到4.8,FreeBSD已经经历了巨大的 改变,比如使用Softupdate,对USB全系列设备的支持升级,Firewire设备的支持,而且之中还对stdin/stdout库进行了一次升 级。这些更新都是在CURRENT分支里面进行了长时间测试之后,进行评估不会对系统安全造成影响的情况下加入STABLE分支的。而CURRENT分支 实际上可以成为FreeBSDng,这里将会有大量的新技术和新代码,但是这些代码很多处于试验性质,无法保证稳定性和效率,只是给开发人员用来测试的。 而RELEASE是FreeBSD的发行版本,每当STABLE和CURRENT开发到了一个阶段,一批目标达成以后将会发行一个RELEASE版本,在 5之前FreeBSD只在STABLE分支上发行RELEASE版本,但以后可能会更多的发行CURRENT版本了



21:我想移动一套系统到一块新的硬盘上,该怎么做呢?


22:为啥我已经是Root了,但是对系统进行修改升级仍然没有权限呢?

securelevel

  FreeBSD kernel 有個觀念叫 securelevel。當還有人在爭論這是不是夠完美時,這個
  機制已經夠防止大部份的 "script kiddiez"。Securelevel 是指你的 kernel 在執行時
  的安全等級。每一個等級具有不同的保護和檢查機制。這些是 init( 的 man page:

  The kernel runs with four different levels of security.  Any superuser
  process can raise the security level, but only init can lower it.  The
  security levels are:
  Kernel 可以以四種不同的安全等級來執行。任何 superuser process 可以提高安全
  等級, 但是只有 init 可以降低它。這四種等級分別是:

  -1    Permanently insecure mode - always run the system in level 0 mode.
        永遠不安全模式 - 切換到 level 0 吧!

  0     Insecure mode - immutable and append-only flags may be turned off.
        All devices may be read or written subject to their permissions.
        不安全模式 - "不可更動"和"只能附加"這兩個旗標(flag)可以被改變。所有的
    devices 可以照著它們的讀寫權限被讀寫。

  1     Secure mode - the system immutable and system append-only flags may
        not be turned off; disks for mounted filesystems, /dev/mem, and
        /dev/kmem may not be opened for writing.
        安全模式 - "不可更動"和"只能附加" 的旗標不能被取消; mount 上來的檔案系
    統, /dev/mem, 和 /dev/kmem 不能寫入。

  2     Highly secure mode - same as secure mode, plus disks may not be
        opened for writing (except by mount(2))  whether mounted or not.
        his level precludes tampering with filesystems by unmounting them,
        but also inhibits running newfs( while the system is  multi-user.
        高安全模式 - 和安全模式一樣, 又多加了不管硬碟有沒有被 mount 起來,
        除了 mount(2) 之外都不能寫入。它防止一個檔案系統在 umount 的時候被
        搞亂。而且在這個等級也禁止在 multi-user 時執行 newfs(。

  如果安全等級最初是 -1, 那麼 init 就會保持原狀。否則在 single user mode 時,
  init 會把安全等級調到 0, 而在 multiuser mode 時會以 1 來跑。如果你希望在
  multiuser 模式是以等級 2 在跑, 你可以先進入 single user mode, 編輯 /etc/rc,
  使用 sysctl 來更動。

  若是你的系統只拿來跑 web server 之類的, 你可以放心的將 securelevel調高到2。
  但若是你要跑 X server, 把你的 securelevel 調至 1 或更高會導致一些問題。因為
  X server 必須要寫入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允許你這麼做。
  有一個解決的方法是, 在啟動 X server 後再調高 securelevel。但我的意見是, 如果
  你跑 X server 的話, 你已經有了其它的安全問題須要考量, 而不止是 securelevel。
  以下這個指令會顯示出你目前的 securelevel 設定值。

# sysctl kern.securelevel


  如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
  X 可以是 0, 1 或 2。

  又在 securelevel 是 1 的話, 你在 "make world" 時也會有些問題。因為 "make
  install" 時會在 kernel 上加上 immutable flag:

# ls -lo /kernel
-r-xr-xr-x  1 root  wheel  schg 1061679 Jun 30 01:27 /kernel

  "schg" flag 會防止你安裝新的 kernel:

nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)

nfr# sysctl kern.securelevel
kern.securelevel: 2

nfr# rm -rf /kernel
rm: /kernel: Operation not permitted

nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted

  如果你在 securelevel 1 或 2, 那麼 schg flag 是不能被改變的。

# chflags noschg /kernel
chflags: /kernel: Operation not permitted

  值得留意的是, /boot.config 可以改變你開機時的系統設定,要預防有心人篡改
  你應該這麼做:

# touch /boot.config
# chflags schg /boot.config

  你可以看看系統預設還有那些執行檔是有 schg flag 的。

# ls -lo /sbin | grep schg
-r-x------  1 bin   bin       schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x  1 root  bin       schg 192512 Jul 19 20:36 rcp

  再回過頭來談談鎖定系統這件事吧! 既然剛剛談到了 immutable flags, 何不試著把整
  個 /sbin 和 /bin 都設成 schg flag 呢 !? 這會給想 crack你系統的人一點小挫折。
  (假設你的系統也正以適當的 securelevel 咦髦?

# chflags schg /bin/*
# chflags schg /sbin/*

  不過 /sbin 可能被改成別的名字,再重新創造一份新的 /sbin ,所以改變 /sbin 與
  /bin 的 schg flag 是很合理的想法,我們可以依照以下的方式改變 /sbin 和 /bin
  的 schg flag:

# chflags schg /bin/*
# chflags schg /sbin/*

  這些 schg flag 的檔案會讓你在 "make world" 時有問題。
  ("make installworld" 也是)

  無論如何 ,最好是以 single user 模式來 "make world"。有關 "makr world" 的相
  資訊, 還有為什麼要這麼做, 到下面這個網頁來看看:



  現在你已經適當的鎖定你的系統, 也以只跑必要的的 service, 而檔案系統也適當的
  mount 上來, 且也以適合的 kernel securelevel 咦髦小?
  與以上所述的相關 man pages 有: init(, chflags(1), sysctl(。


23:我怎样才能知道系统运转是否正常,是否受到攻击呢?

由于FreeBSD是一个多用户系统,那么就需要管理员进行日常维护,特别是用做网络
服务器的系统,一旦因为缺乏维护而造成停机故障,就会造成很大损失。即使对于单用
户的FreeBSD系统,同样也要执行这些不可缺乏的维护任务,只是由于系统归个人使用,
那么对维护的要求就不必那么高,维护任务就轻松一些。
系统日志
  系统的日志记录提供了对系统活动的详细审计,这些日志用于评估、审查系统的运
行环境和各种操作。对于一般情况,日志记录包括记录用户登录时间、登录地点、进行
什么操作等内容,如果使用得当,日志记录能向系统管理员提供有关危害安全的侵害或
入侵试图等非常有用的信息。
  BSD提供了详细的各种日志记录,以及有关日志的大量工具和实用程序。这些审计记
录通常由程序自动产生,是缺省设置的一部分,能够帮助Unix管理员来寻找系统中存在
的问题,对系统维护十分有用。还有另一些日志记录,需要管理员进行设置才能生效。
大部分日志记录文件被保存在/var/log目录中,在这个目录中除了保存系统生成日志之
外,还包括一些应用软件的日志文件。当然/var目录下的其他子目录中也会记录下一些
其他种类的日志记录文件,这依赖于具体的应用程序的设置。
$ ls /var/log
adduser maillog.5.gz sendmail.st.1
dmesg.today maillog.6.gz sendmail.st.10
dmesg.yesterday maillog.7.gz sendmail.st.2
httpd-access.log messages sendmail.st.3
httpd-error.log messages.0.gz sendmail.st.4
kerberos.log messages.1.gz sendmail.st.5
lastlog messages.2.gz sendmail.st.6
lpd-errs messages.3.gz sendmail.st.7
maillog messages.4.gz sendmail.st.8
maillog.0.gz messages.5.gz sendmail.st.9
maillog.1.gz news setuid.today
maillog.2.gz ppp.log setuid.yesterday
maillog.3.gz sendmail.st userlog
maillog.4.gz sendmail.st.0 wtmp
系统登录日志
  系统会保存每个用户的登录记录,这些信息包括这个用户的名字、登录起始结束时
间以及从何处登录入系统的等等。它们被保存到/var/log/lastlog、/var/log/wtmp和/
var/run/utmp文件中,这三个文件以二进制格式保存了这些用户的登录数据。
  其中/var/run/utmp文件中保存的是当前系统用户的登录记录,因此这个文件会随着
用户进入和离开系统而不断变化,而它也不会为用户保留很长的记录,只保留当时联机
的用户记录。系统中需要查询当前用户状态的程序,如 who、w等就需要访问这个文件。
utmp可能不包括所有精确的信息,某些突发错误会终止用户登录会话,当没有及时更新
utmp记录,因此utmp的记录不是百分之百的可以信赖的。
  而/var/log/wtmp保存了所有的登录、退出信息,以及系统的启动、停机记录,因此
随着系统正常运行时间的增加,它的大小也会越来越大,增加的速度依赖于系统用户登
录次数。因此可以利用这个日志用来查看用户的登录记录,last命令就通过访问这个文
件来获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端
tty或时间显示相应的记录。ac命令同样也使用wtmp中的数据产生报告,但它的显示方
式不同。它可以根据用户(ac -p),或按日期(ap -d)显示信息,这样管理员就能获
得一些非常有用的反常信息,如一个平时不太活跃的用户突然登录并连接很长时间,就
有理由怀疑这个帐户被窃取了。
  注意:X Window由于会同时打开多个终端窗口,因此会使得用户登录连接时间迅速
增加。
  lastlog文件保存的是每个用户的最后一次登录信息,包括登录时间和地点,这个文
件一般只有login程序使用,通过用户的UID,来在lastlog文件中查找相应记录,然后报
告其最后一次登录时间和终端tty。然后, login程序就使用新的记录更新这个文件。
  这三个文件是使用二进制格式保存的,因此不能直接查看其中的内容,而需要使用
相关命令。当然也可以通过程序来访问这三个文件,这就需要了解它们使用的数据结构
。其中utmp和wtmp使用同样的数据结构,而lastlog使用另外一个数据结构,可使用man
来进行查询具体结构。如果系统的用户数量很多,那么wtmp文件的大小会迅速增加,在
系统/var文件系统空间紧张的情况下,就导致这个文件系统被占满。系统不会主动控制
这个文件的大小,因此这需要管理员的干预,需要手工及时清除,或编写shell脚本定期
保存和清除。
  系统还可以提供记账统计的功能,要打开系统的计账功能,需要使用accton命令,
注意,accton必须跟随记账日志文件的名字作参数,而不带参数的accton将关闭记账进
程。
  当打开了记账功能后,可以使用lastcomm来检查在系统中执行的所有命令的信息,
包括执行的命令、执行命令的用户、用户使用的终端tty,命令完成的时间,执行时间等
。从lastcomm的输出也能帮助管理员检查可能的入侵行为。
  此外可以使用ac命令来查询用户的连接时间的报告,sa命令来查询用户消耗的处理
器时间的报告。
Syslog日志记录
  最初,syslog只是为了sendmail而设计的消息日志工具,由于它提供了一个中心控
制点,使得sys log非常好用和易配置,因此当今很多程序都使用syslog来发送它们的记
录信息。syslog是一种强大的日志记录方式,不但可以将日志保存在本地文件中,还可
以根据设置将syslog记录发送到网络上的另一台主机中。
  支持syslog方式的系统启动了syslogd守护进程,这个程序从本地的Unix套接字和监
听在514端口(UDP)上的Internet套接字,来获得syslog的记录。本机中进程使用sysl
og系统调用发送来sy slog记录,然后由syslogd将他们保存到正确的文件或发送到网络
上另一台运行syslogd主机中去。
  syslogd的设置文件为/etc/syslog.conf,定义消息对应的相应目标,一条消息可以
达到多个目标,也可能被忽略。
# $Id: syslog.conf,v 1.9 1998/10/14 21:59:55 nate Exp $
#
# Spaces are NOT valid field separators in this file.
# Consult the syslog.conf(5) manpage.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
cron.* /var/cron/log
*.err root
*.notice;news.err root
*.alert root
*.emerg *
!ppp
*.* /var/log/ppp.log
  syslog.conf的配置可以分为两个部分,第一部分用于区分消息的类型,另一个用于
设置消息发送的目的地。通常,消息的类型包括消息的产生者,例如kern表示内核产生
的消息,auth表示认证系统产生的消息,等等,还包括消息的级别,例如emerg表示非常
重要的紧急信息,alert表示系统告警状态,crit表示关键状态,err 表示一般的错误信
息,warning表示警告信息,notice表示提示信息,但还不是错误,info表示一般信息,
debug表示调试信息等,因此一个消息的类型可能为:kern.debug、mail.info等,但页
可以使用通配符*进行匹配。
  从上面的syslog.conf的设置可以看出,系统正常运行中的很多重要的信息,如错误
信息*.err、内核调试信息kern.debuf、认证报告auth.notice等被直接输出的console中
,另外还有一些比较重要的信息被输出到/var/log/messages文件中,发送邮件的记录将
被保存在/var/log/mail log文件中,打印记录为/var/log/lpd-errs等,使得管理员可
以根据这些文件来查询相关记录,进行统计或寻找系统问题。其中使用syslog记录的me
ssages文件中包括root登录的信息、用户多次登录失败的尝试等对系统安全相当重要的
信息,因此也是系统遭受攻击之后,攻击者会根据syslog.conf中设置试图清除相关文件
中自己的登录记录。因此对于安全性要求更高的系统,可以尝试将syslog发送到另一台
计算机上,或者输出到一些设备文件中,如在打印机上立即打印输出。
  系统会使用newsyslog定期检查syslog输出的messages文件和maillog文件,将旧数
据压缩保存为备份文件,如messages.1.gz等。
其他日志
  除了系统登录记录和syslog记录之外,其他还有一些应用程序使用自己的记录方式

  系统每天都会自动检查系统的安全设置,包括对SetUID、SetGID的执行文件的检查
,其结果将输出到/ var/log/security.today文件中,管理员可以与/var/log/securit
y.yeste rday文件对比,寻找系统安全设置的变化。
  如果系统使用sendmail,那么sendmail.st文件中以二进制形式保存了sendmail的统
计信息。
  在系统启动的时候,就将内核的检测信息输出到屏幕上,这些信息可以帮助用户分
析系统中的硬件状态。一般使用d mesg命令来查看最后一次启动时输出的这个检测信息
。这个信息也被系统保存在/var/log/dmesg.tod ay文件中,系统中同时也存在另一个文
件dmesg.yesterday,是上次的启动检测信息,对比这两个文件,就可以了解到系统硬件
和内核配置的变化。
  lpd-errs记录了系统中lpd产生的错误信息。
  此外,各种shell还会记录用户使用的命令历史,它使用用户主目录下的文件来记录
这些命令历史,通常这个文件的名字为.history(csh),或.bash-history等。


24:我怎么才能让Netmeeting通过我的FreeBSD防火墙呢?



25:使用adduser为freebsd添加用户需要注意什么呢?

我在创建用户时遇到这样的一个问题,请那位大侠指点!!!下面是我做的步骤请问这样做对不对。
dell2650b# adduser
Use option ``-silent'' if you don't want to see all warnings and questions.

Check /etc/shells
Shell: /usr/local/bin/bash not executable!
Check /etc/master.passwd
Check /etc/group
User ``/wheel/tony'' has gid 1002 but a group with this gid does not exist.
Usernames must match regular expression: [lydong]:
Enter your default shell: csh date no sh tcsh [tcsh]:
Your default shell is: tcsh ->; /bin/tcsh
Enter your default HOME partition: [/home/lydong]:
Create /home/lydong
Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
Send message from file: /etc/adduser.message no y [y]: n
Use passwords (y/n) [y]: y

Write your changes to /etc/adduser.conf? (y/n) [n]: y

Ok, let's go.
Don't worry about mistakes. I will give you the chance later to correct any input.
Enter username [lydong]: luoyaodong
Username doesn't match the regexp /lydong/
Enter username [lydong]: lydong
Please enter a username
Enter username [lydong]: oeheonse
Username doesn't match the regexp /lydong/
Enter username [lydong]: ^C

在adduser.conf里usernameregexp指定了用来验证新用户名是否合乎规范的正则表达式,你可以修改这个值来强制用户名符合你的规定。
默认的情况下应该是:
usernameregexp = '^[a-z0-9_][a-z0-9_-]*$'
这是说用户名必须以a-z、0-9以及'_'开头,后边可以跟多个a-z、0-9、'_'、'-'字符,当你加新用户的时候,adduser就会拿这个正则表达式来效验你的用户名是否规范。

看了你输出结果:
Usernames must match regular expression: [lydong]:
这说明你把正则表达式给设置成了lydong,后边应用这个正则表达式来效验你的新用户名自然是通不过了(除非你输入lydong)。

修改也很简单,修改为usernameregexp = '^[a-z0-9_][a-z0-9_-]*$'就可以了。


26:怎样才能调优我的FreeBSD系统呢?

这个链接是man tuning的中文版



27:如何察看已经安装ports的make参数

CODE:
例子察看php4-extensions的make install 参数
cat /var/db/ports/php4-extensions/options
把/var/db/ports/php4-extensions/下文件拷贝到另一台服务器上相同位置可以省去手动指定make 参数的痛苦

28:为什么我用PQ调整了分区还是装不上FreeBSD?

因为FreeBSD不能安装在FAT32或NTFS文件系统中!

FreeBSD的安装问题:

首先应该提出几个术语:

可用空间:即是“分区”里的未使用到的部分
自由空间:windows里未被划分逻辑驱动器的扩展分区
未分配空间:当你新买一块硬盘后未经格式化的空间


很多朋友说他们曾使用PQ之类的软件对磁盘进行过分区的调整(对于PQ能不能调整出“未分配空间内”我就不得而知了,我个人不喜欢那种软件)来安装FB。但各位忽略了一点:UNIX 不能安装在windows的扩展分区中,当然也包括各个逻辑驱动器,只能是安装在“未分配空间内”。而大家常犯的错误就是使用PQ将现有的WINDOWS 逻辑驱动器进行调整,使得有一个比较大的逻辑驱动器,但FreeBSD在进行分“片”的时候只认win的主分区和扩展分区,具体该扩展分区中包含几个逻辑 驱动器BSD并不关心,这也就导致了大家花费大量心血调整出来的XX盘不能安装BSD的原因。



对于想通过VM来把BSD安装到真实硬盘上的朋友来说,也应该要注意这点,该硬盘上也只能使用的是“未分配空间”,并且选择整个磁盘来安装而不是选择分区来安装。相对来说,选择使用整个磁盘来安装的话,和我们安装双系统时的情况一致,更容易保证大家在安装过程中不会丢失数据。


FreeBSD系统中的“片(Slice)”和“分区”

这个问题说来会比较麻烦,我们需要与WIN来进行对照说明。

在windows中,我们都知道系统把硬盘分为各个逻辑驱动器来进行管理,我们可以把windows中的这种管理方式这样理解:整个硬盘是一栋楼,C、 D、E等各盘变成了栋中的一楼、二楼、三楼。。。。每个楼层的房间相当于驱动器中的各个文件夹;而FreeBSD则把这样一栋楼分成一个片 (Slice),每个楼层对应一个挂载点:/、/root、/var、/usr......然后每个文件夹对应于该层楼中的各个房间。如果各位还是不理解 的话,那么把一个硬盘想像成一个矩形的框,假设该块硬盘分为四部分,对windows来说,那么就有四个逻辑驱动器C、D、E、F,而对FB就变成了/、 swap(这个分区也需要手工划分,并且是必须的,具体需要多大要看你的FB的用途,如果是仅供学习研究,那么一般分512MB左右,我是40G的硬盘, 空间相对充足,就划分了1G的空间 )、/var(或是其他什么)、/usr (通常情况下建议单独划分出此分区)。

29:如何在安装ports时缩短下载时间

方法A: 使用代理。

在/etc/make.conf中设置:
FETCH_ENV= "HTTP_PROXY=IP[:端口]"
如果需要,在FETCH_ENV值后面加入空格,
HTTP_PROXY_AUTH=basic:*:user:password


方法B: 在其它机器上fetch

make fetch-recursive
...
然后将/usr/ports/distfiles拿走



方法c:使用wget/axel/proz加速你的port下载


以下所述功能均通过修改make.conf实现

对于wget
========
FETCH_CMD= wget
FETCH_BEFORE_ARGS= -c -t 1
FETCH_AFTER_ARGS=
DISABLE_SIZE=yes #这行是必要的,否则...

前面3行也可以换成
FETCH_CMD=wget -c -t 1

如果你要wget穿透代理服务器,请加上下面两行
FETCH_ENV=http_proxy=
FETCH_ENV=ftp_proxy=

或者使用其他的穿越代理工具例如proxychains 或者socks5(runsocks)
则FETCH_CMD=proxychains wget或者runsocks wget

什么?不知道wget是什么?那就先
cd /usr/ports/ftp/wget/
make install clean

对于axel
========
同样,也可以使用axel来替换fetch来进行多线程下载
FETCH_CMD=axel
FETCH_BEFORE_ARGS= -a
FETCH_AFTER_ARGS=
DISABLE_SIZE=yes
或者只写一行
FETCH_CMD=axel -a

axel 穿透代理服务器的方法与wget一致

axel在/usr/ports/ftp/axel位置


对于proz
========
同样,也可以使用proz来替换fetch来进行多线程下载
FETCH_CMD=proz -r
DISABLE_SIZE=yes

proz 穿透代理服务器的方法与wget一致

proz在/usr/ports/ftp/proz位置


添加更快的port下载站点
====================
另外,加上以下两行可以在让make先从更快的站点下载port

MASTER_SITE_OVERRIDE= \
\
\
\

这个是教育网的设置,公网的兄弟可以看着办啦

30.如何在旧版本ports基础上强行安装新版本ports?

# make install -D "FORCE_PKG_REGISTER" clean

好像只在一些不是很重要的ports才有效,我原有glib-2.6.x,强行安装glib-2.8.5成功,不过强行安装linux_base-8貌似失败)


31、如何使ports在安装时不检查下载软件的MD5和SHA256

有时我们从ports安装软件的时候会出一些问题,比如VSFTPD我就喜欢改动一些东西然后在安装。这时,我们可以使用
# make NO_CHECKSUM=yes
来跳过MD5和SHA256的检验,除非逼不得已或对自己的修改很有信心,否则建议make是不要使用此参数。


PS:其实很多小技巧都是在make的过程中提示的,大家稍微看下提示也能知道,如果您觉得自己的英文不过关,那就请多看看精华,会有收获的。



关于ports和packages的其他信息


摘抄并简体化此文,与初学同仁共享。

==================================

FNP:FAQ - Ports and Packages v 1.5
2004.08.20 Table of Contents

1、如何只抓取 tarball?
2、如何仅做到解开 tarball的步骤?
3、如何仅做到解开 tarball 并补上官方提供的 patch?
4、如何安装一个新的 port?
5、如何安装一个新的 port,并将打包(package)起来?
6、如何打包一个 port,并将其所有相依的 ports 也打包起来?
7、如何对一个已经安装的 port 打包?
8、如何清理 ports 编辑期间所产生的暂存资料?
9、如何清理 ports 编辑期间所产生的暂存资料,以及其相对应的 tarball?
10、如何在安装 ports 前查询所需依赖/相关的套件?
11、如何移除已安装的 ports?
12、如何一并移除所相依的 ports?
13、如何重新安装已安装过的 ports?
14、如何以关键字搜寻 ports?
15、如何升级已安装的 ports?
16、如何查询目前系统安装了哪些套件?
17、如何查询目前系统有没有安装这个关键字的套件?
18、如何查询某个档案是属於哪些套件?
19、如何查询某个套件安装了哪些档案?
20、如何安装旧版的 ports?
21、如何更新 ports Mk?
22、如何解决安装 ports 时出现 sed -i 的错误?
23、如何列出所有可以升级的 ports?
24、如何得知 ports system 对某个 ports 所提供的编译叁数?
25、如何手动加入编译 ports 的叁数?
26、如何指定 ports 的安装路径?
27、安装 ports 出现 FORCE_PKG_REGISTER 的错误讯息
28、安装 ports 出现 Shared object libintl.so.X not found 的错误讯息
29、如何安装 packages?
30、如何强制安装 packages?
31、如何查询 packages 与其他 packages 之间的相依性?
32、如何远端安装 packages?
33、如何更新 INDEX 对照表?
34、如何更新 INDEX HTML?
35、如何针对某些 ports 不做 CVSup?
36、如何使用 CVSup 同步 ports collections?
37、安装 ports 出现 port is outdated 的错误讯息
39、安装 ports 出现 OpenSSL vulnerabilities 的错误讯息
40、如何在 FreeBSD 上模拟 Linux 的环境?
41、如何在 FreeBSD 上安装 Linux rpm?
42、安装 ports 时,原本应该出现的清单选项不见了
43、如何检查是否有安装重覆的 ports/packages? `make deinstall' 与 `pkg_delete' 有什麽不同?
44、安装 ports 出现 local modification time does not match remote 的
错误讯息


1、如何只抓取 tarball?

如果只希望抓取 tarball 下来的话,仅需下 make fetch 即可。
如果是要抓取单一的 port,以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make fetch
预设会将 joe 的 tarball 下载至 /usr/ports/distfiles/ 目录下。
如果是希望抓取安装此 ports 所有须要的其他 ports 的 tarball,以

systuils/portupgrade 为例的话,则:

CODE:
cd /usr/ports/systuils/portupgrade/
make fetch-recursive
预设会将此 ports 的 tarball 与所有须要的其他 ports 的 tarball,下载至 /usr/ports/distfiles/ 目录下。

如果是希望抓取全部所有 ports 的 tarball ,则:

CODE:
cd /usr/ports/
make fetch
则会所将全部所有 ports 的 tarball 下载至 /usr/ports/distfiles/ 目录下。
如果是希望抓取全部 ftp 下所有 ports 的 tarball ,则:

CODE:
cd /usr/ports/ftp/
make fetch  
则会所将全部 ftp 下所有 ports 的 tarball 下载至 /usr/ports/distfiles/
目录下。

2、如何仅做到解开 tarball的步骤?

有时候习惯自己 patch/修正 原始码的时候,很常用到这个功能。
以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make extract
会将 tarball解开至 /usr/ports/editors/joe/work/ 目录下。

3、如何仅做到解开 tarball 并补上官方提供的 patch?

此方法与 2 有一些类似,不同於是先补上官方提供的 patch ,再行 patch 自己
的修正。以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make patch
会将 tarball解开至 /usr/ports/editors/joe/work/ 目录下,并已经 patch 上
官方提供的 patch。

4、如何安装一个新的 port?

如果系统上未安装此软体,则可以选择安装一个新的 port。
以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make install
如此会在系统上安装一个新的 joe 软体。如果需要在安装完成後,一并清除编辑
时期所留下来的暂存目录,则可叁考 FAQ 8 的方法,一起使用,如:

CODE:
cd /usr/ports/editors/joe/
#make clean
如果想要一次清掉所有 ports 产生的暂存资料,则只要回到 ports 的根目录执
行即可:

CODE:
cd /usr/ports/
#make clean
5、如何安装一个新的 port,并将打包(package)起来?

将安装完成的软体打包起来,有许多便利性:包括在丛集系统中,可供其它机器
使用,或将未来此软体出问题可重新利用此 package 重新快速安装。
以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
#make package
如此会在系统上安装一个新的 joe 软体,并将此软体打包(package)起来。

package 预设会在 /usr/ports/editors/joe/ 目录下,如果希望集中管理的话,
建议做如下的步骤:

CODE:
mkdir -p /usr/ports/packages/All/
以後打包的 packages 都会存放在此目录下,并且系统会自动做分类,以方便管
理。如果需要在安装完成後,一并清除编辑 时期所留下来的暂存目录,则可叁
考 FAQ 8 的方法,一起使用,如:

CODE:
cd /usr/ports/editors/joe/
make package clean
6、如何打包一个 port,并将其所有相依的 ports 也打包起来?

因为 FAQ 5 只有对最终的 port 才进行打包,中间依赖的 ports 并没有一起打
包,这会出现一个常遇到 的问题,就是如果编辑一个 port 需要依赖其它的
ports,那麽必须将其它 ports 也一起打包,否则安装 packages 会有相 依赖其
它 ports 的 packages 的问题。
以 sysutils/portupgrade 为例的话,则:

CODE:
cd /usr/ports/sysutils/portupgrade/
make DEPENDS_TARGET=package package
如此会在对所有 portupgrade 所相依赖的 ports 一并打包,也包括自己本身。

7、如何对一个已经安装的 port 打包?

如果安装好一个套软,事前并未打包,事後想打包的话,则:
以 editors/joe 为例的话

CODE:
cd /var/db/pkg/
pkg_create -b joe-{版本号}  
会将已安装的 port 打包起来,放在 /var/db/pkg/ 目录下。

8、如何清理 ports 编辑期间所产生的暂存资料?

在编辑 port 的时候,会有编辑期间所需要的工作目录(work),因此通常安装好
一个套件後,会清除此暂存目录,以节省系 统磁碟空间。
以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make clean
如果是希望清除所有 ports 的暂存目录,则:

CODE:
cd /usr/ports/
make clean  
如果是希望清除全部 ftp 下所有的暂存目录,则:

CODE:
cd /usr/ports/ftp/
make clean
9、如何清理 ports 编辑期间所产生的暂存资料,以及其相对应的 tarball?


在 FAQ 8 中,仅只是清除编辑期间所需要的工作目录(work),并没有将编译
ports 时一并下载的 tarball 删除(相对应之 tarball 预设会存放
在 /usr/ports/distfiles/),如果欲把 tarball 一并删除,
以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make distclean
make distclean 的步骤包含了 make clean 的功能,也就是说除了会删除
tarball 外,还会一并M除编辑期间所需要的工作目录。

如果是希望清除所有 ports 的暂存目录,及 tarball ,则:

CODE:
cd /usr/ports/
make distclean
如果是希望清除全部 ftp 下所有的暂存目录,及 tarball,则:

CODE:
cd /usr/ports/ftp/
make distclean
10、如何在安装 ports 前查询所需依赖/相关的套件?

在安装 ports 前,可以查询所需依赖/相关的套件。
以 mail/p5-Mail-SpamAssassin 为例的话,则:

CODE:
cd /usr/ports/mail/p5-Mail-SpamAssassin/
make all-depends-list #显示所有相关的套件
make pretty-print-build-depends-list #显示编译期间所需要的套件
make pretty-print-run-depends-list #显示此套件要执行时所需要的套件
11、如何移除已安装的 ports?

以 editors/joe 为例的话,则:

CODE:
cd /usr/ports/editors/joe/
make deinstall
或是使用 pkg_delete

CODE:
cd /var/db/pkg/
pkg_delete joe-{version}  
有时候套件之间的相依性会导致无法直接移除,如果要强制移除的话,则:

CODE:
cd /var/db/pkg/
pkg_delete -f joe-{version}  
但很有可能会导致其它的套件执行起来出现问题。

至於二者的差别,请叁考FAQ 43

12、如何一并移除所相依的 ports?

以 sysutils/portupgrade 为例的话,则:

CODE:
cd /usr/ports/sysutils/portupgrade/
make deinstall-depends  
执行此步骤前,请注意是否会移除应该保护的套件。建议先叁考 FAQ 10 的方法
来检查。

或是使用 pkg_delete

CODE:
cd /var/db/pkg/
pkg_delete -r portupgrade-{version}  
至於二者的差别,请叁考FAQ 43

13、如何重新安装已安装过的 ports?


重新安装的前提是,之前有安装过或目前已安装。以 editors/joe 为例的话,
则:

CODE:
cd /usr/ports/editors/joe/
make deinstall
make clean
make install 或 make reinstall  
14、如何以关键字搜寻 ports?

如果要从全部的 ports collection 中找寻与关键字 "ldap" 有关的 ports,
则:

CODE:
cd /usr/ports/
make search key=ldap  
如果只要从与 ftp 相关的 ports 下找寻与关键字 "ldap" 有关的 ports,则:

CODE:
cd /usr/ports/ftp/
make search key=ldap  
还有另一个用法,方法只是将 key 换成 name 。如果已经知道要搜寻 ports 的
名称,或只想找名称相关的关键字 "ldap", 则:

CODE:
cd /usr/ports/
make search name=ldap  
如果只要从 ftp 相关的 ports 下找寻名称与关键字 "ldap" 有关的 ports,
则:

CODE:
cd /usr/ports/ftp/
make search name=ldap  
15、如何升级已安装的 ports?

如果已经安装好套件,事後欲升级的话,必须先移除旧版本的 port,移除的方法
请叁考FAQ 11、FAQ 12及FAQ 13;之後再安装 port,安装的方法请叁考FAQ 4或
FAQ 5。

以 editors/joe 为例,且以 FAQ 11 及 FAQ 4 的方法,则:

CODE:
cd /var/db/pkg/
pkg_delete joe-{version}
cd /usr/ports/editors/joe/
make install  
或是

CODE:
cd /usr/ports/editors/joe/
make clean
make reinstall  
16、如何查询目前系统安装了哪些套件?

查询目前系统已安装的全部套件:

CODE:
pkg_info  
17、如何查询目前系统有没有安装这个关键字的套件?
此方法类似 FAQ 16 :

CODE:
pkg_info | grep  
18、如何查询某个档案是属於哪些套件?

如果想查询 /usr/local/bin/joe 是属於哪个套件的话,则:

CODE:
pkg_info -W /usr/local/bin/joe  
如果没有回传任何资讯的话,代表着这个档案是由 FreeBSD 内建的。


19、如何查询某个套件安装了哪些档案?

如果想查询目前系统所安装的 joe 包含了哪些档案,则:

CODE:
pkg_info -L /var/db/pkg/joe-{version}  
20、如何安装旧版的 ports?

有时候会因为相依性,或是新版有问题,而会想装旧版本的套件。
这里的方法是利用 CVS 的好处,回归到以前旧版本存在的日子,以安装旧版本的
套件。首先,若我们要回复到某一个套件的版本时,需要去查询 FreeBSD ports
CVS repository。最常见的就是 Freshports 网站、 FreeBSD 的 Mailing
FreeBSD cvs 或是 FreeBSD ports cvsweb。

查到该套件版本所依存的日子後,就修改 CVS tag。一般预设 ports 的 CVS
tag 会写在 /usr/share/examples/cvsup/ports-supfile ,如要回朔到
2002/10/05 号的话,则:

CODE:
# vi /usr/share/examples/cvsup/ports-supfile
******************************************
default date=2002.10.05.00.00.00 #将 date 改成当日  
然後按照一般 CVSup 的时候一样,执行 CVSup (make update),此时的 ports
collections 就会回到当时的情形,那麽该套件 旧版本也会出现在 ports
collections 中,只要安装即可。

如果仅是想把某部份的 ports 回朔,则必须加上额外的资讯,如仅希望把
lang/perl5.8 回朔,而得知此属於 lang 中的一支,则:

CODE:
# vi /usr/share/examples/cvsup/ports-supfile
******************************************
#ports-all #将 ports-all 标示起来
ports-lang #加入这行  
最後,执行 CVSup,并安装即可。目前若希望单独回朔单一的 ports,
则比较麻烦。


21、如何更新 ports Mk?

Mk (/usr/ports/Mk/) 是编译 ports 时所叁考的设定,有时若发生 ports
collections 太新,而导致 Mk 的内容不符,此时 就是应该更新 Mk 的时候了。

CODE:
cd /usr/src/
make update
cd /usr/src/share/mk
make install  
22、如何解决安装 ports 时出现 sed -i 的错误?

因为 BSD style 的 sed ,也就是 BSD 本身自有的 sed ,与一些 ports 编译期
间所执行的 sed 不一致,所以会导致一些语 法错误。此时先安装 sed_inplace
(textproc/sed_inplace),然後再安装原本无法安装的 ports:

CODE:
cd /usr/ports/???/???/
make -DUSE_REINPLACE install  
23、如何列出所有可以升级的 ports?

ports collection 的更新速度很快,在每次更新 ports collections 後,往往
会出现比目前现在安装的套件还新的版本,可 以令系统自行整理并提供可升级套
件的列表:

CODE:
pkg_version -c  
24、如何得知 ports system 对某个 ports 所提供的编译叁数?

所有的 ports collections 中所提供的编译叁数都会在对应的 Makefile 档案内
详述,如 sysutils/portupgrade 的话,
则是位在 /usr/ports/sysutils/portupgrade/Makefile 档案下。
可以对此档案浏览以得知编译时期可以下达的叁数,
如对 sysutils/portupgrade 有提供 NOPORTDOCS,则:

CODE:
cd /usr/ports/sysutils/portupgrade/
make -DNOPORTDOCS install # make NOPORTDOCS=yes install 亦同  
那麽安装此 ports 时,会将 NOPORTDOCS 所对应的相关叁数指定进去。
有时候设定较人性化的 ports 会在安装前提供叁数供选择,但是其实大部份的
ports 都没有提供,因此必须自行去搜寻可编 译的叁数,在此我提供的方式如
下:

CODE:
cd /usr/ports/sysutils/portupgrade/
grep defined Makefile  
如此几乎可以知道所有提供的可编译叁数,虽然有时会多出一些不相干的资料,
不会这个确实是一个不错可叁考的方式。


25、如何手动加入编译 ports 的叁数?

在 FAQ 24 中的方法,是 ports collections 有提供的前提之下,有时候并不是
所有该软体所支援的叁数 都会收纳在 ports collections 中,因此有时候会需
要手动加入编译的叁数。如 ftp/pure-ftpd 中,如果不想把 inetd 的支援编入
的选项,并没有被 ports collections 所纳入,因此必须手动加上这个 编译叁
数,如下:

CODE:
cd /usr/ports/ftp/pure-ftpd/
make CONFIGURE_ARGS+="--without-inetd" install  
26、如何指定 ports 的安装路径?

预设 ports collecions 已安排安装的路径 (/usr/local/),如果不想将套件安
装在预设路径的话,可以手动指定安装路径。 以 editors/joe 为例,则:

CODE:
cd /usr/ports/editors/joe/
make PREFIX=/usr install  
那麽 joe 就会将档案对应在 /usr 目录下,而不是预设的 /usr/local 目录下。


27、安装 ports 出现 FORCE_PKG_REGISTER 的错误讯息

問題敘述:
當你先前已經用ports 安裝過某一軟體 當你要再次透過ports 安裝同一軟體時,
很有可能會出現類似下述的錯誤訊息產生.

意思是說 你可以透過 make deinstall 解除安裝 然後透過 make reinstall來

再次安裝

若你確定想要*覆蓋*此安裝 可以透過設定 FORCE_PKG_REGISTER 變數達成目標.


===> An older version of PORTS資料夾位置 is already installed (軟體版本)
You may wish to ``make deinstall'' and install this port again
by ``make reinstall'' to upgrade it properly.
If you really wish to overwrite the old port of PORTS資料夾位置
without deleting it first, set the variable "FORCE_PKG_REGISTER"
in your environment or the "make install" command line.

處理方式:
只要在make install 時加上 FORCE_PKG_REGISTER="yes" 就可以強制安裝.
也就是: /usr/ports/資料夾位址/#make install FORCE_PKG_REGISTER="yes"


28、安装 ports 出现 Shared object libintl.so.X not found 的错误讯息

Shared object "libintl.so.4" 或 (libc.so.4) not found

問題敘述:
近來的FreeBSD版本,常常在安裝某些軟體時,會出現類似的失敗畫面
並且告訴你缺乏 libintl.so.4或是 libc.so.4 這個函式.

Shared object "libc.so.4" not found
如下圖:是近來版本安裝某些程式問題時常見的問題,缺少 libc.so.4 函式.


問題分析:
提到libc.so函式 首先想到的是與 linux 程式相關共享函式庫.
FreeBSD在讀取相關函式前,首先會在 /compat/linux 資料夾中尋找;
然後若找不到則會嘗試搜尋 /lib 資料夾.

以 libc.so 函式為例,會先尋找/compat/linux/lib/libc.so ;
其次才是/lib/libc.so .

簡單的解決方式:


Shared object "libintl.so.4" not found
跟 libc.so 函式一樣 也是在安裝某些軟體就會出現錯誤畫面.

問題分析:
libintl.so 函式是安裝 /usr/port/devel/gettext/ 程式後取得.
理論上來說 目前版本的相關函數是 libintl.so.5 為何還要去讀取舊的 libintl.so.4 版本.

當你在安裝gmake時,gmake會去連結安裝gmake當時的libinl.so的版本,是version 4.
也就是 libintl.so.4

當你更新過相關的ports (devel/gettext) 將會用 libintl.so.5 取代 libintl.so.4
除非你能取得先前某些系統保留舊有的 libintl.so.4 否則就會出現安裝失敗
狀況.

很可惜的是...有很多程式需要 gettext 函式.
你可以用 cd /usr/ports/ ; make search key="gettext" | more 查詢
為什麼要加上more 因為太多怕你看到昏頭...QQ

問題解決:
要解決這個問題 你可以透過重新建立所有與 gettext 相關的ports程式.

# portupgrade -fr gettext
重新建立或重新安裝所有與 gettext相關連的程式,
若你忘掉了 請參閱 更新ports/升級系統 > portupgrade 軟體更新

或是簡單的用偷吃步 把*目前版本*link過去..QQ (版本6..類推)


然後就可以順利進行程式安裝.



29、如何安装 packages?

目前 FreeBSD 的 packages 是由 .tgz 所打包。如果想安装一个 packages ,可
使用 pkg_add,如安装一个 joe 的 tgz:

CODE:
pkg_add joe-{version}.tgz  
30、如何强制安装 packages?

由於有些 packages 会有与其他 packages 相依性的关系,所以必须先行安装那
些 packages 才能正常安装。 如果须要强制安装 packages ,可以不须安装那些
有相依性 packages ,但要注意的是强制安装的结果可能会导致执行或运作的不
正常。强制安装 packages 的指令如下,如强制安装一个 joe 的 tgz:

CODE:
pkg_add -f joe-{version}.tgz
31、如何查询 packages 与其他 packages 之间的相依性?

由於有些 packages 会有与其他 packages 相依性的关系,所以必须先行安装那
些 packages 才能正常安装。 查询 packages 与其他 packages 之间的相依性的
指令如下,如查询与 portupgrade 相依的其他 packages:

CODE:
pkg_info -r portupgrade-{version}.tgz  
32、如何远端安装 packages?

有两种设定方式,首先是 PACKAGEROOT,如:

setenv PACKAGEROOT #设定 PACKAGEROOT 为 ftp.cn.freebsd.org 站台

另一种方式是设定 PACKAGESITE,好处是若该站台的 packages 仓储并不是符合
官方的设定或你想自己指定一个路径。
以 ftp.cn.freebsd.org i386 的 current pakcages 为例:

setenv PACKAGESITE ftp://ftp.cn.freebsd.org/pub/Fre ... ges-current/Latest/

两种方式选择其中一种皆可,接下来的步骤都一样。
往後要安装 packages 的时候,如 portupgrade 的话,则:

CODE:
pkg_add -r portupgrade  
则系统会自动於 ftp.cn.freebsd.org 抓取所有与 portupgrade 相依的 packages 并安装。


33、如何更新 INDEX 对照表?

4.x 的 INDEX 位於 /usr/ports/INDEX,5.x 位於 /usr/ports/INDEX-5。
INDEX 是对照 ports 所有相依等资讯的对照表,若长期未更新的话,会导致
ports 对照失败。官方有定期更新 INDEX,如果 想自行更新的话,则:

CODE:
cd /usr/ports/
make index  
34、如何更新 INDEX HTML?

FreeBSD 提供了用网页的方式来观看 ports collection,即可使用 lynx, w3m,
links 或其它可浏览网页的程式来查阅。制作全部 ports collection 的方式如
下:

CODE:
cd /usr/ports/
make readmes  
如果是仅须要做目前目录下的资讯,或单一更新某一分类下的资讯,如 /usr/ports/ftp/ 的话,则:

CODE:
cd /usr/ports/ftp/
make readme  
则仅会更新 /usr/ports/ftp/ 这个目录的资讯,其上与其下的目录皆不会更动
到。 执行成功後,会在相对应的目录下产生 README.html 的档案。


35、如何针对某些 ports 不做 CVSup?

若 ports 底下的某些分类完全用不到,则可以在 CVSup 时,不做更新,以节省
网路频宽与时间。

CODE:
# vi /usr/sup/refuse
******************************************
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/japanese
那麽则上述目录下的档案皆不会更新。

如果是想要某些单一的 ports 不做同步,例如想保留旧版不做同步,或新版出现
问题时。

CODE:
# vi /usr/sup/refuse
******************************************
ports/lang/perl5.8  
那麽 ports/lang/perl5.8 这个 ports 不会做 CVSup 同步。

这些设定方法支援万用字元。

CODE:
# vi /usr/sup/refuse
******************************************
ports/lang/perl*
ports/po*  
36、如何使用 CVSup 同步 ports collections?

请叁考 gslin 的 用 CVSup 去更新你的 source tree 以及 ports tree。


37、安装 ports 出现 port is outdated 的错误讯息

例如安装 imap-uw 时,出现以下内容:
Your installation of the cclient port is outdated. Please delete it before continuing.

表示因为相对应,且已安装好的 cclient 这个软体过於老旧,建议先升级这个软
体再行安装 imap-uw。因此只要先升级 cclient 後,再安装即可。

CODE:
# cd /usr/ports/mail/cclient/
# make reinstall 或 # make deinstall && make install
# cd /usr/ports/mail/imap-uw/
# make install  
38、安装 ports 出现 OpenSSL vulnerabilities 的错误讯息

在安装有些套件时,如果有相依於 OpenSSL 时,且判断系统目前使用的 OpenSSL 版本有漏洞问题时,会出现如下的讯息:
Dependency warning: used OpenSSL version contains known
vulnerabilities Please update or define either WITH_OPENSSL_BASE or
WITH_OPENSSL_PORT

一般建议的解决方法有二种。

第一种:升级系统(需含系统内建之 OpenSSL 一并升级),再安装该套件
可以先查询目前系统所用之 OpenSSL 的版本:

CODE:
openssl version -v  
升级系统可叁考 FNP: upgrade core system 或 FNP: upgrade major system。
升级完系统後,再进行一次 OpenSSL 版本之确认。
然後再安装该套件,这讯息就不会出现了。

第二种:使该套件相依於 ports tree 中的 OpenSSL
这种方法会安装 ports tree 中新版本的 OpenSSL,然後相依於此新版本的
OpenSSL,而不是系统本身内建的 OpenSSL。只要安装套件时,加入 WITH_OPENSSL_PORT 的叁数,
即会安装 ports tree 中的 OpenSSL,并且该套件
也会相依於此。方法如下:

CODE:
make -DWITH_OPENSSL_PORT install  
这里不建议用叁数 WITH_OPENSSL_BASE,因为这表示安装套件时,是相依於原本
系统中可能有漏洞的 OpenSSL,这样会导致安全性的问题。


39、如何在 FreeBSD 上模拟 Linux 的环境?

最新最完整的资料在官方的 Handbook 上。

简单来说,FreeBSD 核心必须支援,且必须安装 Linux Runtime Libraries,最
後做一些设定。

如果要执行 Linux ELF Binaries,可以先查询目前 FreeBSD 是否已经支援 Linux ELF。

CODE:
brandelf -l  
看是否有 Linux 的字样,如果没的话,请回头检查是否哪一步骤没有做到。

然後检查执行档是否为 Linux ELF Binaries。

CODE:
brandelf execution-binary-filename  
如果是 Linux ELF Binaries,则正常执行即可。

如果显示结果不是 Linux ELF Binaries,但是自己确定是 Linux ELF Binaries
的话,则只要更改一下 ELF 的格式即可。

brandelf -t Linux execution-binary-filename

然後再检查一次是否已经修正为正确的格式。


40、如何在 FreeBSD 上安装 Linux rpm?

请确定已经成功在 FreeBSD 上模拟 Linux 的环境,请叁考 FAQ 39。

安装 rpm 的方式如下:

CODE:
rpm --ignoreos --root /compat/linux --dbpath /var/lib/rpm/ -Uvh xxx.rpm  
41、安装 ports 时,原本应该出现的清单选项不见了

这是由於系统会纪录曾安装过 ports 的当时所选择的清单选项,因此有时会因为
安装时出了问题,或是再一次安装时,就不会出现清单可以选择。如何让清单选
项重新出现呢?

CODE:
make clean
make showconfig # 显示设定的内容
make rmconfig # 清除设定的内容
make config  
之前设定 ports 的选项预设会纪录在 /var/db/ports/{ports_name}/options 内
容中。如要查看之前 python 有选择的清单选项:

CODE:
cat /var/db/ports/python/options  
42、如何检查是否有安装重覆的 ports/packages?

随着时间的演进,不同时间安装的软体会有不同版本的释出,而且不同软体相依
的版本号也不同,所以往往会造成同一个软体安装过多版本的情形发生。

这里我必须声明的是,虽然套件名称相同,可是可能没办法上下相容,因此造成
有些软体必须依赖比较旧的版本,而有些软体必须依赖比较新的版本,如果有这
种情形发生的话,那麽二个版本的存在是正常的。

否则的话,我们会建议移除旧版的套件,将所有相依於此套件改为相依於新版
的。也就是说,移除旧版的套件,然後将原本相依於旧版的套件,改为相依於新
版的套件。注意,我强调的是新旧版套件是相容的。因为这种做法有点危险,因
此不提供做法,请使用更水阶的套件管理工具,如 portupgrade 来完成。

检查是否有安装重覆的 ports/packages 的方法如下:

CODE:
pkg_info | sort | sed -e 's/-[0-9].*$//' | uniq -c | grep -v '^[[:space:]]*1'  
如果有一行是显示" 3 libtool",则表示目前系统有安装三种不同版本的
libtool套件。
接下来可以检查这三种版本是否可以相容:

CODE:
cd /usr/ports/
make search name=libtool  
如果发现分别有三种 ports 来代表这三种不同版本的 libtool,就表示他们彼此
不相容,必须保留三者,否则可能会发生相依问题。假设如下:

CODE:
/usr/ports/devel/libtool13
/usr/ports/devel/libtool14
/usr/ports/devel/libtool15
反之,如果发现只有一种 ports 来代表这种不同版本的套件,则表示目前系统安
装的三种版本是相容的,只要修改原本相容於其它二种版本所有的套件,并指向
欲保留的那个版本,然後移除其它二种即可。如发现系统目前有安装三种不同版
本的 gettext:

CODE:
cd /usr/ports/
make search name=gettext  
然後检查的结果如下:

CODE:
/usr/ports/devel/gettext  
则将所有相依於 gettext 旧版本的其它套件都改为相依於新版的 gettext,然後
再移除系统中旧版的 gettext 即可。


43、`make deinstall' 与 `pkg_delete' 有什麽不同?

简单来说,`make deinstall' 会移除该 port,并且不会叁照其相依/相关的 ports。

`pkg_delete' 在移除该 port 前,会叁照其相依/相关的 ports,并且 `pkg_delete'
有支援 wild card,如要移除所有 p 开头的 ports,则:

CODE:
cd /var/db/pkg/
pkg_delete p*  
要注意的是,如果使用 `make deinstall',则最好确定系统目前所
安装的版本,与 ports collection 中显示的版本符合,否则有可能会出现非预
期性错误;而 `pkg_delete' 是因为直接删除系统中所安装的版本,所以没有此
问题。

因此,换句话说,当系统所安装的版本符合 ports collections 中的版本,则可
以使用 `make deinstall' 或 `pkg_delete',否则的话最好用 `pkg_delete'。


与 `make deinstall' 相关的资讯:FAQ 11、FAQ 12及FAQ 13。
与 `pkg_delete' 相关的资讯:FAQ 11、FAQ 12及FAQ 15。



44、安装 ports 出现 local modification time does not match remote 的错误讯息

这通常表示你已经下载了这个档案在 /usr/ports/distfiles 的对应目录中,但
是它并不是 port collections 所期望下载的。通常的解决方法是
在 /usr/ports/distfiles 的对应目录中移除此档案,再重新抓取。

例如是安装 joe 时出现如下的错误讯息:
fetch: joe2.8.tar.Z: local modification time does not match remote

则将 joe2.8.tar.Z 於 /usr/ports/distfiles 中移除:

CODE:
cd /usr/ports/editors/joe/
make distclean  
最後再重新安装即可





阅读(1018) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~