domjudge配置xcpc竞赛!踩坑日记(三种部署方式)

前言

最近负责icpc比赛的配置与搭建,因为个人原因让虚拟机突然崩掉了,也不知道为甚么。
也懒得恢复了,之前配的一大堆已经算是前功尽弃了(唉。。无语。。。),正好把一堆配置经验总结一下,从头开始来做一遍妥了。
—————————————————————————————————————
内容包含:
1.配置过程中必须了解的一系列linux指令
2.为什么需要这些配置指令
3.(DOMjudge)三种配置方法的解读与指导
—————————————————————————————————————

一.前置工作

无论是本地部署还是docker部署,首先必须要有的就是宿主机和虚拟机。
宿主机就是你当前正在使用的这个laptop,虚拟机就是你当前使用的laptop里面安装的虚拟机软件。
这里我的宿主机操作系统是Windows 11,虚拟机使用的是VMware

虚拟机软件中需要安装一个Linux系统,一般我们普遍采用的是Ubuntu20.04或是NOI Linux,我这里使用的是NOI Linux
NOI Linux 镜像网址
点击下载即可,这个相当于是定制化的Ubuntu,版本也是是20.04。
要记好这个版本号,因为后面下载一些相关配置需要根据系统版本号下载对应的文件。

1.1 创建虚拟机

在这里插入图片描述
我们选择自定义。
在这里插入图片描述
硬件兼容性选择最高的。
在这里插入图片描述
选择你下载好的NOI Linux镜像iso文件。
个性化Linux过程与位置省略。
处理器数量和处理器内核数量可以根据自身电脑或服务器配置来决定。如果是服务器的话就尽可能往满的填(就是有多少填多少),如果是自身的电脑就选择默认,没有必要开太大。
内存也是一样。

这个后来发现并不是这样的,具体见这篇文章->[]

设置磁盘大小之前的一路默认,磁盘大小要尽可能往大了的填,不管你是在个人电脑上面配置,还是使用服务器进行配置,如果是个人电脑,我建议是50~60GB,服务器建议是使用100GB+(服务器上这个容量可能会有些虚高,因为实际上用不了那么多,但是我还是建议越大越好)
在这里插入图片描述
->
一切准备好直接打开虚拟机。
在这里插入图片描述
等待一段时间就好了,然后我们就进来了,虽然是英文界面,不过无妨,即使没过四级基本上也能看得懂。
在这里插入图片描述

1.2 虚拟机内部空间不足怎么办

可能会出现我选择了默认的硬盘大小结果后续空间不足(这个是一定会出现的,因为20g的空间是不够其他一些东西的安装的,你到某一步可能会反复出现资源拉取失败的情况,这个不是网络问题,单纯就是你的空间不足)。
虚拟机磁盘扩容教程

1.3 虚拟机联网教程

如果你宿主机中ctrl+C复制的内容,到虚拟机内不能直接右键+paste粘贴过来,那么我建议你使用这个虚拟机联网教程,至少我目前使用VMTools感觉挺麻烦的,(不过也不是麻烦的问题,只是因为安装麻烦)你可以在虚拟机内部打开我的这个教程,一键复制粘贴相关指令,要比自己一个一个输入方便的多。
当然如果说你宿主机的内容能够直接paste过来,那就可以忽略这个了。
虚拟机联网超简单视频教程

1.4 良好的习惯

由于我使用的是VMware,VMware有快照功能,这是一个非常好的工具,我建议你隔几步就可以快照保存一次,以便防止一些指令执行/输入错误了,不知道怎么(或是懒得)补救,就可以切换之前的快照回到原来的状态。
如果你有一些“洁癖”的习惯,就比如看不得系统中安装了很多多余的内容,你也可以使用快照回到原来的状态,然后下次执行一些指令时避免安装那些多余的内容。

一些比较大或者重要的节点,你可以把当前虚拟机给备份下来,使用VMware的导出功能,这个主要是相比快照多了一些稳定性。如果你个人电脑的内存空间还是比较大的话,我还是非常建议你这么做的。

1.5 一些你应该会要用到的指令(可跳过)

注意:斜体的是你自己要替换的内容!!!

系统信息:

lsb_release -a(查看ubuntu/操作系统相关属性信息)
uname -a(查看linux内核相关信息)
cat /proc/version(查看linux内核相关信息)
uname -m(查看系统架构)
dpkg --print-architecture(查看系统架构)

