질문

질문

질문

일부 마운트된 파일 시스템에서 실행한 후 umount -l일부 프로세스가 해당 파일 시스템의 일부 파일에 대한 열린 파일 핸들을 (적어도) 유지하기 때문에 파일 시스템이 숨겨진 상태로 마운트된 상태로 유지된다는 것이 얼마나 신뢰할 수 있습니까? 이러한 프로세스 목록을 얻는 방법은 무엇입니까?

테스트 설정

나는 그러한 상황을 만들기 위해 다음 단계를 수행하고 시스템을 탐색하고 다양한 명령을 시도했습니다(Linux 3.16 커널이 있는 debian jessie에서 bach 사용).

sudo -i
cd $(mktemp -d) # get empty directory to play around with
# create empty file system with one file
dd if=/dev/zero of=disk bs=1M count=4
mkfs.ext4 disk
# mount the filesytem and create a file
mkdir mounted
mount disk mounted # uses /dev/loop0 in my case, actual device my vary
touch mounted/file
# fork of a process with an open file handle to file
bash -c 'cd mounted; exec 3<>file; while true; do sleep inf; done' &
# verify that the file is open in the background
lsof mounted/file
# lazy unmount
umount -l mounted
# even remove the mountpoint 
rmdir mounted

그렇다면 숨겨진 설치의 /dev/loop0에서 특정 파일을 여는 모든 프로세스를 표시할 수 있는 명령은 무엇입니까?

실패한 시도

라소프

lsof -p <thepid>

첫째, 이를 위해서는 프로세스 ID(여기에서 검색하는 것)에 대한 사전 지식이 필요하며, 둘째, 열린 파일이 열려 있는 것처럼 보이더라도 /file파일이 숨겨진 마운트된 파일 시스템에 있다는 표시는 없습니다. 일반적인 루트 파일 시스템.

퓨저

퓨저에서 유용한 출력을 얻을 수 없습니다. 매뉴얼 페이지의 내용이 혼란스러운 것 같습니다.

/sys/fs/를 확인하세요.

이 특정 테스트 설정에서는 파일 시스템( ext4)과 장치( loop0)가 알려져 있습니다. 여기에서 파일 시스템이 숨겨진 마운트 상태에서 마운트 해제 상태로 변경되었는지 확인할 수 있습니다.

if [ -e /sys/fs/ext4/loop0/ ]; then
    echo "still not unmounted";
else
    echo "finally unmounted";
fi

그러나 이는 열린 파일 핸들이 있는 프로세스 목록을 제공하지 않습니다.

수동으로 /proc 확인

proc에서 일부 정보를 찾았습니다.

mnt_id가 시스템 전체에서 고유하다고 가정합니다.(이 가정이 맞는지는 모르겠습니다!) 모두 나열하는 것이 가능합니다.숨겨지지 않은 mnt_ids모든 프로세스에서:

find /proc/ -maxdepth 1 -type d -regex '/proc/[0-9]+' -exec "cat" "{}/mountinfo" ";" | cut -d " " -f 1 | sort -gu

그런 다음 실제 상황을 모두 나열하십시오.열려 있는 모든 fd는 mnt_ids를 사용합니다.:

find /proc/ -regex '/proc/[0-9]+/fdinfo/[0-9]+' -exec cat "{}" ";" | grep mnt_id | cut -f 2 | sort -gu
# maybe gives some errors like 'Operation not permitted' or 'No such file or directory' because of inspecting it's own process and sub-process and possibly parallel things happening. probably this is an unreliable way of inspecting /proc.

만약에두 개의 목록을 비교하기 위해 정교한 방법이 사용되며, 숨겨진 mnt_ids와 이를 사용하는 fd 및 해당 fd의 프로세스 ID를 결정합니다. 그러나 이 결과에도 불구하고 숨겨진 mnt_ids 중 어느 것이 숨겨진 마운트된 관심 파일 시스템에 해당하는지 확인하는 마지막 단계는 아직 누락되었습니다.

답변1

마운트 지점이 숨겨져 있기 때문에 umount -l영향을 받는 파일을 아직 사용하고 있는 프로세스를 알아낼 수 있는 방법이 없습니다.

목록을 얻는 유일한 방법은 관련 경로를 찾기 위해 lsofbefore를 사용하는 것입니다. umount -l예: lsof | grep "/mountPoint/".

원하는 경우 이 출력을 사용하여 PID를 추출하고 계속 모니터링할 수 있습니다.

관련 정보