Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【实践操作】自己从头构建riscv 64 ubuntu等发行版系统!

    MR Series
    6
    9
    5432
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • baiwen
      100ask LV 6 last edited by

      • 相关参考资料及源码仓库地址
        • gitee仓库地址 https://gitee.com/weidongshan/riscv-release-rootfs.git
        • github仓库地址 https://github.com/100askTeam/riscv-release-rootfs.git

      第一章 使用官方提供的源码包进行构建

      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-16.04挂载arm架构ubuntu文件系统

      3.1. 解压缩arm架构ubuntu-16.04文件系统到ubuntu下

      在VMware Ubuntu-16.04虚拟机家目录下创建一个 ubuntu-rootfs目录,用于解压缩保存文件使用。

      book@100ask:~$ mkdir ubuntu-rootfs
      
      book@100ask:~$ sudo tar -xvf ubuntu-base-20.04.2-base-riscv64.tar.gzz -C ubuntu-rootfs/
      

      查看当前路径下的文件结构已经OK

      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配置文件到arm架构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/bash
      
      function mnt() {
          echo "MOUNTING"
          sudo mount -t proc /proc ${2}proc
          sudo mount -t sysfs /sys ${2}sys
          sudo mount -o bind /dev ${2}dev
      
          sudo chroot ${2}
      }
      
      function umnt() {
          echo "UNMOUNTING"
          sudo umount ${2}proc
          sudo umount ${2}sys
          sudo umount ${2}dev
      
      }
      
      
      if [ "$1" == "-m" ] && [ -n "$2" ] ;
      then
          mnt $1 $2
      elif [ "$1" == "-u" ] && [ -n "$2" ];
      then
          umnt $1 $2
      else
          echo ""
          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
      

      接下来我们使用ch-mount.sh脚本挂载arm架构ubuntu-16.04文件系统,挂载命令如下所示,挂载成功后会提示 MOUNTING。

      book@100ask:~$ sudo ./ch-mount.sh -m ubuntu-rootfs/
      

      此时我们可以在此执行 uname -a来查看系统内核的详细信息,你会发现现在是 riscv架构。

      4. 配置arm架构的ubuntu系统

      4.1 安装基础软件包

      Chroot进入模拟的arm架构Ubuntu系统后需要先安装如下必须的安装包,安装包安装过程会根据你的网络下载速率可能会需要一段时间。

      安装基础软件包之前需要先执行 apt-get update命令来更新软件源,用以获取软件包的地址等。

      软件源更新完成后,可以安装必要软件包,安装速度根据个人网速绝定。

      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
      

      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

      在模拟的arm架构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
      

      • 配置网卡接口
      root@100ask:/# cat >> /etc/network/interfaces << EOT
      auto lo
      iface lo inet loopback
      auto eth0
      iface eth0 inet dhcp
      EOT
      

      4.4 退出arm模拟文件系统

      配置或安装完基本的设置后,就可以退出模拟的arm架构文件系统了,操作步骤如下,先在模拟的arm架构文件系统内执行exit 退出到 VMware ubuntu虚拟机终端界面,让后卸载chroot挂载。

      root@100ask:/#  exit
      book@100ask:~$  sudo  ./ch-mount -u ubuntu-rootfs
      

      ​ 完成这些后,我们需要把内核镜像设备树,以及模块驱动等文件拷贝到riscv架构的ubuntu文件系统相应目录内。

      4.5 配置系统内核模块以及固件

      ​ 安装内核模块到riscv架构的ubuntu文件系统内,如下命令所示,INSTALL_MOD_PATH后面的目录地址为arm架构ubuntu文件系统所在绝对路径(模块安装前需要先编译模块)。

      book@100ask:~$ sudo make ARCH=riscv INSTALL_MOD_PATH=/home/book/ubuntu-rootfs modules_install
      

      ​ 安装完成后查看risv架构ubuntu文件系统的 lib/modules/ 目录下是否有如下相应文件生成

      ​ 自此,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
      

      ​ 如下命令所示,创建一个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$
      

      ​ 修改buildroot根目录下board/Neza/d1/genimage.cfg 分区配置文件,来指定一下rootfs分区用的镜像文件。

        1 image Neza-d1-ubuntu-20-sdcard.img {
        2         hdimage{
        3                 gpt = true
        4                 gpt-location = 1M
        5         }
        6         partition boot0 {
        7                 in-partition-table = "no"
        8                 image = "boot0_sdcard.fex"
        9                 offset = 8K
       10         }
       11         partition boot-packages {
       12                 in-partition-table = "no"
       13                 image = "boot_package.fex"
       14                 offset = 16400K
       15         }
       16         partition env {
       17                 image = "env.fex"
       18                 size = 128k
       19         }
       20         partition env-redund {
       21                 image = "env.fex"
       22                 size = 128k
       23         }
       24         partition boot {
       25                 partition-type = 0xC
       26                 bootable = "true"
       27                 image = "boot.vfat"
       28         }
       29         partition rootfs {
       30                 partition-type = 0x83
       31                 image = "ubuntu-rootfs.ext4"
       32         }
       33 }
       34
       35 image boot.vfat {
       36         vfat {
       37         files = {
       38                 "boot.img",
       39                 "Image",
       40                 "board.dtb"
       41         }
       42         }
       43         size = 32M
       44 }
      
      

      ​ 执行上述步骤以后,保存退出 在buildroot根目录下执行make all命令来打包生成完整的镜像,最后生成的镜像输出在 buildroot根目录下的output/images/ 可以拷贝出来用windows下的wind32diskimage工具进行烧录 烧录成功后即可启动。

      文件系统只读问题

      • 开发板启动 切换终端 一直按 s 键 进入uboot命令行模式,来给设置bootargs 增加rw 读写权限。

      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
      

      设置成功后 保存重启。

      6. 启动后常见问题

      6.1 网络相关问题

      • 不能上网

      配置dns服务器文件

      vim /etc/resolv.conf

      添加你的dns地址,至于怎么获取就不过多阐述

      route add default gw 192.168.1.1

      关于发行版文件系统的想法与建议

      统一一个可大家长期维护的发行版系统镜像

      • 目前看到有很多自己做的发行版系统镜像,各有各的优势与问题,我们是否可以统一成一个开源镜像大家一起维护升级,给更多的新的朋友一个更好的体验呢?

      使用github自动化工作流来自行构建生成系统镜像

      • 发现每次修改ubuntu文件系统只是做了一次小的改动 却要机械化的处理整个打包编译生成的过程,太过于浪费时间效率,想使用GitHub的CI自动化来根据我们每次的修改自动编译构建生成系统镜像文件,方便你我他。
      baiwen N 2 Replies Last reply Reply Quote Share 3
      • baiwen
        100ask LV 6 @baiwen last edited by

        @allwinnertech 附上两张启动logs 大家可以自行构建尝试哦 neza-ubuntu-18.0400.jpg neza-ubuntu-18.0401.jpg

        M C 3 Replies Last reply Reply Quote Share 3
        • M
          molin2050 LV 5 @baiwen last edited by

          @allwinnertech 做好的镜像可以分享一下吗

          1 Reply Last reply Reply Quote Share 0
          • M
            molin2050 LV 5 @baiwen last edited by

            @allwinnertech 4.5 配置系统内核模块以及固件
            ​ 安装内核模块到riscv架构的ubuntu文件系统内,如下命令所示,INSTALL_MOD_PATH后面的目录地址为arm架构ubuntu文件系统所在绝对路径(模块安装前需要先编译模块)。

            需要先编译模块是编译哪个?有人知道吗,怎么编译?
            我直接运行
            sudo make ARCH=riscv INSTALL_MOD_PATH=/home/book/ubuntu-rootfs modules_installsudo make ARCH=riscv INSTALL_MOD_PATH=/home/liujiqing/ubuntufs/ubuntu-rootfs modules_install
            make: *** No rule to make target 'modules_install'. Stop.

            M 1 Reply Last reply Reply Quote Share 0
            • M
              molin2050 LV 5 @molin2050 last edited by

              @molin2050 在 【实践操作】自己从头构建riscv 64 ubuntu等发行版系统! 中说:

              make: *** No rule to make target 'modules_install'. Stop.
              有没有人试试这个ubuntu,没验证过
              链接:https://pan.baidu.com/s/1MPnTfWJfZ_ZsnfKCC1kIIQ
              提取码:1h34

              1 Reply Last reply Reply Quote Share 0
              • C
                cvwithd1 LV 4 @baiwen last edited by

                @allwinnertech 我看这里用的ubuntu是ubuntu-base,不是满血的python。ubuntu现在有释出一个给另一个厂商做的risc v镜像,不知道那个能不能直接跑在d1上。

                1 Reply Last reply Reply Quote Share 0
                • N
                  nightseas LV 2 @baiwen last edited by

                  @allwinnertech 可以考虑上Armbian,核心的build flow和distro有armbian来维护,这边只需要维护板卡相关的部分。

                  1 Reply Last reply Reply Quote Share 0
                  • Y
                    yaoxiaoyao LV 5 last edited by

                    @allwinnertech 在 【实践操作】自己从头构建riscv 64 ubuntu等发行版系统! 中说:

                    qemu

                    apt安装后没有qemu-riscv-static

                    1 Reply Last reply Reply Quote Share 0
                    • Referenced by  Kirin Kirin 
                    • Y
                      yang_wang LV 3 last edited by

                      3.Vmware ubuntu-16.04挂载arm架构ubuntu文件系统

                      1 Reply Last reply Reply Quote Share 0
                      • 1 / 1
                      • First post
                        Last post

                      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                      行为准则 | 用户协议 | 隐私权政策