Linux에서 사용 중인 소프트웨어 패키지를 업그레이드하는 방법은 무엇입니까?

Linux에서 사용 중인 소프트웨어 패키지를 업그레이드하는 방법은 무엇입니까?

예를 들어 저는 온라인 상태에서 시스템 업그레이드를 할 수 있도록 Arch Linux를 사용하고 있습니다. 프로그램 자체를 사용하고 있는 경우 브라우저 패키지를 어떻게 업그레이드하나요? 아니면 예를 들어 커널? 새 실행 파일로 교체하기 전에 실행 파일을 중지해야 합니까? 아니면 다음에 재부팅할 때 이런 일이 발생합니까?

답변1

디스크의 브라우저 파일이 방금 교체되었습니다. 실행 중인 프로그램(전체가 메모리에 있지 않은 경우)은 프로그램이 닫힐 때까지 이전 실행 파일을 열어 둡니다(그러나 해당 파일이 더 이상 디렉터리 항목을 통해 얻은 실행 파일이 아니기 전까지는 아닙니다). 다음에 브라우저를 다시 시작하면 해당 버전을 받게 됩니다.

재부팅 시 로드되는 프로그램(예: 커널)을 제외하고는 재부팅이 필요하지 않습니다. 커널을 적절하게 패치할 수 있고 재부팅도 필요하지 않은 프로그램이 있지만 동일한 것은 아닙니다.

답변2

예상할 수 있듯이 Unix 계열 시스템은 대부분의 실행 파일을 덮어쓰는 것을 방지합니다. 다음은 표준의 관련 내용입니다.열려 있는시스템 호출:

다음과 같은 경우 open() 함수가 실패할 수 있습니다.

[ETXTBSY] 이 파일은 oflag O_WRONLY 또는 O_RDWR을 사용하여 실행 중인 순수 프로시저(공유 텍스트) 파일입니다.

하지만 실행 중인 파일은 여전히연결 해제됨, 이것이 패키지 관리자의 작동 방식입니다.

Debian 및 Ubuntu에 방금 출시된 새 버전을 설치할 dpkg때 수행하는 작업은 다음과 같습니다./bin/cpio

open("/bin/cpio.dpkg-new", O_WRONLY|O_CREAT|O_EXCL, 0) = 10
// lots of reads and writes omitted from this listing.
// It's copying the new version into dpkg-new
fchown(10, 0, 0)                  = 0 
fchmod(10, 0755)                  = 0 
close(10)                         = 0 
rename("/bin/cpio.dpkg-new", "/bin/cpio") = 0 

자세히 살펴보면 다음과 같습니다.

  • 새 버전을 cpio.dpkg-new와 동일한 디렉터리 에 복사합니다 cpio.
  • 패키지가 지시하는대로 소유자 및 파일 권한을 설정하십시오.
  • cpio.dpkg-new다음으로 이름 바꾸기cpio

파일이 존재하지 않는 위치에 있지 않고(잠시라도) 새 버전의 파일을 안전하게 설치하는 방법은 다음을 사용하는 것입니다.이름을 바꿔라시스템 호출. 이를 위해서는 두 파일이 모두 동일한 파일 시스템에 있어야 하며, 이것이 dpkg가 이전 버전과 동일한 디렉토리에 새 버전의 cpio를 생성하는 이유입니다. 표준은 다음과 같이 말합니다.

int rename(const char *old, const char *new);

rename() 함수는 파일 이름을 변경해야 합니다. 이전 매개변수는 이름을 바꿀 파일의 경로 이름을 가리킵니다. 새 매개변수는 파일의 새 경로 이름을 가리킵니다.

새 매개변수로 명명된 링크가 존재하는 경우 해당 링크를 제거하고 이전 링크의 이름을 새 링크로 바꿔야 합니다. 이 경우 new라는 링크는 이름 바꾸기 작업 전체에서 다른 프로세스에 계속 표시되어야 하며 작업이 시작되기 전에 new 또는 old에서 참조한 파일을 참조해야 합니다.

이 용어는 다소 혼란스러울 수 있습니다.오래된그리고새로운rename여기에 주어진 파일은새 버전 cpio그리고cpio의 이전 버전, 각각.

마지막으로 귀하의 질문에 대한 답변의 핵심은 다음과 같습니다.

새 매개변수로 지정된 링크가 존재하고 파일이 삭제되면 파일의 링크 수가 0이 되고 파일을 여는 프로세스가 없으면 파일이 차지한 공간이 해제되어 더 이상 파일에 접근할 수 없게 됩니다.마지막 링크가 삭제될 때 하나 이상의 프로세스에서 파일이 열려 있으면 rename()이 반환되기 전에 링크를 삭제해야 하지만 파일에 대한 모든 참조가 닫힐 때까지 파일 내용 삭제를 연기해야 ​​합니다.

마지막 문장은 프로세스가 완료될 cpio때 열려 있거나 실행 중인 경우 rename파일이 닫힐 때까지(또는 종료될 때까지) 파일의 이전 내용을 계속 볼 것임을 의미합니다.

Arch는 pacman거의 같은 일을 하는 것 같습니다.

snprintf(checkfile, len, "%s.paccheck", filename);
...
if(perform_extraction(handle, archive, entry, checkfile, entryname_orig)) {
    errors++;
    goto needbackup_cleanup;
}
...
if(try_rename(handle, checkfile, filename)) {
    errors++;
}

패키지 관리자는 새 파일을 안전하게 설치하려고 노력하지만, 사용 중에 프로그램을 업데이트할 때 몇 가지 문제가 발생할 수 있습니다. 예를 들어, Firefox 패키지에는 12개 이상의 실행 파일과 공유 개체가 있습니다. 업데이트 중에 이전 버전의 Firefox를 실행하는 사용자는 업데이트가 완료된 후 호출하는 확장 프로그램이 이전 버전의 Firefox와 호환되지 않는다는 것을 알 수 있습니다. 최근 Ubuntu에서 Firefox를 업데이트하고 apt-get을 인쇄했습니다.

실행 중인 모든 Firefox 인스턴스를 다시 시작하지 않으면 문제가 발생합니다.

다중 사용자 시스템의 시스템 관리자인 경우 보류 중인 업데이트를 사용자 커뮤니티에 알리는 것이 좋습니다.

관련 정보