%20%E2%80%94%20%E7%A3%81%E7%A2%9F%E7%9A%84%E5%93%AA%E4%BA%9B%E5%8D%80%E5%9F%9F%E6%9C%83%E8%A2%AB%E8%A6%86%E5%AF%AB%EF%BC%9F.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
安全的?
一般來說:沒有。繼續閱讀以了解我為什麼這麼認為。
範例程式
我的 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