Linux

filefrag fibmap 返回錯誤的 FAT 物理偏移量

  • April 2, 2016

我正在嘗試以與文件系統無關的方式獲取任何分區上的空白空間映射。為此,我創建了一個使用所有空白空間的文件,然後使用“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 問題的人可以獲得獎勵積分!:)

我一直與 OGAWA Hirofumi 和 Theodore Ts’o 保持聯繫,並測試了各種核心和 e2fsprogs 標籤。從 2015 年起,剩餘的問題在 e2fsprogs v1.43-WIP 中得到修復。我相信這個送出解決了這個問題。

完整的測試歷史和測試腳本可以在這裡找到

1.43-WIP故事的寓意:除非在手冊頁底部顯示和 2015+,否則不要為 FAT 文件系統使用 filefrag 。

我還應該提到 hdparm –fibmap 在 v9.43 中也有一個錯誤的實現。您至少需要 v9.45,但我還沒有像 filefrag 那樣徹底驗證 hdparm。

引用自:https://unix.stackexchange.com/questions/272508