FreeBSD和Linux如何互相访问文件系统

一、如何mount Linux Ext2文件系统

经常有人在问,强大的FreeBSD为什么不能使用牛B的Linux ext文件系统呢?得到的回答通常是:“能,当然能了”。可是,太多的人习惯了使用mount_xxx来工作,这时会发现mount_只有这样的列表:

mount           mount_mfs       mount_nfs       mount_ntfs      mount_nwfs      mount_smbfs     mount_unionfs
mount_cd9660    mount_msdosfs   mount_nfs4      mount_nullfs    mount_portalfs  mount_udf       mountd

千万不要灰心,强大的FreeBSD还有很多你所不知道的东东,请使用:

mount -t ext2fs

来mount牛B的Linux ext文件系统罢。对了,小小的提示,ext3也可以使用ext2来mount的。

需要注意的是,尽量不要以读写方式挂接 ext2/ext3 文件系统。尽管 FreeBSD 支持在 ext2/3 文件系统中写入数据,但是这种做法是容易导致问题的。如果希望做系统迁移,比较理想的做法是使用 NFS 将数据复制过来。

二、如何在linux中mount ufs2文件系统

FreeBSD的默认文件系统是ufs2。 可以用:

mount -r -t ufs -o ufstype=ufs2 /dev/hda10 /mnt

这样的命令来挂载。

前提:Linux内核中必须启用ufs和bsd disk label支持. 即

CONFIG_BSD_DISKLABEL=y
CONFIG_UFS_FS=y
CONFIG_UFS_FS_WRITE=y

原文链接:http://wiki.freebsdchina.org/faq/filesystem/e/mount_ext2fs
http://wiki.freebsdchina.org/faq/filesystem/e/mount_ufs2_in_linux

FreeBSD下文件和目录操作

FreeBSD下文件和目录操作

一、目录操作

新建目录

如果是当前路径下

mkdir 目录名

如果是在别的已有目录下

mkdir 目标路径/目录名

如果目标路径不存在

mkdir -p 目标路径/目录名

重命名目录/移动目录

本质上,重命名目录和移动目录是一样的,都可以这样实现:

#移动
mv 源目录 目标目录
#重命名
mv 原名 目标名

删除目录

有两个办法:

rmdir 目录名

或者

rm -r 目录名

二、文件操作

新建文件

如果是当前路径下

touch 文件名

如果是在别的已有文件下

touch 目标路径/文件名

如果目标路径不存在,需要先创建目录:

mkdir -p 目标路径

请注意,这时候生成的文件本身为空,请选择工具对文件进行处理

重命名文件/移动文件

本质上,重命名文件和移动文件是一样的,都可以这样实现:

#移动
mv 源文件 目标文件
#重命名
mv 原名 目标名

删除文件

rm 文件名

复制文件

cp 源文件 目标文件

三、更改所有者

针对文件而言,很简单:

# 语法
# chown 用户名 目标文件
# 例子:
chown playername /usr/local/www/data/index.html

如果是目录

# 语法
# chown -R 用户名 目标文件
# 例子:
chown -R playername /usr/local/www/data

如果你想改一个目录的用户组也不难:

# 语法
# chgrp 组名 目标文件
# 例子:
chgrp playername /usr/local/www/data/index.html

如果是目录

# 语法
# chgrp -R 组名 目标文件
# 例子:
chgrp -R playername /usr/local/www/data

如果想用户和组起改,哪么使用chown一次就可以:

# 语法
# chown 用户名:组名 目标文件
# 例子:
chown playername:playername /usr/local/www/data/index.html

如果是目录

# 语法
# chown -R 用户名:组名 目标文件
# 例子:
chown -R playername:playername /usr/local/www/data

四、更改权限

在了解如何更改文件/目录的权限之前,您需要先行了解FreeBSD下文件权限的相关概念,点击这里[URL:http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/permissions.html]。

用于改变文件/目录权限的文件的命令是:

chmod

chmod 有两种风格,数字化(使用0~8)的和字符方式(使用 a,u,g 标识)的,如下: 给所有用户加上读权限:

chmod a+r 目标文件
chmod 444 目标文件

给所有用户加上执行权限

chmod a+x 目标文件
chmod 777 目标文件

让所有用户完全控制

chmod 777 目标文件

更加复杂的文件权限分配请参看man page

需要注意的是: 对于普通用户而言(也就是对root无效),
目录的x权限一旦去除,用户将无法进入目录;
目录的r权限一旦去除,用户将无法列出目录清单

原文链接:http://wiki.freebsdchina.org/faq/file_and_directory/directory_management
http://wiki.freebsdchina.org/faq/file_and_directory/file_management
http://wiki.freebsdchina.org/faq/file_and_directory/change_owner
http://wiki.freebsdchina.org/faq/file_and_directory/change_mode

在远程FreeBSD服务器上运行VirtualBox

VirtualBox可以在远程运行,并把界面通过 ssh 的 X11 转发放到管理员的桌面。

在 FreeBSD 上可以用 port 来安装 VirtualBox:

# portsnap fetch update
# cd /usr/ports/emulators/virtualbox-ose
# make install clean

接着配置 VirtualBox 所需要的内核模块:

echo ‘vboxdrv_load="YES"’ >> /boot/loader.conf
echo ‘vboxnet_enable="YES"’ >> /etc/rc.conf.local

将需要使用VirtualBox的用户添加到vboxusers组:

# pw groupmod vboxusers -m delphij

安装 xauth:

# cd /usr/ports/x11/xauth
# make install clean

重启系统,或手工加载模块之后,就可以从远程 ssh 进来运行 VirtualBox 了:

desktop% ssh -Y vsvc.example.com # 【注1】
vsvc% VirtualBox

VirtualBox的管理界面会出现在客户端系统上(当然,在列出文件时仍然是服务器端的文件)。

在安装、调试之后,就可以用VBoxHeadless来启动远程的虚拟机了。

【注1】这里使用的是"Trusted Forwarding",如果远程主机不可信,这样做会提高安全风险。

原文链接:https://blog.delphij.net/2010/10/freebsdvirtualb.html

FreeBSD的单用户模式

FreeBSD的单用户模式

什么是单用户模式

