데비안을 새 버전으로 업그레이드하기

In 네트워크와 시스템 관리 by Choi Kyung-sik

데비안은 정교한 패키지 관리 시스템을 가지고 있어 한 번 설치하면 재설치 없이 계속해서 새 버전으로 업그레이드할 수 있다. 이 글을 쓰는 데 사용하고 있는 시스템은 2011년 즈음에 버전 5.0(Lenny)을 설치한 이래로 버전 10(Buster)까지 왔다. 데비안은 게으른 사람에게 더할 나위 없는 리눅스 배포판이다. 현재 사용하는 버전 안에서의 업그레이드는 apt update && apt upgrade 명령어로 한껏 여유를 부릴 수 있다.

새 버전으로 업그레이드하려면 조금은 부지런해야 한다. 제일 먼저 업그레이드할 버전의 릴리스 노트(Release Notes)를 읽어 봐야 한다. 릴리스 노트의 페이지 주소는 https://www.debian.org/releases/<코드네임>/releasenotes다. 코드네임이 buster라면 https://www.debian.org/releases/buster/releasenotes 주소로 접속할 수 있다. 데비안 릴리스의 버전 넘버와 코드네임은 DebianReleases – Debian Wiki에서 볼 수 있다. 코드네임은 개발 단계에서 사용하고 이후에 버전 넘버를 붙인다. 4.0(Etch) 이후로 버전 넘버는 1씩 규칙적으로 증가했지만, 그전에는 그렇지 않았다.

릴리스 노트의 PDF 문서는 50쪽 정도의 분량을 가진다. 아쉽게도 한글 번역 문서는 없다. 그러나 새 버전으로 업그레이드하는 것이 처음이라면 한 번 읽어 볼 것을 추천한다. 전체적인 내용을 통해 자신만의 업그레이드 절차를 만들어 보기를 바란다. 다음번에 업그레이드할 때는 2장에서 새 버전의 전체적인 내용을 대강 훑고, 5장에서 자신이 설치한 패키지에 따라 영향을 받을만한 것이 있는지 정도만 본다. 나머지 장의 내용은 거의 변하지 않기 때문이다.

이 글은 나의 관점에서 데비안을 새 버전으로 업그레이드할 때 릴리스 노트에 기반하여 필요한 사전 지식과 절차를 정리한 것이다.

단계적 업그레이드

버전 간의 업그레이드는 단계적으로 해야 한다. 예를 들면, 버전 8(Jessie)에서 버전 10(Buster)으로 업그레이드하려면 먼저 버전 9(Stretch)로 업그레이드한 후 다시 Buster로 업그레이드한다. 데비안 개발자가 직전 버전에서 새 버전으로 업그레이드하는 것만을 테스트하기 때문에 단계적으로 업그레이드할 것을 제안하는 것으로 보인다.

버전 업그레이드 시 추천하는 패키지 관리 도구

릴리스 노트 4장에서 새 버전으로 업그레이드할 때 추천하는 패키지 관리 도구는 가끔 달라질 때가 있다. aptitude를 추천한 적도 있지만, 대부분은 apt-get 사용을 권장해 왔다. 데비안 10(Buster)에서 처음으로 apt를 추천한다. apt는 apt-get과 apt-cache의 기능을 합치고, 출력할 때 색깔을 사용하여 눈을 즐겁게 해준다. 그러나 색깔이 들어간 코드로 인해 파싱 등을 위한 스크립트에서 사용하기에 부적절하다. 다음은 업그레이드와 관련하여 apt-get을 apt로 대체할 수 있는 명령어 목록이다.

  • apt-get update → apt update
  • apt-get upgrade → apt upgrade
  • apt-get dist-upgrade → apt full-upgrade
/etc 설정 충돌

/etc 디렉토리는 데비안 개발자(패키지 메인테이너)와 사용자가 충돌하는 영역이다. 패키지에 중요한 설정의 변화가 있을 수 있다. 예를 들면 Apache 2.2에서 2.4로 변경되었을 때 설정에 많은 차이가 있었다. 업그레이드 시 마지막 단계인 패키지의 설정에서 이러한 충돌을 마주칠 것이다. 패키지 개발자의 설정으로 대체할 것인지 사용자의 설정을 유지할 것인지 선택을 묻는다. 대부분 패키지 개발자의 설정으로 대체하는 것이 좋다. 그러고 나서 나중에 내가 원하는 설정으로 변경해 준다. 내가 했던 설정은 .dpkg-old, .ucf-old 등의 확장자를 가진 파일로 남아 있을 것이다.

업그레이드를 진행 중일 때는 정신이 없어서 어떤 패키지에서 무엇을 선택했는지 잊어버릴 때가 있다. 그리고 간간이 보이는 경고 메시지도 신경 쓰인다. 화면이 빠르게 지나가기 때문에 메시지를 잡아내기도 힘들다. 따라서 script 프로그램으로 진행 상황을 기록하는 것이 좋다.

script의 사용 방법을 간단히 알아보자.

# script --timing=test.time test.script
Script started, file is test.script
# free
              total        used        free      shared  buff/cache   available
Mem:       16345836     8126580     1408848     1259412     6810408     6622112
Swap:       2579452        1352     2578100
# exit
exit
Script done, file is test.script
#

라인 1에서 script 명령어를 실행한다. --timing=test.time 옵션은 scriptreplay에서 사용하기 위해 시간을 저장하는 것이다. 라인 2에서 스크립트가 시작되었음을 알려 준다. 라인 3에서 free 명령어를 사용하여 메모리의 정보를 본다. script의 기록을 위한 예제로 아무 명령어나 실행해 보자. 라인 7에서 exit 명령어를 사용하여 script의 실행을 끝낸다. 우리가 했던 행동은 test.scirpt 파일에 저장하고 있다.

# scriptreplay test.time test.script
# free
              total        used        free      shared  buff/cache   available
Mem:       16345836     8126580     1408848     1259412     6810408     6622112
Swap:       2579452        1352     2578100
# exit
exit

#

script에서 --timing 옵션을 사용하였다면 라인 1과 같이 scriptreplay 명령어로 우리가 했던 행동을 볼 수 있다. 데비안의 업그레이드 과정은 내용이 많아서 scriptreplay로 한가하게 다시 보기를 하지는 않을 것이다. 스크립트 파일(test.script)을 편집기로 보면서 검토하는 것이 빠르다.

데비안 10에서 추천하는 ‘apt full-upgrade‘ 명령어는 색깔이 들어가 있는 코드 때문에 script 프로그램하고는 맞지 않는다. 대신에 /var/log/apt/term.log 파일에서 우리가 했던 행동들을 볼 수 있다.

screen 사용

ssh로 접속하여 업그레이드한다면 screen을 사용해야 한다. 네트워크 관련 패키지를 업그레이드할 때 ssh 세션이 끊어질 수 있기 때문이다. 또는 ssh 클라이언트를 사용하는 윈도우 운영체제의 컴퓨터가 업그레이드하면서 컴퓨터를 다시 시작해 버릴 수도 있다. ssh 세션이 끊기면 ssh 서버 프로세스에서 포크한 bash 쉘도 종료하고 업그레이드 작업이 중단될 것이다.

screen 사용법에 대해 간단히 알아보자. screen을 설치하지 않았다면 다음의 명령어로 screen 패키지를 설치한다.

# apt install screen

다음과 같이 screen 명령어를 실행한다. 실행 후 <Space><Return> 키를 눌러 작업을 시작한다.

# screen

현재 상태를 유지하면서 screen 세션에서 빠져나오려면 <Ctrl + a> 키를 누른 후 이어서 <d> 키를 누른다. (detach)

다시 이전에 작업하던 screen 세션으로 들어가려면 다음의 명령어를 실행한다. (reattach) 업그레이드 도중 ssh 세션이 끊어져 다시 접속했을 때에도 다음의 명령어를 실행하여 작업을 계속할 수 있다.

# screen -Dr

screen 세션을 종료하려면 screen의 쉘에서 exit 명령어를 실행한다. 또는 <Ctrl + a> 키에 이어서 <k> 키를 누른 후 종료를 확인하는 메시지가 나오면 y를 입력한다.

# exit
sources.list와 서드파티 저장소

새 버전으로 업그레이드하려면 /etc/apt/sources.list 파일을 변경해야 한다. 다음은 데비안 9(Stretch)의 sources.list 파일의 예이다.

# stretch
deb http://deb.debian.org/debian/ stretch main contrib non-free
deb-src http://deb.debian.org/debian/ stretch main contrib non-free

# stretch - security updates
deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free

# stretch-updates
deb http://deb.debian.org/debian/ stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian/ stretch-updates main contrib non-free

