在 FreeBSD 10 上搭建 Time Machine 备份服务

Backblaze 是一家在线存储服务商,每隔一段时间他们就会发布他们的存储服务器 Storage Pod 设计细节Storage Pod 4.5),一些第三方公司就按照这个设计造出一些廉价的存储服务器来出售。

没调查清楚头脑一热就买了,买回来拆开一看有点后悔:

  • 只有一个系统盘,OS 装在一个盘上太危险,至少应该双硬盘 RAID1;
  • 只有一个电源,服务器系统至少需要配用2个可用电源;
  • 没有硬件 RAID,这个无所谓,我们也不打算用 RAID;
  • 只有2个 GigE 网卡,我们购买了额外2个 10 GigE;
  • 开箱操作不方便,更换一个硬盘每次都要把10几个螺丝钉卸下来;
  • 没有硬盘指示灯,哪个硬盘坏了无法从45个硬盘里迅速识别出来。
  • ……

backblaze

不过我们对这台存储服务器没太多要求,主要做归档备份用,不是我们的主备份,也不太在乎它是否可靠,所以先凑合着用吧。两年前我们提到 “把 Time Machine 备份到 FreeNAS 上”,FreeNAS 现在变得有点臃肿,官方要求最小 8GB 内存,推荐最小 16GB 内存,这次打算直接用 FreeBSD + ZFS.

ZFS 准备工作

我们选择 FreeBSD 做备份的主要原因就是因为 ZFS,ZFS 操作起来太方便了。把30个硬盘连起来创建一个叫做 backup 的大存储池,采用 raidz2(相当于 RAID6):

# zpool create backup raidz2 /dev/da0 /dev/da1 /dev/da2 /dev/da3 /dev/da4 /dev/da5 /dev/da6
 /dev/da7 /dev/da8 /dev/da9 /dev/da10 /dev/da11 /dev/da12 /dev/da13 /dev/da14 /dev/da15 /
dev/da16 /dev/da17 /dev/da18 /dev/da19 /dev/da20 /dev/da21 /dev/da22 /dev/da23 /dev/da24
/dev/da25 /dev/da26 /dev/da27 /dev/da28 /dev/da29

在 pool 上创建一个文件系统 timemachine,创建好后就自动挂载好了,不用再手动 mount:

# zfs create backup/timemachine

# df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
/dev/ada0p2           447G    2.3G    409G     1%    /
devfs                 1.0K    1.0K      0B   100%    /dev
backup                 31T    278K     31T     0%    /backup
backup/timemachine     31T    1.0G     31T     0%    /backup/timemachine

对每个使用 Mac/Time Machine 的用户需要在 FreeBSD 系统上增加一个对应的帐户,并把帐户加到 timemachine 组里面便于统一管理:

# pw useradd -n vpsee -s /bin/csh -m
# passwd vpsee

# pw groupadd timemachine
# pw groupmod timemachine -m vpsee
# pw groupshow timemachine
timemachine:*:1002:vpsee

在 /backup/timemachine 下面新建一个用户目录,并给予适当权限:

# mkdir /backup/timemachine/vpsee
# chown vpsee:timemachine /backup/timemachine/vpsee
# chmod 700 /backup/timemachine/vpsee
# chmod 777 /backup/timemachine

安装和配置 Netatalk

Netatalk 是一个开源的 AFP (Apple File Protocol) 文件服务器,为 Mac OS X 提供文件共享服务。Avahi 是 Apple Zeroconf 协议的开源实现,类似 Bonjour 的功能,它可以让你在 Mac 系统里自动发现你的 FreeBSD 服务器。我们直接使用 pkg 安装软件包:

# pkg install netatalk3
# pkg install nss_mdns
# pkg install avahi

修改 nsswitch.conf:

# vi /etc/nsswitch.conf
#
# nsswitch.conf(5) - name service switch configuration file
# $FreeBSD: releng/10.2/etc/nsswitch.conf 224765 2011-08-10 20:52:02Z dougb $
#
...
hosts: files dns mdns
...

配置 afp:

# vi /usr/local/etc/afp.conf
;
; Netatalk 3.x configuration file
;

[Global]
vol preset = default_for_all_vol
log file = /var/log/netatalk.log
log level = default:info
hosts allow = 172.20.0.0/23
mimic model = TimeCapsule6,116
disconnect time = 1

[default_for_all_vol]
file perm = 0640
directory perm = 0750
cnid scheme = dbd