FreeBSD 在正常运行时处于多用户模式 (multi-user mode)。此时系统资源全部可用,文件系统都被挂载并可读写。系统中各个用户都可登录或执行特定命令,以及等等。而单用户 (single-user mode) 则相反。进入单用户模式后,系统资源不是全部可用,只有根文件系统 (root filesystem) 被挂载,而且只能读不能写。系统只有一个用户,也就是超级用户 root。单用户模式一般是超级用户用来执行系统维护,修复等工作的。

什么时候需要单用户模式

文件系统有不可自动修复的错误时

进入单用户模式,可以运行 fsck (或者 fsck -y),来修复文件系统。

编译安装系统时

我们需要在单用户模式下来 make installworld,以避免在升级系统和配置时造成不必要的错误。

执行其他维护,升级,修复等操作时

单用户模式下如何让根分区可读写

很简单,执行 mount -uw / 就可以了。

单用户模式下如何启动 ZFS

依次执行两个命令就行了。

#/etc/rc.d/hostid start

#/etc/rc.d/zfs start

如何进入单用户模式

当系统启动到菜单时,按下数字键 4,就能进入单用户模式。如果是老版本的 FreeBSD,或禁止了 beastie 菜单,则需要在出现 boot 提示符的时候按下任意键,然后输入 boot -s 才能启动到单用户模式。

原文链接:http://wiki.freebsdchina.org/faq/boot_and_shutdown/single_user_mode

为OpenSSH添加chroot功能

目标

为 OpenSSH 的 sshd 添加将登录用户 chroot 的功能。

原理介绍

OpenSSH 的 sshd 本身没有提供 chroot 的功能,所以必须依靠一些其他的方法来提供 chroot 的功能。而 OpenSSH 所提供的 sshd 拥有使用 Pluggable Authentication Module(简称为 PAM,下同)的能力,因而我们可以利用这个东西来提供这样的功能。正好 FreeBSD 同时提供了一个叫做 pam_chroot(8) 的 PAM 模块,这个模块的作用就是提供 chroot 的功能。于是通过 FreeBSD 已有的代码,我们可以为 OpenSSH 的 sshd 提供 chroot 的功能。

软件需求

FreeBSD 7.0-RELEASE(实际上未必需要这么新,但是其他的版本我没有测试过)。

实现过程

配置 /etc/ssh/sshd_config

设置 UsePAM 为 yes。

配置 /etc/pam.d/sshd

pam_chroot(8) 的简介

PAM 模块可以提供 4 种功能,分别是 authentication、account management、session management 和 password management。而 pam_chroot(8) 本身只提供了 session management 的功能。这个 PAM 模块可以有 4 个参数 also_root,always,cwd,dir,以下逐一解释。

also_root

如果设置了 also_root,那么即使是 root 登录上来,也会被 chroot。

always

always 告诉 pam_chroot(8) 无论如何都要 chroot,如果找不到合适的 root directory,那么 pam_chroot(8) 模块就报告失败。如果不设置这个选项,查找合适的 root directory 失败之后,pam_chroot(8) 模块报告的就是成功。

dir

dir 是默认的 root directory,如果用户的 home directory 在 passwd 中的描述不符合 pam_chroot(8) 的要求,那么用户就会被 dir 就将是用户的 root directory。

cwd

cwd 提供一个默认的 working directory 给 pam_chroot(8),如果用户的 home directory 在 passwd 中的描述不符合 pam_chroot(8) 的要求,那么将会 chdir 到这个目录,该参数默认为 /。

配置合适的参数

由于 pam_chroot(8) 只有 session management 功能,那么 /etc/pam.d/sshd 这个文件的 session 部分的第一行加上

session         requisite       pam_chroot.so      dir=/tmp cwd=/

这一行代码告诉 PAM,如果 pam_chroot(8) 模块失败了,那么 PAM 系统宣告管理失败,那么将会导致用户不能登录,并且用户默认会被丢在 /tmp 里面。

准备必须的文件

chroot 发生在 sshd 内,而后续创建的进程的 root directory 已经是被 chroot 过了的,此时如果在新的 root directory 中没有合适的文件,那么最终 sshd 将无法启动程序(譬如用户的 shell 等)。
按照上面的例子,用户将会被 chroot 到 /tmp,则需要在 /tmp 中安装合适的文件:
cp -pR /bin /tmp/bin
cp -pR /lib /tmp/lib
cp -pR /libexec /tmp/libexec
mkdir /tmp/etc
mkdir -p /tmp/usr/share/misc
cp /usr/share/misc/termcap /tmp/usr/share/misc

这里假设登录的用户使用了系统附带的 shell 之一。

优点与缺点

优点

与单独启 jail 把用户锁在固定的目录相比,这样做可以避免启动很多 jail,也就省下了很多 IP 地址,并且总共只启动了一个 sshd 进程用于监听 22 端口。

缺点

因为 pam_chroot(8) 非常简陋,所以导致了某些事情做出来让人很不爽:

1、必须对几乎所有的用户 chroot

严格的说并不是这样,但是一般情况下是几乎是一旦在 sshd 的 PAM 配置中启用 pam_chroot(8),那么所有用户都会被 chroot 掉。有个很丑的方法可以改善这种状况,就是使用 pam_ftpusers(8)跳过某些用户。但是 pam_ftpusers(8) 的实现也很简陋,它必须使用 /etc/ftpusers 来指定用户名称,于是……

2、pam_chroot(8) 要求登录的用户必须在 passwd 里面有对应的条目

根据 pam_chroot(8) 的代码,如果登录的用户在 passwd 里面不存在对应的条目,那么 pam_chroot(8) 将返回失败,于是登录也将失败……这样就限制了从其他途径通过认证的用户的使用了。

3、为了使用 pam_chroot(8) 可能要修改 passwd 中对用户 home directory 的描述

pam_chroot(8) 要求当用户的 home directory 中间有 ”/./” 这样的字符串时,前面部分会成为用户所属的 sshd 的 root directory,而后面部分会成为用户的 working directory。但是默认情况下有谁会特意设置这样的 home directory 呢?而且根据 pam_chroot(8) 的代码,如果你不这样设置,并且你没有给 pam_chroot(8) 传递 dir 参数,那么 pam_chroot(8) 会一直失败或总是成功。

