소프트웨어 패키지를 업그레이드 할 때 왜 제대로 실행됩니까?


29

소프트웨어를 실행 중이고 패키지 관리자를 실행하여 소프트웨어를 업그레이드한다고 가정하면 Linux가 패키지 업그레이드를 위해 실행중인 프로세스를 중단 시키지는 않습니다. 여전히 잘 실행되고 있습니다. 리눅스는 이것을 어떻게합니까?

답변:


35

실행 파일이 실행되는 동안 Unix가 실행 파일을 잠그지 않거나 Linux와 같은 경우에도이 잠금은 파일 이름이 아닌 inode에 적용됩니다. 즉, 파일을 삭제 (실제로 연결 해제) 한 후에도 동일한 이름의 새 데이터로 대체 된 후에도 파일을 열어 둔 프로세스가 동일한 (오래된) 데이터에 액세스하고 있음을 의미합니다.

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


10
명확히하기 위해 Linux 에서는 실행 파일이 실행되는 동안 수정할 수 없습니다 . 그러나 파일을 링크 해제하고 동일한 이름의 새 파일로 바꿀 수 있습니다.
CJM

Linux에서 실행 파일이 실행되는 동안 수정할 수 있습니다. 당신이하고있는 일을 정말로 모른다면 결과는 예측할 수 없을 것입니다. 명시 적으로 언급되지 않은 "같은 이름"지점을 추가했습니다.
jlliagre

4
@jlliagre 내가 오해하지 않는 한, 당신은 내가 아는 한, sprunge.us/egiR
Chris Down

2
NFTS에 대한 한 가지 좋은 점-명령 줄이나 다른 프로그램에서 이름을 바꾸면 동일한 이름의 파일을 다시 배치 할 수 있으며 원본 파일이 열려있는 프로그램에는 영향을 미치지 않습니다. (탐색기의 이름 바꾸기 명령이 작동하지 않습니다)
Steffan Donal

1
@cjm Linux의 "파일 텍스트 사용 중"보호에 대한 내용이 정확합니다. 솔라리스에는 내가 더 잘 알고있는 그런 제한이 없습니다. 그래도 두 OS 모두에서 공유 라이브러리를 수정할 수 있습니다.
jlliagre

18

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

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

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

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


1
간단한 경우에도 다른 위험은 실행중인 응용 프로그램이 캐시 된 이진 복사본을 사용하기 때문에 수동으로 응용 프로그램을 다시 시작할 때까지 여전히 이전 버전의 코드를 실행하고 있다는 것입니다. 대부분의 시간은 중요하지 않습니다. 업그레이드에 보안 픽스가 포함 된 경우 패치가 설치되어 있어도 이전 버전이 여전히 실행 중이므로 시스템이 여전히 취약합니다.
Dan Neely

1
첫 단락이 정확하지 않은 것 같습니다. 유닉스 / 리눅스 커널은 실행 프로그램을 한 번에로드하지 않고 메모리를 매핑합니다. 즉, 실제로 사용 된 페이지 만 RAM에 페이지를 만듭니다. 이것이 리눅스에서 "텍스트 파일 사용 중"보호의 요점입니다. 실행 파일이 시작된 후 오래 읽지 않는다는 보장은 없습니다. 또한 일부 페이지는 충분히 큰 프로그램에로드되지 않으며 동적으로로드 된 라이브러리의 경우에는 더욱 그렇습니다. 예를 들어 bash바이너리는 약 200 개의 4K 페이지이므로 모두 평균 세션에서 사용되는지는 확실하지 않습니다.
jlliagre

@jlliagre 나는 ialloc()페이지 자체의 메모리 매핑이 아니라 읽기시 커널 구조체에 대해 이야기 하고있었습니다. 현대의 ext * 파일 시스템에서 inode가 궁극적으로 커널 내 (및 VM 서브 시스템 내부)에 일관성이 있다고 생각하는 것이 옳지 않습니까?
Chris Down

실행 가능한 컨텐츠의 일부가 실행 된 후 오랫동안 읽히지 않을 것이라는 보장은 없으며, 실행 시간 동안 잠시 후에 동일한 페이지가 다시 읽히지 않을 것이라는 보장도 없습니다.
jlliagre

@jlliagre 맞습니다. 그러나 그것은 제가 의미 한 것이 아닙니다. 아마도 내 대답에서 내 말을 약간 다듬었을 것입니다. 내가 의미하는 것을 명확하게하려고 노력할 것입니다.
Chris Down
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.