首先你需要一款专为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/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文件,类似下图:
这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 #安装我喜欢的yay
pacman -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 --systohc
apt install ntpdate
ntpdate -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-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位密钥
上图就是创建后的大致样子。
下面就可以来发布或者撤销你创建好的内核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
#对该块设备进行分区,分区的样子类似下图:
格式化上面的三个分区:
注意第一个分区是空分区;
第二个分区,格式化成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 -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
按部就班,多检查细节
全部0条评论
快来发表一下你的评论吧 !