4、要装一堆文件

这个没办法,只能这样了……谁让 sshd 本身不是个 shell 呢?

原文链接:http://wiki.freebsdchina.org/howto/c/chrootssh

FreeBSD下sudo的使用

FreeBSD下sudo的使用

sudo是OpenBSD的一部分,其作者是 Todd C. Miller。在 FreeBSD 中可以使用 ports 或 package 来安装。

下面来安装并使用sudo吧!!

  1)安装sudo(两种安装方法):
      a: 从 ports 安装(推荐)
         #cd /usr/ports/security/sudo
         #make install clean
      b: 通过 package 安装
         #pkg_add -r sudo

  2)配置sudo
     sudo的配置文件在/usr/local/etc/sudoers里面。sudo的配置文件不应直接编辑,而应使用 visudo 来进行修改。
     配置权限的格式如下:
        USER MACHINE=(EFFECTIVE USER)  [NOPASSWD:] COMMAND
      第一列(USER)指定要授权的帐号。第二列(MACHINE)定义在那些机器上,这条执行生效,其好处是在多台机器上使用同一份配置文件。括号里的(EFFECTIVE USER)是使用指定实际执行该命令的帐号,
      这就方便一个帐号允许用另外一个帐号来执行特定的命令,而不非得是root帐号。第四列(COMMAND)是指定的命令. NOPASSWD是可选项代表USER在sudo到某身份时不必输入该身份的密码即可执行命令。
     下面是配置sudo的简单方法:
        M-gtuiw ALL=(ALL) ALL
     指定了M-gtuiw可以在任何地点以任何身份执行整个系统的全部命令。
       %wheel ALL=(ALL) ALL
     这个命令指定了wheel这个组的用户可以在任何地点以任何身份执行整个系统的全部命令。
        M-gtuiw ALL=(apache) /usr/bin
     指定了M-gtuiw可以在任何地点但只能以apache用户身份且只能执行/usr/bin目录下的命令。
        M-gtuiw ALL= /usr/bin
     等同于M-gtuiw ALL=(root) /usr/bin

  3)设置密码在一段时间后自动退出
     Defaults:M-gtuiw     timestamp_timeout=0, runaspw, passwd_tries=1
     记住: 在 Defaults:M-gtuiw 这个地方不允许有空格出现。下同:     
     这段句子有三个功能:
     1)M-gtuiw需要root的密码才能运行sudo(句子中runaspw的缘故)。
     2)这密码没有被系统记住(因为有timestamp_timeout=0的缘故),用了一次的sudo之后当再次使用时又得输入root密码。
       如果将timastamp_timeout改为-1话,M-gtuiw只须去验证一次密码,之后将记住了M-gtuiw输入的密码,当第二次,第三次
       使用sudo的时候都不用输入root密码了直到退出登录。
       当然,其它的用户也可以这样,但须要不同的帐户和缺省值。在这里我们只改变M-gtuiw和增加一个新的用户“limda”:
          Defaults:M-gtuiw               timestamp_timeout=0
          Defaults:limda                  timestamp_timeout=-1, runaspw
          #user privilege specification
          root          ALL=(ALL) ALL
          M-gtuiw       ALL=(ALL) ALL
          limda         ALL=(ALL) ALL
       M-gtuiw和limda拥有不同的缺省值。“Defaults”影响着每个用户使用sudo不同的权限。

  4)sudo默认使用系统的 /var/log/messages 作为其日志文件;除此之外,也可以采用另外的日志,以便于进行审计。
      Defaults logfile=/var/log/sudolog
      记住,在上面没有 : 啊。

  5) 限制sudo使用危险的命令:
        M-gtuiw ALL=/bin/kill, /usr/sbin/
  这里说明M-gtuiw用户只可以使用/bin/kill这个命令和/usr/sbin/里面的命令。
        M-gtuiw lnserve=(paul, limda) /bin/kill, /usr/sbin/
  说明了M-gtuiw只能在lnserv指定的机算机中以paul和limda的身份使用/bin/kill和/usr/sbin里面的命令。

  6)sudo限制使用某些命令
        M-gtuiw ALL=ALL, !/bin/rm
  这里说明了M-gtuiw可以用除了/bin/rm之外的所有命令,在/bin/rm前面加上 ! 号就是为了限制使用这个命令。
  这是我在sudo的网页里翻译出来的一些简单文本,本人的英文不是很好,翻译的不是很好,欢迎各位前来修正。

  7)sudo时不输入密码直接执行命令
        M-gtuiw ALL=(ALL) NOPASSWD: /usr/local/sbin/VBoxClient,/sbin/mount -t ntfs /dev/hda5 /d-driver
  这里说明M-gtuiw在执行/usr/local/sbin/VBoxClient以及mount hda5时,不必输入root密码就可以root权限执行,
  这里RUNAS为ALL实际上是指M-gtuiw可以sudo成任何身份且不必输入该身份的密码就可以执行后面的命令,当然root身份也不在话下。
  NOPASSWD特别危险切记要让正确的人使用正确的命令。
        M-gtuiw ALL=(ALL) NOPASSWD: ALL
  这里说明M-gtuiw执行所有命令都不必输入密码,这极其危险。慎用。
        M-gtuiw ALL=(ALL) ALL, NOPASSWD: /sbin/mount -t ntfs /dev/hda5 /d-driver
  也可以让M-gtuiw用户可以sudo所有命令,但只针对某些命令不必输入密码。

原文链接:http://wiki.freebsdchina.org/doc/s/sudo_with_sudo

FreeBSD系统配置Java环境

FreeBSD系统配置Java环境

简述

Java最早于1998年引入 FreeBSD。

通常我们使用的 JDK 是来自 Sun 的 JDK。由于授权的原因,目前JDK需要手工下载之后才能安装。

在FreeBSD平台上,最新版本的JRE/JDK为:Diablo JRE/JDK 1.5.0-7。

在FreeBSD中你可以使用多种方式来安装JDK:

使用Linux模拟环境来运行For Linux版本的Sun/IBM JDK(以下简称Linux JDK)
使用freebsdfoundation提供的binaries package来安装JDK(以下简称Binaries JDK)
使用ports来安装JDK(以下简称Ports JDK)

