从零开始实现MIT6.S081实验环境配置(Ubuntu+Qemu+Xv6)

背景概述

课程介绍

MIT6.S081 Fall2020是麻省理工2020年秋季的操作系统课程,MIT将学习相关的资源全部公开并放到了官网。
本课程中共涉及11个实验,需要花费一定时间来完成。

相关名词解释

VMWare、Qemu、xv6等的关系可以用下图来表示:
层级关系
通过安装VMWare或者Virutalbox虚拟机软件来配置Ubuntu等Linux操作系统,就可以实现在不破坏原有Windows操作系统的情况下,虚拟使用其他操作系统。

  • Qemu
    Qemu(quick emulator)​ 是一个开源的硬件模拟器和虚拟化工具,能够模拟多种CPU架构(如x86、ARM、RISC-V等),允许用户在不同硬件平台上运行操作系统或程序。它既支持全系统模拟(如运行整个虚拟机),也支持用户态程序跨架构执行,常用于开发调试和嵌入式系统测试。

  • Xv6
    xv6​ 是一个教学用的精简类Unix操作系统,由MIT开发,基于传统Unix V6设计,代码简洁但完整实现了进程管理、文件系统等核心功能。它通常运行在RISC-V模拟器(如QEMU)上,用于操作系统课程教学,帮助学生理解底层机制。

环境配置

1. 安装Ubuntu 20.04

Ubuntu的安装借鉴了: 【Linux】Ubuntu 20.04安装教程(图文详解)

1) 准备工作

下载 Ubuntu 镜像对应的ios 文件

  • 方式一:官网(下载速度较慢)
    https://ubuntu.com/download/desktop
  • 方式二:镜像站下载
    这里推荐清华大学开源软件镜像站进行下载
    https://mirrors.tuna.tsinghua.edu.cn/
  1. 搜索Ubuntu,点击ubuntu-releases查看所有的发行版本
    Ubuntu安装1
  2. 选择 20.04/ 版本进行安装即可

特别注意:这里只建议安装Ubuntu 20.04版本,其他版本如22.04版,由于Ubuntu系统的版本过高,默认安装的qemu模拟器与xv6内核不兼容,会导致编译不成功

2) 在VMvare中完成后续安装
  1. 新建虚拟机
    Ubuntu安装2

  2. 选择安装的配置
    Ubuntu安装3

  3. 选择“稍后安装”
    Ubuntu安装3

  4. 选择 Linux 系统版本
    Ubuntu安装4Ubuntu安装5

  5. 配置处理器数量和内核数量(推荐2+2或4+2)
    Ubuntu安装6
    Ubuntu安装7

  6. 设置网络类型——选择 NAT 型
    Ubuntu安装8
    Ubuntu安装9
    Ubuntu安装10

  7. 设置磁盘文件的储存位置
    Ubuntu安装11

  8. 导入先前下载好的镜像IOS文件
    Ubuntu安装12
    Ubuntu安装13

  9. 点击完成结束配置并打开虚拟机
    Ubuntu安装14

  10. 选择语言和安装类型
    Ubuntu安装15
    Ubuntu安装16

Ubuntu安装17
Ubuntu安装17
Ubuntu安装18
最后,设置用户名、密码以及所处的时区(一般选上海),等待一段时间完成安装,这个时候Ubuntu就已经全部安装完毕了。

2. 安装Qemu和Xv6

1) 安装Qemu

Qemu和Xv6的安装参考了:Mit6.S081-实验环境搭建

Qemu和Xv6的安装都在Ubuntu的终端上完成

  1. 安装必要的依赖项
sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu 
  • 用下面两条命令测试下自己是否安装成功:
riscv64-unknown-elf-gcc --version
# riscv64-unknown-elf-gcc (GCC) 10.1.0
qemu-system-riscv64 --version
# QEMU emulator version 5.1.0
  • 若第一条命令输入完之后提示:
    Command ‘riscv64-unknown-elf-gcc’ not found, but can be installed with: sudo apt install riscv64-unknown-elf-gcc

输入给出的提示代码完成安装:

