命令行下使用 VirtualBox 安装 NOI Linux

woshiluo

2019-10-30 21:00:11

Personal

## 0 缘起 这两天模拟赛越发频繁了... Windows 有时候很睿智,Lemon 时间波动特别大,Cena ... 不说了大家都懂 总而言之,与其和微软斗智斗勇,不如早日更换评测环境 然而如果使用现今的发行版,有一个很有意思的问题... CCF 的评测环境有些久远,而且还是 32 位的 所以果然还是 NOI Linux 吧~ 然而机房并没有空闲的电脑能够完成这个任务,虚拟机大家又跑不起 我的眼光落到了正在运行着 NovaOJ 的工作站上 就决定是你了! ## 1 VirtualBox 安装 > 系统环境: > `Linux hostname 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux` > 以下命令默认使用 `root` 权限 ### 1.1 安装标准包 直接从官网... 并没有 Debian 10 的包 不过可以添加软件源 ```bash wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add - wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add - echo 'deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian buster contrib' >> /etc/apt/sources.list apt-get update apt-get install virtualbox-6.0 ``` ### 1.2 安装扩展包 你可以从[ 官方站点 ](https://www.virtualbox.org/wiki/Downloads)的`VirtualBox *** Oracle VM VirtualBox Extension Pack` 一栏获取最新版的下载链接 ```bash wget https://download.virtualbox.org/virtualbox/6.0.14/Oracle_VM_VirtualBox_Extension_Pack-6.0.14.vbox-extpack VBoxManage extpack install ./Oracle_VM_VirtualBox_Extension_Pack-6.0.14.vbox-extpack ``` ## 2 获取 NOI Linux 安装包 自己去[ NOI 官网 ](http://www.noi.cn)找去... ## 3 创建虚拟机 ``` vm_name="noi_linux" vm_hard="/oi/noi_linux/hard.vdi" noi_linux_iso="/home/test/noilinux-1.4.1.iso" vboxmanage createvm --name $vm_name --ostype noi_linux --register VBoxManage createvdi --filename $vm_hard --size 20480 vboxmanage modifyvm $vm_name --memory 4096 --vram 256 --hwvirtex on vboxmanage storagectl "$vm_name" --name "SATA Controller" --add sata --hostiocache on --bootable on vboxmanage storagectl "$vm_name" --name "IDE Controller" --add ide --controller PIIX4 --hostiocache on --bootable on vboxmanage storageattach $vm_name --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium $vm_hard vboxmanage storageattach $vm_name --storagectl "IDE Controller" --port 1 --device 1 --type dvddrive --medium $noi_linux_iso vboxmanage modifyvm $vm_name --vrde on --vrdeport 5688 VBoxManage modifyvm $vm_name --cpus 2 vboxmanage modifyvm $vm_name --nic1 nat VBoxHeadless -s $vm_name $ Luogu 博客的美刀符号会莫名加空格,不知道为什么 ``` 这样子你的虚拟机就在 5688 端口上建立一个远程桌面 使用 Windows 的 远程桌面链接或者 `rdsktop` 即可 接下来大家都会安装,问题在与如何链接和上传文件 ## 4 创建端口映射并建立 WebDAV 短暂的思考后,我们可以建立 WebDAV 并配以适当的权限控制,来完成这一目标 ### 4.1 端口映射 ```bash vboxmanage controlvm $vm_name natpf1 “web,ssh,,2012,,22” vboxmanage controlvm $vm_name natpf1 “web,tcp,,2022,,80” ``` ### 4.2 配置 WebDAV 在 NOI Linux 下执行 ```bash apt-get install apache2 apache2-utils a2enmod dav a2enmod dav_fs ``` 编辑 `/etc/apache2/sites-enabled/000-default.conf` 文件 ```apache <VirtualHost *:80> DocumentRoot /home/noilinux/oi Alias / /home/noilinux/oi/ <Directory "/home/noilinux/oi"> Dav On Options +Indexes IndexOptions FancyIndexing AddDefaultCharset UTF-8 AuthType Basic AuthName "NOI Linux Test Env" AuthUserFile /var/www/passwd.dav Order allow,deny Allow from all <LimitExcept GET PUT POST DELETE MOVE COPY OPTIONS> Require user admin </LimitExcept> <LimitExcept PUT POST DELETE MOVE OPTIONS> Require user guest </LimitExcept> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> ``` 其中 `LimitExcept` 项是权限控制 ```bash htpasswd -c /var/www/passwd.dav guest htpasswd -c /var/www/passwd.dav admin service apache2 restart ``` 使用 WebDAV 访问工具访问 `ip:2022` 即可上传文件至 `/home/noi_linux/oi` 目录下 请确保 `/home/noi_linux/oi` 目录存在且可读写 ## 5 虚拟机自启动 修改 `/etc/systemd/system/[email protected]` 文件 ```bash [Unit] Description=VirtualBox Machine Service - %I After=network.target Wants=network.target [Service] Type=simple User=woshiluo ExecStart=VBoxHeadless -s %I ExecStop=vboxmanage controlvm %I poweroff Restart=on-failure [Install] WantedBy=multi-user.target ``` 执行 ```bash systemctl start vbox@$vm_name.service systemctl enable vbox@$vm_name.service ``` ## 6 结 果然命令行是可以解决所有问题的www 之后编译个 Lemon Plus 即可 不过还是希望 CCF 升级一下评测环境啊 毕竟 32 位系统也开始逐渐被抛弃了 本文提供了一种学校内模拟 NOI Linux 评测环境的方法,并提供了一种较为合理的文件传输及权限控制方法 对于有服务器的学校是一种较为优秀的解决方案 ## 7 引用 本文在撰写时参考了下列网页或博客,特此写出,部分内容来源不清,故未写出 - [VBoxManage 主机与宿主机之间实现端口映射](https://blog.csdn.net/a85820069/article/details/79038119) - [CentOS7命令行安装VirtualBox并安装虚拟机](https://zhuanlan.zhihu.com/p/29759641)