2019 ICPC 沈阳站现场赛环境配置记录

又到了ICPC现场赛的准备阶段,每一年学长们都会带着下一届即将接手的学弟学妹们熟悉相关配置,自己的身份也从去年的“学弟”变成今年的“学长”了。
刚接到选手环境配置和DOMjudge这两个任务时,心里还是有点慌的,担心自己一个人做不好,于是向公司请了十多天假准备专心做这个,直到已经在北京读研的黑猫和yuki学长说要回来帮忙,还在QQ群里分享了一些十分有用的资料,自己才稍微放心了一点。后面又有学弟学妹配置DOMjudge非常棒的表现,在上海实习的Bittersweet学长的突然出现,本次现场赛最终的比赛环境还是比较令人满意的。

时间轴

11.15 周五
    12:30  ==>  到达南湖校区体育馆,选手席布置完毕但服务器还没到,前往科学馆等待。
    15:30  ==>  回到体育馆,开始配置网络部署服务器,并试装选手机。
    18:00  ==>  第一台选手机安装了一个半小时,感觉是无用包太多,还需要精简。开始批量安装所有选手机。
    22:00  ==>  选手机分两批全部安装完毕,学弟学妹们在服务器上配好了judgeserver和judgehost。
11.16 周六
    01:20  ==>  在多核服务器上又增加了judgehost,热身赛题目测试完毕,队伍密码导出。
    13:00  ==>  到达体育馆,检查比赛环境。
    14:20  ==>  热身赛开始,有二十台左右选手机未知原因锁屏,告诉志愿者重启电脑会自动登录。
    14:30  ==>  多个队伍反馈缺少gedit,临时开启代理服务器批量安装。
    14:40  ==>  接到vscode默认插件过多,快捷键不常用的反馈,寻找解决办法。
    14:45  ==>  个别电脑使用clion过程中卡死,重启解决。
    14:50  ==>  有队伍使用codeblocks和pycharm遇到问题,协助解决。
    15:00  ==>  部分队伍键盘与其它选手机键盘不同,请求更换,明天从另一校区带备用键盘过来。
    15:10  ==>  现场基本稳定,Bittersweet学长帮忙配置外榜,黑猫学长尝试配置直播和滚榜。
    17:00  ==>  热身赛结束,复原选手机环境,删除vscode部分插件,配置pycharm。
    21:00  ==>  晚饭回来,尝试寻找锁屏原因,未果。调整网络结构,方便直播。
    22:00  ==>  出题组在现场DOMjudge上验题,重新调整各项设置。
11.17 周日
    03:00  ==>  验题完毕,队伍密码打印,离开体育馆。
    07:30  ==>  黑猫和yuki学长带学妹测试大屏幕滚榜,选手机放置一晚未有锁屏情况出现。
    08:55  ==>  比赛开始前nmap扫描选手机,发现有选手机连接不上,查看发现电脑锁屏休眠,提前进行重启。
    09:10  ==>  个别显示器分辨率有问题,更换VGA线解决。
    10:00  ==>  发现滚榜时验题帐号也显示在上面,黑猫学长尝试解决。
    14:10  ==>  比赛结束,导出榜单,备份完整数据库。

前期准备

黑猫学长分享了ICPC World Final的ubuntu镜像,使用该镜像安装虚拟机后,发现其中环境相当完善,但使用iso镜像批量部署不太方便。

查看该虚拟机时发现,其比赛环境主要通过自建软件源提供软件包的方式进行配置,可以移植到自定义的网络部署中,于是动手进行尝试,大约花了一周多时间,基本完善了该比赛环境的网络部署。

网络部署

这部分主要参考的是Bittersweet学长去年整理的博客

假设网络启动的server有多个网卡,同时连接外网(eth0)和内网(eth1),内网静态IP为192.168.19.251/24,一共200台选手机。

DHCP Server

TFTP Server

Apache Server

preseed.conf

preseed文件的主要作用就是代替手动安装时语言,键盘布局,时区,帐户等一步一步的选择,ubuntu官方文档中Automating the installation using preseeding对其每一部分都有相应的介绍,还在这里提供了一个示例。

我的preseed文件是配置完比赛环境后的,里面有一些特殊设置会在下面进行介绍。

Squid Server

NTP Server

开发环境

本地源

