场景假设:
进程 pid:1000
文件路径:/foo/bar.txt
被 1000 进程占用的文件描述符:6
当 1000 进程还占用着 /foo/bar.txt 的时候,执行 rm /foo/bar.txt -f,文件被“假删除了”(其实还在写数据),通过 losf |grep deleted|grep 1000|grep "/foo/bar.txt"可以看到被删除的文件(显示 deleted ),这时可以通过找到该进程的文件描述符文件夹里写入的文件名找到描述符,比如定位到了是 6 号文件描述符是被删除的文件的文件描述符,然后可以通过这条命令看到其实进程还在向该文件写数据:tail -F /proc/1000/fd/6 。
然后看了一些教程,直接把 fd 拷贝回被删除的文件,cp /proc/1000/fd/6 /foo/bar.txt ,但是这样的话被删除文件在被创建那一刻后就不再新写入数据了,换句话说复原的文件的数据只保留了我执行 cp /proc/1000/fd/6 /foo/bar.txt 那一刻前的 /proc/1000/fd/6 的数据,而不会写入新数据,但是查看 fd 写入情况 tail -F /proc/1000/fd/6 是正常有新数据写入的。
我的问题就是怎么能在恢复被删除的文件的同时保证新数据正常写入?也就操作后不丢数据。
进程 pid:1000
文件路径:/foo/bar.txt
被 1000 进程占用的文件描述符:6
当 1000 进程还占用着 /foo/bar.txt 的时候,执行 rm /foo/bar.txt -f,文件被“假删除了”(其实还在写数据),通过 losf |grep deleted|grep 1000|grep "/foo/bar.txt"可以看到被删除的文件(显示 deleted ),这时可以通过找到该进程的文件描述符文件夹里写入的文件名找到描述符,比如定位到了是 6 号文件描述符是被删除的文件的文件描述符,然后可以通过这条命令看到其实进程还在向该文件写数据:tail -F /proc/1000/fd/6 。
然后看了一些教程,直接把 fd 拷贝回被删除的文件,cp /proc/1000/fd/6 /foo/bar.txt ,但是这样的话被删除文件在被创建那一刻后就不再新写入数据了,换句话说复原的文件的数据只保留了我执行 cp /proc/1000/fd/6 /foo/bar.txt 那一刻前的 /proc/1000/fd/6 的数据,而不会写入新数据,但是查看 fd 写入情况 tail -F /proc/1000/fd/6 是正常有新数据写入的。
我的问题就是怎么能在恢复被删除的文件的同时保证新数据正常写入?也就操作后不丢数据。