web-dev-qa-db-ja.com

filefragfibmapが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よりも大きいです。これはFIBMAPioctlのLinuxvfat/fat実装のバグですか、それとも別の理由がありますか?

EmmaVがこの問題をほのめかすコメントを この質問 に投稿していることに注意しますが、決定的な答えはありませんでした。

私はセオドア・ツォ(filefragの作者)とも連絡を取りましたが、彼はfilefragの既知の問題を示していません。

EDIT:これに加えて、上記の問題はe2fsprogsv1.42.9のバグが原因であることがわかりました。これに対する修正は ここで入手可能 これはe2fsprogsv1.42.12に最初に含まれています。アップグレードしてテストしましたが、出力が大きく異なります。

ただし、FATファイルシステムでまだ問題が発生しています。オフセットは少なくともパーティション内にありますが、ファイルの内容をfilefragによって返されるブロックと比較すると違いが生じます。テスト用に ここにPythonスクリプト を書きました。問題が何であるかについてのフィードバックや提案をいただければ幸いです。

ボーナスポイントは、btrfsのmkfsの問題を教えてくれる人に贈られます! :)

2
racitup

小川博文やセオドア・ツォと連絡を取り、さまざまなカーネルやe2fsprogsタグをテストしました。残りの問題は、2015年以降のe2fsprogsv1.43-WIPで修正されています。私は このコミット 問題を修正したと信じています。

完全なテスト履歴とテストスクリプトは ここにあります です。

ストーリーの教訓:manページの下部に1.43-WIPおよび2015+と記載されていない限り、FATファイルシステムにfilefragを使用する必要はありません。

また、hdparm--fibmapにもv9.43でバグのある実装があることにも言及する必要があります。少なくともv9.45が必要ですが、filefragのようなhdparmを完全に検証していません。

1
racitup