前期准备中提到,ICPC WF镜像中使用自己的源中软件包部署比赛环境,详细查看后是https://pc2cancer.ecs.csus.edu/apt/中的icpc2020包依赖了所需内容:

Package: icpc2020
Version: 0.1.9
Architecture: all
Pre-Depends: gdm3, xorg, a2ps, bash, compiz-plugins, coreutils, cups, evince, g++, gcc, html2ps, icpc-eclipse, iptables, openjdk-11-jdk, openjdk-11-doc, openssh-server, passwd, patch,  rpcbind, rsyslog, sed, snmpd, tar, tcsh, unzip, vim-doc, vim-gnome, ffmpeg, vlc, wget, dc, emacs, tmux, geany, libstdc++-7-doc, file-roller, git, light-themes, openjdk-11-source, locate, cppreference-doc-en-html, pypy-doc, kate, icpc-pycharm, valgrind, apcalc, indicator-applet-session, indicator-applet-complete, libmagic1, libjsoncpp1, libcurl3-gnutls, codeblocks, icpc-intellij-idea, icpc-kotlinc, icpc-clion, icpc2020-jetbrains, libvte9, compiz-gnome, gnome-session-flashback, make, xterm, icpc-logkeys

其中gnome-session-flashback是桌面环境,icpc-eclipsevim-gnomeemacsgeanykateicpc-pycharmcodeblocksicpc-intellij-ideaicpc-clion是编辑器和IDE,openjdk-11-doccppreference-doc-en-htmlpypy-doc提供了一些编程语言的文档。

所以在preseed.conf文件中加入此源,安装icpc2020包即可。对应我preseed文件中的

d-i apt-setup/local0/repository string http://192.168.19.251/apt bionic main
d-i apt-setup/local0/key string http://192.168.19.251/pc2.key

因为该源只能https访问,squid无法直接缓存,且下载速度较慢,所以在本地建立镜像更加合适。

我在虚拟机中使用apt-mirror将该源同步到了本地,利用apt-key工具导出了对应的gpg key,相关文件都放到了网络部署服务器的/var/www/html目录下由apache提供访问。

vscode

安装完icpc2020包后/etc/apt/sources.list.d/目录下会多出几个额外的源,其中microsoft.list中包含https://pc2cancer.ecs.csus.edu/vscode/,想在比赛环境中额外安装vscode的话sudo apt install code icpc-code-extensions -y即可。

但同样的问题,无法缓存且下载速度慢,使用apt-mirror同步时发现该源内旧包过多,完整同步需要几十G,于是手动下载ubuntu mirror所需的文件,然后每个包只下载最新版本,也搭建了本地源。

安装完毕后发现vscode无插件,apt-file查看icpc-code-extensions包内容发现插件安装到了/var/code/extensions处,/etc/skel/给出了选手机home目录所需的一些文件,其中/etc/skel/.vscode中设置了指向/var/code/extensions的软链接,于是rsync -lr /etc/skel/. /home/syclient
再次运行vscode,发现存在插件权限问题,于是不再采用软链接的方式,删除了/home/syclient/.vscode中的软链接,直接cp -r /var/code/extensions /home/syclient/.vscode,最后调整了两个文件/home/syclient/.vscode/extensions/ms-vscode.cpptools-0.25.1/bin/Microsoft.VSCode.CPP.Extension.linux/home/syclient/.vscode/extensions/ms-vscode.cpptools-0.25.1/bin/Microsoft.VSCode.CPP.IntelliSense.Msvc.linux的权限为744,vscode插件正常。

但vscode插件默认全部开启,键位会比较奇特,一些插件也并不需要,于是尝试批量进行删除:

#!/bin/bash
su syclient -c 'code --uninstall-extension dbaeumer.vscode-eslint'
su syclient -c 'code --uninstall-extension hiro-sun.vscode-emacs'
su syclient -c 'code --uninstall-extension ms-vscode.csharp'
su syclient -c 'code --uninstall-extension ms-vscode.sublime-keybindings'
su syclient -c 'code --uninstall-extension ms-vscode.vscode-typescript-tslint-plugin'
su syclient -c 'code --uninstall-extension vscodevm.vim'

其它

gdm设置自动登录

备份与恢复home

nmap检查选手机网络连通性

parallel-ssh并行执行命令

其它主机连接外网

squid无法缓存https流量

参考链接