Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab30db03f0 | ||
|
|
0c0af2cdac | ||
|
|
adc0b6483f | ||
|
|
ec3b4253d5 | ||
|
|
86dfc8acea | ||
|
|
1e05d3ffa7 | ||
|
|
0b5ad28c8a | ||
|
|
548fcdaf53 | ||
|
|
b1c5c5342b | ||
|
|
28171e2caf | ||
|
|
c951648d5f |
272
QUIZ4MOOC.md
Normal file
272
QUIZ4MOOC.md
Normal file
@@ -0,0 +1,272 @@
|
||||
学习完 [《从零开始为 RISC-V 构建一个 Linux 系统》][1] 后的小测试
|
||||
----
|
||||
|
||||
FIXME:这个 buildroot 仓库(包括本文件)目前放在 openruyi.cn 上,后继是否也放到 https://github.com/openRuyi-Tutorials 下去?
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
- [1. 测试任务概述](#1-测试任务概述)
|
||||
- [2. 任务提交方式](#2-任务提交方式)
|
||||
- [3. 测试任务描述](#3-测试任务描述)
|
||||
- [3.1. 任务 1](#31-任务-1)
|
||||
- [3.2. 任务 2](#32-任务-2)
|
||||
- [3.3. 任务 3](#33-任务-3)
|
||||
- [3.4. 任务 4](#34-任务-4)
|
||||
- [3.5. 任务 5](#35-任务-5)
|
||||
- [4. 联系方式](#4-联系方式)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
# 1. 测试任务概述
|
||||
|
||||
慕课 《从零开始为 RISC-V 构建一个 Linux 系统》(下文简称 MOOC)为课程提供了配套的构建脚本,代码仓库在:<https://github.com/openRuyi-Tutorials/build-linux-system-from-scratch>。这套构建脚本参考了 [Buildroot][2],具体对应的是 tag 版本为 2025.08.1 的代码。(FIXME: 用 github 的考虑是方便学生 fork,openruyi 的仓库我不知道是否合适面向所有学生建账号。)
|
||||
|
||||
设计测验如下,供评估学习效果参考。
|
||||
|
||||
测验总分 100 分,分为五个任务,参与考评的同学可任意选择其中的一个或者多个任务。所谓前置任务是指在完成本任务前必须要完成的任务项。
|
||||
|
||||
| 任务号 | 满分 | 前置任务 |
|
||||
|--------|------|----------|
|
||||
| 任务 1 | 60 | 无 |
|
||||
| 任务 2 | 10 | 任务 1 |
|
||||
| 任务 3 | 15 | 任务 1 |
|
||||
| 任务 4 | 10 | 任务 1 |
|
||||
| 任务 5 | 5 | 无 |
|
||||
|
||||
# 2. 任务提交方式
|
||||
|
||||
为了避免同时申请测试的实习生之间互相参考,请 **不要通过 PR(Pull Request) 方式提交你的改动**,而是采用邮件方式提交你的改动。具体提交方式如下:
|
||||
|
||||
- 在 Github 上 fork MOOC 仓库 <https://github.com/openRuyi-Tutorials/build-linux-system-from-scratch> 到自己的私有仓库。
|
||||
- 在自己的私有仓库上 checkout 开发分支
|
||||
- 将自己的改动提交到自己的开发分支上。假设您的 github userid 是 AAA,开发分支是 BBB,那么应该会得到一个对应开发分支的 URL:<https://github.com/AAA/build-linux-system-from-scratch/tree/BBB>。
|
||||
- 提交人员通过邮件将该开发分支的 URL 发送给 “我”(联系方式见文末)。
|
||||
- 每个任务单独一封邮件,请在邮件标题中加上 “[MOOC QUIZ TASK X]” 的前缀,X 为具体的任务号(“1”,“2” ...)。
|
||||
- 每个任务单独对应一个开发分支,具体要求见各个任务的描述。开发分支的取名建议加上类似 “taskX-” (X 为具体的任务号 “1”,“2” ...) 的前缀以示区分。
|
||||
|
||||
# 3. 测试任务描述
|
||||
|
||||
## 3.1. 任务 1
|
||||
|
||||
- 任务描述:仔细阅读 MOOC 仓库 <https://github.com/openRuyi-Tutorials/build-linux-system-from-scratch> 的构建脚本,基于该仓库的代码将 MOOC 的构建脚本中涉及的软件包的版本升级到和 Buildroot 的 tag 版本 2026.02 使用的软件包版本对齐。
|
||||
|
||||
关于 Buildroot 的构建,可以参考我们这里自己 mirror 的一个 Buildroot 仓库以及测验专用分支 <https://git.openruyi.cn/openRuyi-tutorials/buildroot/src/branch/quiz-mooc/>。构建方法如下,注意确保本地已经安装了 qemu-system-riscv64,版本建议至少 8.2.2 以上。构建配置采用修改过的 `qemu_riscv64_virt_defconfig`,具体的配置修改内容可以参阅 quiz-mooc 分支的 commit 历史。
|
||||
|
||||
```shell
|
||||
$ git clone https://git.openruyi.cn/openRuyi-tutorials/buildroot.git
|
||||
$ cd buildroot
|
||||
$ git checkout quiz-mooc
|
||||
$ make qemu_riscv64_virt_defconfig
|
||||
$ ./output/images/start-qemu.sh --use-system-qemu
|
||||
```
|
||||
|
||||
大致需要升级如下软件包:
|
||||
|
||||
- 升级 coreutils 到 9.10
|
||||
- 升级 e2fsprogs 到 1.47.3
|
||||
- 升级 expat 到 2.7.4
|
||||
- 升级 fakeroot 到 1.37.1.2
|
||||
- 升级 libzlib 到 1.3.2
|
||||
- 升级 libxcrypt 到 4.5.2
|
||||
- 升级 linux 到 6.19.5
|
||||
- 升级 m4 到 1.4.21
|
||||
- 升级 ncurses 到 6.6-20251231
|
||||
- 升级 python3 到 3.14.3
|
||||
- 升级 util-linux 到 2.41.3
|
||||
- 升级 vim 到 9.1.2148
|
||||
- 新增 libopenssl 3.6.1
|
||||
|
||||
为简化任务要求,升级过程中针对原 MOOC 构建做如下简化工作:
|
||||
|
||||
- 取消从源码自己构建交叉工具链,直接使用 Buildroot 预先制作的交叉工具链,具体下载的交叉工具链版本可以参考 Buildroot 的代码。
|
||||
- 和 MOOC 类似,不从源码构建 QEMU,而是使用本地自己安装的 QEMU(建议版本在 8.2.2 及以上)
|
||||
|
||||
- 任务检验标准:
|
||||
|
||||
对于提交的构建代码内容的具体要求如下:
|
||||
|
||||
- 提交时请基于 main 分支拉出自己的开发分支并进行 commit,不要在 main 分支上直接提交 commit。
|
||||
- 改动请基于 MOOC 仓库的 main 分支开发,尽量复用原有逻辑和框架而不要完全自己从头写一套,同时也不是将 Buildroot 的构建框架和脚本直接拿来使用。正常情况如果只是软件包升级应该不会涉及大的框架性改动,但如果的确发现现有代码框架无法支持新代码升级的请及时和 “我” 联系(联系方式见文末)。如果是发现原有代码有 bug 或者有需要做优化的请移步 “任务 5”。其他的额外改动需说明的请在邮件中解释。
|
||||
- 为了方便 review,如果修改涉及独立的功能,以及不同模块或者不同软件包的,建议每个修改一个 commit,不要将所有改动作为一个 commit 整体提交。
|
||||
- 在 commit 的描述中给出简单的修改说明,中英文皆可。简单的话一句话即可,不用重复代码的修改细节,所有的修改说明的出发点是侧重于阐述修改的原因,思路以及除了代码外需要额外说明的部分。
|
||||
- 注意代码风格,特别是代码缩进等。代码整洁,不要合入临时代码、临时测试用代码以及无效的注释等垃圾代码。
|
||||
|
||||
除了代码提交外,对于结果的检验要求如下:和 MOOC 课程代码类似,执行代码仓库中的 `make` 命令后可以完整地从零开始构建一个系统,上述需要升级和新增的软件包都构建无误。同样执行 `start-qemu.sh` 脚本可以在 QEMU 中启动系统。登录进入系统后验证软件工作正常,包括:
|
||||
|
||||
- 检查 SysV 是否正常工作,检查方法:
|
||||
|
||||
查看 SysV 版本:
|
||||
```shell
|
||||
# init --version
|
||||
SysV init version: 3.14
|
||||
```
|
||||
|
||||
尝试关机:
|
||||
```shell
|
||||
# init 0
|
||||
```
|
||||
|
||||
尝试重启:
|
||||
```shell
|
||||
# init 6
|
||||
```
|
||||
|
||||
- 检查当前 Shell 是否是 bash,检查方法:
|
||||
|
||||
```shell
|
||||
# echo $SHELL
|
||||
/bin/bash
|
||||
```
|
||||
|
||||
执行 `bash --version` 能够输出 bash 的版本信息和版权信息如下:
|
||||
|
||||
```shell
|
||||
# bash --version
|
||||
GNU bash, version 5.2.37(1)-release (riscv64-buildroot-linux-gnu)
|
||||
Copyright (C) 2022 Free Software Foundation, Inc.
|
||||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||
|
||||
This is free software; you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
```
|
||||
|
||||
- 检查 coreutils 工作正常,检查方法:
|
||||
|
||||
```shell
|
||||
# ls --help
|
||||
Usage: ls [OPTION]... [FILE]...
|
||||
[...... 省略]
|
||||
Report bugs to: bug-coreutils@gnu.org
|
||||
GNU coreutils home page: <https://www.gnu.org/software/coreutils/>
|
||||
General help using GNU software: <https://www.gnu.org/gethelp/>
|
||||
Report any translation bugs to <https://translationproject.org/team/>
|
||||
Full documentation <https://www.gnu.org/software/coreutils/ls>
|
||||
or available locally via: info '(coreutils) ls invocation'
|
||||
```
|
||||
|
||||
应该会看到输出中最后会出现 "GNU coreutils" 字样。
|
||||
|
||||
- 检查 vi/vim 工作正常。检查方法:
|
||||
|
||||
```shell
|
||||
# vi
|
||||
```
|
||||
|
||||
或者
|
||||
|
||||
```shell
|
||||
# vim
|
||||
```
|
||||
|
||||
应该进入 vim 欢迎界面,并看到 "VIM - Vi IMproved" 字样。并能正常使用 vi 编辑和退出。
|
||||
|
||||
- 检查 Python3 工作正常。检查方法:
|
||||
|
||||
```shell
|
||||
# python3
|
||||
Python 3.14.3 (main, Apr 1 2026, 14:14:37) [GCC 15.1.0] on linux
|
||||
Type "help", "copyright", "credits" or "license" for more information.
|
||||
>>>
|
||||
```
|
||||
|
||||
可以进入 Python 控制台,输入 `quit()` 可以退出 Python 控制台。
|
||||
|
||||
可以运行 snake 游戏。
|
||||
|
||||
```shell
|
||||
# python3 /usr/games/snake.py
|
||||
```
|
||||
|
||||
## 3.2. 任务 2
|
||||
|
||||
- 任务描述:在 “任务 1” 完成的基础上为 MOOC 的文件系统添加一个软件包,软件包的范围局限于 Buildroot 已支持的软件包(menuconfig 中 “Target packages” 中所列出的软件包,注意新添加的软件包不要包括 “Package managers” 和 systemd)。另外注意按照 Buildroot 的风格以及 MOOC 的风格,该软件包的构建依赖和运行依赖尽量不要对 host 的原有 native 环境有依赖,也就是说除了少部分 native 环境中的 pre-installed 软件外,所有的该软件包的构建依赖和运行依赖都需要我们自己从源码开始构建和安装到 host 和 target 中。
|
||||
|
||||
- 任务检验标准:
|
||||
|
||||
对于提交的构建代码内容的具体要求
|
||||
|
||||
- 改动请基于您提交的 “任务 1” 的开发分支再拉一个针对 “任务 2” 的开发分支并在这个新的开发分支上 commit。
|
||||
- 请在邮件中给出新增软件包的简单说明。
|
||||
- 请在邮件中给出新增软件包的运行和测试说明。
|
||||
- 其他要求和 “任务 1” 类似。
|
||||
|
||||
对于结果的检验要求:
|
||||
- 不影响 “任务 1” 的构建,以及运行和测试结果。
|
||||
- 满足邮件中所列出的新增软件包的运行和测试说明。
|
||||
|
||||
## 3.3. 任务 3
|
||||
|
||||
- 任务描述:在 “任务 1” 完成的基础上为 MOOC 的文件系统添加 systemd 软件包。systemd 的版本以及其构建依赖和运行依赖的软件包的版本需要和 Buildroot 的 tag 版本 2026.02 使用的软件包版本对齐。注意按照 Buildroot 的风格以及 MOOC 的风格,该软件包的构建依赖和运行依赖尽量不要对 host 的原有 native 环境有依赖,也就是说除了少部分 native 环境中的 pre-installed 软件外,所有的该软件包的构建依赖和运行依赖都需要我们自己从源码开始构建和安装到 host 和 target 中。(注:可以参考 Buildroot 的做法)。
|
||||
|
||||
- 任务检验标准:
|
||||
|
||||
对于提交的构建代码内容的具体要求:
|
||||
|
||||
- 改动请基于您提交的 “任务 1” 的开发分支再拉一个针对 “任务 3” 的开发分支并在这个新的开发分支上 commit。
|
||||
- 其他要求和 “任务 1” 类似。
|
||||
|
||||
对于结果的检验要求:
|
||||
|
||||
- 不影响 “任务 1” 的构建,以及运行和测试结果。
|
||||
- 启动系统,其中过程中应该看到 systemd 的正常输出。
|
||||
- 登录进入系统后验证 systemd 软件工作正常,方法如下:
|
||||
|
||||
```shell
|
||||
systemctl status
|
||||
```
|
||||
|
||||
应显示 "State: running" 并返回了系统状态摘要,说明 systemd 基本可用。
|
||||
|
||||
尝试 stop 然后再 start 一个服务,stop 后查看服务状态应该为 inactive;start 后查看服务状态应该为 running。以 udevd 服务为例:
|
||||
|
||||
```shell
|
||||
systemctl status systemd-udevd
|
||||
systemctl stop systemd-udevd
|
||||
systemctl status systemd-udevd
|
||||
systemctl start systemd-udevd
|
||||
systemctl status systemd-udevd
|
||||
```
|
||||
|
||||
## 3.4. 任务 4
|
||||
|
||||
- 任务描述:在 “任务 3” 完成的基础上为 MOOC 的文件系统添加 简介:microdnf 软件包。注意按照 Buildroot 的风格以及 MOOC 的风格,该软件包的构建依赖和运行依赖尽量不要对 host 的原有 native 环境有依赖,也就是说除了少部分 native 环境中的 pre-installed 软件外,所有的该软件包的构建依赖和运行依赖都需要我们自己从源码开始构建和安装到 host 和 target 中。
|
||||
|
||||
microdnf 简介:microdnf 是一个用 C 语言编写的轻量级包管理器,可以看作是 dnf 的精简版实现。它专为容器和最小化环境设计,旨在以极小的开销完成基本的软件包管理任务。microdnf 的官方网站和源码托管在 GitHub 上,具体地址是:<https://github.com/rpm-software-management/microdnf>。
|
||||
|
||||
- 任务检验标准
|
||||
|
||||
对于提交的构建代码内容的具体要求:
|
||||
|
||||
- 改动请基于您提交的 “任务 1” 的开发分支再拉一个针对 “任务 4” 的开发分支并在这个新的开发分支上 commit。
|
||||
- 其他要求和 “任务 1” 类似。
|
||||
|
||||
对于结果的检验要求:
|
||||
|
||||
- 不影响 “任务 1” 的构建,以及运行和测试结果。
|
||||
- 登录进入系统后验证软件 microdnf 工作正常,并且可以用它从 openRuyi 的软件源(FIXME:这个我建议放在开发用的源上,并且为了避免安装过程中发生冲突,可以指定一个简单的软件包,譬如就安装一个 hello world 的可执行程序,尽可能无依赖,确保安装成功即可)下载并安装软件包 。
|
||||
|
||||
## 3.5. 任务 5
|
||||
|
||||
- 任务描述:为原 MOOC 代码仓库找 bug 或者提出改进建议。
|
||||
|
||||
- 任务检验标准
|
||||
|
||||
对于提交的构建代码内容的具体要求:
|
||||
|
||||
- 改动请基于 MOOC 仓库的 main 分支拉出新的开发分支并在上面 commit。
|
||||
- 如果涉及多个 bug fix 或者多个改进点,请每个 bugfix 和每个改进点单独一个 commit。不要混在一起,方便 review。
|
||||
- 在 commit 消息中或者在邮件中对修改进行正确的说明。
|
||||
- Bug fix 要说清楚可复现的 bug 现象以及解决思路。
|
||||
- 改进建议要说清楚改进的理由和改进方案。
|
||||
|
||||
对于结果的检验要求:Bug fix 和改进建议只要被上游接受均可视为完成 “任务 5”。注意对于 “改进建议”,不要提出超过目前课程范围内的改进建议,譬如新增软件包或者提升软件包版本这种,因为 MOOC 的课程内容目前暂时告一段落。“任务 5” 中的改进建议更多的指的是针对现有 MOOC 构建脚本的一些优化措施。
|
||||
|
||||
# 4. 联系方式
|
||||
|
||||
测试过程中有任何问题可以联系 “我”:
|
||||
|
||||
- 联系人:汪辰
|
||||
- 联系方式(邮件):wangchen20@iscas.ac.cn
|
||||
|
||||
[1]: https://github.com/openRuyi-Tutorials/build-linux-system-from-scratch/blob/main/README.md
|
||||
[2]: https://buildroot.org/
|
||||
@@ -1,18 +1,26 @@
|
||||
BR2_riscv=y
|
||||
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_18=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_KERNEL_MIRROR="http://mirrors.ustc.edu.cn/kernel.org"
|
||||
BR2_GNU_MIRROR="http://mirrors.ustc.edu.cn/gnu"
|
||||
BR2_LUAROCKS_MIRROR="https://luarocks.cn"
|
||||
BR2_CPAN_MIRROR="http://mirrors.ustc.edu.cn/CPAN"
|
||||
BR2_GLOBAL_PATCH_DIR="board/qemu/patches"
|
||||
BR2_DOWNLOAD_FORCE_CHECK_HASHES=y
|
||||
BR2_INIT_SYSV=y
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="board/qemu/post-image.sh"
|
||||
BR2_ROOTFS_POST_SCRIPT_ARGS="$(BR2_DEFCONFIG)"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.7"
|
||||
BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_CURSES=y
|
||||
BR2_PACKAGE_COREUTILS=y
|
||||
BR2_PACKAGE_COREUTILS_INDIVIDUAL_BINARIES=y
|
||||
BR2_PACKAGE_VIM=y
|
||||
BR2_TARGET_ROOTFS_EXT2=y
|
||||
BR2_TARGET_ROOTFS_EXT2_SIZE="128M"
|
||||
BR2_TARGET_OPENSBI=y
|
||||
BR2_TARGET_OPENSBI_CUSTOM_VERSION=y
|
||||
BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.6"
|
||||
BR2_TARGET_OPENSBI_PLAT="generic"
|
||||
BR2_PACKAGE_HOST_QEMU=y
|
||||
BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE=y
|
||||
|
||||
Reference in New Issue
Block a user