8.2. 패키지 관리

패키지 관리는 LFS Book에 자주 요청되는 추가 기능입니다. 패키지 관리자는 파일 설치를 추적하여 패키지를 쉽게 제거하고 업그레이드할 수 있게 해줍니다. 또한 좋은 패키지 관리자는 패키지를 재설치하거나 업그레이드할 때 사용자 구성을 유지하기 위해 구성 파일을 특별히 처리합니다. 이 섹션에서는 특정 패키지 관리자에 대해 이야기하거나 추천하지 않습니다. 다만 가장 많이 사용되는 기술과 그 작동 방식에 대해 소개할 뿐입니다. 여러분에게 가장 적합한 패키지 관리자는 이러한 기법 중 하나이거나 두 가지 이상의 기법을 조합한 것일 수도 있습니다. 이 섹션에서는 패키지를 업그레이드할 때 발생할 수 있는 문제에 대해 간략하게 언급합니다.

LFS 또는 BLFS에 패키지 관리자가 언급되지 않은 몇 가지 이유는 다음과 같습니다:

패키지 관리를 다루면 이 책의 목표인 Linux 시스템 구축 방법을 가르치는 데 초점을 맞추기 힘들게 됩니다.

패키지 관리를 위한 여러 솔루션이 있으며, 각 솔루션에는 장단점이 있습니다. 모든 대상을 만족시키는 하나의 솔루션을 찾는 것은 어렵습니다.

패키지 관리 주제에 대한 몇 가지 힌트가 있습니다. 힌트 프로젝트를 방문하여 어떤 솔루션이 여러분의 필요에 맞는지 확인하세요.

8.2.1. 업그레이드 문제

패키지 관리자를 사용하면 최신 버전이 출시될 때 쉽게 업그레이드할 수 있습니다. 일반적으로 LFS 및 BLFS 책에 있는 지침을 사용하여 최신 버전으로 업그레이드할 수 있습니다. 다음은 특히 실행 중인 시스템에서 패키지를 업그레이드할 때 주의해야 할 몇 가지 사항입니다.

Linux 커널을 업그레이드해야 하는 경우(예: 5.10.17에서 5.10.18 또는 5.11.1로) 다른 것은 다시 빌드할 필요가 없습니다. 커널과 사용자 공간 사이에 잘 정의된 인터페이스 덕분에 시스템이 계속 정상적으로 작동합니다. 특히 Linux API 헤더는 커널과 함께 업그레이드할 필요가 없습니다. 업그레이드된 커널을 사용하려면 시스템을 재부팅하기만 하면 됩니다.

Glibc를 최신 버전으로 업그레이드해야 하는 경우(예: Glibc-2.36에서 Glibc-2.39로 업그레이드) 시스템 중단을 방지하기 위해 몇 가지 추가 단계가 필요합니다. 자세한 내용은 섹션 8.5, “Glibc-2.39”를 참조하세요.

공유 라이브러리가 포함된 패키지가 업데이트되고 라이브러리 이름이 변경되면 라이브러리에 동적으로 링크된 모든 패키지를 다시 컴파일하여 최신 라이브러리에 링크해야 합니다. (패키지 버전과 라이브러리 이름 사이에는 상관 관계가 없습니다.) 예를 들어 이름이 libfoo.so.1인 공유 라이브러리를 설치하는 foo-1.2.3 패키지를 생각해 봅시다. 이 패키지를 libfoo.so.2라는 이름의 공유 라이브러리를 설치하는 최신 버전 foo-1.2.4로 업그레이드한다고 가정합니다. 이 경우, 새 라이브러리 버전을 사용하려면 libfoo.so.1에 동적으로 링크된 모든 패키지를 다시 컴파일하여 libfoo.so.2에 링크해야 합니다. 모든 종속 패키지가 다시 컴파일될 때까지 이전 라이브러리를 제거해서는 안 됩니다.

패키지가 공유 라이브러리의 이전 이름과 새 이름 모두에 (직간접적으로) 링크되어 있는 경우(예: 패키지가 libfoo.so.2와 libbar.so.1 모두에 링크되어 있고 후자는 libfoo.so.3에 링크되어 있는 경우) 공유 라이브러리의 다른 개정판이 일부 기호 이름에 호환되지 않는 정의를 제시하므로 패키지가 오작동할 수 있습니다. 이 문제는 공유 라이브러리를 제공하는 패키지가 업그레이드된 후 이전 공유 라이브러리에 연결된 패키지의 일부(전부는 아님)를 다시 컴파일할 때 발생할 수 있습니다. 이 문제를 방지하려면 사용자는 공유 라이브러리에 연결된 모든 패키지를 가능한 한 빨리 업데이트된 버전(예: libfoo.so.2에서 libfoo.so.3으로)으로 다시 빌드해야 합니다.

공유 라이브러리가 포함된 패키지가 업데이트되었는데 라이브러리 이름은 변경되지 않고 라이브러리 파일의 버전 번호가 감소하는 경우(예: 라이브러리 이름은 여전히 libfoo.so.1이지만 라이브러리 파일 이름은 libfoo.so.1.25에서 libfoo.so.1.24로 변경됨) 이전에 설치된 버전(이 경우 libfoo.so.1.25)에서 라이브러리 파일을 제거해야 합니다. 그렇지 않으면 명령줄에서 직접 호출하거나 일부 패키지를 설치하여 호출한 ldconfig 명령이 심볼릭 링크 libfoo.so.1이 이전 라이브러리 파일을 가리키도록 재설정되므로 버전 번호가 더 큰 “최신” 버전인 것처럼 보입니다. 패키지를 다운그레이드해야 하거나 작성자가 라이브러리 파일의 버전 관리 체계를 변경하는 경우 이러한 상황이 발생할 수 있습니다.