使用FreeBSD的几大理由
2014-09-12 14:19:03 阿炯

FreeBSD是一种类UNIX操作系统,但不是真正意义上的UNIX操作系统,它是由经过BSD、386BSD和4.4BSD发展而来的Unix的一个重要分支。其源于 BSD ──美国加州大学伯克利分校开发 UNIX 版本它由来自世界各地的志愿者开发和维护,FreeBSD 为不同架构的计算机系统提供了不同程度的支持,本文总结了一些使用它的理由。我们先从'问'题开始。

FreeBSD 八大问

众所周知,FreeBSD 是一种自由类 Unix 操作系统。作为自由操作系统中的巨人,它有着怎样不为人知的发展历史?取得了哪些众所周知的技术成就?又有着哪些有口皆碑的重要性能呢?Marshall Kirk McKusick 博士作为 Unix 和 BSD 开发的重要人物之一,致力于 Unix 和 BSD 发展工作已有 30 年。1979 年 Marshall 博士发表了第一篇关于 Berkeley Pascal 的研究论文,并于 80 年代投入 BSD 快速文件系统(BSD Fast File System)的开发工作。不仅见证了 FreeBSD 这一路发展所取得的创新型技术成果,也亲身经历了 Unix 发展四十年来的风雨历程

1:FreeBSD 开源社区的成立和运行

其起源最早可以追溯到贝尔实验室的第一版 UNIX BSD。自 FreeBSD 4.4BSD-Lite 发布以来的发展历程如何?经过怎样的演进和扩展?又是如何形成自己的组织结构以支持全球开发者人员的使用的?

2:BSD 发展史话

BSD 社区于 20 世纪 70 年代末在加州大学伯克利分校成立,20 世纪 80 年代发布了首个公众版。那么,在此之前都经历了怎样的成功与失败?其中有哪些闻所未闻的奇闻异事?又经历了哪些曲折才发布 BSD 开源版呢?

3:BSD 快速文件系统(BSD Fast File System)

从 1979 年至今文件系统( BSD 快速文件系统(BSD Fast File System))的分类学及存储系统的发展如何?如何完成早期性能工作以优化旋转布局?如何使用诸如日志记录和软件更新的技术以优化小型文件性能?经过怎样的重新设计才得以应对日益增长的磁盘容量?又是如何增加对称多进程支持,以利用普遍存在于多核处理器中的 CPU 的呢?

4:FreeBSD 内核安全概述

其安全模式经过了 30 多年的优化发展,以满足不断变化的消费者需求。许多重大的改进都是由安全研究社区贡献。底层模型及其实现方式如何?

5:FreeBSD 中大尺寸内存页(Superpages)

大部分通用 CPU 都提供了对大尺寸内存页的支持,即 Superpages。它能使旁路转换缓冲(TLB)当中的每个条目得以将一大块物理内存区域映射到一个虚拟地址空间。这大大增加了 TLB 覆盖面,降低了 TLB 失误,并改进了许多应用性能。然而支持 Superpages 对操作系统来说,在其分配和权衡,碎片控制方面面临怎样的挑战?Superpages 的工作原理和主要作用是什么,它们如何在 FreeBSD 中获得支持?

6:FreeBSD 内核锁机制概述

其内核使用 7 种不同类型的锁来确保对管理资源的正确访问。不同锁的层次结构,从低级简单结构到高级全功能性结构有何不同?不同类型锁如何解决问题,FreeBSD 检测系统如何对不同类型的锁进行检测,又是如何避免和解决死锁情况?

7:如何实现 ZFS

关于如何使用 ZFS 的文档很多,但关于如何实现 ZFS 的文档却很少。如何综合 ZFS 相关博客、论文的内容以及 ZFS 的相关代码了解其设计和实现原理?

8:日志软更新(Journaled Soft-Updates)

软更新能在系统崩溃的时候用来保护 Unix 文件系统(一种通用于 BSD 的文件系统)的一致性,并能处理大多数情况下的不一致问题,日志记录只需跟踪处理软更新无法解决的不一致问题。那么,如何将``journaling lite'' 添加到软更新(Soft-Updates)中,并将其并入 FreeBSD 快速文件系统的工作呢?


第一个理由:其源码可以很自由地取得

FreeBSD 的系统源码可以通过各种方式免费的得到。系统源码包括内核源代码和基本系统源代码,如果你在安装系统的时候选择了安装源码,那么它就在 /usr/src 目录底下。如果你经常更新系统源代码,那么经常看看 /usr/src/UPDATING 是个很好的习惯。同理, 如果安装了 Ports 系统,经常看看 /usr/ports/UPDATING 可以了解很多有用的信息。

源代码的作用有很多。如果你是一个系统软件或者应用软件开发者,可以改进源代码为 FreeBSD 作出贡献,或者你参考系统源代码写出很棒的应用软件,又或者你通过阅读源代码掌握了很多知识、取得了经验。如果你是一个普通用户,可以通过从源代码配置编译系统获得更高的系统性能。总之,开放的源代码不仅给用户提供了很多好处,也为 FreeBSD 系统的开发者提供了一个可能性,就是不同的人都可以通过源码找出系统中可以改进的地方并及时反馈给系统开发者。

第二个理由:他是一个完整的系统

