Debian 기반 리눅스 배포판을 처음 접하는 많은 사용자에게 패키지 관리는 다소 복잡하게 느껴질 수 있습니다. 어떤 튜토리얼에서는 "apt"를 쓰라고 하고, 또 어떤 곳에서는 "apt-get"을, 아주 오래되거나 특수한 자료에서는 "aptitude"를 사용하라고 안내하기도 합니다. 이제야말로 그 세부적인 부분까지 파헤쳐서, 리눅스 세계의 이 작은 구석에 존재하는 낯설고 분열된 듯한 생태계의 '왜, 어디서, 무엇을, 어떻게'를 명확히 설명할 때입니다.
apt 혼란 정리하기
세부적인 차이는 있지만, apt, apt-get, aptitude는 모두 온라인 저장소와 상호작용하는 Debian 패키지 관리 시스템의 서로 다른 '명함'에 불과합니다. 게다가 이미 충분히 많은데도 불구하고, 디스크에 설치된 패키지를 다루는 도구가 하나 더 있습니다. 바로 들어본 적이 있을 dpkg입니다.
dpkg는 웹에서 .deb 패키지 파일을 내려받아 더블클릭으로 설치할 때마다 사용하는 도구로, 윈도우에서 MSI 설치 파일을 실행하는 것과 비슷합니다. Solus에는 EOPKG가, Fedora에는 RPM이, Arch에는 AUR이 있습니다. 심지어 안드로이드에도 APK라는 패키지가 있으며, 그 최대 규모의 저장소가 바로 구글 플레이 스토어입니다. 이제 리눅스의 구조가 데스크톱이나 노트북이 아닌 운영체제까지 포함해 다른 OS들과 얼마나 유사한지 감이 잡히실 겁니다.
Aptitude란 무엇인가?
Aptitude는 APT의 중추 역할을 하는 프론트엔드로, 배포판 저장소가 제공하는 모든 패키지와 직접 추가한 패키지들을 상세히 살펴보고 싶을 때 활용할 수 있습니다. 또한 터미널 안에서 직접 실행되는 몇 안 되는 클래식한 클릭형 GUI 중 하나이기도 합니다.
APT란?
Advanced Packaging Tool(고급 패키징 도구)로 알려진 APT는 운영체제에 설치하는 각종 애플리케이션의 제거, 설치, 검색, 관리 과정을 표준화한 Debian의 해결책입니다. Debian 기반의 모든 배포판이 APT를 사용하지만, 그 적용 방식은 저마다 다릅니다. 이 부분은 잠시 후에 다루겠습니다.
우선 중요한 점은, 패키지 관리자로서의 APT는 apt 명령어 그 자체가 아니라는 사실입니다. APT는 apt-get, apt-mark, apt-cache 등 다양한 APT 관련 명령어들을 포괄하는 개념입니다.
APT를 사용하는 배포판은?
여러분이 사용하는 배포판이 "Debian 기반"이라고 소개된다면, 어떤 형태로든 APT를 사용하고 있는 것입니다. 여기에는 다음이 포함되지만 이에 국한되지 않습니다.
- Debian
- Ubuntu
- Linux Mint
- MX Linux
- Grml
- Kali Linux
- Tails
- PureOS
- Raspberry Pi OS
- Elementary OS
- SteamOS (더 이상 Debian 기반이 아니며, 2021년 Steam 3.0을 위해 Arch로 이전)
Debian 기반 배포판은 목록에 없는 것보다 훨씬 많습니다. 따라서 여기 없는 배포판을 사용 중이라면, 터미널에 apt-get을 입력해서 해당 명령어가 작동하는지 확인해 보세요. 만약 터미널이 "명령어가 존재하지 않는다"는 혼란스러운 메시지를 반환한다면, 확실히 Debian 계열이 아닙니다.
apt-get vs. apt
온라인의 수많은 패키지 설치 튜토리얼에서는 Debian 기반 시스템에서 apt-get과 apt가 서로 바꿔 가며 사용되는 것을 볼 수 있습니다. 패키지를 설치하거나 제거하는 일에 한해서는 실제로 두 명령어 중 무엇을 쓰든 차이가 없습니다. 단, 이것을 두 명령어가 서로의 다른 버전이라고 착각해서는 안 됩니다.
앞서 apt-get은 Advanced Packaging Tool을 구성하는 여러 명령어 중 하나일 뿐이라고 말씀드렸습니다. APT 초보자 입장에서는 apt-get, apt-mark, apt-cache 각각에 어떤 명령어가 유효한지 외워야 하는 것이 다소 혼란스러울 수 있습니다. 예를 들어, 패키지를 검색하는 명령어가 apt-cache search라는 것을 알고 계셨나요?
그렇다면 이 세 명령어의 일상적으로 가장 유용한 기능들이 하나로 통합된다면 어떨까요?
바로 그것이 apt 명령어가 스스로 해내는 일입니다. 터미널에 입력되는 이 세 글자는 APT 생태계 전체를 위한 "래퍼(wrapper)"로 작동하여, 터미널 앞에서 많은 시간을 보내는 사람들의 작업을 단순화해 줍니다.
패키지를 검색할 때 apt search는 대체로 apt-cache search와 같은 결과를 반환합니다.
APT 플래그 알아보기
두 검색 명령어의 출력 화면을 잘 살펴보셨다면, 표시되는 정보가 조금씩 다르다는 것을 눈치채셨을 겁니다. 그 이유는 apt 명령어가 apt-cache search의 출력 결과에 더해, 시스템 내 애플리케이션의 상태 정보까지 함께 가져오기 때문입니다.
이제 apt search 출력에서 패키지 이름 옆의 "i"가 의미하는 바를 설명하기 좋은 타이밍입니다. 이것은 Debian 패키지 도구의 프론트엔드인 aptitude가 붙이는 플래그입니다.
터미널에서 볼 수 있는 플래그와 그 의미는 다음과 같습니다.
A– 자동으로 설치됨. 더 큰 메타패키지나 운영체제 설치 과정의 일부일 가능성이 높습니다.B– 패키지가 손상(broken) 상태로 표시되어 재설치가 필요합니다.H– 반쯤 설치된 상태. 설치를 완료해야 합니다.c– 패키지는 제거되었으나 설정 파일이라는 "유령"이 남아 있습니다.apt-get purge또는apt purge에 해당 플래그가 붙은 패키지 이름을 붙여 해결할 수 있습니다.p– 패키지가 완전히 제거(purge)되었거나 한 번도 설치된 적이 없습니다.v– 다른 패키지들에 기능을 제공하는 가상 패키지입니다. 예를 들어 Firefox는 다른 애플리케이션이 활용할 수 있는 브라우징 기능을 제공하므로 가상 패키지가 될 수 있습니다.i– 이 패키지는 시스템에 설치되어 있습니다.h– 이 패키지에는 hold(보류)가 걸려 있어 새 버전으로 업데이트되지 않습니다.
모든 apt가 동일하지는 않습니다!
패키지 관리 주제를 더 깊이 들어가기 전에 반드시 짚고 넘어가야 할 것이 있습니다. apt 명령어는 배포판에 따라 사용 가능한 인자(argument)의 개수가 다를 수 있다는 점입니다. 예를 들어 Ubuntu의 apt에는 "hold"가 없지만 Mint에는 있습니다.
이 말을 제대로 이해하려면 Ubuntu와 Mint에서 apt에 넣을 수 있는 인자 목록을 나란히 놓고 그 차이를 확인해 볼 필요가 있습니다.
다음은 제가 튜토리얼용으로 새로 구축한(뜻도 담아) Ubuntu 테스트 환경입니다.
그리고 다음은 Linux Mint입니다.
단연코 Mint는 지금까지 제가 본 Debian 기반 배포판 중 가장 완성도 높은 래퍼를 갖추고 있습니다. Mint를 관리하는 커뮤니티가 짧은 명령어 하나로 편안하게 앱을 설치하고 싶은 초보자부터, 밀리미터 단위의 정밀함으로 모든 것을 자신만의 방식으로 튜닝하고 싶은 고급 사용자까지 모두 만족시키기 위해 맞춤 제작했다는 점을 생각하면 놀랄 일이 아닙니다.
APT 명령어 궁극 가이드
APT 패키지 시스템의 강력함을 이해하는 데에는 중요한 명령어들을 직접 다뤄보는 것보다 좋은 방법이 없습니다. 아래 목록은 APT 명령어를 먼저 제시하고, 해당되는 경우 괄호 안에 apt 단축 형태를 함께 표기했습니다. 만약 단축 형태가 여러분의 배포판에서 작동하지 않는다면, 그 배포판이 어떤 이유로 이를 포함하지 않았거나 Mint의 강력한 래퍼를 사용하고 있지 않기 때문입니다. 그런 경우 원조(vanilla) 명령어를 사용해도 큰 손실 없이 진행할 수 있습니다.
add-apt-repository(apt add-repository) – 패키지 유지관리자가 제공하는 새 저장소를 소프트웨어 소스 목록에 추가합니다.
예를 들어 Mint 20에 Lutris의 최신 저장소를 추가하고 싶다면, sudo add-apt-repository 또는 sudo apt add-repository를 입력한 뒤 ppa:lutris-team/lutris를 붙이면 됩니다. 각 저장소는 고유하며, 공식 저장소에 패키지가 없는 대부분의 개발자들은 올바른 방향을 안내하는 지침을 함께 제공합니다.
apt-get clean&apt-get autoremove(apt clean&apt autoremove) – 주로 함께 사용되는 이 두 명령어는 더 이상 필요 없는 설치 스크립트와 설치 미디어(clean)를 청소하고, 아무도 사용하거나 의존하지 않는 패키지(autoremove)를 자동으로 정리해 시스템의 먼지를 털어냅니다.
예시: sudo apt autoremove && sudo apt clean — 터미널 한 줄로 메인 드라이브의 거미줄을 싹 쓸어낼 수 있습니다.
apt-get changelog(apt changelog) – 패키지의 최신 변경 사항을 확인합니다.
예시: apt-get changelog brave-browser — Brave 브라우저 최신 버전이 이전 릴리스에 비해 무엇이 달라졌는지 알려줍니다.
apt contains– Linux Mint 및 일부 Ubuntu 파생 배포판에서만 발견되는 이 명령어는 프로그램에서 "파일을 찾을 수 없음"류의 오류를 만났을 때 사용합니다. 운이 좋다면apt contains가 설치된 애플리케이션의 깊숙한 폴더 속에서 그 파일을 찾아줍니다!
예시: apt contains gettext.sh — gettext용 셸 스크립트를 포함한 애플리케이션을 찾아줍니다. Mint 배포판에 gettext-base가 설치되어 있다면 즉시 찾을 수 있습니다!
apt-get install(apt install) – 이름 그대로 패키지를 설치합니다.apt-get명령어에--reinstall플래그를 붙이면 즉시 재설치됩니다.
설치 예시: sudo apt-get install firefox. Firefox 재설치 예시: sudo apt-get install --reinstall firefox. apt 래퍼를 통한 더 간단한 방법은 sudo apt reinstall firefox입니다.
apt-get remove(apt remove) – 터미널 탐험가의 무기고에서 빠질 수 없는 또 하나의 필수 도구입니다. 이 명령어는 APT 생태계나 DPKG 패키지 관리자로 설치된 것이라면 무엇이든 제거합니다.
예시: sudo apt remove grub-customizer.
apt-get update(apt update) – 이 명령어는 시스템의 애플리케이션을 업데이트하지 않습니다. 단지 APT 캐시를 새로 고쳐, 저장소에서 제공되는 버전과 시스템에 현재 설치된 버전을 비교할 수 있게 할 뿐입니다. 즉, 업데이트를 확인할 뿐 수행하지는 않습니다.
apt-get upgrade(apt upgrade) – 시스템이 발견한 패키지 업데이트가 있다면 다운로드하여 적용합니다. 일반적으로 실행 중인 프로그램을 종료하지 않아도 됩니다.
apt-mark hold/unhold/showhold(apt hold/unhold/showhold) – 이 일련의 명령어들은 보류(hold) 중인 애플리케이션을 관리합니다. 패키지에 hold를 걸면 운영체제가 이후 업데이트를 하지 않습니다.hold와unhold로 애플리케이션의 업데이트 보류를 시작하거나 해제할 수 있으며,showhold는 현재 보류 중인 항목 목록을 보여줍니다.
예시: sudo apt hold pulseaudio. 현명한 조언: 다른 패키지들이 의존하는 항목에 hold를 걸면, 무엇을 하는지 확실히 모르는 경우 장기적으로 시스템에 문제를 일으킬 수 있습니다.
apt-cache search/show(apt search/show) – 이 착한 명령어 콤비는 서로 잘 어울립니다. 먼저search로 패키지를 찾고, 이어서show에 패키지의 전체 이름을 붙여 상세 정보를 확인하세요.
예시: sudo apt search gimp.
여러분이 사용하는 배포판의 APT에 대해 여기서 다루지 못한 세부 사항이 더 궁금하다면, 매뉴얼이 바로 터미널 안에 있습니다. 명령어 앞에 man을 붙여 추가 인자 없이 입력한 후 Enter를 누르면 끝입니다!
무시무시한 "apt-get command not found" 문제
터미널에서 APT가 흔적도 없이 사라져 아무것도 설치할 수 없다 하더라도 세상이 끝난 것은 아닙니다. 약간의 노력만 기울이면 여러분의 소중한 패키지 관리자를 되살릴 수 있습니다.
먼저, 새로 설치한 시스템이라면 그 시스템이 원래 APT를 패키지 관리자로 사용하도록 되어 있는지 다시 한번 확인하세요. Fedora는 DNF/yum을, Arch는 Pacman을, Solus는 EOPKG를, openSUSE는 zypper를, Mandriva는 urpmi를 사용하며, 그 외에도 수많은 배포판이 각자의 도구를 씁니다. 확실히 하려면 터미널에 해당 문자열을 직접 입력해 보세요.
Debian 기반 시스템임을 확인했는데도 APT가 실제로 없다면, 다음 단계로 넘어갈 차례입니다.
좀 더 생생하게 안내해 드리기 위해, 지금부터 제 Ubuntu 시스템의 APT를 일부러 망가뜨리고, OS를 재설치하는 편한 탈출로는 쓰지 않겠습니다!
그 결과는 "command not found" 오류이거나 명령어 처리 불능 상태가 됩니다.
이제 우리 시스템에 맞는 APT 패키지를 찾아 설치할 차례입니다. APT를 사용할 수 없으므로 의존성(dependency)도 자동으로 받을 수 없습니다.
다행히 Debian의 디스크 기반 패키지 관리자인 dpkg가 구원자로 등장합니다! 저는 Ubuntu 메인 저장소에서 제 CPU 아키텍처에 맞는 최신 apt 패키지를 내려받은 뒤, dpkg -I를 실행해 설치해야 할 의존성 목록을 확인했습니다.
제 경우 최신 버전의 APT를 설치하려 했을 때, 의존성은 모두 존재했지만 버전이 최신이 아니었습니다.
이런 사실은 dpkg -i /path/to/your/apt/deb/file을 입력할 때 알게 됩니다. 물론 제가 임의로 적은 경로는 웹사이트에서 내려받은 .deb 파일의 실제 경로로 바꿔야 합니다.
버전 2.3.11 대신, 글을 쓰는 시점에 Mint에 설치되어 있는 2.0.6 버전을 선택했습니다.
여러 버전을 이리저리 시도하다 보면 결국 현재 환경과 호환되는 버전을 만나게 됩니다. 저에게도 정확히 그렇게 일어났습니다. sudo dpkg -i에 패키지를 붙여 입력하자 마법처럼 순조롭게 설치되었습니다.
일반적으로 APT의 치명적인 의존성들은 시스템에 빠져 있지 않은 것들입니다. 하지만 APT가 없는 상황에서는 무슨 일이든 일어날 수 있습니다. 어느 쪽이든, 앞서 설명한 dpkg -I로 확인한 의존성 중 하나가 없다는 것을 발견하면, 위에서 링크한 저장소의 상위 폴더들을 살펴보세요. 해당 의존성들은 알파벳 순서로 정리된 폴더 안에 있을 것입니다.
자주 묻는 질문
1. 위험할 수 있는 APT 명령어가 있나요?
일반적으로 터미널에 APT 관련 명령어를 입력할 때는 그 명령어가 무엇을 하려는지 인지하고 있어야 합니다. 특히 새 커널을 설치하는 대규모 업데이트 전에는 안전을 위해 시스템 전체 백업을 만들어 두세요.
그럼에도 특히 주의해야 할 명령어는 apt hold와 apt full-upgrade/dist-upgrade입니다. 전자는 앞서 자세히 설명했듯 hold를 해제하기 전까지 시스템을 불안정하게 만들 수 있습니다. 후자는 배포판이 새로운 장기 지원(LTS) 버전을 출시해 마이그레이션하고 싶을 때만 유용하지만, 익숙하게 사용하던 설치된 패키지들을 제거할 가능성도 있습니다. 일반적인 apt upgrade를 수행한 뒤 apt autoremove로 정말 필요 없는 패키지만 정리하는 것이 훨씬 안전합니다.
2. apt가 apt-get보다 나은가요?
뻔한 답변이지만, 정말로 무엇을 하느냐에 따라 다릅니다. 수많은 명령어를 입력하느라 손가락에 무리가 갑니까? apt-get이 더 적합한 특별한 기능이 필요 없다면 apt를 단축키처럼 사용하는 것이 좋습니다. 여러 면에서 apt는 패키지 관리 과정을 간소화할 뿐 아니라, 앞서 apt-cache search와 apt search를 비교하며 본 것처럼 추가 정보도 제공합니다.
하지만 apt의 방대한 인자 목록 덕분에 apt-get이 거의 불필요해지는 Mint를 쓰고 있지 않다면, 좀 더 클래식한 도구를 대안으로 남겨두는 것도 나쁘지 않다고 느낄 수 있습니다.
3. 저장소와 앱 스토어의 차이는 무엇인가요?
일상적인 사용자 입장에서는 그 차이가 극적이지 않습니다. 실제로 상당히 비슷합니다. 두 개념이 갈라지기 시작하는 지점은 소프트웨어의 "대체 가능성(fungibility)"입니다. 리눅스는 사용자에게 때로는 압도적일 만큼 폭넓은 선택지를 제공하는 유동적인 소프트웨어 시장입니다. 반면 스마트폰 앱 스토어는 거의 고정되어 있어 사용자가 대안을 찾는 모습을 상상하기 어렵습니다.
동시에 이론적으로는, Ubuntu 사용자들이 즐겨 쓰는 PPA(개인 패키지 아카이브)가 악의적인 행위자에 의해 변조되어 악성 소프트웨어가 퍼지는 통로가 될 수도 있습니다.
여기서 기억해야 할 한 가지는, 탈중앙화에는 사용자 측의 책임이 따른다는 것입니다. 배포판에 추가하는 저장소가 신뢰할 수 있는 출처와 오랫동안 검증된 프로젝트에서 온 것인지 반드시 확인하세요.
마무리
이쯤 되었다면, APT의 전체 명령어와 도구 모음이 무엇을 제공하는지 이해하는 것이 얼마나 강력한 힘이 되는지 느끼셨기를 바랍니다. APT는 단순히 컴퓨터에 소프트웨어를 추가하고 제거하는 수단이 아니라, 무엇을 설치할지 발견하고 더 현명한 선택을 내릴 수 있게 돕는 완전한 프레임워크입니다.
이어서 리눅스에서 Bash 명령어를 백그라운드로 실행하는 방법과 꼭 알아야 할 15가지 LS 명령어도 확인해 보세요.