电脑技术学习

深入谈谈FreeBSD服务器的安装与优化

dn001
  FreeBSD基本系统的安装

  作为一个服务器治理员,经常性的服务器软件更新是必不可少的。FreeBSD提供了非常便捷的升级方式——cvsup,它可以从FreeBSD中心cvsup服务器,或某个cvsup镜像上获取FreeBSD的部分或全部源代码,而且,它只下载那些修改过的源代码,并且可以根据需要选择适合你的版本(使用-STABLE可以提供较好的稳定性以及操作系统的最新特性,多数治理员都会选择这个;使用-RELEASE能够获得成熟产品的品质,尽管话是这样说,但实际上选择这一分支的人很少;使用-CURRENT的用户主要是参与FreeBSD开发的人员,这个分支包含了所有即将进入-STABLE分支的新特性,但不要指望这个分支能够提供必要的稳定性保证,也不要指望它能够带来很好的性能,但所有的安全问题都是首先在这个分支内修正的。我将在后面具体介绍这些)。

  一旦最初的内核配置完成,它就会立即启动,并根据配置文件启动sysinstall(8)。我们将看到一个标准的文字模式配置界面,这有点类似于早期Visual Basic For MS-DOS编写的应用程序的界面。

  选择Standard进入标准的FreeBSD安装过程。首先是对磁盘进行分区。

  FreeBSD对于磁盘的治理和Windows有比较大的差别。一个磁盘上通常有一个Partition就够了,而一个Partition又可以分成若干个slice,并加以标记(label)。实际上,FreeBSD的slice基本上可以等同于Windows的磁盘分区,或卷的概念。

  为了保证与FreeBSD共存的系统能够启动,默认情况下FreeBSD会保留一部分磁盘空间(64 cyl)。对于单一操作系统的计算机来说,这是完全没有必要的。分区时按Shift F可以选择不使用这个特性,不过这种情况下,除了彻底毁掉这套FreeBSD之外,恐怕就没有其他方法能够从这块硬盘上引导其他操作系统了。为了完全使用磁盘空间,我选择了不保留预留空间。


  随后是在这个Partition上创建slice。和Linux的情况类似,FreeBSD也使用单独的交换区。这种设计可以避免碎片,也防止了对文件系统的影响,性能较好。通常情况下交换分区是内存的2-2.5倍,这足以应付日常的突发事件。/var用于保存那些不在集群中共享的文件,/tmp用来保存临时文件,而/usr用来保存那些需要在集群中同步的文件。/就不用说了,它保存的是启动系统需要的文件。

  通常给/分配的空间是128MB,/tmp和/var各256MB,剩下的都分给/usr。不过也有例外,假如打算做一个大型的邮件系统,则/var要大一些(通常邮件系统依靠/var来保存邮件)。当然,各个slice可以mount到不同的地方(例如,你可以把曾经的/usr变成/var),不过最开始配置好可以减少很多麻烦。

  当然,偷懒的方法也是有的。在没有slice,或没有完全配完slice的情况下按A,系统会给出一组(或对剩下的label)默认的配置。假如你打算单纯提供Web 数据库这样的服务,完全可以直接接受这组配置。

  从FreeBSD 4.x开始,ufs支持了一个叫做SoftUpdates的技术。SoftUpdates的主要设计目标是提高文件系统性能。除了/所在的slice之外,所有的ufs slice都应打开SoftUpdates,这样对于提高系统整体性能很有好处。(/虽然也是ufs slice,但打开SoftUpdates会造成系统不稳定——FreeBSD文档如此警告,而笔者确实也吃过这个亏。不过,由于/的内容不需要经常变化,不打开SoftUpdates和打开了SoftUpdates几乎没有性能上的差别) 。SoftUpdates可以随时通过tunefs(8)来打开或关闭。在label(8)程序中,打开SoftUpdates的标志是文件系统显示为ufs s。

  之后是选择安装介质和要装的Distribution。它提供了几组常见的情况。Minium安装最小系统,包括一些基本的Unix程序。Developer包括了一些开发工具;X-Developer和Kernel-Developer分别是X和内核开发人员用的。此外还有可选的ports,它可以帮助我们来安装应用程序。

  当然,偷懒的方法也是有的。在没有slice,或没有完全配完slice的情况下按A,系统会给出一组(或对剩下的label)默认的配置。假如你打算单纯提供Web 数据库这样的服务,完全可以直接接受这组配置。

  从FreeBSD 4.x开始,ufs支持了一个叫做SoftUpdates的技术。SoftUpdates的主要设计目标是提高文件系统性能。除了/所在的slice之外,所有的ufs slice都应打开SoftUpdates,这样对于提高系统整体性能很有好处。(/虽然也是ufs slice,但打开SoftUpdates会造成系统不稳定——FreeBSD文档如此警告,而笔者确实也吃过这个亏。不过,由于/的内容不需要经常变化,不打开SoftUpdates和打开了SoftUpdates几乎没有性能上的差别) 。SoftUpdates可以随时通过tunefs(8)来打开或关闭。在label(8)程序中,打开SoftUpdates的标志是文件系统显示为ufs s。

  之后是选择安装介质和要装的Distribution。它提供了几组常见的情况。Minium安装最小系统,包括一些基本的Unix程序。Developer包括了一些开发工具;X-Developer和Kernel-Developer分别是X和内核开发人员用的。此外还有可选的ports,它可以帮助我们来安装应用程序。

  我通常使用的是Custom(定制安装),不安装源代码、ports(因为这些可以从cvsup同步得到最新的,安装一遍浪费时间),只安装XFree86(主要是为了运行cvsup,因为编译不需要X的cvsup需要很长时间,而且很多其他的东西,如php要用到的gd等等,需要XFree86的库文件的支持)、基本系统以及一部分库文件。当然,您也可以根据需要选择安装其他组件。

  完成之后系统就开始安装了。注重,一旦安装开始,所有前面做的分区、建立文件系统等操作就结坚固实地写到了硬盘上,再没有反悔的机会了。假如您的硬盘上包含重要数据,那么请在这之前备份。

  根据计算机速度的不同,这个过程可能持续10分钟到数小时不等。在此过程中,除了光盘或硬盘出问题之外,基本上不会出现节外生枝的情况。按Alt F2可以切换到用于调试sysinstall(8)的控制台,Alt F4可以切换到一个命令行控制台,这些都是调试FreeBSD安装过程,或应付紧急情况的,通常用不到。

  全部系统文件安装完成之后,sysinstall(8)会给出一个祝贺画面。同时,它也告诉你如何在以后运行sysinstall(8)进行其他操作,如配置等等。实际上,在FreeBSD中sysinstall(8)基本上相当于Windows控制面板的作用。

  随后可以根据自己的情况配置网络、设置时区、显示字体、XWindow等等,并且创建新的用户(FreeBSD中的内建治理员叫做root,但由于它拥有一切特权,因此完全靠它来做日常工作有时会不太方便,笔者自己就曾不慎以root身分删除了modules,然后战战兢兢地重新编译内核)。

  FreeBSD安装盘上还提供了一些packages。这些packages是预先遍一号的应用程序。对于一台拥有很好的Internet连接的、速度足够快的机器来说,并不需要安装packages(KDE和X除外,编译它们各需要花上一天一夜的功夫)。这台机器速度还称不上“足够快,所以我安装了cvsup,它在devel中。
  到目前为止,我们已经安装了FreeBSD的基本系统。由于FreeBSD基本系统中包括很多库文件,并且,这些库文件可能已经被发现存在问题,因此现在马上安装应用程序或服务(如Apache等等)是不合适的。此后我们将讲解FreeBSD的在线升级(cvsup)、应用程序的安装,以及优化。

  FreeBSD基本系统的安装

  作为一个服务器治理员,经常性的服务器软件更新是必不可少的。FreeBSD提供了非常便捷的升级方式——cvsup,它可以从FreeBSD中心cvsup服务器,或某个cvsup镜像上获取FreeBSD的部分或全部源代码,而且,它只下载那些修改过的源代码,并且可以根据需要选择适合你的版本(使用-STABLE可以提供较好的稳定性以及操作系统的最新特性,多数治理员都会选择这个;使用-RELEASE能够获得成熟产品的品质,尽管话是这样说,但实际上选择这一分支的人很少;使用-CURRENT的用户主要是参与FreeBSD开发的人员,这个分支包含了所有即将进入-STABLE分支的新特性,但不要指望这个分支能够提供必要的稳定性保证,也不要指望它能够带来很好的性能,但所有的安全问题都是首先在这个分支内修正的。我将在后面具体介绍这些)。

  一旦最初的内核配置完成,它就会立即启动,并根据配置文件启动sysinstall(8)。我们将看到一个标准的文字模式配置界面,这有点类似于早期Visual Basic For MS-DOS编写的应用程序的界面。

  选择Standard进入标准的FreeBSD安装过程。首先是对磁盘进行分区。

  FreeBSD对于磁盘的治理和Windows有比较大的差别。一个磁盘上通常有一个Partition就够了,而一个Partition又可以分成若干个slice,并加以标记(label)。实际上,FreeBSD的slice基本上可以等同于Windows的磁盘分区,或卷的概念。

  为了保证与FreeBSD共存的系统能够启动,默认情况下FreeBSD会保留一部分磁盘空间(64 cyl)。对于单一操作系统的计算机来说,这是完全没有必要的。分区时按Shift F可以选择不使用这个特性,不过这种情况下,除了彻底毁掉这套FreeBSD之外,恐怕就没有其他方法能够从这块硬盘上引导其他操作系统了。为了完全使用磁盘空间,我选择了不保留预留空间。
  随后是在这个Partition上创建slice。和Linux的情况类似,FreeBSD也使用单独的交换区。这种设计可以避免碎片,也防止了对文件系统的影响,性能较好。通常情况下交换分区是内存的2-2.5倍,这足以应付日常的突发事件。/var用于保存那些不在集群中共享的文件,/tmp用来保存临时文件,而/usr用来保存那些需要在集群中同步的文件。/就不用说了,它保存的是启动系统需要的文件。

  通常给/分配的空间是128MB,/tmp和/var各256MB,剩下的都分给/usr。不过也有例外,假如打算做一个大型的邮件系统,则/var要大一些(通常邮件系统依靠/var来保存邮件)。当然,各个slice可以mount到不同的地方(例如,你可以把曾经的/usr变成/var),不过最开始配置好可以减少很多麻烦。

  当然,偷懒的方法也是有的。在没有slice,或没有完全配完slice的情况下按A,系统会给出一组(或对剩下的label)默认的配置。假如你打算单纯提供Web 数据库这样的服务,完全可以直接接受这组配置。

  从FreeBSD 4.x开始,ufs支持了一个叫做SoftUpdates的技术。SoftUpdates的主要设计目标是提高文件系统性能。除了/所在的slice之外,所有的ufs slice都应打开SoftUpdates,这样对于提高系统整体性能很有好处。(/虽然也是ufs slice,但打开SoftUpdates会造成系统不稳定——FreeBSD文档如此警告,而笔者确实也吃过这个亏。不过,由于/的内容不需要经常变化,不打开SoftUpdates和打开了SoftUpdates几乎没有性能上的差别) 。SoftUpdates可以随时通过tunefs(8)来打开或关闭。在label(8)程序中,打开SoftUpdates的标志是文件系统显示为ufs s。

  之后是选择安装介质和要装的Distribution。它提供了几组常见的情况。Minium安装最小系统,包括一些基本的Unix程序。Developer包括了一些开发工具;X-Developer和Kernel-Developer分别是X和内核开发人员用的。此外还有可选的ports,它可以帮助我们来安装应用程序。

  当然,偷懒的方法也是有的。在没有slice,或没有完全配完slice的情况下按A,系统会给出一组(或对剩下的label)默认的配置。假如你打算单纯提供Web 数据库这样的服务,完全可以直接接受这组配置。

  从FreeBSD 4.x开始,ufs支持了一个叫做SoftUpdates的技术。SoftUpdates的主要设计目标是提高文件系统性能。除了/所在的slice之外,所有的ufs slice都应打开SoftUpdates,这样对于提高系统整体性能很有好处。(/虽然也是ufs slice,但打开SoftUpdates会造成系统不稳定——FreeBSD文档如此警告,而笔者确实也吃过这个亏。不过,由于/的内容不需要经常变化,不打开SoftUpdates和打开了SoftUpdates几乎没有性能上的差别) 。SoftUpdates可以随时通过tunefs(8)来打开或关闭。在label(8)程序中,打开SoftUpdates的标志是文件系统显示为ufs s。

  之后是选择安装介质和要装的Distribution。它提供了几组常见的情况。Minium安装最小系统,包括一些基本的Unix程序。Developer包括了一些开发工具;X-Developer和Kernel-Developer分别是X和内核开发人员用的。此外还有可选的ports,它可以帮助我们来安装应用程序。

  我通常使用的是Custom(定制安装),不安装源代码、ports(因为这些可以从cvsup同步得到最新的,安装一遍浪费时间),只安装XFree86(主要是为了运行cvsup,因为编译不需要X的cvsup需要很长时间,而且很多其他的东西,如php要用到的gd等等,需要XFree86的库文件的支持)、基本系统以及一部分库文件。当然,您也可以根据需要选择安装其他组件。

  完成之后系统就开始安装了。注重,一旦安装开始,所有前面做的分区、建立文件系统等操作就结坚固实地写到了硬盘上,再没有反悔的机会了。假如您的硬盘上包含重要数据,那么请在这之前备份。

  根据计算机速度的不同,这个过程可能持续10分钟到数小时不等。在此过程中,除了光盘或硬盘出问题之外,基本上不会出现节外生枝的情况。按Alt F2可以切换到用于调试sysinstall(8)的控制台,Alt F4可以切换到一个命令行控制台,这些都是调试FreeBSD安装过程,或应付紧急情况的,通常用不到。

  全部系统文件安装完成之后,sysinstall(8)会给出一个祝贺画面。同时,它也告诉你如何在以后运行sysinstall(8)进行其他操作,如配置等等。实际上,在FreeBSD中sysinstall(8)基本上相当于Windows控制面板的作用。

  随后可以根据自己的情况配置网络、设置时区、显示字体、XWindow等等,并且创建新的用户(FreeBSD中的内建治理员叫做root,但由于它拥有一切特权,因此完全靠它来做日常工作有时会不太方便,笔者自己就曾不慎以root身分删除了modules,然后战战兢兢地重新编译内核)。


  FreeBSD安装盘上还提供了一些packages。这些packages是预先遍一号的应用程序。对于一台拥有很好的Internet连接的、速度足够快的机器来说,并不需要安装packages(KDE和X除外,编译它们各需要花上一天一夜的功夫)。这台机器速度还称不上“足够快,所以我安装了cvsup,它在devel中。


  到目前为止,我们已经安装了FreeBSD的基本系统。由于FreeBSD基本系统中包括很多库文件,并且,这些库文件可能已经被发现存在问题,因此现在马上安装应用程序或服务(如Apache等等)是不合适的。此后我们将讲解FreeBSD的在线升级(cvsup)、应用程序的安装,以及优化。

  完成了安装、配置,FreeBSD基本上就算装完了。不过,目前为止没有哪个通用操作系统能够保证“bug-free,FreeBSD也一样。在重新启动之后,我们需要做一些调整;并且,通过重新配置内核,我们可以得到一个更小、更快的操作系统。

  第一步要做的是同步源代码。FreeBSD是一套开放源代码的操作系统,它的全部源代码都可以通过cvsup与中心cvsup服务器,或它的某个镜像同步。

  cvsup是一个可选的package,同样的,它也可以从ports里面安装(/usr/ports/devel/cvsup和/usr/ports/devel/cvsup-nogui)。考虑到许多应用程序都依靠X的库文件,在前面安装的部分我安装了它,并且直接安装了cvsup的package。不过,假如你有足够的耐心去一个一个地make需要的ports,那么先安装ports collection,然后make cvsup-nogui也是一个不错的主意,尽管这需要比较长的时间。

  创建一个用于cvsup(1)的supfile,命名为stable-supfile:

  (default host中选定的cvsup服务器——ftp.bjpu.edu.cn对访问的IP进行了限制,笔者只在北京工业大学校内使用过,因此假如您无法连接这个服务器,请尝试www.cn.freebsd.org,或cvsup.freebsd.org)
