查看原文
其他

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

StarFive 2023-12-22

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

全球第一代


RISC-V星光开发板


芯片原厂技术支持!

高性价比! 

极易上手!

数量有限!



往下看,干货满满~


如何在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/linuxmkdir -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文件,类似下图:

这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 -S yay #安装我喜欢的yaypacman -S paru #安装你们喜欢的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 --systohcapt install ntpdatentpdate -s time.nist.gov#以上操作的目的是将VPS或者虚拟机的时间同步到标准北京时间,防止时间不匹配,无法安装和更新软件
gpg --gen-key#生成你的密钥,后续deb包都会用这个私钥签名,其他机器需要下载你的公钥,用于验证

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

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

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

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

下面来配置distributions:

Origin: ubuntuSuite: impishLabel: ubuntuCodename: impishArchitectures: riscv64Components: mainDescription: Apt repository for StarFive VisionFive V1SignWith: 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位密钥

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

 

下面就可以来发布或者撤销你创建好的内核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包

如果一切顺利,你的私有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#对该块设备进行分区,分区的样子类似下图:

格式化上面的三个分区:

 

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

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

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

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

 

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

 

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

mount -t ext4 /dev/zvol/root/Container/starfive-lxde-part4 /mnt/Starfivemkdir -p /mnt/Starfive/bootmount -t ext4 /dev/zvol/root/Container/starfive-lxde-part3 /mnt/Starfive/bootmkdir -p /mnt/Starfive/boot/efimount -t vfat /dev/zvol/root/Container/starfive-lxde-part2 /mnt/Starfive/boot/efi

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

利用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#安装qemu binfmt创建模拟环境

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目录下应该是这样的:

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

 

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

 

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

 

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

完成后我们来复制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,复制后、粘贴过去。最后样子大概是这样的:

最后别忘了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

  • 按部就班,多检查细节

 

写在最后:

有任何问题可以留言,或发邮件给我,hougelangley1987@gmail.com,加微信:15887005593也可以,有时不能第一时间回复哈,因为要出诊:)

 

如果各位朋友还是没完全弄明白,可以期待近期放出的视频教程,我会把3个部分拆解成9个视频,给大家详细介绍,关注我的B站,油管,或者RVspace社区,都可以。

 

有小伙伴问哪里能够买到开发板?

一起开启奇妙的RISC-V之旅吧~


-End-


延伸阅读

“昉·星光 VisionFive”单板计算机正式发货赛昉科技教你如何采用RISC-V开发板实现小车自动巡线行驶
昉·星光单板计算机正式发售,加速RISC-V生态发展

点“在看”给我一朵小黄花


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存