Linux 这个词指的是内核。当我们提到操作系统的时候,严格的用词应该是 GNU/Linux 或者某个发行版的名字,比如:SUSE Linux,Debian GNU/Linux,CentOS, Fedora, Ubuntu Linux,Mandriva Linux 等。这些发行版使用的都是相同的 Linux 内核,可能只是内核的版本有差异而已。各个发行版的系统结构可能都是不同的:比如系统启动的脚本,文件系统的布局,系统和软件升级的方式方法,默认桌面环境等。

而 FreeBSD 这个词指的是一个完整的系统,包括内核,系统环境,应用软件,各种文档等。 不严格地说,Ubuntu 和 RedHat 之间的关系就有点像 FreeBSD 和 NetBSD,OpenBSD。但后面这些 BSD 系统都是从 4.4BSD 发展来的,而 4.4BSD 本身就是一个完整的操作系统,不是一个孤单的内核(FreeBSD被认为是自由操作系统中的不知名的巨人。它不是Unix,但如Unix一样运行,兼容POSIX。作为一个操作系统,FreeBSD被认为相当稳建可靠)。

FreeBSD 有一个 Core Team 来管理这个项目。这些核心成员是从为数众多的 Committer 中选举出来。这些 Committer 有权力对 FreeBSD 的内核代码进行维护,改进,升级等。 Core Team 和 Committer 对 FreeBSD 的内核代码质量有严格的把关。FreeBSD 的人经常说:有问题的代码不能在这里生存。而 Linux 的内核掌握在 Linus Torvalds 手里,所有有能力的人都可以对 Linux 内核作贡献。也就是 Eric S. Raymond 所说的市集开发模式。从管理模式来说,Linux 内核的代码质量相对要低一些。因此,如果是求稳定的话,FreeBSD 肯定是不二的选择。

FreeBSD 的应用软件要通过 Ports 系统来安装管理。所有的软件都经过特殊的设置来配合操作系统。这些特殊的配置包括编译的参数,安装的路径,文档的存放等。这样可以方便的管理,安装,卸载应用软件,而不需要太多人工的参与。而 Linux 系统的应用软件管理则比较混乱,各种发行版都不相同。不过越来越多的 Linux 发行版都在向 Ports 系统学习。典型的比如 Debian/GNU Linux 的 APT。FreeBSD 的 Ports 系统更新是相当快的。随着系统的每次升级,Ports 系统都会有活跃的更新,以便使各种应用软件跟上系统的升级。

第三个理由:有清晰的目录结构

Linux 下目录结构有一个为人诟病的大缺点,就是文件存放的随意性。各种发行版可能都有不同的选择。比如系统库,就有可能在 /usr/lib,或者 /lib 里面。比如 X (XFree86 或者 Xorg) 应用软件有可能放到 /usr/lib 里面。当一个 Linux 用户想要从源码编译安装软件的时候,往往没有明确的标准来确定自己编译的软件到底应该安装在什么地方。他有可能会作很多 symbolic link 把文件链接来链接去,系统里面经常留下很多失效的链接。而 FreeBSD 的目录结构是相当清晰的,可以看看一些目录作用的解释:

/bin/      user utilities fundamental to both single-user and multi-user environments

/boot/     programs and configuration files used during operating system bootstrap

 defaults/  default bootstrapping configuration files; see loader.conf(5)
 kernel/    pure kernel executable (the operating system loaded into memory at boot time).
 modules/   third-party loadable kernel modules; see kldstat(8)

/etc/      system configuration files and scripts

 defaults/  default system configuration files; see rc(8)
 mail/      Sendmail control files
 mtree/     mtree configuration files; see mtree(8)
 namedb/    named configuration files; see named(8)
 pam.d/     configuration files for the Pluggable Authentication Modules (PAM) library; see pam(8)
 periodic/  scripts that are run daily, weekly, and monthly,via cron(8); see periodic(8)
 ppp/       ppp configuration files; see ppp(8)
 ssl/       OpenSSL configuration files

/usr/    contains the majority of user utilities and applications

compat/   files needed to support binary compatibility with other operating systems, such as Linux (created by sysinstall(8))
 include/  standard C include files
 lib/      shared and archive ar(1)-type libraries
  aout/       a.out archive libraries
  compat/     shared libraries for compatibility
  aout/       a.out backward compatibility libraries
 local/    local executables, libraries, etc.  Also used as the default destination for the FreeBSD ports framework.

以上是 FreeBSD 系统下命令 'man hier' 的输出的节选。基本上每个目录都有特定的作用,什么东西放到哪里都有明确的规定。系统管理员在管理系统的时候将从清晰的目录结构中得到很多益处。BSD 学院派风格的严谨作风在这里体现得非常明显!

第四个理由:可以方便的安装升级

Linux 各种发行版的用户肯定都有在网上到处寻找 rpm 的经历。而且很多用户都不敢贸然升级自己的内核。如果要升级整个基本系统,对于很多 Linux 用户来说就是一个浩大而繁杂的工程了。对于 FreeBSD 来说,升级只是一件很简单的事情。

从升级基本系统来说,FreeBSD 可以使用各种方式来升级。比如 Anonymous CVS、CVSup 等。或者也可以二进制升级。比如要升级我的系统,可能只需要如下的几个命令就可以轻松的完成:
#cvsup stable-supfile
#cd /usr/src
#make buildworld
#make buildkernel
#make installkernel
#reboot
... ...
#mergemaster -p
#cd /usr/src
#make installworld
#mergemaster
#reboot

