Tag Archives: freebsd

解决freebsd升级到最新ports遇到的问题

系统环境

uname -a
FreeBSD AN 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Wed Jul 31 16:20:23 CST 2013   amd64

更新系统的ports tree

先su获取root权限:

portsnap fetch
portsnap extract

出错

安装vim:

cd /usr/ports/editors/vim
make install clean

出错:

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

"Makefile", line 137: Malformed conditional (${PYTHON_REL} < 300)
"Makefile", line 142: if-less endif
Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

"/usr/ports/Mk/bsd.sites.mk", line 953: Malformed conditional (!empty(_PERL_CPAN_ID) && ${_PERL_CPAN_FLAG:tl} == "cpan")
Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

"/usr/ports/Mk/bsd.port.mk", line 2877: Unclosed conditional/for loop
"/usr/ports/Mk/bsd.port.mk", line 2877: Unexpected end of file in for loop.

"/usr/ports/Mk/bsd.port.mk", line 6590: Unclosed conditional/for loop
"/usr/ports/Mk/bsd.port.mk", line 6590: Unexpected end of file in for loop.

1 open conditional:
         at line 1177 (evaluated to true)
make: fatal errors encountered -- cannot continue

谷歌查了一下,原因是7.0这个release不是一个正在维护的版本了,更新后的ports tree和当前的版本不兼容。

解决办法

  • 升级当前系统到最新版本
  • 重新恢复port tree到当前对应版本

stackoverflow的一篇帖子给了我灵感,到freebsd的找到了ports tree的官方备份网站找到了压缩包,恢复之: 用root用户下载install.sh和ports.tgz到/root文件夹,执行脚本解压

sh ./install.sh

FreeBSD源代码安装tsung

我之前的一篇文章《FreeBSD安装tsung》介绍过在FreeBSD下用ports安装erlang和tsung,但是FreeBSD里面的软件太古老,很难安装成功,特别是安装java遇到很大的挫折,之后又尝试源代码安装erlang和tsung,发现一般情况下可以去掉java选项,可以使安装过程变得简单很多。

1.OS版本

64位的Freebsd,uname -a命令:

FreeBSD AN 7.0-RELEASE FreeBSD 7.0-RELEASE #2: Fri Apr 11 10:34:32 CST 2014   amd64

2.安装gmake

需要root权限:

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

2.安装erlang

版本:otp-src-R16B03.tar.gz,“gmake install”需要root权限:

tar zxvf otp_src_R16B03.tar.gz
cd otp_src_R16B03 && ./configure --without-javac && gmake && gmake install

3.安装tsung

版本:tsung-1.5.0.tar.gz,“gmake install”需要root权限:

tar zxvf tsung-1.5.0.tar.gz
cd tsung-1.5.0 && ./configure && gmake && gmake install

4.参考文献

FreeBSD安装tsung

1.OS版本

FreeBSD AN 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Wed Dec 12 23:19:45 CST 2012

2.tsung的一些依赖关系

  • Erlang/OTP R12B-5 and up (http://www.erlang.org/download.html). Erlang is now part of fedora and debian/ubuntu repositories.
  • pgsql module made by Christian Sunesson (for the PostgreSQL plugin): sources available at http://jungerl.sourceforge.net/ . The module is included in the source and binary distribution of Tsung. It is released under the EPL License.
  • mysql module made by Magnus Ahltorp & Fredrik Thulin (for the mysql plugin): sources available at http://www.stacken.kth.se/projekt/yxa/ . The modified module is included in the source and binary distribution of Tsung. It is released under the three-clause BSD License.
  • eldap module (for the LDAP plugin): sources available at http://jungerl.sourceforge.net/ . The module is included in the source and binary distribution of Tsung. It is released under the GPL License.
  • mochiweb libs (for xpath parsing, optionally used for dynamic variables in the HTTP plugin): sources available at http://code.google.com/p/mochiweb/ . The module is included in the source and binary distribution of Tsung. It is released under the MIT License.
  • gnuplot and perl5 (optional; for graphical output with tsungstats.pl script). The Template Toolkit is used for HTML reports (see http://template-toolkit.org/)
  • python and mathplotlib (optional; for graphical output with tsung-plotter).

for distributed tests, you need an ssh access to remote machines without password (use a RSA/DSA key without pass-phrase or ssh-agent) (rsh is also supported)

  • bash

一般情况下,我们只需要安装erlang,Freebsd默认没有java解释器,所以需要安装java解析器还有erlang.

3.FreeBSD安装java

有开源的java解决方案,也有oracle的官方版本,详情请看: http://www.freebsd.org/java/ http://www.freebsd.org/java/install.html

这里使用开源的openjdk:

cd /usr/ports/java/openjdk6 
make install clean

4.安装tsung

获得tsung,不需要最新的,用官方推荐的R12B版本就行:

wget http://www.erlang.org/download/otp_src_R12B-5.tar.gz
tar zxvf otp_src_R12B-5.tar.gz
cd cd otp_src_R12B
./configure && make && make install

5.可能会出现的问题

5.1 无法找到java解释器

*********************************************************************
------------------  APPLICATIONS DISABLED  **********************
*******************************************************************

jinterface     : No Java compiler found
odbc           : ODBC library - link check failed

*********************************************************************

需要按照步骤3安装java解释器

5.2 安装openssl出错

bss_dgram.c: In function 'dgram_sctp_handle_auth_free_key_event':
bss_dgram.c:962: error: 'SCTP_AUTH_FREE_KEY' undeclared (first use in this function)
bss_dgram.c:962: error: (Each undeclared identifier is reported only once
bss_dgram.c:962: error: for each function it appears in.)
bss_dgram.c: In function 'dgram_sctp_read':
bss_dgram.c:1053: error: 'SCTP_SENDER_DRY_EVENT' undeclared (first use in this function)
bss_dgram.c:1085: error: 'struct sctp_event_subscribe' has no member named 'sctp_sender_dry_event'
bss_dgram.c: In function 'BIO_dgram_sctp_wait_for_dry':
bss_dgram.c:1544: error: 'struct sctp_event_subscribe' has no member named 'sctp_sender_dry_event'
bss_dgram.c:1595: error: 'SCTP_SENDER_DRY_EVENT' undeclared (first use in this function)
bss_dgram.c:1612: error: 'struct sctp_event_subscribe' has no member named 'sctp_sender_dry_event'
--- Error code 1

Stop in /usr/ports/security/openssl/work/openssl-1.0.1c/crypto/bio.

make -DBATCH install clean
--- Error code 1

Stop in /usr/ports/security/openssl/work/openssl-1.0.1c/crypto.
--- Error code 1

Stop in /usr/ports/security/openssl/work/openssl-1.0.1c.
--- Error code 1

Stop in /usr/ports/security/openssl.
--- Error code 1

Stop in /usr/ports/security/openssl.

去掉STCP的选项:

cd /usr/ports/security/openssl
make config

去掉 []SCTP SCTP protocol support,然后:

make clean
make instal clean

5.3 很多已经安装,需要更新

出错信息类似:

tall'' to upgrade it properly.
      If you really wish to overwrite the old port of devel/libcheck
      without deleting it first, set the variable "FORCE_PKG_REGISTER"
      in your environment or the "make install" command line.
--- Error code 1

安装的时候加入选项FORCEPKGREGISTER=”yes”

make FORCE_PKG_REGISTER="yes" install clean

安装过程可能还会缺少很多软件,很可能需要手工安装。顺便发一下牢骚,freebsd的ports系统真没有gentoo好用。

6.参考文献

这里还教你如何使用tsung

常见操作系统操作静态路由命令

记录一下常见系统设置静态路由的命令,备忘,希望对大家有帮助;注意:以下命令需要root权限。

1.ipv4
1.1 FreeBSD
1.1.1 添加路由
添加一条到网段192.168.2.0/24,下一跳地址是192.168.1.2的静态路由 :

route add -net 192.168.2.0/24 192.168.1.2

添加一条到主机192.168.2.1,下一跳地址是192.168.1.2的路由:

route add -host 192.168.2.1 192.168.1.2

1.1.2 删除刚才添加的路由

route del 192.168.2.0/24
route del 192.168.2.1

1.1.3 显示路由表信息

netstat -r

1.2 linux
1.2.1 添加路由

route add -net 192.168.2.0/24 gw 192.168.1.2
route add -host 192.168.2.1 gw 192.168.1.2

1.2.2 删除路由

route del 192.168.2.0/24
route del 192.168.2.1

1.2.3 显示路由表信息

netstat -r

1.3 windows xp
1.3.1 添加路由

route add 192.168.2.0 mask 255.255.255.0 192.168.0.10

1.3.2 删除路由

route delete 192.168.2.0

1.3.3 查看路由表信息

route print

 

2.ipv6
2.1 FreeBSD
2.1.1 添加路由

route add -net6 2012:2012::0/64 2012:2012::192:168:0:10
route add -net6 -host 2012:2012::192:168:2:1 2012:2012::192:168:0:10

2.1.2 删除路由

route del -inet6 2012:2012::0
route del -net6 -host 2012:2012::192:168:2:1

2.1.3 查看路由表,跟ipv4一样

2.2 linux
2.2.1 添加路由

route -A inet6 add 2012:2012::0/64 gw 2012:2012::192:168:0:10

2.2.2 删除路由

route -A inet6 del 2012:2012::0/64 gw 2012:2012::192:168:0:10

2.2.3 查看路由表

ip -6 route show

2.3 windows xp
有点罗嗦,请看这篇文章:

更详细的语法信息请看下面的参考文献。《WindowsXP下的IPv6配置》

参考文献:
1.FreeBSD手册 http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/network-routing.html
2.linux文档项目 http://tldp.org/HOWTO/Linux+IPv6-HOWTO/
3.MSDN http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sag_tcpip_pro_addstaticroute.mspx?mfr=true
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sag_ip_v6_pro_rt_add.mspx?mfr=true

4.来自百度一篇windows xp配置ipv6的文章,包括路由: http://hi.baidu.com/beimu/item/a2202bd0ea2fbaba33db90b7

深入理解FreeBSD中的TAILQ

工作的主要内容是tcp/ip,平台是FreeBSD,而且在内核态开发,所以很多情况下会涉及内核的一些数据结构和宏,比如说mbuf和TAILQ等。
TAILQ是FreeBSD/linux内核对双向队列操作的一种抽象,抽象程度不亚于C++,能实现操作队列需要的各种操作:插入元素,删除元素,遍历队列等。这个队列的优点是插入元素很快。
这里先回顾一下队列的特点(来自维基百科 http://zh.wikipedia.org/wiki/%E9%98%9F%E5%88%97):

队列,又稱為佇列(英文queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。

FreeBSD中的TAILQ把整个队列头抽象为一个单独的数据结构,我们先看看FreeBSD中的TAILQ相关宏,然后再举例子理解这些宏。
这里用最简单的一个结构体来理解TAILQ,这个结构体中有一个int型整数,还有两个分别指向前方和后方的指针。

1.描述前一个和下一个元素的结构体

458 #define TAILQ_ENTRY(type)                       \
459 struct {                                \
460     struct type *tqe_next;  /* next element */          \
461     struct type **tqe_prev; /* address of previous next element */  \
462     TRACEBUF                            \
463 }

这是TAILQ对两个指向前后两个元素指针的抽象,抽象为TAILQ_ENTRY结构体:tqe_next是指向下一个元素的指针,tqe_prev是一个二级指针,指针变量的地址,是前一个元素的tqe_next的地址,解引用(*tqe_prev)之后就是本元素的内存地址;TRACEBUF是一个调试相关的宏,我们先不管它。举例:
我们声明一个结构体,这个结构体只有一个int型整数,还有前驱和后继指针。

struct int_node{
	int num;
	TAILQ_ENTRY(int_node);
};

宏展开之后就变成:

struct int_node{
	int num;
	struct int_node *tqe_next;  /* next element */ 
	sturct int_node **tqe_prev; /* address of previous next element */
};

例如:

2.队列头

TAILQ把整个队列头单独抽象为一个结构体TAILQ_HEAD,如下:

445 /*
446  * Tail queue declarations.
447  */
448 #define TAILQ_HEAD(name, type)                      \
449 struct name {                               \
450     struct type *tqh_first; /* first element */         \
451     struct type **tqh_last; /* addr of last next element */     \
452     TRACEBUF                            \
453 }

这个宏实际上使用的时候,会展开成为一个结构体,tqh_first是一个一级指针,指向队列中的第一个元素;tqh_last是一个二级指针,它指向最后一个元素中的tqe_next(请参考上面的TAILQ_ENTRY),也就是最后一个元素的tqe_next的地址,指针的地址就是二级指针;TRACEBUF是一个用来调试的宏,不用管它。举例:

声明一个叫做queue_head的队列头:

TAILQ_HEAD(my_int_struct, my_int) queue_head;

宏展开之后就会变成(不管TRACEBUF宏):

struct int_head {
	struct int_node *tqh_first; /* first element */
	struct int_node **tqh_last; /* addr of last next element */
} queue_head;

如图:

用下面的宏初始化这个队列头:

534 #define TAILQ_INIT(head) do {                       \
535     TAILQ_FIRST((head)) = NULL;                 \
536     (head)->tqh_last = &TAILQ_FIRST((head));            \
537     QMD_TRACE_HEAD(head);                       \
538 } while (0)

变成:

3.插入元素

插入元素用TAILQ_INSERT_TAIL宏,由于TAILQ中有一个tqh_last的二级指针,所以插入元素直接插到队尾,仅用O(1)时间。

578 #define TAILQ_INSERT_TAIL(head, elm, field) do {            \
579     QMD_TAILQ_CHECK_TAIL(head, field);              \
580     TAILQ_NEXT((elm), field) = NULL;                \
581     (elm)->field.tqe_prev = (head)->tqh_last;           \
582     *(head)->tqh_last = (elm);                  \
583     (head)->tqh_last = &TAILQ_NEXT((elm), field);           \
584     QMD_TRACE_HEAD(head);                       \
585     QMD_TRACE_ELEM(&(elm)->field);                  \
586 } while (0)

QMD_TAILQ_CHECK_TAIL,QMD_TRACE_HEAD,QMD_TRACE_ELEM这三个宏和调试信息相关和做一些必要的检查,我们可以先不管;这个宏就是在调整相关的指针指向。我们向一个空队列插入两个元素2来理解这个宏:
3.1 580行让新元素的tqe_next指向空,执行完第580行:

3.2 581行让新元素的tqe_prev赋值为tqh_last,也就是指向队列头中的tqh_first的地址,执行完第581行:

3.3 582行让二级指针tqh_last中的内容指向新元素,也就是tqh_first指向新元素,执行完第582行:

3.4 583行,队列头的tqh_last赋值为新元素的tqe_next的地址(指针的地址,二级指针),执行完第583行:
这就是插入2后的整个链表。

4.删除元素

删除元素用TAILQ_REMOVE宏

596 #define TAILQ_REMOVE(head, elm, field) do {             \
597     QMD_SAVELINK(oldnext, (elm)->field.tqe_next);           \
598     QMD_SAVELINK(oldprev, (elm)->field.tqe_prev);           \
599     QMD_TAILQ_CHECK_NEXT(elm, field);               \
600     QMD_TAILQ_CHECK_PREV(elm, field);               \
601     if ((TAILQ_NEXT((elm), field)) != NULL)             \
602         TAILQ_NEXT((elm), field)->field.tqe_prev =      \
603             (elm)->field.tqe_prev;              \
604     else {                              \
605         (head)->tqh_last = (elm)->field.tqe_prev;       \
606         QMD_TRACE_HEAD(head);                   \
607     }                               \
608     *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);      \
609     TRASHIT(*oldnext);                      \
610     TRASHIT(*oldprev);                      \
611     QMD_TRACE_ELEM(&(elm)->field);                  \
612 } while (0)

