0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

最全教程来啦!在RISC-V星光板上创建Debian系统镜像

StarFive 2022-04-22 13:43 次阅读

首先你需要一款专为Linux开发者打造的

全球第一代


RISC-V星光开发板

芯片原厂技术支持!

高性价比!

极易上手!

数量有限!

1071b972-bce8-11ec-82f6-dac502259ad0.png

往下看,干货满满~


如何在StarFive 星光板上创建Debian系统镜像?

转自Linux开发者Houge的博客,原文链接

https://litterhougelangley.life/blog/2022/03/03/



准备工作:


耐心

一杯咖啡

一块板子和一条串口调试线,至少16G的任何品牌SD card

能熟练操作的一个Linux发行版(推荐Archlinux或者Ubuntu)

大致了解如何利用qemu和binfmt创建RISC-V模拟运行环境

大致了解如何创建块设备

大致了解如何创建一个RISC-V交叉编译环境

大致了解如何使用简单的systemd-nspawn容器或者chroot

大致了解StarFive VisionFive的启动流程

觉得以上准备好烦,就是想白嫖的朋友只有等我的视频连载吧~


第一部分:编译、打包内核,创建deb源


创建一个StarFive VisionFive的RISC-V内核尤为重要,截止本文完稿,主线内核5.16还没有对StarFive VisionFive的dts和deconfig提供支持,预计5.17能进入主线了,所以目前我们需要使用5.17的发布候选版本,就是RC版本进行编译和构建。完整流程如下:

#Debian或者Ubuntu

#Debian安装依赖:
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 pahole dwarves -y

#Ubuntu安装依赖:
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

#下载源码:
#可以从这个地址下载内核,但是不要从releases下载。大家最好下载最新的commits,在这里#我提供一个下载地址:https://github.com/starfive-tech/linux
mkdir -p linux-build
#创建编译目录

cd linux-build
#进入目录

wget https://github.com/starfive-tech/linux/archive/54fad564dc7a117704e99248c3984f907e1867d5.tar.gz
#下载特定commits的内核源码,大家根据你当天最新commits下载。

tar -xpvf 54fad564dc7a117704e99248c3984f907e1867d5.tar.gz
#解压源码

mv linux-54fad564dc7a117704e99248c3984f907e1867d5 linux-5.17.0-rc5
#给解压出来的源码目录改一个简单的名字

cd linux-5.17.0-rc5
#进入该目录

cp arch/riscv/configs/starfive_jh7100_fedora_defconfig .config
#复制内核配置文件到内核源码根目录下,并取名为.config

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- menuconfig
#利用交叉编译工具链具体再配置内核

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -jX bindeb-pkg LOCALVERSION=-starfive-xxx
#-jX 有多少线程都可以利用上,最后那里是去个你喜欢的名字
#等待编译完成。完成后会在上一层目录生成4个deb文件,类似下图:

1090a7ba-bce8-11ec-82f6-dac502259ad0.jpg

这4个deb文件中,其实我们只需要3个就足够了,一个是linux-headers,一个是linux-image。我们现在知道这三个文件放在你的家目录的linux-build目录下。下面我们看看如何用Arch构建:

Archlinux或者其他发行版,可以用类似的方法。


下面谈到一些小的技巧,关于文件系统的:

1. 假设你使用btrfs文件系统,在/mnt/目录下可以创建一个子卷,在子卷下编译,后续还能打个快照,做做备份;

2. 假设你使用zfs文件系统,建议使用zvol块设备,格式化成ext4文件系统,挂载到/mnt/xxx/目录下,构建和打包。原因也同样是方便备份和做克隆,抑或是快速部署。备份的理由是因为我前前后后用过三个版本的Debian Sid/unstable的gcc交叉编译工具链构建,第一次成功,过了一周编译失败了,因为gcc更新后引入了一个bug,需要打补丁,这个时候如果我有上一个版本的备份就直接rollback去构建和打包,就不影响后面的操作了。所以,养成备份和克隆的习惯很重要。下面我们假设你在Archlinux或者其他的发行版上已经在/mnt/xxx/目录下有子卷或者块设备了,直接开始~

#以下操作默认在root权限进行

pacman-Syay#安装我喜欢的yay
pacman-Sparu#安装你们喜欢的paru
#以上操作二选一

yay -S debootstrap debian-archive-keyring ubuntu-keyring
#安装Debian系统一些重要工具,debootstrap可以将各种架构的base system安装到指定目录,后面的keyring目的是提供密钥,用于验证deb包是否被篡改。