这里你可以自己选择使用哪种方式:

方式 优点 缺点
Linux JDK 可以作为排除问题时的参考 它不是FreeBSD本地代码,需要安装Linux二进制兼容环境如Fedora;有时Linux JDK会有一些bug
Binaries JDK (“DiabloJDK”) 下载就可以安装,不需要编译器,安装速度很快 没有编译的快感,也不能设定编译时的一些参数;有时Diablo JDK也会有一些bug,由于认证需求无法及时更新
Native JDK 版本最新,将来升级会简单,在编译时能有自己定义的能力 需要很久的时间和比较多的磁盘空间,也许你应该考虑在晚上睡觉前开始这个工作

一般而言,由于已经有了 Diablo JDK,现在已经不再推荐在 FreeBSD 上透过 Linux 仿真来使用 Linux JDK 了。

以下就JDK在FreeBSD上的安装方法进行分别的说明,希望你能找到适合你的方法安装一个好用的FreeBSD JDK。

通过 ports 来安装 Diablo JDK

这是一个非常快速的方法,因为除去下载的时间,你只需要两分钟就完成了一个可以使用的JDK环境。如果使用 FreeBSD 6.x,则推荐使用这种方法。

注意:Diablo JDK 在 FreeBSD 7.x 上运行时 可能 会有一些问题,这时,可以用它作为boostrap JDK来编译自己的native JDK。

通常安装 Diablo JDK 时,应使用 ports 来进行安装。这主要是因为几个原因:

有时,需要对 Diablo JDK 进行小幅度的调整,例如更新时区数据等等。如果只是下载 FreeBSD 基金会提供的 package 直接安装,则没有这方面的好处。
ports会帮你搞定 Diablo JDK 所需的全部依赖关系。
ports安装几乎和直接pkg_add一样快。

首先,我们需要同步 ports tree;随后,进入 ports/java/diablo-jdk15,并执行:

make checksum

这时,ports系统会检查当前的 distfiles 目录(通常是 /usr/ports/distfiles)中是否已经有了所需的文件。如果没有的话,ports会提示你到指定的地点下载相关的文件并放到 /usr/ports/distfiles 目录中。

首先你需要知道FreeBSDFoundation的Java下载页面,这里提供了现在可以使用的多个JDK的版本,在每一个版本上我们都可以得到Packages和Tarballs两种形式的版本。使用 ports 方式安装时,应下载 tarball 格式的版本。 package 格式的版本的可执行文件,与tarball格式中的可执行文件是完全一样的。ports会判断你使用的架构名称,并告诉你需要下载的文件名字。但是自FreeBSD 8.0之后,由于授权问题,已经不提供已编译好的二进制版本的针对FreeBSD 8的JRE/JDK下载,若要在FreeBSD 8.0以上版本中使用Java,必须自行编译。

确认无误之后,请再次执行:

make checksum

以便让 ports 系统确认文件的完整性。如果没有问题,我们就可以安装它了:

make install clean

这样,ports系统会自动完成所需的全部操作。

使用Ports来安装Native JDK

我们常说的 Diablo JDK,实际上是 FreeBSD 基金会根据 native JDK 来进行联编,并获得了 Sun 认证的版本。与其他二进制形式的包,如 Linux JDK 类似,作为预编译的版本,尽管其拥有节省时间、便于使用的优点,但是在发生一些小bug时,这些版本未必会及时跟进更新。

与此相反,FreeBSD本身的 native JDK 开发团队也在活跃地维护着一个以源代码编译方式的 port,这个 port 会经常跟进 BSD Java Porting Project 的最新 patchset。由于目前 Sun JDK 编译时要求已经有一个可用的 JDK 版本,因此你需要首先安装一个 JDK,这个 JDK 可以是 native JDK,也可以是 Diablo JDK 或 Linux JDK。接下来,就可以开始编译了。

首先同步 port,然后到 /usr/ports/java/jdk15 中执行 make install clean。在这个过程开始时,ports系统会告诉你去两个地方分别下载 Sun 提供的源代码、源代码 binary、Mozilla 头文件和时区定义更新,以及 EyesBeyond 提供的 BSD Java Patchset。整个过程需要大约2GB的剩余磁盘空间,并需要大量的内存。

制作 package

由于 Sun 授权的限制,我们不能对外直接发布 native JDK 的 package。但是对于企业用户而言,如果有很多机器都需要安装 native JDK,一台一台地编译是一件十分耗时,而且很不环保(浪费电,并促进全球变暖)的事情。想要制作 package,可以在 /etc/make.conf 中加入:

FORCE_PACKAGE=yes

然后就可以使用make package,或 portupgrade -p 来制作 package了。

原文链接:http://wiki.freebsdchina.org/doc/j/java_environment

FreeBSD-SA-10:10.openssl

—–BEGIN PGP SIGNED MESSAGE—–
Hash: SHA1

=============================================================================
FreeBSD-SA-10:10.openssl                                    Security Advisory
The FreeBSD Project

Topic:          OpenSSL multiple vulnerabilities

Category:       contrib
Module:         openssl
Announced:      2010-11-29
Credits:        Georgi Guninski, Rob Hulswit
Affects:        FreeBSD 7.0 and later
Corrected:      2010-11-26 22:50:58 UTC (RELENG_8, 8.1-STABLE)
2010-11-29 20:43:06 UTC (RELENG_8_1, 8.1-RELEASE-p2)
2010-11-29 20:43:06 UTC (RELENG_8_0, 8.0-RELEASE-p6)
2010-11-28 13:45:51 UTC (RELENG_7, 7.3-STABLE)
2010-11-29 20:43:06 UTC (RELENG_7_3, 7.3-RELEASE-p4)
2010-11-29 20:43:06 UTC (RELENG_7_1, 7.1-RELEASE-p16)
CVE Name:       CVE-2010-2939, CVE-2010-3864

For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit <URL:http://security.FreeBSD.org/>.

I.   Background

