題 如何擦除Linux中的可用磁盤空間?


刪除文件時,其內容可能仍留在文件系統中,除非明確地用其他內容覆蓋。該 wipe 命令可以安全地擦除文件,但似乎不允許刪除任何文件未使用的可用磁盤空間。

我應該用什麼來實現這個目標?


132
2017-08-06 23:48


起源


唯一安全的解決方案可能是將文件保存在其他位置,擦除整個分區,重新創建文件系統,然後還原文件。我跑了 photorec 甚至在“擦拭”自由空間之後,有多少東西可以被收回,這讓我感到震驚。折衷的解決方案是在擦除明顯可用空間後將分區的左邊界移動6%。 - user39559


答案:


警告: 現代磁盤/ SSD硬件和現代文件系統可能會在無法刪除數據的地方將數據丟棄,因此此過程可能仍會將數據留在磁盤上。 擦除數據的唯一安全方法是ATA安全擦除命令(如果正確實施)或物理破壞。另見 如何可靠地擦除硬盤上的所有信息?


100
2017-08-07 01:55



很難找到安全刪除的當前“官方”主頁。一個可能較舊的版本聲稱沒有錯誤報告,但同時沒有開放的錯誤跟踪系統,我可以報告我發現的錯誤。安全刪除主頁也指出它可能 不 擦除所有未使用的數據塊,具體取決於您使用的文件系統,這是真的。 - user39559
使用現代硬盤(大於20 GB),做幾次通行並等待很長時間是完全沒用的。因此,安裝專用工具也變得無用(這可以解釋為什麼安全刪除沒有更多的主頁)。只需從適當的分區執行此操作: cat /dev/zero >nosuchfile; rm nosuchfile。 - mivk
@mivk:為什麼不止一次傳球沒用?為什麼使用/ dev / zero而不是/ dev / random?這是由於速度問題嗎? - naught101
使用/ dev / zero要快得多。如果從/ dev / random編寫可用空間,內核必須動態生成所有隨機數據。這是一種有趣的方式來觀察你的負載平均跳躍到最大... - dafydd
這裡回答了是否需要多次擦拭的問題: 為什麼在硬盤驅動器上寫零(或隨機數據)的次數比僅執行一次好幾倍? - sleske


最快的方法是,如果你只需要一次傳遞而只想用零替換所有東西,那就是:

cat /dev/zero > zero.file
sync
rm zero.file

(從要擦除的文件系統上的目錄運行)
(該 sync 命令是一種偏執措施,可確保將所有數據寫入磁盤 - 智能緩存管理器可能會在取消鏈接文件時取消對任何掛起塊的寫入操作

在此操作期間將有一段時間,文件系統上根本沒有可用空間,如果生成的文件很大且碎片化,則需要一段時間才能刪除,這可能是幾十秒。減少自由空間完全為零時的時間:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
cat /dev/zero > zero.file
sync
rm zero.small.file
rm zero.file

這應該足以阻止某人在沒有昂貴的取證操作的情況下閱讀舊文件內容。對於稍微更安全但更慢的變體替換 /dev/zero 同 /dev/urandom。對於更多的偏執狂運行多個步驟 /dev/urandom雖然如果你需要那麼多努力的話 shred coreutils包中的實用程序是要走的路:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
shred -z zero.small.file
cat /dev/zero > zero.file
sync
rm zero.small.file
shred -z zero.file
sync
rm zero.file

請注意,在上面,小文件在創建較大的文件之前會被粉碎,因此只要較大的文件完成就可以刪除它,而不必等待它被粉碎,使文件系統在可用時間內沒有空閒空間。採取的粉碎過程  超過一個大文件的時間,除非你試圖隱藏NSA的東西是不是真的有必要IMO。

以上所有內容都適用於任何文件系統。

文件大小限制:

正如DanMoulding在下面的評論中指出的那樣,在某些文件系統上,這可能會導致文件大小限制。

對於FAT32,它會 無疑 由於2GiB文件限製而引起關注:這些天大多數卷都比這個大(8TiB是體積大小限制IIRC)。你可以通過管道大塊來解決這個問題 cat /dev/zero 輸出輸出通過 split 生成多個較小的文件並相應地調整碎片和刪除階段。

對於ext2 / 3/4,它不是一個問題:使用默認/普通4K塊,文件大小限制是2TiB所以你必須有一個 巨大 這是一個問題的捲(這些條件下的最大卷大小是16TiB)。

使用(仍然是實驗性的)btrfs,最大文件和卷大小都是一個巨大的16EiB。

在NTFS下,最大文件長度在某些情況下甚至大於最大卷長度。

更多信息的起點:
http://en.wikipedia.org/wiki/Ext3#Size_limits
http://en.wikipedia.org/wiki/Btrfs
http://en.wikipedia.org/wiki/Ntfs#Scalability

虛擬設備

如最近的評論中所述,虛擬設備還有其他注意事項:

  • 對於稀疏分配的虛擬磁盤,其他方法,如使用的方法 zerofree 會更快(雖然不同 cat 和 dd 這不是一個標準的工具,你可以依賴幾乎任何類似unix的操作系統。

  • 請注意,將稀疏虛擬設備上的塊清零可能無法擦除基礎上的塊 物理 設備,實際上我會說它不太可能 - 虛擬磁盤管理器只會使塊不再使用,因此可以稍後分配給其他東西。

  • 即使對於固定大小的虛擬設備,您也可能無法控制設備的物理位置,因此可以隨時將其移動到當前位置或移動到一組新的物理磁盤上,您可以擦除的最多是當前位置,而不是該塊可能已存在於過去的任何先前位置。

  • 對於虛擬設備上的上述問題:除非您控制主機並且可以在擦除VM中的磁盤或移動虛擬設備之後對其未分配的空間進行安全擦除,否則在此之後您無法做到這一點。事實。唯一的辦法是使用全盤加密 從頭開始 因此,首先沒有任何未加密的內容都寫入物理媒體。當然,仍然可能需要在VM內進行自由空間擦除。還要注意,FDE可​​以使稀疏虛擬設備變得不那麼有用,因為虛擬化層無法真正看到哪些塊未被使用。如果操作系統的文件系統層將修剪命令發送到虛擬設備(就好像它是SSD),並且虛擬控制器解釋這些,那麼這可以解決這個問題,但我不知道這實際發生的任何情況和更寬討論這是其他地方的事情(我們已經接近原始問題的主題,所以如果這引起了你的興趣,一些實驗和/或後續問題可能是有序的)。


67
2017-08-07 08:58



簡單的歸零顯然也可以用 secure-delete 工具:使用 sfill -llz 將整個過程減少到只寫'0'的一次傳遞。 - foraidt
這需要一段時間。它真的是最快的方式嗎?我想寫GB的數據總是需要一段時間...... - endolith
@endolith:如果你想空白活動文件系統上的可用空間,那麼就無法通過文件系統開銷來編寫那麼多數據。 fnord_ix建議的安全刪除工具可能更快,因為它們針對此類任務進行了優化。 - David Spillett
@endolith:從手冊頁中的描述我可以看出zerofree的變體對於稀疏分配的虛擬磁盤來說速度更快,實際上如果它在執行read-before-write時它在實際或固定大小的虛擬磁盤上可能會更慢確認該塊沒有內容。由於大多數稀疏磁盤驅動程序將全零視為“不分配此塊”,因此不應發生虛擬磁盤的膨脹。也, cat 和 dd 幾乎所有類似Unix的操作系統都可以使用,因為它們被認為是標準工具 zerofree 可能不是,除非已明確添加。 - David Spillett
@endolith:上面說過, zerofree 肯定會工作當然,手冊頁中提到的“整個文件系統暫時滿了”的事情(在我的例子中,幾乎沒有被small.file jiggery pokery所緩解) 是 一個真正的擔憂 如果 你是在當前活躍的系統上這樣做的 zerofree 在針對稀疏分配的虛擬塊設備進行優化的特定實例中確實會更快。雖然出於安全目的,您不能依賴虛擬設備上的任何擦除:在這種情況下唯一真正的答案是從一開始就進行全設備加密。 - David Spillett


警告

我被多少文件震驚了 photorec 即使擦拭後,也可以從我的磁盤中檢索。

是否有更多的安全性來填充“自由空間”只有一次使用0x00或38次使用不同的cabalistic標準更多的是學術討論。 1996年關於粉碎的開創性論文的作者給自己寫了一篇文章 結語 說現代硬件已經過時且不必要了。沒有記錄的數據被物理替換為零並且之後恢復的情況。

真的 脆弱的環節 在這個程序中是 文件系統。某些文件系統保留了特殊用途的空間,並且它不能作為“可用空間”使用。 但是你的數據可能就在那裡。這包括照片,個人純文本電子郵件等等。我剛剛用Google搜索了保留+空格+ ext4並了解到了我的5% home 分區是保留的。我猜這就在哪裡 photorec 發現了我的很多東西。結論: 粉碎方法並不是最重要的,即使是多遍方法仍然會留下數據

你可以試試 # tune2fs -m 0 /dev/sdn0 在安裝之前。 (如果重啟後這將是根分區,請確保運行 -m 5 要么 -m 1 卸下之後)。

但是,不管怎樣,可能還有一些空間。

唯一真正安全的方法是擦除整個分區,再次創建文件系統,然後從備份中恢復文件。


快捷方式(推薦)

從要擦除的文件系統上的目錄運行:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
rm zero.file

注意:小文件的目的是減少可用空間完全為零時的時間;同步的目的是確保數據實際寫入。

這對大多數人來說應該足夠好了。

慢路(偏執狂)

在上述清潔後沒有記錄的數據恢復情況。 如果可能的話,這將是昂貴的和資源要求。

但是,如果您有理由認為秘密機構會花費大量資源來恢復您的文件,那麼這應該足夠了:

dd if=/dev/urandom of=random.small.file bs=1024 count=102400
dd if=/dev/urandom of=random.file bs=1024
sync ; sleep 60 ; sync
rm random.small.file
rm random.file

這需要更長的時間。

警告。如果你選擇了偏執的方式,在此之後你仍然想要快速擦拭,那不是偏執狂。純隨機數據的存在很容易且檢測成本低廉,並且引起懷疑它實際上是加密數據。您可能會因為沒有洩露解密密鑰而在酷刑下死亡。

很慢的方式(瘋狂的偏執狂)

即使是1996年關於粉碎的開創性論文的作者寫了一篇結語,說這對於現代硬件而言已經過時且不必要了。

但是,如果你有很多空閒時間,並且你不介意浪費你的磁盤進行大量的重寫,那就是:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
sync ; sleep 60 ; sync
shred -z zero.small.file
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
shred -z zero.file
sync ; sleep 60 ; sync
rm zero.file

注意:這基本上等同於使用安全刪除工具。


在編輯之前,這篇文章改寫了David Spillett的。 “cat”命令會產生錯誤消息,但我不能在其他人的帖子上寫評論。


41
2018-06-09 17:40



您可以在其他人的帖子下發表評論 50聲望。 - Gnoupi
該 cat 命令應該在我的示例中,在運行結束時給出“沒有剩餘空間”錯誤。您可以通過將stderr重定向到隱藏它 /dev/null 如果這是一個問題。我經常使用 pv 而不是 cat 要么 dd 對於這種事情,為了得到有用的進展指示。 - David Spillett
...raises the suspicion that it is actually encrypted data. You may die under torture for not revealing the decryption key. 嘿,這正是我的想法。我猜這意味著我是偏執狂...... - Navin
/: write failed, filesystem is full 在FreeBSD上 - Alex G
Root始終能夠使用保留空間。因此,如果您以root身份進行零填充,您也可以填充5%的預留空間; tunefs是不必要的。仍然可以想像文件系統的其他部分中可能存在數據。 - Nate Eldredge


至少在Ubuntu中有zerofree實用程序:

http://manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html

   zerofree — zero free blocks from ext2/3 file-systems

   zerofree  finds  the  unallocated, non-zeroed blocks in an ext2 or ext3
   filesystem (e.g. /dev/hda1) and fills them with zeroes. This is  useful
   if  the  device  on  which this file-system resides is a disk image. In
   this case, depending on the type of disk image, a secondary utility may
   be  able  to  reduce the size of the disk image after zerofree has been
   run.

   The usual way to achieve  the  same  result  (zeroing  the  unallocated
   blocks)  is to run dd (1) to create a file full of zeroes that takes up
   the entire free space on the drive, and then delete this file. This has
   many disadvantages, which zerofree alleviates:

      ·  it is slow;

      ·  it makes the disk image (temporarily) grow to its maximal extent;

      ·  it  (temporarily)  uses  all  free  space  on  the disk, so other
         concurrent write actions may fail.

   filesystem has to be unmounted or mounted  read-only  for  zerofree  to
   work.  It  will exit with an error message if the filesystem is mounted
   writable. To remount the  root  file-system  readonly,  you  can  first
   switch to single user runlevel (telinit 1) then use mount -o remount,ro
   filesystem.

另請查看關於zerofree的鏈接: 保持文件系統映像稀疏  - 來自作者 - Ron Yorston (2012年8月9日)


24
2018-01-05 14:51



重要的是必須卸載文件系統或以只讀方式掛載文件系統才能使zerofree正常工作。 - AntonioK
如果在根文件系統上包含一些有關如何執行此操作的信息,那將是很好的。我的感覺是這不起作用,因為您必須卸載文件系統,同時從所述文件系統同時運行該工具。 - Ant6n


以下是如何使用GUI進行操作。

  1. 安裝 BleachBit
  2. 以管理員身份單擊應用程序 - 系統工具 - BleachBit以root用戶身份運行。
  3. 在首選項中,告訴它您需要哪些路徑。一般來說,它很好地猜測它們。您希望為每個分區包含一個可寫路徑。通常是/ home / username和/ tmp,除非它們是相同的分區,在這種情況下只需選擇一個。
  4. 選中“系統 - 擦除可用磁盤空間”框。
  5. 單擊刪除。

BleachBit相對於dd的進步(否則非常好)是當磁盤最終滿時,BleachBit創建小文件以擦除inode(其中包含文件名等元數據)。


3
2017-11-06 12:40



檢查 Bleachbit的開源python代碼,用於從驅動器中為自己擦除自由空間。 - shadowbq


我用 dd 分配一個或多個大文件來填充可用空間,然後使用安全刪除實用程序。

要使用dd分配文件,請嘗試:

dd if=/dev/zero of=delete_me bs=1024 count=102400

這將生成一個名為的文件 delete_me 這是100 MB的大小。 (這裡 bs 將“塊大小”設置為1k,並且 count 是要分配的塊數。)

然後使用您最喜歡的安全刪除實用程序(我一直在使用 shred)在如此創建的文件上。

但請注意: 緩衝意味著即使你這樣做了 整個 磁盤,你可能得不到一切!


這個 鏈接 建議 scrub 自由空間擦拭。沒試過。


2
2017-08-07 01:04



哦,如果記憶能為我服務,我試過了 scrub 一旦它破壞了整個文件系統。幸運的是,我很好地首先在測試文件系統上進行實驗,而不是在我的真實數據上。 - landroni


以最快的速度擦拭驅動器。

現在加密驅動器的典型說明將告訴您首先擦除驅動器。

以下命令將使用AES密文填充您的驅動器。

如果需要擦除主引導驅動器,請使用Live CD。

打開終端並提升您的權限:

sudo bash

讓我們列出系統上的所有驅動器是安全的:

cat /proc/partitions

注意:更換 /dev/sd{x} 使用您想要擦拭的設備。

警告:這不適合業餘愛好者!你可以讓你的系統無法啟動!

sudo openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > /dev/sd{x}

我對這有多快感到震驚。


2
2017-09-08 19:27