背景
在此之前是从来没有构建这样一个开发板的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
编译完成
编译结果
在linux/riscv/arch/boot目录下,生成内核镜像文件,生成四个文件。不过只需要image、head、libc_dev三个文件以及dtb文件。
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
sudo losetup /dev/loop8 visionfive.img
2)分区
sudo fdisk /dev/loop8。
进入分区页面,如图。
输入n进行,新建分区,
选择分区类型,选择p
设置分区起始位置。一般默认
设置分区大小。
最后输入字母w,创建成功.
依次创建三个分区,分区标号,依次是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
如图:
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
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/目录即可。
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
下载失败
下载成功
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。表示成功安装。
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的一个目录。
内核安装结果。在根目录的boot目录下生成以下3个文件
4、生成initrd.img
a、安装依赖
在base_system目录下,安装工具
apt install initramfs-tools -y
b、产生initrd.img
在/boot目录下执行 update-initramfs -ck all
就会在/boot 目录下生成对应的文件。如图
5、复制文件到烧录官方镜像的SD卡中。
a、插入SD卡到ubuntu中;使用sudo fdisk -l 命令查看SD卡设备;
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
c、修改uEDV.txt以及extlinux.conf
这里注意内核生成dtb放在boot/dtbs/starfive/这个目录,udev就不需要修改。
接着修改linux和initrd为生成对应的名字
d、最后需要把/dev/loop8p4 分区的所有文件复制到SD卡的分区4;
sudo cp -r * /media/lxg/root/
最后完成后拔出SD卡。插入开发板启动。
启动的结果:
成功登录