FreeBSD includes software from the OpenSSL Project.  The OpenSSL Project is
a collaborative effort to develop a robust, commercial-grade, full-featured
Open Source toolkit implementing the Secure Sockets Layer (SSL v2/v3)
and Transport Layer Security (TLS v1) protocols as well as a full-strength
general purpose cryptography library.

II.  Problem Description

A race condition exists in the OpenSSL TLS server extension code
parsing when used in a multi-threaded application, which uses
OpenSSL’s internal caching mechanism.  The race condition can lead to
a buffer overflow. [CVE-2010-3864]

A double free exists in the SSL client ECDH handling code, when
processing specially crafted public keys with invalid prime
numbers. [CVE-2010-2939]

III. Impact

For affected server applications, an attacker may be able to utilize
the buffer overflow to crash the application or potentially run
arbitrary code with the privileges of the application. [CVE-2010-3864].

It may be possible to cause a DoS or potentially execute arbitrary in
the context of the user connection to a malicious SSL server.
[CVE-2010-2939]

IV.  Workaround

No workaround is available, but CVE-2010-3864 only affects FreeBSD 8.0
and later.

It should also be noted that CVE-2010-3864 affects neither the Apache
HTTP server nor Stunnel.

V.   Solution

Perform one of the following:

1) Upgrade your vulnerable system to 7-STABLE or 8-STABLE, or to the
RELENG_8_1, RELENG_8_0, RELENG_7_3, or RELENG_7_1 security branch
dated after the correction date.

2) To update your vulnerable system via a source code patch:

The following patches have been verified to apply to FreeBSD 7.1, 7.3,
8.0 and 8.1 systems.

a) Download the relevant patch from the location below, and verify the
detached PGP signature using your PGP utility.

[FreeBSD 7.x]
# fetch http://security.FreeBSD.org/patches/SA-10:10/openssl7.patch
# fetch http://security.FreeBSD.org/patches/SA-10:10/openssl7.patch.asc

[FreeBSD 8.x]
# fetch http://security.FreeBSD.org/patches/SA-10:10/openssl.patch
# fetch http://security.FreeBSD.org/patches/SA-10:10/openssl.patch.asc

b) Execute the following commands as root:

# cd /usr/src
# patch < /path/to/patch
# cd /usr/src/secure/lib/libssl
# make obj && make depend && make && make install

NOTE: On the amd64 platform, the above procedure will not update the
lib32 (i386 compatibility) libraries.  On amd64 systems where the i386
compatibility libraries are used, the operating system should instead
be recompiled as described in
<URL:http://www.FreeBSD.org/handbook/makeworld.html>

3) To update your vulnerable system via a binary patch:

Systems running 7.1-RELEASE, 7.3-RELEASE, 8.0-RELEASE or 8.1-RELEASE
on the i386 or amd64 platforms can be updated via the
freebsd-update(8) utility:

# freebsd-update fetch
# freebsd-update install

VI.  Correction details

The following list contains the revision numbers of each file that was
corrected in FreeBSD.

CVS:

Branch                                                           Revision
Path
– ————————————————————————-
RELENG_7_3
src/UPDATING                                             1.507.2.34.2.6
src/sys/conf/newvers.sh                                   1.72.2.16.2.8
src/crypto/openssl/ssl/s3_clnt.c                       1.1.1.14.2.1.4.1
RELENG_7_1
src/UPDATING                                            1.507.2.13.2.19
src/sys/conf/newvers.sh                                   1.72.2.9.2.20
src/crypto/openssl/ssl/s3_clnt.c                           1.1.1.14.6.2
RELENG_8_1
src/UPDATING                                             1.632.2.14.2.5
src/sys/conf/newvers.sh                                   1.83.2.10.2.6
src/crypto/openssl/ssl/s3_clnt.c                            1.3.2.1.2.1
src/crypto/openssl/ssl/t1_lib.c                             1.2.2.1.2.1
RELENG_8_0
src/UPDATING                                              1.632.2.7.2.9
src/sys/conf/newvers.sh                                    1.83.2.6.2.9
src/crypto/openssl/ssl/s3_clnt.c                                1.3.4.1
src/crypto/openssl/ssl/t1_lib.c                                 1.2.4.1
– ————————————————————————-

Subversion:

Branch/path                                                      Revision
– ————————————————————————-
stable/7/                                                         r215997
releng/7.3/                                                       r216063
releng/7.1/                                                       r216063
stable/8/                                                         r215912
releng/8.0/                                                       r216063
releng/8.1/                                                       r216063
– ————————————————————————-

VII. References

https://bugzilla.redhat.com/show_bug.cgi?id=649304
http://www.openssl.org/news/secadv_20101116.txt
http://www.mail-archive.com/openssl-dev@openssl.org/msg28043.html
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2939
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-3864

The latest revision of this advisory is available at
http://security.FreeBSD.org/advisories/FreeBSD-SA-10:10.openssl.asc
—–BEGIN PGP SIGNATURE—–
Version: GnuPG v1.4.9

iEYEARECAAYFAkz0FdsACgkQFdaIBMps37JjAgCcC7NSDXR7P4d2y4XFF/Ce9sG1
Bs8An36Pjplsfovx6Im/NCnVgHtVgj5x
=xU/h
—–END PGP SIGNATURE—–

原文链接:http://security.freebsd.org/advisories/FreeBSD-SA-10:10.openssl.asc

FreeBSD系统make.conf文件详解

FreeBSD系统make.conf文件详解

make.conf的主要功能

make.conf是 FreeBSD 中 make(1) 的配置文件。如果不了解改变这些配置可能带来的副作用,则不应修改其中的任何配置。

通过修改 make.conf 可以达到下面这些目的:

优化系统:设定系统的处理器类型、编译参数、优化级别。
配置系统的升级服务器以及升级内容:告诉系统去哪里下载kernel和userland的源代码和ports的代码树、去哪里下载ports编译时使用源代码包。
不过,许多时候可能会希望使用另外一些配置文件来达到类似的目的。由于 make.conf 是全局的 FreeBSD make(1) 配置,对其进行不适当的改动,特别是添加优化选项,非常容易导致各种各样的问题,因此一般情况下不需要修改这个文件。

其他一些与 make.conf 起类似作用,但范围受限的 make(1) 配置文件,包括 src.conf(5) 和 ports.conf,关于如何使用这些文件的具体介绍,请参见本文末尾的“参阅”部分。

