修改镜像内部的文件

在系统构建章节中,我们得到了系统镜像,分别是SD镜像.img格式,emmc镜像zip压缩包格式, 除了重新编译镜像之外,还有一种方法也能够修改镜像内部的内容, 将部署应用程序需要的一些程序、脚本等文件直接添加到镜像中。

修改SD镜像

将img镜像文件拷贝到linux系统下,以 sg2000-riscv-2024-08-01-ubuntu-sd.img 文件为例

  1. 使用 parted xxx.img 命令进入GNU Parted如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #parted查看img镜像情况
    parted  sg2000-riscv-2024-08-01-ubuntu-sd.img
    
    #信息输出如下
    WARNING: You are not superuser.  Watch out for permissions.
    GNU Parted 3.2
    Using /home/guest/test/sg2000-riscv-2024-08-01-ubuntu-sd.img
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted)
    

    以字节大小查看img镜像的分区情况

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    #以字节大小查看
    (parted) unit b
    (parted) print
    
    #信息输出如下
    Model:  (file)
    Disk /home/guest/test/sg2000-riscv-2024-08-01-ubuntu-sd.img: 795664896B
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags:
    
    Number  Start      End         Size        Type     File system  Flags
    1      512B       16777727B   16777216B   primary  fat16        boot, lba
    2      16777728B  795664895B  778887168B  primary  ext4
    

    从上图可以看到img镜像的分区情况,其中Start下面的 512B16777728B 表示 为文件系统的分区起始地址, 因为我们要需改文件系统里面的内容(比如添加、删除、修改一些文件或者添加自己的app), 所以我们后面的操作需要用到此地址信息。使用 quit 即可退出GNU Parted。

  2. 创建一个空白目录,用于img镜像挂载,并将img镜像第二个分区挂载到该目录下,如下所示

    1
    2
    3
    4
    5
    #创建挂载目录
    mkdir dir_img
    
    #根据第二分区起始地址进行挂载
    sudo mount -o loop,offset=16777728 sg2000-riscv-2024-08-01-ubuntu-sd.img  ./dir_img/
    

    以上将sg2000-riscv-2024-08-01-ubuntu-sd.img文件挂载到dir_img目录, 具体路径以情况以电脑上的镜像路径及需要挂载的目录为准。

  3. 接着就可以往挂载了img镜像的目录下添加自己想要的脚本、程序等文件了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #查看dir_img目录下的文件内容
    ls ./dir_img/
    
    #信息输出如下
    bin   data  etc   lib    lost+found  mnt  proc  run   sdcard  sys  udisk  var
    boot  dev   home  lib64  media       opt  root  sbin  srv     tmp  usr
    
    #往/home/cat目录下添加需要添加的文件内容
    touch dir_img/home/cat/hello.sh
    

    此处添加往/home/cat目录添加了一个简单的hello.sh,具体路径和具体文件完全由用户决定。

  4. 修改完成之后回到刚刚的目录下取消挂载img镜像的文件系统,取消挂载之后在dir_img目录下的目录和文件 将会消失。

    1
    sudo umount ./dir_img
    
  5. 此时得到img镜像已经是修改过的img镜像了,将img镜像烧写到sd卡,并选择以sd卡启动, 在板子新烧录的系统/home/cat目录下便可以看到hello.sh文件。

修改eMMC镜像

提示

以下是旨在不编译SDK修改emmc镜像包中根文件系统,如果是能够编译SDK的用户,参考Ubuntu根文件系统章节修改即可。