sudo apt install riscv64-unknown-elf-gcc
  1. QEMU用于在我们机器上(X86)模拟RISC-V架构的CPU,编译生成的risc-v平台的机器码,需要通过模拟cpu执行:
wget https://download.qemu.org/qemu-5.1.0.tar.xz  /home/zhongyi/6S081
cd qemu-5.1.0
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list=riscv64-softmmu
make
sudo make install
2) 安装Xv6
  1. 通过Git将XV6完整代码或课程代码克隆到本地,二选一即可。
    若仅有进行实验的需求,推荐克隆XV6实验源码。
  • XV6完整源码:
git clone git://github.com/mit-pdos/xv6-riscv.git
  • XV6实验源码
git clone git://g.csail.mit.edu/xv6-labs-2020
  1. 分支说明
    前面克隆下来的git代码库包含了多个分支
    每个分支对应一个实验作业。
  • 切换到克隆下来的代码库:
cd xv6-labs-2020
  • 查看此代码库的所有分支
git branch --remote

XV6实验分支说明

  • kernel:内核源码,system call的实现
  • user:系统自带工具源码,shell、echo、cat等工具实现
  • grade-lab-util:python实现的代码测试工具
  • Makefile:make配置文件
  1. 测试运行环境
  • 在xv6-labs-2020目录中输入:
make qemu

如果出现make: *** 没有规则可制作目标“qemu”,执行:

git checkout util

然后再次执行make qemu,看到如下内容即表示成功:
XV6成功页面

  • qemu的退出方法:按下 ctrl+a 抬起后,再输入’x’
  1. 可能出现的问题
  • 第一种:
user/sh.c: In function 'runcmd':
user/sh.c:58:1: error: infinite recursion detected [-Werror=infinite-recursion]
   58 | runcmd(struct cmd *cmd)
      | ^~~~~~
cc1: all warnings being treated as errors

这种情况说明:检测到了这个递归函数没有合理的终止条件,可能会无限递归
解决方法
在 runcmd 前添加 attribute((noreturn))

// Execute cmd.  Never returns.
__attribute__((noreturn)) 
void
runcmd(struct cmd *cmd)
  • 第二种:
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp
3 -nographic -drive file=fs. img, if=none, format=raw, id=x0 -device virtio-blk-devi
ce, drive=x0,bus=virtio-mmio-bus.0

这是因为Ubuntu系统的版本过高,默认安装的qemu模拟器与xv6内核不兼容,导致编译不成功,根据官网提示,需要qemu的版本为5.1,因此执行如下命令首先对新版本的qemu进行移除:

sudo apt-get remove qemu-system-misc

根据官网提示执行如下命令安装旧版本qemu:

sudo apt-get install qemu-system-misc=1:4.2-3ubuntu6

但是ubuntu22.04已经找不到该版本,运行上述会出现如下结果:
XV6安装问题
找不到对应包
因此,需要手动下载安装包、解压并安装相应的5.1qemu版本。

检索并提取 QEMU 5.1.0 的源代码:

wget https://download.qemu.org/qemu-5.1.0.tar.xz
tar xf qemu-5.1.0.tar.xz

编译QEMU:RISCV64-softmmu:

cd qemu-5.1.0
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"

(上条命令需要依赖libglib2.0-dev和 libpixman-1-dev这两个包)


如果在执行上述命令时出现以下问题,输入对应代码:

ERROR: pkg-config binary ‘pkg-config’ not found

sudo apt-get install pkg-config

ERROR: glib-2.48 gthread-2.0 is required to compile QEMU

sudo apt-get install  libglib2.0-dev 

ERROR: pixman >= 0.21.8 not present. Please install the pixman devel package

sudo apt-get install libpixman-1-dev

处理完上述报错后,可以再次执行:

./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"

正常输出没有报错时,可以继续执行以下代码:

make 
sudo make install 

最后,重新进入xv6_labs_2020目录,再次执行make qemu即可
若编译成功,执行ls命令输出如下所示:
XV6的ls

3. 在VScode中远程连接Ubuntu

1) 在Ubuntu中安装SSH
  1. 检查是否安装ssh-server
    Ubuntu默认并没有安装ssh服务,如果通过ssh远程连接到Ubuntu,需要自己手动安装Openssh-server。
    判断是否安装ssh服务,可以通过如下命令:
ps -e|grep ssh

输出如下

1221 ?        00:00:00 sshd
1964 ?        00:00:00 ssh-agent
2650 ?        00:00:00 sshd
2651 ?        00:00:00 sshd

ssh-agent表示ssh-client启动,sshd表示ssh-server启动了

  1. 若输出结果与上述不同,则需先安装openssh-server:
sudo apt-get install openssh-server
  1. 查看ssh服务是否启动:
sudo ps -e |grep ssh

有sshd,说明ssh服务已经启动。如果没有启动,输入:

sudo service ssh start
  1. Ubuntu中配置openssh-server开机自动启动(非必选项)
sudo systemctl enable ssh

如果不需要自启动或者是每次想自己连接的话,可以执行下面这行代码关闭:

sudo systemctl disable ssh
  1. 重启后检查是否设置成功:
sudo systemctl status ssh

输出结果如下:
SSH成功

2) 配置远程连接扩展
  1. 在VScode搜索并安装以下两个扩展
    安装的扩展

  2. 成功安装后点击左下角的设置并点击扩展,找到Remote-SSH
    设置
    扩展

  3. 勾选下图中框选的内容:
    勾选

3) 实现远程连接
  1. 打开SSH远程,选择新建,文本框中按以下格式输入:
ssh  username@ip -A

输入
其中,username是安装Ubuntu时所注册的用户名
而IP地址可以在Ubuntu终端通过以下命令查看:

ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:b9:12:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 86399sec preferred_lft 86399sec
    inet6 fe80::20c:29ff:feb9:1234/64 scope link 
       valid_lft forever preferred_lft forever

在上面的输出中,eth0 接口的IP地址是 192.168.1.100。

  1. 回车后,选择配置文件,然后单击右下角的“连接”
    选择配置文件
    连接
    Linux
    输入yes
  2. 询问是否想要继续连接,所以我们输入yes:
    输入密码
  3. 输入登录密码,完成登录
    登录
    连接成功
  4. 关闭远程连接
    当我们使用完之后想要关闭远程连接,点击左下角的 SSH 绿色按钮,在弹框中选择 Close Remote Connection 即可
    在这里插入图片描述

补充问题

1. 物理机复制的内容无法正常粘贴到虚拟机上

apt-get install open-vm-tools -y

粘贴1

apt-get install open-vm-tools-desktop -y

粘贴2

reboot

粘贴3

2. Ubuntu联网异常

sudo service NetworkManager stop
sudo gedit /var/lib/NetworkManager/NetworkManager.state

更改打开的文件里的内容:

将 NetworkingEnabled=false 改为 NetworkingEnabled=true

保存退出后,在终端运行命令:

sudo service NetworkManager start

此时再打开设置,网络便可正常连接:
联网异常

3. 无法获得锁,资源暂时不可用

可以参考下面这篇文章,给出了多种应对方案:
Ubuntu 无法获得锁,资源暂时不可用

4. 启动虚拟化时报错,显示此平台不支持虚拟化

可以参考下面这篇文章,给出了详尽的解决方案:
【经验】VMware|Win11的Ubuntu虚拟机启动虚拟化,报错此平台不支持虚拟化的 Intel VT-x/EPT(方案汇总+自己的解决方案)


结语部分

从一开始配置环境时磕磕绊绊、手忙脚乱再到后来轻车熟路,博主本人也经历了数次重装虚拟机的辛酸。期间遇到了许多大大小小的问题,找了很多杂七杂八的方法,克隆了两次虚拟机,最后才成功。

小白刚上手时装上一大堆插件和包的案例在身边可以说是屡见不鲜了,对于没接触过Linux的新朋友,陌生的环境配置,门槛相对也不算低,劝退了相当一波新手。而在达到最终目的的路上,总会不可避免地走很多弯路。

全网的帖子里,凡涉及到配置该实验环境、能真正关注到小白遇到的各种问题的,属实是少之又少。个人认为耗费太多精力在环境配置上只会让新手对后续实验的期望消磨殆尽,同时也希望能帮即将学习MIT6.S081的广大朋友们节省部署的时间和精力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值