[TimeMachine]
time machine = yes
path=/backup/timemachine/$u
valid users = @timemachine
#512 GB limit
vol size limit = 512000

配置完后启动各服务:

# /usr/local/etc/rc.d/dbus onestart
# /usr/local/etc/rc.d/avahi-daemon onestart
# /usr/local/etc/rc.d/netatalk onestart

如果测试后都好用的话别忘了把服务加到启动文件里:

# vi /etc/rc.conf
...
zfs_enable="YES"
dbus_enable="YES"
avahi_daemon_enable="YES"
avahi_dnsconfd_enable="YES"
netatalk_enable="YES"
...

Mac 配置

在 Mac 上把这个选项打开:

$ defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

打开 Finder -> Go -> Connect to Server… 填入 FreeBSD 的 IP 地址(afp://192.168.2.201)后点击 Connect,使用刚才创建的帐号和密码登录进入之后就会看到 TimeMachine 文件夹。

打开 System Preferences -> Time Machine -> On 选择 TimeMachine 文件夹,然后点击 Use Disk 就应该能用了。

timemachine

在 FreeBSD 10.0 上安装和配置 Nginx+PHP+APC+MySQL

上月得知一位同事要退休,留下一些 BSD 机器需要接手(是的,在国外玩技术可以玩到退休~),接下来两个月讨论 FreeBSD/OpenBSD 的机会可能多一些。FreeBSD 10.0 发布的亮点不少,clang 替代了 gcc 成为默认编译器、大幅增强了对虚拟化的支持、下一代软件包管理工具 pkgng 替代了 pkg_add/pkg_delete 成为默认包管理工具、Linux 一直在虚拟化方面遥遥领先 BSD 阵营,这次的发行版本终于包括了 BSD 自己的虚拟化技术 bhyve,…

在 FreeBSD 下安装软件的传统方法是用 ports 源码安装,不过使用 ports 源码编译安装太耗时(尤其是各种库依赖多、大的时候),个人还是喜欢 pkg 这种软件包管理工具直接安装编译好的二进制软件包,不用自己编译,省时省力。

和 Linux 一样,FreeBSD 也能一行命令解决所有安装和软件包依赖问题(下面的输出要比 apt-get/yum 来的清新舒服吧~):

# pkg install nginx php55 php55-extensions pecl-APC mysql56-server
Updating repository catalogue
The following 23 packages will be installed:

	Installing nginx: 1.4.7,1
	Installing php5-session: 5.4.26
	Installing php5-xmlwriter: 5.4.26
	Installing php5-dom: 5.4.26
	Installing php5-xml: 5.4.26
	Installing php5-simplexml: 5.4.26
	Installing php5-ctype: 5.4.26
	Installing php5-posix: 5.4.26
	Installing php5-hash: 5.4.26
	Installing php5-filter: 5.4.26
	Installing php5-tokenizer: 5.4.26
	Installing php5-json: 5.4.26
	Installing php5-sqlite3: 5.4.26
	Installing php5-pdo: 5.4.26
	Installing php5-iconv: 5.4.26
	Installing php5-phar: 5.4.26
	Installing pecl-APC: 3.1.14_1
	Installing php5-xmlreader: 5.4.26
	Installing php5-pdo_sqlite: 5.4.26
	Installing php5-extensions: 1.7
	Installing mysql56-client: 5.6.16_1
	Installing mysql56-server: 5.6.16

The installation will require 149 MB more space

14 MB to be downloaded

Proceed with installing packages [y/N]: y

安装完后把服务加到系统启动文件里:

# vi /etc/rc.conf
...
nginx_enable="YES"
php_fpm_enable="YES"
mysql_enable="YES"

配置 MySQL:

# vi /usr/local/etc/my.cnf
[mysqld]
socket = /tmp/mysql.sock

skip-networking
skip-name-resolve

# service mysql-server start

# /usr/local/bin/mysqladmin -u root password 'password'

配置 PHP 和 PHP-FPM,这里不需要配啥,默认的配置就行:

# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

# vi /usr/local/etc/php.ini
# vi /usr/local/etc/php-fpm.conf

# service php-fpm start

配置 APC:

# echo 'apc.enabled="1"' >> /usr/local/etc/php.ini
# echo 'apc.shm_size="32M"' >> /usr/local/etc/php.ini
# service php-fpm restart

配置 Nginx:

# vi /usr/local/etc/nginx/nginx.conf
user  www;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root   /usr/local/www/nginx;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}

