uboot命令实践:ext4系列命令实践

本文详细介绍了在U-Boot环境下如何操作ext4文件系统,包括使用ext4ls、ext4size、ext4load和ext4write等命令进行文件的读写、大小检查和升级场景的应用。同时,通过实例展示了如何在子目录中操作文件,并探讨了如何确定ext4文件系统的起始扇区和大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一 应用场景

1.升级uboot

2.uboot升级zImage

3.uboot升级ramdisk

二 ext4命令族

ext4ls

ext4size

ext4load

ext4write

三 综合实践:测试u-boot.bin

四 ext4分区看文件大小

1 使用ext4load

2 使用ext4ls

五 使用ext4操作子目录中的文件实践-测试u-boot.bin

六 使用ext4操作不存在目录中的文件实践-测试u-boot.bin

总结

思考题:如何知道ext4文件系统的的起始扇区和大小?


前言

首先确定一下板子上是否有ext4文件系统,如果没有,就不用测试里

使用fstype命令。

=> fstype
fstype - Look up a filesystem type

Usage:
fstype <interface> <dev>:<part>
- print filesystem type
fstype <interface> <dev>:<part> <varname>
- set environment variable to filesystem type
=> fstype mmc 1:0
Failed to mount ext2 filesystem...
** Unrecognized filesystem type **
=> fstype mmc 1:1
fat
=> fstype mmc 1:2
ext4

从上面的测试结果可知 mmc设备1的2分区是ext4文件系统,可以继续测试。

一 应用场景

单一的命令,需要合理的使用,才具备大作用,先设计几个应用场景。

1.升级uboot

   根文件系统是ext4分区,升级时,用户将u-boot.imx放到根文件系统中,启动时,通过检测ext4分区中有u-boot.imx文件,然后达到升级的目的,升级完成以后,设置一个升级完成标志,然后再根文件系统中,通过检测升级标志,删除u-boot.imx文件,这其中最主要的就是,做好文件完整性校验工作。

2.uboot升级zImage

    原理同升级u-boot

3.uboot升级ramdisk

    原理同上

二 ext4命令族

ext4load 、ext4ls ext4size 和 ext4write

ext4ls

=> ext4ls
ext4ls - list files in a directory (default /)

Usage:
ext4ls <interface> <dev[:part]> [directory]
    - list files from 'dev' on 'interface' in a 'directory'
=> ext4ls mmc 1:2
<DIR>       4096 .
<DIR>       4096 ..
<DIR>      16384 lost+found
<DIR>       4096 bin
<DIR>       4096 buildrootfs
<DIR>       4096 dev
<DIR>       4096 etc
               5 hello.txt
<DIR>       4096 home
<DIR>       4096 lib
<SYM>          3 lib32
<SYM>         11 linuxrc
          157475 main
<DIR>       4096 media
<DIR>       4096 mmcblk1p1
<DIR>       4096 mnt
<DIR>       4096 opt
<DIR>       4096 pn
<DIR>       4096 proc
<DIR>       4096 root
<DIR>       4096 run
<DIR>       4096 sbin
<DIR>       4096 sys
<DIR>       4096 tmp
<DIR>       4096 usr
<DIR>       4096 var
               0 我的文件
             484 single_check.sh
               3 flag.txt
=>

ext4size

=> ext4size
ext4size - determine a file's size

Usage:
ext4size <interface> <dev[:part]> <filename>
    - Find file 'filename' from 'dev' on 'interface'
      and determine its size.
=>
=> ext4size mmc 1:2 single_check.sh

这个命令有问题,没有任何反应。

ext4load

=> ext4load
ext4load - load binary file from a Ext4 filesystem

Usage:
ext4load <interface> [<dev[:part]> [addr [filename [bytes [pos]]]]]
    - load binary file 'filename' from 'dev' on 'interface'
      to address 'addr' from ext4 filesystem
=> ext4load mmc 1:2 80800000 flag.txt
3 bytes read in 134 ms (0 Bytes/s)
=> md.b 80800000 3
80800000: 32 35 0a                                           25.
=> ext4size mmc 1:2 /flag.txt

ext4write

=> ext4write
ext4write - create a file in the root directory

Usage:
ext4write <interface> <dev[:part]> <addr> <absolute filename path>
    [sizebytes] [file offset]
    - create a file in / directory

这个命令的验证放到综合实践里

三 综合实践:测试u-boot.bin

    先将u-boot.bin通过网络下载到80800000内存,然后使用ext4write将80800000内存中的u-boot.bin写入ext4分区,然后使用ext4ls查看该文件,然后再使用ext4load将u-boot.bin文件读到87800000,然后使用go命令运行87800000内存,如果最后u-boot.bin运行成功了,说明整个测试成功。

先通过网络下载u-boot.bin到内存地址80800000

=> tftp 80800000 u-boot.bin
Using FEC0 device
TFTP from server 192.168.0.11; our IP address is 192.168.0.3
Filename 'u-boot.bin'.
Load address: 0x80800000
Loading: ######################
         2.4 MiB/s
done
Bytes transferred = 312828 (4c5fc hex)

然后将这块内存空间写到ext4文件系统中

=> ext4write mmc 1:2 80800000 /u-boot.bin 4c5fc
Recovery required
update journal finished
312828 bytes written in 1112 ms (274.4 KiB/s)

