filefrag fibmap 返回错误的 FAT 物理偏移量

filefrag fibmap 返回错误的 FAT 物理偏移量

我试图以与文件系统无关的方式获取任何分区上的空白空间映射。为此,我创建一个使用所有空白空间的文件,然后使用“filefrag -e”命令 (e2fsprogs v1.42.9) 创建空间映射(在 Ubuntu 14.04 Trusty 上,使用内核 3.16.0 进行测试) 67 和 4.1.20-040120,dosfstools v3.0.26-1)。

这适用于大多数文件系统,但对于 FAT 文件系统,特别是我得到的物理偏移量超出了分区的大小。 请注意,问题现已更改,请参阅下面的编辑。

$ dd if=/dev/zero of=temp.img bs=512 count=2048000
$ sudo losetup /dev/loop1 ./temp.img
$ sudo parted /dev/loop1 mklabel msdos
$ sudo parted /dev/loop1 mkpart primary fat32 2048s 1026047s
$ sudo blockdev --rereadpt /dev/loop1
$ sudo mkfs -t vfat /dev/loop1p1
$ sudo mount /dev/loop1p1 ./mnt
$ sudo cp somefile1 ./mnt
$ sudo cp somefile2 ./mnt
$ df -B 512 ./mnt
Filesystem     512B-blocks  Used Available Use% Mounted on
/dev/loop1p1       1023440 21232   1002208   3% ./mnt
$ sudo dd if=/dev/zero of=./mnt/emptyspace.zeros bs=512 count=1002208
$ df -B 512 ./mnt
Filesystem     512B-blocks    Used Available Use% Mounted on
/dev/loop1p1       1023440 1023440         0 100% ./mnt
$ sudo filefrag -b512 -e ./mnt/emptyspace.zeros 
Filesystem type is: 4d44
File size of ./mnt/emptyspace.zeros is 513130496 (1002208 blocks of 512 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0.. 1002207:     348688..   1350895: 1002208:    1350880: merged,eof
./mnt/emptyspace.zeros: 1 extent found
$ cat /proc/mounts
/dev/loop1p1 .../mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,
  iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
$ sudo umount /dev/loop1p1
$ sudo fsck /dev/loop1p1
fsck from util-linux 2.20.1
fsck.fat 3.0.26 (2014-03-07)
/dev/loop1p1: 4 files, 63965/63965 clusters
$ echo $?
0

(filefrag 返回相对于分区开头的物理偏移量)

$ cat /sys/class/block/loop1p1/start 
2048
$ cat /sys/class/block/loop1p1/size
1024000

(sysfs 起始和大小以 512 字节扇区为单位)

显然 1350895 大于 1024000。这是 FIBMAP ioctl 的 Linux vfat/fat 实现中的错误还是还有其他原因?

我注意到 EmmaV 发表了一条评论,暗指这个问题这个问题但没有一个明确的答案。

我还与 Theodore Ts'o(filefrag 的作者)取得了联系,他没有指出 filefrag 的已知问题。

编辑: 除此之外,我发现上述问题是由 e2fsprogs v1.42.9 中的错误引起的。解决这个问题的方法是可以在这里找到它首先包含在 e2fsprogs v1.42.12 中。我已经升级并测试了,输出有很大不同。

但是,我仍然遇到 FAT 文件系统的问题。现在偏移量至少在分区内部,但是将文件内容与 filefrag 返回的块进行比较会产生差异。我写了一个python脚本在这里供测试用。对于有关问题所在的任何反馈和建议,我将不胜感激。

能告诉我 mkfs for btrfs 问题的人将获得奖励积分! :)

答案1

我一直与 OGAWA Hirofumi 和 Theodore Ts'o 保持联系,并测试了各种内核和 e2fsprogs 标签。从 2015 年起,剩余问题已在 e2fsprogs v1.43-WIP 中得到修复。我相信这次提交解决了这个问题。

完整的测试历史记录和测试脚本可以在这里找到

这个故事的寓意是:不要在 FAT 文件系统上使用 filefrag,除非1.43-WIP手册页底部有“and 2015+”。

我还应该提到 hdparm --fibmap 在 v9.43 中也有一个有缺陷的实现。您至少需要 v9.45,但我还没有像 filefrag 那样彻底验证 hdparm。

相关内容