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安全的?

一般來說:沒有。繼續閱讀以了解我為什麼這麼認為。


範例程式

我的 2TB HDD 大小為 2000398934016 位元組。我們的目標是研究mkfs.ntfs -Q這種尺寸的設備會發生什麼。

我創建了一個大小精確的稀疏檔案:

$ # 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)。但為了確定solemkfs.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您使用的相同大小來進行自己的測試。透過這種方式,您可能能夠準確地識別受影響的片段並判斷它們屬於哪些分割區(哪些舊檔案系統)。將片段對應到舊檔案系統中的特定檔案或元資料可能並不容易,這是一個不同的問題。

您發布的分區表告訴我在您的情況下扇區大小為 512 位元組。我認為你可以使用mkfs.ntfs -FQ fakesda而不玩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
    

相關內容