방금 ubuntu lucid를 natty로 업그레이드했으며 업그레이드 중에 실행중인 대부분의 응용 프로그램을 최신 버전으로 대체했습니다.
이것은 어떻게 작동합니까? (응용 프로그램이 충돌하지 않습니까?) lib 파일이 업그레이드되고 이전 lib를 찾고있는 실행중인 응용 프로그램에서로드하려고하면 응용 프로그램은 어떻게됩니까?
방금 ubuntu lucid를 natty로 업그레이드했으며 업그레이드 중에 실행중인 대부분의 응용 프로그램을 최신 버전으로 대체했습니다.
이것은 어떻게 작동합니까? (응용 프로그램이 충돌하지 않습니까?) lib 파일이 업그레이드되고 이전 lib를 찾고있는 실행중인 응용 프로그램에서로드하려고하면 응용 프로그램은 어떻게됩니까?
답변:
Linux (및 기타 UNIX)는 파일 이름 ( link ), 파일 자체 ( inode로 식별 됨) 및 파일에 대한 열린 핸들을 구분합니다. 파일을 삭제하려고하면 호출을 호출합니다. unlink()
이렇게 하면 파일에 대한 링크 가 지워집니다 ( rename()
다른 inode로 파일 을 덮어 쓸 수도 있음). 그러나 파일에 대한 열린 핸들 (또는 다른 링크-파일에 여러 개의 하드 링크가 있을 수 있음 )이 남아 있으면 inode 는 그대로 유지되며 모든 링크와 핸들이 사라질 때까지 파일 내용도 유지됩니다.
따라서 라이브러리를 사용하거나 이전 버전에 대한 핸들을 유지하는 메모리를 사용하여 프로그램을 실행하면 (메모리 암시를 통해 암시 적으로) 디스크에 남아 있습니다. 더 이상 파일 이름이 없으며 파일 시스템 검사 또는 저널 재생 중에 파일을 사용하는 모든 프로그램이 종료되거나 다음에 다시 부팅 할 때 정리됩니다.
또한 '오래된 라이브러리'를 기대하는 프로그램은 최신 버전의 라이브러리에서 잘 작동합니다. Linux 라이브러리에는 라이브러리에서 제공하는 ABI (Application Binary Interface) 버전을 반영하는 파일 이름 ( 'soname')이 지정됩니다. 예를 들어, 내 시스템의 C 라이브러리는 libc.so.6
입니다. 이전 버전의 libc에 대해 컴파일되었지만 여전히 버전 6 ABI를 구현하는 버전의 libc는 잘 작동합니다. 실제로 오래된 프로그램은 하나 libc.so.5
이상 을 찾습니다 libc.so.4
. 이 경우 이전 버전도 그대로 유지해야하지만 파일 이름이 다르기 때문에 문제가되지 않습니다.
Windows와 달리 열린 파일을 삭제하거나 바꿀 수 있습니다 . 제공하기 위해 단순화 된 설명을, 파일에 대한 새 요청은 기존 핸들은 생성 될 때 존재하는 파일을 사용하여 새 파일을 엽니 다. 다시 말해, Linux에서는 디렉토리 구조에 더 이상 포인터가 없지만 파일 / 파일 버전이 여전히 존재할 수 있습니다. 그것들이 존재하지 않는다면 그들에 대한 포인터가 전혀 없습니다.
일반적으로 실행중인 앱은 필요한 라이브러리를 미리로드하므로 패키지를 설치하는 동안 매우 구체적인 타이밍 상황에서만 설명하는 문제가 발생합니다. 실행중인 앱은 여전히 이전 버전의 라이브러리를 사용하고 새로 시작한 앱은 새로운 버전을 사용합니다 하나.
이것은 배포판 업그레이드뿐만 아니라 모든 패키지 업그레이드에서 발생합니다 (dist-upgrade는 단지 그 프로세스에 몇 가지 자동 단계를 추가합니다).