%20-%20%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%AE%E3%81%A9%E3%81%AE%E9%A0%98%E5%9F%9F%E3%81%8C%E4%B8%8A%E6%9B%B8%E3%81%8D%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
誤って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
sparsemap
fakesda
まだ完全にスパースであると分かります。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