[原创] 从零开始构建星光2开发板debian riscv64文件系统(保姆级)

怀揣少年梦   2023-8-1 00:40 楼主

背景

在此之前是从来没有构建这样一个开发板的base_system文件,最开始以为,一方面参考B站大佬视频和赛昉科技的csdn博客文章,另一方面,通过自学应该一周时间是可以搞完的,没想到的是,因为各种问题,前前后后花了半个多月的时间,终于镜像构建成功,并成功运行在星光2开发板上。以下将详细介绍构建过程。

一、环境准备

1.一台装有Ubuntu22.04环境的电脑(在18.04版本上构建,chroot不能正常使用,需要编译qemu源码,并且产生qemu-riscv64文件;22.04版本不需要这样操作)

2.一张16G的SD卡

3.星光2开发板

二、构建步骤

1.编译内核

1)搭建编译环境

安装相关依赖以及交叉编译所需条件

sudo apt update sudo apt upgrade sudo apt install libncurses-dev libssl-dev bc flex bison gcc-riscv64-linux-gnu build-essential ccache cpio fakeroot flex git kmod libelf-dev libncurses5-dev libssl-dev lz4 qtbase5-dev rsync schedtool wget zstd dwarves -y

2)下载源码

sudo mkdir code

cd code

git clone https://github.com/starfive-tech/linux.git

(如果网速较差,可以直接在上述网站上下载压缩包。或者下载我分享的文件链接:https://pan.baidu.com/s/1Wo4ffIAxXuU1KuUiBOr8Qg 
提取码:oejz)

3)编译

a.切换分支

cd linux

git checkout -b JH7110_VisionFive2_devel origin/JH7110_VisionFive2_devel

git pull

b.复制config文件

sudo cp arch/riscv64/configs/starfive_visionfive2_defconfig ./

c.设置编译内核默认配置

make starfive_visionfive2_defconfig CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv

d.设置其他软件配置(没有特殊要求,一般默认即可)

make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv menuconfig

e.编译

make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv -jx

编译完成

编译内核完成.png

编译结果

在linux/riscv/arch/boot目录下,生成内核镜像文件,生成四个文件。不过只需要image、head、libc_dev三个文件以及dtb文件。 内核编译生成物0.png

dtb.png

 

2.创建debian的base_system

base System是除了Linux内核、init外(有时候包含init)其余基础软件的集合。Base System⼯具集⾮常容易部署和管理,⼀条命令就能够⽅便安装。其实可以理解为没有内核的精简操作系统。

1)创建块设备

a.创建空的磁盘镜像文件,这里创建一个11G

sudo dd if=/dev/zero of=starfive2.img bs=1G count=11

b.使用losetup将磁盘镜像文件虚拟成块设备,这样就可以模拟文件系统了。

sudo losetup -f#查找空闲设备。查找到空闲设备就使用该设备。

例如我找到的是/dev/loop8

模拟块设备.png

sudo losetup /dev/loop8 visionfive.img

2)分区

sudo fdisk /dev/loop8。

进入分区页面,如图。

分区.png

输入n进行,新建分区,

选择分区类型,选择p

设置分区起始位置。一般默认

设置分区大小。

最后输入字母w,创建成功.

写分区.png

依次创建三个分区,分区标号,依次是3,4,大小依次是16M(efi文件) ,512M(boot文件) 10G(系统文件)。

3)格式化分区

把loop8p2格式化为vfat,其他两个分区格式化为ext4

命令如下:

sudo mkfs -t vfat /dev/loop8p2

sudo mkfs -t ext4 /dev/loop8p3

sudo mkfs -t ext4 /dev/loop8p4

如图:

格式化分区.png

4)挂载分区

a.在mnt下创建starfive2目录

sudo mkdir /mnt/starfive2

sudo mkdir /mnt/starfive2/boot

sudo mkdir /mnt/starfive2/boot/efi

b.挂载分区

sudo mount -t vfat /dev/loop12p2 /mnt/starfive2/boot/efi

sudo mount -t ext4 /dev/loop12p3 /mnt/starfive2/boot

