“FreeBSD”分类下文章 »

十一月 07

我家里是通过一台FreeBSD拨号上网的,基于某些因素考虑,只需要一个拨号设备,而不需要现在很流行的拨号+路由的集成设备。(我使用单独的无线路由提供网络共享)

在不断尝试过程中,始终觉得D-Link的DSL-2300E是我最喜欢的设备,简单、小巧、快速、稳定。前几天更新设备,新购入一颗DSL-2300E,打开发现新款(型号未变)变得更加小巧,差不多一个拳头大小,和苹果的新款Apple TV接近了。电源也换了,从原来的输出10V变为输出5V,是否也意味着更加节能呢?(非专业人士臆想)哈!

在配备上九州风神的Walkpad 2.0T(可惜已停产)作为冷却器,绝对是完美组合。

D-Link DSL-2300E
dirk 发表于 2010-11-07 星期日
十一月 28

Apache/Subversion: SSL negotiation failed: SSL error: parse tlsext

我的 SVN 服务器升级到 FreeBSD 8.0 Release 之后,原先 Apache + SSL + Subversion 的环境,在客户端(包括 Ubuntu 9.10 和 Mac OS X 1.5.8)做任何 SVN 操作的时候,会得到标题给出的提示。

查了下,是因为 TLSv1 协议的问题,不知是 OpenSSL 的 bug 还是 Subversion 的 bug,总之无法正常工作。

修改 Apache 配置文件,屏蔽掉 TLSv1 加密方式:

SSLProtocol -ALL +SSLv3

SSLProtocol +ALL -SSLv2 -TLSv1

SSLProtocol ALL -TLSv1

反正只要没有 TLSv1 就能正常工作,经测试,暂时还未发现新问题。

dirk 发表于 2009-11-28 星期六
十月 23
GFW

随着被墙的越来越多, 出离愤怒的我 ,也不得不开始查找爬墙的工具。

幸好,国外有不少便宜的 VPS,而我刚好拥有一个;透过VPS,通过 SSH Tunneling,再加上一个好用的代理工具,就可以方便的达到翻墙目的。

首先确保你的 VPS 在墙外,或者你能拥有一个墙外系统的 SSH 帐号。

在你本地系统(或者你的家庭网关?)中使用 SSH 建立一个隧道:

ssh -qTfNnD localhost:8888 username@your.vps.host.name

之后,SSH 会在本地的 8888 端口建立了一个 SOCKS 5 隧道。(桌面系统我只使用 Ubuntu 和 Macintosh,所以,如果你使用 Windows,请自己研究相应的 SSH 客户端。)

在你的浏览器中,设置为 localhost:8888 的 SOCKS 5 代理就可以浏览被墙的网站了。

这种方式,有个缺点是所有网站都会这么绕一大圈,想要只针对被墙的网站才使用此代理,需要一些更加方便的工具。我在 Firefox 下用得就是 FoxyProxy 这个插件,在 FoxyProxy 中建立一个白名单,把我要浏览的被墙网站加到白名单中,符合白名单的就启用通过 VPS + SSH Tunneling 的代理,否则不通过代理直接访问。

可以说是相当完美的解决方案。最后一个有待改进的地方是,每当新发现被墙网站时需要手工加到白名单,有时间的时候,想办法试试能否便捷的白名单快速增加方法。

恩,发个申明:

  • 以上方法仅供学习研究之用,请勿用于“非法”、“不正当”途径,任何后果,自行负责,与本站无关。
  • 本站不提供任何 SSH 帐号服务,请勿索要任何相关信息。
dirk 发表于 2009-10-23 星期五
十月 22

今天升级主 DNS 服务器完成后,从 Home Server 更新动态 IP 到主 DNS 时,发生以下错误:

; TSIG error with server: clocks are unsynchronized
update failed: NOTAUTH(BADTIME)

登上主 DNS 服务器,错误日志如下:

named[629]: client 123.118.7.83#27413: request has invalid signature: TSIG freshd-key: tsig verify failure (BADTIME)
last message repeated 18 times

原来两台机器一直非常正常,升级坏了?

看到 BADTIME,对比了下两台机器时间,发现主 DNS 服务器系统时间错的很离谱,手工执行一下 ntpdate 后重新更新,问题解决。

看来这个 VPS 的时间多少有点问题,重启一下系统,时间设置就出错了。

dirk 发表于 2009-10-22 星期四
十月 21

When Apache web server with SSL is starting up in FreeBSD system, Apache loads succcessfully and web server functioning properly, but the following warning error occurs:

[warn] (2)No such file or directory: Failed to enable the 'dataready' Accept Filter

The resolution to the above problem is to a accf_data module, which function is to prevents the application from receiving the connected descriptor via accept() until data arrives on the connection, into FreeBSD kernel by using kernel linker:

kldload accf_data

To permanently load enable data Accept Filter FreeBSD kernel module (accf_data), add the following line into /boot/loader.conf:

accf_data_load=”YES”

Note: The default settings is located in /boot/defaults/loader.cnf. To see the related settings about accf, use:

grep accf /boot/defaults/loader.conf

which will returns:

accf_data_load=”NO” # Wait for data accept filter
accf_http_load=”NO” # Wait for full HTTP request accept filter
dirk 发表于 2009-10-21 星期三
十月 01

【现象】

Limiting open port RST response from 28 to 10 packets/sec
Limiting open port RST response from 28 to 10 packets/sec
Limiting open port RST response from 27 to 10 packets/sec
Limiting open port RST response from 29 to 10 packets/sec
Limiting open port RST response from 18 to 10 packets/sec
Limiting open port RST response from 84 to 10 packets/sec

【说明】

FreeBSD 中 sysctl 有个 icmplim 变量,缺省值为200。还有个 icmplim_output 控制它是否输出。如果为1,就输出你看到的信息,为0,就没有输出。

在sysctl中如下:

net.inet.icmp.icmplim: 200
net.inet.icmp.icmplim_output: 1

icmplim 的含义好像是规定内核每秒接受 ICMP 包的最大数量。你看到的信息是由内核中的一个函数通过测试每秒接受 ICMP 包的实际最大数量所打印的。

当实际的数量大于 icmplim 时就会打印你看到的信息。84表示当前实际接受的数量,10就是你设置的上限数量。

这种信息只是让你知道系统曾经的状态。你这里的信息意思是:曾经有个时候,你机器中的ICMP不可达包的数量每秒达到了84。

涉及具体的代码如下:

阅读全文»
dirk 发表于 2009-10-01 星期四
九月 04

我现在的工作和生活变得非常依赖网络,一直考虑自己托管一台服务器到机房,一来作为开发用 SVN + Trac 服务器,二来作为数据备份用,恩,三来可以部署开发中的测试站点。但碍于国内的种种限制,多少不太放心,而且,也确实舍不得花那么多钱买个专门的服务器。

前段时间,家里的 ADSL 宽带升级到了 2M,我就开始考虑能不能在家里架一个 Home Server。这样,就可以极大降低成本。

先说说网络出口。我家的 ADSL 是 2M 包月,上行 1Mbps,下行 2Mbps,换算下来,就是下行 256K,上行 128K。对于一般的应用来说,带宽足够了。

再来确定机器。我自己从中关村攒了一台 Intel E5200 + 4G RAM + 1T SATA HD 的小机器,集成显卡(安装 FreeBSD 作软路由,对显卡要求非常低),配了一个爱国者小机箱,然后从淘宝上购买了一块 Intel 双口千兆网卡,一共花了不到 3000 元。双口千兆网卡做软路由真的是非常棒,配合我 D-Link DIR-655 无线路由(也带千兆口,但我只将它作为无限 AP,只有我在家时才开启)真的太爽了。

再说说动态 DNS。我个人有自己的域名,也在国外有一台 DNS 服务器(FreeBSD VPS),所以,我只需要在系统重新拨号更换 IP 之后将相应记录更新到我的 DNS 服务器即可,然后将相应 TTL 设置为 5 分钟,能达到足够的可用性。(国外那台服务器因为配置较低,而且网速不够理想,所以无法替代此 Home Server 地位。)

在持续开了一段时间之后,发现隔几天的下午就无法联网,反复检查后发现是因为天气太热,连续的大数据量传输致使拨号猫太热而失效。本来想学学网上介绍的那样自己买个风扇来 DIY 一个散热设备,但发现电源不好解决,此外 DIY 的外盒(不能太丑)也不好找。后来搜了搜笔记本散热器,发现一款不错的小型散热器: 九州风神的 Walkpad 2.0T ,USB 供电,银白色铝壳,相当满意。从 新蛋 上买了一个(39 一个,超值,可惜新蛋每单限购一个),垫在 ADSL 猫下面,跑了几天,非常之凉快。哈。

最后,再来说说电费吧,平时白天我只需要开启如下设备:ADSL 猫 + Home Server + Walkpad 散热器,测试下来总功耗在 70W 左右,峰值(编译内核时) 90W 左右,这样下来,一年电费不到 500 元。

这样,就兼顾了外网小服务器 + 软路由 + DHCP + 内网文件服务器,绝对是超值的解决方案。哈!

P.S.

  • 如果有人问为啥放弃 D-Link 无线路由器再额外搭建软路由,事实是, FreeBSD + Intel 千兆网卡可以最大程度的实现抢包任务,标称的 2M ADSL 下行应该是 256K,而我这个解决方案,下行往往稳定在 310K,这就是抢包的优势。
  • 曾经考虑过用 Atom 平台做这台机器,虽然功耗更低,但 Atom 平台配置相对还是有点低,如果只做软路由还不错,但拿来做一个常用的家用服务器,还是有点吃力。

Update@2009-09-08 20:57

新蛋上的 Walkpad 2.0T 在我买完第三块后,就撤柜了,哈,看来我秒了尾货啊。铝表面,做工相当不错。现在这个东西,在淘宝上都拿不到那么低的价格。幸啊。

dirk 发表于 2009-09-04 星期五
八月 14

FreeBSD 7.2 下 BIND 在启动的时候系统日志会报告以下错误:

Jul 29 11:58:49 cvsup kernel: Jul 29 11:58:49 \
    cvsup named[51307]: the working directory is not writable

这是由于 /etc/rc.d/named 在启动的时候会根据 /etc/mtree/BIND.chroot.dist 的配置信息进行目录结构和相关属性检查。

上面那个错误是由于 7.2 版本中的 /etc/mtree/BIND.chroot.dist 文件有一个目录所有者错误:

/set type=dir uname=root gname=wheel mode=0755

修改为:

/set type=dir uname=bind gname=wheel mode=0755
dirk 发表于 2009-08-14 星期五
八月 07

PostgreSQL 从 8.3 开始内建了全文检索功能,对于我们来说,只需要再找一个中文分词组件即可利用 PostgreSQL 打造完善的全文检索应用。我选择的是 NlpBamboo 这个分词库。

以下是在 FreeBSD 7.2 + PostgreSQL 8.3 环境下的配置过程(FreeBSD 和 PostgreSQL 相关的安装和设置请自行找资料)。

1、安装 CMake:

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

2、安装 crf++:

cd /usr/ports/science/crf++/
make install clean

3、NlpBamboo 路径比较特殊,建立以下符号链接(其实不是全部需要;或者你偷懒一点,直接拷贝拉倒):

ln -s /usr/local/lib/libcrfpp.a /usr/lib/libcrfpp.a
ln -s /usr/local/lib/libcrfpp.so /usr/lib/libcrfpp.so
ln -s /usr/local/lib/libcrfpp.so.0 /usr/lib/libcrfpp.so.0

4、获取 NlpBamboo:

Google Code 取出 NlpBamboo 代码;或者从 NlpBamboo 下载打包文件。

5、进行 FreeBSD 下的补丁修改:

这里需要注意,由于 NlpBamboo 中的 bamboo 工具用到了 getline 这个函数,但 FreeBSD 默认没有提供,你可以找一个替代品。我比较偷懒,直接把相关代码注释掉了,因为我实际上根本不会在服务器上用这个工具。我都是在本地进行相关训练统计。

这个 nlpbamboo-freebsd.patch(2.0 KB) 是我当前在用的一个 Patch 文件,你可以参考。

6、编译并安装 NlpBamboo:

cd nlpbamboo-read-only # 这里应该是你自己解压或者代码取出后的目录
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=release
make all
make install

NlpBamboo 默认会安装到 /opt/bamboo/ 目录,有特殊要求,自己修改。

NlpBamboo 安装后的目录结构:

  • /opt/bamboo/bin/ : 可执行程序和训练脚本文件
  • /opt/bamboo/etc/ : 配置文件
  • /opt/bamboo/template/ : CRF训练模板文件 (.tmpl)
  • /opt/bamboo/processor/ : processor库
  • /opt/bamboo/exts/ : 扩展接口
  • /usr/lib/ : 动态链接库
  • /usr/include/bamboo/ : C/C++的头文件

7、下载分词库数据文件:

请到 NlpBamboo 下载 index.tar.bz2 或类似文件,解压到 /opt/bamboo/index 目录:

cd /opt/bamboo/
wget http://nlpbamboo.googlecode.com/files/index.tar.bz2
tar -jxvf index.tar.bz2

8、安装中文分词扩展到 PostgreSQL:

cd /opt/bamboo/exts/postgres/pg_tokenize/
gmake install
cd /opt/bamboo/exts/postgres/chinese_parser/
gmake install
touch /usr/local/share/postgresql/tsearch_data/chinese_utf8.stop

9、在需要的数据库中导入分词:

psql -Uddlog
ddlog=> \i /usr/local/share/postgresql/contrib/pg_tokenize.sql
ddlog=> \i /usr/local/share/postgresql/contrib/chinese_parser.sql

10、如果没有错误,你现在可以用以下命令测试了:

psql -Uddlog
ddlog=> SELECT to_tsvector('chinesecfg', '我爱北京天安门');
            to_tsvector
-----------------------------------
 '我':1 '爱':2 '北京':3 '天安门':4
(1 row)

更多关于 NlpBamboo 的资料,可以到 NlpBamboo Wiki 里好好研究一下。

恩,最后,怎么使用,可以参看 PostgreSQL 的帮助文档。或者等有空我写个在 Django 中的使用方法。

动物凶猛,路过注意:

  • 使用 PostgreSQL 8.3 更早版本的同学需要安装 tsearch2 才能使用;
  • 使用 FreeBSD 7.2 更早版本的同学请先升级,NlpBamboo 用到了 7.2 才新增 strndup(3) 函数;
  • 请更新 Ports 到最新版本,某些东西会有一定版本依赖,比如 NlpBamboo 需要 CMake 2.6 以上版本;
dirk 发表于 2009-08-07 星期五
七月 31

当你要管理的服务器不只是一、两台的时候,你会希望能够统一、便捷的管理系统配置文件,对此,可以使用 CVS + CVSup 来实现统一管理和同步。但这种方法只是简单的将文件更新到服务器指定位置,如果你在服务器上做出了实验性修改(没有通过 CVS),或者其他系统管理员修改了配置文件(也没有使用CVS),那么你可能很难处理 CVS 库和实际配置文件的差别。FreeBSD 下有一个 mergemaster(8) 的命令,本身是用于整合更新 FreeBSD 系统升级所需的配置文件的,我们完全可以利用 mergemaster 来实现我们 CVS 库配置文件的整合、更新。

mergemaster(8) 默认是通过 Makefile 来获取需要对比、更新的文件清单,但可以通过直接指定某个目录来确定源文件目录,而源文件目录的结构需要和目的目录结构相同。比如你的配置文件可能包含以下文件:

/etc/rc.conf
/etc/hosts
/etc/ipf.rules
/etc/make.conf
/usr/local/etc/lighttpd.conf
/usr/local/etc/php.ini

那么你需要在源目录中创建相同的目录结构,假设我们使用 /var/run/tmp_root 作为源文件目录,则应该存在以下目录结构:

/var/run/tmp_root/etc/rc.conf
/var/run/tmp_root/etc/hosts
/var/run/tmp_root/etc/ipf.rules
/var/run/tmp_root/etc/make.conf
/var/run/tmp_root/usr/local/etc/lighttpd.conf
/var/run/tmp_root/usr/local/etc/php.ini

然后,使用以下命令进行比对和更新:

mergemaster -r -m /var/run/tmp_root -t /var/run/tmp_root

就此,mergemaster 会自动检查源文件目录中的文件与系统实际目录中的配置文件是否存在不同,如果存在不相同的文件,mergemaster 会将不同部分显示,并让你决定是安装新文件、整合新旧文件或者直接放弃更新。你可以直观的看到你更新了哪些文件,这些文件和实际环境的配置文件又有哪些不同。

注意:

  • 实际操作中,由于 mergemaster 将删除类似 /var/run/tmp_root 的源文件目录,所以你应该使用 shell 脚本根据 CVS 库文件生成一个临时目录,将此目录作为源文件目录传递给 mergemaster;
  • 如果你熟悉 mergemaster 和 Makefile 命令,你可以考虑直接使用 Makefile 指定你需要更新的文件源;
  • 因为 mergemaster 需要进行文件的比对(diff),所以只能处理文本文件,对于二进制文件,这种方法没有意义;
dirk 发表于 2009-07-31 星期五