*default host=ftp.bjpu.edu.cn
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_4
*default delete use-rel-suffix
src-all
ports-all tag=.
;

  随后执行

  cvsup -g -L 2 stable-supfile

  这里需要稍微解释一下FreeBSD的几种版本。

  FreeBSD包括3类分支:-RELEASE,-STABLE和-CURRENT。FreeBSD 3.x、4.x和5.0是目前受到维护的版本,假如你期待稳定运行,那么,可以选择的最新版本将是FreeBSD 4.6-STABLE(假如你是在4.6.2-RELEASE发行之后更新的,那么它实际上比4.6.2-RELEASE新,并且,它正式的CVS tag是RELENG_4,即FreeBSD 4-STABLE)。

  那么,三类分支有什么区别呢?

  FreeBSD的开发是非常活跃的。系统中可能会随时引入一些新的特性。最新的代码是在-CURRENT分支中引入的。-CURRENT的修改非常频繁,天天都可能有数百处修改。使用-CURRENT分支的FreeBSD需要耐心和勇气,因为你的系统随时可能崩溃(随着FreeBSD 5.0开发尾声的接近,这种现象已经越来越少),make world也可能空手而归(没有人保证-CURRENT分支能够正常编译),此外,这个分支的性能也不好(因为调试的原因,这个分支引入了大量的调试选项,这意味着运行速度不会太快)。当然,正像它的名字那样,-CURRENT分支的版本也是最新的5.0,而且,一切FreeBSD的错误和漏洞的修正都是首先在-CURRENT分支引入的。目前,-CURRENT分支硕果仅存的只有FreeBSD 5-CURRENT(指定cvs tag时写“.),这个分支包括了FreeBSD 5.0开发的最新进展。

  FreeBSD 5中将引入大量的新特性,包括核心级线程(目前FreeBSD中的线程支持仅限于用户级线程,这在多处理器的环境下性能不够好,当然,目前使用fork()来支持的多进程线程模拟能够提供类似核心级线程的功能,但并不是所有的程序员都知道如何使用fork)、完整的Soft Updates(这一变化将提供更好的文件系统性能,同时提供更好的稳定性),等等。假如你有快速的Internet连接,一台或一些空余的机器(当然,不是生产用的服务器),并且希望为FreeBSD的开发作贡献,或者你关心操作系统的最新发展,那么,-CURRENT分支是最好的选择。

  此外,由于-CURRENT分支性能不好、稳定性不够等这些缺点,对于生产的服务器来说,通常运行的应该是FreeBSD-STABLE。如同它的名字那样,FreeBSD-STABLE的目的是“稳定地运行。-CURRENT分支中的代码,在经过一段时间(通常是7到90天,但安全更新属于特例,通常会在几个小时)的验证之后,符合版本条件(有些新特性只能用于FreeBSD 5.0)的代码会被FreeBSD-STABLE吸收,这个操作称作MFC(Merge From -CURRENT,不是Microsoft Foundation Classes:P)。

  由于FreeBSD 5.0的第一个RELEASE至今仍然没有发布,因此,目前还没有5.0-STABLE。目前,FreeBSD-STABLE有两个版本,FreeBSD 3-STABLE和FreeBSD 4-STABLE,分别对应3.x和4.x的最新稳定版代码(对应的cvs tag分别是RELENG_3和RELENG_4)。由于版本的更新换代,其中3.x的-STABLE正在逐渐消亡。FreeBSD-STABLE天天平均会修改10个左右的文件。

  每隔一段时间,FreeBSD的发行工程组(Release Engineering Team)会对FreeBSD-STABLE的源代码树进行锁定。这段时间(目前的规定是30天,之前还有30天预备)内,所有的MFC操作都需要发行工程组的批准,因此,FreeBSD-STABLE在这个阶段基本不会引入任何新的特性。经过这段时间之后,发行工程组会在最后锁定ports树,并build一份所有的package,之后,这份锁定的-STABLE,可能经过若干RC(Release Candidate),被命名为RELEASE,并制作光盘发行。

  顾名思义,-RELEASE的设计目标是“发行。一个版本一旦RELEASE,那么他的功能就不会再增加了。此后的所有维护的目标都只有一个,那就是绝对稳定。假如你和-RELEASE分支同步,那么绝不会出现make无法通过的情况,而且,通常这也可以保证你的系统“绝对稳定,因为它不会引入任何新功能(例如,4.6就是4.6,假如你想要4.6.2的功能,必须明确地指定4.6.2)。

  目前,FreeBSD有很多RELEASE版本,它们的cvs tag如下。我个人建议使用最新的4.6.2-RELEASE。

  对于多数人来说,-RELEASE是一个比较极端的选择。无论何时出现版本升级,假如你想跟进,那都必须修改supfile,假如你选择不跟进,那么就可能造成ports工作异常。假如经常更新,-RELEASE可以保证操作系统本身的安全性,但同其他分支一样,假如ports出了问题,那么也得一块make,而既然这样,还不如使用-STABLE。

  假如你符合下面的条件,那么RELEASE分支可能比-STABLE分支更适合你

