一. 前言
本文分享基于WSL,玄铁官方仓库c-sky/buildroot,构建玄铁CPU系统镜像的过程。这里使用WSL而不是使用vmware等虚拟机或者是linux主机。毕竟windows还是开发主力,WSL可以和windows无缝使用,且比安装vmware等虚拟机更简单,资源需求更低,一些性能不强的电脑往往使用vmware会很卡,使用WSL的话基本也没问题。
二. WSL环境准备
参考https://learn.microsoft.com/zh-cn/windows/wsl/install-manual。
我这里使用的系统是Windows 11 专业版22631.3958。
2.1安装WSL使能虚拟机
点击桌面左下角windows图标,搜索栏输入powershell,找到WindowsPowerShell,右键点击,以管理员身份运行,弹出用户账户控制对话框,点击是。
然后输入以下命令回车:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
继续输入以下命令回车
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
2.2安装WSL2
从以下地址下载WSL2安装包
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
双击打开wsl_update_x64.msi开始安装。
点击下Next
弹出用户账户控制对话框点击是
安装完,点击Finish
Powershell中输入以下命令回车,设置默认使用WSL2
wsl --set-default-version 2
2.3安装发行版
参考如下链接安装linux发行版
我这里下载Ubuntu22.04 LTS
https://aka.ms/wslubuntu2204
下载得到Ubuntu2204-221101.AppxBundle
在D盘新建WSL文件夹,把该文件复制过去。
右键点击该文件,用压缩文件打开,解压到当前目录
继续解压Ubuntu_2204.1.7.0_x64.appx
得到如下文件
双击ubuntu.exe开始安装,会自动在此创建虚拟盘ext4.vhdx, 相当于系统就安装在了这个位置。
按提示输入用户名和密码,完成安装
2.4更新系统
sudo apt update
sudo apt upgrade
2.5运行GUI应用
sudo apt install x11-apps -y
输入xclock可以看到图形应用运行也OK
2.6 安装终端
为了方便打开多终端,可以安装终端应用
https://apps.microsoft.com/detail/9n0dx20hk701?rtc=1&hl=zh-cn&gl=CN
下载后双击Windows Terminal Installer.exe安装
再打开终端即可打开多界面
一. 玄铁buildroot构建系统
参考https://github.com/c-sky/buildroot
3.1 下载源码
git clone https://github.com/c-sky/buildroot.git
cd buildroot
3.2 构建
3.2.1 安装依赖库
需要先安装make工具,gcc工具和其他一些库
sudo apt install make
sudo apt install gcc
sudo apt install unzip
sudo apt install bc
sudo apt install bzip2
sudo apt install build-essential
然后
make CONF=thead_9xxf_enhanced_5.10_glibc_br_defconfig
其中thead_9xxf_enhanced_5.10_glibc_br_defconfig位于configs_enhanced下,configs 下也是配置文件。
3.2.2错误处理
c-stack.c的SIGSTKSZ错误
如果报错如下
from c-stack.c:49:
c-stack.c:55:26: error: missing binary operator before token "("
55 |
先查找文件c-stack.c的位置
find . -name c-stack.c
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/host-m4-1.4.18/lib/c-stack.c
然后修改该文件
nano ./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/host-m4-1.4.18/lib/c-stack.c
/* libsigsegv 2.6 through 2.8 have a bug where some architectures use
more than the Linux default of an 8k alternate stack when deciding
if a fault was caused by stack overflow. */
改为
//#elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
/* libsigsegv 2.6 through 2.8 have a bug where some architectures use
more than the Linux default of an 8k alternate stack when deciding
if a fault was caused by stack overflow. */
//# undef SIGSTKSZ
//# define SIGSTKSZ 16384
ctrl+o保存,ctrl+x退出。
libfakeroot.c的_STAT_VER报错
报以下错误
from libfakeroot.c:60:
libfakeroot.c: In function ‘statx’:
libfakeroot.c:102:50: error: ‘_STAT_VER’ undeclared (first use in this function)
102 | #define INT_NEXT_FSTATAT(a,b,c,d) NEXT_FSTATAT64(_STAT_VER,a,b,c,d)
先查找该文件位置
find . -name libfakeroot.c
qinyunti@LAPTOP-2SG60VPF:~/buildroot$ find . -name libfakeroot.c
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/host-fakeroot-1.25.3/libfakeroot.c
修改该文件
nano ./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/host-fakeroot-1.25.3/libfakeroot.c
添加以下内容
/usr/bin/env: ‘python’: No such file or directory
安装的是python3,所以手动添加软链接。
sudo ln -s /usr/bin/python3 /usr/bin/python
can't create node
打印如下
makedevs: line 22: can't create node /home/qinyunti/buildroot/thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/buildroot-fs/cpio/target/dev/null: Operation not permitted
下载最新的文件https://gitlab.com/buildroot.org/buildroot/-/tree/master/package/fakeroot?ref_type=heads,fakeroot.hash与fakeroot.mk。
查找fakeroot目录
find -name fakeroot
./dl/fakeroot
./buildroot-9d1d4818c39d97ad7a1cdf6e075b9acae6dfff71/package/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/host-fakeroot-1.25.3/scripts/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/buildroot-config/br2/rootfs/post/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/buildroot-fs/cpio/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/host/bin/fakeroot
将下载的新文件替换./buildroot-9d1d4818c39d97ad7a1cdf6e075b9acae6dfff71/package/fakeroot下的文件
删除
./dl/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/host-fakeroot-1.25.3/scripts/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/buildroot-config/br2/rootfs/post/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/build/buildroot-fs/cpio/fakeroot
./thead_9xxf_enhanced_5.10_glibc_br_defconfig/host/bin/fakeroot
/home/qinyunti/buildroot/buildroot-9d1d4818c39d97ad7a1cdf6e075b9acae6dfff71/pac
kage/fakeroot/0001-skip-doc-subdirs.patch
重新编译。
3.3.3 构建输出
根据构建的组建的多少和电脑性能以及网速,需要的时间不一样的,我这里花了大几个小时才完成。
构建好的文件位于
thead_9xxf_enhanced_5.10_glibc_br_defconfig/images/
ls thead_9xxf_enhanced_5.10_glibc_br_defconfig/images/
Image fw_dynamic.bin fw_jump.bin hw readme.txt rootfs.cpio rootfs.ext2 uImage
fw_dynamic.elf fw_jump.elf linux-custom.patch.xz readme_advanced.txt rootfs.cpio.gz rootfs.tar
3.3 Qemu运行
Qemu相关工具位于thead_9xxf_enhanced_5.10_glibc_br_defconfig/host/csky-qemu/
先检查依赖库
ldd thead_9xxf_enhanced_5.10_glibc_br_defconfig/host/csky-qemu/bin/qemu-system-riscv64
以下库需要安装
安装libbrlapi
安装
sudo apt install libbrlapi-dev
查找安装的位置
find /usr/lib -name "libbrlapi*"
看到是0.8版本
/usr/lib/x86_64-linux-gnu/libbrlapi.so.0.8
/usr/lib/x86_64-linux-gnu/libbrlapi.so
/usr/lib/x86_64-linux-gnu/libbrlapi.so.0.8.3
/usr/lib/x86_64-linux-gnu/libbrlapi.a
直接创建一个0.6版本的软链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libbrlapi.so.0.8 /usr/lib/x86_64-linux-gnu/li
bbrlapi.so.0.6
安装libvdeplug
sudo apt install libvdeplug-dev
安装libaio
sudo apt install libaio-dev
安装libpixman
sudo apt-get -y install libpixman-1-dev
安装libbluetooth
sudo apt-get -y install libbluetooth-dev
安装 libpng12
sudo add-apt-repository ppa:linuxuprising/libpng12
sudo apt update
sudo apt install libpng12-0
安装libsnappy
sudo apt install -y libsnappy-dev
安装libnettle
wget https://ftp.gnu.org/gnu/nettle/nettle-3.2.tar.gz
tar -xvf nettle-3.2.tar.gz
cd nettle-3.2/
sudo apt-get install m4
&& make -j 4
sudo make install
安装到了/usr/local/lib64/下。
创建软连接
sudo ln -s /usr/local/lib64/libnettle.so.6 /lib/libnettle.so.6
运行
cd thead_9xxf_enhanced_5.10_glibc_br_defconfig/
./host/csky-qemu/bin/qemu-system-riscv64 -M virt -cpu c910 -kernel ./images/fw_jump.bin -device loader,file=./images/Image,addr=0x80200000 -append "rootwait root=/dev/vda ro" -drive file=./images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -nographic -smp 1 -bios ./images/fw_jump.bin
启动如下,输入root登录
四. 总结
本文分享了基于WSL,玄铁buildroot官方仓库,构建玄铁CPU系统镜像的过程。使用WSL比较方便,替代了安装庞大的虚拟机。主要先体验下构建过程,记录下构建过程中的问题处理,qemu运行时一些依赖库的安装。后续开始移植到具体的开发板的工作。