worker
原理
rcobsworker 和 obs-worker
bs_publish
repoview
bs_sched
指定 OBS 架构
改进
删除 pushd 和 popd 的无用信息
进制 Release 自动改变

worker

原理

默认 $OBS_RUN_DIR 为 /var/run/obs/ ,可以在 /etc/sysconfig/obs-worker 里设置。

通过/proc/cpuinfo判断机器cpu个数为 N ,把 N 条要执行的命令放到 $OBS_RUN_DIR/worker/boot/screenrc 文件里存放,用 screen 一次执行,这样 可以用 screen 在后台查看(screen -r XXX;C-a n/p)。

screenrc (也就是 obs worker 要执行的命令)实例:

screen -t builder3-ia64.koji.turbolinux.com.cn/1 ./bs_worker   --root /dist/abuild/root_1 --statedir /var/run/obs/worker/1 --id builder3-ia64.koji.turbolinux.com.cn/1 --reposerver http://172.16.70.54:6262 --srcserver http://172.16.70.54:6362
screen -t builder3-ia64.koji.turbolinux.com.cn/2 ./bs_worker   --root /dist/abuild/root_2 --statedir /var/run/obs/worker/2 --id builder3-ia64.koji.turbolinux.com.cn/2 --reposerver http://172.16.70.54:6262 --srcserver http://172.16.70.54:6362

rcobsworker 和 obs-worker

/usr/sbin/rcobsworker 启动文件先读取 /etc/sysconfig/obs-worker 配置文 件,如果某些变量没有设置,就自动设置。在 obs-worker 中可以设置的变量包 括:

# 定义临时worker工作目录,默认为/tmp,如果有/BUILD或/abuild就用它们,
# 或者在这里设置
OBS_WORKER_DIRECTORY="/dist/abuild"

# 定义两个资源服务器,默认为localhost:6262和localhost:6362
OBS_REPO_SERVER="172.16.70.54:6262"
OBS_SRC_SERVER="172.16.70.54:6362"

bs_publish

这是发布服务程序,主要包括最后的repodata数据库生成。

repoview

repoview 程序可以帮助我们 html 页面,这些页面的信息由 createrepo 创建的 repodata 数据库得到。

需要在 /usr/lib/obs/server/BSConfig.pm 里面设置 $repodownload 才会有 repoview 步骤。

/usr/lib/obs/server/bs_publish 有下面代码:

 309   if ($BSConfig::repodownload) {
 310     print "    running repoview\n";
 311     qsystem('repoview', '-f', "-u$BSConfig::repodownload/$prp_ext", "-t$repoinfo->{'title'}", $extrep) && print("   repoview failed: $?     \n");
 312   }

如果日志文件 /srv/obs/log/publisher.log 有 repoview 错误,如下:

    running createrepo
    running repoview
   repoview failed: 256

主要原因可能是 createrepo 命令没有生成 sqlite 数据库!可以在 bs_publish 源码修改。

bs_sched

用 rcobsscheduler 脚本启动的实际进程是这个。

指定 OBS 架构

通常在 /etc/sysconfig/obs-server 文件中配置 OBS_SCHEDULER_ARCHITECTURES 变量,这个变量指明包含的架构:

OBS_SCHEDULER_ARCHITECTURES="i586 x86_64 ia64"

在 rcobsscheduler 里面循环用下面命令创建进程:

./bs_sched $i >> "$logdir"/scheduler_$i.log 2>&1 &

这样在运行 bs_sched 进程的系统上才有

# ps aux|grep bs_sched
root     13871  0.0  0.0  61156   756 pts/1    S+   17:43   0:00 grep bs_sched
obsrun   30752  6.0  0.2 116524 39672 pts/1    S    17:42   0:01 /usr/bin/perl -w ./bs_sched i586
obsrun   30753 12.1  0.2 117568 40732 pts/1    S    17:42   0:02 /usr/bin/perl -w ./bs_sched x86_64
obsrun   30754  5.1  0.2 110656 33732 pts/1    S    17:42   0:01 /usr/bin/perl -w ./bs_sched ia64

改进

删除 pushd 和 popd 的无用信息

/usr/sbin/rcobsworker 脚本有些动作不好,比如 pushd 和 popd 使用,如果不 把无用信息输出定向到 /dev/null 中,这些信息容易误导用户。

pushd "$workerbootdir" > /dev/null
popd > /dev/null

"No News is Good News" !

进制 Release 自动改变

/usr/lib/build/substitutedeps 修改 spec 文件,同时包括修改 Release 信息,可以注释掉

117 #  if ($l =~ /^Release:/i) {
118 #    my $oldl = $l;
...
204 #  }

注释掉会产生什么影响,我会继续观察.