使用ext4ls看看u-boot.bin在不在ext4分区

=> ext4ls mmc 1:2
<DIR>       4096 .
<DIR>       4096 ..
<DIR>      16384 lost+found
<DIR>       4096 bin
<DIR>       4096 buildrootfs
<DIR>       4096 dev
<DIR>       4096 etc
               5 hello.txt
<DIR>       4096 home
<DIR>       4096 lib
<SYM>          3 lib32
<SYM>         11 linuxrc
          157475 main
<DIR>       4096 media
<DIR>       4096 mmcblk1p1
<DIR>       4096 mnt
<DIR>       4096 opt
<DIR>       4096 pn
<DIR>       4096 proc
<DIR>       4096 root
<DIR>       4096 run
<DIR>       4096 sbin
<DIR>       4096 sys
<DIR>       4096 tmp
<DIR>       4096 usr
<DIR>       4096 var
               0 我的文件
             484 single_check.sh
               3 flag.txt
          312828 u-boot.bin
=>

再用ext4load 这个文件读到87800000内存中

=> ext4load mmc 1:2 87800000 /u-boot.bin
312828 bytes read in 152 ms (2 MiB/s)

然后使用go执行这段内存

=> go 87800000
## Starting application at 0x87800000 ...


U-Boot 2016.03 (Aug 16 2022 - 21:10:51 +0800) hello world

DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
common/env_mmc.c,read_env,line=212:blk_start= 1536,blk_cnt = 16
In:    serial
Out:   serial
Err:   serial

测试很成功

四 ext4分区看文件大小

除了ext4size还有两个方法

1 使用ext4load

用ext4load命令把文件读回来,读取结果中有文件的大小信息

2 使用ext4ls

用ext4ls打印出所有的文件,然后看其中想看的文件的大小

五 使用ext4操作子目录中的文件实践-测试u-boot.bin

 先将u-boot.bin通过网络下载到80800000内存,然后使用ext4write将80800000内存中的u-boot.bin写入ext4分区中的/home目录,然后使用ext4ls查看该/home目录中的文件,然后再使用ext4load将u-boot.bin文件从/home目录读到87800000,然后使用go命令运行87800000内存,如果最后u-boot.bin运行成功了,说明整个测试成功。

先通过网络下载u-boot.bin到内存地址80800000

=> tftp 80800000 u-boot.bin
Using FEC0 device
TFTP from server 192.168.0.11; our IP address is 192.168.0.3
Filename 'u-boot.bin'.
Load address: 0x80800000
Loading: ######################
         2.4 MiB/s
done
Bytes transferred = 312828 (4c5fc hex)

然后用ext4write 将这块内存空间写到ext4文件系统中/home目录

=> ext4write mmc 1:2 80800000 /home/u-boot.bin 4c5fc
File System is consistent
update journal finished
312828 bytes written in 1133 ms (269.5 KiB/s)

使用ext4ls看看u-boot.bin在不在ext4分区/home目录

=> ext4ls mmc 1:2 /home
<DIR>       4096 .
<DIR>       4096 ..
<DIR>       4096 lkmao
<DIR>       4096 root
          312828 u-boot.bin


再用ext4load 从ext4分区/home目录中将u-boot.bin文件读到87800000内存中

=> ext4load mmc 1:2 87800000 /home/u-boot.bin
312828 bytes read in 88 ms (3.4 MiB/s)

然后使用go执行这段内存

=> go 87800000
## Starting application at 0x87800000 ...


U-Boot 2016.03 (Aug 16 2022 - 21:10:51 +0800) hello world

DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
common/env_mmc.c,read_env,line=212:blk_start= 1536,blk_cnt = 16
In:    serial
Out:   serial
Err:   serial

测试很成功

六 使用ext4操作不存在目录中的文件实践-测试u-boot.bin

首先,保证nodir是不存在的,如果/nodir存在,就换一个不存在的名字。

 先将u-boot.bin通过网络下载到80800000内存,然后使用ext4write将80800000内存中的u-boot.bin写入ext4分区中的/nodir目录,然后使用ext4ls查看该/nodir目录中的文件,然后再使用ext4load将u-boot.bin文件从/nodir目录读到87800000,然后使用go命令运行87800000内存,如果最后u-boot.bin运行成功了,说明整个测试成功。

先通过网络下载u-boot.bin到内存地址80800000

=> tftp 80800000 u-boot.bin
Using FEC0 device
TFTP from server 192.168.0.11; our IP address is 192.168.0.3
Filename 'u-boot.bin'.
Load address: 0x80800000
Loading: ######################
         2.4 MiB/s
done
Bytes transferred = 312828 (4c5fc hex)

然后用ext4write 将这块内存空间写到ext4文件系统中/nodir目录

=> ext4write mmc 1:2 80800000 /lako/u-boot.bin 4c5fc
File System is consistent
Invalid path
** Error ext4fs_write() **
** Unable to write file /lako/u-boot.bin **



结果证明,ext4write不具备创建目录的功能。

总结

        ext4命令族在既可以读写干目录中的文件也可以读写子目录中的文件。在读写子目录时,必须保证这个目录是存在的。

思考题:如何知道ext4文件系统的的起始扇区和大小?

这个在uboot中,肯定有对应的变量和宏,找到它,在评论区留言,这就是实践,做到了就是功力,经验就是从这些微小的积累中得来的。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值