Linux에서 '부실 파일 핸들'은 무엇을 의미합니까?


101

터미널이 열려 있고 그 터미널을 통해 cd일부 디렉토리로 이동했습니다. 다른 터미널을 통해 해당 디렉토리를 삭제하고 동일한 백업에서 복원합니다. vim동일한 디렉토리의 첫 번째 터미널에서 파일을 시도 할 때 오래된 파일 핸들에 대한 오류가 발생하는 이유는 무엇입니까? 무슨 뜻인가요? (참고로을 통해이 문제를 우회 할 수 있음을 발견했습니다 cd $(pwd).)


호스트 A에서 호스트 B로 디렉토리 (이름 : adir)를 NFS 마운트 한 다음 호스트 A의 adir에 대해 삭제 및 복원 작업을 수행하면 호스트의 adir에 액세스 할 때 "부실 파일 핸들"오류가 발생할 수도 있습니다. B. touch호스트 A 에서 명령 을 사용하면 정상으로 만들 수 있습니다.
rustyhu

답변:


83

디렉토리가 삭제되면 해당 디렉토리의 inode (및 해당 내용의 inode)가 재활용됩니다. 쉘이 해당 디렉토리의 inode (및 그 내용의 inode)에 대한 포인터는 이제 더 이상 유효하지 않습니다. 디렉토리가 백업에서 복원 될 때 이전 inode는 (필수적으로) 재사용 되지 않습니다 . 디렉토리와 그 내용은 임의의 inode에 저장됩니다. 동일하게 유지되는 유일한 것은 부모 디렉토리가 복원 된 디렉토리에 대해 동일한 이름을 재사용 한다는 것입니다 (사용자가 지시 했으므로).

이제 원래 쉘이 여전히 가리키는 디렉토리의 내용에 액세스하려고 시도하면 해당 요청을 원래 inode에 대한 요청으로 파일 시스템에 전달합니다.이 요청은 이후 재활용되었습니다 (어떤 용도로 사용될 수도 있습니다. 지금은 완전히 다릅니다). 따라서 stale file handle존재하지 않는 데이터를 요청했기 때문에 메시지 가 표시됩니다.

작업을 수행 할 때 cd쉘은 사용자가 지정한 대상의 inode 위치를 재평가합니다. 이제 쉘이 디렉토리에 대한 새 inode (및 해당 내용에 대한 새 inode)를 알고 있으므로 해당 내용에 대한 향후 요청이 유효합니다.


아, 이것은 잘못된 / 널 inode 포인터를 처리하는 시스템의 방법 일 뿐입니 까?
IDDQD 2013

예. 예를 들어 이미 재활용 된 inode를 참조하여 다른 것을 가리 키려고한다면 어떻게 될지 알 수있을만큼 세부 사항에 대해 충분히 알지 못합니다. 여전히 오래된 파일 핸들을 얻을 수 있습니까? 아니면 예상치 못한 데이터를 얻습니까?
dg99 2013

1
누군가가 I- 노드를 현재 디렉토리로 사용하여 실제로 사용하고 있기 때문에 시스템이이를 재사용 할 것이라고 생각하지 않습니다.
사무엘 Åslund
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.