QMD_SAVELINK,QMD_TAILQ_CHECK_NEXT,QMD_TAILQ_CHECK_PREV,TRASHIT,同样先不管这几个宏。我们从队列中删除一个元素来理解这个宏:
4.1 假设经过上节插入元素2之后,我们用TAILQ_INSERT_TAIL再插入一个元素1,没有删除之前的链表如下图:

现在假设我们删除队列中的第一个元素2

4.2 602和603在调整当前元素的下一个元素的tqe_prev指针,执行完第602行和603行之后:

4.3 608调整当前元素tqe_prev中的内容,执行完第608行之后:

4.4 释放结点2的空间之后,最后的链表:

5.队列中的第一个元素

512 #define TAILQ_FIRST(head)   ((head)->tqh_first)



6.当前元素的下一个元素

591 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)

这个宏比较简单。

7.遍历链表中的每一个元素

用宏TAILQ_FOREACH

514 #define TAILQ_FOREACH(var, head, field)                 \
515     for ((var) = TAILQ_FIRST((head));               \
516         (var);                          \
517         (var) = TAILQ_NEXT((var), field))

这个宏就比较简单了,用临时变量var来遍历链表中的每一个元素。

这些宏就是几个操作TAILQ经常使用的宏,还有一些诸如TAILQ_INSERT_HEAD等宏,类似,请自行看代码,这里就不一一叙述了。这篇文章主要是理解相关的宏和插入删除过程,完整的应用例子请看下面的参考文献。

