本实验的目的是为后续实验搭建必需的环境。
注意事项:
Windows用户在课前应该已经完成了Linux虚拟机的创建
后续任务均需要在Linux虚拟机、Linux主机或macOS环境下完成
环境配置过程涉及到许多命令,注意以下两种不同形式的内容:
例如下面的命令表示在~(也就是home目录:/home/{username})下面执行ssh-keygen命令
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ ssh-keygen
Windows
Linux/macOS
物理机:学生自用的mac或Linux电脑
Docker宿主机:物理机
Docker环境:根据Task2搭建起来的Ubuntu容器
QEMU环境:Docker环境中加载运行的QEMU镜像
在下面的命令示例当中:
Docker环境与QEMU环境中的账户与密码:
在Docker宿主机的home目录下创建pore24文件夹,这个将作为整个PoRE课程的总目录
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ mkdir pore24
Git 是一种分布式版本控制系统。
要了解更多 Git 的功能,请查阅 Git 官方网站。
Git 是一个强大的版本控制系统,拥有许多命令。然而,对于PoRE这门课程,你只需要了解以下基本命令:
还有一些用于检查状态的命令:
这些命令的详细说明可以通过 Git 文档 查看。
对于有兴趣进一步了解 Git 的同学,可以参考以下资源:
首先,在终端中键入 git
,检查你是否已安装 Git。如果没有安装,可以按照以下步骤在不同平台上安装 Git:
平台 | 安装方式 |
---|---|
Linux | sudo apt-get install git |
macOS | brew install git |
注意:这些安装程序都可以从git 下载页面获取。 |
安装完 git 后,你可能需要进行首次设置。通过以下命令配置自己的身份信息:
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ git config --global user.name "John Doe"
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ git config --global user.email johndoe@example.com
通过以下命令检查是否已经存在密钥对:
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ ls ~/.ssh
xxxxxxxxxx
11authorized_keys id_rsa id_rsa.pub known_hosts ...
如果你已经有 id_rsa
和 id_rsa.pub
,则跳到第 3 步。
如果你没有密钥对,请运行以下命令生成一个:
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ ssh-keygen
xxxxxxxxxx
11# Just type enter after you run the above command.
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ ls ~/.ssh
然后你会在 ~/.ssh
目录下拥有 id_rsa
和 id_rsa.pub
文件。
键入以下命令:
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ cat ~/.ssh/id_rsa.pub
xxxxxxxxxx
11# ssh-rsa XXX XXX
xxxxxxxxxx
21# song@song-virtual-machine:~
2$ cp ~/.ssh/id_rsa.pub ~/22xxxxxx.pub (your id)
将 ~/.ssh/id_rsa.pub
复制到一个新文件中,命名为 22xxxxxx.pub
(.pub 文件名为你的学号),然后通过你的学生邮箱(StudentID@m.fudan.edu.cn,例如 22000000001@m.fudan.edu.cn)将 .pub 文件发送给助教的邮箱 FDUPore2023@163.com。
你只有在收到回复邮件后才能执行后续步骤。
在开始之前,请转到你的工作目录
xxxxxxxxxx
21# song@song-virtual-machine:~
2cd ~/pore24
xxxxxxxxxx
11# song@song-virtual-machine:~/pore24
克隆你自己的存储库(请注意,你应该用自己的 ID 替换 22000000001):
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24
2$ git clone gitpore@106.15.186.69:pore_22000000001
编辑你喜欢的代码,执行以下命令
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/pore_22000000001
2$ cd lab1
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/pore_22000000001/lab1
2# 创建一个pore_22000000001.txt文件,里面存放你的学号ID,例如pore_22000000001
xxxxxxxxxx
31# song@song-virtual-machine:~/pore24/pore_22000000001/lab1
2$ git add 22000000001.txt # 22000000001替换成你自己的学号ID
3$ git commit -m "MODIFY LOG"
请注意,尽可能经常提交代码,并尽可能详细地编写提交消息。你可以随时使用 git status
和 git log
来检查你当前的工作状态和提交日志。
当你完成一些提交后,可以将代码推送到服务器。
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/pore_22000000001/lab1
2$ git push origin master
我们建议你尽可能经常地提交推送。
在截止日期之前提交代码。一旦你完成了所有的代码,并决定提交时,你可以按照以下步骤操作:
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/pore_22000000001/lab1
2$ git tag "submit"
在这里,git tag
为当前提交添加了一个标签,表明这个提交包含你的最终提交代码。如果你不使用这个命令,我们将使用截止日期前的最后一次提交。
课程PPT也是通过 git 发布的,你可以使用以下命令克隆存储库:
xxxxxxxxxx
31$ cd ~/pore24
2# song@song-virtual-machine:~/pore24
3$ git clone gitpore@106.15.186.69:slides.git
当有新的PPT发布的时候,你可以通过以下命令更新PPT
xxxxxxxxxx
41# song@song-virtual-machine:~/pore24
2$ cd slides
3# song@song-virtual-machine:~/pore24/slides
4$ git pull
每次课程之后都会上传课程PPT,请留意我们网站上的“更新”,使用 git pull 获取最新的课程PPT
Lab、PJ的代码将被发布到每个同学的pore_XXX目录下,labx的代码目录为release_labx,例如lab2目录为pore_XXX/release_lab2
可以通过以下指令拉取Lab、PJ代码
xxxxxxxxxx
71# song@song-virtual-machine:~/pore24/pore_22000000001/
2# 暂存更改
3git add .
4git commit -m "store my code"
5# 拉取远端代码
6git pull origin master
7# 如果出现merge界面,使用Ctrl + X退出即可
仓库名 | 描述 | 权限 |
---|---|---|
LabEnv | 存储实验环境 | 仅pull |
slides | 存储课程PPT | 仅pull |
pore_{ID} | 存储学生Lab、Pj的答案,发布Lab、PJ | pull和push |
Docker提供了在松散隔离的环境(容器)中打包和运行应用程序的功能。
Docker支持多种平台的下载与安装,你可以根据自己的操作系统选择不同的安装方式:
平台 | 安装方式 |
---|---|
Linux | Docker Engine |
macOS | Mac Intel芯片 Mac Apple芯片 |
这些安装程序或文档都可以从Docker官方文档中获取。 |
注意事项:
尽可能安装最新的Docker
使用docker --version检查版本
xxxxxxxxxx
31# song@song-virtual-machine:~
2$ sudo docker --version
3Docker version 25.0.3, build 4debf41
对于PoRE这门课程,你需要了解以下基本命令:
这些命令的详细说明可以查看 Docker 文档 。
对于有兴趣进一步了解Docker的同学,可以参考以下资源:
为了方便实验环境的下发与统一管理,我们需要使用Docker搭建一个Ubuntu的容器环境,这个Ubuntu上已经配置好了所有Lab和Pj需要的基础环境。按照下面的步骤完成容器的搭建:
进入pore24目录
xxxxxxxxxx
31# song@song-virtual-machine:~
2$ cd ~/pore24
3# song@song-virtual-machine:~/pore24
创建workspace 目录,用于存储学生个人使用、创建的代码
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24
2$ mkdir workspace
注意:后续Docker容器可能会更新,但是放在这个目录下面的代码或文件一般会保留下来,因此可以在这个文件里面存放你的代码项目或工程。
通过git clone获取Docker环境搭建需要的文件与代码:
xxxxxxxxxx
31# song@song-virtual-machine:~/pore24
2$ git clone gitpore@106.15.186.69:LabEnv
3$ git clone gitpore@106.15.186.69:peda-arm # 后续不会更新,只需要在第一次搭建环境的时候拉取下来
创建qemu文件夹
xxxxxxxxxx
31# song@song-virtual-machine:~/pore24
2$ mkdir qemu && cd qemu
3# song@song-virtual-machine:~/pore24/qemu
注意:step5和step6需要在校园网环境下完成
从http://10.176.36.34:8888中下载debian-12-nocloud-arm64.qcow2和start_vm.sh并放置到qemu目录下
xxxxxxxxxx
31# song@song-virtual-machine:~/pore24/qemu
2$ wget http://10.176.36.34:8888/debian-12-nocloud-arm64.qcow2
3$ wget http://10.176.36.34:8888/start_vm.sh
从http://10.176.37.16:8000/中下载qiling.zip并解压。如果没有unzip命令可以apt-get install unzip
xxxxxxxxxx
51# song@song-virtual-machine:~/pore24/qemu
2$ cd ~/pore24
3# song@song-virtual-machine:~/pore24/
4$ wget http://10.176.37.16:8000/qiling.zip
5$ unzip ./qiling.zip
到这一步,文件结构应该如下所示
xxxxxxxxxx
421/home/{username}/pore24
2├── LabEnv
3│ ├── docker-compose.yml
4│ ├── Dockerfile
5│ ├── helloworld
6│ ├── README.md
7│ ├── source_arm.txt
8│ ├── source.txt
9│ ├── source_x86.txt
10│ ├── cp_to_qemu.sh
11│ └── start.sh
12├── peda-arm
13│ ├── dev
14│ ├── LICENSE
15│ ├── peda
16│ ├── peda-arm.py
17│ ├── peda-intel.py
18│ ├── plugins
19│ ├── python23-compatibility.md
20│ └── README.md
21├── pore_22000000001
22│ └── lab1
23├── qemu
24│ ├── debian-12-nocloud-arm64.qcow2
25│ └── start_vm.sh
26├── qiling
27│ ├── ChangeLog
28│ ├── COPYING
29│ ├── CREDITS.md
30│ ├── Dockerfile
31│ ├── docs
32│ ├── examples
33│ ├── poetry.lock
34│ ├── pyproject.toml
35│ ├── qiling
36│ ├── qltool
37│ ├── qltui.py
38│ ├── README.md
39│ ├── tests
40│ └── TODO
41├── qiling.zip
42└── workspace
进入LabEnv目录当中,通过在终端中运行./start.sh 部署并启动Docker环境
xxxxxxxxxx
41# song@song-virtual-machine:~/pore24/
2$ cd ~/pore24/LabEnv
3# song@song-virtual-machine:~/pore24/LabEnv
4$ chmod +x start.sh && sudo ./start.sh
如果出现如下错误,键入sudo apt install gnome-keyring
即可
xxxxxxxxxx
31rpc error: code = Unknown desc = error getting credentials - err: exit status 1, out:
2`GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.secrets
3was not provided by any .service files`
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/
2$ sudo docker stop pore_image && sudo docker rm pore_image # 删除原来的镜像
xxxxxxxxxx
51# song@song-virtual-machine:~/pore24/
2$ cd ~/pore24/LabEnv
3# song@song-virtual-machine:~/pore24/LabEnv
4$ git pull origin master
5$ chmod +x start.sh && sudo ./start.sh
通过docker exec命令进入到Docker环境中执行命令:
xxxxxxxxxx
31# song@song-virtual-machine:~/pore24
2$ sudo docker exec -it pore_image bash
3# pore@34419af9325c:~
在Docker环境中启动QEMU环境
xxxxxxxxxx
31# pore@34419af9325c:~
2$ sudo chmod 666 debian-12-nocloud-arm64.qcow2 # pore的密码是pore
3$ chmod +x start_vm.sh && ./start_vm.sh
此时,这个终端会启动QEMU镜像,最终弹出localhost login:的提示,输入pore/pore登入账号:
xxxxxxxxxx
31Debian GNU/Linux 12 localhost ttyAMA0
2localhost login: pore
3Password: pore
同时,QEMU镜像会在Docker镜像的6666端口上提供一个SSH访问的接口。
文件传输
Docker宿主机->Docker环境:
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/LabEnv
2$ sudo docker cp helloworld pore_image:/home/pore/
Docker环境->QEMU环境:
重新在Docker宿主机上开一个终端(不要关闭step2中的终端),按照如下方式向QEMU中复制文件:
xxxxxxxxxx
21# song@song-virtual-machine:~/pore24/LabEnv
2$ sudo docker exec -it pore_image bash
xxxxxxxxxx
21# pore@34419af9325c:~
2$ scp -P 6666 /home/pore/helloworld pore@127.0.0.1:/home/pore
进入QEMU环境:可以直接使用step2中的终端,或者在Docker环境中键入如下命令
xxxxxxxxxx
31# pore@34419af9325c:~
2$ ssh -p 6666 pore@127.0.0.1 # 在pore_image容器内执行
3# pore@localhost:~$
在QEMU环境中运行测试程序
xxxxxxxxxx
21# pore@localhost:~$
2$ chmod +x helloworld && ./helloworld
弹出Hello, World!之后表示QEMU环境安装完成。
Docker环境与QEMU环境的退出
在Docker环境的终端中键入exit
命令即可退出Docker环境
xxxxxxxxxx
21# pore@34419af9325c:~
2$ exit
QEMU终端的退出有两种:
xxxxxxxxxx
51# 退出step2中得到的QEMU终端需要键入快捷键 `Ctrl a+x`
2
3# 退出step4中通过ssh命令得到的QEMU终端,需要输入exit命令:
4# pore@localhost:~
5$ exit
通过docker exec命令进入到Docker环境中执行命令
xxxxxxxxxx
31# song@song-virtual-machine:~/pore24/LabEnv
2$ sudo docker exec -it pore_image bash
3# pore@34419af9325c:~
进入/home/pore/qiling
xxxxxxxxxx
31# pore@34419af9325c:~
2$ cd /home/pore/qiling
3# pore@34419af9325c:~/qiling
使用pip安装qiling
xxxxxxxxxx
21# pore@34419af9325c:~/qiling
2$ pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple .
测试qiling是否安装成功
xxxxxxxxxx
51pore@34419af9325c:~/qiling$ python
2Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
3Type "help", "copyright", "credits" or "license" for more information.
4>>> import qiling
5# 没有报错的话,表示qiling安装成功
~/pore24/pore_{ID}/lab1
目录下使用git提交