我在 Xubuntu 14.04 上使用 Transmission 2.82,我注意到从文件管理器中永久删除下载的文件后,Transmission 中的作业仍然处于活动状态并保持播种,并且可用磁盘空间没有变化,所以我尝试ls -l /proc/[pid]/fd
并我懂了:
lr-x------ 1 name name 64 May 4 20:39 81 -> /home/downloads/ubuntu-16.04-server-i386.iso (deleted)
然后我重新下载该文件并删除它,rm
而不删除该作业,并且释放了磁盘空间,并且ls -l /proc/[pid]/fd
没有给出与该文件相关的条目,并且该作业以 0kb/s 的速度播种。
但为了看看这是否rm
造成了差异,然后我rm
在作业播种时尝试了三次删除下载的文件,每次我都收到相同的结果,作业处于活动状态并播种,可用磁盘空间没有变化,并ls -l /proc/[pid]/fd
产生类似的结果:
lr-x------ 1 name name 64 May 4 20:39 26 -> /home/downloads/ubuntu-16.04-server-i386.iso (deleted)
并ls ubuntu-16.04-server-i386.iso
给出:
ls: cannot access ubuntu-16.04-server-i386.iso: No such file or directory
我还尝试du -s
在df /home
下载文件夹中分别使用另一个作业:
作业正在运行,文件未删除:
$ du -sh
11G
$ df -h /home
Filesystem Size Used Avail Use% Mounted on /dev/sda1 58G 54G 1.2G 98% /
作业正在运行,文件被删除(带有rm
)(传输在删除后保持播种):
$ du -sh
9.9G
$ df -h /home
Filesystem Size Used Avail Use% Mounted on /dev/sda1 58G 54G 1.2G 98% /
作业已删除,文件已删除(在上一步中):
$ du -sh
9.9G
$ df -h /home
Filesystem Size Used Avail Use% Mounted on /dev/sda1 58G 54G 1.5G 98% /
那么,下载的文件发生了什么?我之后rm
,Transmission 还如何进行播种工作?是否可以恢复文件?由于du
和df
给出不同的输出,文件是否被重新定位到其他地方?
答案1
如果一个程序在删除它时打开了一个文件,内核只会将其标记为已删除,但不会释放磁盘空间,以避免破坏程序(无法知道该文件对于该程序的功能是否重要)程序)。当程序关闭文件时,磁盘空间被释放。发生这种情况时,当您查看/proc/<pid>/fd
打开该文件的进程时,您将看到“(已删除)” 。
因此,内核有助于不删除传输使用的文件。
如果您不想使用传输共享文件,则应该将其从传输中删除,据我记得传输甚至可以选择删除文件作为停止共享的一部分。
实际上,您可以通过复制来恢复文件,/proc/<pid>/fd/
因为它是文件的链接(仅在进程打开时才存在)。
root@mypc:~# pgrep transmission
1470
root@mypc:~# cd /proc/1470/fd
root@mypc:/proc/1470/fd# ls -l | grep deleted
lr-x------ 1 user user 64 Dec 8 02:55 56 -> /mnt/download/my.file (deleted)
root@mypc:/proc/1470/fd# cp 56 /mnt/download/myrestored.file
答案2
我怀疑传输将文件保存到您下载时未知的位置。完成后,它会在您的下载文件夹中创建指向同一文件的硬链接,但仍将硬链接保留在它自己的目录中(可能是 ~/.transmission 或类似的目录)。
您可以找到已完成下载的所有硬链接,如中所述如何查找给定文件的所有硬链接?或者使用这个:去~/Downloads
执行ls -i
并记住文件的索引节点号。然后您可以通过在您的主文件夹中执行来找到另一个文件find . -inum NUM
。