# service nginx start

写个 phpinfo() 页面测试一下 Nginx/PHP/PHP-FPM/APC 组合是否能正常工作。如果一切正常的话访问 http://localhost/info.php 能看到 PHP 环境详细信息:

# vi /usr/local/www/nginx/info.php
<?php phpinfo(); ?>

对 NetBSD 感兴趣的同学可以参考:NetBSD 上安装和配置 Nginx+PHP+FastCGI+MySQL

在 FreeBSD 10.0 上安装 SmokePing

SmokePing 是一款开源网络延迟监控工具,其作者 Tobi Oetiker 还开发了一些我们熟悉的 MRTG 和 RRDtool. SmokePing 能采用多种方式对网络延迟(性能)进行监测和警告,支持插件的方式对网络的其他指标进行监控,并且支持 Matser/Slave 分布式架构,多节点监控数据可以汇集到一起并通过颜色和阴影来展现网络延迟和丢包。以下操作在 FreeBSD 10.0 上测试通过。

在开始之前,最好升级一下系统:

# freebsd-update fetch
# freebsd-update install

现在 FreeBSD 有了一套新的软件包管理工具 pkg,目的是用来替代老的 pkg_info/pkg_create/pkg_add. 这里用新工具 pkg 来安装 smokeping,并把 smokeping 加到系统启动文件里:

# pkg install smokeping
# echo 'smokeping_enable="YES"' >> /etc/rc.conf

修改 smokeping_secrets 文件权限后启动 smokeping:

# chmod 600 /usr/local/etc/smokeping/smokeping_secrets
# /usr/local/etc/rc.d/smokeping start

smokeping 是 Perl 写的,还需要安装几个 perl 模块:

# perl -MCPAN -e shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9800)
Enter 'h' for help.

cpan[1]> install FCGI
cpan[1]> install CGI

要看 web 界面的话 smokeping 还需要 apache 的支持,安装 apache 并加到系统启动文件:

# pkg install apache24
# echo 'smokeping_enable="YES"' >> /etc/rc.conf

因为 pkg 里面没有 mod_fcgid,不能 pkg install mod_fcgid,所以需要使用 FreeBSD 传统的 port 编译安装:

# portsnap fetch extract
# portsnap fetch update

# cd /usr/ports/www/mod_fcgid
# make install clean

配置 apache:

# vi /usr/local/etc/apache24/Includes/smokeping.conf
LoadModule fcgid_module libexec/apache24/mod_fcgid.so


    AddHandler fcgid-script .fcgi


Alias /smokeping "/usr/local/smokeping/htdocs"

    Options Indexes FollowSymLinks ExecCGI
    AllowOverride All
    Require all granted

# vi /usr/local/etc/apache24/httpd.conf
...
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#

    DirectoryIndex index.html smokeping.fcgi

...

配置 smokeping,在 *** Targets *** 一栏加入要监控的机器:

# vi /usr/local/etc/smokeping/config
...
*** Targets ***

probe = FPing

menu = Top
title = Network Latency Grapher
remark = Welcome to vpsee.com

+ Local

menu = Local
title = Local Network

++ node11

menu = node11
title = node11
host = node11.vpsee.com
...

做了配置后,别忘了重启服务:

# service smokeping restart
# service apache24 restart

打开浏览器访问 http://192.168.2.123/smokeping/

SmokePing

FreeBSD 9.0 文件系统的默认 fragment size 是 4096

今天发现在一台小硬盘的 FreeBSD 9.0 虚拟机上启动 vi 时报错:

% vi

/: create/symlink failed, no inodes free
ex/vi: Error: Unable to create temporary file: No space left on device

检查了一下硬盘容量,貌似这个虚拟机只用了53%的硬盘,应该还有足够的空间啊:

% df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p3    5.7G    2.8G    2.4G    53%    /
devfs          1.0k    1.0k      0B   100%    /dev

仔细看错误信息发现是文件系统 no inodes free,应该是文件系统的 inode 不够了,df -i 查看 inode 用了100%,没了可用的 inode 也就不能创建文件了。

% df -i
Filesystem  1K-blocks    Used   Avail Capacity iused ifree %iused  Mounted on
/dev/ada0p3   5939036 2916144 2547772    53%  378873     5  100%   /
devfs               1       1       0   100%       0     0  100%   /dev

用 newfs 查看当前文件系统设置发现 fragment size 4096. 查看 newfs 命令的帮助文件得知 FreeBSD 9.0 下的 fragment size 和 block size 默认分别为32768和4096字节,是 FreeBSD 8.2(8192和1024字节)时的4倍(难怪以前在小硬盘上用 FreeBSD 8.2 的时候没遇到这个问题):

# newfs -N /dev/ada0p3
/dev/ada0p3: 5892.9MB (12068736 sectors) block size 32768, fragment size 4096
	using 8 cylinder groups of 740.00MB, 23680 blks, 47360 inodes.
super-block backups (for fsck -b #) at:
 192, 1515712, 3031232, 4546752, 6062272, 7577792, 9093312, 10608832

% man newfs
...
EXAMPLES
           newfs /dev/ad3s1a

     Creates a new ufs file system on ad3s1a.  The newfs utility will use a
     block size of 32768 bytes, a fragment size of 4096 bytes and the largest
     possible number of blocks per cylinders group.  These values tend to pro‐
     duce better performance for most applications than the historical
     defaults (8192 byte block size and 1024 byte fragment size).  This large
     fragment size may lead to much wasted space on file systems that contain
     many small files.
...

查看源码 freebsd/sbin/newfs/newfs.h 再次确认了 FreeBSD 9.0 下文件系统的 fragment size 和 block size 默认大小:

/*
 * The following two constants set the default block and fragment sizes.
 * Both constants must be a power of 2 and meet the following constraints:
 *      MINBSIZE <= DESBLKSIZE <= MAXBSIZE
 *      sectorsize <= DESFRAGSIZE <= DESBLKSIZE
 *      DESBLKSIZE / DESFRAGSIZE <= 8
 */
#define DFL_FRAGSIZE    4096
#define DFL_BLKSIZE     32768

现在要想办法改变 block size, fragment size,增加 inode 数目,/dev/ada0p3 分区刚好是 root 分区,只能重装了,分区的时候记得在分区格式化步骤的时候带上初始化参数,在动手之前 man newfs 仔细看看帮助文件里对 -b -f -i 等参数的说明:

# man newfs

# newfs -U -b 4096 -f 512 -i 2048 /dev/ada0p3

使用 mutt, fetchmail, maildrop, msmtp 收发邮件

现在已经有了 Mail.app, Thunderbird, Outlook 这些图形化工具能很方便的处理邮件,为啥还需要 mutt 这种命令行文本方式的邮件工具呢?mutt 的一个优势是占用资源小,可以很好的运行在低配置的虚拟机或古老的电脑上(应该不会有人想在 256MB 内存的虚拟机或 VPS 上用 X Window/Gnome/Thunderbird 这种组合吧)。那为什么要在虚拟机上收发邮件呢,不能在自己电脑上处理邮件吗?可能有多个电脑而且电脑经常换,电脑可能被盗,硬盘可能坏、数据可能丢,邮件放在本地电脑不太方便,有些电脑可能是共用的,在共用电脑上保留自己的邮件帐号不爽。那为啥不直接用 Gmail 收发 POP/IMAP 工作邮件呢?有时候可能需要在别人的电脑上打开工作邮件,比如核对一些事情、计划、会议记录之类的,在公共电脑或者别人电脑上开自己的私人邮箱是件很危险的事情,谁知道电脑上有没有病毒、木马或者键盘纪录程序?

建议经常使用 Gmail 的用户激活 2-step verification 增加安全性。

总之吧,现在的需求是:ssh 到一台服务器或虚拟机上,用 mutt 处理邮件。

在 Ubuntu 上

在 Ubuntu 上安装 mutt + fetchmail + maildrop + msmtp:

# apt-get install mutt fetchmail maildrop msmtp

在 FreeBSD 上

在 FreeBSD 上安装 mutt + fetchmail + maildrop + msmtp:

# pkg_add -r mutt
# pkg_add -r fetchmail
# pkg_add -r maildrop
# pkg_add -r msmtp

配置 mutt

touch 一个文件用来存放邮件:

# mkdir /var/spool/mail
# touch /var/spool/mail/vpsee

配置 fetchmail 通过 POP 收邮件:

$ vi .fetchmailrc
poll "mail.vpsee.com"
protocol pop3
username "vpsee"
password "password"
mimedecode                      # 自动处理 mime 
mda "/usr/bin/maildrop"         # 告诉 fetchmail 使用哪个 MDA (for Ubuntu)
#mda "/usr/local/bin/maildrop"  # 告诉 fetchmail 使用哪个 MDA (for FreeBSD)

$ chmod 0700 .fetchmailrc

配置 maildrop,告诉 maildrop 把邮件分发到哪里(其实是一个 /var/spool/mail/ 下的一个文件),注意这个时候要处理一下权限问题,否则用户登陆执行 fetchmail 后由 maildrop 分发到邮箱( /var/spool/mail/vpsee)的时候会出现权限错误(因为 maildrop 没有权限写那个文件):

# touch /var/spool/mail/vpsee
# chown vpsee:vpsee /var/spool/mail/vpsee

$ vi .mailfilter
HOME=/home/vpsee              # 指定 home 目录
DEFAULT=/var/spool/mail/vpsee # 想在哪里保持邮件
logfile "$HOME/.maillog"      # 日志

配置 msmtp 用 SMTP 发邮件:

$ vi .msmtprc
account default
host mail.vpsee.com
from vpsee@vpsee.com
auth off

配置 mutt,在 mutt 配置文件里面指明 msmtp 路径,注意 Ubuntu 和 FreeBSD 的默认安装路径不同(/usr/bin vs /usr/local/bin)

$ vi .muttrc
set realname            = "vpsee"
set from                = "vpsee@vpsee.com"
set use_from            = yes
set envelope_from       = yes
set spoolfile           = /var/spool/mail/vpsee
set sendmail="/usr/bin/msmtp" # for Ubuntu
#set sendmail="/usr/local/bin/msmtp" # for FreeBSD

使用 mutt

执行 fetchmail 收邮件,然后就可以用 mutt 读、写、回复邮件了:

$ fetchmail -v

$ mutt

mutt

在 KVM 上访问 FreeBSD 虚拟机终端

在移植旧的物理服务器到虚拟机的时候还剩一些非 Linux 系统没有移,主要是 FreeBSD 和 Solaris 系统,还有几台 OpenBSD 的,这些系统大部分运行在很古老的机器上,有的甚至比我的 FreeBSD on IBM TP600E 还老,需要问一下管理员这些机器在干嘛,是否能合并到虚拟机,管理员刚好这周请假去了 WWDC 现场。

提到今年的 WWDC,看完发布会视频又要扯一下了,比较激动的是那个 2880×1800 屏幕的 MacBook Pro,码农实在太需要关怀了,任何每天看电脑8小时以上的人都需要好显示器,Life is short,对自己好点,Get a Mac:)

做了 FreeBSD for KVM 的镜像以后需要能在 KVM 上像访问 Linux 虚拟机终端那样访问 FreeBSD 的虚拟机终端,步骤和在 Linux 上差不多。

在 FreeBSD Guest 上配置

登陆 FreeBSD 后添加和编辑 loader.conf 文件:

# vi /boot/loader.conf
console="comconsole"

在 /etc/ttys 最后加上 ttyd0 一行:

# vi /etc/ttys
...
# Serial terminals
#ttyu0   "/usr/libexec/getty std.9600"   dialup   off secure
ttyu0   "/usr/libexec/getty std.9600"   vt100   on secure
...

重启 FreeBSD:

# reboot

确定 virsh edit 有下面这几行:

# virsh edit freebsd
...
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
...

必要时重启 libvirtd:

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]

freebsd console on kvm

在 IBM TP600E 上运行 FreeBSD 7.1

如果非要挑个非 Mac 的话,那就只能是 Thinkpad 了,手上这台 IBM Thinkpad 600E 差不多陪了本人十年,历尽沧桑,最惨的时候可能就是拿它来垫桌子吃火锅了:),笔记本的质量能做成这样,已经服了~。新 Mac 被 LP 抢走后,少了台看信息的机器。昨天把这台不抱希望的本本拿出来点亮,居然还可以显示,光驱、硬盘可以用,除了电池以外其他基本正常,上面还跑着我 n 年前装的 FreeBSD 4.7,密码忘了进不去,重装 FreeBSD 7.1 算了。我打算做个架子把这台机器挂在办公桌旁边的墙上,当作监控用。这样抬头就可以看到各种信息,服务器断了、异常了、过载了就发警报提示。发张照片纪念一下 VPSee 的第一个10年本本:

ibm tp600e

FreeBSD 的安装过程这里就不提了,现在操作系统的安装程序都做得很傻瓜,没有什么问题。不过遇到几个硬件驱动问题需要编译内核解决。

配置内核

拷贝一个内核配置文件出来,然后在上面修改,除去不必要的 USB、不用的网卡、各类不需要的驱动,优化内核配置,最后加上 PCMCIA 网卡(3Com 3C589D)和声卡驱动:

# cp /usr/src/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/TP600E
# vi /usr/src/sys/i386/conf/TP600E

# Display card support
device          agp             # support several AGP chipsets
options VESA
options SC_PIXEL_MODE
options SC_NORM_ATTR=(FG_GREEN|BG_BLACK)
options SC_NORM_REV_ATTR=(FG_YELLOW|BG_GREEN)
options SC_KERNEL_CONS_ATTR=(FG_RED|BG_BLACK)
options SC_KERNEL_CONS_REV_ATTR=(FG_BLACK|BG_RED)
device dpms # DPMS suspend & resume via VESA BIOS

# Sound card support
device          sound
device          snd_mss

# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
device          cbb             # cardbus (yenta) bridge
device          pccard          # PC Card (16-bit) bus
device          cardbus         # CardBus (32-bit) bus

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus          # MII bus support

# ISA Ethernet NICs.  pccard NICs included.
device          ep              # Etherlink III based cards

编译、安装内核

编译和安装内核:

# cd /usr/src

# make buildkernel KERNCONF=TP600E
# make installkernel KERNCONF=TP600E

修改 /etc/rc.conf,加入下面几行后重启系统:

# vi /etc/rc.conf

allscreens_flags="-MODE_278"
pccard_enable="YES"
ifconfig_ep0="DHCP"
hald_enable="YES"
dbus_enable="YES"

# shutdown -r now

重启后,插入 PCMCIA 网卡报错,提示:

pccard0: Card has no functions

估计是不能正确映射内存的原因,加入下面一行就应该可以了:

# vi /boot/loader.conf:

hw.cbb.start_memory="0x20000000" 

# shutdown -r now

如果重启后 dhcp 没有得到 IP 地址,手动运行:

# dhclient

启动 X

startx 启动 X 失败,看日志发现没有找到 neomagic 模块,需要安装 neomagic 驱动(机器在防火墙后面,需要先设代理,然后换个支持 http 下载的 port location,FreeBSD 默认是 ftp 的 port,如果不想每次登录都设 proxy 就把它加到 .cshrc 里面去):

# setenv HTTP_PROXY http://squid.vpsee.com:3128/

# setenv PACKAGESITE http://ftp2.de.freebsd.org/pub/FreeBSD/ports/i386/
packages-7.1-release/

# cd /usr/ports/
# pkg_add -r -v x11-drivers/xf86-video-neomagic-1.2.2_1

安装一个小巧的 X 窗口管理器 Fluxbox:

# cd /usr/ports/
# pkg_add -r -v x11-wm/fluxbox-1.1.0.1_5

# vi ~/.xinitrc
exec xterm &
exec fluxbox

升级系统

下载和安装二进制 FreeBSD base:

# freebsd-update fetch
# freebsd-update install

下载和升级 FreeBSD ports:

# portsnap fetch
# portsnap extract

FreeBSD 上安装配置 Nginx+PHP+FastCGI+MySQL

freebsd