编辑器gedit,很方便的文本编辑,支持鼠标点击控制光标,不需要命令控制

gedit filename(使用方法)

编辑器vim,比较通用一些?不支持鼠标点击控制光标,只能通过键盘交互,需要命令来控制文档编辑,但是可以玩出来的花样很多,可自行查询

vim filename(使用方法)
进入vim后输入:set nu(在vim中显示行号)
进入vim后依次输入:i1[ESC]q1yyp[Crtl+a]q98@1(自己试试看是如何一下子生成很多行内容的)

权限用户切换:

sudo -i(普通用户切换到root)
su username(root用户切换回普通用户)
ls /home(查看所有用户)

zip解压缩:

zip -r zipname file1 file2 file3 …(zip递归压缩目录)

(-r表示递归压缩,一般必须要递归压缩,否则文件夹中文件夹的内容他不会给你压缩的)

uzip filename(zip解压)
uzip -q filename(zip解压过程中不显示消息输出)
uzip -d /your_path filename(zip解压并指定解压到哪个目录中)

编译安装三部曲:
统称编译安装三部曲,很多安装包的安装都可以使用这个方法

查找已安装的相关依赖:

apt list --installed | grep package(方法一)
dpkg -l | grep package(方法二)

(对于方法一与方法二,建议package写的时候不必精确去写,使用模糊效果更好,比如寻找“servers-abc-abb-aac”,你使用“apt list --installed | grep ser”或“apt list --installed | grep servers”)

whereis package(方法三)

(这个我不咋用,我个人感觉一般般,找个文件还可以,但是找依赖挺拉跨的,毕竟一般人不会去记忆那么多完整的依赖。。。)

误进入字符输入模式退出的方法:

crtl+c
crtl+z
exit

查看文件内容:

vim/gedit编辑器
cat -n filename(输出文件内容并在左侧标注行号)
cat -n filename | grep keyword(查看文件中某个单词在哪一行)

其他:

ps -ef | grep servicename(查看某个服务是否启动)
sudo apt-cache search package(查找库中相关软件包的信息)
sudo systemctl status mysql(查看mysql是否正在运行)
chown newuser filename(改变文件/目录所属者)
chown newuser:newgroup filename(改变文件/目录所属者与所属组)
gcc cfile.c -o filename(编译c文件)
apt remove
kill(需要以特权执行,不然出现“不允许的操作”)
https://blog.csdn.net/weixin_41010198/article/details/122370405
https://blog.csdn.net/coderder/article/details/78899823
https://www.cnblogs.com/huangjiabobk/p/18093636
https://blog.csdn.net/xb12369/article/details/45192825

1.6 服务器操作的一些东西

scp
ssh
windterm

二.纯本地部署

本地部署要做的事情比较多,要有各种环境以及组件的配置安装。其中环境指的是一些程序运行时所需的依赖,就像你写C代码的时候需要加上头文件一样。相关组件就是所必需的一些服务与程序。
不过麻烦的也就只有(无脑)输入一大堆指令了,其实也挺轻松的。

1. 配置高性能服务器

我们需要一个nginx+php+mysql的架构

1.1nginx部署

使用这个教程即可。
nginx部署

这里可能会存在执行不通的情况,视频没有任何问题,只是因为权限不够的原因(因为视频中是以root身份运行的,而你大概率是以普通用户身份运行),你加一个sudo就可以解决了。

1.2 php+mysql配合搭建

下载PHP:PHP download

再安装PHP的相关依赖库。
nginx+php+mysql配合搭建

这里他重复部署了nginx,你跳过即可,直接从“编译安装php”开始就可以了
不过也有错误or不清楚的地方:

第一处:

这里咱们不用安装那么多,咱们的系统版本号和第二篇文章的版本号有区别,咱的是20.04.1,第二篇文章的是20.04.5,咱们就缺哪个安哪个,它会一个一个报错缺少哪个依赖库,咱们就一个一个跟着安,不要跟着这篇文章上全安装上去了,毕竟少一个是一个,系统里面安装的东西越少越好,刚刚好够用就ok了,杂七杂八的指不定什么时候就出一大堆问题(个人见解qwq)
对了,扒这些依赖库的安装过程是得自己搞的,有点麻烦,不过我后续会补上(现在有点懒,反正后面还得重新再做一遍hhh)