参考资料:

整理工作中经常用到的一些freebsd命令或者技巧











这里整理一下平日工作中经常用到的一些unix命令,这些命令不是大全,如果你有这样的目的,请看相关手册;因为平台是FreeBSD,所以一些配置文件可能只是它独有的,这篇日志会经常更新。

1.cmd

1.1 chsh -s /usr/local/bin/bash

修改默认shell(FreeBSD),确保你的shell程序路径在/etc/shells中,例如,如果你要把你的shell设置为你默认的shell,示例:

# $FreeBSD: src/etc/shells,v 1.5 2000/04/27 21:58:46 ache Exp $
#
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/sh
/bin/csh
/bin/tcsh
/usr/local/bin/bash
/usr/local/bin/rbash

1.2 fsck -y

磁盘出问题,用fsck修复的时候,会经常询问你是否需要SAVEGE?如果时间长的话,每次都敲YES确认是一件效率很低下的事情,用-y选项让它自动yes;

1.3 call cpureset()

用kgdb调试内核的时候,用这个键进行软重启,这样就不用每次都去手动按那颗重启键了;

1.4 arp -d -a

这条命令是清空freebsd的arp缓存;

1.5 sockstat -4

这条命令用来查看哪个应用程序占用了哪个端口。比如说安装apache的时候,如果出现无法启动、提示端口被占用的错误,就可以用这条命令查看哪个应用程序占用对应端口了;