这些命令做了四件事情:第一是更新你的系统源码、第二是重新编译系统源码,第三是编译 安装新内核、第四是更新你的系统配置文件。这篇 The Cutting Edge 详细的解说了怎么更新你的系统。当然在此省略了内核的配置以及 mergemaster 这个命令的使用方法等。可能显得有点复杂吧,不过与 Linux 相比,我觉得还是很简单容易上手的。

要安装升级应用软件,在 FreeBSD 下就更加简单了。如果在安装系统的时候选择了安装 Ports 系统,那么只需要到 Ports 下相应的目录输入几个命令就可以轻松完成。比如要安装 Nvidia 的官方显卡驱动,那么只需要:
#cd /usr/ports/x11/nvidia-driver
#make install clean

就可以自动完成驱动的安装和配置。当然还有更加快捷的安装方法,使用命令 pkg_add -r nvidia-driver 可以从网上自动下载已经编译好的驱动然后自动安装。FreeBSD 的官方文档 Using the Packages System 详细解说了 packages 的使用方法。如果是升级已经安装的驱动程序,则可以:
#cd /usr/ports/x11/nvidia-driver
#make deinstall reinstall clean

或者使用 portupgrade 来升级已经安装的程序。

第五个理由:文档十分齐全

到目前为止,Linux 的文档在很多方面还比不上 FreeBSD 的文档。Linux 因为发行版的原因,各种文档都纷繁复杂,难于寻找。而 FreeBSD 的文档几乎涵盖了系统的各个方面。对于初学者来说,仔细阅读文档应该是必修的功课。国内的 FreeBSD 用户甚至翻译了一个中文版本,这对阅读英文有困难的中国用户来说是一个福音。

FreeBSD 的文档不仅包含最重要的 Handbook 和 FAQ,还有专门给软件开发人员的 Developer's Handbook 和 Porter's Handbook。而且这些文档还只是所有 FreeBSD 文档的一个部分。Unix 系统的传统 man 文档, GNU 的 Texinfo 文档等在 FreeBSD 中都很完整而详细。另外,FreeBSD 还有很多系统配置的例子 (一般这些例子都在 /usr/share/examples 和 /usr/local/share/examples 目录下)。这些例子对新手系统管理员和普通用户是很好的帮助。

第六个理由:很稳定而且性能优异

Linux 很稳定而且性能也很优异。在性能方面甚至要超过 FreeBSD ,比如文件系统的性能。在 FreeBSD 的文件系统默认使用 softupdates 之前,其磁盘性能一直是低于 Linux 的。虽然如此,Linux 的磁盘高性能是以牺牲系统的稳定为代价的。在没有使用日志文件系统之前,Linux 的文件系统使用会使用 async 模式将数据写入磁盘。而 FreeBSD 默认是使用 sync 模 式将数据写入磁盘。什么是 async 模式和 sync 模式?简单地讲,async 模式下系统往往把不太重要的数据写入内存或者磁盘缓冲,等一段时间之后再把数据真正的写入磁盘。这样做的好处就是磁盘的读写效率比较高,但是不安全。万一在数据真正写入磁盘之前系统突然掉电,那么那些你以为已经真正写入磁盘的数据就会丢失。sync 模式是把所有应该写入磁盘的数据都立即写入磁盘,这样的好处是数据比较安全,但是因为大量的读写操作导致磁盘性能下降。FreeBSD 在版本 4 之前一直使用 sync 模式来写入数据,安全是比较安全了,但是在文件系统性能方面就比不上 Linux 了。

Linux 开始使用日志文件系统之后,文件系统的稳定和安全通过日志系统得到了弥补。而 FreeBSD 没有采用日志文件系统,而是走了另一条道路,也就是 softupdates。其原理就是强制 metadata 更新时的依赖检查,所谓 metadata 就是,比如磁盘的 i-node 和 v-node 之类的数据。这些数据描述了文件数据在磁盘上存储状态,不是一般的数据,所以叫元数据。有了 softupdates 之后,FreeBSD 的磁盘性能有了很大的提高,而且在稳定性方面更加出色。其从第5版开始支持后台 fsck,就是后台文件系统检测。后台文件系统检测可以让你在系统崩溃后重新开机时迅速恢复服务,而不需要像其他不支持这个特性的系统那样,要等待 fsck 执行完毕之后才能进入到系统。对于有海量硬盘的系统,这是一个非常吸引人的特性。

另外在网络方面,FreeBSD 的性能也是相当优异的。在很重的负载之下,FreeBSD 仍然可以稳定的运行,这也是很多网络服务器采用 FreeBSD 的原因之一。

网飞(Netflix)的Open Connect中有对其本身及其后面所使用的FreeBSD有介绍,值得一读。


高光时刻,新硬件+新系统:FreeBSD 12.1 跑分测试:在 AMD Ryzen 线程撕裂者(threadripper) 3970X 上快得让人心动

引用2019年12月初phoronix的消息,要是你对FreeBSD运行在AMD Ryzen线程撕裂者3960X/3970X + TRX40主板上感兴趣的话,下面的测试体验绝对会让你感到无比舒爽。事实上,对于开箱即用体验而言,或许就已经比目前Linux的启动时MCE(机器检查异常)解决方案好得多,以下就是FreeBSD 12.1在线程撕裂者3970X上的跑分结果,与之对比的是Linux和Windows,都在相同的高性能平台上测试。


