업그레이드 중에 실행중인 응용 프로그램 바이너리를 업데이트하는 방법은 무엇입니까?


23

방금 ubuntu lucid를 natty로 업그레이드했으며 업그레이드 중에 실행중인 대부분의 응용 프로그램을 최신 버전으로 대체했습니다.

이것은 어떻게 작동합니까? (응용 프로그램이 충돌하지 않습니까?) lib 파일이 업그레이드되고 이전 lib를 찾고있는 실행중인 응용 프로그램에서로드하려고하면 응용 프로그램은 어떻게됩니까?


좋은 질문이지만 여기에 더 나은 질문이있을 것입니다 : unix.stackexchange.com (URL에 Unix가 있지만 Linux 질문도 있습니다!)

리눅스의 개방형 대체 기능을 이해하는 것은 여전히 ​​프로그래밍중인 것처럼 보인다 (그러나 겨우 :)
bdonlan

2
@ bdonlan : 프로세스 수명 동안 라이브러리를 동적으로로드하는 경우 이것을 많이 알고 있어야합니다. 그렇지 않으면 물릴 수 있습니다. 자체 수정 코드 등과 같이 비정상적인 작업을 수행하려는 경우에 특히 중요합니다. 그러나 경계선입니다.
Piskvor

1
실제로 자체 수정 코드와 관련이 없지만 Linux 용 라이브러리를 작성하는 사람이 알아야 할 것입니다. :)
bdonlan

1
@Piskvor는 gcc에 대한 다단계 컴파일 프로세스와 비슷하게 들립니다.) 그러나 기본적으로 컴파일러 만 그런 식으로 작동하지만 일반적으로 수행하는 동안 시스템을 업그레이드하지는 않습니다 (그렇더라도 수행하지 않는 한 ' 처리 중에는 아무 것도 다운 그레이드하지
마십시오.

답변:


31

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. 이 경우 이전 버전도 그대로 유지해야하지만 파일 이름이 다르기 때문에 문제가되지 않습니다.


9

Windows와 달리 열린 파일을 삭제하거나 바꿀 수 있습니다 . 제공하기 위해 단순화 된 설명을, 파일에 대한 새 요청은 기존 핸들은 생성 될 때 존재하는 파일을 사용하여 새 파일을 엽니 다. 다시 말해, Linux에서는 디렉토리 구조에 더 이상 포인터가 없지만 파일 / 파일 버전이 여전히 존재할 수 있습니다. 그것들이 존재하지 않는다면 그들에 대한 포인터가 전혀 없습니다.

일반적으로 실행중인 앱은 필요한 라이브러리를 미리로드하므로 패키지를 설치하는 동안 매우 구체적인 타이밍 상황에서만 설명하는 문제가 발생합니다. 실행중인 앱은 여전히 ​​이전 버전의 라이브러리를 사용하고 새로 시작한 앱은 새로운 버전을 사용합니다 하나.

이것은 배포판 업그레이드뿐만 아니라 모든 패키지 업그레이드에서 발생합니다 (dist-upgrade는 단지 그 프로세스에 몇 가지 자동 단계를 추가합니다).


0

많은 Linux 프로세스는 패키지가 업그레이드 된 후에도 계속 작동하지만 일부는 그렇지 않습니다. 내 경험상 KDE가 실행 중일 때 업그레이드하면 제대로 작동하지 않습니다. 충돌 및 / 또는 로그 아웃 실패가 발생할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.