第二处:

这个写入的内容是有问题的,应该写入的是<?php phpinfo(); ?> 这个东西的目的是新建一个phpinfo文件并显示有关当前php的一些基本信息

第三处:
有意思的是,作者没有显示这个要插入到哪里,对,这个是要插入的,而且是不能随便插入的,你vim进去就会明白不知道要放到哪个大括号里面,实际上应该要这样放的(要跟着我的节奏走):
我下面所圈住的地方就是正确的插入位置,nnd,当时看那篇文章写的配置时也是服气,让我好找。。。
在这里插入图片描述

2.3 OK~

部署完成后你就拥有一个高性能服务器的基础了,并且能完整的显示了。

3. domjudge的安装!

现在俺先抛个链接,后续俺把一步步都用自己的语言给补上:点这个

首先下载domjudge
domjudge

点击download

我一般安装都会尽量选择最新的版本,安装版本有的人会选择比较旧的但是稳定的,不过这种事情见仁见智了(我的是8.3.1)(第二次修改,本人老实了哈,因为8.3的版本要求php>=8的版本,但是我的虚拟机明明一直安的是php8.3,也不知道为什么一直用php -v显示的是php7.4,更新也更新不到php8.3,所以我后面下载成了domserver8.1.4了,后面错误的部分会删掉)
在这里插入图片描述
虽然但是,我是真不理解为啥下载镇慢。。。。不过不用管,我们先做其他的。

domserver配置
安装一些依赖:
sudo apt install php-fpm php-gd php-intl php-mbstring php-mysql php-curl php-xml php-zip composer ntp mariadb-server
(这个是官方文档给出的:)
(我没有放进去是因为)
更新:
sudo apt update
继续安装:
sudo apt install mysql-server-8.0
(对了,忘了说了,如果有那种[Y/n]一般就回车就ok了,表示默认,安装的时候回车表示默认yes)

启动mysql服务
service mysql start

domserver安装
拿出我们之前下载的安装包
一般下载会默认下载到download文件夹,我个人喜欢把东西拖到桌面上一通整,但是实际上放到那个/src文件夹下才是好习惯(好像)
在这里插入图片描述在这里插入图片描述
这里我就放桌面上了。
解压:
tar -zxvf domjudge-8.3.1.tar.gz(这里根据自己版本号)
进入domjudge目录:
cd domjudge-8.3.1
编译安装三部曲第一步(./confingure):
./configure --prefix=$HOME/domjudge --with-baseurl=127.0.0.1
它后续会给你报许多错,就像这样:
在这里插入图片描述
这是缺少依赖的原因,不过没有关系,很容易解决的。
在这里插入图片描述
这里用前面提到的指令,发现没有系统内没有安装cgroup。
sudo apt install libcgroup1
只有一个libcgroup1是不行的,还需要一个libcgroup-dev:
sudo apt install libcgroup-dev

ok,显示这个就说明第一步已经ok了
在这里插入图片描述
开始编译安装第二步:
sudo make domserver
//省略了
但是发现中间的输出信息有这样的:
在这里插入图片描述
//
编译安装第三步:
sudo make install-domserver
还要先更新一下时间
不更新时间的话,update有些东西会出错。。。
timedatectl
timedatectl list-timezones
timedatectl set-local-rtc 1
timedatectl set-timezone Asia/Shanghai
date -s “20241110 16:15:00”
这个时间根据自身情况更改。。。要和主机时间一致,如果不一致,拉取服务器的时候会有问题

后面暂时懒得写了,但是为了保持一致性,可以跟着这些文章走(这些都是本地部署的):
本地部署文章(自己要注意里面的ubuntu版本和domjudge组件版本)
domjudge官方文档(纯英的但是挺全的,建议啃一下这个,我一般都会有事没事啃一下这个,一些问题以及基本原理都会说明)
【github上也有一个本地部署的博客,后续我补上】

some suggest:
软件的源建议要换一下,因为可能有时候update软件源的时候会出现速度very slow的情况

1.先备份源列表
/etc/apt/sources.list
sudo cp /etc/apt/sources.list /etc/apt/sources.list_copy
2.再打开sources.list文件修改
(可以用gedit、vim等来修改)
sudo gedit /etc/apt/sources.list
3.换源的相关文章
阿里云官方换源文章
清华官方换源文章
换源帮助博客1
换源帮助博客2
4.试一下怎么样
从下面命令向终端输出的一些信息应该是可以看到我们是换成功的
sudo apt-get update
sudo apt-get upgrade

