프로세스에서 아직 사용 중인 파일이나 디렉터리를 이동하거나 삭제해도 Linux는 신경 쓰지 않는 것 같습니다. 그러면 프로세스가 작업 디렉터리로 사용하고 있는 장치를 마운트 해제하려고 하면 왜 불평이 발생합니까?
예:
$ mkdir -p a b
$ sudo mount --bind a b
$ sh -c 'cd b; sleep 10' &
[1] 215679
$ sudo umount b
umount: /home/laktak/b: target is busy.
$
[1]+ Done sh -c 'cd b; sleep 10'
$ sudo umount b
$
관련 항목:
$ mkdir c
$ sh -c 'cd c; sleep 10; pwd; cd ..' &
[1] 220382
$ rmdir c
$
$ pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
$
[1]+ Done sh -c 'cd c; sleep 10; pwd; cd ..'
답변1
여기에는 분명한 차이점이 있습니다. ext2/3/4 파일 시스템에서 파일 이름으로 파일을 "삭제"한다는 것은 파일 데이터가 첨부된 데이터 구조인 inode에 대한 참조가 삭제된다는 것을 의미합니다(삭제한 파일 이름). in은 ls
단지 inode에 대한 참조일 뿐입니다.) 파일은 마지막 참조가 사라진 경우에만 "삭제"된 것으로 간주됩니다. 관심이 있는 경우 "하드 링크" 개념을 살펴볼 수 있습니다. 그러나 파일을 열면 해당 작업은 inode에 대한 참조도 생성하므로 파일이 열려 있는 한 실제로 "삭제"되지 않으며 파일을 연 프로세스는 계속해서 파일을 사용할 수 있습니다.
오픈 디렉토리의 경우에도 마찬가지입니다. 해당 디렉터리에 있는 한 cd
다른 셸 인스턴스에서 해당 디렉터리를 삭제하더라도 해당 디렉터리는 계속 존재합니다. 그러나 "다운그레이드" 상태가 되어 더 이상 다른 프로세스에서 액세스할 수 없으며, 아직 존재하는 셸 인스턴스에서도 해당 디렉터리에 새 파일을 생성할 수 없습니다. (덧붙여서 두 번째 예에서 보여준 동작을 재현할 수 없습니다. bash
4.3에서 동일한 코드를 실행 하면 pwd
디렉터리 이름이 기본 셸 인스턴스에서 제거되더라도 올바르게 인쇄됩니다.)
반면에 장치 마운트 해제는 포함된 파일에 대한 모든 연결을 끊고 모든 변경 사항을 플러시하는 역할을 하므로 누군가 아직 "밖에" 있는 동안 운영 체제는 이를 거부합니다.