1.磁盘已满

1.磁盘已满

删除 veracrypt 加密驱动器上没有剩余磁盘空间的文件后,不会释放任何磁盘空间。

我正在尝试将一个硬盘驱动器同步到另一个硬盘驱动器,如所述这里

该目标驱动器已满,我无法释放其上的磁盘空间。我尝试以各种方式删除文件,例如运行rm /.../file,不仅仅是 Dolphin 文件资源管理器显示没有可用的磁盘空间,而且例如df -h在 Avail 列中显示 0,在 Use% 中显示 100%。

如何实际删除文件并释放磁盘空间或者如果它只是显示错误,则让它显示实际可用的磁盘空间?我正在使用 Debian 和 KDE。


详细信息问题是如何发生的以及我尝试过的更多事情:

问题是它完成时出现错误,因为它达到了“设备上没有剩余空间”(这也不应该发生)并且 Grsync 不备份 root 拥有的文件。

然后我在控制台中运行 Grsync 的 rsync 命令,如上所述。命令是sudo rsync -r -t -p -o -g --delete -l -s /media/veracrypt1 /media/veracrypt2

它有许多“跳过非常规文件”错误,但这是一个单独的问题(它应该备份 100.0%),并且最终还出现“设备上没有剩余空间”错误,尽管 disk1 上有许多 GB 的可用磁盘空间。sudo lsof | grep {diskname}显示 disk2 没有被任何东西使用。当然没有正在运行的rsync进程。同时我多次重新启动、卸载并重新安装驱动器。

我遇到的问题是,当我删除 disk2 上的某些内容以释放磁盘空间以允许另一次同步时,它不会显示 Dolphin 文件浏览器中或输入lsblk -for时有更多可用磁盘空间df(后者仍然在列中显示 0)可用的)。

我尝试通过右键单击 Dolphin 中的文件并选择删除来删除它。我还尝试了“移至垃圾箱”,但只有备份的垃圾箱文件夹(我无法使用 Grsync 排除它),但驱动器根目录下没有垃圾箱文件夹。

A类似的问题发生在我的 /home/ 分区(不同的驱动器)上,但重新启动后解决了。重新启动、卸载并重新安装驱动器以及升级到 Debian12 后,此处描述的问题并没有消失。

删除内容时,可用空间仍然/立即为 0 字节,尽管如此,我检查了一个快速增长的大文件,gdmap但找不到任何内容。升级后,似乎sudo lsof | grep "/media/"(即使我打开了一些文件也没有输出)不会显示磁盘上的文件是否已打开,但不应打开磁盘上的文件。

我已经尝试过了这个问题。例如IUse%显示百分比相当低。sudo dumpe2fs /media/veracrypt2/ | grep -i reserved只是说dumpe2fs: Is a directory while trying to open /media/veracrypt2/sudo lsof +L1 | grep media没有显示任何输出,也没有sudo lsof | grep deleted | grep media。不应向该驱动器写入或读取任何内容。


跳过不必要的细节:

我认为注销并重新登录以重新启动会话可以解决此问题,但事实并非如此,它仍然显示 0 字节的可用磁盘空间。rm filename也不释放磁盘空间。根据要求,输出lsof | grep deleted如下;其中许多消息显示了很多次,我省略了一些列并替换了 Id:

pulseaudi ... /memfd:pulseaudio (deleted)
ksmserver ... /home/username/.cache/ksycoca5_{lang}_{id} (deleted)
plasmashe ... /home/username/.cache/ksycoca5_{lang}_{id} (deleted)
plasmashe ... /home/username/.cache/appstream/appcache-{id}.mdb (deleted)
vorta ... /usr/share/mime/mime.cache (deleted)
{texteditor} ... /home/username/.cache/ksycoca5_{lang}_{id} (deleted)
konsole ... /home/username/.cache/konsole/#{number} (deleted)

重新启动会话后,打印机程序会打开一个附加的 .lock 文件、两个pulseaudi 和 konsole 文件,但仅此而已。如果lsblk -fDolphin 显示正确的可用空间,我仍然无法释放磁盘空间。