some situation:
当时好像遇到一个颜色鲜艳的窗口,大概内容是下面这样,还要选择某一行之类的。

install the package maintainer’s version
keep the local version currently installed
show the differences between the versions
show a side-by-side difference between the versions
show a 3-way difference between available versions
do a 3-way merge between available versions
start a new shell to examine the situation

我当时选择的是第二个 “keep the local version currently installed”

当时没有查到这些选项的具体含义,下面是问GPT的结果(不保证正确哈):
install the package maintainer’s version:

选择这个选项会覆盖你当前的配置文件,替换为软件包维护者提供的新版本。
适用场景:你希望使用最新的默认配置,或者你不在意丢失当前文件的自定义修改。

keep the local version currently installed:

保留你当前的本地版本,不会应用新的修改。
适用场景:你对当前的配置进行了重要的自定义,不希望它被覆盖。

show the differences between the versions:

只显示两者的文本差异,以便你了解新版本和当前版本的具体区别。
适用场景:你想先比较版本差异再决定。

show a side-by-side difference between the versions:

以并排的方式显示差异,方便查看对比。
适用场景:你需要详细、直观地查看版本之间的差异。

show a 3-way difference between available versions:

显示本地版本、软件包提供的新版本以及合并后的版本之间的差异。
适用场景:有多版本对比和分析需求时。

do a 3-way merge between available versions:

尝试自动合并本地和新版本的更改。
适用场景:你希望合并新的改动但保留你本地的自定义修改。

start a new shell to examine the situation:

打开一个新的 shell,让你手动操作,例如备份文件或使用其他工具进行对比。
适用场景:你需要更多灵活性和控制来查看和处理文件。

在大多数情况下,默认推荐的选项是 “keep the local version currently installed”,也就是保留当前已安装的本地版本。这是因为系统通常会优先保护用户的自定义配置,以免意外覆盖用户的手动修改。
这个默认行为的逻辑是确保不会丢失任何已经进行的本地定制,同时用户可以在必要时手动审查和应用新的更改。

三. 纯docker部署

纯docker部署的一个最大特点就是需要输入的指令很少,配置也很少。因为东西别人都已经部署好了,而你只需要将别人部署好的东西拉取过来即可。
优点不仅仅是配置方便,而且稳定,因为这都是官方弄好的,比你自己配置的稳定很多,你自己配置的一些地方可能会有疏漏导致运行有问题
这个用来充当校赛是非常不错的,但是省赛及以上的级别需要很多扩展配置,比如打印机之类的,会非常麻烦,而且教程or坑不好找,也许是本人技术能力不过关,docker的水平比较垃圾。。。。(嘤嘤嘤)

不过不用担心,相关配置和脚本以及docker的一些东西已经弄好了,需要则见这篇文章->

简要说明一下纯docker部署的一些特点,前面我已经说了基本的部署是也要分为两层的,即宿主机和虚拟机。如果我们要采用纯docker部署,那么部署是从外到里要分为三层的,宿主机、虚拟机和docker容器。使用“层”这个概念主要是用于表示A和B之间是有隔阂的。A、B两者之间并不是俩互相自由往来的,所以多了一层隔阂要做的事情就会麻烦很多,不仅仅是要做的事会麻烦一些,性能上也会有所折扣。
从宿主机到虚拟机之间是较为方便的,这归功于虚拟机软件的强大,虚拟机软件在两层之间编写了很多可供开放的相关接口,并将其图形化方便人们使用,这使得虚拟机的使用与宿主机基本无差,一系列问题基本上是点点鼠标就能解决,基本上不需要你做太多的配置。
但是从虚拟机到docker就麻烦很多,一个是docker本身就不是图形化的界面,是命令调用;第二个是DOMjudge应该不算很大众的相关docker部署容器,资料很少,而比赛需要个性化的地方很多,这方面的资料很难去找,除非你非常对DOMjudge和docker这两个东西非常熟悉,不然想要自由穿梭在虚拟机软件和docker之间难度会很高(这里就需要一些歪门邪道来达到目的);第三个虚拟机穿入docker多加了一层,复杂度提升,本身比赛部署就是在一个专门的独立的虚拟机系统隔离出来,一般又不会和其他什么的系统共用一个虚拟机,干嘛非得还要再用docker再隔离一遍呢?实在是徒增烦恼(但是配置起来非常的无脑)。