sudo mount -t ext4 /dev/loop12p4 /mnt/starfive2

5)安装依赖

安装qemu binfmt模拟环境

sudo apt install debootstrap qemu-user-static binfmt-support -y 

安装base_system依赖.png

6)下载支持riscv的debian系统

a.配置校验密钥deb包

在这个网址中的源码下载https://packages.debian.org/sid/all/debian-ports-archive-keyring

下载好后,安装deb文件即可。

或者直接下载我分享的文件(链接:https://pan.baidu.com/s/1coD2Au0J8Olwp320v-yxsg 
提取码:nsn6),复制到/usr/share/keysring/目录即可。

安装密钥.jpg

b.下载指令。

利用debootstrap 下载RISC-V 的 Debian base system 到 /mnt/starfive 下:

debootstrap --arch=riscv64 --foreign --keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg --include=debian-ports-archive-keyring unstable /mnt/starfive2 https://deb.debian.org/debian-ports/ 原始指令:

–arch=riscv64 指架构,是 riscv64 的;--foreign 指只下载不安装; –keyring  密钥,上面已经安装;–include 在base_system,添加特定的包,debian-ports-archive-keyring包是密钥包,不稳定版本Sid/Unstable /mnt/Starfive是下载和安装目录,现在已经挂载好块设备了 https://deb.debian.org/debian-ports/ 是下载 deb 包的地址(这是官方源,建议不要用镜像,偶尔因为同步问题,会出现文件校验不匹配)

在这个过程可能由于网络原因,出现下载失败,可多次尝试下载,直到下载完成。

下载base_system

下载base_system.png

下载失败

网络原因下载失败,重试即可.png

下载成功

下载成功.png

7)安装debian到/mnt/starfive2

a.准备依赖

主机是x86的架构,我们搭建的base_system是riscv64位的,所以需要利用qemu-user-static来模拟成riscv64执行环境。之前已经安装了这个依赖,需要复制qemu-riscv64-static这个模拟文件到base_system目录。

sudo cp /usr/bin/qemu-riscv64-static /mnt/starfive2/usr/bin

b.安装base_system相关软件

sudo chroot /mnt/starfive2 debootstrap/debootstrap --second-stage

安装完成,会提示Base system installed successfully。表示成功安装。

base_system安装成功.png

3.安装内核

a、chroot进去base_system

sudo chroot /mnt/starfive2;执行命令 dpkg -i linux-image-5.15.0-starfive2-0725_5.15.0-starfive2-0725-1_riscv64.deb(这个文件在内核编译产生目录下,记得复制到base_system的一个目录。 base_system安装内核.png

内核安装结果。在根目录的boot目录下生成以下3个文件

base_system安装内核后的结果.png

4、生成initrd.img

a、安装依赖

在base_system目录下,安装工具

apt install initramfs-tools -y

b、产生initrd.img

在/boot目录下执行 update-initramfs -ck all

就会在/boot 目录下生成对应的文件。如图

init.jpg

5、复制文件到烧录官方镜像的SD卡中。

a、插入SD卡到ubuntu中;使用sudo fdisk -l 命令查看SD卡设备;

SD卡.jpg

b、挂载EFI system,并且复制vmlinux\initrd\system.map)

sudo cp vmlinuz-5.15.0-starfive2-0725 System.map-5.15.0-starfive2-0725 initrd.img-5.15.0-starfive2-0725 移植目录.jpg

 

复制.jpg

c、修改uEDV.txt以及extlinux.conf

这里注意内核生成dtb放在boot/dtbs/starfive/这个目录,udev就不需要修改。

Vdtbs.jpg

接着修改linux和initrd为生成对应的名字

extlinux.jpg

d、最后需要把/dev/loop8p4 分区的所有文件复制到SD卡的分区4;

sudo cp -r * /media/lxg/root/ 

root目录.jpg

 

最后完成后拔出SD卡。插入开发板启动。

启动的结果:

成功启动.png

成功登录

成功登录.png

本帖最后由 怀揣少年梦 于 2023-8-1 08:30 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复