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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/177080.html
標籤:其他
上一篇:Nginx 回應過濾模塊 ngx_http_addition_module
下一篇:[網路安全]SSH遠程連接