3.1 什么是docker

3.1.1 了解docker

最开始是用这个文章->狂神说docker
这里是用yum+centos,而我们使用的是apt+unbunt。
我这里也有一篇建议的文章,简要有力但是要搭梯子->【】

3.1.2 docker快速上手

注意:容器!=镜像,两者完全不是一个东西
docker的个人相关理解见->【】

删除docker镜像:
docker rmi image image_idimage_id_前三位
删除docker容器:
docker rm container_idcontainer_id_前三位

暴力删除docker镜像:
docker rmi -f image image_idimage_id_前三位
暴力删除docker容器:
docker rm -f container_idcontainer_id_前三位
所谓“暴力”是因为,删除容器时,只能删除以及被“停止”掉的容器,加上“-f”option的意思就是强制执行删除命令了,和rm的option意味差不多。

容器的三种状态
Up:
表示容器正在运行中。当容器启动后,Docker会自动将其状态设置为Up。此时可以使用docker ps命令查看容器的状态。
Created:
表示容器已经被创建,但还未启动。当我们使用docker run命令创建一个新的容器时,Docker会将其状态设置为Created,此时容器的文件系统和元数据已经存在,但容器内部的进程还未启动。
Exit:
表示容器已经停止运行。当容器中的进程停止或者容器被手动停止时,Docker会将其状态设置为Exit。此时可以使用docker ps -a命令查看容器的状态,其中Exited字段表示容器的状态为Exit。

你别看他重复你话,但是这说明执行成功了

3.2 docker的安装

安装推荐文章1->通过阿里云安装docker
注意:step 3 缺少apt update,补上step3才能正常!
安装推荐文章2->安装docker

3.3 docker的换源(必须,不换源拉取不到任何镜像)

换源文章推荐->如何换源?
换成什么样的docker镜像源网站,建议自己搜,有时候一些网站过段时间可能就用不了了,所有网络上一些博客会动态更新“今日可用docker镜像源网站有。。。。”
至于测试该源是否可用,拉一个helloworld过来试一试即可。

3.4 纯docker部署过程

懒得自己专门写了,下面是一些推荐的文章:
docker部署推荐文章1
docker部署推荐文章2

some situation1:
为啥我列了两个文章,是因为第一个有坑,不能跟着把那个端口号为80,会报错,因为80好像给nginx了?还是啥来着,反正我是按照第二个随便整了个12345端口。。。
第一个文章有坑,但是跟着走是完全没有问题的,要注意judgehost配置的时候要替换换那个keykeykey,不然无法启动容器,start完就exit,无法完成测评!

some situation2:
当时拉取镜像的时候经常出现这个,下到一半下不动了,当然前面顺顺利利的,后面就不行了,唉,服了,后面才发现是磁盘空间不足的原因,扩一下磁盘就行了。


实际上是磁盘没有空间了,这个judgehost要2.59个g,但是我当时是只剩2.4个g了,所以老是自动停止,想想也是,明明一直都能好好下载,前面顺顺利利怎么可能突然timeout?

some situation3:
你配置完judgehost后,你一start他就exit,这个是你的相关配置参数有问题,要好好检查自己的配置参数。
https://blog.csdn.net/fengqing5578/article/details/94554897

在外面使用docker内指令
https://blog.csdn.net/liu_chen_yang/article/details/123838136
Linux 中授予普通用户 sudo 权限的正确方法
https://blog.csdn.net/caiziming_001/article/details/138467345
Linux如何创建用户
https://blog.csdn.net/Dontla/article/details/128723451

四. 半docker部署

所谓的半docker部署,就是mysql与domserver使用本地部署,judgehost使用docker部署。其中的难点在于docker部署的judgehost相关参数怎么设置,怎么配置,相关的内容我在网络上也基本没有找到,所以接下来我也仅仅说明与解释这些相关参数,具体怎么配,直接拿前面的用即可。

tips:一般建议domserver和judgehost版本一致,不一致会出现一些莫名其妙的问题,icpc tools也是如此,icpc tools的版本也要选择和domserver和judgehost版本尽量一致的(这里所说的一致是,发布时间一致,因为icpc tools的版本号和后两者不一样)

五. other问题与需求,移步我主页其他文章~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值