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

首先你需要一款专为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#复制内核配置文件到内核源码根目录下,并取名为.configmake 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包,这时候会弹出一个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#对该块设备进行分区,分区的样子类似下图:
格式化上面的三个分区:
注意第一个分区是空分区;
第二个分区,格式化成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 #刷源,安装私有源内核这个时候你的/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/ status=progress bs=1m#将做好的块设备烧到你的sdcard上,这里注意确定你的块设备,别写错了第三部分小结:
根据你做的镜像发行版不同,debian和ubuntu导入你内核私有源的公钥会略有不同,根据遇到的情况查阅google
按部就班,多检查细节

CNN预测华为明年5G设备供应会出现问题 法国不会限制供应商使用华为5G设备
中兴通讯中标M.2封装成为第二大份额的厂家
TIOBE编程语言社区发布了最新的2月编程语言排行榜
基于FPGA嵌入式的多比特自相关器设计
综合河流湖泊多参数浮标水质在线监测厂家有哪些设备?
最全教程来啦!在RISC-V星光板上创建Debian系统镜像
一文区别线性稳压器LDO和开关电源DCDC
OrCAD Express功能介绍
使用ANDROID SMART PHONE的蓝牙可控机器人的制作
ofo无法在线退押 押金已经一去不复返
浅谈EMC设计中的接地问题
MIPI规范如何为开发人员减少开发工作并降低许多IIoT应用成本
魅族老套路,秀微博“无意”露出魅17截屏
仅比亚迪和宁德时代两家,突破锂电池8GWh瓦时
德州仪器推出最低待机功耗适配器电源控制器
压力开关型号规格_压力开关的压差怎么调
聊天机器人终会走向末路
因税务争议,Facebook逐步关闭几家爱尔兰控股公司
基于NI嵌入式控制器实现检测和分离循环肿瘤细胞研究
加密世界的用户怎样找到他们