FreeBSD,dtrace和erlang

因为linux的systemtap和utrace需要自己重新编译linux内核,实在不想折腾。听闻新FreeBSD将全面使用clang替代gcc,在加上FreeBSD最早就有了对dtrace的支持,所以这两天开始了解FreeBSD是怎么回事。

0. 更新机制

许多软件开发都很活跃,发布频繁,所以除非在系统安装刚发布的那段时间,一般从官网下载的光盘都不是最新的软件集。我们可以从FreeBSD官方网站更新这些软件。

可以使用cvsup更新。首先要安装cvsup,一般按照不带GUI的cvsup即可
cd /usr/ports/net/cvsup-without-gui/
sudo make install clean

0.1 ports collection的更新

在/usr/ports目录下有所以FreeBSD官方支持软件的集合,基本是是这些软件的源码(包括文档)的下载地址、FreeBSD平台下针对该软件的补丁等。一般安装后都会有这个目录。

可以通过用cvsup更新这个ports集下的所有软件。

1). 进入配置文件目录
cd /usr/share/examples/cvsup/
修改配置文件:
vim ports-supfile
主要是更新网站地址: 改掉cvsup的镜像地址
*default host=cvsup.cn.FreeBSD.org
要更新的port集合(因为有些集合比如国家相关的软件japanese/german/korea估计永远都用不上)

2). 更新ports集:
sudo cvsup -g -L 2 ports-supfile
耐心等待更新完成。

(然后可以到对应的port目录下看看distinfo)

参考:http://www.freebsd.org/doc/zh_CN/books/handbook/ports-using.html

0.2 源码的更新
在安装时如果原则了带源码的安装,这些源码会安装在/usr/src目录。cvsup也提供了针对这些源码的更新。

1). 进入配置文件目录
cd /usr/share/examples/cvsup/
修改配置文件:
vim stable-supfile
主要是更新网站地址: 改掉cvsup的镜像地址
*default host=cvsup.cn.FreeBSD.org
2). 更新ports集:
cvsup -g -L 2 stable-supfile
耐心等待更新完成。

0.3 用clang编译
修改/etc/make.conf
添加
CC=clang
CXX=clang++
CPP=clang-cpp

# This setting to build world without -Werror:
NO_WERROR=

重建世界
# make buildworld
# make installworld DESTDIR=/usr/obj/clang
# chroot /usr/obj/clang /bin/echo Hello clang world!
Hello clang world!
# chroot /usr/obj/clang /bin/tcsh

用clang重新编译内核
cd /usr/src
make kernel KERNCONF=MYGENERIC INSTKERNNAME=clang
make installkernel KERNCONF=MYKERNEL

1. 常用软件安装


老版本(10.0之前)的FreeBSD用ports用来安装常见软件,在/usr/ports目录下分成几个大类,如sudo程序是在security目录下;tmux在sysutils目录下,vim在editor目录下,bash在shells目录下,git在devrel目录下等等。可以用以下命令搜索软件在那个目录下,例如想安装 ssh-copy-id
sudo make search name=ssh-copy-id
找到对应的port目录,进入后用 make install clean安装

1) 安装bash
在/usr/ports/shells/bash目录下,完了以后运行命令切换shell:
chsh

在~/.profile配置文件中设置shell彩色提示符:
PS1="[\[\033[01;35m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]]$ "



2)安装vim
此外sudo,vim也要自己手动安装。最好装vim-lite,vim的话会把Xorg装上。
vimrc配置文件也要手动安装:
cp /usr/local/share/vim/vim73/vimrc_example.vim ~/.vimrc


3) 安装tmux
tmux的port有点老,默认是安装tmux1.5,要装1.6得用以下命令:
cd /usr/ports/sysutils/tmux
make patch install clean


4) 更新locate数据库:
/usr/libexec/locate.updatedb


5) smb挂载

安装smbclient后,察看smb服务器状态
smbclient -L //10.0.0.4/Share -U bob

如果没有问题就可以挂载smb文件系统了。
sudo mkdir /mnt/smbshare
sudo mount_smbfs -I 10.0.0.4 //[email protected]/Share /mnt/smbshare
出现的输入密码提示是smb访问的,不是sudo的。(两个输入密码提示格式字母大小写都完全一样)

如果出现错误:
mount_smbfs: can't get server address: syserr = Operation timed out
这是忘了加上 -I ip地址参数了。

smb的服务器名字是无所谓的,但是必须有的。比如一个不存在的smb服务器名foo也可以成功挂载(真是吐槽无力):
sudo mount_smbfs -I 10.0.0.4 //bob@foo/Share /mnt/smbshare

6) 其它安装常见问题
另外,删除一个安装软件的命令是:
make deinstall


如果想重新配置make参数:
make config


参考:port官方文档:
http://www.freebsd.org/doc/zh_CN/books/handbook/ports-using.html

java也比较旧了,而且Java的安装也很与众不同,我选的是jdk16。因为版权的原因,安装过程中会有提示需要自己另外下一些jar包,很麻烦,整个过程极其漫长,中间还要你照看着,因为时不时会有对话框要你确认。



FreeBSD 10.0开始提供pkg安装软件,pkg类似linux apt-get。例如安装curl:
pkg install curl



2. 安装带dtrace的erlang

FreeBSD下安装带dtrace的erlang会遇到的问题:
  1. dtrace默认是disable的,老版本的FreeBSD(10.0之前)需要定制dtrace的内核支持;不过10.0之后不需要自己编译内核了。
  2. 虽然有了带dtrace的内核,但是dtrace默认是不加载的,所以make带dtrace的erlang会出错,手工加载命令:sudo kldload dtraceall
  3. FreeBSD自带的make是无法正常工作的,需要用gmake进行编译
  4. 一般处于效率考虑使用gcc进行编译,可以安装gcc4.7,然后指定CC,CXX环境变量分别为gcc4.7,g++4.7



2.1 从源码编译

但是默认安装的FreeBSD也不直接支持erlang的dtrace,在第一步就会出错:
./configure --with-dynamic-trace=dtrace
出错信息如下:
dtrace: failed to compile script emulator/beam/erlang_dtrace.d:
"/usr/lib/dtrace/psinfo.d", line 37: syntax error near "uid_t"
configure: error: Could not precompile erlang_dtrace.d: dtrace -h failed

关键错误信息syntax error "near uid_t" 在FreeBSD的DTrace下有提示:
http://wiki.freebsd.org/DTrace

If D-scripts fail with a message such as syntax error "near uid_t", then you forgot to compile your kernel with gdb(1) debug symbols enabled. Add makeoptions DEBUG="-g" to your kernel config and try again.

所以又回到了原点:还是得重新编译内核。好在FreeBSD重新编译内核比较简单,需要修改的内核编译配置介绍:
http://wiki.freebsd.org/DTrace
支持DTrace需要修改内核的编译参数,这些内核参数的配置文件是[arch]/GENERIC, arch是机器的架构代号,例如amd64
要修改的make.conf文件在/etc目录下

具体见内核编译帮助文档,在这里:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-building.html

过程还是很顺利的。但是每次重启机器后都要求加载dtrace很麻烦,像这样:
sudo kldload dtraceall

在/boot/defaults/loader.conf配置文件中加入:
dtraceall_load="YES"
会省掉这个麻烦。


现在可以了,更激进一点,用clang编译erlang/OTP
CC=clang CXX=clang++ ./configure --with-dynamic-trace=dtrace

但是在make的时候又出错了,
Error expanding embedded variable


这是因为FreeBSD的make和其他系统不一样,得指定用gmake才行,参考http://forums.freebsd.org/showthread.php?t=26303

gmake
sudo gmake install


一切顺利,终于看到了
[wulei@freebsd53:~/otp_src_R15B01]$ erl
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false] [ dtrace]

Eshell V5.9.1  (abort with ^G)
1>


不过用dtrace -l|grep erlang还是看不到erlang的probe。得使用特权启动erlang才行:
sudo erl

现在就可以看到erlang的probe。(真是吐槽无力,为什么Mac OS X上就没有这么麻烦,而且人家4年前就这么使用方便了,现在的ubuntu的systemtap还没有utrace的直接支持)

2.2 port安装

官方维护的port有点老,这里有人维护了一个最新15B01的port,还带支持dtrace:
https://github.com/jj1bdx/erlang-freebsd-port




其它陷阱

用freebsd-update更新系统后,编译的支持dtrace内核可能会被替换。可以用uname -a察看:
FreeBSD freebsd53 9.0-RELEASE-p3 FreeBSD 9.0-RELEASE-p3 #1: Mon Jun 25 20:04:33 CST 2012     root@freebsd53:/usr/obj/usr/src/sys/ MYKERNEL  amd64

所以又得重新编译内核。

3. 编译链接环境设置

自己手工make/install的第三方(动态共享)库缺省都装在/usr/local/lib目录下,头文件在/usr/local/include目录下,和linux没什么不同,诡异的是编译依赖第三方库(如gdal库)的程序时会出现
编译错误:找不到第三方库的头文件
链接错误:找不到第三方库的共享文件
/usr/bin/ld: cannot find -lgdal

当然可以指定头文件和共享库文件搜索路径解决这个问题
gcc test.c -I/usr/local/include -L/usr/local/lib -lgdal

但是通过命令
ldconfig -r
可以看到这个第三方库;
在系统缺省配置文件/etc/default/rc.conf中也可以看到
ldconfig_paths="/usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg"
但就是链接不上,不知道为什么?

要想避免每次编译时输入冗长的搜索路径,我没有找到别的办法,只能为头文件和库文件搜索路径设置环境参数了:
C头文件环境变量是 C_INCLUDE_PATH
export C_INCLUDE_PATH=/usr/local/include
C++头文件环境变量是CPLUS_INCLUDE_PATH
参考这里:http://gcc.gnu.org/onlinedocs/cpp/Header-Files.html#Header-Files

但是与linux不同的时,要设置的共享库文件搜索路径的环境参数是LIBRARY_PATH,而不是LD_LIBRARY_PATH,如下:
export LIBRARY_PATH=/usr/local/lib

参考:http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html

顺便复习一下:http://xahlee.org/UnixResource_dir/_/ldpath.html

结论

要想dtrace,目前linux上很麻烦,systemtap,utrace。。。
FreeBSD可能要方便点,但是整个过程下来,发现FreeBSD也不省心,许多软件的port也比较旧。



最省事的反而是Mac OS X开发平台,但是我的MacBook实在太老了,还是6年前32位时代的机器,不过即使这样用起来除了速度慢夏天热外好像也没啥大的毛病。

猜你喜欢

转载自cryolite.iteye.com/blog/1566769