这次FreeBSD 12.1运行在32核、64线程的Ryzen线程撕裂者3970X上,使用华硕ROG ZENITH II EXTREME主板,启动、运行都相当流畅,所有核心都正常运作,PCIe 4.0 NVMe SSD硬盘、主板网卡等主板功能一切正常。这套系统插满4条16GB DDR4-3600内存,还有1TB Corsair Force MP600 NVMe SSD和Radeon RX 580显卡。考虑到在这套系统上,Linux甚至出现了无法启动问题,而FreeBSD却能正常运作,真是令人欣喜。


虽然FreeBSD 12.1在TRX40主板(ROG Zenith II Extreme)搭配AMD Ryzen线程撕裂者3970X并没有什么问题,但可惜DragonFlyBSD就没那么走运。无论是DragonFlyBSD 5.6.2稳定版还是其每日开发快照版(2019年11月最后一周的版本)都无法启动。因此这次测试略过DragonFlyBSD,只测试FreeBSD。


这次测试既使用默认自带的LLVM Clang 8.0.1编译器,也使用ports里的GCC 9.2以作比较。测试平台参数如下:
<太多了,请看原文>

所有Linux/BSD/Windows测试都是用Phoronix Test Suite


在线程撕裂者3970X上,FreeBSD的Golang编译性能跟其它Linux发行版基本持平,远好于Windows 10的性能。


虽然Golang编译性能不错,但是垃圾回收速度仍然比其它平台慢得多。





而对于最常用的部分,由于使用了Open JDK 11,FreeBSD 12.1在AMD线程撕裂者的测试表现跟其它Linux发行版相比,没太大差异。



在多线程OpenMP的GraphicsMagick测试里,在FreeBSD 12.1运行图形操控程序的性能还不错。12.1版已经默认附带支持OpenMP的Clang版本,因此默认编译而来的GraphicsMagick运行得相当好,而GCC 9.2就跟Linux平台的表现相似。


FreeBSD 12.1的x264编码测试同样使用GCC和Clang两个版本,都比Linux版本快得多,但比Windows 10慢。


在线程撕裂者3970X上,7-Zip同样是FreeBSD 12.1的其中一个落后项目。比Windows和Linux都落后太多。


在Stockfish测试里,FreeBSD的性能表现排在前列,介于OpenSUSE和CentOS之间。


FreeBSD的xz压缩性能表现良好,远优于7-Zip。


FLAC音频压缩同样使用了GCC和Clang两个编译版本来测试,Clang编译出来的可执行文件优化不太理想。


类似的,GCC版M-Queens在FreeBSD上表现更好。



FreeBSD继续在这套AMD Ryzen线程撕裂者3970X系统上表现出强劲的性能。


FreeBSD的Python的跑分落后于Linux和Windows,在其它硬件系统上我们发现也是这样的。


在FreeBSD上使用Git操作大仓库就跟Linux一样快。


跑分总结,可以看到所有测试都在Windows、Linux和FreeBSD上成功运行,FreeBSD 12.1令人刮目相看,尤其是考虑到AMD并未对FreeBSD作出什么优化的情况下。FreeBSD 12.1的性能就跟受测的Linux发行版差不多。如果把编译器从默认的Clang 8.0.1切换成GCC 9.2,在多数情况下确实会对提升性能有帮助,不过由于Clang 8.0.1有OpenMP的支持,两者的性能差距已经缩小了。总地来说,在线程撕裂者 3970X运行在12.1上竟然没有硬件兼容性问题还真的令人感到惊喜,在这个AMD 32核/64线程的处理器上表现得真是太好了。

在2024年6月由phoronix在threadripper-7980x上发起对比测试《FreeBSD 14.1 vs. DragonFlyBSD 6.4 vs. NetBSD 10 vs. Linux Benchmarks》。

FreeBSD学习参考指南

版本命名规则

A-主要版本编号
B-次要版本编号
C-修正版本编号

TAG-名称标签,如 RELEASE、STABLE、CURRENT

install.iso 安装时用这一片即可!mini.iso 也是可以用来安装,但里面没有一些常用的软件包(Package),所以档案比较小。

硬盘分区表的概念

IDE 硬盘在 FreeBSD 中的代号分别是 ad0、ad1,在 BSD 可将主要扇区分割成许多逻辑扇区 logical slice,a 在传统上是指根目录,b 是指 swap 虚拟内存,c 指整个主要扇区,d 指整个硬盘,efgh 可以任意使用!

改变 inode 的设定

按 N 并输入参数 newfs -i 1024 -b 4096 -f 1024

选安装套件,除了最后二项 local 和 XFree86 外,全部都选。

在 Configuration Menu 所做的设定都会存放在 /etc/rc.conf 中,可以修改这个档案!

安装完 FreeBSD 要安装的软件 vim-lite less gnuls pkg_tree elm+ME bash2 unzip nmap wget ncftp3 pstree

系统目录结构

/etc/defaults     放置预设的系统设定文件。
/etc/mtree     目录权限的设定文件。
/etc/periodic     每天、每周、每月定时要执行的设定。
/usr/ports     FreeBSD 移植软件的原始程序目录,我们可以从这个目录中找到自己想要的软件来快速安装。
/usr/src     放置 BSD 或其它软件原始程序代码的目录。
/var/account     使用者执行过的指令记录文件。
/var/db     重要的系统数据库。
/var/quotas     档案系统使用容量限制的记录。

修改、编译核心

/usr/src/sys/i386/conf 中有二个档案,一个是 GENERIC ,是安装时用的一般核心,一个是 LINT 则是完整的核心及说明。

编译新的核心

options QUOTA

pseudo-device snp 可以监看使用者

#NAT

一、options IPFIREWALL

#支援 NAT