make.conf的主要文档

make.conf(5)[URL:http://www.freebsd.org/cgi/man.cgi?query=make.conf&sektion=5&format=html]
src.conf(5)[URL:http://www.freebsd.org/cgi/man.cgi?query=src.conf&sektion=5&format=html]
/usr/share/examples/etc/make.conf

make.conf的基本原理

FreeBSD 的 make(1) 在执行联编操作的时候会引用 /usr/share/mk/sys.mk。如果 make(1) 不是以完全 POSIX 模式运行,则后者会引入 /etc/make.conf (或由 make 变量 MAKE_CONF 所定义的其他文件,例如,如果需要在某一次联编过程中临时禁用 make.conf,可以在 make 时指定 MAKE_CONF=/dev/null)。

希望在联编过程中传递给 make 程序本身,或作为环境传递给编译器等其他程序的参数,可以通过 make.conf 来指定。再次强调, make.conf 是一个全局的配置,在增加配置时,其内容会影响 所有 使用 FreeBSD make(1) 的联编过程。添加任何配置一定要慎重。

下面以 vim 举例。使用 ports 套件默认的编译选项编译出来的vim中的gvim是使用gtk1图形库的,但是我很喜欢gtk2,因为gtk2更加的漂亮。为了使用 gtk2,有两个选择:

1.编译的时候手工把这个选项加进去:cd /usr/ports/editor/vim; make WITH_GTK2=yes install clean,但是这样似乎比较麻烦。
2.使用make.conf:直接把WITH_GTK2=yes这句写到make.conf里面,这样系统在编译vim的时候会把这个选项自动地包含进去。

注意:后一种方法中,直接将 WITH_GTK2=yes 加入到 make.conf 将影响所有port的编译过程,这很可能不是希望的结果,因此比较保险的做法是使用下面这样的配置:

.if ${.CURDIR} == “/usr/ports/editors/vim”
WITH_GTK2=yes
.endif

这样,只有在执行 make 的当前目录是 /usr/ports/editors/vim 时,才会定义 WITH_GTK2=yes。

很明显,如此定义 make.conf 十分繁琐,为了解决这个问题,可以通过 Ports 套件安装 ports-mgmt/portconf 并配置 ports.conf。

提示

在FreeBSD系统安装以后的默认设置中,/etc/make.conf这个文件并不存在,你可以自己建立一个,如果系统安装了perl,那么perl会替你建立这个文件,这就是为什么几乎每个人的/etc/make.conf都有一行是关于perl的版本的内容。建立这个文件的命令很简单,因为make.conf本身就是一个纯文本文件,但是,显然你需要root权限来创建或者修改这个文件。

# touch /etc/make.conf

我的make.conf详解:

make.conf的语法非常的简单,其中:#代表注释,在#之后的内容都会被忽略;除注释外,每一行是内容格式如下:一个变量,一个赋值运算符=,一个具体值。

# cpu type
CPUTYPE=athlon64

指定系统的处理器类型,告诉gcc在编译软件的时候针对这个处理器进行优化,从FreeBSD官方论坛的相关讨论来看,这个参数对于提升系统性能比较重要。具体的可以参考/usr/share/examples/etc/make.conf来决定自己的处理器类型。

# ports compilation flag
CFLAGS= -O2 -fno-strict-aliasing -pipe
CXXFLAGS+= -fconserve-space

告诉系统在编译ports的时候使用哪些编译参数,就是优化的级别,推荐使用-O2,不要使用-O3,优化级别越高需要的编译时间越长,并且可能导致某些不可预知的问题。

# shell
MAKE_SHELL=sh

告诉系统在编译过程中使用哪个shell。

# kernel compilation flag
COPTFLAGS= -O2 -pipe

告诉系统编译内核时使用什么优化参数,这个需要单独的指定,并不是使用ports的编译参数,但是编译内核的时候所使用的处理器类型并不需要单独指定。

# kernel config
KERNCONF=MYKERNEL

告诉系统你/sys/amd64/conf目录下面哪个文件是你的kernel配置文件,这样在/usr/src下面直接make buildkernel就可以了,就是说编译内核的时候,不需要手工告诉系统内核的配置文件是哪个。

# install command
INSTALL=install -C

告诉系统安装编译完的软件时使用的安装命令。

# do not build modules with the kernel
NO_MODULES=true

告诉系统编译内核的时候只编译内核的配置文件(就是上面的MYKERNEL)里面包含的东西,这样就不会对配置文件以外的任何东西进行编译了。FreeBSD系统在编译内核的时候,会把配置文件里面的东西以二进制的形式之间编译到生成的内核中,其他的在配置文件里面没有指定的就编译成模块,这一行的作用在于,不编译那些模块,配合ccache可以在1分钟左右完成内核的编译,详细的情况可以看这里http://blog.chinaunix.net/u2/74710/showart_1191786.html。

# avoid compiling profiled libraries
NO_PROFILE=true

告诉系统在编译userland的时候不编译用于性能分析的函数库。

# for update
SUP_UPDATE=true
SUP=/usr/bin/csup
SUPFLAGS=-L 2
SUPHOST=cvsup5.cn.FreeBSD.org
SUPFILE=/usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile
DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile

告诉系统在进入/usr/src目录以后执行make update时升级kernel、userland、ports以及文档系统的代码树,并且指定升级时使用的程序(/usr/bin/csup)、使用的参数(-g -L 2)、使用的服务器(cvsup5.cn.FreeBSD.org)以及升级时分别使用相应的supfile。

# documentation language
DOC_LANG=en_US.ISO8859-1

告诉系统,我在/usr/doc目录下运行make install clean时只生成英文的文档,生成的文档在/usr/share/doc下面,包含FreeBSD的各种文档。

# for textproc/docproj
WITH_JADETEX=yes

编译文档需要安装docproj这个port,并且这个port总是提问题,于是我就直接把答案写在这里了,这样就不用我每次回答了。

# for vim
.if ${.CURDIR} == “/usr/ports/editors/vim”
WITH_GTK2=”yes”
.endif

告诉系统使用gtk2图形库,看上面我举的那个vim的例子。

# for gnome
WITH_GECKO=libxul

告诉系统屏蔽掉firefox,很多人都喜欢firefox,我一直使用gnome的epiphany,不喜欢firefox,但是epiphany在编译的时候需要一个下层的渲染引擎,默认是使用和firefox一样的引擎,所以默认会安装firefox,通过这个选项可以改变这个倚赖关系。

# set server for distfiles
#MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=ftp://ftp8.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/

告诉系统去哪里下载ports里面软件的源代码,这个不用多说了,语法也很简单,http、ftp代表的是协议或者说是服务类型,需要注意的不是每个http或者ftp都使用相同的目录结构。你可以去FreeBSD的handbook上找一下有那些服务器,我比较喜欢台湾的ftp8,就是在教育网那个,因为我也在教育网上。我虽然写了两个,但是屏蔽掉了的一个,如果ftp8宕机了,我就注释掉ftp8,用上面的那个,如果不写这个的话,编译port的时候会从prot的Makefile里面指定的下载地址下载,可能会比较慢,当然也可能会比较快(这个可能性比较小)。

# for ccache
.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*)) && !defined(NOCCACHE)
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++
.endif

