构建RISC-V架构OS镜像方法介绍 | KeyarchOS(浪潮信息云峦操作系统,KOS)

目录

1 文档概述

2 QEMU平台下的镜像构建流程

2.1 构建根文件系统(阶段一)

2.2 构建根文件系统(阶段二)

2.3 编译Linux Kernel镜像

2.4 编译U-Boot

2.5 编译opensbi

2.6 生成并组装OS镜像

2.7 使用QEMU启动镜像


1 文档概述

此文档参考以下开源项目,描述了如何构建RISC-V架构的Fedora 39系统镜像,以 QEMU 平台为例,分阶段讲解了根文件系统构建、引导加载器(U-Boot)与内核编译、磁盘分区与镜像打包等关键步骤,并配以命令示例和自动化脚本模板。希望通过描述这个构建流程,能对系统的启动流程与原理有更深入的理解,并依次为参考,扩展开来构建各种不同系统与架构的镜像。
参考开源项目链接:GitHub - chainsx/fedora-riscv-builder

QEMU平台下的镜像构建流程

2.1 构建根文件系统(阶段一)

此文档描述的OS镜像构建方式中,最局限性的一点既是根文件系统的构建不是从零起步的(即从所有组件源码编译开始)。我们需要构建什么系统的镜像,就先得需要有一个这个系统的环境,在此环境下再创建出此系统的最小根文件系统rootfs。故接下来的操作是在Fedora 39 riscv系统环境下以root权限用户进行的。

具体步骤:
选择一个合适的工作目录。
使用mkdir命令创建”rootfs”目录:

mkdir rootfs

这个目录将成为镜像里”/”(根文件系统)的挂载点和容器。
在”rootfs”目录下“虚拟”地创建一个空的RPM数据库,主要涉及的操作:

mkdir -p rootfs/var/lib/rpm

RPM包管理器需要一个数据库目录来记录已安装的包信息。这里手动提前创建RPM数据库的存放路径,避免后面”rpm –initdb”命令报错。

rpm --root $WORKDIR/rootfs/ --initdb

使用RPM自带的初始化命令来创建数据库。这样做是为了后续能往这个“假”系统里安全rpm包。
让rootfs拥有Fedora标准的仓库源配置:

rpm -ivh --nodeps --root $WORKDIR/rootfs/ http://fedora.riscv.rocks/repos-dist/f39/latest/riscv64/Packages/f/fedora-release-39-0.21.noarch.rpm
往rootfs里安装”fedora-release”包,它会在目标系统里放置一系列默认的repo配置文件。“—nodeps”用来跳过依赖环境,因为当前空的rootfs里还没有任何依赖环境。
如果是构建其他系统,就灵活地换成目标系统的release包。


如果嫌弃Fedora默认的仓库源配置链接有困难,之后可以自定义修改rootfs/etc/yum.repos.d/目录中的内容。
在rootfs中里再安装一次dnf包本身:

dnf --installroot=$WORKDIR/rootfs/ install dnf --nogpgcheck -y
这样做的原因是:最开始只有rpm可用,dnf并没有被安装进目标rootfs。安装dnf后,就可以在这个隔离的环境里方便地通过dnf拉取更多软件包、更新元数据、解决依赖。


把rootfs目录打包成tarball:

cd $WORKDIR/rootfstar -zcvf fedora-39-core-rootfs.tar.gz .
生成的fedora-39-core-rootfs.tar.gz就是一个“最小“Fedora 39 RISC-V根文件系统,后续可以:直接导入Docker作为镜像层解包到QEMU/实际机器的分区里也可以在此基础上再用”dnf --installroot“安装其他软件

整体思路回顾

  1. 从空目录搭建一个RPM数据库;
  2. 安装release包,把官方repo文件放进来;
  3. 可选地对于源配置的修改;
  4. 安装DNF,以便可复用的包管理;
  5. 打包成tarball,得到一个rootfs镜像。

思考