debootstrap unstable /mnt/xxx https://mirror.sjtu.edu.cn/debian/
#从上海交大Debian镜像源下载最新的debian sid base system并且安装到/mnt/xxx目录
debootstrap impish /mnt/xxx https://mirror.sjtu.edu.cn/ubuntu/
#从上海交大ubuntu镜像源下载最新的ubuntu 21.10 base system并且安装到/mnt/xxx目录

systemd-nspawn -D /mnt/xxx/ -M kernel --bind-ro=/etc/resolv.conf
#利用systemd-nspawn创建名为kernel的debian/ubuntu x86_64 base system容器

#后续的操作可以参考上面Debian和Ubuntu的操作。完成之后,你需要记住打包好的deb包所在的位置,你可能需要使用root权限去将这些deb复制到你方便操作的目录下等待下一步操作。

完成内核编译打包,不要高兴太早。

注意在内核源码目录下把StarFive VisionFive的dtb文件复制出来到你记得的目录。这个dtb所在的目录是<内核源码>/arch/riscv/boot/dts/starfive/下。大家一定记住。

下面继续,针对安装内核deb有两种操作方法,我更推荐第二种。第一种简单,但是不清真,就是后续将编译打包好的riscv内核复制到将来的系统中,直接安装,命令是:dpkg -i xxx.deb;第二种方法,我更愿意叫它是Debian/Ubuntu安装软件的“原教旨主义”,就是通过架设我们的私有的RISC-V deb源,这样的好处是,可以让你身边有需求的朋友,完全按照Debian/Ubuntu系的传统,安装你做好的内核,并且能够维护这个内核版本,以方便他们后续更新使用。我们来谈架设Deb源。

选择合适的服务器:

如果是公司内部,可以选择在NAS上创建一个Ubuntu的虚拟机,然后将网络映射到你们公司局域网中,让所有人都能正常访问;

如果是像我这种,我选择XX云,建立一个Ubuntu的VPS作为deb源服务器。好的,现在假设VPS或者你的虚拟机已经创建好了。开始在VPS上操作吧。

apt install reprepro --yes
#安装reprepro,deb发布器

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
hwclock --systohc
apt install ntpdate
ntpdate -s time.nist.gov
#以上操作的目的是将VPS或者虚拟机的时间同步到标准北京时间,防止时间不匹配,无法安装和更新软件

gpg --gen-key
#生成你的密钥,后续deb包都会用这个私钥签名,其他机器需要下载你的公钥,用于验证

10ac091a-bce8-11ec-82f6-dac502259ad0.png

上图就是生成的密钥,用gpg --list-keys可以显示出来。注意那一长串字符:706CE3DD…,记下最后8位:33372332,它们有重要作用,别问我怎么知道的,哈哈哈哈~

apt install apache2 -y
#安装一个你会操作的web服务器,我比较习惯apache

下面去web服务器目录下创建目录:

mkdir -p /var/www/html/ubuntu-impish
cd /var/www/html/ubuntu-impish
mkdir -p conf db dists pool
touch conf/distributions
#distributions描述性文件
touch conf/options
#options描述仓库的一些选项
#注意ubuntu-impish这个是名字,大家喜欢什么名字可以随便一点,根据你们的需要自由处理。

下面来配置distributions:

Origin: ubuntu
Suite: impish
Label: ubuntu
Codename: impish
Architectures: riscv64
Components: main
Description: Apt repository for StarFive VisionFive V1
SignWith:33372332

上面的内容我来解释一下:

Origin如果你是Debian,就写Debian,如果是Ubuntu,就写Ubuntu

Suite写成你的发行版的代号

Label类似Origin

Codename就是发行版代号

Components这个是组件,因为我们只是满足小范围的朋友使用,main就够了,如果是严格的维护,最好详细分类

描述部分大家自由发挥

SignWith这里是签名,还记得你的那8位密钥吗?


下面导出我们的公钥到源目录:

gpg --export --armor 33372332 > /var/www/html/ubuntu-impish/gpg-public.key
#再次强调那个8位密钥

10bb21fc-bce8-11ec-82f6-dac502259ad0.jpg

上图就是创建后的大致样子。

下面就可以来发布或者撤销你创建好的内核deb包了:

reprepro -b /var/www/html/ubuntu-impish -C main includedeb impish/<你之前编译并打包好的deb目录>/*.deb
#这是发布你的deb包,这时候会弹出一个TUI,你在里面输入密码(gpg创建密钥对时输入的密码)

reprepro -b /var/www/html/ubuntu-impish -C main remove impish 
#从仓库移除或者撤销deb包

如果一切顺利,你的私有deb仓库就创建好了。好好维护吧~

第一部分小节:

• 内核编译打包推荐交叉编译,速度快;

• 记得dtb要复制出来,方便最后处理;

• 构建出来的deb包强烈推荐使用传统的架设源服务器管理

第二部分:创建块设备、分区,创建RISC-V的Debian base system


现在无论任何一个发行版,安装zfs的树外内核模块都非常方便了,下面以我自己的习惯来创建块设备。如果各位不会使用zfs文件系统,也没关系,利用losetup创建.img文件,作为块设备也是一样的。虽然zfs更加“科学”,笑死笑死~

#以下内容均在root权限下操作:
zfs create -V 10G root/Container/starfive-lxde
#在root/Container/池下,创建一个名字叫做starfive-lxde块设备,大小是10G(10G对于Debian/Ubuntu都够了,但是对于Gentoo是不够的,Gentoo需要120G)

cfdisk -z /dev/zvol/root/Container/starfive-lxde
#对该块设备进行分区,分区的样子类似下图:

10cf726a-bce8-11ec-82f6-dac502259ad0.jpg

格式化上面的三个分区:

注意第一个分区是空分区;

第二个分区,格式化成vfat,不用取label名字;

第三个分区,格式化成ext4,label取名字叫做:_/boot;

第四个分区,格式化成ext4,label取名字叫做:_/;

在/mnt目录下创建一个目录,我这里就叫做:Starfive,即/mnt/Starfive

开始一系列操作来挂载块设备到目录到/mnt/Starfive;

mount -t ext4 /dev/zvol/root/Container/starfive-lxde-part4 /mnt/Starfive
mkdir -p /mnt/Starfive/boot
mount -t ext4 /dev/zvol/root/Container/starfive-lxde-part3 /mnt/Starfive/boot
mkdir -p /mnt/Starfive/boot/efi
mount-tvfat/dev/zvol/root/Container/starfive-lxde-part2/mnt/Starfive/boot/efi

挂载完成后,可以运行lsblk查看下,结构类似下图:

10dd8882-bce8-11ec-82f6-dac502259ad0.jpg

利用debootstrap安装RISC-V的Debian base system到/mnt/Starfive下:

debootstrap –arch=riscv64 –keyring /usr/share/keyrings/Debian-ports-archive-keyring.gpg –include=Debian-ports-archive-keyring unstable /mnt/Starfive https://deb.debian.org/Debian-ports/

解释一下:

–arch=riscv64这里强调了架构,是riscv64的;

–keyring这里需要大家去单独下载一个deb包,我已经不记得debian和ubuntu的源里是否包含,不包含可以下载这个包,下载后解压deb提取debian-ports-archive-keyring.gpg这个文件放到我上面这个目录下;

–include在base system保重,添加特定的包,debian-ports-archive-keyring包是密钥包,添加一下避免后续万一缺少密钥什么麻烦

目前RISC-V架构并不在稳定版本Debian的支持中,比方说现在的Debian稳定版是Debian 11,它是不支持RISC-V的,所以我们只能用不稳定版本Sid/Unstable,如果你在某些网站看到RISC-V是稳定分支,那是宣传,并不是真实情况。

/mnt/Starfive是目录,现在已经挂载好块设备了

https://deb.debian.org/debian-ports/是下载deb包的地址(这是官方源,建议不要用镜像,偶尔因为同步问题,会出现文件校验不匹配)

根据各位的网速,完成base system的部署。

第二部分小节:

用你们习惯的方法创建块设备;

习惯去备份,避免重复劳动,节约时间;

掌握debootstrap的命令,可以看看help的输出,多尝试总不会有错。

第三部分:完善基础系统,准备/boot目录必要文件,为开发板最后启动做准备Debian/Ubuntu创建RISC-V模拟环境

#以下内容均在root权限下完成

apt install qemu-user-static binfmt-support -y
#安装qemubinfmt创建模拟环境

Archlinux或者其它发行版创建RISC-V模拟环境

大家参考这段Archlinuxwiki就可以了,我就不班门弄斧了。

随后我们就可以直接用systemd-nspawn进入容器开始后续的操作。

#以下内容均在root权限下完成

systemd-nspawn -D /mnt/Starfive -M starfive --bind-ro=/etc/resolv.conf
#启动名字为starfive,根目录在/mnt/Starfive的Debian RISC-V容器。

apt update; apt dist-upgrade -y
#更新系统

apt install curl gnupg2 gnupg vim nano initramfs-tools -y
#安装必要的工具,编辑器,为后续生成initramfs镜像做准备。
curl -s http://<内核私有源的地址>/xxx/gpg-public.key | apt-key add -
#添加内核私有源的公钥到apt-key中,我记得ubuntu和debian这里略有不同,大家根据不同发行版再搜索下方法。

deb http://<内核私有源的地址>/xxx unstable main
#添加私有源的地址到/etc/apt/sources.list中
apt update; apt install <你私有源中内核的名字,切记linux-headers linux-image都安装>
#刷源,安装私有源内核

这个时候你的/boot目录下应该是这样的:

10eea860-bce8-11ec-82f6-dac502259ad0.png

大家可以从这里下载最早创建的Fedora镜像中的启动必要的文件,你可能会问,为什么Debian/Ubuntu下不能根据自己的发行版创建?其实原因是开发板的uboot读取的配置文件和目前.efi文件所决定的,我们按部就班就可以了。

下面我们就需要将Fedora原始镜像中文件复制到Debian/Ubuntu的/boot目录下,做适当修改就可以了。

将boot文件夹(从上面下载的压缩包解压出来以后,你会看到)复制到Debian/Ubuntuboot目录下。

那么目前Debian/Ubuntu的/boot目录下就还有一个boot文件夹,里面有一个叫做uEnv.txt的文件,大家可以用常用的编辑器打开,将Fedora修改成Debian。类似下面两张图所示:

111b66fc-bce8-11ec-82f6-dac502259ad0.png

111b66fc-bce8-11ec-82f6-dac502259ad0.png

11475b22-bce8-11ec-82f6-dac502259ad0.png

完成后我们来复制EFI文件夹(压缩包里可以见到),将这个EFI文件夹完整复制到Debian/Ubuntu的/boot/efi/目录下,你可将EFI文件夹里的fedora删掉,当然保留也可以,作为一个备份。

将编译内核那个部分生成的dtb复制到你的Debian/Ubuntu的/boot/目录下。

将压缩包中的extlinux目录还有grub.cfg也复制到Debian/Ubuntu的/boot目录下,用编辑器对extlinux里面的配置文件和grub.cfg进行修改,修改的内容包括kernel对应的vmlinuz文件名,fdt对应的dtb文件,initd对应的initramfs镜像,UUID值,你可以重新打开一个终端sudo lsblk查看根目录的UUID,复制后、粘贴过去。最后样子大概是这样的:

115813d6-bce8-11ec-82f6-dac502259ad0.png

11874d86-bce8-11ec-82f6-dac502259ad0.png

119bdf58-bce8-11ec-82f6-dac502259ad0.png

最后别忘了ls-l看看/boot目录,再tree检查一下(没有tree就apt安装一下)。

感觉大功告成了,别忘了最后的收尾:

passwd root
#为root创建一个密码

sync
#同步文件系统,写入缓存

exit
#退出容器

umount /dev/zvol/root/Container/starfive-lxde-*
#卸载挂载的块设备

dd if=/dev/zvol/root/Container/starfive-lxde of=/dev/<你的sdcard> status=progress bs=1M
#将做好的块设备烧到你的sdcard上,这里注意确定你的块设备,别写错了

第三部分小结:

根据你做的镜像发行版不同,Debian和Ubuntu导入你内核私有源的公钥会略有不同,根据遇到的情况查阅Google

按部就班,多检查细节

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RISC
    +关注

    关注

    6

    文章

    430

    浏览量

    83223
收藏 人收藏

    评论

    相关推荐

    【昉·星光 2 高性能RISC-V单板计算机体验】为 Ubuntu 安装 Docker 及常用软件

    【昉·星光 2 高性能RISC-V单板计算机体验】为 Ubuntu 安装 Docker 及常用软件 目的 为了更好的利用星光2,决定使用容器来管理。 换源 使访问更快。 # 备份 cp /etc
    发表于 02-21 17:54

    【昉·星光 2 高性能RISC-V单板计算机体验】VisionFive2开箱+安装Ubuntu

    【昉·星光 2 高性能RISC-V单板计算机体验】VisionFive2开箱+安装Ubuntu 前言 很感谢赛昉科技及iCeasy提供的样片,让我第一次接触高性能的RISC-V的开发板。 开箱 包装
    发表于 02-21 17:49

    【昉·星光 2 高性能RISC-V单板计算机试用体验】开箱及装载Debian系统

    上周收到了昉·星光 2高性能RISC-V单板计算机开发板,在此非常感谢赛昉科技提供的试用机会。开发板处理器集成赛昉科技昉·惊鸿-7110与Imagination GPU。其中赛昉科技昉·惊鸿
    发表于 01-24 00:32

    VisionFive 2 生态进展双周报(9.1-9.15)

    Linux发行版优化洞悉——以昉·星光 2 Debian为例 RISC-V平台管理接口(RPMI)介绍 点击查看更多详细信息 赛昉科技于8月发布最新版本Debian
    发表于 09-19 09:13

    昉·星光 2(VisionFive 2)Debian 202308最新镜像发布!

    | RVspace 202308镜像下载地址 :https://debian.starfivetech.com/ 新增功能 支持的SBC:昉·星光 2 v1.2A和
    发表于 09-08 14:44

    RISC-V + OpenCV 计算机视觉】用 VisionFive 2 昉·星光 2 进行物体识别

    广泛应用于视频监控、自动驾驶等领域。 基于Debain操作系统和OpenCV框架,赛昉科技VisionFive 2(昉·星光 2)RISC-V单板计算机上实现了采用GPU加速的目标检
    发表于 09-08 11:42

    【昉·星光 2 高性能RISC-V单板计算机体验】原创3 控制螺旋桨电路的升力大小

    控制螺旋桨电路的升力大小,昉·星光 2 高性能RISC-V单板计算机反应敏捷,控制到位,值得上手! GPIO接口也非常多,非常全。如下图: 谢谢!
    发表于 08-31 16:45

    【昉·星光 2 高性能RISC-V单板计算机体验】2更换Debian操作系统

    接上两篇:【昉·星光 2 高性能RISC-V单板计算机体验】1初识赛昉科技StarFive - RISC-V技术论坛 - 电子技术论坛- 广受欢迎的专业电子论坛! https
    发表于 08-31 00:03

    【昉·星光 2 高性能RISC-V单板计算机体验】一:VisionFive2板子调试环境搭建

    DSI显示接口。其规格如图3所示。 图3 VisionFive2星光板的规格 2. 系统烧录 这里将采用将系统烧录到SD卡并启动的方式。首先在百度网盘网址(https://pan.baidu.com
    发表于 08-30 22:10

    RISC-V快速发展的处理器生态系统中找到立足点

    生态系统存在很大的问题——开发人员的支持是可怜的。正在开发芯片架构的RISC-V International更多地谈论硬件,软件优先级遥遥领先。 Initial Support S
    发表于 08-11 18:20

    【昉·星光 2 高性能RISC-V单板计算机体验】使用之一:星光 2开箱之硬件分析

    昉·星光 2 是全球首款集成了GPU的高性能RISC-V单板计算机。与昉·星光1 相比( JH7100 SoC 芯片采用双核64位高性能RISC-V CPU,自带2MB的二级缓存,
    发表于 07-28 15:02

    RISC-V新进展!deepin 成功适配VisionFive 2

    的设计、完整的工具链、易于移植Unix系统,以及大量的开源实现和流片案例。 近期,deepin官方RISC-V SIG组成功VisionFive 2开发板适配deepin操作
    发表于 07-10 09:23

    Debian RISC-V 64 位支持何时会到来呢?

    目前 Debian 项目宣布,未来的 Debian 13 “Trixie” 中,将带来 RISC-V 64 位支持。 Debian 13
    发表于 06-21 08:52

    Debian 13“Trixie”Linux 发行版有望将带来 RISC-V 64 位支持

    转自https://m.ithome.com/html/699116.htm 目前 Debian 项目宣布,未来的 Debian 13 “Trixie” 中,将带来 RISC-V 6
    发表于 06-21 08:49

    openEuler RISC-V 成功适配 LicheePi 4A 开发板

    近期,RISC-V SIG LicheePi 4A 开发板上成功实现了欧拉操作系统的适配。目前,最新版本的 openEuler RISC-V 23.03
    发表于 05-04 22:22