웹사이트 검색

Debian/Ubuntu에서 패키지 및 커널 업데이트를 차단하는 방법


이 페이지에서

  1. 전제 조건
  2. 방법 1(apt-mark)
  3. 방법 2(/etc/apt/preferences)
    1. 한 버전을 건너뛰고 다른 버전은 허용\n
    2. 저장소 기본 설정 변경

    1. 방법 1(apt-mark)
    2. 방법 2(/etc/apt/apt.conf.d/50unattended-upgrades)
    3. 방법 3(dpkg)
    4. 방법 4(/etc/apt/preferences)

    APT는 아마도 Linux 사용자에게 가장 유용한 도구일 것입니다. 단일 명령으로 Linux 시스템에서 모든 소프트웨어/패키지를 설치, 업그레이드 및 제거할 수 있습니다. 그러나 때로는 설치 또는 업그레이드할 패키지와 자동 업그레이드를 차단할 패키지를 세부적으로 제어해야 합니다. 왜 이것을 하시겠습니까? 때때로 당신은 패키지 업데이트 버전이 버그가 있다는 것을 알게 됩니다. 다음에 sudo apt upgrade를 실행할 때 해당 패키지가 업그레이드되는 것을 원하지 않습니다. 그리고 각 패키지를 개별적으로 업그레이드하는 것은 고통스러운 일입니다.

    이 튜토리얼에서는 특정 패키지가 설치 또는 업그레이드되는 것을 차단하는 방법과 특정 버전의 패키지 또는 커널이 설치되는 것을 차단하는 방법을 다룹니다.

    참고: 버그가 없는 버전이 출시되더라도 일정 시간이 지난 후에 어떤 패키지를 보관했는지 잊어버리기 쉽습니다. 패키지를 오랫동안 보관하면 보안 문제가 발생할 수 있으므로 주의를 기울이십시오.

    여기서는 두 가지 방법에 대해 설명합니다. 첫 번째 방법은 특정 패키지에 대한 모든 설치 및 업그레이드를 차단합니다. 두 번째 방법은 패키지의 특정 버전을 차단할 수 있도록 보다 세분화된 제어를 제공합니다.

    전제 조건

    • Ubuntu 또는 Debian OS가 있는 서버. 이 자습서에는 Ubuntu 22.04가 사용되었지만 여기의 명령은 다른 Debian 기반 운영 체제 및 이전 릴리스에서도 제대로 작동해야 합니다.\n
    • sudo 권한이 있는 루트가 아닌 사용자.\n

    방법 1(apt-mark)

    패키지가 설치, 업데이트 또는 제거되지 않도록 잠그려면 apt-mark 명령을 사용할 수 있습니다.

    패키지(예: htop)를 설치, 업데이트 또는 제거하지 않으려면 다음 명령을 사용하십시오.

    $ sudo apt-mark hold htop
    

    다음 출력이 표시되어야 합니다.

    htop set on hold.
    

    잠긴 패키지는 시스템을 업그레이드하더라도 동일한 버전으로 유지됩니다. 이는 특히 그래픽 드라이버를 억제하는 데 유용합니다.

    패키지에 대한 보류를 제거하려면 다음 명령을 실행하십시오.

    $ sudo apt-mark unhold htop
    

    다음 출력이 표시되어야 합니다.

    Canceled hold on htop.
    

    여기에는 중요한 주의 사항이 있습니다. sudo apt upgrade 명령을 사용하거나 시스템을 업그레이드하는 동안 패키지가 자동으로 업그레이드되지는 않지만 여전히 패키지를 수동으로 제거할 수 있습니다. sudo apt remove 는 보류된 패키지에서 계속 작동합니다.

    이 방법은 자동으로 변경되지 않도록 잠급니다. 보류 상태로 유지하면 수동으로 제거하지 않는 한 현재 버전으로 유지됩니다.

    방법 2(/etc/apt/preferences)

    이 방법에는 저장소가 설치된 패키지의 버전을 정확히 지정할 수 있는 /etc/apt/preferences 파일 편집이 포함됩니다.

    각 패키지는 어떤 APT가 패키지를 설치할지 여부를 결정하고 설치할 경우 어느 리포지토리에서 패키지를 선택해야 하는지에 따라 숫자 우선순위를 갖습니다.

    예를 들어 nginx 패키지에 대한 몇 가지 세부 정보를 확인해 보겠습니다. 다음 명령을 실행하십시오.

    $ apt-cache policy nginx
    

    비슷한 출력이 표시되어야 합니다.

    nginx:
      Installed: (none)
      Candidate: 1.22.1-1~jammy
      Version table:
         1.22.1-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.22.0-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.20.2-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.18.0-6ubuntu14.3 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
         1.18.0-6ubuntu14 500
            500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    

    nginx가 설치되는 두 개의 리포지토리가 있음을 알 수 있습니다. 첫 번째는 Ubuntus 저장소이고 두 번째는 nginxs 저장소입니다.

    모든 리포지토리에 대해 500개가 기록된 것을 볼 수 있습니다. 이 번호는 패키지 우선 순위를 지정합니다. 모든 리포지토리에 대해 동일하므로 두 리포지토리 중 하나에서 nginx가 올 가능성은 동일합니다. 그렇다면 시스템은 어떤 패키지를 선택할지 어떻게 결정할까요? 존재하는 가장 높은 버전을 선택합니다. 이 경우 1.22.1입니다. Ubuntu의 경우 전체 버전 번호는 1.22.1-1~jammy가 됩니다.

    1.22.1 버전으로 업그레이드하지 않고 차단하려면 /etc/apt/preferences 파일을 편집해야 합니다.

    나노 편집기에서 파일을 엽니다.

    $ sudo nano /etc/apt/preferences
    

    이 명령은 이전에 시스템에 파일이 없었던 경우 파일을 만드는 데도 도움이 됩니다.

    파일에 다음 코드를 붙여넣습니다.

    Package: nginx
    Pin: version 1.22.1-1~jammy
    Pin-Priority: -1
    

    우선 순위를 0보다 낮게 설정하면 패키지가 설치되지 않습니다. 패키지를 항상 설치하려면 우선 순위를 1000 이상으로 설정하십시오.

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    패키지를 다시 확인하겠습니다.

    $ apt-cache policy nginx
    

    다음 출력이 표시됩니다.

    nginx:
      Installed: (none)
      Candidate: 1.22.0-1~jammy
      Version table:
         1.22.1-1~jammy -1
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.22.0-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.20.2-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.18.0-6ubuntu14.3 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
         1.18.0-6ubuntu14 500
            500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    

    차이점이 있습니까? 후보 릴리스 버전이 1.22.1에서 1.22.0으로 떨어졌습니다. 이것은 시스템이 지금 설치할 다음 상위 버전이 1.22.0임을 의미합니다. 또한 시스템이 해당 버전을 건너뛰어야 함을 의미하는 최신 버전에 대해 -1이 기록되었음을 알 수 있습니다.

    한 버전을 건너뛰고 다른 버전은 허용

    파일의 동일한 패키지에 대해 여러 항목을 추가할 수 있습니다. 예를 들어 다음 코드를 파일에 추가합니다.

    Package: nginx
    Pin: version 1.22.1-1~jammy
    Pin-Priority: -1
    
    Package: nginx
    Pin: version 1.20.2-1~jammy
    Pin-Priority: 1000
    

    여기서 우리는 1.22.1 버전을 건너뛰고 항상 1.20.2 버전을 설치하도록 시스템에 지시합니다.

    apt-cache policy 명령을 사용하여 다시 확인해보자.

    nginx:
      Installed: (none)
      Candidate: 1.20.2-1~jammy
      Version table:
         1.22.1-1~jammy -1
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.22.0-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.20.2-1~jammy 1000
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.18.0-6ubuntu14.3 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
         1.18.0-6ubuntu14 500
            500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    

    후보 버전은 이제 1.22.0 대신 1.20.2로 변경되었습니다.

    리포지토리 기본 설정 변경

    한 가지 경우를 더 생각해 보겠습니다. Nginx가 해당 리포지토리에서 설치되지 않도록 차단하고 대신 Ubuntu 리포지토리를 선택하려면 어떻게 해야 합니까? 한 가지 방법은 Nginx 리포지토리를 제거하는 것이지만 기본 설정 파일을 다시 사용하여 리포지토리를 선택할 수 있습니다.

    파일에 다음 코드를 입력합니다.

    Package: nginx
    Pin: release o=nginx
    Pin-Priority: -1
    

    릴리스 키워드는 다음 상위 버전을 지정합니다. o=nginx는 패키지의 원본을 나타냅니다. 여기는 nginx입니다. 이것은 시스템이 해당 리포지토리에서 nginx 패키지를 설치하지 않아야 함을 의미합니다. 동일한 결과를 얻는 또 다른 방법은 다음 코드를 사용하는 것입니다.

    Package: nginx
    Pin: release o=jammy
    Pin-Priority: 1000
    

    이번에는 Ubuntu(jammy) 저장소 패키지의 우선순위를 1000으로 설정했습니다. 이렇게 하면 Nginx가 다른 곳이 아닌 Ubuntu 저장소에서 항상 설치됩니다.

    패키지의 원본을 지정할 수 있을 뿐만 아니라 Pin 섹션 아래에 다음 키워드를 사용하여 시스템이 선택해야 하는 패키지의 아카이브, 구성 요소, 레이블 및 아키텍처를 추가할 수도 있습니다.

    • c -> 구성 요소
    • a -> 아카이브
    • o -> 원산지
    • l -> 라벨
    • n -> 아키텍처

    특정 커널 업데이트 차단

    특정 커널 업그레이드를 차단하는 방법을 살펴보겠습니다. 시스템의 모든 커널 관련 패키지를 나열합니다.

    $ dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'
    

    비슷한 출력이 표시됩니다.

    linux-headers-5.15.0-33-generic
    linux-image-5.15.0-33-generic
    linux-modules-5.15.0-33-generic
    linux-modules-extra-5.15.0-33-generic
    

    여기에서 얻은 모든 패키지에 대해 다음 방법을 반복해야 합니다.

    방법 1(apt-mark)

    먼저 활성화된 커널 버전을 확인합니다. 그렇게 하려면 다음 명령을 실행하십시오.

    $ uname -r
    

    비슷한 출력이 표시되어야 합니다.

    5.15.0-53-generic
    

    커널이 더 이상 업그레이드되지 않도록 하려면 apt-mark 명령을 사용하면 됩니다.

    $ sudo apt-mark hold linux-image-$(uname -r)
    

    비슷한 출력이 표시되어야 합니다.

    linux-image-5.15.0-53-generic set on hold.
    

    linux-headers-&#36 (uname -r) 패키지를 차단하여 커널 헤더를 차단하는 동일한 방법을 따를 수 있습니다.

    방법 2(/etc/apt/apt.conf.d/50unattended-upgrades)

    두 번째 방법은 /etc/apt/apt.conf.d/50unattended-upgrades 파일과 관련됩니다.

    편집을 위해 엽니다.

    $ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
    

    Unattended-Upgrade::Package-Blacklist 섹션까지 아래로 스크롤하고 다음과 같이 편집합니다.

    Unattended-Upgrade::Package-Blacklist {
    "linux-generic";
    "linux-image-generic";
    "linux-headers-generic";
    "linux-modules-generic";
    "linux-modules-extra-generic";
    };
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    방법 3(dpkg)

    dpkg를 사용하여 커널 업그레이드를 보류하려면 다음 명령을 실행하십시오. 이 명령은 모든 커널 관련 패키지를 동시에 보유합니다.

    $ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i hold | dpkg --set-selections; done
    

    보류를 해제하려면 다음 명령을 사용하십시오.

    $ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i install | dpkg --set-selections; done
    

    방법 4(/etc/apt/preferences)

    먼저 커널의 현재 버전에 대한 세부 정보를 확인하겠습니다.

    $ apt-cache policy linux-image-$(uname -r)
    

    다음 출력이 표시되어야 합니다.

    linux-image-5.15.0-53-generic:
      Installed: 5.15.0-53.59
      Candidate: 5.15.0-53.59
      Version table:
     *** 5.15.0-53.59 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
            100 /var/lib/dpkg/status
    

    5.15.0.53 커널이 이 튜토리얼을 작성하는 시점에서 최신 버전이지만 다음 버전이 이미 출시되었다고 가정합니다(5.15.0.56 ). 는 현재 안정적인 Linux 커널 버전입니다).

    커널의 다음 버전을 차단하려면 /etc/apt/preferences 파일에 다음 코드를 입력하십시오."

    Package: linux-image-5.15.0-53-generic linux-headers-5.15.0-33-generic linux-modules-5.15.0-33-generic linux-modules-extra-5.15.0-33-generic
    Pin: version 5.15.0-53.59
    Pin-Priority: -1
    

    위의 코드는 Ubuntu가 커널에 대한 일부 또는 모든 업그레이드를 설치하지 못하도록 차단합니다.

    커널뿐만 아니라 모든 일반 패키지에 대해 방법 2와 3을 따를 수 있습니다.

    결론

    이것이 이 튜토리얼의 전부입니다. 이제 Ubuntu 또는 Debian 시스템에서 설치 또는 업그레이드를 원하지 않는 패키지의 특정 버전 또는 특정 버전을 차단할 수 있습니다. 질문이 있으시면 아래 의견에 게시하십시오.