BUAA OS实验环境配置指南-2020年版
文章目录
前言
时至2020年,实验指导书上的配环境方法有一部分已经不能使用,网上的资料很多也过时了。笔者踩了无数坑终于把OS环境配置好了,为了避免后人继续踩坑,故将配置经验分享出来。本文也许也会在未来的某一天过时,因此读者阅读时,请注意本文的发布时间。
为了照顾不同读者的阅读需求,笔者将本文中的教程部分与笔者的所思所想、所做所为分开,只想阅读教程的读者仅需阅读第三部分“完整配置教程”即可
为什么要配环境?
笔者写本文时,本学期的OS正处于Lab5的第二周。据说,Lab4是最难的,而Lab5简单很多。为什么最难的部分都熬过来了,却要在这样一个时间相对紧张的时候配环境呢?
实际上,笔者配置环境不是为了Lab5和Lab6,而是为了挑战性任务。笔者本学期的OS工具经历了如下的发展过程。
最开始完全在Jupyter里直接写代码、编译、调试、提交,但是Jupyter有屏幕小、无图形界面、连接不稳定等诸多不便之处,对笔者而言最大的不便是只能用vim,不能用自己用的顺手的IDE(笔者由于自身水平不足,不太会配置vim)。因此,当笔者得知可以将代码从Jupyter中下载到本地编写,再上传到Jupyter中后,笔者果断放弃了在Jupyter中写,从此进入第二阶段——下载到本地用IDE写,完后上传回Jupyter进行调试。
这一阶段对于效率的提升是显著的,到后面几次Lab,常常是反复在几十个文件之间进行切换。即使在Clion中开满了标签页,笔者依然觉得标签页数不够用,如果仍然在Jupyter中写,是什么样的体验可想而知。
但是这一阶段仍然有不足。笔者一直使用win系统,尽管可以用本地强大的IDE写代码,却无法编译和运行,因此调试工作仍然只能在Jupyter中进行,调试阶段在数十个文件之间切换依然不可避免,效率依然有待提高。
挑战性任务更加复杂,需要大量的调试,还需要自己构造测试数据。随着挑战性任务的发布,笔者更加觉得需要配置一个可以编写、编译、调试的闭环环境,实现除了提交以外的环节完全摆脱对Jupyter的依赖,从而将大屏、图形界面、*分屏等优势运用到每个环节中,提高效率。因此,笔者下定决心配置一套完整的环境。
配置环境过程中的尝试
笔者首先想到的是把学期初助教Ausar分享的已经配置好的环境拿过来用,但是面临的第一个难关就是VirtualBox始终无法打开镜像,一直报错0x80004005。搜索错误代码,按其中的指示进行处理依然无果,考虑到可能是助教给的环境挂载了一些本机没有的镜像导致无法启动,于是暂时搁置。
接下来笔者考虑的是WSL,笔者的想法是:WSL毕竟是微软官方出的,稳定性肯定比VirtualBox有保障。由于笔者的电脑版本为1909,不能安装WSL2,于是就去安装WSL1。
安装好WSL后,笔者一边搜集安装GUI的方案,一边尝试安装ELDK交叉编译器。费了很大一番功夫终于把iso的镜像挂载上之后,输入安装命令,却报了如下的错:
$ sudo ./install -d /OSLAB/compiler/
[sudo] password for *s:
./install: 1: ./install: Syntax error: "(" unexpected
这样的错让笔者完全摸不着头脑,查阅资料后,发现可能原因是WSL1没有完整的Linux内核。另外从查阅的资料看来,在WSL上安装图形界面似乎也是件费力不讨好的事情,于是放弃WSL。
回到虚拟机方案,笔者高中时期为了OI曾经用VirtualBox装过Ubuntu,查阅资料后发现可能是这个VirtualBox版本过老,即使更新了也和旧的文件有冲突,因此笔者卸载并重装了最新版。尽管依然报错,但是报错的内容变成了找不到gxemul安装包的镜像,并且把预期的文件地址展示了出来。因此笔者将gxemul安装包放到指定位置后,终于打开了Ubuntu 12.04的镜像。
但是这个镜像没有GUI,笔者查阅资料后使用sudo apt-get ubuntu-desktop
(并经过漫长的等待)安装上了GUI,这才终于有一个能看的图形界面。
由于给出的环境中ELDK编译器的安装路径与笔者的代码中使用的编译器路径不同,于是笔者另外安装了一份ELDK编译器到/OSLAB/compiler。此次安装总体上比较顺利。测试了一下make和gxemul,现象均和Jupyter平台上一致。另外还安装了Clion,整个实验环境基本达到了笔者理想的程度。
但是不足的是笔者始终无法在这个环境中开启VirtualBox的无缝模式,而环境自带的分辨率又无法充分使用笔者的屏幕空间。反复尝试安装增强功能,不起效。查阅资料后笔者认为可能是Ubuntu官方的Unity桌面的兼容性存在问题,于是下载了GNOME桌面并删除了Unity桌面。但是重启后依然无法开启无缝模式。于是笔者放弃了开启无缝模式的想法。
悲剧意外的发生了。笔者打开了Clion,试着打开了几份代码,感觉稍稍有点卡,认为可能是给虚拟机设置的配置过低。于是关掉虚拟机,内存从1024MB增加到2048MB,CPU从1核增加到2核,再次启动。
结果悲剧了。环境卡在启动时的命令界面,多次尝试,均无法启动系统。后来即使是把增强了的配置改回去,也依然无法启动,笔者只好放弃Ubuntu12.04。
考虑到前面的尝试已经给在Ubuntu上配置环境积累了一定的经验,于是笔者决定索性安装比较新版本的Ubuntu试试,理论上只要工具链的版本和Jupyter一致,代码的运行结果就是一样的。于是笔者开始安装Ubuntu18.04。
在18.04上,笔者首先安装ELDK编译器,但是无论如何改权限、换安装目录,运行安装命令后都会出错,报错大概内容为sh: /opt/eldk/bin/rpm: not found
。查阅资料后发现引起问题的原因是ELDK是32位软件,而笔者使用的是64位Ubuntu,不兼容。官方给出的解决方案是运行sudo apt-get install ia32-libs
,但是我运行这句指令,却提示我找不到这个包。
继续查资料,找到真正了有用的解决方案,终于把ELDK安装好了。
接下来安装gxemul,这个安装包更特殊。ELDK是编译好了现成的程序,只要运行安装程序即可,而gxemul的安装包里只有源代码,需要自己编译后把编译出的程序放到指定位置。笔者按照教程的步骤安装,但是总是会在编译到最后一步进行连接的时候出错。
笔者搜索gxemul的安装,排在搜索结果首位的居然是BUAA OS 2014年的一份课件,内容大致是环境配置教学,但是内容过时而无法使用。往下翻,找到一位同样在配置OS环境的同学的博客,这位同学也遇到了同样的问题,make到最后会报错如下(或者是意思相同的中文报错):
cc -fstrict-aliasing -fomit-frame-pointer -fpeephole -O3 -DNDEBUG src/*.o src/cpus/*.o src/debugger/*.o src/devices/*.o src/disk/*.o src/file/*.o src/machines/*.o src/native/*.o src/net/*.o src/promemul/*.o src/useremul/*.o -lm -o gxemul
src/devices/dev_sgi_ip32.o: In function `__cmsg_nxthdr':
dev_sgi_ip32.c:(.text+0x1d60): multiple definition of `__cmsg_nxthdr'
src/emul.o:emul.c:(.text+0x10): first defined here
src/devices/dev_sgi_ip32.o: In function `recv':
dev_sgi_ip32.c:(.text+0x1db0): multiple definition of `recv'
src/emul.o:emul.c:(.text+0x60): first defined here
src/devices/dev_sgi_ip32.o: In function `recvfrom':
dev_sgi_ip32.c:(.text+0x1dc0): multiple definition of `recvfrom'
src/emul.o:emul.c:(.text+0x70): first defined here
src/machines/machine_sgi.o: In function `__cmsg_nxthdr':
machine_sgi.c:(.text+0xaf0): multiple definition of `__cmsg_nxthdr'
src/emul.o:emul.c:(.text+0x10): first defined here
src/machines/machine_sgi.o: In function `recv':
machine_sgi.c:(.text+0xb40): multiple definition of `recv'
src/emul.o:emul.c:(.text+0x60): first defined here
src/machines/machine_sgi.o: In function `recvfrom':
machine_sgi.c:(.text+0xb50): multiple definition of `recvfrom'
src/emul.o:emul.c:(.text+0x70): first defined here
collect2: error: ld returned 1 exit status
Makefile:28: recipe for target 'build' failed
make: *** [build] Error 1
笔者尝试了4.6、4.7还有许多从这两个大版本衍生出的小版本如4.6.1、4.7.1等,尝试了多种CFLAGS设置,无一例外的失败了,报错内容基本一样。笔者又下载了6.0版本,使用g++终于编译成功了。然而尝试使用gxemul -E testmips -C R3000 -M 64 gxemul/vmlinux
命令,又会提示非法参数。笔者尝试使用sudo apt-get install gxemul
安装gxemul,提示没有这个包。
上网搜集gxemul安装错误的解决方案,搜到的有关gxemul的资料都很少,解决问题的资料更是根本没有。无奈之下向助教求助,助教说应该使用gcc-4.8或gcc-4.9。
笔者输入命令gcc --version
,发现笔者的gcc版本为7.5.0。于是又去搜集安装低版本gcc的方案(读者莫笑,笔者作为几乎没用过linux的人,并不知道怎么用apt-get装低版本的软件)。考虑到之前安装某些过于老的软件就会提示没有这个包,因此笔者决定安装gcc-4.9,结果输入命令sudo apt-get install gcc-4.9
后又提示没有这个包。
笔者想当然的以为,既然gcc-4.9都没有了,那gcc-4.8更不可能有。于是继续找别的安装方法。出乎意料的是,笔者找到一个提问,回答的人让安装gcc-4.8,笔者尝试使用sudo apt-get install gcc-4.8
,果然成功。
于是,在重新设置CC变量后,笔者终于把gxemul 4.6编译成功了。本地测试了下make和gxemul -E testmips -C R3000 -M 64 gxemul/vmlinux
,获得了和Jupyter一样的实验现象。
至此,OS环境配置终于成功。
完整配置教程
笔者由于主力使用Win,且配置的环境只打算使用到课程结束,对性能要求不高,故选择虚拟机方案。想要长期使用Linux的同学可以自行将安装虚拟机的部分换成安装真实系统。
准备工作
ELDK编译器,版本为mips-linux-x86 4.1。指导书和官方文档中给出的下载链接在笔者写本文时已失效。
gxemul仿真器,版本为4.6,官方下载链接为http://gavare.se/gxemul/src/。注意不能下载6.x版本,不兼容(上面有讲不兼容的表现)。
Ubuntu系统镜像,直接去官方下载即可,理论上只要ELDK、gxemul版本和课程组一致,无所谓使用哪一版本的Ubuntu。出于稳定性和功能丰富的考虑,笔者使用18.04LTS版。
VirtualBox,去官网下载最新版的platform package即可,可顺带下载extension pack。
由于ELDK和gxemul发布较早,且ELDK下载链接已失效,故笔者分享在此,希望拿到资源的同学可以保持分享。
百度网盘:https://pan.baidu.com/s/1OAM3t7-vKA17jP8TgU-iVA
提取码:tq05
北航云盘:https://bhpan.buaa.edu.cn:443/link/0CAD4CD3D9921271D9517306198FE075 有效期限:2022-06-30 23:59 访问密码:1sOF
安装虚拟机
虚拟机的安装不是本文的重点,故分享一篇笔者认为不错的教程。
笔者建议读者按照此教程完成Ubuntu虚拟机的安装,在此分享一些笔者使用的设置,供读者参考。
- 内存2048MB
- 硬盘10GB,在笔者配置完环境、安装好CLion后,还剩余600M,足够写OS代码
- CPU双核,启用PAE/NX
此外,笔者建议按教程中的指示更换升级源,提高下载速度。
笔者建议在打开虚拟机之后安装增强功能,这样就可以开启无缝模式、双向共享粘贴板。
关于主机与虚拟机之间的文件共享,笔者建议通过VirtualBox共享文件夹的方式实现。笔者对共享文件夹设置了自动挂载,并按照资料的方法二将笔者的用户名加入了vboxsf组,解决了自动挂载的权限问题。这样共享的文件夹可以很方便的双向传文件,且对文件的改变实时生效,无需重启Ubuntu。
在Ubuntu中,指令前如果加了sudo表示Super User DO,即以超级用户权限执行。如果读者不想每次sudo都要输入密码,也可以进行设置,输入sudo visudo
,在最后一行加入username ALL=(ALL) NOPASSWD: ALL
即可(username需要替换为自己设置的用户名)
Ubuntu中开启终端的快捷键是Ctrl+Alt+T
。
安装ELDK编译器
64位系统的准备工作
如果读者使用的是64位的Ubuntu,还需要做一些额外的操作。
方案一是按照指导书中所述,使用sudo apt-get install ia32-libs
安装32位运行库。但是笔者使用该方案时,提示找不到包。
方案二来自网络,具体操作为依次运行如下三条命令,其中:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
如果不进行上述操作,可能会在安装时报类似这样的错sh: /opt/eldk/bin/rpm: not found
正式安装
ELDK编译器的安装包是名为mips-2007-01-21.iso的镜像,在传到虚拟机中后,双击使用归档管理器打开即可当作压缩包打开,首先将其解压到目录A(A代表一个路径,具体在哪由读者自行决定,只要有权限访问且读者记住该目录即可,下文的B、C等同理)。A下面的readme.html有ELDK的安装和使用指南。
接下来是决定安装目录,有两种可能的目录,具体是哪一种取决于读者的Lab1.1是怎么做的。笔者当时是在include.mk里的CROSS_COMPILE的路径前加上了/OSLAB/compiler
,因此笔者的安装路径应当为/OSLAB/compiler/
,但也可能有读者应当安装在/opt/eldk/
。记安装路径为B。
安装之前要创建安装目录,使用命令sudo mkdir B
。如果提示目录不存在,就一级一级创建文件夹。如笔者实际使用了两条命令:
sudo mkdir /OSLAB
sudo mkdir /OSLAB/compiler
接下来进行安装,使用命令sudo ./A/install -d B
(需自行将A、B替换为对应的目录),其中-d B
是安装程序install的一个参数,表示指定安装目录为B,如果没有这个参数,就会默认安装到目录A。
在安装过程中,可能会有报错提示Failed to stat ~/.gvsf
或类似的内容,可以忽视,不会影响安装。
安装完成后,输入命令A/usr/bin/mips_4KC-gcc --version
,如果输出类似如下的内容,则说明安装成功。
jovyan@jovyan-VirtualBox:~$ /OSLAB/compiler/usr/bin/mips_4KC-gcc --version
mips_4KC-gcc (GCC) 4.0.0 (DENX ELDK 4.1 4.0.0)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
安装gxemul
小小的准备工作
安装前,需要先安装gcc-4.8或gcc-4.9。以4.8为例,使用命令sudo apt-get install gcc-4.8
即可。
如果安装4.9时提示找不到包,就试试安装4.8。笔者就是遇到这样的情况,最终安装了4.8。
此外,如果之前没有安装过make,则无法通过make
命令对gxemul进行编译,需要预先使用sudo apt-get install make
安装make。
正式安装
假设gxemul的安装包gxemul-0.4.6.tar.gz在目录C下,进入目录C后输入命令tar -zxvf gxemul-0.4.6.tar.gz
进行解压。
进入gxemul-0.4.6文件夹,其中README是使用说明。先输入export CC=gcc-4.8
,表示在当前终端中设置CC环境变量为gcc-4.8
(如果之前没有设置过CFLAGS,则无需设置CFLAGS)。设置之后可以输入env
查看所有环境变量的值,查看CC变量是否设置成功。然后输入./configure
。
接下来输入make
进行编译,编译过程需要花几分钟时间。编译完成后输入make install
,会提示手动安装如何操作,按照提示输入命令即可。
安装完成后,输入gxemul,如果出现类似如下的输出,说明安装成功。
GXemul 0.4.6 Copyright (C) 2003-2007 Anders Gavare
Read the source code and/or documentation for other Copyright messages.
usage: gxemul [machine, other, and general options] [file [...]]
or gxemul [general options] @configfile
or gxemul [userland, other, and general options] file [args ...]
Run gxemul -h for help on command line options.
No filename given. Aborting.
安装IDE
笔者使用的IDE为CLion,故在本文中简单介绍一下CLion的安装。
首先从官网下载格式为tar.gz的安装包,解压,其目录D下的install-Linux-tar.txt为安装教程。运行D/bin/clion.sh,会将CLion安装在目录D中并初始化。之后的初始化步骤和win版基本相同。以后开启CLion时,依然是运行D/bin/clion.sh。如果安装时忘了创建快捷方式,后面依然可以创建快捷方式。