目录
五 使用ext4操作子目录中的文件实践-测试u-boot.bin
六 使用ext4操作不存在目录中的文件实践-测试u-boot.bin
前言
首先确定一下板子上是否有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命令族
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中,肯定有对应的变量和宏,找到它,在评论区留言,这就是实践,做到了就是功力,经验就是从这些微小的积累中得来的。