二、options IPDIVERT

#下面这一行是预设允许所有的封包通过,如果没有这一行,就必须在 /etc/rc.firewall 中设定封包的规则

三、options IPFIREWALL_DEFAULT_TO_ACCEPT

#下面一行是让您可以在 ipfw 中设定要记录哪些封包,如果没有这一行,这算设定了要留下记录也不会有作用

四、options IPFIREWALL_VERBOSE

#防火墙

除了 NAT 的1、3、4外

#这一行是限制每一条规则所要记录的封包数量,因为同样的规则可能有许多的记录,加上这一条可以使同样的记录重复数减少,以避免记录文件爆。

options IPFIREWALL_VERBOSE_LIMIT=10

#下面这一行是用来支持封包转向,当您要使用 fwd 动作时必须要有这一项设定

options IPFIREWALL_FORWARD

#如果要使用 pipe 来限制频宽,必须加入下列选项以支持 dummynet

options DUMMYNET

编译核心第一种方法

config GENERIC
cd ../../compile/GENERIC/
make depend;make;make install

第二种方法

在 FreeBSD 4.2-STABLE 之后可以用的新的方法
cd /usr/src
make buildkernel KERNCONF=GENERIC
make installkernel KERNCONF=GENERIC
cd /;rm -rf /usr/src/sys/compile/GENERIC
sync;sync;sync;reboot

新的核心有问题时

当编译完核心重新开机,无法进入 FreeBSD 时,要在开机时看到倒数计时的时候,按 Enter 以外的键,会出现 boot:,这时候就打 unload 来将已加载的数据移除,再打/kernel.old 以使用旧的核心。万一连旧的核心也不能开机,就要使用安装时的核心,/kernel.GENERIC,如果您想删掉坏的核心,由于 kernel 文件有特殊的档案属性,必须先下指令修改属性才能删除。

chflags noschg /kernel

建立友好的使用者接口

编辑 /etc/csh.cshrc 或 /.cshrc 使用 tcsh 或 csh shell 时

加入 alias ls gnuls --color -F

如果想要新增使用时都能加入,则要修改 /usr/share/skel/dot.cshrc

想改 PATH 及一些设定也是在 /usr/share/skel 下的一些档案修改

常见的环境变量

EDITOR:设定文书编辑器
PAGER:设定分页程序 more 或 less

支持中文的环境,只支持 tcsh csh
编辑 /etc/csh.login
setenv ENABLE_STARTUP_LOCALE zh_TW.Big5

# 使用远程登入时才能打出中文
setenv LC_CTYPE is_IS.ISO_8859-1

# Console 下用才能打出中文
setenv LANG zh_TW.Big5

如果是 bash 要改用
export ENABLE_STARTUP_LOCALE='zh_TW.Big5'
export LC_CTYPE='is_IS.ISO_8859-1'
export LANG='zh_TW.Big5'

取消登入后,会自动展示也一段文字:修改 /etc/motd(Message Of The Day)

如果不希望 motd 内容出现 FreeBSD 的版本信息,可以在 /etc/rc.conf 中加入
update_motd="YES"

账号管理

adduser 新增使用者
pw groupadd newgroup 新增一个群组
pw groupshow newgroup 显示成果
vipw

FreeBSD 使用 shadow passowrd 的方式来保护密码文件,只有 root 才可以读取编码过的密码文件 /etc/master.passwd,但是这并不是系统用来验证的档案,为了加快速度,FreeBSD 将该文件做成数据库 /etc/spwd.db 及 /etc/pw.db,因此修改完 master.passwd 后要下指令 pwd_mkdb 来将 master.passwd 做成数据库,但使用 vipw 就会自动完成这项工作!

rmuser 删除使用者

磁盘配额

一、在核心设定中加入 options QUOTA 这一行,并重新编译核心。

二、在 /etc/rc.conf 加入 enable_quotas="YES"

三、在 /etc/fstab 中加入要启动磁盘限制的分割区中加入参数 userquota

Options 下 rw 的后面加入 rw,userquota

好了之后重新开机,再下 edquota -u username 来限制

在 4.5-RELEASE 中,开机内定会检查所有使用者的 quota ,如果不要检查,就在 /etc/rc.conf 中加入 check_quotas="NO"。

网络相关指令

ftp -a 以匿名者自动登入

sockstat 查看主机 internet 或 domain socket。可以用来查询有谁连到您的机器中,由哪一个网络服务接收,该网络服务的 PID 是多少,还可以查询本机开放了哪些 Port ,提供了哪些服务。

/etc 下的档案介绍

csh.cshrc 这是 csh tcsh 用的内定 .cshrc 档案,也就是进入该 Shell 时会加载的设定。

defaults/make.conf 通常会复制一份到 /etc 下,用 port 安装软件时,会参考这个档案,把里面的 FTP 站台改成距离国内比较近的。

login.access 用来设定登入系统使用者的权限,我们可以在这里设定是否允许使用者从 console 登入、从不同的区域登入的权限等。

login.conf 这个档案用来控制不同账号可以使用的系统资源,它会依照使用者在密码文件中的 login class 来寻找相对的 class 设定,如果没有分类则使用 default 的默认值。修改完该档后,要执行 cap_mkdb /etc/login.conf 重建系统数据库。

newsyslog.conf 用来定期检查 /var/log/ 的档案,设定当 log 到一定大小或是定期的将旧的档案压缩备份,并删除太老旧的档案。

语法:logfilename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]

