為什麼我可以放心 GNU Parted 在縮小我的分區後一點也沒有損壞?
我縮小了根分區,看起來不錯。但我現在正在考慮至少覆蓋備份副本(外部驅動器、rsync、每周備份)中最重要的文件,以確保我的文件在壓縮過程中沒有損壞。這可能是在浪費時間(而且可能會導致更多的碎片化)。
我可以通過與備份中的文件(例如使用 md5sum)進行 CRC 比較來檢查文件在縮小過程中移動後是否正常,正如一位 unser 在他的回答中所說的那樣。
但具體來說,我想簡要解釋一下 GNU Parted 使用的算法,以確保在縮小分區之前將資訊從磁碟的一個扇區移動到另一個扇區時不會發生數據損壞。有沒有這樣的算法,還是程序盲目複製字節?我想讀一個簡單的解釋。
為什麼我可以放心 GNU Parted 在縮小我的分區後一點也沒有損壞?
實際上,您不能
gparted man
page 清楚地說明(在 下NOTES
):Editing partitions has the potential to cause LOSS of DATA. ...... You are advised to BACKUP your DATA before using the gparted application.
調整分區大小後重新啟動系統並執行
fsck
. 如果沒有發現任何錯誤,則操作成功並且數據完好無損。過去,
gparted
在調整分區大小時,即使沒有報告任何錯誤,也會出現數據損壞的問題(例如,請參閱他們論壇上的此執行緒和那裡連結的警告)。調整大小時,
(g)parted
僅moves the END position of partition NUMBER. It does not modify any filesystem present in the partition
. 在下面,gparted
使用fs
特定的工具來擴大/縮小文件系統。您可以根據線上手冊獲取每個操作的詳細資訊:
To view more information, click Details. The application displays more details about operations.
To view more information about the steps in each operation, click the arrow button beside each step.
讓我們看看它在縮小
ext4
分區時實際做了什麼(跳過calibrate
&fsck
步驟):shrink file system 00:00:02 ( SUCCESS ) resize2fs -p /dev/sdd1 409600K Resizing the filesystem on /dev/sdd1 to 409600 (1k) blocks. Begin pass 3 (max = 63) Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX The filesystem on /dev/sdd1 is now 409600 (1k) blocks long. resize2fs 1.42.12 (29-Aug-2014)
如您所見,
gparted
它什麼也不做,它只是resize2fs -p
使用指定的設備和新大小作為參數進行呼叫。如果您對算法感興趣,可以查看resize2fs.c
. 簡而言之:Resizing a filesystem consists of the following phases: 1. Adjust superblock and write out new parts of the inode table 2. Determine blocks which need to be relocated, and copy the contents of blocks from their old locations to the new ones. 3. Scan the inode table, doing the following: a. If blocks have been moved, update the block pointers in the inodes and indirect blocks to point at the new block locations. b. If parts of the inode table need to be evacuated, copy inodes from their old locations to their new ones. c. If (b) needs to be done, note which blocks contain directory information, since we will need to update the directory information. 4. Update the directory blocks with the new inode locations. 5. Move the inode tables, if necessary.
根據作者之一Ted Tso的說法,文件系統調整大小應該是一種安全的操作:
resize2fs 旨在不會破壞數據,即使有人在執行時按下 Big Red 開關。這是一個明確的設計目標。
但像所有程式碼一樣,它也不是沒有錯誤的。
調整
fs
大小完成後,gparted
縮小分區:shrink partition from 500.00 MiB to 400.00 MiB 00:00:00 ( SUCCESS ) old start: 2048 old end: 1026047 old size: 1024000 (500.00 MiB) new start: 2048 new end: 821247 new size: 819200 (400.00 MiB)
底線:始終在更改分區/文件系統之前備份您的數據,並
fsck
在進行更改後執行。