;;;;;你使用的软件对于操作系统的变化非常敏感,比如,它只能FreeBSD 4.5,而无法在4.6上运行;同时,你不打算采用它的更新版本,或者它的作者拒绝更新
操作系统的更新对于你来说没有任何意义,比如,你打算把FreeBSD当作一个相对固定的嵌入式操作系统来使用,例如,作为防火墙的一部分
更新会对你造成困扰,操作系统的绝大多数新特性对于你来说除了增加烦恼之外,不能带来任何其他东西。-并且,符合以下的全部条件-
你天天察看FreeBSD,以及使用的全部软件的安全公告

你的Internet连接比较通畅
;
  目前我本人维护的所有主机,除了作为防火墙的那台之外,使用的都是FreeBSD-STABLE。

  一旦同步完源代码,就应该对整个系统进行更新。假如你没有天天察看安全公告的习惯,那就应该关心一下cvsup到底更新了哪些代码。nectar是目前FreeBSD的Security Officer。假如你发现他一下子更新了许多代码,那么对你来说立即make world和kernel很可能是必需的。

  为了更新整个系统,在/usr/src中执行

  make world

  以及

  make kernel KERNCONF=内核配置文件名

  当然,也可以连起来执行:

  make world kernel KERNCONF=内核配置文件名

  假如你的计算机运行速度较慢,那么,对于基本系统的更新(相当于不包括库的一次world),可以用

  make most

  替代make world,但make world是一个不错的主意,因为它能够保证对C运行环境的改变应用到所有的程序中,假如修正的不是动态连接的C函数库,那么make world可以保证代码的一致性。

  make kernel是一个需要重新启动的操作。假如你的make world修改了系统的要害服务,那么最好也重新启动一下。我很少有耐心看完make world和kernel的执行,根据系统的运行速度不同,这需要一个小时到一天的时间,而且,不是所有的SSH客户端都能够长时间正确的执行,例如,SecureCRT的多个版本都有内存泄漏问题。

  为了解决这个问题,我用下面的命令来完成更新:

  make world kernel KERNCONF=内核配置文件名 clean > /var/log/world,out && reboot &

  这个命令能够记录更新的全过程,假如在什么地方编译失败,你可以很快地找到原因。对于多数人来说,由于后面的&&,只需要察看uptime就能知道便以是否成功。

  需要说明的是,FreeBSD的make world并不总能成功。有时需要修改一些环境变量才能成功完成make。为了保证make成功,在/usr/src中执行任何make操作之前,建议你看一眼UPDATING中是否有非凡的要求(这种要求并不是在FreeBSD Release的时候才会出现,很多时候他会在某个CURRENT中引入,然后随着MFC进入-STABLE分支),并且,在进行大的版本升级之前(跨RELEASE,甚至主版本号),首先执行下面的命令

  mergemaster -p

  并在make world之后执行

  mergemaster -i

  运行mergemaster脚本需要一定的Unix配置知识,不过,由于配置文件中包含很多帮助信息,因此,只要master.passwd、group这样的文件不出大问题(假如cvsup更新了master.passwd,那么就需要留神,因为master.passwd标准配置是root口令为空,这时需要用m来合并,而不是使用i安装),mergemaster并不会引入什么新的问题。

  前一条命令是更新make的配置(/etc/defaults/make.conf和/etc/make.conf)。对于多数人来说,除非进行跨版本升级,否则一般情况下是不需要这样做的。后一条命令是同步全部配置,并安装以前不存在的配置文件,而不进行提示。

  笔者曾经碰到过FreeBSD因为系统日期不正确而无法make的情况,因此,再次非凡提醒大家,假如你的系统日期不正确,最好是用date命令修改一下,或者干脆用ntpdate或ntpd来同步时间。关于如何使用ntp,将在以后说明。

  以后我们将讲解FreeBSD内核的配置,以及如何配置make.conf来优化FreeBSD的编译结果。

标签: