如何在Linux中擦除可用磁盘空间?


145

删除文件后,除非明确用其他内容覆盖,否则文件的内容可能仍保留在文件系统中。该wipe命令可以安全地擦除文件,但似乎不允许擦除任何文件未使用的可用磁盘空间。

我应该使用什么来实现这一目标?


唯一安全的解决方案可能是将文件保存在其他位置,擦除整个分区,重新创建文件系统,然后还原文件。我运行过photorec,即使在“擦除”可用空间后仍能检索到多少东西,我感到震惊。一个折衷的解决方案是在擦除表面上的可用空间后,将分区的左边界移动其大小的6%。
user39559 2010年

Answers:


107

警告:现代磁盘/ SSD硬件和现代文件系统可能会将数据保存在无法删除的地方,因此此过程可能仍将数据保留在磁盘上。擦除数据的唯一安全方法是ATA安全擦除命令(如果正确实施)或物理破坏。另请参阅如何可靠地擦除硬盘驱动器上的所有信息?

您可以使用一套称为安全删除的工具。

sudo apt-get install secure-delete

它具有四个工具:

srm-安全删除现有文件
smem-从ram安全删除文件痕迹
sfill-擦除硬盘驱动器上标记为空的所有空间
sswap-擦除交换空间中的所有数据。

从手册页 srm

srm旨在以安全的方式删除媒体上的数据,这些信息无法被小偷,执法或其他威胁所恢复。擦除算法基于彼得·古特曼(Peter Gutmann)在第六届Usenix安全研讨会上发表的论文“从磁和固态存储器中安全删除数据”,该论文是主要的民用密码学家之一。

srm的安全数据删除过程如下:

  • 1次通过0xff
  • 5次随机通过。/dev/urandom用于安全的RNG(如果有)。
  • 27次传球具有彼得·古特曼(Peter Gutmann)定义的特殊值。
  • 5次随机通过。/dev/urandom用于安全的RNG(如果有)。
  • 将文件重命名为随机值
  • 截断文件

作为一种额外的安全措施,该文件以O_SYNC模式打开,并且在每次通过之后都进行一次fsync()调用。srm为了提高速度而写入32k块,填充磁盘高速缓存的缓冲区以强制其刷新和覆盖属于该文件的旧数据。


5
很难找到安全删除的当前“官方”主页。也许是较旧的版本声称没有错误报告,但同时没有开放的错误跟踪系统可以报告所发现的错误。安全删除主页还指出,它可能不会擦除所有未使用的数据块,具体取决于您使用的文件系统,这是事实。
user39559 2010年

11
使用现代硬盘(大于20 GB左右),进行多次传递并等待一段时间是完全没有用的。因此,安装专用工具也变得毫无用处(这可以解释为什么安全删除不再有主页)。只需在相应的分区中执行此操作即可cat /dev/zero >nosuchfile; rm nosuchfile
mivk 2011年

1
@mivk:为什么做一次以上的考试没有用?为什么使用/ dev / zero而不是/ dev / random?那是因为速度问题吗?
naught101 2013年

5
使用/ dev / zero更快。如果您从/ dev / random中写入可用空间,则内核必须动态生成所有这些随机数据。这是看你的平均负载跳变到最大的娱乐的方式...
戴维德·


71

如果您只需要单次通过并且只想将所有内容替换为零,则最快的方法是:

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-a的操作系统中使用该工具)。

  • 请注意,将稀疏虚拟设备上的块置零可能不会擦除基础物理设备上的块,实际上,我什至会说这不太可能-虚拟磁盘管理器只会使该块不再使用所以以后可以分配给其他东西。

  • 即使对于固定大小的虚拟设备,您也可能无法控制设备的物理位置,因此可以随时将其移动到当前位置或移动到一组新的物理磁盘上,并且可以擦除的最大位置是当前位置,而不是该区块过去可能已驻留的任何先前位置。

  • 对于虚拟设备上的上述问题:除非您控制主机,然后在擦除VM中的磁盘或移动虚拟设备后可以安全擦除其未分配的空间,否则在此之后您将无能为力事实。唯一的办法是从一开始就使用全盘加密因此,首先,所有未加密的内容都不会写入物理介质。当然,在VM内仍然可能需要擦除自由空间。还要注意,FDE可​​以使稀疏虚拟设备的使用效率大大降低,因为虚拟化层无法真正看到哪些块未使用。如果操作系统的文件系统层将修整命令发送到虚拟设备(好像它是SSD),并且虚拟控制器解释了这些命令,则可以解决此问题,但是我不知道在任何情况下实际上会发生修整命令,并且范围更广。讨论在其他地方是个问题(我们已经快要脱离原来的问题了,因此,如果这激起了您的兴趣,那么可能需要进行一些实验和/或跟进的问题)。


4
显然,也可以使用以下secure-delete工具来完成简单的调零:使用sfill -llz可以将整个过程减少到只写“ 0”的一遍。
foraidt

这需要一段时间。真的是最快的方法吗?我想写入GB数据将总是需要一段时间...
endolith 2011年

2
@endolith:如果您想清空活动文件系统上的可用空间,那么就无法满足通过文件系统开销写入那么多数据的需求。fnord_ix建议的安全删除工具可能会更快,因为它们针对此类任务进行了优化。
David Spillett

2
@endolith:从手册页中的描述中,我希望zerofree的变体只对稀疏分配的虚拟磁盘更快,实际上,如果它在执行先读后写,则在实际或固定大小的虚拟磁盘上可能会更慢确认该块没有内容。虚拟磁盘的膨胀也不应该发生,因为大多数稀疏磁盘驱动器将全零表示为“不分配此块”。而且,catdd几乎可以在任何类似unix-a的操作系统上使用,因为它们被视为标准工具,zerofree除非明确添加,否则可能不会。
David Spillett

1
@endolith:具有上述表示,zerofree当然会一定的工作,在手册页(几乎但不完全在我的例子中small.file jiggery pokery缓解)中提到的“整个文件系统暂时已满”的东西一个真正的关心如果您正在当前活动的系统上执行此操作,并且zerofree确实在特定实例中会更快,则针对以下情况进行了优化:稀疏分配的虚拟块设备。尽管出于安全性考虑,您不能依靠对虚拟设备进行任何擦除:在这种情况下,唯一的正确答案是从一开始就对整个设备进行加密。
David Spillett

45

警告

即使擦拭后,photorec仍能从磁盘上检索到多少文件,我感到非常震惊。

在用0x00填充1次“自由空间”还是用不同的标准应用38次填充“自由空间”是否具有更高的安全性,这在学术上更具争议。1996年开创性的关于粉碎的论文的作者给自己写了一个结尾,说这对于现代硬件来说已经过时且没有必要了。没有记录在案的数据被物理替换为零并随后恢复的情况。

此过程中真正的脆弱链接文件系统。某些文件系统保留特殊用途的空间,而不能将其作为“可用空间”使用。但是您的数据可能在那里。其中包括照片,个人纯文本电子邮件等。我刚刚搜索了reserved + space + ext4,并了解到我的home分区的5%已保留。我猜这是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”命令产生一条错误消息,但是我无法在其他人的帖子上发表评论。


您可以在具有50信誉的其他人的帖子下发表评论。
Gnoupi

1
cat在我的示例中,该命令在运行结束时应给出“无空间”错误。/dev/null如果有问题,可以通过将stderr重定向到来隐藏它。为了获得有用的进度指示,我通常使用pv而不是catdd用于此类事情。
David Spillett

4
...raises the suspicion that it is actually encrypted data. You may die under torture for not revealing the decryption key.呵呵,这正是我的想法。我想那意味着我很偏执……
Navin

2
根始终能够使用保留的空间。因此,如果您以root身份进行零填充,那么您也将能够填充5%的保留空间;tunefs是不必要的。仍然可以想象文件系统的其他部分可能存在数据。
Nate Eldredge

1
@NateEldredge是否有任何资料表明dd以root身份运行比dd没有root 身份可以访问更多文件系统?我想相信这是事实,但目前尚无理由。
Hashim

27

至少在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日)


3
必须卸载文件系统或以只读方式挂载文件系统,以使Zerofree正常工作很重要。
AntonioK

1
最好包含一些有关如何在根文件系统上执行此操作的信息。我的感觉是,这是行不通的,因为您必须卸载文件系统,同时从该文件系统运行该工具。
Ant6n

CentOS也附带了此功能
davidgo '18

3

这是使用GUI的方法。

  1. 安装BleachBit
  2. 通过以管理员身份单击应用程序-系统工具-BleachBit以root身份运行。
  3. 在首选项中,告诉它所需的路径。通常,它们猜得很好。您要为每个分区包括一个可写路径。通常,它们是/ home / username和/ tmp,除非它们是同一分区,在这种情况下,只需选择一个即可。
  4. 选中系统-清除可用磁盘空间框。
  5. 单击删除。

当磁盘最终已满时,BleachBit相对于dd的进步(否则非常好)是,BleachBit创建小文件以擦除inode(其中包含文件名等元数据)。


检查 Bleachbit的开源python代码,以清除驱动器中的自由空间。
shadowbq 2013年

2

dd用来分配一个或多个大文件来填充可用空间,然后使用安全的删除实用程序。

要使用dd分配文件,请尝试:

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

这将生成一个名为delete_me100 MB 的文件。(这里bs的“块大小”设置为1k,count是要分配的块数。)

然后shred对这样创建的文件使用您喜欢的安全删除实用程序(我一直在使用)。

但是请注意:缓冲意味着即使您处理整个磁盘,也可能无法获得所有内容!


链接建议scrub进行空闲空间擦除。还没试过


哦,如果内存为我服务,我就尝试了scrub一次,它破坏了整个文件系统。幸运的是,我有一种先在测试文件系统上进行实验的感觉,而不是在我的真实数据上进行实验。
landroni 2014年

2

以最高速度擦拭驱动器。

如今,有关加密驱动器的典型说明将告诉您首先擦除驱动器。

下面的命令将用AES密文填充驱动器。

如果需要擦除主引导驱动器,请使用实时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

您可以使用安全删除程序包擦除可用空间。

在该软件包中,您可以找到sfill工具,该工具旨在以安全的方式删除介质上可用磁盘空间上的数据,这些信息无法被小偷,执法或其他威胁所恢复。

要在Linux(Ubuntu)中安装安全删除软件包,请通过以下命令进行安装:

$ sudo apt-get install secure-delete

然后,要擦除您的数据没有可用空间,请尝试以下命令:

sfill -f -v -ll /YOUR_MOUNTPOINT/OR_DIRECTORY

凡/ YOUR_MOUNTPOINT / OR_DIRECTORY是你的挂载点(df -hmount)或目录擦拭自由空间。

阅读http://manpages.ubuntu.com/manpages/hardy/man1/sfill.1.html上的手册


1

使用dd并将可用空间调零。这是一个神话,数据需要被多次重写(请问peter guntmann)和随机数据,而不是1到0意味着不自然的活动。那么最终结果是一个干净的驱动器,而花费的时间更少。此外,安全的删除程序无法保证它们甚至会覆盖现代文件系统上的真实文件(已日记)。帮自己一个忙,得到photorec,扫描驱动器以查看混乱,用1和零(可选)将其擦拭,以使其看起来未受影响。如果photorec仍然找到东西,请记住它正在扫描可用的所有内容,因此请与root用户再次仔细进行此操作。

请记住,cia / fbi / nsa没有可以读取您的磁性媒体位的实际状态的高档机器。那只是很久以前写的一篇论文。一个“假设”。您只需要擦拭1次即可。


1
您刚才说的有趣的事情很少,但是您实际上有任何资料支持这一信息吗?很难相信所有重写都是无用的。另外,请改善您的帖子,这样很难用标点符号阅读。
gronostaj

@gronostaj:现代驱动器的“这是一个神话,数据需要多次重写” ,至少已经通过多项研究证明。正如作者本人所承认的那样,不再需要Gutmann推荐的所有30+次通过。
卡兰

1

使用scrub更容易:

scrub -X dump

这将dump在当前位置创建一个文件夹并创建文件,直到磁盘已满。您可以使用-p选项(nnsa|dod|bsi|old|fastold|gutmann)选择一种模式。

安装scrub并不容易(请参见上的Ubuntu论坛),但是一旦安装完成,您手中就会有一个非常简单高效的工具。


如果内存为我服务,我尝试了scrub一次,它破坏了整个文件系统。幸运的是,我有一种先在测试文件系统上进行实验的感觉,而不是在我的真实数据上进行实验。
landroni 2014年

不知道您做了什么或发生了什么,但是scrub基本上会创建新文件,直到它填满文件系统。它不会与现有文件一起播放,也不会删除其中的任何文件(至少不是我给的命令)...
FMaz008 2014年

1
确实。尝试过scrub -X dump_dir,它似乎运行良好。顺便说一句,安装在Ubuntu 14.04是非常简单的:apt-get install scrub
landroni 2014年

1

这是我使用的“ sdelete.sh”脚本。有关详细信息,请参见评论。

# Install the secure-delete package (sfill command).

# To see progress type in new terminal:
# watch -n 1 df -hm

# Assuming that there is one partition (/dev/sda1). sfill writes to /.
# The second pass writes in current directory and synchronizes data.
# If you have a swap partition then disable it by editing /etc/fstab
# and use "sswap" or similar to wipe it out.

# Some filesystems such as ext4 reserve 5% of disk space
# for special use, for example for the /home directory.
# In such case sfill won't wipe out that free space. You
# can remove that reserved space with the tune2fs command.
# See http://superuser.com/a/150757
# and https://www.google.com/search?q=reserved+space+ext4+sfill

sudo tune2fs -m 0 /dev/sda1
sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'

sudo sfill -vfllz /

# sfill with the -f (fast) option won't synchronize the data to
# make sure that all was actually written. Without the fast option
# it is way too slow, so doing another pass in some other way with
# synchronization. Unfortunately this does not seem to be perfect,
# as I've watched free space by running the "watch -n 1 df -hm"
# command and I could see that there was still some available space
# left (tested on a SSD drive).

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

sudo tune2fs -m 5 /dev/sda1
sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'

1

我找到了一个适用于Linux和MacOS的简单解决方案。移动到磁盘的根文件夹并启动以下命令:

for i in $(seq 1 //DISKSPACE//); do dd if=/dev/zero of=emptyfile${i} bs=1024 count=1048576; done; rm emptyfile*;

其中// DISKSPACE //是硬盘的大小(以GB为单位)。


0

我有时会使用这种bash一线式:

while :; do cat /dev/zero > zero.$RANDOM; done

当开始显示磁盘已满时,只需按Ctrl+ C并删除创建的zero.*文件。

它可以在任何系统上运行,无论文件大小有何限制。
忽略任何cat: write error: File too large错误。


0

这不是答案!只是对那些希望使用pv...的人的评论,所以不要打扰投票。

Linux Mint 17.3上,您可以使用pv管道视图)获得编写进度。例如:

# Install pv (pipe view)
sudo apt-get install pv

# Write huge file of approximate size of /dev/sdb, using urandom data:
pv --timer --average-rate --progress --numeric --eta --interval 5 --size "$(blockdev --getsize64 /dev/sda )" /dev/urandom >rand.file

这样做的好处是您可以获得进度条,ETA和不断更新的数据速率。缺点是这是写在一行上的,当磁盘已满(返回错误)时,它会消失。发生这种情况是因为整个大小是近似值,因为在进行这种非常长的操作时(尤其是在OS卷上),OS可能会使用磁盘。

在一个很旧的HD,我得到的数据速率约13 MB / s的使用/dev/urandom,以及约70 MB /秒,用时/dev/zero。当使用raw ddcatnot 时,这可能会进一步改善pv


-13

一旦文件脱离了文件系统的记录,硬盘上剩余的数据就毫无意义地由1和0组成。如果您要用另一个无意义的序列替换该无意义的序列,我可以建议一些用于安全擦除驱动器的商业产品,例如arconis。


22
先前文件内容的连续块仍保留在磁盘上,如果直接检查原始磁盘数据,则远没有意义。
Alex B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.