剛剛參加完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主要由domserver和judgehost組成
judgehost負責選手們提交的程式碼的執行,並且會執行在chroot環境中。
如果CPU有多個核心,同一個主機可以啟動多個judgehost並繫結不同的核心。
judgehost也可以裝在多臺主機上,通過http(s)來存取domserver。
https://www.domjudge.org/download
在官網下載安裝包並解壓出來
先安裝官網給出的軟體列表
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
我使用了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的初始密碼。
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
domjudge-run用來執行選手提交的程式碼,所有隻需要最少的許可權。
sudo useradd -d /nonexistent -U -M -s /bin/false domjudge-run
多個judgehost似乎需要新增多個user,請自行翻閱官方檔案。
將judgehost安裝目錄下的檔案etc/sudoers-domjudge,複製到根目錄下的/etc/sudoers.d/的路徑即可。
sudo cp etc/sudoers-domjudge /etc/sudoers.d/
可以先進入judgehost的安裝路徑,然後執行上面的bash指令碼。
執行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命令也是一樣。)
sudo gedit /etc/default/grub
開啟grub檔案,找到GRUB_CMDLINE_LINUX_DEFAULT出現的一行,修改位"quiet cgroup_enable=memory swapaccount=1"。
儲存並執行update-grub並重新啟動系統。
可以在judgehost安裝路徑下執行 judge/create_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。
因為judgehost通過http存取到judgeserver,所以我們需要產生一個judgehost的賬號密碼。找到domserver安裝目錄下的etc/restapi.secret檔案。使得domhost安裝目錄下etc/restapi.secret檔案與它相同即可。如果需要新增多個judgehost,具體步驟請翻閱官方檔案。
執行 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標誌,接著在Administrator欄找到config check。
也可以直接輸入網址https://blog.csdn.net/MarkCoder/article/details/localhost/domjudge/jury/config/check。
在configuration check頁面下,綠色的代表已經設定ok。
黃色代表warning,比如題目沒有設定氣球顏色之類的,不改也沒大問題。
紅色代表設定不合理或者不正確,這裡我挑幾個我遇到的設定項在下面簡單介紹。
開啟/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服務。
可以再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比賽的測資,可以供大家試驗。
https://drive.google.com/drive/folders/1q9I8o1v_HEY_-rzy_boflOL_jNx7ODF9?fbclid=IwAR3EhoJBXBijyg0Ecx9yHzQjzVJ7uVASP4CIHg7N5eA_GfWXy1j0jrDt96Q
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