업그레이드 후에도 소프트웨어 패키지가 여전히 정상적으로 실행되는 이유는 무엇입니까?

업그레이드 후에도 소프트웨어 패키지가 여전히 정상적으로 실행되는 이유는 무엇입니까?

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

답변1

그 이유는 유닉스는 실행 중에 실행 파일을 잠그지 않거나, 리눅스를 좋아하더라도 파일명이 아닌 아이노드에 잠금이 적용되기 때문이다. 즉, 파일이 삭제되고(실제로 연결되지 않음) 동일한 이름의 새 파일로 교체된 경우에도 열려 있는 프로세스는 동일한(이전) 데이터에 액세스할 수 있으며 이는 기본적으로 패키지 업데이트가 수행하는 작업입니다.

이것이 Unix와 Windows의 주요 차이점 중 하나입니다. 후자는 파일 이름과 inode 사이에 레이어가 없기 때문에 잠긴 파일을 업데이트할 수 없습니다. 이로 인해 전체 재부팅이 필요한 경우가 많기 때문에 특정 패키지를 업데이트하거나 설치하는 것이 번거롭습니다.

답변2

실행 파일은 일반적으로 한 번 열리고 파일 설명자에 첨부되며, 단일 실행 중에 다시 열리는 바이너리 파일에는 파일 설명자가 없습니다. 예를 들어, 그렇게 하면 파일 설명자는 일반적으로 bash호출될 때 한 번 exec()가리키는 inode에 대해서만 생성됩니다 ./bin/bash

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

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

그러나 간단한 사용 사례의 경우 프로세스를 다시 시작하지 않고도 안전하게 업그레이드할 수 있습니다.

관련 정보