安装DNF的意义?
在一个刚初始化、只有 RPM 数据库但没有包管理工具的空 rootfs 里,把 DNF 安装进去。只有装上 DNF,后面才能在这个 chroot 环境里通过它来一键安装和管理网络、SSH、dracut、驱动等所有系统组件,而不会影响到宿主机系统。
rootfs中何时拥有了完整FHS(Filesystem Hierarchy Standard)结构?
在安装了 fedora-release 包(建立基本目录骨架)并通过 DNF 安装了 filesystem、coreutils、bash、glibc 等基础软件包后,rootfs 才具备完整的 FHS 结构。

2.2 构建根文件系统(阶段二)

具体步骤
把rootfs的tarball转移到一个新的Linux系统下完成接下来的整体OS镜像构建任务。该构建环境应该支持apt包管理器,且和架构无关。故此文档使用x86架构下的Ubuntu较新版本系统来进行构建任务。
首先,要在此环境下安装一些必要的包:

apt updateapt install parted zstd make bison bc flex kpartx xz-utils qemu-user-static libssl-dev gcc-riscv64-linux-gnu -y
此处安装的是后续构建所需的工具和依赖,下面针对每个包的作用做个简要说明:parted:用来操作磁盘镜像的分区表后面会把打包好的rootfs镜像写入到分区中。zstd:支持zstd压缩/解压格式。make:各种开源项目(Linux内核、U-Boot、OpenSBI)的标准构建工具。bison和flex:在编译一些底层工具时,需要生成词法/语法分析器。bc:在Linux内核的Makefile中,用于计算内核版本号等小数运算。kpartx:将镜像文件中的分区映射为/dev/loopXpY设备,方便在宿主机上直接挂载、写入文件。zx-utils:支持XZ(.xz)格式的压缩/解压。qemu-user-static:提供静态编译的QEMU用户态模拟器(比如qemu-riscv64-static),可以让你在x86宿主机上chroot进RISC-V的rootfs,自动用Q
### 关于RISC-V架构的实验资料与教程 #### RISC-V架构学习资源概述 RISC-V作为一种开源指令集架构,近年来得到了广泛关注与发展。对于初学者而言,可以通过多种途径获取关于RISC-V架构的学习资料和实验环境配置方法。 #### 推荐的RISC-V实验教程 目前有许多公开可用的RISC-V实验教程可供参考。例如,《基于RISC-V架构的开源处理器及SoC研究综述》提供了一系列针对RISC-V的研究成果和技术细节[^1]。这些内容可以帮助理解RISC-V的核心概念及其在实际应用中的表现形式。 另外,在线社区如GitHub上也有大量由开发者贡献出来的项目文档和指南,它们通常包含了详细的安装说明以及如何设置开发环境的信息。这类资源非常适合希望深入探索该技术的人士使用。 #### 配置RISC-V实验室环境的方法 为了搭建一个完整的RISC-V实验平台,可以从以下几个方面入手: 1. **软件工具链** 安装必要的编译器、调试器和其他支持程序是第一步。可以下载官方提供的GNU Toolchain来获得最新版本的支持功能[^2]。 ```bash git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain.git cd riscv-gnu-toolchain ./configure --prefix=/opt/riscv make linux ``` 2. **模拟器的选择** 使用QEMU作为虚拟机运行目标操作系统镜像文件是一种常见做法;此外还有Spike这样的轻量化解决方案适用于特定场景下的测试需求[^3]。 3. **硬件评估板采购** 如果条件允许的话,则考虑购买现成的商品化产品比如SiFive Freedom E310或者HiFive Unleashed A00等型号来进行实物操作练习[^4]。 以上步骤构成了基本框架指导方针但具体实施过程中还需要依据个人兴趣方向调整侧重点从而形成更加个性化的学习路径规划方案。 ```python # 示例Python脚本用于验证RISCV汇编代码生成情况 from pathlib import Path def check_riscv_assembler(input_file: str, output_dir: str): """Check if the given input file can be assembled by a RISC-V assembler.""" asm_command = f"riscv64-unknown-elf-as {input_file} -o {Path(output_dir) / 'output.o'}" objdump_command = f"riscv64-unknown-elf-objdump -d {Path(output_dir) / 'output.o'}" try: subprocess.run(asm_command.split(), check=True) result = subprocess.run(objdump_command.split(), capture_output=True, text=True).stdout print(result) except Exception as e: print(f"Assembling failed with error: {e}") check_riscv_assembler('example.s', './build') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值