domjudge安装笔记 by markcoder 2020/10/15
- 故事的开始
-
- 缘起
- 意外
- 结果
- 安装环境
- domjudge组成
- domjudge安装
-
- 下载
- domserver
-
- 依赖软件
- 检查是否满足安装环境
- 开始安装
- 配置数据库
- web服务器配置
- 检查安装是否成功
- judgehost
-
- 依赖软件
- 安装
- 添加user
- 配置sudoer权限
- 安装chroot环境
- 配置cgroups
-
- 添加cgroups开机自启
- 修改 rest 文件
- 启动judgedaemon
- domjudge配置
-
- 检查配置
- Mysql配置
- php配置
- 题目上传
-
- topc2020比赛资料
-
- checker
-
- 关于批改的执行
- 尾记
- 搭建完成的网址:
- 参考:
故事的开始
缘起
刚刚参加完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
依赖软件
先安装官网给出的软件列表
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开机自启。
//如果只有一台judgehost,并且之前添加的user名称是domjudge-run,需要自行修改domjudge-judgehost.service文件,将start一行后面的0删掉。
到这里我们已经完成了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。如果是在terminal中,使用vim可以直接输入 /加内容查找。)
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。
尾记
附上安装成功后的图片
再次感谢老师对我的帮助!
搭建完成的网址:
http://www.mjudge.net/domjudge/public
//因为搭建在google cloud上,大陆可能需要科学上网。
参考:
https://www.domjudge.org/docs/manual/7.3/index.html
https://www.runoob.com/linux/linux-tutorial.html