ls "dir"이 총 0을 제공할 때 [ -d "dir/proc" ]가 true인 이유는 무엇입니까(chroot /proc와 관련이 있을 수 있음)?

ls "dir"이 총 0을 제공할 때 [ -d "dir/proc" ]가 true인 이유는 무엇입니까(chroot /proc와 관련이 있을 수 있음)?

나는 liveUSB iso 파일을 만들고 많은 설치와 chroot script스크립팅을 수행하고 있습니다 mount -t proc proc /proc( chroot나에게는 처음으로 "정리"를 수행했을 때 이 문제를 발견했고 chroot로 실행한 스크립트가 더 이상 실행되지 않았습니다). 이제 내 상황은 매우 이상합니다. 시스템이 어떻게 이렇게 작동할 수 있습니까?

$ if [ -d "newdir/proc" ]; then echo 1;fi
1
$ if [ -d "newdir/pro" ]; then echo 1;fi
$ sudo ls -al "newdir"
total 0

umount newdir문제는 "대상이 사용 중입니다"라는 출력 에도 나타납니다 . findmnt | grep proc"newdir/proc" 줄은 더 이상 표시되지 않습니다.

1을 추가하세요:

$ sudo ls -al "newdir/media/root/usb" # another mount
total 0
$ sudo ls -al "newdir/media/root"
total 0
$ sudo ls -al "newdir/media"
total 0

차이가 있다면 시스템 newdir에 있습니다 .tmpfs

추가 2:
@Bart의 답변에서 제안한 대로 실행하여 IIRC 스크립트의 결과를 볼 수 있는 lsof다른 터미널이 있다는 것을 깨달았습니다 . chroot newdir이제 chroot를 종료했으므로 lsof | grep nwdirbash 명령 목록은 더 이상 출력되지 않고 fuse.gvfsd-fuse및 에 대한 경고 만 출력됩니다 fuse /run/user/1000/doc. 다음 경우에는 여전히 동일합니다.

$ sudo ls -al "newdir/media/root"
total 0

그러나 그 후에는 출력에서 ​​오류 없이 작업을 수행할 수 있었고 umount newdirsudo ls -al "newdir/media/root"결과 no such file.

폴리스티렌예상치 못한 동작의 원인은 여기 도움말을 통해 확인되었습니다. chroot를 사용하여 터미널을 닫지 않음. 그러나 열린 프로세스의 핸들을 사용하여 파일에 액세스하는 방법을 읽었지만 여기서는 "고스팅"이 일반적인 실행 방법임을 증명합니다.ls나는 이것이 왜/어떻게 작동하는지에 대한 설명을 볼 수 있었으면 좋겠다.

답변1

실제로 는 procfs파일 시스템이 아니라 메모리 내용과 현재 실행 중인 프로세스를 표현한 것입니다. 당신이 보고 있는 것은 일부 프로세스가 chroot Mounted에 파일을 생성했지만 proc종료되지 않았으며 여전히 해당 디렉토리에서 파일 참조를 사용하고 있음을 나타냅니다.

lsof | grep /newdir/proc존재하지 않는 위치를 아직 사용하고 있는 프로세스가 표시되어야 합니다.

당신이 원하는 것은 아마도 chroot 내부 어딘가에 바인드 마운트하는 것입니다.

mkdir -m 0555 newdir/proc
mount --bind /proc newdir/proc

설마 mount -t.

관련 정보