logfilename log 文件名称
[owner:group] log 档拥有人:群组
mode 该 log 文件的权限[档案属性]
count 最多计算到多少,例如 cron 是 3 ,表示有 4 个压缩档,从 cron.0.gz 到 cron.3.gz
size 档案最大到多少即压缩备份,以 KB 计。
when 什么时候做备份,请 man newsyslog 来看详细说明。以 @ 为首代表用 ISO 8601 结构的时间格式。以 $ 为首代表使用每天、每周、每月。

$D0 每天半夜十二点

$D23 每天 23:00 时

$W0D23 每周日 23:00

$W5D16 每周五 16:00

$MLD0 每月最一天半夜十二点

$M5D6 每月第五天 6:00

[ZB] Z 表示要将该档以 gzip 压缩,B 代表该档是 binary 档。
[/pid_file] pid 文件的绝对路径
[sig_num] 要送给该 daemon 程的 signal number


软件安装

一、packages 安装

pkg_add -v filename.tgz 扩展名是 tgz
所有安装过的软件都会出现在 /var/db/pkg 的目录中。

pkg_delete filename 删除软件

pkg_info filename.tgz 查看这个软件的信息。

pkg_info 查看系统中所有已安装软件的信息。

pkg_tree 可以让我了解每一套软件之间的关系,不过要先安装!

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

pkg_tree | more 来查看各软件之间的关系。

用 packages 安装的软件,不能马上执行,要马上能执行要先执行 rehash 或注销后再重新登入即可执行。

二、ports

把在 A 系统上面可以正常运作的程序,修正成 B 系统上也能正常执行的工作,称为 Port。抓 port.tar.gz 档案回来,放在 /usr 下解压缩。

要安装哪一种软件就切换到它分类的目录中,如要安装 proftpd ,目录就在 /usr/ports/ftp/profptd 中,执行 make install 即可,它除了安装 proftpd 外,还会把缺的档案也一起抓回来安装,安装完后可执行 make clean 把安装编译过程中产生的一个档案清除。

寻找需要安装的 Port

在 /usr/ports 使用 make search key="ncftp" | less

反安装软件,只要在该软件的目录中执行 make deinstall 即可。

一些不常用的 make 方式
make fetch 抓回所需的原始档
make fetch-list 显示安装所需的档案
make all install 抓回原始档、编译且安装
make reinstall 若先前发生意外中断,重新尝试安装。

如果安装完新的软件之后,如果使用的 Shell 是 csh 或 tcsh ,我们可能必须执行 rehash 来重建 hash table ,才能执行安装好的软件。


安装 Mysql、PHP、Apache

一、安装 Mysql 用 Source Code 安装

在 /etc/group 加入 mysql:*:100:

执行 vipw 加入一行
mysql:*:100:100::0:0:Mysql User:/usr/local/mysql:/sbin/nologin
tar -xvzf mysql-3.23.52.tar.gz
cd mysql-3.23.52
./configure --prefix=/usr/local/mysql --with-charset=big5 --with-low-memory --with-named-thread-libs=-lc_r
make;make install
script/mysql_install_db
chown -R mysql:msqyl /usr/local/mysql
cd /usr/local/mysql/share/mysql
./mysql.server.start
/usr/local/mysql/bin/mysqladmin -u root -password 'xxxx';
grant all privileges on dbname.* to username@localhost IDENTIFIED BY 'password';
grant all privileges on *.* to username@localhost IDENTIFIED BY 'password';
flush privileges;

在 /etc/rc.local 加入一行
/usr/local/mysql/share/mysql/mysql.server start

备分数据库
/usr/local/mysql/bin/mysqldump -u root -p dbname > dbname.sql    备份
/usr/local/mysql/bin/mysql -u root -p dbname < dbname.sql 还原 之前可能要先把数据库建好

更改使用者密码
/usr/local/mysql/bin/mysqladmin -u root -p password newpassword

二、安装 PHP、Apache

apache_1.3.27.tar.gz
mod_fastcgi_2.2.12.tar.gz
php-4.2.3.tar.gz
gd-1.84.tar.gz
zlib-1.1.4.tar.gz
t1lib-1.3.1.tgz
freetype2-2.0.6.tgz
jpeg-6b_1.tgz
png-1.2.1.tgz

先解压缩 apache 并做一次 Apache 的组态

tar -xvzf apache-1.3.27.tar.gz
./configure --prefix=/usr/local/apache
cd ..
安装 PHP 之前先安装 GD 及其所需档案
tar -xvzf zlib-1.1.4.tar.gz
cd zlib-1.1.4
make all install

cd ..
pkg_add -v jpeg-6b_1.tgz
pkg_add -v png-1.2.1.tgz
pkg_add -v t1lib-1,3,1,tgz
pkg_add -v freetype2-2.0.6.tgz
tar -xvzf gd-1.8.4.tar.gz
cd gd-1.8.4
make install
cd ..

安装 PHP
tar -xvzf php-4.2.3.tar.gz
cd php-4.2.3
./configure --with-mysql=/usr/local/mysql --with-apache=../apache-1.3.27 --enable-track-vars --with-gd=/usr/local --enable-gd-native-ttf --with-t1lib --with-jpeg-dir=/usr/local --with-png-dir --with-freetype-dir --with-zlib-dir
make;make install
cp php.ini-dist /usr/local/lib/php.ini
cd ..