stretch 코드네임을 업그레이드하려는 buster로 모두 변경하면 된다.

데비안에 없는 패키지를 제공하는 비공식 APT 저장소를 서드파티 저장소(third-party repository)라고 부른다. 나의 경우 AdoptOpenJDK, .NET Core SDK, Node.js, VirtualBox 네 개가 있다. 일반적으로 서드파티 저장소의 GPG 키는 /etc/apt/trusted.gpg 파일이나 /etc/apt/trusted.gpg.d 디렉토리에 추가하고 저장소의 설정은 /etc/apt/sources.list 파일이나 /etc/apt/sources.list.d 디렉토리에 추가한다. 나는 일관성을 위해 저장소의 설정은 /etc/apt/sources.list.d 디렉토리에 다음의 파일로 관리한다. 파일 이름은 .list 확장자를 가져야 한다.

  • adoptopenjdk.list
  • microsoft-prod.list
  • nodesource.list
  • virtualbox.list

새 버전으로 업그레이드하려면 위의 파일들도 수정해 주어야 한다. 몇 가지 예를 보자. 다음은 데비안 9(Stretch)의 nodesource.list 파일의 내용이다.

deb https://deb.nodesource.com/node_10.x stretch main
deb-src https://deb.nodesource.com/node_10.x stretch main

위의 stretch 코드네임을 업그레이드하려는 buster로 변경해야 한다. https://deb.nodesource.com/node_10.x/dists/buster/ 주소로 접속하여 buster 저장소의 존재를 확인할 수 있다. 저장소 설정의 URL에서 dists는 관례로 생략하기 때문에 실제 주소에는 추가해야 한다.

마이크로소프트의 .NET Core 저장소는 특이하게 URL에 데비안의 버전 넘버가 있다. 다음은 microsoft-prod.list 파일의 내용이다.

deb [arch=amd64] https://packages.microsoft.com/debian/9/prod stretch main

코드네임을 buster로 변경하는 것에 더하여 910으로 수정해야 한다. https://packages.microsoft.com/debian/10/prod/dists/buster/ 주소로 접속하여 저장소를 확인할 수 있다.

업그레이드 절차

새 버전으로 업그레이드하는 것은 보통 2년 정도의 주기를 가진다. 긴 기간 동안 업그레이드 작업 절차는 잊히기 쉽고 한 번만 하고 끝나는 것이 아니므로 정리해 둘 필요가 있다.

  1. https://www.debian.org/releases/<코드네임>/releasenotes에서 릴리스 노트를 확인한다. 2장에서 새 버전의 전체적인 내용을 대강 훑고, 5장에서 문제가 발생할 만한 것이 있는지 본다. 4장에서 추천하는 패키지 관리 도구 정도를 확인한다.
  2. 데이터와 설정 정보들을 백업한다. 나의 경우 데이터베이스를 포함하여 서버 전체를 백업하는 스크립트를 사용한다.
  3. /etc/apt/sources.list 파일에서 현재 코드네임을 업그레이드할 코드네임으로 변경한다.
  4. /etc/apt/sources.list.d 디렉토리에서 서드파티 저장소에 대한 설정 파일을 변경한다.
  5. screen을 실행한다.
    # screen
    
  6. script를 실행한다.
    # script --timing=upgrade.time upgrade.script
    
  7. 패키지 리스트를 업데이트한다.
    # apt update
    
  8. 최소한의 시스템 업그레이드를 실행한다.
    # apt-get upgrade
    
  9. 시스템 업그레이드를 실행한다.
    # apt full-upgrade
    
  10. 업그레이드 진행 중에 발생했던 /etc 디렉토리의 설정 충돌을 해결한다. 데비안 개발자의 설정에 자신이 원하는 설정을 추가한다. /var/log/apt/term.logupgrade.script 파일을 참고할 수 있다.
  11. script를 종료하고 screen 세션을 종료한다.
    # exit
    ...
    # exit
    
  12. 새로운 커널을 반영하기 위해 시스템을 재시작한다.
    # systemctl reboot
    
  13. 삭제한 패키지의 설정 파일이 남아 있는 것을 찾아 제거한다.
    # aptitude search '~c'
    # aptitude purge '~c'
    
  14. aptitude를 실행하고 Obsolete and Locally Created Packages 카테고리에서 쓸모가 없어진 패키지를 선택적으로 삭제한다.
참고 자료