这个是针对于ccache的设置,如果要使用ccache必须添加这个。ccache能大幅度的缩短编译时间,所以它能能帮你省很多时间,能帮全人类省很多电。我个人觉得应该给ccache的作者颁发一个“诺贝尔绿色和平奖”,虽然我不知道有没有这个奖。

我的make.conf的全部内容:

################################################################################
# cpu type
CPUTYPE=athlon64

# ports compilation flag
CFLAGS=-O2 -fno-strict-aliasing -pipe
CXXFLAGS+=-fconserve-space

# shell
MAKE_SHELL=sh

# kernle compilation flag
COPTFLAGS=-O2 -pipe

# kernel config
KERNCONF=MYKERNEL

# install command
INSTALL=install -C

# do not build modules with the kernel
NO_MODULES=true

# avoid compiling profiled libraries
NO_PROFILE=true

################################################################################
# for update
SUP_UPDATE=true
SUP=/usr/bin/csup
SUPFLAGS=-L 2
SUPHOST=cvsup5.cn.FreeBSD.org
SUPFILE=/usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile
DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile

# documentation language
DOC_LANG=en_US.ISO8859-1

# for textproc/docproj
WITH_JADETEX=yes

################################################################################
# for vim
.if ${.CURDIR} == “/usr/ports/editors/vim”
WITH_GTK2=”yes”
.endif

# for gnome
WITH_GECKO=libxul

################################################################################
# set server for distfiles
#MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=ftp://ftp8.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/

################################################################################
# for ccache
.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*)) && !defined(NOCCACHE)
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++
.endif

################################################################################
# added by use.perl 2009-05-05 08:38:03
PERL_VERSION=5.8.9

后记:

现在,你可以:

进入/usr/src目录使用make update升级系统的kernel、userland、doc、ports树的源代码了。
进入/usr/doc目录使用make install clean来编译安装最新的文档了。

欢迎补充。

原文链接:http://wiki.freebsdchina.org/doc/m/make.conf_usage

FreeBSD系统完全备份

摘要:

FreeBSD操作系统是非常稳定的,但是这并不是说FreeBSD系统都不备份数据,系统备份是系统管理中一个重要的部分。

在学习使用FreeBSD的过程中经常需要对系统进行某些实验性的操作,这时就有可能把系统搞乱,

只要你是正常操作搞坏一个FreeBSD还是比较困难的,如果没有root权限的话,几乎就是不可能的,当然你可以把自己的home塞满,如果管理员没有使用quato技术的话,

但是想搞坏一个FreeBSD也是很容易的,比如说你在行使root权限时随便输入了一个错误的命令。