安装 Apache
cd apache_1.3.27/src/modules
tar -xvzf ../../../mod_fastcgi-2.2.12.tar.gz
mv mod_fastcgi-2.2.12 fastcgi
cd ../../
./configure --prefix=/usr/local/apache --enable-shared=max --activate-module=src/modules/php4/libphp4.a --activate-module=src/modules/fastcgi/libfastcgi.a --enable-suexec --suexec-caller=nobody --suexec-docroot=/usr/local/apache/htdocs --suexec-userdir=www --suexec-logfile=/usr/local/apache/logs/suexec_log --suexec-uidmin=10 --suexec-gidmin=10
make;make install

加入对 PHP4 的支持
在 /usr/local/apache/conf/httpd.conf 加入二行
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps

让 Apache 在开机时能够启动
在 /etc/rc.local 加入 /usr/local/apache/bin/apachectl start
在 /etc/newsyslog.conf 加入二行以压缩备份 Apache Log 档
/var/log/apache_access_log    644    7    *    $W0D1    Z
/var/log/apache_error_log    644    7    *    $W0D2    Z

安装 ProFtpd

Make sure you have the following lines in your PAM configuration file
so that ProFTPd's PAM module can authenticate users correctly.

ftpd auth    required    pam_unix.so         try_first_pass
ftpd account required    pam_unix.so         try_first_pass
ftpd session required    pam_permit.so


安装 NAT

修改 /etc/rc.conf

一块网络卡 ifconfig_rl0_alias0="inet 192.168.1.1  netmask 255.255.255.0"
二块网络卡 ifconfig_rl1="inet 192.168.1.1  netmask 255.255.255.0"

加入下列五行
gateway_enable="YES"
firewall_enable="YES"
firewall_type="OPEN"
natd_interface="rl0"
natd_enable="YES"

常用指令集

cp -p 档案拷贝过去还是维持原来的权限

