NTFS フォーマット (mkfs) - ディスクのどの領域が上書きされますか?

NTFS フォーマット (mkfs) - ディスクのどの領域が上書きされますか?

誤って2Tb の外付け HDD でmkfs.ntfs -Q /dev/sda( ではなく/dev/sda6) を実行しました。幸運なことに、先頭に 1G の未使用パーティションがあり、最後にも十分なスペースがあります。

Device     Boot      Start        End    Sectors  Size Id Type
/dev/sda1             2048    2099199    2097152    1G  b W95 FAT32
/dev/sda2  *       2099200 3739256831 3737157632  1.8T  7 HPFS/NTFS/exFAT
/dev/sda4       3739256832 3907029166  167772335   80G  5 Extended
/dev/sda5       3739258880 3751841791   12582912    6G 83 Linux
/dev/sda6       3751843840 3907029166  155185327   74G  7 HPFS/NTFS/exFAT

安全ですか/dev/sda2?それとも、mkfs.ntfsはターゲットスペースの真ん中にメタデータを書き込むのでしょうか?その場合はどれでも警告もなくファイルが破損する可能性がありますか?

答え1

/dev/sda2安全ですか?

一般的には、いいえ。なぜそう思うのかを知るには、読み続けてください。


手順例

mkfs.ntfs -Q私の 2TB HDD のサイズは 2000398934016 バイトです。このサイズのデバイスに何が起こるかを調査することが目標です。

次のように正確なサイズのスパース ファイルを作成します。

$ # the filesystem must support sparse files
$ truncate -s 2000398934016 fakesda

ls -lsファイル全体がスパースであることを確認します。

$ ls -ls fakesda
0 -rw-r--r-- 1 kamil kamil 2000398934016 Oct 31 18:48 fakesda

(最初の言葉0はこれを示しています)。しかし、sparsemap(これは後で役に立ちます) 次のようになります:

$ sparsemap fakesda
HOLE 2000398934016

を実行することもできますmkfs.ntfs -FQ fakesdaが、mkfs.ntfsその場合、セクター サイズは 512 バイトと想定されます。この例では、ディスクの論理セクター サイズとして 4096 バイトが使用されていると仮定します。このような場合は、--sector-sizeのオプションを使用できると思いますmkfs.ntfs( を参照man 8 mkfs.ntfs)。ただし、 sole がディスクにどのような影響を与えるかを確認するためにmkfs.ntfs -Q、 からループ デバイスを作成することにしましたfakesda

$ sudo losetup -f --show --sector-size 4096 fakesda
/dev/loop0

sparsemapfakesdaまだ完全にスパースであると分かります。mkfs.ntfs -Qループデバイスで実行します。

$ sudo mkfs.ntfs -Q /dev/loop0

sync念のため、ループデバイスを破壊します。

$ sudo losetup -d /dev/loop0
$ sync

現在、ファイルはどの程度まばらですか?

$ sparsemap fakesda
DATA 12288
HOLE 4096
DATA 110592
HOLE 250049753088
DATA 61460480
HOLE 750088122368
DATA 67125248
HOLE 1000132341760
DATA 4096

sparsemap -hこれをどう解釈するかについてはこちらをご覧ください

ファイルはデータとホールのシーケンスとして解釈されます。たとえば、8192 バイトのデータの後に 4096 バイトのホールがあり、さらに 8192 バイトのデータが続くファイルの場合、sparsemap の出力は次のようになります。

DATA 8192
HOLE 4096
DATA 8192

私の結果では、DATA各行は の影響を受けるフラグメントを示しますmkfs.ntfs私は見えますmkfs.ntfs するターゲットスペースの中央に何かを書きます。

最後に、 でファイルを削除しますrm fakesda


あなたの具体的なケース

ディスクの正確なサイズ (およびセクター サイズ) と、mkfs.ntfs使用したのと同じサイズを使用して、独自のテストを行うことができます。この方法では、影響を受けるフラグメントを正確に識別し、それらがどのパーティション (どの古いファイル システム) に属しているかを判断できる可能性があります。フラグメントを古いファイル システム内の特定のファイルまたはメタデータにマッピングすることは簡単ではない可能性があり、これは別の問題です。

mkfs.ntfs -FQ fakesdaあなたが投稿したパーティション テーブルによると、あなたの場合、セクター サイズは 512 バイトです。をいじらなくても使用できると思いますlosetup。私の例では意図的に異なるセクター サイズを使用しているため、答えはより一般的です。


疑い

操作対象のファイルの一部にゼロを書き込む場合mkfs.ntfs -Q、そしてファイルをスパース化することでこれを実現するほど賢い場合、私の手順ではこれを検出できません。率直に言って、ツールがそれを実行するかどうかはわかりません。実行する場合は、私の手順以上のものを見つける必要があります。全て影響を受けた断片。

この手順の不完全さによって結論が変わることはありません。つまり、ファイルシステムが/dev/sda2部分的に上書きされた可能性があります。

実際にゼロを書かmkfs.ntfsずにメモする-Qそれなしファイルをスパース化します。実際にはファイル全体をデスパース化します。2TBよりはるかに小さいファイルでこれをテストしましたが、それでも。容疑者 mkfs.ntfs -Q同様であり、ファイルをスパース化することはありません。


ノート

  • 私のテストベッド: Debian GNU/Linux 10。

  • 私のmkfs.ntfs -Vプリントmkntfs v2017.3.23AR.3 (libntfs-3g)

  • インストールしたsparsemapのは

    sudo apt-get install python3-pip
    sudo pip3 install sparseutils
    

関連情報