Linux는 실행 중에 어떻게 포맷되나요? [복사]

Linux는 실행 중에 어떻게 포맷되나요? [복사]

당신이 달릴 때

sudo rm -rf --no-preserve-root /

시스템은 각 파일을 하나씩 삭제합니다. 그러나 여기에는 실행 중인 프로세스와 운영 체제 자체도 포함되며 결국 삭제됩니다 rm.

프로그램 파일이 삭제되고 운영 체제에서 중요한 파일이 손실되면 Linux는 어떻게 계속 실행됩니까?

rm그리고 삭제한 후 계속 실행하려면 어떻게 해야 하나요?

답변1

이름에도 불구하고 rm파일은 삭제되지 않습니다. 실제로는풀리다-- 파일을 참조하는 디렉토리 항목을 삭제합니다. 파일에 여전히 하드 링크가 있으면 데이터는 그대로 유지됩니다.

프로그램이 실행될 때 커널은하드 링크내부적으로(둘 다 동일한 객체로 처리됨 inode) 마지막 프로세스가 링크되지 않은 파일을 닫을 때까지 데이터가 유지됩니다.

unlink 시스템 호출이 어떻게 설명되는지 참고하세요.

해당 이름이 파일에 대한 마지막 링크이고 해당 파일이 열려 있는 프로세스가 없으면 파일이 삭제되고 해당 파일이 사용하는 공간을 다시 사용할 수 있게 됩니다.

해당 이름이 파일에 대한 마지막 링크이지만 프로세스에 여전히 파일이 열려 있는 경우 해당 파일을 참조하는 마지막 파일 설명자가 닫힐 때까지 파일은 그대로 유지됩니다.

예를 들어:

# cp /bin/sleep ./sleep
# ln ./sleep ./sleep2
# ./sleep 1000 &
[1] 24399
# rm ./sleep

이 시점에서 데이터는 여전히 하드 링크를 통해 액세스할 수 있으며 커널은 여전히 ​​inode가 다음과 같다는 것을 알고 있습니다 (task_struct)->mm->exe_file.

# ls -lh ./sleep2
-rwxr-xr-x 1 myaut users 31K Jun 17 23:10 ./sleep2
# > ls -l /proc/24399/exe 
lrwxrwxrwx 1 myaut users 0 Jun 17 23:11 /proc/24399/exe -> /tmp/test/sleep (deleted)

두 번째 하드 링크가 삭제되더라도 데이터는 그대로 유지됩니다(그런데 플러그를 뽑고 이 시점에서 시스템 전원이 꺼지면 FS 공간 누수가 발생합니다).

# rm ./sleep2
# ls -l /proc/24399/exe
/proc/24399/exe -> /tmp/test/sleep (deleted)

이제 프로세스를 종료하면 디스크(또는 tmpfs) 공간이 해제됩니다.

# kill 24399

답변2

오늘날 거의 모든 프로그램은 메모리(RAM)에서 실행되므로 로드 후 디스크에 액세스할 필요가 없습니다. 따라서 디스크의 이미지를 문제 없이 삭제할 수 있습니다.

답변3

파일을 삭제 해도 rm파일은 즉시 삭제되지 않습니다. rm내부적으로 unlink()파일 삭제 작업을 수행하고 매뉴얼 페이지를 인용하기 위해 시스템 호출이 호출됩니다 unlink()( man 2 unlink전체 내용 참조).

   unlink()  deletes  a  name  from the filesystem. If that name was the
   last link to a file and no processes have the file open the  file  is
   deleted and the space it was using is made available for reuse.

   If  the name was the last link to a file but any processes still have
   the file open the file will remain in existence until the  last  file
   descriptor referring to it is closed.

이것이 답입니다. 프로그램에 처리 중인 파일에 대한 핸들이 있는 경우 rm해당 파일은 이름 없는 blob으로 파일 시스템에 계속 존재합니다. 더 이상 경로가 없지만 여전히 존재하며 여전히 공간을 차지합니다. 프로그램은 계속해서 읽고 쓸 수 있습니다. 파일은 파일에 대한 모든 핸들이 사라진 경우에만 파일 시스템에서 실제로 제거됩니다(프로그램이 파일 핸들을 닫거나 프로그램 자체가 종료되기 때문에).

관련 정보