这个Wiki页面将会介绍一种FreeBSD系统的完全备份方法,主要基于FreeBSD Forum上killasmurf86一个关于Backup[URL:http://forums.freebsd.org/showthread.php?t=185]的帖子。

在FreeBSD的Handbook上专门内容讲系统备份,在网上也有很多关于FreeBSD系统的备份文章,这个wiki页面的主要目的在于给出一个详细的备份以及恢复系统的过程描述。

基本的游戏规则:

1.FreeBSD系统的备份不需要什么特殊的工具,你需要的工具在FreeBSD的基本系统里面就有;
2.FreeBSD系统的备份就是对系统文件的打包,然后放到一个安全的地方,本文中使用的打包工具是dump;
3.FreeBSD系统的恢复就是把你保存好的系统文件从安全的地方里面拿出来放到你的硬盘上去,本文中使用的恢复工具是restore;
4.Unix-like下面不使用ghost之类的备份工具。

需要使用的工具:

FreeBSD基本系统中有很多工具可以备份,比如说tar。

但是在这个Wiki页面中我们只使用:dump+restore+freebsd_livefs_cd。

其中freebsd_livefs_cd可以到任意的FreeBSD的ftp服务器去下载。

示例系统分区简介:

这个台式机只有1块硬盘,并且只有一个FreeBSD操作系统,其分区方案如下。

df -h
Filesystem      Size    Used   Avail Capacity  Mounted on
/dev/ad12s1a    496M     36M    420M     8%    /
devfs           1.0K    1.0K      0B   100%    /dev
/dev/ad12s1h    240G    1.5G    219G     1%    /home
/dev/ad12s1e    3.9G    166K    3.6G     0%    /tmp
/dev/ad12s1f     19G    3.1G     15G    17%    /usr
/dev/ad12s1g     19G    1.3G     17G     7%    /usr/local
/dev/ad12s1d    3.9G     55M    3.5G     2%    /var
procfs          4.0K    4.0K      0B   100%    /proc

cat /etc/fstab
# Device        Mountpoint    FStype    Options        Dump    Pass#
/dev/ad12s1b        none        swap    sw        0    0
/dev/ad12s1a        /        ufs    rw        1    1
/dev/ad12s1h        /home        ufs    rw        2    2
/dev/ad12s1e        /tmp        ufs    rw        2    2
/dev/ad12s1f        /usr        ufs    rw        2    2
/dev/ad12s1g        /usr/local        ufs    rw        2    2
/dev/ad12s1d        /var        ufs    rw        2    2
/dev/acd0        /cdrom        cd9660    ro,noauto    0    0
proc            /proc        procfs  rw        0    0

从这个分区来看,是一个320G的硬盘,上面只有一个FreeBSD操作系统,每个分区的大致用途如下,详情可以参考hier(7)。

/ 这个目录存放很多基本工具,包括内核,需要备份;

/dev 这是一个虚拟的文件系统,不需要备份;

/home 用户数据,需要备份;

/tmp 临时文件,不需要备份;

/usr 很多工具以及系统的源代码都放在这里面,需要备份;

/usr/local 所有安装的软件基本上都在这里,需要备份;

/var 系统的日志,ports系统的数据库,需要备份;

/proc 虚拟文件系统,不需要必要备份。

看来需要备份一下目录:

/

/home

/usr

/usr/local

/var

备份的方法:

以/分区为例,我通常直接备份到我的移动硬盘上面。

我的移动硬盘使用的是UFS文件系统,分了4个partition,一般情况下我会把移动硬盘关在在我的/mnt/fender_01目录下面,假设目前系统一切正常,我现在打算做一个备份,那么我就应该关在移动硬盘某个分区到/mnt/fender_01目录下,然后分别对所有需要备份的分区进行备份,这里只给出“/”分区备份的例子。

“/”分区对应我硬盘上面的/dev/ad12s1a,那么备份整个分区的命令如下:

dump -0Lauf /mnt/fender_01/dump/ad12sa1.dump /dev/ad12s1a

某些时候,起一个好的文件名很重要!

其中:

-0 备份所有的文件系统中的内容,也就是不使用增量备份;

-f 指定备份结果存放的文件名;

-a 告诉dump不考虑备份的介质的大小问题,早期备份使用磁带,dump会预先计算一下需要的空间,使用这个选项告诉dump忽略这个问题;

-u 告诉dump更新一下/etc/dumpdates,这个文件记录了你在系统上搜有的备份活动;

-L 备份已经挂载的文件系统时需要,这个选项会使用UFS2的snapshot功能来保证文件系统的一致性。

恢复系统的方法:

恢复“/”以外的文件系统:

如果你只想恢复/以外的文件系统,那么很容易,

我们以恢复/home文件系统为例,你只需要重启系统进入单用户模式,

挂载/tmp分区,应为restore需要使用/tmp分区,

挂载移动硬盘上保存我备份文件的分区到/mnt目录下面的某个,例如/mnt/01,

按照我上面命名的规则,备份生成的文件应该是保存在/mnt/01/dump/dev/ad12s1h.dump,

首先你需要格式化/dev/ad12s1h,命令如下:

newfs -U /dev/ad12s1h

-U选型来打开softupdate。

挂在这个分区到/mnt下面的某个目录,例如/mnt/02/

mount /dev/ad12s1h /mnt/02

现在来恢复文件系统:

cd /mnt/02

restore -rf /mnt/01/dump/ad12s1h.dump

恢复“/”:

按照上面的方法你可以恢复/以外的任意的分区,但是你不能恢复“/”,因为你如果使用newfs格式化了“/”你就没有办法使用“/”里面的restore了,

解决的办法就是使用freebsd_livefs_cd启动系统,然后选择fix,之后选择cd,之后的过程就和上面介绍的恢复其他分区是一样的了。

事实上,可以使用freebsd_livefs_cd来恢复任何分区,但是如果你没有下载并刻录这张光盘,那么你就只能在单用户模式下面恢复“/”以外的分区了。

需要注意的是,当你格式化“/”对应的硬盘分区时,可以使用下述两种方法:

newfs /dev/ad12s1a
newfs -U /dev/ad12s1a

区别在于后者将打开softupdate选项,详细情况参考newfs[URL:http://www.freebsd.org/cgi/man.cgi?query=newfs&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html]。

在FreeBSD系统的安装过程中“/”分区默认是不打开softupdate的,并且你也没有办法打开,因为sysinstall程序不允许你打开。

这是一个历史遗留问题,当时softupdate还不成熟,于是决定在“/”分区中禁止使用softupdate,现在softupdate已经成熟了,但是对这个问题却保留了下来。

在“/”分区使用softupdate不会造成什么问题,但是在系统安装的默认设置中是没有打开的,这一点需要注意。

可以使用如果想打开或者关闭softupdate这个选项,可以使用tunefs(8)[URL:http://www.freebsd.org/cgi/man.cgi?query=tunefs&sektion=8&apropos=0&manpath=FreeBSD+7.2-RELEASE]这个工具。

备份MBR:

上面只提到了备份文件系统,没有讲如何备份系统的MBR。

关于MBR是什么就不详细介绍了,有兴趣的可以参考Handbook上面有一章专门介绍FreeBSD系统的启动过程。

备份:

dd if=/dev/da0 of=/path/to/mbr.img bs=512 count=1

恢复:

dd if=/path/to/mbr.img of=/dev/da0 bs=512 count=1

参考:

dump(8)[URL:http://www.freebsd.org/cgi/man.cgi?query=dump&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html]

restore(8)[URL:http://www.freebsd.org/cgi/man.cgi?query=restore&sektion=8&apropos=0&manpath=FreeBSD+7.2-RELEASE]

tunefs(8)[URL:http://www.freebsd.org/cgi/man.cgi?query=tunefs&sektion=8&apropos=0&manpath=FreeBSD+7.2-RELEASE]

newfs[URL:http://www.freebsd.org/cgi/man.cgi?query=newfs&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html]

hier(7)[URL:http://www.freebsd.org/cgi/man.cgi?query=hier&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html]

注意:

系统的备份与恢复并不十分困难,但是如果你不慎输入某个错误的命令的话,有可能导致某些灾难性的后果。

重做系统需要的是时间,但是如果重要数据丢失了,那就不只是时间的问题了。

所以,在备份与恢复系统时,请尽量保证自己头脑清醒。

后记:

欢迎提出修改意见。

感谢killasmurf86[URL:http://forums.freebsd.org/member.php?u=977]。

原文链接:http://wiki.freebsdchina.org/doc/b/backup_with_dump_and_restore