在FreeBSD上运行MySQL数据库

在 FreeBSD 上运行MySQL数据库

概要

FreeBSD 7.0包含了大量针对多处理器系统的可伸缩性改进。本文的目的在于整理一系列适用于 FreeBSD 7.0 的运行 MySQL的技巧。

硬件准备

一般而言,增加可用的 CPU 数量,会显著地改善数据库的查询性能。除此之外,在规划硬件配置时,还应考虑一些其他问题:

    将不同性质的读写操作分散到不同的物理磁盘上

成本方面的考虑,通常说来,对于顺序读写操作,使用ATA/SATA硬盘完全能够胜任。这包括服务器日志、数据库事务日志等等。而对于随机读写操作,如数据库数据文件,则推荐使用SCSI或SAS硬盘。此外,将不同性质的读写操作分散到不同的物理盘上,有助于降低发生故障时将数据完全丢失的风险,并可以有效地避免将单块磁盘的I/O性能耗竭,而导致系统响应时间变差。

    使用合适的数据块尺寸来初始化文件系统

在初始化文件系统时,数据块尺寸会决定文件系统一次性向磁盘发出读写请求时的数据量。请参考你的数据库的用户手册来了解合适的尺寸大小。对于 UFS 而言,较大的数据块还可以带来的一个“副作用”是,由于大数据块会使文件系统中的重要数据单元——柱面组的数量下降,对性能会有一定改善,并且会显著减少fsck所需的时间。

    使用更多的内存

编译系统

默认配置的 FreeBSD 7.0 采用传统的 4BSD 调度器,因此需要将其替换为 ULE 调度器:

cd /usr/src/sys/`uname -p`/conf
sed -e s,4BSD,ULE,g GENERIC > DB-GENERIC
cd /usr/src
echo KERNCONF=DB-GENERIC >> /etc/make.conf
make buildworld buildkernel && sudo make installkernel installworld

MySQL 的编译

我们推荐使用的 MySQL 版本是 5.0。推荐的 ports.conf 项目为:

databases/mysql*-server: BUILD_OPTIMIZED=yes|WITH_XCHARSET=yes

安装方法:

portinstall databases/mysql50-server

ports安装具体方法:

#cd /usr/ports/databases/mysql51-server     #这里以安装mysql5.1为例
#make install clean
#rehash
#cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf            #服务器内存1G,但是与apache在一起

/usr/local/share/mysql下面有5个my-xxxx.cnf文件

my-small.cnf 最小配置安装,内存?64M,数据数量最少

my-large.cnf 内存=512M

my-medium.cnf 32M<内存<64M,或者内存有128M,但是数据库与web服务器公用内存

my-huge.cnf 1G<内存<2G,服务器主要运行mysql

my-innodb-heavy-4G.cnf 最大配置安装,内存至少4G

在 rc.conf.local 里面做如下设置

mysql_dbdir="/path/to/MySQL_data"
mysql_enable="YES"

其中 /path/to/mysql_data 是 MySQL 数据库所在的位置。在第一次通过 MySQL 的 rc 脚本启动 MySQL 的时候,rc 脚本会负责正确的初始化 MySQL 的数据库。

原文链接:http://wiki.freebsdchina.org/doc/d/database_running

详解FreeBSD 8下部署Apache+MySQL+PHP 5

众所周知,在生产环境下配置Apache+PHP 5环境或Nginx+PHP 5环境还是很复杂的,即大家熟悉的LAMP或NAMP架构,就算按照详细的部署文档来安装的话也是一个较长和麻烦的过程;但这一切在FreeBSD下用ports就简化了,本人感觉特别适应于开发环境,特将FreeBSD 8下的部署过程记录如下,方便与大家交流共享。

一、安装Apache2.2

cd /usr/ports/www/apache22
make install clean

去掉IPV6
添加MySQL

安装完成后,需要编辑/etc/rc.conf文件,添加下面内容到/etc/rc.conf:

apache22_enable="YES"

配置Apache 2.2

安装完成后,备份/usr/local/etc/apache22/httpd.conf文件:

cp /usr/local/etc/apache22/httpd.conf /usr/local/etc/apache22/httpd.conf.bak

编辑/usr/local/etc/apache22/httpd.conf文件,以使Apache22 Server支持PHP:

vim /usr/local/etc/apache22/httpd.conf

1.大约354行

在AddType application/x-gzip .gz .tgz下面添加以下内容:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

2.大约212行

添加’index.php’ 到’DirectoryIndex’ 主目录索引:

DirectoryIndex index.php index.html

3.第152行

DocumentRoot "/home/www"  #存放web的路径,根据自己需求更改

4.第178行

<Directory "/home/www">   #存放web的路径,这个根据自己需求更改

二、安装PHP 5.2

cd /usr/ports/lang/php52
make install clean

选择如下安装选项:

去掉IPV6
添加CLI、CGI、APACHE、SUHOSION、FASTCGI、PATHINFO

三、安装PHP 5.2-extensions扩展

cd /usr/ports/lang/php52-extensions
make config
make install clean

make config安装添加选项如下:

添加BZ2、CALENDAR、CTYPE、GD、GETTEXT、ICONV、MBSTRING、MCRYPT、MHASH、MYSQL、MYSQLI、OPENSSL、PCRE、POSIX、SESSION、SOCKETS、TOKENIZER、ZIP、ZLIB。

我在线上服务器的centos5.4下,一个个手动源码编译PHP 5的扩展包,感觉是件非常痛苦的事情;Apache如是,Nginx下亦如是;在FreeBSD 8下一切都简单了,这个过程有点长。

复制/usr/local/etc/php.ini-dist为/usr/local/etc/php.ini:

cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini

四、安装ZendOptimizer

cd /usr/ports/devel/ZendOptimizer
make install clean

安装完成提示如下:

********************************************************************************
You have installed the ZendOptimizer package.
Edit /usr/local/etc/php.ini and add:
[zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20060613/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20060613/Optimizer_TS"
zend_extension="/usr/local/lib/php/20060613/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20060613/ZendExtensionManager_TS.so"
*********************************************************************

编辑php.ini,复制以上[Zend]内容到文本末尾:

vim /usr/local/etc/php.ini

重新启动你的Web Server.

/usr/local/etc/rc.d/apache22 restart

测试Apche Server对PHP和ZendOptimizer支持,在/home/www里面建立一个index.php,输入以下内容:

<?
phpinfo();
?>

我这里安装此版本为5.2.13,新的PHP已近更新至5.3.3,但是老版本的ZendOptimizer对其不支持,所以本着稳定就好的原则,继续使用5.2.13;

五、安装MySQL Server5.0

cd /usr/ports/databases/mysql50-server
make install clean

配置MySQL

安装完成后,需要编辑/etc/rc.conf文件,添加下面内容到/etc/rc.conf:

mysql_enable="YES"

复制文件:

cp /usr/local/share/mysql/my-medium.cnf /etc/my.conf

启动MySQL服务:

/usr/local/etc/rc.d/mysql-server start

新装的mysql是没有密码的,使用mysqladmin命令更改MySQL密码:

/usr/local/bin/mysqladmin -uroot password ‘你的密码’

例如:/usr/local/bin/mysqladmin -uroot password 12345678

六、安装PHPmyadmin

1.安装

cd /usr/ports/databases/phpmyadmin
make fetch  #只下载,不安装

PHPmyadmin解压以后直接使用了:

cp /usr/ports/distfiles/phpMyAdmin-3.3.2-all-languages.tar.bz2 /home/www    #/home/www为apache指定路径
tar zxvf phpMyAdmin-3.3.2-all-languages.tar.bz2
mv phpMyAdmin-3.3.2-all-languages phpmyadmin      #phpmyadmin文件名就为外部地址路径http://xxx.xxx.xxx.xxx/phpmyadmin

2.配置

cd /home/www/phpmyadmin
cp config.sample.inc.php  config.inc.php

3.修改

ee config.inc.php
cfg[‘blowfish_secret’]=’host’;            #随便输入,不要留空这个一定要设置
cfg[‘Servers’][$i][‘auth_type’]=’cookie’#设置认证方式,默认即可

4.设置权限

chmod 755 config.inc.php

这时候你就可以在内网用root等用户进行登陆管理了,PHPMyadmin的强大是有目共睹的,这也是它现在作为Linux/unix发行版的默认软件之一。

值得注意的是,基于线上环境的严谨性,我一般采用64位的Cenots系统,软件均采用源码安装;而以上所述,均是出于开发环境的考虑,即快速方便的部署测试服务器,如果用于线上环境,还需要注意的细巧还有许多,比如PHP要禁用危险的函数、Apache要考虑其Web安全及SSL证书(一个不小心就要考虑支持多域名的SSL证书)等、MySQL要考虑生产环境下的压力及备份等,这里细节繁多就不细述了。

原文链接:http://developer.51cto.com/art/201010/231233.htm

FreeBSD下Lighttpd+PHP+Mysql安装配置笔记

FreeBSD下Lighttpd+PHP+Mysql安装配置笔记

1,安装mysql

cd /usr/ports/database/mysql51-server
make install clean

2,安装lighttpd

cd /usr/ports/www/lighttpd
make install clean
(默认选项)

3,安装php5

cd /usr/ports/lang/php5
make install clean
(默认选项)

4,安装php5-extensions

cd /usr/ports/lang/php5-extensions
make install clean

增加GD,MBSTRING,MCRYPT,MYSQL,MYSQLI

5,配置lighttpd

vi /usr/local/etc/lighttpd.conf

取消需要用到模块的注释,mod_rewrite,mod_access,mod_fastcgi,
mod_simple_vhost,mod_cgi,mod_compress,mod_accesslog

取消fastcgi.server的注释
fastcgi.server = ( “.php” =>
( “localhost” =>
(
“socket” => “/var/run/lighttpd/php-fastcgi.socket”,
“bin-path” => “/usr/local/bin/php-cgi”
)
)
)

另:
touch /var/log/lighttpd.access.log
touch /var/log/lighttpd.error.log
mkdir /var/run/lighttpd
chown -R www:www /var/run/lighttpd
chown www:www /var/log/lighttpd.access.log
chown www:www /var/log/lighttpd.error.log

6,启动lighttpd和mysql

vi /etc/rc.conf

增加
mysql_enable=”YES”
lighttpd_enable=”YES”

执行
/usr/local/etc/rc.d/lighttpd start
/usr/local/etc/rc.d/mysql start

原文链接:http://garey.bsdart.org/2009/12/freebsd7-2%E4%B8%8Blighttpdphpmysql%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E7%AC%94%E8%AE%B0/

FreeBSD DHCP服务安装笔记

一、编译内核

device bpf

bpf设备是DHCP服务必需的,FreeBSD系统默认的GENERIC内核已经包含此设备,如果您的系统内核是经过修改的,请注意此设备是否已经添加。

二、安装DHCP Server

# cd /usr/ports/net/isc-dhcp31-server
# make install clean

三、配置DHCP服务

# vi /usr/local/etc/dhcpd.conf

option domain-name "example.com";  //这个选项指定了提供给客户机作为默认搜索域的域名。
option domain-name-servers 192.168.0.100;  //这个选项用于指定一组客户机使用的DNS服务器,它们之间以逗号分隔。
option subnet-mask 255.255.255.0;  //提供给客户机的子网掩码。

default-lease-time 3600;  //客户机可以请求租约的有效期,而如果没有,则服务器将指定一个租约有效期,也就是这个值(单位是秒)。
max-lease-time 86400;  //这是服务器允许租出地址的最大时长。如果客户机请求了更长的租期,则它将得到一个地址,但其租期仅限于max-lease-time秒。
ddns-update-style none;  //这个选项用于指定DHCP服务器在一个地址被接受或释放时是否应对应尝试更新DNS。在ISC实现中,这一选项是必须指定的。

subnet 192.168.0.0 netmask 255.255.255.0 {  //配置DHCP地址池
  range 192.168.0.120 192.168.0.250;  //指定地址池中可以用来分配给客户机的IP地址范围。在这个范围之间,以及其边界的IP地址将分配给客户机。
  option routers 192.168.0.1;  //定义客户机的默认网关。
}

host mailhost.example.com {  //分配静态IP地址
  hardware ethernet 02:03:04:05:06:07;  //主机的硬件MAC地址(这样DHCP服务器就能够在接到请求时知道请求的主机身份)。
  fixed-address 192.168.0.150;  //指定固定IP地址
}

四、启动DHCP服务

# vi /etc/rc.conf

dhcpd_enable="YES"
dhcpd_ifaces="dc0"  //dc0为DHCP服务器需要监听DHCP客户端请求的接口

# /usr/local/etc/rc.d/isc-dhcpd start

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服务器上运行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

为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系统配置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系统完全备份

摘要:

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

通过PXE安装FreeBSD系统

目标

在已有一台运行 FreeBSD 的计算机(我们称其为 S)的情况下,使用 PXE 在一台计算机(我们称其为 D)安装 FreeBSD。

硬件需求

S 必须拥有一块 FreeBSD 可以正常使用的网卡。
D 必须可以支持 PXE 引导,并且其网卡要可以在 FreeBSD 里面正常使用。 一条用于双机直连的网线。

软件需求

tftpd,已经包含在 FreeBSD 发行版的 base 中。
nfsserver,已经包含在 FreeBSD 中。
isc-dhcp3-server 3.0.5,通过 ports 安装。
FreeBSD 发行版 DISC1 的 ISO 镜像(我使用的镜像是 FreeBSD 8-CURRENT 今年一月的快照,8.0-CURRENT-200801-amd64-disc1.iso)。

S 上使用的 FreeBSD 是 7.0-BETA2-i386。

网络设置

假设 S 的 IP 地址为 192.168.0.1,子网掩码为 255.255.255.0。

准备工作

允许 tftpd 运行

默认情况下,inetd 里面的 tftpd 是不会运行的。在 inetd.conf 中找到 tftpd 所对应的一行,去掉行首的#,保存。注意,去除注释的这行应该是使用 udp 而不是 udp6。

配置 nfsserver

echo "/mnt -ro -alldirs" > /etc/exports

安装 isc-dhcp3-server

cd /usr/ports/net/isc-dhcp3-server && make BATCH=yes install

配置 isc-dhcp3-server

编辑 /usr/local/etc/dhcpd.conf

default-lease-time    7200;
max-lease-time    7200;
ddns-update-style    none;
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.2 192.168.0.254;
    server-identifier    192.168.0.1;
    next-server        192.168.0.1;
    filename        "/pxeboot";
    option    root-path    "/mnt";
}

这里是整个 PXE 安装最重要的部分之一,能否正常进行 PXE 安装关键就在这里。这里面最关键的几个选项是 next-server,filename 和 root-path。
要理解这些选项的作用,首先要理解 PXE 工作的流程。按照 FreeBSD PXE 引导的过程,我们将其分成三个阶段。
第一阶段主要是 D 上 PXE 的 firmware 和 S 上 dhcpd 协商的过程。在这里,要商定 D 的 IP 地址,并且确定下一步 PXE 要加载的文件,及其位置。
第二阶段是 D 加载上一阶段商定好的文件。对于 FreeBSD 来说,主要就是 pxeboot(8),一个 PXE 的 bootloader。
第三阶段是根据 pxeboot(8) 的指示加载 loader(8) 和 kernel。
在这里,我们可以看到 D 要从网络加载两次文件,一次是 pxeboot(8),另外一次是 loader(8) 和 kernel。这两次加载文件的位置就是由上面的三个选项来确定的。下面我们逐一分析这几个语句的作用。

next-server 语句主要控制了整个 PXE 引导中两次加载的文件所在的服务器的地址。pxeboot(8) 是通过 tftp 从 S 传递到 D 的,所以 next-server 第一个作用就是指定一个 tftp server 的地址。在第三阶段,要加载 loader(8) 和 kernel,这个加载过程是通过 nfs 完成的。next-server 同时也指定了 nfs server 的地址。值得注意的是,有一些文档说第一阶段确定的 PXE 在下一阶段要加载的文件(也就是 pxeboot(8))所在的服务器地址是通过 server-identifier 给定的,但是对于 isc-dhcp3-server 来说,这一点并不成立,而恰恰是 next-server 决定了 pxeboot(8) 所在的服务器的地址(在 dhcpd.conf(5) 里面已经明确指出了这一点)。

filename 指定的是 pxeboot(8) 在 tftp 传输过程中的名字。由于 tftpd 将在 inetd 中来使用,根据 inetd.conf 中给 tftpd 传递的选项,tftpd 启动的时候会进行 chroot,于是 filename 的地址是要相对于其 chroot 之后的根路径来说的。默认情况下,tftpd 会 chroot 到 /tftpboot,我们要在 /tftpboot 中放入 pxeboot(8) 这个文件。由于相对 /tftpboot 作为根路径来说,pxeboot(8) 的位置是 /pxeboot,所以我们直接填入 /pxeboot 便可。

root-path 这个选项指定的是第三阶段加载 loader(8) 和 kernel 在 nfs 的根路径的位置(也就是包含了 boot 目录的位置)。因为我们导出的是 /mnt,所以这里填 /mnt。

正式安装

1、为了避免 S 上的 dhcpd 影响网络中其他机器,也为了避免 D 受到网络上其他机器的影响,用直连网线将 S 和 D 连接起来。

2、挂载准备好的 ISO 镜像。 使用 mdconfig 将 FreeBSD 的 ISO 文件连接成为一个 vnode 类型的内存盘:

mdconfig -atvnode -f 8.0-CURRENT-200801-amd64-disc1.iso

挂载这个 md 节点(假设为 /dev/md0)到 /mnt:

mount_cd9660 /dev/md0 /mnt

3、把 pxeboot(8) 放到 /tftpboot:

cp /mnt/boot/pxeboot /tftpboot

4、在 S 上启动 tftpd, dhcpd 和 nfsd:

/etc/rc.d/inetd forcestart
/etc/rc.d/nfsd forcestart
/usr/local/etc/rc.d/isc-dhcpd forcestart

5、由于我们已经使用直连网线将 S 和 D 连接,假设 S 上没有配置 BIND 服务,也没有额外的到 Internet 的网络连接,那么需要禁止 S 上的 DNS 解析。可以修改 /etc/resolv.conf,将其中所有以 nameserver 开头的行注释掉。否则 mountd(因为 nfsd 依赖这个 daemon,所以 mountd 也会随 nfsd 启动而启动)会去查 DNS,而有可能导致最终 PXE 启动连不上 nfs,不能加载 kernel 而超时失败。

6、在 D 的 BIOS 中设置为 PXE 引导,重新启动计算机。

7、D 此时已经启动,并通过 PXE,加载了 loader。此时需要选择 loader 启动选项的第 6 项,进入 loader prompt。输入以下命令:

set vfs.root.mountfrom="ufs:/dev/md0c"
boot

第一行保证我们可以启动到正确的安装程序,第二行提示系统继续执行启动的各个步骤。

8、此时应该正常进入安装程序。到选择安装介质之前都按照一般的安装步骤。在选择安装介质时选择 nfs,然后输入 S 的 IP 地址,以及导出的路径,例如 192.168.0.1:/mnt。确认后,系统提示要设置网卡,在这里按照系统提示,使用 dhcp,保证 D 与 S 在同一个网络中。主机名和域名随意,DNS 以及网关可以暂时不填。后续步骤与从光盘安装一致。

9、最终退出安装程序,重新启动系统。并修改 D 的 BIOS 设置,禁止网络启动。

10、安装全部完成,可以开始享用 FreeBSD 了。

参考

rafan 的 PXE Install 笔记[URL:http://wiki.rafan.org/doc/freebsd#pxe_install]

原文链接:http://wiki.freebsdchina.org/howto/p/pxeinstall