inode问题

今日碰到一个问题是,有机器磁盘快要满了,于是有人直接上去删除了一些日志文件,可删除后发现这些日志文件很多还是进程在读写中的。于是导致空间并没有释放。

这个用lsof或者直接去/proc/pid/fd/就可以容易的看到。

释放空间比较简单的方法是重启一下这个读写的进程,当然有些进程是提供重新打开日志文件的信号的(比如nginx的USR1信号),但是大部分进程其实都不支持。

但是我那个程序又不想重启,重启了又要重新开始扫描了。那就想把这个文件给恢复,同时又是对应的inode号。

首先我们很容易获得inode号

恢复文件其实很容易。我们直接cp就行

但是我们查看了一下,这样内容是对的,但是inode号是不一样的,/proc里也不认识这个文件,还是认为这个文件已经被删除了。

google了一下,发现有人2011年也问过一样的问题

https://superuser.com/questions/810208/can-a-file-be-created-from-an-inode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fcntl.h>
#include <err.h>

int main(int argc, char *argv[]) {
char *src, *dstdir, *dstname;
int dirfd, r;

if (argc < 4)
errx(2, "not enough parameters");

src = argv[1]; dstdir = argv[2]; dstname = argv[3];

dirfd = open(dstdir, O_DIRECTORY);
if (dirfd < 0)
err(1, "open(%s) failed", dstdir);

r = linkat(AT_FDCWD, src, dirfd, dstname, AT_SYMLINK_FOLLOW);
if (r < 0)
err(1, "linkat(%s, %s/%s) failed", src, dstdir, dstname);

return 0;
}

但是这样其实是不行的,因为/proc文件系统是一个启动后生成的独立文件系统。

看了下stackoverflow上的回答,发现是不行的。
https://stackoverflow.com/questions/5752822/how-do-i-create-a-file-with-a-specific-inode-number