从零构建一个riscv64 ubuntu-20发行版系统
文章目录
- 1.搭建开发环境
- 1.1 开发涉及的环境/工具:
- 1.2 安装qemu虚拟化工具
- 1.2.1 apt安装
- 1.2.2 手动交叉编译安装
- 2. 获取riscv架构ubuntu根文件系统
- 3.Vmware ubuntu挂载riscv架构ubuntu文件系统
- 3.1. 解压缩riscv架构ubuntu文件系统到ubuntu下
- 3.1.2 拷贝qemu模拟工具到riscv64架构ubuntu-rootfs文件系统下
- 3.1.2 chroot到模拟riscv64文件系统下
- 4. 配置riscv架构的ubuntu系统
- 4.1 安装基础软件包
- 4.2 用户名密码等相关设置
- 4.3 其它配置
- 4.4 退出riscv模拟文件系统
- 4.5 配置系统内核模块以及固件
- 4.6 使用nfs方式启动系统系统
- 5. 制作可烧录的固件
- 5.1 制作ext4文件系统镜像
- 5.2 使用genimage制作可烧录镜像
- 5.3 文件系统只读问题
- 6. 启动后常见问题
- 6.1 网络相关问题
- 关于发行版文件系统的想法与建议
- 统一一个可大家长期维护的发行版系统镜像
- 使用github自动化工作流来自行构建生成系统镜像
- 【附加内容】
1.搭建开发环境
1.1 开发涉及的环境/工具:
Windows下虚拟化工具VMware workstation pro。
vmware 下运行的ubuntu /debian 虚拟机系统。
riscv 架构的ubuntu根文件系统源码包。
ch-mount.sh挂载文件系统脚本。
1.2 安装qemu虚拟化工具
1.2.1 apt安装
Ubuntu终端下需要安装qemu虚拟化工具,在终端下执行如下命令。
book@100ask:~$ sudo apt-get install qemu-user-static
安装完成后,在文件系统下执行如下命令测试是否安装成功。
book@100ask:~$ qemu-riscv64-static -version
1.2.2 手动交叉编译安装
# see https://wiki.qemu.org/Hosts/Linux#Required_additional_packages
book@100ask:~$ sudo apt-get install -y pkg-config git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
book@100ask:~$ git clone https://git.qemu.org/git/qemu.git -b v4.2.0 --depth=1
book@100ask:~$ cd qemu && mkdir build && cd build
book@100ask:~$ mkdir out
# You have to build as a static binary.
book@100ask:~$ ../configure --static --target-list=riscv64-linux-user --prefix=$(pwd)/out
book@100ask:~$ make && make install
book@100ask:~$ cd ../../
2. 获取riscv架构ubuntu根文件系统
使用浏览器访问 http://cdimage.ubuntu.com/ubuntu-base/ 此地址,即可看到ubuntu基本系统所有的版本镜像文件,这里我们选择releases发布版。
我们点击 release 发布版本的连接后进入如下图所示界面,这里列出了ubuntu base各个版本的下载地址,如下图根据红框所示,点击20.04 目前只有ubuntu 20支持了riscv64架构。
点击20.04后在弹出新的页面内继续点击 releases 。
之后页面就跳入ubuntu base 20.04 lts文件系统的下载页面了,这里列出了各种架构的文件系统源码包,不同的历史版本,我们页面往下滑,找到最新的架构为 riscv64的ubuntu系统源码包,如下图红框所示,下载 ubuntu-base-20.04.2-base-riscv64.tar.gz 到电脑磁盘上,让后上传此文件到VMware Ubuntu系统内。
3.Vmware ubuntu挂载riscv架构ubuntu文件系统
3.1. 解压缩riscv架构ubuntu文件系统到ubuntu下
在VMware Ubuntu虚拟机家目录下创建一个 ubuntu-rootfs目录,用于解压缩保存文件使用。
book@100ask:~$ mkdir ubuntu-rootfsbook@100ask:~$ sudo tar -xvf ubuntu-base-20.04.2-base-riscv64.tar.gzz -C ubuntu-rootfs/
查看当前路径下的文件结构已经OK
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NS48gwwY-1626167188187)(images/clip_image014.jpg)]
3.1.2 拷贝qemu模拟工具到riscv64架构ubuntu-rootfs文件系统下
book@100ask:~$ sudo cp usr/bin/qemu-riscv64-static ubuntu-rootfs/usr/bin/
注意:qemu-riscv64-static 指的是riscv64架构的虚拟化工具,果是其他架构的则拷贝其他文件。
如果你是手动编译生成的qemu-riscv64-static文件,则参考下述命令。
book@100ask:~$ sudo cp ./qemu/build/out/bin/qemu-riscv64 ./riscv/usr/bin/qemu-riscv64-static
ubuntu-roofs/usr/bin/ 指的是你当前解压riscv64架构的ubuntu20.04文件系统后的所在目录下的 usr/bin。
拷贝主机DNS配置文件到riscv架构Ubuntu文件系统内(必须拷贝,否则可能会导致下面操作无法进行)。
book@100ask:~$ sudo cp /etc/resolv.conf ubuntu-rootfs/etc/resolv.conf
3.1.2 chroot到模拟riscv64文件系统下
我们需要使用chroot 改变根目录来挂载riscv架构的ubuntu根文件系统,并配置或安装一些必要资源,首先创建ch-mount.sh 脚本。
book@100ask:~$ vi ch-mount.sh
将以下的内容复制到ch-mount.sh中。
#!/bin/bashfunction mnt() {echo "MOUNTING"sudo mount -t proc /proc ${2}procsudo mount -t sysfs /sys ${2}syssudo mount -o bind /dev ${2}devsudo chroot ${2}
}function umnt() {echo "UNMOUNTING"sudo umount ${2}procsudo umount ${2}syssudo umount ${2}dev}if [ "$1" == "-m" ] && [ -n "$2" ] ;
thenmnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
thenumnt $1 $2
elseecho ""echo "Either 1'st, 2'nd or both parameters were missing"echo ""echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"echo ""echo "For example: ch-mount -m /media/sdcard/"echo ""echo 1st parameter : ${1}echo 2nd parameter : ${2}
fi
考虑到shell脚本对空格很灵敏,所以将我使用的文件放在如下地址处。
book@100ask:~$ wget \
https://weidongshan.coding.net/p/DevelopmentEnvConf/d/DevelopmentEnvConf/git/raw/master/ubuntu_rootfs-mount/ch-mount.sh
book@100ask:~$ chmod +x ch-mount.sh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRSgfL08-1626167188187)(images/clip_image016.jpg)]
接下来我们使用ch-mount.sh脚本挂载riscv架构ubuntu文件系统,挂载命令如下所示,挂载成功后会提示 MOUNTING。
book@100ask:~$ sudo ./ch-mount.sh -m ubuntu-rootfs/
此时我们可以在此执行 uname -a来查看系统内核的详细信息,你会发现现在是 riscv架构。
4. 配置riscv架构的ubuntu系统
4.1 安装基础软件包
Chroot进入模拟的riscv架构Ubuntu系统后需要先安装如下必须的安装包,安装包安装过程会根据你的网络下载速率可能会需要一段时间。
安装基础软件包之前需要先执行 apt-get update命令来更新软件源,用以获取软件包的地址等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bbRRgyeq-1626167188188)(images/clip_image020.jpg)]
软件源更新完成后,可以安装必要软件包,安装速度根据个人网速绝定。
apt-get install \
language-pack-en-base sudo ssh net-tools network-manager iputils-ping rsyslog \
bash-completion language-pack-zh-hans vim resolvconf kmod usbutils alsa-base
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rpeZXFvf-1626167188189)(images/clip_image022.jpg)]
4.2 用户名密码等相关设置
- 添加用户、设定合适的组并设置密密码
添加book用户并加入admin sudo用户组,设置密码为123456
root@100ask:/# useradd -s '/bin/bash' -m -G adm,sudo book
root@100ask:/# echo "Set password for book:"
root@100ask:/# passwd book
初始化root用户密码,这里设置为123456
root@100ask:/# passwd root
4.3 其它配置
- 设置主机名称和hosts
在模拟的riscv架构ubuntu根文件系统下执行如下两条命令即可设置主机名称。
root@100ask:/# echo 100ask > /etc/hostname
root@100ask:/# echo 100ask > /etc/hosts
- 配置登陆的启动串口脚本
因为暂时未安装桌面,所以这里的配置要具体和内核中登录的串口的设备对应起来,不然对导致无法通过串口登录的问题。
在 /etc/init/ 下添加或修改ttyS0.conf
root@100ask:/# cat > /etc/init/ttyS0.conf << EOT
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty -L 115200 S0
EOT
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cdfUYjGB-1626167188189)(images/clip_image024.jpg)]
- 配置网卡接口
root@100ask:/# cat >> /etc/network/interfaces << EOT
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOT
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wME8W3U-1626167188190)(images/clip_image026.jpg)]
4.4 退出riscv模拟文件系统
配置或安装完基本的设置后,就可以退出模拟的riscv架构文件系统了,操作步骤如下,先在模拟的riscv架构文件系统内执行exit 退出到 VMware ubuntu虚拟机终端界面,让后卸载chroot挂载。
root@100ask:/# exit
book@100ask:~$ sudo ./ch-mount -u ubuntu-rootfs
完成这些后,我们需要把内核镜像设备树,以及模块驱动等文件拷贝到riscv架构的ubuntu文件系统相应目录内。
4.5 配置系统内核模块以及固件
安装内核模块到riscv架构的ubuntu文件系统内,如下命令所示,INSTALL_MOD_PATH后面的目录地址为riscv架构ubuntu文件系统所在绝对路径(模块安装前需要先编译模块)。
book@100ask:~$ sudo make ARCH=riscv INSTALL_MOD_PATH=/home/book/ubuntu-rootfs modules_install
安装完成后查看risv架构ubuntu文件系统的 lib/modules/ 目录下是否有如下相应文件生成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JH7CG4XB-1626167188190)(images/clip_image030.jpg)]
自此,riscv架构的ubuntu文件系统已经基本制作完成,接下来我们需要制作为可烧录的镜像文件。
4.6 使用nfs方式启动系统系统
目前uboot不支持网卡,据说官方正在适配中。
5. 制作可烧录的固件
5.1 制作ext4文件系统镜像
如下命令所示,需要先生成一个大小为2GB的 ubuntu-rootfs.ext4 镜像文件,让后格式化镜像为ext4格式,之后通过挂载镜像方式把制作好的镜像文件拷贝到文件系统内。
book@100ask:~$ dd if=/dev/zero of=ubuntu-rootfs.ext4 bs=1M count=2048
book@100ask:~$ sudo mkfs.ext4 -F ubuntu-rootfs.ext4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbommO4F-1626167188190)(images/clip_image032.jpg)]
如下命令所示,创建一个ubuntu-mount 目录,并挂载ubuntu-rootfs.ext4 镜像到该目录下,之后拷贝制作好的文件系统内所有文件到此挂载目录,紧接着使用sync命令同步数据缓存保证拷贝完成,完成后可以使用sudo umount ubuntu-mount/卸载当前挂载的镜像。
book@100ask:~$ mkdir ubuntu-mount
book@100ask:~$ sudo mount ubuntu-rootfs.ext4 ubuntu-mount/
book@100ask:~$ sudo cp -rvfp ubuntu-rootfs/* ubuntu-mount/
book@100ask:~$ sync
book@100ask:~$ sudo umount ubuntu-mount/
5.2 使用genimage制作可烧录镜像
我们只制作好ext4格式的文件系统并不能直接烧录到开发板启动,此时我们需要使用buildroot下的genimage工具来帮我们打包生成一个完整的镜像文件。
首先把制作好的 ubuntu-rootfs.ext4 镜像拷贝到已经编译过的 buildroot output/images目录下。
book@virtual-machine:~/Neza-D1/buildroot-2021/output/images$
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kh72Wa8I-1626167188191)(images/image-20210707131813013.png)]
修改buildroot根目录下board/Neza/d1/genimage.cfg 分区配置文件,来指定一下rootfs分区用的镜像文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnWwXNAH-1626167188191)(images/image-20210707132102227.png)]
1 image Neza-d1-ubuntu-20-sdcard.img {2 hdimage{3 gpt = true4 gpt-location = 1M5 }6 partition boot0 {7 in-partition-table = "no"8 image = "boot0_sdcard.fex"9 offset = 8K10 }11 partition boot-packages {12 in-partition-table = "no"13 image = "boot_package.fex"14 offset = 16400K15 }16 partition env {17 image = "env.fex"18 size = 128k19 }20 partition env-redund {21 image = "env.fex"22 size = 128k23 }24 partition boot {25 partition-type = 0xC26 bootable = "true"27 image = "boot.vfat"28 }29 partition rootfs {30 partition-type = 0x8331 image = "ubuntu-rootfs.ext4"32 }33 }3435 image boot.vfat {36 vfat {37 files = {38 "boot.img",39 "Image",40 "board.dtb"41 }42 }43 size = 32M44 }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rEkJuWxd-1626167188191)(images/image-20210707132005507.png)]
执行上述步骤以后,保存退出 在buildroot根目录下执行make all命令来打包生成完整的镜像,最后生成的镜像输出在 buildroot根目录下的output/images/ 可以拷贝出来用windows下的wind32diskimage工具进行烧录 烧录成功后即可启动。
5.3 文件系统只读问题
- 开发板启动 切换终端 一直按 s 键 进入uboot命令行模式,来给设置bootargs 增加rw 读写权限。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-swsUmzno-1626167188192)(images/image-20210707131109707.png)]
setenv bootargs earlyprintk=sunxi-uart,0x02500000 clk_ignore_unused initcall_debug=0 console=ttyS0,115200 loglevel=8 root=/dev/mmcblk0p4 rw init=/sbin/init partitions=ext4 cma=8M gpt=1
saveenv
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HHUHqUvw-1626167188192)(images/image-20210707131158747.png)]
设置成功后 保存重启。
6. 启动后常见问题
6.1 网络相关问题
- 不能上网
配置dns服务器文件
vim /etc/resolv.conf
添加你的dns地址,至于怎么获取就不过多阐述
route add default gw 192.168.1.1
关于发行版文件系统的想法与建议
统一一个可大家长期维护的发行版系统镜像
- 目前看到有很多自己做的发行版系统镜像,各有各的优势与问题,我们是否可以统一成一个开源镜像大家一起维护升级,给更多的新的朋友一个更好的体验呢?
使用github自动化工作流来自行构建生成系统镜像
- 发现每次修改ubuntu文件系统只是做了一次小的改动 却要机械化的处理整个打包编译生成的过程,太过于浪费时间效率,想使用GitHub的CI自动化来根据我们每次的修改自动编译构建生成系统镜像文件,方便你我他。
附上两张启动log
【附加内容】
哪吒板子论坛文章地址 https://bbs.aw-ol.com/topic/185
3.0哈BL4ZX83TTlE信 https://m.tb.cn/h.4x1l3aO?sm=958999 D1开发板哪吒 全志在线首款Linux/Vector RISC-V64bit处理器
从零构建一个riscv64 ubuntu-20发行版系统相关推荐
- Ubuntu 20.04 LTS 系统下 安装Nvidia 显卡驱动、CUDA、cuDNN, 并可进行CUDA版本切换
因为做深度学习的研究项目,为全新机器在Ubuntu 20.04 LTS 系统下 安装Nvidia 显卡驱动.Cuda.Cudnn.并进行CUDA版本切换 成功安装完成了,写个记录. 1. 安装Nvid ...
- Linux搭建虚拟专用,Ubuntu的发行版如何搭建虚拟专用网
是通过因特网上将局域网扩展到远程网络和远程计算机用户的一种成本效益极佳的办法.那么Ubuntu的发行版如何搭建虚拟专用网呢?下面学习啦小编就为大家带来了Ubuntu发行版搭建虚拟专用网的方法. Ubu ...
- 构建一个你自己的类微信系统 -- 可扩展通信系统实践
##前言 正如你们所知的那样,微信是一个非常成功的在线服务系统,由几万台服务器组成的系统为几亿人提供着稳定的业务服务.可惜作为一个普通的工程师基本上不可能有整体设计这样一个系统的机会,即使加入xx 也 ...
- 苹果系统 macOS Catalina 10.15.7 安装 Ubuntu 20.04 双系统 采用rEFInd引导
苹果系统 macOS Catalina 10.15.7 安装 Ubuntu 20.04 双系统 采用rEFInd引导 0. 前言 1. 准备工作 & 系统情况 2. 制作Ubuntu安装盘(U ...
- 一条命令搞定Linux字体渲染——Ubuntu系发行版微软雅黑+宋体终极解决方案
一条命令搞定Linux字体渲染--Ubuntu系发行版微软雅黑+宋体终极解决方案 转自 http://www.lulinux.com/archives/278 2014.09.10致歉与更新说明:因l ...
- 使用MPICH构建一个四节点的集群系统
http://selboo.com.cn/post/202/ 1.什么是服务器集群 随着Internet的爆炸性增长,Internet与人的生活越来越息息相关,通过Internet上进行交易也就越来越 ...
- 如何构建一个高效的企业舆情监测系统?
随着互联网的快速发展,企业需要对自身在网络上的形象和声誉进行全方位的监控和管理,以保证企业的长期稳定发展.构建一个高效的企业舆情监测系统已经成为了当下企业发展的必要手段.本文将通过国内具体案例分析,阐 ...
- 国产Linux发行版系统再添一员,颜值完全不输苹果
当今市面上Linux操作系统的种类实在是太多了,各种各样的Linux发行版及其衍生系统数不胜数,常常让人看得眼花缭乱. 在我们之前<常用Linux发行版操作系统大盘点>那篇文章里,我们曾经 ...
- Linux下打包qt程序,可以发布到一台纯净的linux发行版系统上
1.把你要发布的程序单独放到一个文件夹下 2.在文件夹下创建一个sh脚本名为pack.sh 输入以下内容 #!/bin/sh exe="app" #你需要发布的程序名称 des=& ...
最新文章
- 三维视觉惯性SLAM的有效Schmidt-EKF
- 深入理解 JavaScript Function
- Python---获取div标签中的文字
- Activiti部署报错
- maven-约定优于配置
- callablestatement存储过程
- jdbc ?占位符不起作用_JDBC高级(二):DbUtils
- cmd设置mysql初始密码_windows下mysql初始密码设置
- [詹兴致矩阵论习题参考解答]习题1.11
- NCBI数据上传(二):转录组测序(RNA-Seq)数据
- LDA算法原理及matlab实现
- UE4蓝图教程(1)
- flask框架可以做什么?
- 【无标题】报班第一节课
- 计算机怎样更新卡驱动,电脑显卡驱动怎么更新(NVIDIA显卡手动更新教程)
- Kevgir靶机渗透——弱口令爆破
- MpAndroidChart Y轴显示整数
- 经济形势这么差为什么要创业——Why to Start a Startup in a Bad Economy
- 爆路径写后门拿shell的一些姿势
- LeetCode力扣刷题——居合斩!二分查找
热门文章
- 韩国MBC、KBS、SBS
- 项目经理如何写年终总结,范文+PPT模板
- 班级文化建设计算机专业,云计算背景下计算机专业三二段学生班级文化建设研究①...
- 联想台式计算机装系统,联想台式电脑用u盘怎么重装win7系统教程
- 通达OA 在OA系统中增加员工自助查询工资条的功能(图文)
- 刚入行的 可以了解下什么是物理机和虚拟机 租用和托管 ——世通兰陵王为你解答
- m35c android 4.4,手机实时动态:评测:索尼M35c的整体性能简介及性价比如何
- 手机安装Python
- 微软电脑管家V2.1公测版正式发布
- Java 使用jsoup下载网页内容到本地