3. 修改img镜像内部的文件

在构建鲁班猫系统章节中,我们得到了完整的img镜像(将开发板直接提供的xxx.img.xz镜像文件解压也能得到img文件), 除了重新编译镜像之外,还有一种方法也能够修改img镜像内部的内容, 将部署应用程序需要的一些程序、脚本等文件直接添加到img镜像中。

将img镜像文件拷贝到PC的ubuntu系统下,以 stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img 文件为例

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

    1
    2
    3
    4
    5
    6
    guest@dev107:~/ls$ parted  stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img
    WARNING: You are not superuser.  Watch out for permissions.
    GNU Parted 3.2
    Using /home/guest/ls/stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.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
    15
    16
    17
    (parted) unit b
    (parted) print
    Model:  (file)
    Disk /home/guest/ls/stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img: 1178599424B
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:
    
    Number  Start       End          Size         File system  Name      Flags
    1      17408B      279551B      262144B                   fsbl1
    2      279552B     541695B      262144B                   fsbl2
    3      541696B     2638847B     2097152B                  ssbl
    4      2638848B    107496447B   104857600B   fat16        bootfs    legacy_boot, msftdata
    5      107496448B  107529215B   32768B                    vendorfs
    6      107529216B  1178582527B  1071053312B  ext4         rootfs
    
    (parted)
    

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

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

    1
    2
    #根文件系统起始地址为107529216B
    sudo mount -o loop,offset=107529216 stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img  /mnt
    

    这条命令将stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img文件挂载到/mnt目录, 具体路径以情况以电脑上的镜像路径及需要挂载的目录为准。

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

    1
    2
    3
    4
    5
    6
    7
    8
    guest@dev107:~/ls$ sudo mount -o loop,offset=107529216 stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img  /mnt
    guest@dev107:~/ls$ ls /mnt/
    bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    guest@dev107:~/ls$
    
    #往/home/debian目录下添加需要添加的文件内容
    zhan@zhan:/mnt/home/debian$ ls
    bin  hello.sh
    

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

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

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

同理,我们可以挂载镜像的boot分区进行修改,命令参考如下:

1
2
#/boot分区起始地址为2638848B
sudo mount -o loop,offset=2638848 stm32mp157-lubancat-carp-qt-armhf-2023-07-27-1024M.img  /mnt