你删除了文件。但它真的消失了吗?
在 Linux 上,按下 Delete 键或运行 rm 并不会擦除你的数据。它只是移除了指向数据的指针。实际的字节仍然留在你的磁盘上,有时会停留几天,有时是永远,直到其他数据覆盖它们。
如果你试图移除一张敏感照片、一份私人文档、一个密码文件,或任何你永远不想让别人恢复的东西,这一点就很重要。
在这份详细指南中,我们将解释 Linux 上文件删除的工作原理,以及为什么“已删除”并不总是意味着“已消失”。然后,你将学习在 Linux 上从机械硬盘(HDD)和固态硬盘(SSD)上安全删除文件的不同方法。
快速摘要
- 要在 ext4 或 xfs 的 HDD 上永久删除文件,使用
shred -uzn 3 /path/to/file或secure-delete工具包(srm、sfill、sswap、smem)进行更彻底的清理。 - 在 SSD(任何文件系统)上永久删除文件:使用
rm删除,然后运行sudo fstrim -av告诉驱动器擦除已释放的块。 - 在 btrfs 上:使用
rm,然后删除任何捕获了该文件的 Snapper 或 Timeshift 快照,再运行sudo fstrim -av。 - 对于所有情况:清除缩略图缓存,检查云同步,并擦除交换空间(如果你的系统在文件打开时使用了它)。
- 最强的保护:在存储敏感数据之前,使用 LUKS 设置全盘加密。
不确定哪种方法适合你?运行 lsblk -f 查看你的文件系统,运行 cat /sys/block/sda/queue/rotational 检查你的磁盘驱动器类型(0 = SSD,1 = HDD)。下面的完整指南会逐步解释每种方法。
1. 为什么“删除”文件是不够的
大多数人认为一旦删除了文件,它就消失了。在 Linux 上,这根本不是真的,至少不是立即的。
把你的硬盘想象成一个图书馆。当你“删除”一本书时,图书馆只是从目录中移除了它的条目。书还在书架上。任何知道在哪里找的人仍然可以阅读它。
像 rm、GNOME 或 KDE 中的回收站,甚至代码中的 unlink() 这样的工具——它们做的都是同一件事。它们移除了指向文件 inode 的目录条目,但将原始数据留在磁盘上,直到操作系统决定在那里写入其他内容。
对于普通文件,这没问题。对于敏感数据,这是一个严重的问题。
2. 当你删除文件时实际发生了什么
以下是当你运行 rm 时 Linux 逐步执行的操作:
- 它移除将文件名链接到其 inode 的目录条目。
- 它将 inode 的链接计数减一。
- 如果链接计数达到零 并且 没有进程打开该文件,则该 inode 被标记为空闲。
- 该文件占用的数据块被归还到空闲池,但 不会被擦除。
所以数据就留在那里,完好无损,等待被覆盖。在一个使用率低的系统上,这个等待可能会非常长。
一个基本的恢复工具,如 testdisk 或 photorec,可以在几分钟内恢复这些数据。
3. 开始前了解你的设置
正确的删除方法取决于两件事:你的文件系统和你的存储类型。错误的方法可能会给你虚假的信心,让你以为数据已经消失,而实际上并没有。所以在运行任何命令之前,花点时间了解你的硬件实际是如何存储数据的。
传统机械硬盘(HDD)
机械硬盘将数据写入旋转的磁性盘片。当你正常删除一个文件时,Linux 只是移除了指向该文件数据的目录条目,就像撕掉盒子上的标签而不清空它一样。
实际数据留在盘片上,直到有新数据覆盖它。这意味着在 HDD 上安全删除很简单:你用随机数据覆盖它,它就消失了。
现代固态硬盘(SSD)
SSD 使用闪存芯片而不是旋转盘片。由于 SSD 控制器为了管理磨损而将写入分散到各个单元——这个过程称为磨损均衡——你无法可靠地定位并覆盖一个特定的文件。
控制器决定数据物理上落在哪里,你无法从操作系统层面控制。
标准的文件 shred 工具在 SSD 上不起作用,反复运行它们甚至可能通过不必要的写入周期来缩短驱动器的寿命。
相反,正确的方法是使用一个硬件级别的命令,称为 TRIM,它通知 SSD 擦除操作系统已标记为空闲的块。
这个区别驱动了本指南中的每一种方法。现在让我们找出你正在使用的具体配置。
首先,找到你的文件系统类型:
df -T /home
# or
lsblk -f
然后,检查你的磁盘驱动器类型:
cat /sys/block/sda/queue/rotational
将“sda”替换为你的实际设备(nvme0n1、sdb 等)。
如果上述命令返回 0,则是 SSD。如果输出是 1,则是 HDD。
这是一个快速决策表:
| 存储类型 | 文件系统 | 推荐方法 |
|---|---|---|
| HDD | ext4 / xfs | shred 或 secure-delete |
| SSD | 任何(除 btrfs) | rm + sudo fstrim -av |
| SSD | btrfs | rm + 删除快照 + sudo fstrim -av |
话不多说。现在,让我们看看可以用来在 Linux 上安全删除文件并使它们实际上无法恢复的方法。
4. 方法 1:使用 ext4 的 HDD - 使用 shred 或 secure-delete
如果你有一个使用 ext4 或 xfs 的机械硬盘,你有两个可靠的选择:内置的 shred 命令,或功能更丰富的 secure-delete 工具包。两者都会在删除文件之前多次覆盖其数据块,这使得恢复极其困难。
重要提示: 这些工具只在原地写入数据的文件系统上可靠工作。在像 btrfs 这样的写时复制文件系统上,shred 和 secure-delete 都无效。如果你使用 btrfs,请跳到方法 3。在 SSD 上,请跳到方法 2,这两个工具在那里都无法按预期工作。
选项 A:shred(内置,无需安装)
shred 作为 GNU coreutils 的一部分随每个 Linux 发行版提供。你不需要安装任何东西。
删除单个文件:
shred -uzn 3 /path/to/file
以下是每个标志的作用:
-u:覆盖后删除文件(类似于rm)-z:添加最后一轮全零覆盖以隐藏shred的痕迹-n 3:覆盖 3 次(3 是默认值;你可以将其减少到-n 1,因为对于大多数现代 HDD,一次覆盖就足够了)
ext4 用户请注意: 如果你的 ext4 分区以 data=journal 模式挂载,shred 的效果会较差,因为日志会记录文件数据写入。大多数系统使用默认的 data=ordered 模式,在这种模式下 shred 工作正常。要检查你的挂载模式,运行 findmnt -o TARGET,OPTIONS / 并在选项列中查找 data= 值。
删除整个目录:
find /path/to/folder -type f -exec shred -uzn 3 {} \;
rmdir /path/to/folder
选项 B:secure-delete 工具包(更彻底,覆盖空闲空间和交换空间)
secure-delete 是一个专用软件包,为你提供四个独立的工具:一个用于文件,一个用于空闲磁盘空间,一个用于交换空间,一个用于 RAM。它们一起覆盖了你的数据可能残留的每一个角落。
首先安装 secure-delete:
# Debian, Ubuntu, Linux Mint, Pop!_OS
sudo apt install secure-delete
# Fedora
sudo dnf install secure-delete
srm - 安全删除文件和文件夹
srm 的工作方式类似于 rm,但在删除之前会覆盖数据。
用法:
# Delete a single file
sudo srm /path/to/file
# Delete a folder and everything inside it
sudo srm -r /path/to/folder
有用的标志:
-r:递归(用于目录)-v:详细(显示进度)-z:最后一轮用零代替随机数据-l:更快但安全性较低的模式(仅在速度比彻底性更重要时使用)
sfill - 擦除驱动器上的空闲空间
这是 shred 根本无法做到的步骤。在你正常删除文件后,它们的数据块会留在空闲空间池中等待被覆盖。sfill 会用随机数据填充所有空闲空间,擦除之前删除文件的任何痕迹。
用法:
# Wipe free space on the partition that holds /home
sudo sfill /home
# Or target any mount point
sudo sfill /
注意: sfill 在大容量驱动器上可能需要很长时间。如果你需要擦除一个大分区,让它运行一整夜。避免在正在大量使用的分区上运行它,因为它会影响系统性能。
sswap - 安全擦除你的交换分区
如果 Linux 在系统内存不足时将敏感文件的部分内容交换到磁盘,那么即使你删除了文件,这些数据也会留在交换分区中。sswap 可以正确地擦除它。
首先,找到你的交换分区:
cat /proc/swaps
上述命令在我的系统上的示例输出是:
Filename Type Size Used Priority
/dev/sda3 partition 2097148 25144 -1
如上所示,我的交换分区是 /dev/sda3。
然后禁用交换,擦除它,再重新启用:
sudo swapoff /dev/sda3 # replace with your swap partition
sudo sswap /dev/sda3
sudo swapon /dev/sda3
smem - 清除 RAM 中的敏感数据
smem 会覆盖 RAM 中未使用的部分,这些部分可能包含最近打开的文件或解密数据的片段。
默认情况下,它运行 38 轮,因此在内存很大的系统上可能需要几分钟,并且在运行时会暂时降低系统性能。在系统空闲时运行它。
sudo smem
使用任一选项后,也要清空你的回收站:
rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/info/*
5. 方法 2:SSD - 为什么 shred 会失败以及应该怎么做
在固态硬盘上,shred 无法按预期工作。因为 SSD 使用一种称为磨损均衡的技术。SSD 控制器故意将写入分散到许多单元以延长驱动器的寿命。
当 shred 试图覆盖一个块时,控制器通常会将“覆盖”写入一个完全不同的物理单元,使原始数据保持不变。
因此,你可以像这样安全且永久地从 SSD 删除文件,而不是使用 shred:
步骤 1:删除文件并清空回收站:
rm /path/to/file
rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/info/*
步骤 2:确保没有进程仍持有该文件:
sudo lsof | grep deleted
如果有任何进程出现,记下其 PID 并关闭该应用程序。然后运行:
sudo kill <PID>
步骤 3:运行 TRIM 告诉 SSD 擦除已释放的块:
sudo fstrim -av
对于那些想知道的人,TRIM 是一个命令,它告诉 SSD:“这些块现在是空闲的,你可以擦除它们。”
大多数现代 SSD 通过 fstrim.timer 按每周计划自动运行 TRIM,但手动运行可以确保它立即执行。
步骤 4:验证你的系统上是否启用了 TRIM:
sudo systemctl status fstrim.timer
如果它处于非活动状态,请启用它:
sudo systemctl enable --now fstrim.timer
6. 方法 3:BTRFS(写时复制)- 最棘手的情况
BTRFS 是一个现代、功能丰富的文件系统,许多 Arch Linux 和 Fedora 用户都喜欢它。然而,它使用写时复制(CoW),这使得安全删除比在 ext4 上更复杂。
核心问题在于:btrfs 永远不会原地覆盖数据。每次你修改一个文件,btrfs 都会将新版本写入一个新位置,并将旧块标记为空闲,但不会擦除它们。
当 shred 试图覆盖一个文件时,CoW 再次启动,将 shred 的覆盖轮次写入更多的新位置,使原始数据块在空闲池中完全不受影响。
这就是为什么 shred 在 btrfs 上无效的原因。无论你运行多少轮,它都永远不会触及原始数据。
如果你使用 btrfs,请改为遵循以下步骤:
步骤 1:删除文件和回收站:
rm /path/to/file
rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/info/*
步骤 2:检查并删除快照(这是大多数人遗漏的关键步骤):
如果你使用 Snapper 或 Timeshift,你的文件可能仍然存在于一个旧的快照中。这些快照是你在某个时间点的子卷的独立副本。
# List all snapshots (Snapper)
sudo snapper list
# Delete a specific snapshot
sudo snapper delete <snapshot-number>
# Or list btrfs subvolumes manually
sudo btrfs subvolume list /
# Delete a specific subvolume snapshot
sudo btrfs subvolume delete /.snapshots/<number>/snapshot
删除在文件创建之后拍摄的每个快照。任何在文件存在之前拍摄的快照都可以安全保留。
步骤 3:确认没有进程持有该文件:
sudo lsof | grep deleted
步骤 4:运行 TRIM:
sudo fstrim -av
7. 别忘了清除快照、缩略图和云
即使你从主存储中擦除了文件,副本也可能隐藏在意外的地方。以下是需要检查的最常见位置。
缩略图缓存
你的文件管理器或图像查看器可能已经生成了文件的小缩略图并单独保存。删除这些缓存:
# GNOME / most desktops
rm -rf ~/.cache/thumbnails/
# Shotwell
rm -rf ~/.cache/shotwell/
# gThumb
rm -rf ~/.cache/gthumb/
云同步服务
如果你使用 Nextcloud、Syncthing、rclone 或任何其他同步工具,该文件可能已经上传。直接登录这些服务并在那里删除文件。也要检查它们的回收站或版本历史。
应用程序缓存
一些应用程序,如 GIMP、Darktable 和 Shotwell,会保留自己的副本或图像的编辑历史。检查每个应用程序在 ~/.cache/<appname>/ 和 ~/.local/share/<appname>/ 下的缓存文件夹。
交换空间
如果你的系统在文件打开时内存不足,Linux 可能已将其部分内容交换到磁盘。清除它的最快方法是:
# Check you have enough free RAM first
free -h
# Then disable and re-enable swap to flush it
sudo swapoff -a && sudo swapon -a
如果你使用的是 HDD 并且已经安装了 secure-delete,请改用 sswap。它更彻底。有关确切步骤,请参见上面的 secure-delete 部分。
8. 如何验证文件已消失
完成上述步骤后,验证你的工作。不要仅仅假设它有效。
检查文件是否不再存在:
ls -la /path/to/file
# Expected: "No such file or directory"
检查没有进程仍持有它:
sudo lsof | grep deleted
# Expected: no output
检查没有快照包含它:
sudo btrfs subvolume list /
# Expected: no relevant snapshot entries remain
确认 TRIM 成功运行:
sudo journalctl -u fstrim --since "1 hour ago"
# Expected: entries showing successful trim of your device
尝试自己恢复文件:
# Debian, Ubuntu, Linux Mint, Pop!_OS
sudo apt install testdisk
# Fedora
sudo dnf install testdisk
# Arch Linux
sudo pacman -S testdisk
# openSUSE
sudo zypper install testdisk
sudo photorec
将 photorec 指向你的分区并让它扫描。如果它找不到该文件,那么使用标准工具的普通攻击者也找不到。这是你最好的实际确认。
如果你不知道如何使用 testdisk 或 photorec 恢复已删除的文件,请阅读以下指南:
9. 全盘加密
在 SSD 和 CoW 文件系统上,安全删除始终是尽力而为,但不能保证。SSD 控制器完全控制你的数据物理上位于何处,你无法从操作系统层面覆盖它。
获得真正、牢不可破的数据保护的唯一方法是从一开始就使用 LUKS(Linux 统一密钥设置)加密你的驱动器。当你的整个驱动器被加密时:
- 即使有人拔下物理驱动器,他们看到的也只是加密的噪音。
- “删除”一个文件意味着解密它的密钥消失了。使用当前技术,恢复在计算上变得不可行。
要在一个新分区上设置 LUKS 加密:
sudo cryptsetup luksFormat /dev/sdX
sudo cryptsetup open /dev/sdX my_encrypted_drive
sudo mkfs.ext4 /dev/mapper/my_encrypted_drive
这是一个高级设置,最好在你安装 Linux 时就计划好,而不是事后才想到。然而,如果你经常处理敏感数据,这是值得做的。
10. 快速参考备忘单:Linux 上的安全文件删除
HDD + ext4(使用 shred)
shred -uzn 3 /path/to/file
rm -rf ~/.local/share/Trash/{files,info}/*
rm -rf ~/.cache/thumbnails/
HDD + ext4(使用 secure-delete - 更彻底)
sudo srm /path/to/file # securely delete a single file
sudo srm -r /path/to/folder # or a folder
sudo sfill /home # wipe leftover traces in free space
sudo swapoff /dev/sdaX && sudo sswap /dev/sdaX && sudo swapon /dev/sdaX
sudo smem # clear RAM fragments (run when system is idle)
rm -rf ~/.local/share/Trash/{files,info}/*
rm -rf ~/.cache/thumbnails/
SSD(除 btrfs 外的任何文件系统)
rm /path/to/file
rm -rf ~/.local/share/Trash/{files,info}/*
rm -rf ~/.cache/thumbnails/
sudo lsof | grep deleted
sudo fstrim -av
SSD + btrfs(Arch、Fedora、openSUSE、Ubuntu 24.04+)
rm /path/to/file
rm -rf ~/.local/share/Trash/{files,info}/*
rm -rf ~/.cache/thumbnails/
sudo snapper list # check for snapshots
sudo snapper delete <number> # delete relevant ones
sudo lsof | grep deleted
sudo fstrim -av
验证是否成功
ls -la /path/to/file # should not exist
sudo lsof | grep deleted # should return nothing
sudo photorec # try to recover — expect to find nothing
11. 常见问题解答(FAQ)
问:rm 能安全删除文件吗?
答:不能。它只移除文件系统对文件的引用。
问:shred 在 SSD 上使用安全吗?
答:不安全。它无法可靠地覆盖原始的闪存单元,因为 SSD 使用磨损均衡。
问:TRIM 会立即擦除我的文件吗?
答:不一定。TRIM 告诉 SSD 哪些块不再需要。SSD 在其自己的垃圾回收过程中执行实际的清理。
问:Btrfs 快照会保留已删除的文件吗?
答:会。如果快照包含该文件,删除原始副本不会将其从快照中移除。
问:取证工具还能恢复我的文件吗?
答:在大多数日常情况下,在移除快照、清除备份并发出 TRIM 后,恢复变得极其困难。
然而,没有 Linux 命令可以保证 SSD 上的每一个痕迹都已消失。
最后想法
在 Linux 上删除文件不等于销毁它。然而,通过为你的存储设备和文件系统遵循正确的方法,你可以使已删除的数据在当前硬件允许的范围内尽可能难以恢复。
现代 Linux 系统也需要与旧系统不同的方法。曾经普遍的建议是使用 shred,但这已不再适用于许多实际场景。SSD、Btrfs 和其他写时复制文件系统处理数据的方式与传统的机械硬盘截然不同。
与其试图覆盖一个文件,不如专注于移除它的每一个副本。删除原始文件,清空回收站,移除快照,检查你的备份,关闭任何打开的文件句柄,并在 SSD 上运行 TRIM。
最重要的是,在你需要隐私之前就做好计划。如果你经常处理敏感文件,请在安装 Linux 时启用全盘加密。它比事后试图安全删除单个文件提供更强的保护。
关键要点:
- 在 HDD 上,对于快速任务使用
shred,对于彻底清理(包括空闲空间、交换空间和 RAM)使用完整的secure-delete工具包。 - 在 SSD 上,使用
rm,然后使用fstrim。 - 在 btrfs 上,始终检查并移除快照。它们是最常见的陷阱。
- 对于所有情况,清除缩略图缓存并检查云同步。
- 为了最大安全性,从使用 LUKS 的全盘加密开始。
你不需要成为安全专家才能正确处理这个问题。你只需要知道哪些步骤适用于你的设置。
推荐阅读:




