domjudge安裝筆記

2020-10-16 20:00:26

故事的開始

緣起

剛剛參加完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。
也可以直接輸入網址https://blog.csdn.net/MarkCoder/article/details/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