单机双站配置成功与否的关键在于错开共享资源, KBS 中大部分共享资源如共享
内存的 key 都是可以通过 sysconf.ini 文件进行配置的, 但也有一些是直接写死在
代码里面的, 比如 PUBLIC_SHM 的 key (3700) 和 userd 的端口(60001), 这些就需
要修改源代码了.
单机双站的时候建议使用两个不同的非超级用户来做, 这样在对两个站的控制方
面可以省去很多麻烦, 当然如果你可以轻而易举的查出哪个 bbsd 以及哪些 shm 是哪
个站的, 并且或者手动或者编写强大的脚本来完成希望的操作, 用同一个用户也不是
不可以...
下面假设系统中已经由 bbsorig 用户按默认配置装好了一个 kbs 系统, 而将由
bbs 用户安装另一个 kbs 系统, 需要做如下修改:
1.userd 的监听端口 [默认为 60001]
KBS 代码中的 daemon/miscd.c 和 libBBS/ucache.c 中写死了这个端口, 优雅的
做法是等 acore 什么时候在 default.h 里面 define 一个 USERD_PORT, 不过这
个估计也是奥运前, 目前为了能先跑起来, 要修改如下代码
daemon/miscd.c:367: sin.sin6_port = htons(60001);
daemon/miscd.c:371: sin.sin_port = htons(60001);
libBBS/ucache.c:473: sin.sin6_port = htons(60001);
libBBS/ucache.c:477: sin.sin_port = htons(60001);
libBBS/ucache.c:675: sin.sin6_port = htons(60001);
libBBS/ucache.c:679: sin.sin_port = htons(60001);
行号可能随着 KBS 代码的逐步更新而有所变化, 上面的示例是根据 2006 年 1
月 1 日 23 时的 CVS 代码做出的(下同, 不再复述), 如果不放心, 可以在源代
码目录下执行
$ grep "60001" -Inr .
确认后修改所有的 60001 为 USERD_PORT, 再在站点定制文件 site.h 中加入
#define USERD_PORT 62601
这里的端口号只要不导致冲突即可, 设定一个固定的偏移是比较好的做法, 我比
较喜欢 26 这个数字, 所以设定偏移为 +2600, 呵呵...
2.POP3/POP3S 监听端口 [默认为 110/995]
如果不开设这个服务的话就略过这一步, 两个站都开设的时候要修改站点定制文
件 site.h, 加入
#define POP3PORT 2710
#define POP3SPORT 3595
3.PUBLIC_SHMKEY [默认为 3700]
PUBLIC_SHMKEY 定义于 src/bbs.h,
src/bbs.h:144:#define PUBLIC_SHMKEY 3700
找到之后修改 3700 为 6300 (说过了我这里设定偏移为 +2600, 当然也可以设别
的值), 这步做好了之后就可以编译安装了, 注意两个站的源代码目录和安装目录
是完全分开的, 安装好之后继续下面的修改...
4.SHM KEY
在 $BBSHOME/etc/sysconf.ini 中设置, 默认值为
BCACHE_SHMKEY = 3693
UCACHE_SHMKEY = 3696
UTMP_SHMKEY = 3699
BDIRCACHE_SHMKEY = 3697
UTMPHEAD_SHMKEY = 3698
ACBOARD_SHMKEY = 9013
WWWGUEST_SHMKEY = 4500
MSG_SHMKEY = 5200
SMS_SHMKEY = 8914
BDIRCACHE_SHMKEY = 3697
GAMEROOM_SHMKEY = 3451
GAMEROOM2_SHMKEY = 3452
KILLER_SHMKEY = 9578
KILLER2_SHMKEY = 9579
这里面有些根本用不到或者没作用, 但是为了简便起见都错开比较好, 改为如下
BCACHE_SHMKEY = 6293
UCACHE_SHMKEY = 6296
UTMP_SHMKEY = 6299
BDIRCACHE_SHMKEY = 6297
UTMPHEAD_SHMKEY = 6298
ACBOARD_SHMKEY = 11613
WWWGUEST_SHMKEY = 6700
MSG_SHMKEY = 7800
SMS_SHMKEY = 11514
BDIRCACHE_SHMKEY = 6297
GAMEROOM_SHMKEY = 6051
GAMEROOM2_SHMKEY = 6052
KILLER_SHMKEY = 12178
KILLER2_SHMKEY = 12179
5.MSGQUEUE KEY
同样在 sysconf.ini 中设置, 默认值为
BBSBBSLOG_MSG = 2184
修改为
BBSBBSLOG_MSG = 4784
6.运行第二个 KBS 系统
假设第一个 KBS 系统开设 Telnet 服务于 23 端口, SSH 服务于 22 端口, Web
服务于 80 端口, POP3/POP3S 服务于 110/995 端口, 转信服务于 7777 端口,
以 bbsorig 用户身份启动第一个 KBS 系统后, 以 bbs 用户身份在第二个系统
的安装目录下顺序执行(如果没有编译进相应的模块则略过相应的服务的启动):
bin/miscd daemon
bin/bbslogd
bin/bbsd -p 2623
bin/sshbbsd -p 2622
bin/innbbsd -p 10377
bin/newpop3d
有 Web 服务的时候修改相应的 apache 的 conf/httpd.conf, 设定
Port 2680
后执行
bin/apachectl start
即可...
7.故障检测
可以用 ipcs -m 和 ipcs -q 命令查看 SHM 和 MSGQUEUE 的使用情况, 确认两
个站的资源完全错开了而没有冲突, 用 netstat --inet -plt 命令查看两个站
监听的端口是否冲突, 必要的时候可以使用源代码目录下的
contrib/scripts/clearipc
脚本来清理共享内存, 或者直接在关掉相应的站之后以相应的用户执行
$ ipcs -m | grep "$USER" | \
awk '{system(sprintf("ipcrm shm %s",$2));}'
命令以清理共享内存, 或者执行
$ ipcs -q | grep "$USER" | \
awk '{system(sprintf("ipcrm -q %s",$2));}'
以清理 MSGQUEUE...
由于本人水平十分有限, 也只是昨天刚刚装成了单机双站, 并且两个站的服务类
别差异比较大, 所以这篇概述中的疏漏可能很多, 也许还有不少错误, 还望各位大牛
不吝指正^^
--
修改:etnlegend FROM 59.66.77.163
FROM 59.66.77.163