TL;DR

  • Arch Linux 업데이트 패키지를 낮에 직접 내려받는 대신 unRAID NAS가 오후 6시에 미리 다운로드하도록 구성해, 다음 날 인터넷을 쓰지 않고 몇 초 만에 설치하는 방식임.
  • 워크스테이션은 checkupdates로 업데이트 대상 패키지를 확인하고, 네트워크 공유가 마운트된 뒤 systemd 서비스로 패키지 다운로드 URL을 NAS에 전달함.
  • 임시 데이터베이스와 빈 캐시 디렉터리를 사용하고 --nodeps를 지정한 pacman 명령으로 원격 URL을 출력해, 로컬 캐시의 file:// URL과 불필요한 의존성 다운로드를 피함.
  • NAS에서는 wget -c -i로 패키지를 내려받고, User Scripts 플러그인의 cron 작업으로 오후 6시에 실행함; 실행이 늦어진 원인은 재설치 후 설정되지 않은 서버 시간대였음.
  • NAS 캐시를 pacman.conf의 CacheDir 목록에 추가하는 방식은 작동하지 않아, 다음 날 pacman -U로 공유 폴더의 패키지를 설치하는 방식으로 마무리함.

업데이트 다운로드를 NAS로 옮기려는 이유

  • Arch Linux 시스템을 부팅한 뒤 업데이트를 실행하면 인터넷 연결을 다운로드가 거의 전부 차지해 웹 페이지 로딩이 수 분까지 늘어남. 평소 약 50ms 걸리던 정적 웹사이트 HTTP 요청도 1.3초 이상 걸리는 상황임.
  • 업데이트를 분리된 tmux 세션에서 백그라운드로 실행하더라도 일반적인 컴퓨터 사용을 방해하지 않도록, 부팅 때 업데이트 대상 패키지를 NAS에 알리고 컴퓨터를 사용하지 않는 오후 6시에 NAS가 다운로드하는 방식을 구상함.
  • 다음 날에는 이미 내려받은 패키지를 로컬에서 설치해 낮 시간 인터넷 사용을 원활하게 유지하는 계획임.

업데이트 패키지 URL을 NAS에 전달하기

  • unRAID NAS에 네트워크 공유를 만들고, 다운로드 URL을 담을 텍스트 파일과 내려받은 .pkg.tar.zst 파일을 보관할 디렉터리를 마련함.
  • pacman-contrib 패키지에 포함된 checkupdates로 대기 중인 업데이트를 파싱하는 Bash 스크립트를 작성함. 네트워크 공유가 성공적으로 마운트된 뒤에만 실행되도록 systemd 서비스로 설정함.
  • 처음에는 공식 archlinux 이미지를 사용하는 임시 Docker 컨테이너에서 pacman -Sw --noconfirm package-name을 실행하고, 내려받은 파일을 마운트된 네트워크 공유로 복사하는 방식을 사용함.
  • 이 방식은 워크스테이션의 복잡한 의존성을 반영하지 못함. 예를 들어 firefox 업데이트에 필요한 데스크톱 라이브러리가 컨테이너에 없으면 pacman -Sw가 gtk3를 비롯한 의존성을 함께 내려받으며, 경우에 따라 GNOME 구성 요소의 절반가량까지 받아 불필요한 패키지 다운로드가 기가바이트 단위로 늘어남.
  • pacman -Sp package-name으로 패키지의 직접 다운로드 URL을 출력하도록 바꿨지만, 로컬 /var/cache/pacman/pkg/에 이전 버전이 있으면 pacman이 원격 HTTP 미러 대신 file:///var/cache/... URL을 출력하는 문제가 생김.
  • pacman --cachedir /tmp/empty_dir -Sp package-name으로 빈 임시 폴더를 지정해도 --cachedir는 기본 캐시를 대체하지 않고 검색 목록에 추가함. 따라서 pacman은 로컬의 이전 패키지를 계속 찾아 file:// URL을 반환함.

임시 데이터베이스로 원격 URL 출력하기

  • 문제의 원인은 로컬 시스템 데이터베이스가 이미 설치된 이전 버전을 알고 있어 이를 로컬 캐시와 대조하는 데 있었음. 이를 해결하기 위해 checkupdates의 내부 동작을 따라 새 임시 데이터베이스를 만듦.
  • 최종 명령은 pacman --nodeps --dbpath "$tmp_db" --cachedir "$tmp_db" -Sp "$package"임.
  • --dbpath "$tmp_db"는 새로 동기화한 데이터베이스를 사용하게 해 새 버전의 파일명을 찾도록 함.
  • --cachedir "$tmp_db"는 비어 있는 디렉터리를 캐시로 지정해 로컬 file:// 대체 경로를 차단함.
  • --nodeps는 전환 과정의 gdb와 gdb-common 같은 분할 패키지에서 흔히 발생하는 의존성 손상 오류로 조회가 중단되는 일을 방지함.
  • Arch Linux 쪽에서 정상적인 HTTP URL을 출력하게 된 뒤에는 unRAID에서 텍스트 파일을 읽는 wget -c -i 명령으로 패키지를 다운로드하는 구성이 됨.

cron 작업과 시간대 문제 해결

  • 오후 6시에 다운로드를 실행하려고 User Scripts 플러그인을 설치하고 스크립트와 cron 일정을 설정했지만, 처음에는 작업이 실행되지 않음.
  • 원인은 스크립트나 네트워크가 아니라 서버 시간대였음. unRAID를 최근 재설치했으며, 2024년에 구매한 라이선스에는 업데이트 1년이 포함되어 있었음.
  • 라이선스 업데이트 기간이 끝난 뒤 버전 7.3.0이 출시되면서 시간대를 묻는 온보딩 마법사가 추가됐지만, 업데이트를 1년 더 받기 위해 36달러를 지불하고 싶지 않아 시간대 설정 절차를 놓침.
  • unRAID GUI에서 시간대를 수동으로 바로잡은 뒤 cron 작업이 정상적으로 실행됨.

NAS 패키지 캐시를 직접 사용하려는 시도

  • 마지막으로 NAS의 패키지 공유를 pacman.conf의 CacheDir 목록에 추가해 pacman -Syu가 NAS의 새 패키지를 찾아 그곳에서 직접 설치하는 방식을 시험함.
  • pacman은 NAS 패키지를 사용하지 않고 패키지를 다시 다운로드했으며, 진행률 표시줄이 100%를 넘는 등 전체 진행률도 이상하게 표시됨.
  • 결국 원래 계획대로 다음 날 sudo pacman -U /mnt/arch-pkg-cache/pkgs/*.pkg.tar.zst를 실행해 설치하는 방식으로 마무리함. 설치는 즉시 완료되고 인터넷을 전혀 사용하지 않아 낮 시간 웹 검색도 원활하게 유지됨.