1.6 netstat -r

用来查看路由表信息

1.7 route add …

用来添加静态路由,具体格式请看手册页面。例子:
添加一条到主机192.168.0.21的路由192.168.0.11:

route add -host 192.168.0.21 192.168.0.11
route add -inet 192.168.1.0 255.255.255.0 172.168.0.1

添加到网段的路由:
ipv6的话,需要添加-inet6选项,例如:

route add -inet6 -host 2012:2013::192:168:0:1

对应的route del也需要-inet6选项

1.8 sh /etc/rc

修改/etc/rc.conf之后,小白经常不知道怎么让它马上生效,最2的办法就是重启系统,这条命令就是用来让修改生效的;

1.9 修改、添加或者删除ip地址,我一般是修改/etc/rc.conf,然后执行第9条命令,格式请看手册,例子:

ifconfigem0=”inet 10.8.1.75 netmask 255.255.255.0″
ifconfigem0alias0=”inet 192.168.0.5 netmask 255.255.255.0″

1.10 /var/tmp/vi.recover

开机启动FreeBSD,有时候会在这行 Recovering vi editor sessions 停住挺长时间,删除这个目录就能解决 /var/tmp/vi.recover

2.Reference

这篇文章会定期更新,更多详细内容请看freebsd的手册:
<a href=”http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/“>http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/</a>

Date: 2013-01-08

Author: User

Org version 7.9.1 with Emacs version 23

Validate XHTML 1.0


FreeBSD 源代码安装samba服务器

关于samba的知识,这里不介绍,请参考维基百科:

http://en.wikipedia.org/wiki/Samba_(software)

http://zh.wikipedia.org/wiki/Samba

 

这里以安装比较稳定的版本3.0.37为例。

1.下载源代码

http://ftp.samba.org/pub/samba/

 

2.解压:tar xvfz samba-3.0.37.tar.gz

3.cd samba-3.0.37/source

4../configure

5.make

6.make install(需要root 权限)

7.配置samba

(1)编辑/etc/inetd.conf文件(需要root权限)

  netbios-ssn stream tcp nowait root /usr/local/samba/sbin/smbd smbd
   netbios-ns dgram udp wait root /usr/local/samba/sbin/nmbd nmbd
   swat stream tcp nowait.400 root /usr/local/samba/sbin/swat swat
注意路径
(2)拷贝配置文件:

cp samba-3.0.37/examples/smb.conf.default /usr/local/samba/lib/smb.conf
(3)编辑配置文件:
security = share
 hosts allow = 192.168.0.1   《—-允许访问的ip地址列表
guest account = root
定义访问的规则
[policy]
   path = /home/……
   public = yes
#   only guest = yes
   writable = yes
   printable = no

图解FreeBSD 7.0使用ports安装samba服务器

1.cd /usr/ports/net/samba34;

2.切换到root用户;

3.make install clean;

4.出现这样的编译选项:

选择需要的编译选项,一般默认就行。然后按:O,注意,不是0

5.配置samba

(1)/etc/inetd.conf 文件

去掉以下三行注释

netbios-ssn stream tcp nowait root /usr/local/samba/sbin/smbd smbd
   netbios-ns dgram udp wait root /usr/local/samba/sbin/nmbd nmbd
   swat stream tcp nowait.400 root /usr/local/samba/sbin/swat swat
(2)samba的配置文件smb.conf:
cp /usr/local/share/examples/samba34/smb.conf.default /usr/local/etc/smb.conf
需要root 权限
配置 smb.conf
更改这几行:

security = share   <—
hosts allow = 192.168.0.2  <—添写哪些IP可以访问samba服务器
guest account = root <–一般用root
然后就添加访问文件夹
[src_policy]
   path = /home/…..   <—允许访问的路径                 
   public = yes    
#   only guest = yes
   writable = yes
   printable = no
(3)启动samba:

/usr/local/etc/rc.d/samba start

(3)更多详细信息请参考FreeBSD的手册: