domjudge安装笔记

故事的开始

起因

刚刚参加完TOPC比赛2020 ICPC Asia Taiwan Online Programming Contest。赛前豪言壮语,“什么他娘的国立大学,老子打得就是国立” ,赛后再一次被虐的怀疑人生。
比赛时使用的domjudge平台,赛后主办方公开了比赛测资。故想着自己搭建一个domjudge平台,供自己和其他同校选手复盘使用。

意外

前前后后一共从头开始了四次,作为一个一边查linux指令一边摸索着安装的弱鸡,一度想要放弃。
第一次安装:突然停电,文件损坏,一切归零~~(台湾用爱发电名不虚传 )~~ 。
第二次安装:发生了包依赖错误,想着卸载出现错误的软件重装,就下了autoremove命令。然后就看到一个个图标逐渐消失,最后连记事本也没剩下…(安装十年功,卸载十秒钟! )
第三次安装:再一次停电~~(祭央乂的用爱发电大队?! )。~~
经过三次血泪历程,老老实实使用虚拟机快照,大家切记要备份,都是血与泪的教训。
第四次安装:卡在建立judgehost的chroot环境。最后发现是ubuntu版本的问题,重新换了ubuntu 18.04之后解决。

结果

花了7天的时间,终于搭建完domjudge。感谢导师对我的全力帮助和教导!

安装环境

virtual box 4GB内存 50GB硬盘
ubuntu 18.04 LTS
domjudge 7.3

一开始本着用新不用旧的原则,使用了ubuntu20.04,结果卡在judgehost的chroot环境的安装。
在安装chroot环境时会出现包依赖错误,翻阅很多了debootstrap和domjudge的相关资料,未找到具体原因。

w: Failure while configuring base packages .This will be re-attempted up to five times .w: See /chroot/ domjudge 1 debootstr ap/ debootstrap.log for details (possibly the package dconf-service is at fault )

W: Failure while configur ing base packages.This will be re- attempted up to five times.w: See /chroot 1 domjudge/ deboots tr ap/debootstrap.log for details (possibly the package dconf-service is at fault)

w: Failure while configuring base packages .This will be re-attempted up to five times.w: See /chroot 1 domjudge/ deboots tr ap/debootstrap.log for details (possibly the package dconf-service is at fault )

W: Failure while conf iguring base packages. This will be re- attempted up to f ive times .w: See /chroot/ domjudge 1 debootstr ap/ debootstrap.log for details (possibly the package dconf-service is at fault)

W: Failure while configuring base packages .This will be re-attempted up to five times .W: See /chroot/ domjudge/ debootstrap /debootstrap.log for details (possibly the package dconf-service is at fault )
4 dpkg: error processing package sof tware- proper ties-common ( --configure):
5 dependency problems - leaving unconf igured
бЕггогѕ wеrе еnсоuntеrеd whіlе рrосеѕѕіng:
7 dconf -service
8 dconf - gsettings- backend : amd64
9 gsettings desktop- schemas
0 glib- networking: amd64
.libsoup2 4- 1: amd64
2 libapps tr eam4 : amd64
3 packagekit
software -proper ties - common

解决:judgedaemon启动时会调用chroot-startstop.sh来check chroot是否安装完整。经试验,直接把check中的验证改成true,可以成功进入chroot环境,尝试submit了一道题目(使用C++),也可以成功批改,但因为chroot没有安装完整,需要手动进入chroot环境补上所有剩下的安装。
最终解决办法:改使用ubuntu18.04。安装一起顺利,未出现问题。

domjudge组成

domjudge主要由domserver和judgehost组成
judgehost负责选手们提交的代码的执行,并且会运行在chroot环境中。
如果CPU有多个核心,同一个主机可以启动多个judgehost并绑定不同的核心。
judgehost也可以装在多台主机上,通过http(s)来访问domserver。

domjudge安装

下载

https://www.domjudge.org/download
在官网下载安装包并解压出来

domserver

依赖软件

先安装官网给出的软件列表

扫描二维码关注公众号,回复: 11925312 查看本文章
sudo apt install acl zip unzip mariadb-server apache2 \
      php php-fpm php-gd php-cli php-intl php-mbstring php-mysql \
      php-curl php-json php-xml php-zip composer ntp

检查是否满足安装环境

可以先执行如下脚本。

./configure && make && make install

一般会还有几项缺少的软件,按照提示,缺哪个装哪个即可。

开始安装

./configure --prefix=$HOME/domjudge
make domserver
sudo make install-domserver

$HOME/domjudge可以换成自己想安装的路径。
注意linux的路径名是区分大小写的,HOME要大写,(微软罪恶滔天)
./configure 可以加上参数

--with-base-url=http://xxx.xxx.xxx.xxx/

配置数据库

执行 bin/dj_setup_database

dj_setup_database genpass
sudo dj_setup_database -u root -p install

web服务器配置

我使用了apache,使用nginx请查阅官网的配置说明。

ln -s $HOME/domjudge/domserver/etc/apache.conf /etc/apache2/conf-available/domjudge.conf
ln -s $HOME/domjudge/domserver/etc/domjudge-fpm.conf /etc/php/7.3/fpm/pool.d/domjudge.conf
a2enmod proxy_fcgi setenvif rewrite
a2enconf php7.3-fpm domjudge
service php7.3-fpm reload
service apache2 reload

$HOME/domjudge/domserver是我们domserver的安装目录,注意自行替换。
另,注意查看php的版本,并替换上面的7.3。

检查安装是否成功

我们现在可以在浏览器中输入localhost/domjudge/pulic进入domjudge的web。
domserver的安装目录下etc/initial_admin_password.secret文件中有admin的初始密码。

judgehost

依赖软件

sudo apt install make sudo debootstrap libcgroup-dev lsof \
      php-cli php-curl php-json php-xml php-zip procps \
      gcc g++ default-jre-headless default-jdk-headless \
      ghc fp-compiler

先跑官网给出的列表,不够等下再补。

安装

./configure --prefix=$HOME/domjudge
make judgehost
sudo make install-judgehost

添加user

domjudge-run用来执行选手提交的代码,所有只需要最少的权限。

sudo useradd -d /nonexistent -U -M -s /bin/false domjudge-run

多个judgehost似乎需要添加多个user,请自行翻阅官方文档。

配置sudoer权限

将judgehost安装目录下的文件etc/sudoers-domjudge,复制到根目录下的/etc/sudoers.d/的路径即可。

sudo cp etc/sudoers-domjudge /etc/sudoers.d/

可以先进入judgehost的安装路径,然后执行上面的bash脚本。

安装chroot环境

执行judgehost安装目录下的 bin/dj_make_chroot

sudo bin/dj_make_chroot -d chroot/domjudge

-d chroot/domjudge可以省略,默认就是此路径。
安装完成后可以通过 lib/judge/chroot-startstop.sh check来检查是否安装完整。
可以执行bin/dj_run_chroot来进入chroot环境。(似乎直接执行chroot命令也是一样。)

配置cgroups

sudo gedit /etc/default/grub

打开grub文档,找到GRUB_CMDLINE_LINUX_DEFAULT出现的一行,修改位"quiet cgroup_enable=memory swapaccount=1"。
保存并执行update-grub并重启系统。
可以在judgehost安装路径下执行 judge/create_cgroups来启动cgroups。

添加cgroups开机自启

首先要把service文件复制到系统目录下去。
否则会出现类似的错误提示。

Failed to enable unit: Unit file create-cgroups.service dose not exist.

奇怪的是官方的安装文档没有给出这个步骤。在我查阅了很多资料之后,自己悟到了,(官方或许觉得这个步骤就和开机一样大家都会不需要写)
首先进入domjudge的安装目录下,找到lib文件夹。
把lib文件夹下的lib/systemd/sytem/下两个service文件复制到系统根目录。(还有一个service文件是后面judgedaemon要用到的,这里就先一并复制。)

sudo cp lib/systemd/system/* /lib/systemd/system/

然后启动服务

sudo systemctl enable create-cgroups --now

之后开机就会自动启用cgroups,不需要每次都手动去执行judge/create_cgroups。

修改 rest 文件

因为judgehost通过http访问到judgeserver,所以我们需要产生一个judgehost的账号密码。找到domserver安装目录下的etc/restapi.secret文件。使得domhost安装目录下etc/restapi.secret文件与它相同即可。如果需要添加多个judgehost,具体步骤请翻阅官方文档。

启动judgedaemon

执行 bin/judgedaemon

sudo systemctl enable domjudge-judgehost
sudo systemctl start  domjudge-judgehost

也可以通过上面的脚本启动服务,可以让daemon开机自启。

到这里我们已经完成了domjudge的安装。下面我们需要使用admin账号登陆localhost/domjudge/pulic,去完成剩下的配置。

domjudge配置

检查配置

在登陆后点网页左上角的DOMjudge标志,接着在Administrator栏找到config check。
也可以直接输入网址localhost/domjudge/jury/config/check
在configuration check页面下,绿色的代表已经配置ok。
黄色代表warning,比如题目没有设置气球颜色之类的,不改也没大问题。
红色代表配置不合理或者不正确,这里我挑几个我遇到的配置项在下面简单介绍。

Mysql配置

打开/etc/mysql/conf.d/mysql.cnf文档

sudo gedit /etc/mysql/conf.d/mysql.cnf

复制下面的内容
[mysqld]
max_connections = 1000
max_allowed_packet = 20MB
innodb_log_file_size = 90MB
这几项配置会因为实际题目的不同(如测资大小,测资笔数)有不同的要求。
所以建议再添加完成题目之后,再回到config check页面检查一遍,按照给出的要求修改即可。

因为我是用的是MariaDB,所以还需要修改/etc/mysql/mariadb.conf.d/50-server.cnf文件中的max_allowed_packet值。

sudo systemctl restart mysql

保存退出,重启mysql服务。

php配置

可以再configuration check页面的右边 system information一栏中,找到PHP:所在的一行,后面有一个蓝色的i。
点击进入页面找到Loaded configuration File一栏可以看到php.ini配置文件所在的位置。
我这边的路径为/etc/php/7.2/apache2/php.ini

我们根据config check给出的要求修改以下的几项即可。
max_file_uploads 100
upload_max_filesize 128M
post_max_size 128M
memory_limit 512M
(依实际情况不同。建议用gedit打开直接ctrl+F搜索需要修改的key。)

sudo systemctl restart apache2

然后保存文档并重启php

题目上传

在web端,进入到problems下,直接上传各个题目的zip档即可。
档案的格式可以参考官方文档。

topc2020比赛资料

这里有topc2020比赛的测资,可以供大家试验。
https://drive.google.com/drive/folders/1q9I8o1v_HEY_-rzy_boflOL_jNx7ODF9?fbclid=IwAR3EhoJBXBijyg0Ecx9yHzQjzVJ7uVASP4CIHg7N5eA_GfWXy1j0jrDt96Q

checker

topc2020中有三题是动态批改,可以在web找到executales中上传,并选择type为compare。
然后回到题目的配置中来,将这三题的compare修改为对应的compare。

关于批改的执行

三个verifyer文档使用了kotlin语言。所以还需要安装kotlin。
本以为这个过程是运行在judgehost的chroot环境里。去在chroot下安装kotlin,折腾了很久。
翻阅了官方文件,只有学生缴交的代码会放到chroot中执行,并且编译也是在外面的环境中执行的,编译完之后才会丢去隔离环境跑。(很合理,裁判自己写的verifyer没必要丢去隔离环境。)
为了使用这几个checker,我们只需要在真实环境中安装kotlin就行了(当然你可以选自己用C或者其他语言重写checer)。

最后,如果使用snap安装kotlin会出现权限错误,具体原因没找到。换sdkman安装kotlin之后问题解决。
安装完kotlin之后,还需要自己动手修改checker文件中的环境变量PATH。

尾记

附上安装成功后的图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再次感谢老师对我的帮助!

参考:

https://www.domjudge.org/docs/manual/7.3/index.html
https://www.runoob.com/linux/linux-tutorial.html

猜你喜欢

转载自blog.csdn.net/MarkCoder/article/details/109097810