在 VPS 里很少看见 FreeBSD 的踪影,主要原因是因为两大开源虚拟系统 Xen 和 OpenVZ 对 FreeBSD 都不是那么友好:(,OpenVZ 不能支持非 Linux 内核的操作系统,Xen 对 FreeBSD 的支持不太好(也可以说FreeBSD 对 Xen 的支持不好)。最近 VPSee 从 Advantagecom 订了一个 256MB 的 Xen VPS,想在上面试试 FreeBSD 先,Advantagecom 不提供换操作系统的面板,每次都要提交 ticket 换系统好麻烦,而且一个月只能换一次系统。VPSee 打算先用一个月的 FreeBSD,然后再换成 Linux。就目前 VPS 的状况来说,VPSee 还是推荐使用 Linux,对于 VDS 或者自己的服务器来说,Linux 和 FreeBSD 都是很棒的操作系统。

安装所需软件

FreeBSD上 有2种安装软件的方法:一种是二进制安装;另一种是源代码安装(Ports collection)。

二进制安装所需软件:

# /usr/sbin/pkg_add -r -v mysql51-server
# /usr/sbin/pkg_add -r -v nginx
# /usr/sbin/pkg_add -r -v php5
# /usr/sbin/pkg_add -r -v php5-mysql
# /usr/sbin/pkg_add -r -v lighttpd

源代码安装所需软件:

# cd /usr/ports/databases/mysql51-server
# make install clean

# cd /usr/ports/lang/php5
# make install clean

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

# cd /usr/ports/databases/php5-mysql
# make install clean

# cd /usr/ports/www/lighttpd
# make install clean

实际上我们只需要 lighttpd 里面的 spawn-fcgi,所以先把 spawn-fcgi 拷出来再删除 lighttpd。

# cp /usr/local/bin/spawn-fcgi /root/
# /usr/sbin/pkg_delete -v lighttpd-1.4.22
# cp /root/spawn-fcgi /usr/local/bin/spawn-fcgi

配置 MySQL

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf
# chown -R mysql:mysql /var/db/mysql
# /usr/local/bin/mysqld_safe &
# /usr/local/bin/mysqladmin -u root password ‘newpass’

配置 PHP

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

配置 FastCGI

启动 PHP FastCGI:

# /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -f /usr/local/bin/php-cgi

-a 127.0.0.1 : PHP FastCGI 绑定IP地址
-p 9000: PHP FastCGI 指定端口
-u www : PHP FastCGI 用户名
-g www : PHP FastCGI 用户组
-f /usr/local/bin/php-cgi : 指向 PHP5 fastcgi

检查 FastCGI 是否启动:

# sockstat -4 | grep 9000
www      php-cgi    33475 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33474 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33473 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33472 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33471 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33470 0  tcp4   127.0.0.1:9000        *:*

如果不想每次重启 FreeBSD 都打一边上面的命令的话,把下面 PHP FastCGI 启动/自动代码保存到 FreeBSD 的启动目录(/usr/local/etc/rc.d/phpfcgi)里:

#!/bin/sh
# NGINX FastCGI php5 startup shell script
# Feedback 
# http://bash.cyberciti.biz/web-server/fastcgi-php-server-start-stop-script/
# Set ME #
PROVIDES=php-cgi
LIGHTTPD_FCGI=/usr/local/bin/spawn-fcgi
SERVER_IP=127.0.0.1
SERVER_PORT=9000
SERVER_USER=www
SERVER_GROUP=www
PHP_CGI=/usr/local/bin/php-cgi
PGREP=/bin/pgrep
KILLALL=/usr/bin/killall
### No editing below ####
cmd=$1
 
pcgi_start(){
  	echo "Starting $PROVIDES..."
 	$LIGHTTPD_FCGI -a $SERVER_IP -p $SERVER_PORT -u $SERVER_USER -g 
$SERVER_GROUP -f $PHP_CGI
}
 
pcgi_stop(){
	echo "Killing $PROVIDES..."
	$KILLALL $PROVIDES
}
 
pcgi_restart(){
	pcgi_stop
	pcgi_start
}
 
pcgi_status(){
        $PGREP $PROVIDES > /dev/null
	[ $? -eq 0  ] && echo "$PROVIDES running" || echo "$PROVIDES NOT 
running" 
 
}
 
pcgi_help(){
  	echo "Usage: $0 {start|stop|restart|status}"
}
 
case ${cmd} in
[Ss][Tt][Aa][Rr][Tt]) pcgi_start;;
[Ss][Tt][Oo][Pp]) pcgi_stop;;
[Rr][Ee][Ss][Tt][Aa][Rr][Tt]) pcgi_restart;;
[Ss][Tt][Aa][Tt][Uu][Ss]) pcgi_status ;;
*)      pcgi_help ;;
esac

注意要改成可执行文件:

# chmod +x /usr/local/etc/rc.d/phpfcgi

现在可以用 shell 脚本启动并查看 PHP FastCGI了:

# /usr/local/etc/rc.d/phpfcgi start
# sockstat -4 | less

配置 Nginx

打开 nginx.conf 配置 Nginx:

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

user  www;

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /www/vpsee$fastcgi_script_name;
            include        fastcgi_params;
        }

启动 Nginx:

# /usr/local/etc/rc.d/nginx start

如果启动不了,打开 /etc/rc.conf,加入

# vi /etc/rc.conf
nginx_enable="YES"

# /usr/local/etc/rc.d/nginx restart

测试

用文本写个 php 文件,用 phpinfo() 测试一下 PHP 是否可以运行。