有时候我们为了分析文件系统结构等目的,需要从指定的块地址中读取数据出来分析。
这时候我们可以用两个Ubuntu自带的工具,filefrag用于获取inode的块地址,dd命令或者nvme-cli(仅适用于NVMe设备)用于从块地址中读出数据。以我本机的一个文件为例:
sudo filefrag -b4096 -v /home/nvme/config.json
这一步用于获取/home/nvme/config.json文件的文件布局。-b后面跟的是以多大的块粒度打印,如果不加的话默认以4096Byte为单位打印。然后我们得到输出如下:
logical_offset代表的是这个文件的文件内偏移,以字节为单位
physical代表的是磁盘内的偏移,同样以字节为单位,块地址的话需要除以块大小。这里我们计算后得出块地址为555015,然后我们利用nvme-cli获取数据:
sudo nvme read /dev/nvme0n1 -s 555015 -c 0 -z 4096 -d ./nvme-read-record/data.bin -t
-d后面是存放读取出来的块数据的文件名,-c指读取多少个块,特别的是0代表读取1个块。
如果用dd工具,指令如下(由于我不常用这个指令,没有验证,大家可以参考使用dd命令读取linux文件系统指定block的数据_jinking01的专栏-CSDN博客_linux读取block 获取更多细节):
dd if=/dev/nvme0n1 of=/out.txt bs=4096 count=1 skip=555015
我们以十六进制模式打开读取到的块数据:
验证一下内容是否正确,因为文件小于4096所以触发了F2FS的inline机制,所以这个实际上是存放inode的块的数据。
可以看到文件内容是从16C开始的,这个块的地址是555015(2273341804/4k向下取整),那么这个块的字节偏移量为:
那么文件的实际起始地址为:
与filefrag打印地址一致,读取块成功。
注意!这个实验里面物理偏移量是以字节为单位的原因是文件过小并且用的f2fs所以是inline文件,如果是大文件或者其他文件系统,那么物理偏移就直接是块地址!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)