7.0之初体验,部署rails应用关键字: freebsd, rails用Linux作开发时间不短,虽然水平并不高,不过也略有心得.很早就知道FreeBSD,也经常听闻FreeBSD的种种好处,恰逢7.0刚刚Release,所以我也来体验一下.

已经非常适应Ubuntu的DEB包管理系统,用起来非常爽,即便重灌新机器,在保证网络通畅的情况下,很短的时间用apt-get就可以搭建完整的应用平台,让rails,java,php,django等等全跑起来,整个过程可谓非常平滑.

说实话,我个人对BSD的体验远远不及Ubuntu来得那么平滑,顺利,这里我记下BSD的初体验:

FreeBSD是在虚拟机中安装,Host是Ubuntu 7.10,虚拟机是VirtualBox. 首先是为BSD创建VM Client,这里我在Host上添加了一个tap设备作为虚拟网卡提供给VM Client使用,并为在虚拟网卡和Host的物理网卡之间创建路由,好处是可以让Hout跟VM Client双向通讯(如ssh,scp等等),VM Client通过Host的物理网卡透明访问Internet.(tap配置过程略,不在讨论范围)

用FreeBSD的BootOnly CD镜像文件安装最小系统,文件非常小,大概只有34MB左右.安装过程中根据自己实际局域网情况配置网络,采用ftp被动模式通过ftp: //ftp.cn.freebsd.org安装最小化系统,不安装额外软件包,除了启用ssh服务和选则时区外,不起用其他所有服务,重启.至此得到一个最小BSD系统(完整安装过程略,可以google到大把图文过程)

第一次以root用户登录,输入密码后第一件事是创建一个普通用户,用于执行一般任务
Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. # adduser  
# adduser回答一系列问题后,一个新用户建立完毕,这里我建立一个新用户'daniel'.并使用FreeBSD的csh shell.

剩下的就是安装/配置应用程序和服务.FreeBSD提供两种方式安装软件,package和ports,其中package的原理跟 Ubuntu差不多,都是利用命令远程安装预编译的二进制包,而FreeBSD最有特色的就是他的ports系统,这里我重点说ports,因为在FreeBSD上,ports才是王道.怎么理解ports呢?如果站在Ubuntu的角度来看,ports是一个FreeBSD软件仓库的本地镜像,只不过这个镜像只保存了所有的软件的信息和编译用的配置文件,以及软件包依赖信息,如果要安装哪个软件,执行特定的命令,系统会自动到网上抓软件源码和依赖包的源码,用本地配置文件进行编译,安装.

首先是建立这个软件仓库镜像,即ports collection,这里用从FreeBSD 6.0开始引入的portsnap方式建立本地ports,svsup/csup已经不被推荐使用了.创建本地ports的第一步是先配置"去哪里得到软件仓库的镜像",因为访问FreeBSD的官方网站速度实在太慢(我用的是天杀的有线通,sigh~~),修改/etc/postsnap.conf,修改SERVERNAME指向的地址,这里首选安装源是台湾的源,其次是大陆的镜像,据说大陆镜像源里面软件不全,不过我这里访问台湾源速度比较快.Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. SERVERNAME=portsnap.tw.freebsd.org  
SERVERNAME=portsnap.tw.freebsd.org

如果是第一次使用portsnap,需要创建/usr/ports,方法是

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. # portsnap fetch extract  
# portsnap fetch extract

大概需要下载50M左右的数据,创建成功以后则则只需不定期执行更新ports就可以了

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. # portsnap fetch update  
# portsnap fetch update

这 里有个加速ports安装速度的技巧,安装ports时默认的做法是用fetch去访问官方网站并抓软件,首先官方网站太远,速度很慢.其次是fetch 抓package效率不高,可以通过设置安装源到比较近的镜像站点,并换用比较快的wget替换比较慢的fetch或用支持多线程的axel提高下载/安 装速度(小心用axel开太多线程而被封).

修改安装源,检查/etc目录下是否有make.conf这个文件,如果没有可以从/usr/share/examples/etc/make.conf拷贝一份到/etc下面,修改/etc/make.conf,在尾部添加下面几行

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. MASTER_SITE_BACKUP?= \  
  2. ftp://freebsd.csie.nctu.edu.tw/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR} \  
  3. ftp://ftp.cn.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \  
  4. ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/  
  5. MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}   
MASTER_SITE_BACKUP?= \ ftp://freebsd.csie.nctu.edu.tw/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR} \ ftp://ftp.cn.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \ ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}

修改完毕安装源后开始安装程序,首先要安装的程序是"sudo",是为了方便让普通用户可以通过ssh登录BSD后可以用root用户身份执行命令,后面的安装过程均通过普通用户完成,尽量不使用root用户.

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. # cd /usr/ports/security/sudo  
  2. # make install clean  
# cd /usr/ports/security/sudo # make install clean

在BSD上用ports安装软件全部遵循这一模式,进入到/usr/ports/somepackage,执行"make install clean"然后就可以去喝杯茶,BSD会帮你搞定一切.

装完软件有个小技巧,每个软件安装完毕后执行一次rehash命令(csh shell,如果是sh shell则用hash -r),用以刷新环境变量,这时新安装的软件马上被加载到系统命令路径,软件就马上可用了.

用visudo配置sudo用户权限,添加一个普通用户可以执行sudo的能力,这里我加入'daniel'这个用户,而且我比较懒,设置为执行sudo不需要密码验证用户,添加一行

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. daniel ALL=(ALL) NOPASSWD: ALL  
daniel ALL=(ALL) NOPASSWD: ALL

好的,现在可以通过Host的终端ssh到BSD服务器了,以后所有操作均通过ssh远程执行

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. $ ssh daniel@vm_clent_ip_address  
$ ssh daniel@vm_clent_ip_address

