目录
1 文档概述
此文档参考以下开源项目,描述了如何构建RISC-V架构的Fedora 39系统镜像,以 QEMU 平台为例,分阶段讲解了根文件系统构建、引导加载器(U-Boot)与内核编译、磁盘分区与镜像打包等关键步骤,并配以命令示例和自动化脚本模板。希望通过描述这个构建流程,能对系统的启动流程与原理有更深入的理解,并依次为参考,扩展开来构建各种不同系统与架构的镜像。
参考开源项目链接:GitHub - chainsx/fedora-riscv-builder
2 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“安装其他软件 |
整体思路回顾
- 从空目录搭建一个RPM数据库;
- 安装release包,把官方repo文件放进来;
- 可选地对于源配置的修改;
- 安装DNF,以便可复用的包管理;
- 打包成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 |

最低0.47元/天 解锁文章
956

被折叠的 条评论
为什么被折叠?



