2013-08-12 4 views
8

Linux에서 특정 iNode에 링크되는 파일을 만드는 방법이 있습니까? 시나리오 작성 : 로그 파일에 로그 파일이 있고 특정 파일이 삭제되었습니다. 그러나 dir/proc의 링크가 계속 가리키고 있습니다. 이 경우에는 이 아닌의 하드 카피가 필요하지만 프로세스가 닫히고 시스템이 삭제하기 전에 향후 수정 및 마지막 수정을 할 수 있습니다.Linux 파일 삭제 복구

iNode 번호가 있으면이 목표를 달성 할 수있는 방법이 있습니까? 당신은 (때로는) 삭제 된 파일을 복구 할 수 lsof를 사용할 수 있습니다

답변

4

...

> lsof | grep testing.txt 
less 4607 juliet 4r REG 254,4 21 
     8880214 /home/juliet/testing.txt (deleted) 

당신이 나 같은 Maveric를 아니라면,이 시도하기 전에 자세한 사항은 원래의 기사를 읽어 보시기 바랍니다.
> ls -l /proc/4607/fd/4 
lr-x------ 1 juliet juliet 64 Apr 7 03:19 
     /proc/4607/fd/4 -> /home/juliet/testing.txt (deleted) 
> cp /proc/4607/fd/4 testing.txt.bk 

http://www.linuxplanet.com/linuxplanet/tips/6767/1

+1

Gasp. 네가 옳아. 나는 방금 그걸 테스트했다고 생각했는데 작동하지 않았다. NTL : OP는 하드 링크를 요청했는데, 특히 사본이 아닙니다. –

3

그것은 "내가 할 수있는"자신있게 부정적인에서 같은 질문에 대답하는 것이 어려운 즐길 수 있습니다. 그러나 내가 보는 한,/sys/nor/proc는 symlink가 아닌 열린 파일 기술자의 매핑을 제공하지 않습니다. 나는 "그러나 dir/proc의 링크가 여전히 그것을 가리키고있다"라고 가정합니다./proc/fd/entries가 심볼릭 링크처럼 보입니까? 거의 원본 파일을 복구 할 수 없다고 확신합니다.

나는 사용자 user2676075가 지적했듯이 복사가 작동한다. 그냥 하드 링크하지 않습니다 ...

업데이트 : 당신이 그것에 대해 생각한다면 그것은 꽤 논리적입니다.

  • /proc 및/sys는 하드 디스크와 다른 파일 시스템입니다. 따라서 하드 디스크의 대상에 하드 링크 할 수있는 디렉토리 항목과 같은 파일을 제공 할 수 없습니다.
  • /proc/*/fd/항목은 심볼릭 링크를 가장하지만 실제로는 다릅니다. 그렇지 않으면 복사가 작동하지 않습니다. 나는 그들이 'ln -l'이라는 의미있는 정보를 제공하기 위해 심볼릭 링크를 가장한다고 생각한다.

  • 어떤 아이 노드에 하드 링크하기 위해 (실종) 기능에 대해서 (의 일부 시스템 호출로 가정 해 봅시다) :

    • : 이것은 다음과 같은 이유로 커널 또는 VFS 인터페이스의 일부가 될 수 없습니다 파일 시스템의 무결성을 침해합니다. 파일 시스템은 완전히 지워지는 파일의 디스크 블록을 유지하는 파일과 같은 방식으로 보존하지 않아야합니다.

    • inode는 "데이터 스트림이 저장된 슬롯"을 식별하는 완전히 가상적인 개념 일 수 있습니다. 참조가없는 슬롯을 다시 참조가없는 슬롯으로 변환하는 문제가있는 구현이있을 수 있다고 가정합니다 파일 시스템의 이름으로.

    나는 그런 시스템 호출의 가능성에 대한 사건을 물 꽉되지 인정한다. 그러나 AFAIR가 제공하지 않는 VFS 인터페이스의 현재 상태 (부여 그러한 호출), 어떤 파일 시스템 구현 (예를 들어,분산 파일 시스템)을 사용하여 파일을 inode에 의해 디렉토리에 링크하기위한 호출을 제공합니다.

ATM 실제로 같은 아이 노드 정보를 반환 할 필요합니다 전에 fstat를 호출하는 경우 마지막 참조를 삭제 한 후 나는 ... 궁금 t

을하기 때문에 아이 노드를 포함 어떤 콜이 없기 때문에
+0

하드 링크 - 인 - inode가 존재하지 않는 이유는 사람들이 자신이해서는 안되는 파일에 액세스 할 수있게하기 위해서입니다. 700 디렉토리는 링크 (2)에 대한 인수로서 inode 번호를 사용하지 않는 한, 모든 것을 비공개로 만듭니다. 이 상황에 대해 좋은 점은 link (2)가 열린 파일 설명자를 취하는 것입니다. 비록 더 이상 접근 할 수없는 파일에서 열린 fd로 시작한다면 프로세스가 할 수있는 새로운 것을 열어 주지만, 직접 열 수없는 파일도 있습니다. 또한 삭제 의미는 다음과 같습니다. 디스크 공간은 마지막 링크까지 지속되고 마지막으로 열린 fd와 마지막 mmap이 사라집니다. –

14

extX fs의 개념이며 좋은 연습은 난로 파이프를 만드는 것이 아니라 책임 성 체인을 만드는 것입니다 (MEL에서 제안한 것처럼), 아니오이 질문에 대한 답변이므로 VFS 레벨에서는 파일 경로와 이름을 처리하기 때문에 다른 내부 표현은 아닙니다.

하지만 우리가 꼬리와 지속적인 모니터링과 중복 사용할 수있는 가장 마지막으로 수정을 추적 할 수있는 목표를 달성하기 위해 : PID는 삭제 된 파일을 가지고있는 프로세스의 PID입니다

tail -c+1 -f --pid=PID /proc/PID/fd/FD > /path/to/the/copy 

여전히 열리고 FD는 파일 설명자 번호입니다. -f 꼬리를 열어 더 수정을 표시하려면 파일을 보유하고 -c + 1은 첫 번째 바이트에서 "꼬리"로 시작하고 --pid = PID 꼬리는 PID 종료시 종료하도록 통보됩니다 .

+0

inode는 ext2/3/4에만 해당되지 않습니다. 그것들은 stat (2)와 같은 시스템 호출이 어떻게 작동하는지, 그리고 하드 링크를 찾는 방법에 대한 POSIX 사양의 일부입니다. 하지만 유감 스럽지만/proc/PID/fd/FD에서 실제 파일로 링크를 만드는 방법이없는 것 같아요. 읽기/쓰기로 열면됩니다. 링크 (2)와 같은 시스템 호출 만이 열린 파일 설명자를 경로가 아닌 경로로 가져온 경우. –