我又尝试了lsof +L1一次,即使这就是它显示的全部内容(打开一个控制台),它也没有显示更多磁盘空间:

COMMAND       PID     USER   FD   TYPE DEVICE SIZE/OFF NLINK    NODE NAME
konsole    549098 username   20u   REG  254,2        0     0 8257752 /home/username/.cache/konsole/#8257752 (deleted)
konsole    549098 username   21u   REG  254,2        0     0 8257764 /home/username/.cache/konsole/#8257764 (deleted)
konsole    549098 username   22u   REG  254,2        0     0 8259787 /home/username/.cache/konsole/#8259787 (deleted)
konsole    549098 username   23u   REG    0,1  3677184     0 2372415 /memfd:wayland-cursor (deleted)
veracrypt 2340184 username    9u   REG    0,1  3677184     0   69165 /memfd:wayland-cursor (deleted)
xdg-deskt 2340702 username    8u   REG    0,1  3677184     0   69892 /memfd:wayland-cursor (deleted)

我也尝试过sudo lsof | grep deleted | grep mountname,但它没有给出任何输出。 mountname 是目录的一部分,因为我将其安装在那里(sudo lsof | grep mountname1适用于其他驱动器上打开的文件,甚至sudo lsof | grep mountname不显示任何内容)。

这可能是一个维拉加密漏洞,问题在这里

答案1

我在不同的机器上多次运行了这个场景。我不能保证您会遇到与我相同的情况,但我相信值得一试。

你似乎有两个不同的问题,没有一个与 Veracrypt 真正相关,这只是容器对于文件系统。

  1. 磁盘满了,删除一些文件导致磁盘仍然满。

  2. 磁盘不该有填补了。

1.磁盘已满

情况 (1) 不依赖于已删除的文件或未计算的空间,因为您重新安装了磁盘并重新启动,这将消除已删除的打开文件并在必要时强制执行 fsck。

1.1 磁盘已满,因为有东西不断写入

那么我们有两种解决方案:一种是有些东西仍在写入磁盘,附加到某些现有文件(这通常发生在我的日志文件上)。想象一个进程有二十兆字节的积压需要写入,但由于磁盘已满而无法写入,并且您删除了十五兆字节的文件。您的可用空间立即再次被填满。要检查这一点,唯一实用的方法是运行磁盘记帐(对不同设备上的文件),ls -laR可能会删除一些文件以释放空间,再次运行记帐,然后比较两个记帐。您当然应该注意到第二个文件上的一些文件已经消失(您删除的文件),但其他一些文件也出现了或大小增加了。

您可以lsof仅使用帐户打开的文件来执行此操作,这要快得多,但您可能会丢失已创建、填充和关闭的文件。

您还可以使用du -sk /mnt/disk/*/*/* > /tmp/before.txt列出所有文件夹中的空间来执行此操作,例如,距离磁盘安装点深度最多为 3 个文件夹。这样可以快速将哪些文件夹的大小增加归零。

1.2盘显然由于 5% 的根保留而已满

第二种可能是你的文件管理器没有正确考虑根保留空间。大多数(如果不是全部)Linux 文件系统预订一些空间(通常为 5%)用于 root 操作并提高一些关键性能。如果 root 发起的操作填满了磁盘,并且非 root 用户删除了一些剩余占用率超过 95% 的文件,则非 root 用户将继续看到磁盘完全已满。

您可以使用检查总文件系统和可用空间

tune2fs -l /dev/mapper/yourcryptdevicename

你可以改变 5% 到 1%

tune2fs -m 1 /dev/mapper/yourcryptdevicename

这将使剩余的 4% 可用空间“重新出现”给非 root 用户。

2. 磁盘不应已满

仅当您将 400 GB 的文件放置在 500 GB 的磁盘上并将其填满时,这才适用。如果差异低于5%,则属于原因1.1的影响,可以通过这种方式解决,无需进一步解释。

否则,磁盘上的空间将以基本块单元的倍数进行分配,该单元可能是 4K。发生这种情况时,一个 6K 大小的文件将需要两个块,并且创建它会导致磁盘丢失 8K 的可用空间。这有时被称为松弛空间平均等于块大小的一半乘以您拥有的文件数。

因此,当我将源和库树从笔记本电脑同步到 NAS 时,笔记本电脑有 2K 块,NAS 有 4K 块,则有 49 Gb实际使用的1,797,479 个文件;但如果我跑du -sk --apparent-size,我会得到 44Gb。 49 GB 实际上要归功于 ext4 文件系统的一些技巧,以避免小文件占用大量闲置空间。在 NAS 上,我没有这些技巧,块一开始就是双倍的,同样的 44 GB 文件占用了 56 GB。扩展到整个 SSD 的价值,我可能有 880 Gb 的文件不适合 1 TB SSD 驱动器

要检查是否是这种情况,请运行

tune2fs -l /dev/yourpartition | grep "Block size:"

une2fs 输出中还有其他信息,可以帮助您检查正在发生的情况,例如,通过比较正在同步的两个磁盘上的输出,以及删除某些文件后比较同一磁盘上的输出,例如

Inode count:              365985792
Block count:              1463919616
Free blocks:              72775504
Free inodes:              176130892

答案2

信息取自Linux 中的 df 文件删除后未显示正确的可用空间,并结合其他答案、Google 结果和经验。

堆积如山的评论者只能为你提供一半的答案。lsof |grep deleted仅列出受影响的文件,但引用上面链接的 Ignacio:

删除文件名并不会真正删除该文件。某些其他进程使文件保持打开状态,导致其无法被删除;重新启动或终止该进程以释放该文件。

使用:

lsof +L1 列出使用已删除文件的所有进程(您已根据注释完成此操作,但注释没有告诉您为什么这样做)。lsof是缩写打开文件描述符列表。这里的关键词是描述符。我们需要文件描述符来终止使已删除的文件保持打开状态的进程。您可以使用kill - 15 PID它将终止进程(PID 应在上面省略号的输出中列出)[另请参阅:我什么时候不应该杀死-9进程?],或者你可以像这样杀死打开的文件描述符:

  1. cd /proc/PID/fd:PID 将再次以省略号中的数字形式列出。将命令中的 PID 替换为该数字。 fd是缩写文件描述符
  2. proc使用评论者提供的变体命令验证您是否位于文件系统的正确 PID 分支中:ls -l |grep deleted
  3. 现在问题>/dev/null 2>&1(deleted)通过将标准错误2>&标准输出重定向1空设备。也可以看看:如何将管道的输出重定向到>/dev/nulldev/null对和重定向进行详细的解释。

一些读者可能会问为什么第一个重定向运算符的左侧没有写入任何内容,我相信因为我们位于文件描述符目录中,所以文件描述符被假定为左侧参数。

答案3

我不认为 veracrypt 层与磁盘空间问题有任何关系。 Veracrypt 是一个对文件系统一无所知的块层。 Ext4 是一个位于块设备之上的文件系统。如果您没有恢复磁盘空间,那么这是文件系统问题。

除了块大小(在另一个答案中讨论)之外的考虑因素是稀疏文件和单独复制的硬链接文件。两者均由标志管理rsync;您选择的标志都会忽略两者。您可以通过比较这两个命令的磁盘使用情况来验证这一点:

du -hsx /media/veracrypt1
du -hsxl --apparent-size /media/veracrypt1

在您链接的问题中,您谈到了备份整个系统。在这种情况下,您需要小心忽略内存支持的文件系统,例如/dev和 通常/tmp。但是,这里您使用的是目录路径,因此我将继续在此处使用这些路径

rsync -axHS /media/veracrypt1/ /media/veracrypt2

笔记:

  1. 稀疏标志不会用稀疏等效项替换现有文件 - 您需要自己处理这些文件或先删除它们。
  2. 同样,rsync不会对相同但尚未硬链接的文件进行硬链接;您必须事先删除两者。
  3. 您原来的命令会创建/media/veracrypt2/veracrypt1.通过/添加源目录路径后缀,您可以直接执行到目标的复制,而无需首先创建名为源的子目录。

相关内容