삭제된 파일 다시 연결

삭제된 파일 다시 연결

때로는 사람들이 삭제해서는 안 되는 파일을 삭제하고, 장기 실행 프로세스에서 여전히 파일이 열려 있고, 캐팅을 통해 데이터를 복구하는 것만 /proc/<pid>/fd/N으로는 충분하지 않습니다. inode 번호(lsof를 통해 복구됨)에 다시 연결할 수 있는 ln에 대한 일부 마법 옵션을 실행하여 삭제를 "실행 취소"할 수 있다면 정말 좋을 것입니다.

이 작업을 수행하는 Linux 도구를 찾을 수 없습니다. 적어도 대략적인 인터넷 검색으로는 찾을 수 없습니다.

무엇을 얻었습니까, 서버 오류?

EDIT1: 파일을 가져오는 것이 충분히 훌륭하지 않은 이유 /proc/<pid>/fd/N는 파일이 열려 있는 프로세스가 여전히 파일에 쓰고 있기 때문입니다. 삭제하면 파일 시스템 네임스페이스에서 inode에 대한 참조가 제거됩니다. 내가 원하는 것은 참조를 다시 만드는 방법입니다.

EDIT2: 'debugfs ln'은 작동하지만 원시 파일 시스템 데이터를 가져오기 때문에 위험이 너무 높습니다. 복구된 파일도 일관성이 없습니다. 링크 수가 0이므로 링크를 추가할 수 없습니다. /proc/<pid>/fd/Nfs를 손상시키지 않고 데이터에 액세스하는 데 사용할 수 있기 때문에 이 방법은 더 나쁩니다 .

답변1

inode 번호(lsof를 통해 복구됨)에 다시 연결할 수 있는 ln에 대한 일부 마법 옵션을 실행하여 삭제를 "실행 취소"할 수 있다면 정말 좋을 것입니다.

ln이 굉장함은 다음 에서 소개되었습니다 .v8.0(GNU/coreutils) 첫 번째 역참조를 -L|--logical발생시키는 옵션을 사용합니다 . 그래서 간단한ln/proc/<pid>/fd/<handle>

ln -L /proc/<pid>/fd/<handle> /path/to/deleted/file

삭제된 파일을 다시 연결하는 데 충분합니다.

답변2

이미 많이 이해하신 것 같으니 자세한 설명은 생략하겠습니다. inode를 찾는 방법에는 여러 가지가 있으며 일반적으로 STDOUT을 cat하고 리디렉션할 수 있습니다. 당신이 사용할 수있는debugfs. 다음 내에서 이 명령을 실행하세요.

ln <$INODE> FILENAME

파일 시스템의 백업이 있는지 확인하십시오. 나중에 fsck를 실행해야 할 수도 있습니다. 아직 작성 중인 inode를 사용하여 이를 성공적으로 테스트했으며 역참조된 inode에 대한 새 하드 링크를 생성하는 데 작동합니다.

ext3에서 열려 있지 않은 파일과 파일의 연결이 해제되면 데이터가 손실됩니다. 이것이 얼마나 일관되게 사실인지는 잘 모르겠지만 대부분의 데이터 복구 경험은 ext2에서 이루어졌습니다. ext3 FAQ에서:

Q: ext3 파티션에서 삭제된 파일을 어떻게 복구(삭제 취소)할 수 있나요? 실제로는 할 수 없습니다! 개발자 중 한 명인 Andreas Dilger는 이에 대해 다음과 같이 말했습니다.

ext3이 충돌 후 링크 해제를 안전하게 재개할 수 있도록 실제로 inode의 블록 포인터를 0으로 만드는 반면, ext2는 이러한 블록을 블록 비트맵에서 사용되지 않은 것으로 표시하고 inode를 "삭제됨"으로 표시한 후 블록을 떠납니다. 포인터만.

유일한 희망은 삭제된 파일의 일부를 "grep"하고 최선을 다하는 것입니다.

이 질문에는 관련 정보도 있습니다.

Linux 서버에서 큰 파일을 빈 파일로 덮어썼습니다. 기존 파일을 복구할 수 있나요?

답변3

당신이 본 debugfs 방식은 실제로 작동하지 않으며 재부팅 후 파일이 자동으로 삭제되고(저널로 인해) 최악의 경우 파일 시스템을 휴지통으로 만들어 "재부팅 주기"가 발생할 수 있습니다. 올바른 솔루션(TM)은 VFS 수준에서 삭제 취소를 수행하는 것입니다(현재 거의 모든 Linux 파일 시스템에서 작업할 수 있다는 추가 이점도 있습니다). 시스템 호출 방식(flink)은 LKML에 나타날 때마다 중단되었으므로 가장 좋은 방법은 모듈 + ioctl을 이용하는 것입니다.

이 접근 방식을 구현하고 합리적으로 작고 깔끔한 코드를 가진 프로젝트는 fdlink(https://github.com/pkt/fdlink.git우분투 매버릭 커널로 테스트된 버전의 경우). 이를 사용하여 모듈(sudo insmod flink_dev.ko)을 삽입한 후 "./flinkapp /proc//fd/X /my/link/path"를 수행하면 정확히 원하는 작업이 수행됩니다.

작동하는 vfs-undelete.sourceforge.net의 포워드 포팅 버전을 사용할 수도 있지만(원래 이름에 자동으로 다시 링크할 수도 있음), fdlink의 코드가 더 간단하고 잘 작동하므로 이것이 제가 선호하는 것입니다.

답변4

나는 당신이 원하는 것을 정확히 수행하는 방법을 모르지만 내가 할 일은 다음과 같습니다.

  • 다른 프로세스에서 RO 파일 열기
  • 원래 프로세스가 종료될 때까지 기다립니다.
  • 열려 있는 FD의 데이터를 파일로 복사합니다.

물론 이상적이지는 않지만 가능합니다. 다른 옵션은 debugfs(명령 사용)를 가지고 노는 것이지만 link프로덕션 시스템에서는 다소 무서운 일입니다!

관련 정보