避免 /bin 及 /sbin 等重要执行档遭到修改,可以为这些档案设定禁止修改的 schg flag
chflags schg /bin/*
chflags schg /sbin/*

设定了 schg ,还要将 Kernel Security Level 调高到 1 以上,这样连 root 都不可以移除 flags 。

Kernel Security Level

FreeBSD 中有所谓的 Security Level,它掌控了系统核心的行为运作。只有 root 可以使用指令提高 Security Level ,但不能降低它。如果要降低它,必须在 rc.conf 中设定,并重新开机(在OpenBSD中也可以看到此部分内容)。

Security Level 代表的意义:
-1:永远不安全模式。这是默认值。如果为 -1 ,它将永远以 Level 0 的模式执行。

0 :不安全模式。使用者或 root 可以使用 chflags 来移除「不可更动」及「只能附加」的 flags。所有的装置只能依其权限来存取。

1:安全模式。不可以移除「不可更动」及「只能附加」的 flags 。不可以手动加载或移除 LKM ,使用 /dev/mem /dev/kmem 只能只读,且不能 newfs 已挂上的档案系统。

2:高度安全模式。除了和安全模式同样的限制外,不管硬盘是否挂上,都不可以 newfs。另外,Kernel Time 的改变限制在一秒内,如果超过,会记录 "Time adjust-ment clamped to +1 second".

3:网络安全模式。除了和安全模式同样的限制外,还有 IP 封包过滤的规则,而且不可以调整 dummynet 的设定。

可以利用 sysctl 来显示或设定 Security Level

sysctl kern.securelevel

将 Security Level 设为 1
sysctl -w kernel.securelevel=1

当将 Security Level 设为 1 以上时会发现没有办法安装新的 Kernel,因为不能移除 schg flag ,也没有办法使用 big5con、X Window 等软件。如果 FreeBSD 只作 Server,就可以把 Security Level 的值调高一点。

在开机时设定 Security Level,可以在 /etc/rc.conf 中加入以下二行设定
#是否启动 Security Level
kern_securelevel_enable="YES"

# Level 从 -1 到 3
kern_securelevel="1"

只能用 root 使用指令提高 Security Level,但不能降低,如果要降低,必须在 /etc/rc.conf 中设定,重新开机才会生效。

限制使用者邮件容量就是将使用者的邮件从 /var/mail 中搬移到使用者的目录中,再对使用者目录做磁盘配额的限制。

cd /var/mail
mkdir /home/username/mail
mv /var/mail/username /home/username/mail
ln -s /home/username/mail username

限制 crontab 和 at 的使用
在 /var/cron 目录中编辑 allow 的文件,其中的人才可以使用 cron 功能,deny 的文件中的人不可以使用 cron。

at 也是一样的设定。

停止 Sendmail 在 /etc/rc.conf 中加入 sendmail_enable="NO"

使用 sysctl 来设定当外部机器要使用我们没有提供的服务时运记录下来,例如有人尝试扫我们的 Port,或者没有开放 telnet,在 /var/log/message 中便会记录下来。
#sysctl -w net.inet.tcp.log_in_vain=1
#sysctl -w net.inet.udp.log_in_vain=1

这二行加入 /etc/rc.local 中 或是在 /etc/sysctl.conf 加入下面二行
net.inet.tcp.log_in_vain=1
net.inet.udp.log_in_vain=1

在 /etc/rc.conf 加入一行停止 inted 服务
inetd_enable="NO"

为了防止一些 DoS (Deny of Service) ,建议最好把 ICMP 重导向 ( redirect ) 的封包丢弃,可以在 /etc/rc.conf 中加入以下的设定:
# YES 表示丢弃 ICMP REDIRECT 封包
icmp_drop_redirect="YES"

# YES 表示将丢弃的封包记录下来
icmp_log_redirect="YES

sshd 预设并未将使用者登入的数据记录下来,可以利用修改 /etc/syslog.conf 来记录,找到 seccrity 的项目,将它修改成下面这样:
security.*;auth.info    /var/log/security

如此一来,当使用者利用 ssh 登入时,便会记录在 /var/log/security 中。

列出目前系统提供的服务
netstat -a | grep LISTEN

sysctl -a 可以列出目前 Kernel 状态值的设定

列出空间使用最多的前 5 位
du -s /home/* | sort -m | head -5

FreeBSD 有一种特别的权限控制,称之为「flags」,这些 flags 的设定可以让我们用来保护特殊的档案。可以用 ls -ol 来加以观看。

nodump 档案不可以被 dump,只有档案拥有者和 root 可以设定
sappnd 档案只可以往后附加,不能删除,只有 root 可以设定
schg 档案不可以被更动,连 root 都不能删除,只有 root 可以设定
uappnd 档案只可以往后附加,不能删除,档案拥有者和 root 才可以设定
uchg 档案不可以被更动,档案拥有者和 root 才可以设定


如果我们要解除所设定的 flags,只要在上述的 flag 之前加上 no 即可,例如 nouchg。

用法:chflags flags file

flags 的设定只有在 Kernel Security Level 为 -1 或 0 时才可以被更改。如果 Security Level 为 1 或 2 时就不能更动 flags 了。

FreeBSD 下设定 Samba Server

tar -xvzf samba-2.2.7.tar.gz
cd samba-2.2.7/source
docs 中有许多相当有用的文件,值得一读
./configure
make;make install

启动 Samba
以 Standalone 方式

在 /etc/rc.local 中加入
smbd -D -d1
nmbd -D -d1 -G FreeBSD -n SambaServer

-D 以 Daemon 方式运行
-d1 除错记录型别
-G 显示在 Windows 之网络芳邻中的 Workgroup 名称
-n Samab Server 在 Workgroup 之内计算机名称。

以 Inetd 方式启动
修改 /etc/services ,检查是否有底下二行存在
netbios-ssn    139/tcp
netbios-ns    137/udp

/etc/inetd.conf 是否有以下二行存在
netbios-ssn stream tcp  nowait          root    /usr/local/samba/bin/smbd       smbd
netbios-ns dgram udp    wait            root    /usr/local/samba/bin/nmbd       nmbd

设定档设置在 /usr/local/samba/lib/smb.conf

Samba 的使用者账号与密码文件位于 /usr/local/samba/private 之中,文件名为 smbpasswd,如果这个档案不存在,Samba Server 将无法允许任何人登入。建立 smbpasswd 的方法有三种:

1、直接采用 SWAT 之 PASSWORD 选单,选取 Add New User 来建立。

2、使用 mksmbpasswd.sh 来转换 /etc/passwd 或是账号清单

这种方法直接把 Linux / FreeBSD 的账号密码数据文件转换成 Samba 的档案密码数据文件格式,这方法可以很快地把所有在工作站上有账号的使用者都同时在 Samba Server 使用账号开好。但是您仍旧必须要用 SWAT 的 PASSWORD 选单来更改密码。

mksmbpasswd.sh < /etc/passwd > /usr/local/samba/private/smbpasswd

采用 mksmbpasswd.sh 有一个缺点,就是会把 /etc/passwd 中所有的账号,无论是有效或是无效的都转换,所以建置出来的 smbpasswd 会很复杂。

3、在 Windows NT 中,我们可以设定使用者名称及密码。如果在这里设定为 share,就是只使用密码;而设为 user ,则是要输入使用者名称及密码。如果我们设为 user ,Client 端在浏览网络芳邻时,Windows 会自动输入使用者名称为登入 Windows 时所用的名称,我们必须在 Samba 中加入相对的使用者密码。
For Traditional Chiese User
client code page=950
;coding system=cap
valid chars=0xb9


FreeBSD 下设定 DHCP Server

tar -xvzf dhcp-3.0pl1.tar.gz
cd dhcp-3.0pl1
./configure
make all;make install
执行 /usr/sbin/dhcpd
设定档在 /etc/dhcpd.conf

内容:
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
ddns-update-style ad-hoc;
# option definitions common to all supported networks...
option domain-name "tces.ilc.edu.tw";
option domain-name-servers 140.111.152.3, 140.111.66.1, 140.111.66.10;
# ddns-update-style;
default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;
# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

subnet 140.111.152.0 netmask 255.255.255.0 {
  range 140.111.152.50 140.111.152.100;
  option domain-name-servers 140.111.152.3, 140.111.66.1, 140.111.66.10;
  option domain-name "tces.ilc.edu.tw";
  option routers 140.111.152.254;
  option broadcast-address 140.111.152.255;
  default-lease-time 600;
  max-lease-time 7200;
}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

host passacaglia {
  hardware ethernet 0:0:c0:5d:bd:95;
  filename "vmunix.passacaglia";
  server-name "toccata.fugue.com";
}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag set.

 host www {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address www.freeoa.net;
}

touch /var/db/dhcpd.leases

用 DHCP Server 分配 IP ,但要固定某些机器的 IP,在那台机器上 Ping DHCP Server,在 DHCP Server 执行 arp 查出那一台机器的 Mac Address ,在 /etc/dhcpd.conf 中设定
 host www {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address www.freeoa.net;
}


本文源自:互联网