现在我们需要安装wget,为了加速其他的ports的安装

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % cd /usr/ports/ftp/wget  
  2. % sudo make install clean   
% cd /usr/ports/ftp/wget % sudo make install clean

安装完毕,rehash,配置用wget来作为安装ports的下载工具,编辑/etc/make.conf,添加下面两行

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. FETCH_CMD=wget -c -t 1  
  2. DISABLE_SIZE=yes  
FETCH_CMD=wget -c -t 1 DISABLE_SIZE=yes

如果安装了/usr/ports/ftp/axel,那么配置跟wget差不多

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. FETCH_CMD=axel -a  
  2. DISABLE_SIZE=yes  
FETCH_CMD=axel -a DISABLE_SIZE=yes

===== 安装 & 部署rails应用 =====

安装ruby + rubegems + 相关依赖包Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % cd /usr/ports/devel/ruby-gems  
  2. % sudo make install clean  
  3. % rehash  
  4. % sudo gem install rails  
  5. % rehash  
% cd /usr/ports/devel/ruby-gems % sudo make install clean % rehash % sudo gem install rails % rehash安装mongerl,mongrel_clusterRuby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % sudo gem install mongrel mongrel_cluster  
% sudo gem install mongrel mongrel_cluster

安装Sqlite3数据库 + sqlite3-ruby驱动:

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % cd /usr/ports/databases/rubygem-sqlite3/  
  2. % sudo make install clean  
% cd /usr/ports/databases/rubygem-sqlite3/ % sudo make install clean

安装MySQL:

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % /usr/ports/databases/mysql51-server  
  2. % sudo make install clean  
  3. % sudo mysql_install_db  
  4. % sudo chown -R mysql:mysql /var/db/mysql/  
  5. % sudo /usr/local/bin/mysqld_safe -user=mysql &  
  6. % sudo su  
  7. # echo 'mysql_enable="YES"' >> /etc/rc.conf  
  8. # exit  
  9. % sudo cp /usr/local/share/mysql/my-medium.cnf /var/db/mysql/my.cnf  
% /usr/ports/databases/mysql51-server % sudo make install clean % sudo mysql_install_db % sudo chown -R mysql:mysql /var/db/mysql/ % sudo /usr/local/bin/mysqld_safe -user=mysql & % sudo su # echo 'mysql_enable="YES"' >> /etc/rc.conf # exit % sudo cp /usr/local/share/mysql/my-medium.cnf /var/db/mysql/my.cnf

scaffold测试

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % rails demo  
  2. % cd demo  
  3. % ./script/generate scaffold book title:string author:string  
  4. % rake db:migrate  
  5. % ./script/server   
% rails demo % cd demo % ./script/generate scaffold book title:string author:string % rake db:migrate % ./script/server

顺便说说FreeBSD的package 方式安装软件吧,这个包管理系统跟Ubuntu的apt-get是最接近的.都是直接下载,安装预编译的二进制软件,因为预编译的二进制软件一般采用比较 保守的配置选项,所以在效能上比不上ports本机自动下载源码并在本机编译出来的软件.同样,用package安装软件也有将源服务器设置为比较近的镜 像服务器来加速的办法.

首先查看当前的shell是哪个版本,FreeBSD提供了几种默认的shell,一般是sh或者csh/tcsh,查看方法是

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % echo $SHELL  
% echo $SHELL

如果是sh shell,编辑~/.cshrc,在尾部插入

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. setenv PACKAGEROOT "ftp://ftp.freebsdchina.org"  
setenv PACKAGEROOT "ftp://ftp.freebsdchina.org"

如果是sh shell,编辑~/.shrc,在尾部插入

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. export PACKAGEROOT="ftp://ftp.freebsdchina.org"   
export PACKAGEROOT="ftp://ftp.freebsdchina.org"

安装package的一般方法是

Ruby代码 FreeBSD  7.0之初体验,部署rails应用转载]_#Freebsd
  1. % pkg_add -v -r packagename  
% pkg_add -v -r packagename

说说FreeBSD有 点不爽的地方,更新portsnap太慢,尤其是在第一次,国内暂时找不到稳定高速的源服务器,环顾一周,人们大多选则台湾,日本的源服务器.抱怨源不够 快,不够多,跟新慢的比比皆是.按说portsnap比cvsup要快多了,但是首次下载量也要50MB以上,解压缩后将近 300~400MB,算上跨国际网络传输,情况就更加糟糕了,FreeBSD将ports的 配置信息完整的保存在本机上,对比Debian/Ubuntu的做法,只将源服务器的软件库索引保存在本地,一台新灌的机器,稍加配置,一组apt- get命令就齐活了,第一次更新本地索引大概只4~5MB左右,国内电信,网通,铁通,教育网已有不少稳定快速的源服务器.源里面的软件经过精心维护/测 试,二进制包下载安装快速,安全补丁跟新及时,缺点是没有本地编译带来的性能优势,维护也比较容易.如果不是在大规模计算密集型的场景中,要榨干硬件每一 点资源,硬件负载还有那么多一丁点富裕的情况下,我更加偏向选用这种基于DEB包管理的系统.使用FreeBSD过程中,可以亲身体验了一回那种一切皆从源码编译的快感,耗费的时间确相当可观,人生苦短,多享受生活吧.我更认同了一次编译,众人分享的二进制包管理模式.

========== 后记 ==========
VirtualBox对FreeBSD的支持还存在写bug

总是随机出

sigreturn: eflags = 0x80203

sigreturn: eflags = 0x80247

sigreturn: eflags = 0x80282

console被锁死了,只能通过另外一个终端ssh上去BSD,杀死进程或者执行reboot重启

这个bug已经在VirtualBox网站上被确认了,希望VirtualBox被SUN收购后能做的更好