소프트웨어 패키지가 업그레이드되는 동안에도 제대로 실행되는 이유는 무엇입니까?

소프트웨어 패키지가 업그레이드되는 동안에도 제대로 실행되는 이유는 무엇입니까?

소프트웨어를 실행 중이고 소프트웨어를 업그레이드하기 위해 패키지 관리자를 실행한다고 가정해 보겠습니다. Linux가 패키지 업그레이드를 위해 실행 중인 프로세스를 중단하지 않고 여전히 정상적으로 실행되고 있음을 확인했습니다. Linux는 이를 어떻게 수행합니까?

답변1

그 이유는 Unix가 실행되는 동안 실행 파일을 잠그지 않거나 Linux와 유사하더라도 이 잠금은 파일 이름이 아닌 inode에 적용되기 때문입니다. 이는 파일이 삭제되고(실제로 연결 해제됨) 동일한 이름을 가진 새 파일로 교체된 후에도 파일을 열어 둔 프로세스가 동일한(이전) 데이터에 액세스하고 있음을 의미합니다. 이는 본질적으로 패키지 업데이트가 수행하는 작업입니다.

이것이 Unix와 Windows의 주요 차이점 중 하나입니다. 후자는 파일 이름과 inode 사이에 레이어가 없기 때문에 잠긴 파일을 업데이트할 수 없습니다. 일반적으로 전체 재부팅이 필요하기 때문에 일부 패키지를 업데이트하거나 설치하는 데 큰 번거로움이 따릅니다.

답변2

실행 파일은 일반적으로 한 번 열리고 파일 설명자에 첨부되며 단일 실행 기간 동안 다시 열리는 바이너리에 대한 파일 설명자가 없습니다. 예를 들어, 를 실행하면 bash일반적 으로 호출 시 한 번만 exec()가리키는 inode에 대한 파일 설명자를 생성합니다 ./bin/bash

이는 종종 실행 중에 자신을 다시 읽으려고 시도하지 않는 간단한 바이너리의 경우(호출된 경로를 사용하여) 캐시된 콘텐츠가 매달린 inode로 유효한 상태로 유지된다는 것을 의미합니다. 이는 본질적으로 이전 버전의 실행 파일의 복제본이 있음을 의미합니다.

더 복잡한 경우에는 문제가 발생할 수 있습니다. 예를 들어 구성 파일을 업그레이드한 후 다시 읽을 수도 있고, 프로그램이 실행되었던 경로를 통해 프로그램 자체를 다시 실행할 수도 있습니다. 프로그램이 상호 연결되어 있고 업그레이드 전에 하나가 실행되고 업그레이드 후에 하나가 실행되는 경우에도 문제가 있을 수 있습니다(아마도 첫 번째 프로그램에 의해). 이는 일부 도서관에서도 마찬가지입니다.

그러나 간단한 사용 사례의 경우 프로세스를 다시 시작하지 않고 업그레이드하는 것이 안전합니다.

관련 정보