将构建出来的sophon-image-build/ubuntu/ubuntu-rootfs.ext4, 或者使用资料网盘/7-SDK源码压缩包/根文件系统-用于编译镜像使用的根文件系统,解压然后拷贝到linux系统下。

  1. 创建一个空白目录,用于根文件系统镜像挂载,将ubuntu-rootfs.ext4镜像挂载到该目录下,如下所示

    1
    2
    3
    4
    5
    #创建挂载目录
    mkdir dir_img
    
    #根据第二分区起始地址进行挂载
    sudo mount -o loop,offset=0 ubuntu-rootfs.ext4 ./dir_img/
    

    以上将ubuntu-rootfs.ext4文件挂载到dir_img目录, 具体路径以情况以电脑上的镜像路径及需要挂载的目录为准。

  2. 接着就可以往挂载了img镜像的目录下添加自己想要的脚本、程序等文件了。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    #查看dir_img目录下的文件内容
    ls ./dir_img/
    
    #信息输出如下
    bin   dev   ld-musl-riscv64v0p7_xthead.so.1  lib64v0p7_xthead  mnt   root  sdcard  tmp    var
    boot  etc   lib                              lost+found        opt   run   srv     udisk
    data  home  lib64                            media             proc  sbin  sys     usr
    
    #往/home/cat目录下添加需要添加的文件内容
    touch dir_img/home/cat/hello.sh
    

    此处添加往/home/cat目录添加了一个简单的hello.sh,具体路径和具体文件完全由用户决定。

  3. 修改完成之后回到刚刚的目录下取消挂载img镜像的文件系统,取消挂载之后在dir_img目录下的目录和文件 将会消失。

    1
    sudo umount ./dir_img
    
  4. 然后将修改好的ubuntu-rootfs.ext4拷贝到SDK源码的Ubuntu目录下,具体路径以情况以电脑上的镜像路径目录为准。

    1
    2
    #拷贝到ubuntu目录下,-f参数是原来存在则覆盖
    sudo cp -f ubuntu-rootfs.ext4 sophon-image-build/ubuntu/
    
  5. 借助SDK改变根文件系统格式,生成能够烧录的根文件系统,在sdk源码顶层目录执行以下命令,初始化编译环境和加载对应的emmc配置文件:

    • 如果编译过sdk的执行以下命令:

    1
    2
    3
    4
    5
    6
    7
    8
    #初始化编译环境,输入当前用户的密码
    source build/cvisetup.sh
    
    #加载对应的板级配置文件
    defconfig sg2000_lubancat_riscv_ubuntu_emmc
    
    #打包文件系统
    pack_rootfs
    

    生成的sophon-image-build/install/soc_sg2000_lubancat_riscv_ubuntu_emmc/rootfs.emmc 就是我们需要的文件系统。

    • 如果没有编译过sdk的执行以下命令:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    #初始化编译环境,输入当前用户的密码
    source build/cvisetup.sh
    
    #加载对应的板级配置文件
    defconfig sg2000_lubancat_riscv_ubuntu_emmc
    
    #创建目录
    mkdir -p install/soc_sg2000_lubancat_riscv_ubuntu_emmc/rawimages
    
    #将build/Makefile的rootfs:ebf-ubuntu-rootfs-prepare注释掉,不打包编译的sdk的.ko和.so进文件系统
    sed -i 's/^rootfs:ebf-ubuntu-rootfs-prepare/#rootfs:ebf-ubuntu-rootfs-prepare/' build/Makefile
    
    #打包文件系统
    pack_rootfs
    
    #打包完成后恢复build/Makefile配置
    sed -i 's/^#rootfs:ebf-ubuntu-rootfs-prepare/rootfs:ebf-ubuntu-rootfs-prepare/' build/Makefile
    

    生成的sophon-image-build/install/soc_sg2000_lubancat_riscv_ubuntu_emmc/rootfs.emmc 就是我们需要的文件系统。

  6. 对生成的rootfs.emmc进行md5校验

    1
    2
    3
    4
    5
    #进行md5校验
    md5sum  install/soc_sg2000_lubancat_riscv_ubuntu_emmc/rootfs.emmc
    
    #信息输出如下
    854a9456466cfe2f1384e7619519dfa0  install/soc_sg2000_lubancat_riscv_ubuntu_emmc/rootfs.emmc
    
  7. 将生成的rootfs.emmc替换到eMMC镜像包

    ../../_images/image_modify_0.jpg
  8. 修改eMMC镜像包的META目录中的metadata.txt,将生成的md5校验值修改到文件中。

    ../../_images/image_modify_1.jpg

    最终使用该emmc镜像包刷到emmc中即可,启动系统后可以在/home/cat/目录下看到我们添加的hello.sh