13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Debian

  • [Linux] APT 패키지 관리와 Flatpak 전환 전략

    [Linux] APT 패키지 관리와 Flatpak 전환 전략

    APT 패키지 관리와 Flatpak 전환 전략

    APT를 버리는 문제가 아니라, 경계를 다시 긋는 문제입니다

    APT에서 Flatpak으로 옮긴다는 표현은 조금 위험합니다. Debian, Ubuntu 계열에서 APT는 여전히 운영체제 패키지 관리의 기준축입니다. 커널, systemd, OpenSSH, 네트워크 도구, 드라이버, 서버 데몬, 보안 업데이트 흐름은 배포판 저장소 정책 위에서 돌아갑니다. Flatpak은 이 자리를 대체하기보다, 데스크톱 애플리케이션을 배포판 릴리스 주기에서 분리하는 선택지에 가깝습니다.

    제가 13년 정도 Linux 서버와 데스크톱을 같이 운영하면서 얻은 기준은 단순합니다. 시스템을 구성하는 패키지는 APT, 사용자가 실행하는 독립형 GUI 앱은 Flatpak 후보로 봅니다. 이 기준을 세우면 “무엇을 옮길지”보다 “무엇을 절대 옮기지 말아야 할지”가 먼저 보입니다. 실제 마이그레이션에서 사고를 줄이는 건 과감한 전환이 아니라 경계 설정이더라고요.

    무작정 “기존 앱을 전부 Flatpak으로 바꾸자”로 가면 생각보다 빨리 꼬입니다. 같은 앱을 배포판 패키지와 Flatpak으로 동시에 설치하면 설정 경로, 실행 파일, MIME 연결, 포털 권한, 자동 실행 항목이 서로 다른 층에서 움직입니다. 사용자는 같은 아이콘을 눌렀다고 생각하지만 실제로는 다른 패키징 채널의 앱이 실행될 수 있습니다. 이때 “설정이 사라졌다”가 아니라 다른 설정 디렉터리를 보고 있는 것인 경우가 많습니다.

    APT와 Flatpak 패키지 관리 구조 다이어그램

    APT는 운영체제와 서비스 계층, Flatpak은 사용자 앱 계층으로 나뉘는 구조를 보여주는 다이어그램이 잘 맞습니다.

    APT와 Flatpak의 차이는 설치 방식보다 운영 책임입니다

    APT는 배포판 저장소의 패키지를 시스템 경로에 설치하고, 의존성까지 배포판 기준으로 맞춥니다. 패키지는 대체로 /usr/bin, /usr/lib, /etc, /var 같은 경로와 강하게 연결됩니다. 운영 입장에서는 이 점이 꽤 든든합니다. 보안 업데이트, 서비스 재시작, 설정 파일 관리, 로그 위치가 배포판 관례를 따르거든요.

    Flatpak은 앱과 런타임을 별도로 관리하고, 앱을 샌드박스 안에서 실행합니다. 사용자 설정은 대체로 ~/.var/app/앱ID/ 아래에 쌓입니다. 앱은 flatpak run 앱ID 형태로 실행하며, 파일 접근은 Flatpak 권한과 데스크톱 포털(xdg-desktop-portal)의 영향을 받습니다. 그래서 Flatpak은 “최신 GUI 앱을 깔기 쉬운 도구”이면서 동시에 “파일 접근과 시스템 통합을 명시적으로 다뤄야 하는 도구”입니다.

    판단 항목 APT가 맞는 경우 Flatpak이 맞는 경우 실무 판단 기준
    운영 책임 OS, 서비스, 보안 업데이트와 함께 관리해야 함 앱 단위로 독립 업데이트해도 됨 장애 시 systemd, 로그, 설정 파일을 바로 추적해야 하면 APT
    업데이트 속도 배포판 안정성 정책을 따름 Flathub 또는 remote 정책을 따름 최신 GUI 기능이 중요하면 Flatpak 후보
    파일 접근 홈 디렉터리와 시스템 경로 접근이 자연스러움 샌드박스 권한과 포털 정책의 영향을 받음 프로젝트 폴더, 외장 디스크, 네트워크 마운트를 많이 쓰면 사전 테스트 필요
    자동화 apt, dpkg, apt-mark로 서버 자동화에 적합 flatpak install, override, mask 등 별도 관리 필요 Ansible이나 셸 스크립트에 넣을 때 두 업데이트 루틴을 분리
    설정 위치 ~/.config, ~/.local, /etc 등 앱별 관례 ~/.var/app/앱ID/ 중심 전환 전 설정 백업과 경로 비교가 필수
    추천 대상 SSH, Docker 엔진, 서버 데몬, 입력기, 드라이버, CLI 도구 GIMP, Inkscape, 미디어 플레이어, 메신저, 독립형 GUI 앱 시스템과 많이 붙을수록 APT, 독립 실행 성격이 강할수록 Flatpak

    이 표에서 핵심은 “Flatpak이 더 좋다”가 아닙니다. Flatpak은 앱 경계를 명확하게 만들지만, 그만큼 경계 밖 리소스를 쓰려면 권한을 열어야 합니다. 반대로 배포판 패키지는 시스템과 자연스럽게 붙지만, 앱별 격리나 배포판 버전 독립성은 약합니다. 도구의 우열보다 책임 범위가 다릅니다.

    Linux 마이그레이션 전에는 설치 목록보다 출처를 먼저 확인하세요

    제가 현장에서 제일 먼저 보는 건 패키지 이름이 아니라 어느 채널에서 설치됐는지입니다. 같은 Firefox, 같은 GIMP라도 배포판 패키지, Snap, Flatpak, 수동 압축 해제본이 섞여 있으면 문제를 재현하기 어렵습니다. 특히 Ubuntu 계열은 일부 데스크톱 앱이 apt 명령으로 설치되는 것처럼 보여도 실제로는 다른 패키징 채널로 연결되는 경우가 있어 실행 경로 확인이 중요합니다.

    # 현재 APT 설치 상태를 파일로 남깁니다.
    apt list --installed > apt-installed.txt
    apt-mark showmanual > apt-manual.txt
    
    # Flatpak 앱과 런타임을 분리해서 확인합니다.
    flatpak list --app > flatpak-apps.txt 2>/dev/null || true
    flatpak list --runtime > flatpak-runtimes.txt 2>/dev/null || true
    
    # 특정 앱의 APT 출처와 버전 후보를 봅니다.
    apt policy gimp
    apt-cache show gimp | sed -n '1,80p'
    
    # 실행 경로와 데스크톱 런처를 확인합니다.
    command -v gimp
    which -a gimp
    ls /usr/share/applications | grep -i gimp || true
    ls ~/.local/share/applications | grep -i gimp || true
    ls /var/lib/flatpak/exports/share/applications | grep -i gimp 2>/dev/null || true
    ls ~/.local/share/flatpak/exports/share/applications | grep -i gimp 2>/dev/null || true

    apt policy에서 Installed는 현재 설치된 버전, Candidate는 저장소 기준으로 설치 또는 업그레이드될 후보입니다. Candidate: (none)에 가깝거나 배포판 저장소의 앱이 업무에 필요한 기능보다 늦게 따라온다면 Flatpak 전환 후보로 표시합니다. 다만 후보가 오래됐다는 이유만으로 서버 도구까지 옮기면 안 됩니다. 서버 도구는 최신 기능보다 재현성과 배포판 보안 흐름이 더 중요한 경우가 많습니다.

    실행 경로도 꼭 봐야 합니다. 터미널에서 command -v gimp가 /usr/bin/gimp를 가리키는데 런처는 Flatpak 데스크톱 파일을 가리키는 상황이 생길 수 있습니다. 이러면 터미널에서 실행한 앱과 메뉴에서 실행한 앱이 서로 다른 설정을 씁니다. 버그처럼 보이지만 실제 원인은 런처와 PATH의 불일치입니다.

    Flatpak 설치와 Flathub remote는 시스템 단위와 사용자 단위를 구분하세요

    Flatpak 자체는 보통 배포판 패키지 관리자로 설치합니다. 여기서 이미 역할 분리가 시작됩니다. 기반 도구는 배포판 패키지로 받고, GUI 앱 배포 채널만 Flatpak remote로 분리하는 방식입니다. 데스크톱 한 대만 쓰면 별 차이가 없어 보이지만, 가족 PC, 홈랩 워크스테이션, 공용 장비처럼 사용자가 여러 명이면 설치 범위가 중요해집니다.

    # Debian/Ubuntu 계열에서 Flatpak 기반 도구 설치
    sudo apt update
    sudo apt install flatpak
    
    # 시스템 전체에 Flathub remote 추가
    sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
    
    # 현재 등록된 remote와 설치 범위 확인
    flatpak remotes --show-details
    flatpak remotes --user --show-details
    flatpak remotes --system --show-details
    
    # 앱 목록 확인
    flatpak list --app
    flatpak list --app --columns=application,name,version,branch,installation

    sudo flatpak remote-add는 시스템 설치 범위에 remote를 추가합니다. 반대로 사용자 단위로만 쓰고 싶다면 flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo 형태를 씁니다. 개인 노트북이라면 둘 중 하나로 통일하는 편이 낫습니다. 같은 remote가 사용자 범위와 시스템 범위에 동시에 들어가면 나중에 앱이 어디에 설치됐는지 헷갈립니다.

    설치 위치도 달라집니다. 시스템 범위 Flatpak은 보통 /var/lib/flatpak 아래에 있고, 사용자 범위 설치는 ~/.local/share/flatpak 아래에 있습니다. 백업이나 디스크 정리를 할 때 이 차이가 바로 영향을 줍니다. 용량이 부족한 데스크톱이라면 앱뿐 아니라 런타임도 같이 쌓인다는 점을 염두에 두셔야 합니다. 정확한 용량은 설치한 앱과 런타임에 따라 달라지므로, 추측하지 말고 아래처럼 직접 확인하는 게 좋습니다.

    # Flatpak 설치 공간 확인
    sudo du -sh /var/lib/flatpak 2>/dev/null || true
    du -sh ~/.local/share/flatpak 2>/dev/null || true
    
    # 사용하지 않는 런타임 정리 후보 확인 및 제거
    flatpak uninstall --unused
    
    # Flatpak 앱, 런타임, 설치 범위를 함께 확인
    flatpak list --columns=application,name,type,branch,installation
    Flatpak remote 런타임 앱 구성 다이어그램

    Flathub remote, 런타임, 앱, 사용자/시스템 설치 범위가 어떻게 이어지는지 보여주는 구성도가 있으면 좋습니다.

    APT 앱을 Flatpak으로 옮기는 절차: 한 번에 하나씩, 되돌릴 수 있게

    실전에서는 앱 하나를 골라 전환하고 하루 정도 써본 뒤 다음 앱으로 넘어가는 방식이 안전합니다. GIMP 같은 GUI 앱은 좋은 시험 대상입니다. 시스템 서비스가 아니고, 파일 접근 권한 문제가 드러나기 쉽고, 설정 디렉터리 차이도 확인하기 좋기 때문입니다. 이거 진짜 번거로워 보여도, 나중에 문제를 좁히는 데 큰 도움이 됩니다.

    1. 배포판 패키지 설치 여부, 버전, 실행 경로, 데스크톱 파일을 확인합니다.
    2. 기존 설정 디렉터리를 백업합니다. 바로 삭제하지 않습니다.
    3. Flatpak 앱 ID를 확인하고 설치합니다.
    4. 실행, 파일 열기, 저장, 플러그인, 기본 앱 연결을 테스트합니다.
    5. 문제가 없으면 기존 패키지를 제거하되, 설정 purge는 며칠 뒤에 판단합니다.
    # 1. APT 상태 확인
    apt policy gimp
    command -v gimp
    which -a gimp
    
    # 2. 기존 사용자 설정 백업 예시
    mkdir -p ~/migration-backup/gimp
    cp -a ~/.config/GIMP ~/migration-backup/gimp/ 2>/dev/null || true
    cp -a ~/.gimp-* ~/migration-backup/gimp/ 2>/dev/null || true
    
    # 3. Flatpak 앱 검색 및 설치
    flatpak search gimp
    flatpak install flathub org.gimp.GIMP
    
    # 4. 실행 및 정보 확인
    flatpak run org.gimp.GIMP
    flatpak info org.gimp.GIMP
    flatpak info --show-permissions org.gimp.GIMP
    
    # 5. APT 패키지 제거. 마이그레이션 직후에는 purge보다 remove를 권합니다.
    sudo apt remove gimp
    sudo apt autoremove

    flatpak search에서는 이름보다 Application ID를 확인해야 합니다. org.gimp.GIMP 같은 ID가 이후 실행, 권한 확인, 제거, override, 업데이트에서 계속 쓰입니다. 이름은 사람이 읽는 라벨이고, 운영할 때 필요한 키는 앱 ID입니다.

    sudo apt remove는 시스템 패키지를 제거하지만 사용자 홈 디렉터리 설정은 대체로 남깁니다. sudo apt purge는 패키지의 시스템 설정까지 제거하는 데 쓰지만, 사용자 홈 아래 설정까지 항상 정리해주는 만능 청소 도구는 아닙니다. 저는 마이그레이션 당일에는 purge를 피합니다. 되돌릴 일이 생겼을 때 기존 설정이 남아 있으면 복구가 훨씬 빠릅니다.

    설정 이전은 앱마다 다릅니다. 기존 설정을 Flatpak 경로로 그대로 복사하면 될 때도 있지만, 버전 차이나 플러그인 경로 차이 때문에 오히려 문제를 만들 수 있습니다. 특히 IDE, 브라우저, 그래픽 도구는 “설정 폴더 전체 복사”보다 내보내기/가져오기 기능을 우선 쓰는 편이 낫습니다.

    가장 자주 본 실패 모드: 파일이 안 보이는 건 권한 모델 차이입니다

    Flatpak 전환 후 가장 흔한 문제는 “파일이 안 보인다”입니다. 배포판 패키지로 설치한 앱은 홈 디렉터리를 자연스럽게 읽는 경우가 많지만, Flatpak 앱은 샌드박스와 포털을 거칩니다. 그래서 다운로드 폴더는 보이는데 ~/projects, 외장 디스크, NAS 마운트, 숨김 디렉터리는 안 보이는 상황이 생깁니다. 근본 원인은 앱 버그가 아니라 파일시스템 권한이 앱에 부여되지 않았거나, 포털 파일 선택기를 통해 전달된 파일만 접근 가능한 상태인 경우가 많습니다.

    # 현재 권한 확인
    flatpak info --show-permissions org.gimp.GIMP
    
    # 현재 적용된 사용자 override 확인
    flatpak override --user --show org.gimp.GIMP
    
    # 특정 프로젝트 디렉터리만 읽기/쓰기 허용
    flatpak override --user --filesystem="$HOME/projects" org.gimp.GIMP
    
    # 읽기 전용으로만 허용하고 싶을 때
    flatpak override --user --filesystem="$HOME/reference:ro" org.gimp.GIMP
    
    # 홈 전체 접근을 허용하는 예시. 편하지만 격리 이점은 줄어듭니다.
    flatpak override --user --filesystem=home org.gimp.GIMP
    
    # override 초기화
    flatpak override --user --reset org.gimp.GIMP

    권한을 줄 때는 넓게 열기 전에 좁게 열어보는 편이 좋습니다. 이미지 편집 앱이 ~/projects/design만 필요하다면 해당 디렉터리만 허용합니다. 문서 편집기처럼 여러 작업 폴더를 오가야 한다면 xdg-documents, 특정 마운트 경로, 또는 홈 접근을 검토합니다. 다만 메신저, 뷰어, 단순 유틸리티에 홈 전체 권한을 주는 건 Flatpak을 쓰는 이유를 스스로 줄이는 선택입니다.

    개발 도구는 더 까다롭습니다. Flatpak IDE가 프로젝트는 보지만 시스템의 /usr/bin/python, Docker 소켓, SDK 경로, SSH agent, GPG agent를 기대대로 못 볼 수 있습니다. 이 경우 Flatpak이 나쁘다기보다 개발 환경 자체가 호스트 시스템과 강하게 결합돼 있기 때문입니다. IDE를 Flatpak으로 옮길 때는 “편집만 하는가, 빌드와 디버깅까지 하는가”를 기준으로 판단하세요. 빌드, 컨테이너, 디바이스 접근이 많다면 배포판 패키지, 공식 tarball, 또는 전용 툴박스 환경이 더 안정적일 수 있습니다.

    전환 후 검증: 실행되는지보다 어느 쪽이 실행되는지 보세요

    마이그레이션 검증은 앱이 켜지는 순간 끝나지 않습니다. 실제로 문제는 그 다음에 옵니다. 파일 더블클릭은 기존 앱으로 열리고, 메뉴 런처는 Flatpak을 띄우고, 터미널에서는 예전 바이너리가 실행되는 식입니다. 사용자는 같은 앱을 쓴다고 느끼지만, 시스템은 서로 다른 실행 단위를 다루고 있습니다.

    # Flatpak 앱 목록과 설치 범위
    flatpak list --app --columns=application,name,version,branch,installation
    
    # Flatpak 업데이트
    flatpak update
    
    # APT 쪽 동일 패키지 잔존 여부
    apt list --installed 2>/dev/null | grep -i '^gimp/' || true
    apt policy gimp
    
    # 실행 경로 확인
    command -v gimp || true
    which -a gimp || true
    
    # 데스크톱 파일 중복 확인
    find /usr/share/applications ~/.local/share/applications /var/lib/flatpak/exports/share/applications ~/.local/share/flatpak/exports/share/applications \
      -iname '*gimp*.desktop' 2>/dev/null -print
    
    # MIME 연결 확인 예시
    xdg-mime query default image/png
    xdg-mime query default image/jpeg

    flatpak list --app에 앱이 있고 flatpak run 앱ID로 정상 실행되면 Flatpak 설치는 된 겁니다. 하지만 apt list --installed에도 같은 앱이 남아 있으면 중복 설치 상태입니다. 이 자체가 항상 장애는 아니지만, 기본 앱 연결과 런처가 섞이면 사용성이 나빠집니다. 장기 운영에서는 하나로 정리하는 편이 낫습니다.

    업데이트 루틴도 분리해야 합니다. sudo apt upgrade는 APT 패키지를 갱신하고, flatpak update는 Flatpak 앱과 런타임을 갱신합니다. 둘 중 하나만 자동화하면 절반만 관리하는 셈입니다. 저는 데스크톱 장비에서는 주기적으로 둘 다 실행하고, 오래 안 쓰는 런타임은 flatpak uninstall --unused로 정리합니다.

    Flatpak 전환 후 앱 목록과 업데이트 상태 확인 화면

    APT 잔존 패키지, Flatpak 앱 목록, MIME 연결, 업데이트 상태를 한 화면에서 점검하는 대시보드형 이미지가 어울립니다.

    APT와 Flatpak을 같이 쓸 때의 패키지 관리 전략

    저는 데스크톱 Linux를 운영할 때 패키지를 세 부류로 나눕니다. 첫째, OS와 서비스에 붙은 패키지는 배포판 기본 관리 체계에 남깁니다. 둘째, 독립형 GUI 앱은 Flatpak 후보로 둡니다. 셋째, 개발 도구와 브라우저처럼 시스템 연동이 많은 앱은 테스트 후 결정합니다. 이 셋을 구분하지 않으면 패키지 관리가 취향 싸움처럼 흐릅니다.

    앱/구성요소 추천 이유 확인할 것
    OpenSSH, systemd 서비스, 서버 데몬 APT 유지 배포판 보안 업데이트, 로그, 서비스 관리와 강하게 연결 systemctl, journalctl, /etc 설정 흐름
    그래픽 편집기, 미디어 플레이어, 메신저 Flatpak 우선 검토 앱 단위 업데이트와 격리의 이점이 큼 파일 접근 권한, 포털 동작, 플러그인 경로
    브라우저 환경별 판단 보안 격리 장점이 있지만 인증서, 확장, 외부 앱 호출 이슈 가능 기본 브라우저 설정, 다운로드 경로, 패스키/인증 장치 연동
    IDE, SDK, Docker 연동 도구 신중히 테스트 호스트 도구, 소켓, 터미널, 빌드 체인과 많이 연결됨 프로젝트 권한, Docker socket, SSH/GPG agent, SDK 경로
    파일 관리자, 입력기, 드라이버 APT 권장 세션, 장치, 시스템 통합 의존도가 높음 데스크톱 환경 통합, 권한, 장치 접근

    현실적인 운영 예시는 이렇습니다. Ubuntu 데스크톱에서 SSH, Git, 빌드 도구, Docker 엔진은 APT로 유지합니다. GIMP, Inkscape, VLC, 일부 메신저는 Flatpak으로 둡니다. VS Code나 JetBrains IDE처럼 프로젝트 빌드와 컨테이너 연동이 많은 도구는 Flatpak으로 먼저 시험 설치한 뒤, 터미널 통합과 SDK 탐지가 불편하면 배포판 저장소나 공식 패키지로 돌아갑니다. 이 접근이 지저분해 보일 수 있지만, 실제 운영에서는 훨씬 덜 고장 납니다.

    자동화할 때는 두 세계를 분리해서 써야 합니다. APT는 apt-mark showmanual과 패키지 목록으로 관리하고, Flatpak은 앱 ID 목록으로 관리합니다. 아래처럼 간단한 목록 파일을 만들면 새 장비 세팅이 편해집니다. 관련 글을 운영한다면 “Ubuntu 초기 세팅 체크리스트”나 “Linux 백업 전략” 같은 내부 링크로 이어주기 좋습니다.

    # flatpak-apps.txt 예시
    org.gimp.GIMP
    org.inkscape.Inkscape
    org.videolan.VLC
    
    # 목록 파일 기반 설치
    while read -r app; do
      [ -z "$app" ] && continue
      flatpak install -y flathub "$app"
    done < flatpak-apps.txt
    
    # 현재 설치된 Flatpak 앱 ID만 추출
    flatpak list --app --columns=application > flatpak-apps-current.txt

    자주 묻는 질문

    Flatpak으로 바꾸면 APT는 안 써도 되나요?

    아닙니다. Debian/Ubuntu 계열에서는 APT가 시스템 패키지 관리의 중심입니다. Flatpak은 주로 데스크톱 GUI 앱을 배포판 릴리스 주기와 분리해 관리하기 위한 보조 축으로 보는 게 맞습니다.

    같은 앱을 APT와 Flatpak으로 같이 설치해도 되나요?

    짧은 테스트 기간에는 괜찮습니다. 다만 장기간 유지하는 건 추천하지 않습니다. 실행 경로, 설정 디렉터리, 파일 연결, 런처 항목이 섞이면 문제를 추적하기 어려워집니다. 테스트가 끝나면 한쪽으로 정리하세요.

    Flatpak 앱이 느리거나 무겁다고 봐야 하나요?

    앱과 런타임 구성에 따라 다르므로 일반화하면 안 됩니다. 다만 런타임이 별도로 설치되고 업데이트되기 때문에 디스크 사용량과 업데이트 대상이 늘 수 있습니다. 실제 판단은 du -sh /var/lib/flatpak ~/.local/share/flatpak, flatpak list --runtime으로 확인하는 게 정확합니다.

    마이그레이션 순서는 어떻게 잡는 게 좋나요?

    시스템 핵심 패키지가 아닌 독립형 GUI 앱부터 시작하세요. 앱별로 설치, 실행, 파일 열기/저장, 권한, 기본 앱 연결, 업데이트를 확인한 뒤 다음 앱으로 넘어가는 방식이 안전합니다.

    권한 관리는 CLI만 써야 하나요?

    아닙니다. CLI에서는 flatpak info --show-permissions와 flatpak override를 쓰고, GUI로는 Flatseal 같은 도구를 쓸 수 있습니다. 다만 자동화나 문서화가 필요하면 CLI 명령을 남겨두는 편이 재현성이 좋습니다.

    제가 권하는 최종 기준

    서버 운영, 시스템 구성, 드라이버, 입력기, 네트워크 도구, 서비스 데몬은 APT를 유지하세요. 이 영역은 배포판의 보안 업데이트와 서비스 관리 흐름을 타는 편이 안정적입니다. 반대로 그래픽 편집기, 미디어 플레이어, 메신저, 독립형 데스크톱 앱은 Flatpak으로 먼저 테스트할 가치가 있습니다. 최신 버전과 앱별 격리의 이점이 실제 사용성으로 이어질 가능성이 큽니다.

    브라우저와 개발 IDE는 중간 지대입니다. 브라우저는 인증서, 패스키, 외부 앱 호출, 다운로드 경로를 확인해야 합니다. IDE는 프로젝트 디렉터리, SDK, Docker, SSH/GPG agent, 터미널 통합까지 봐야 합니다. 이 항목에서 문제가 생기면 Flatpak을 고집하지 말고 배포판 패키지나 공식 패키지로 남기는 게 더 실용적입니다.

    제가 쓰는 한 줄 기준은 이렇습니다. 운영체제와 서비스는 APT, 독립형 데스크톱 앱은 Flatpak, 호스트와 깊게 엮인 개발 도구는 별도 검증. 이 기준만 잡아도 “설치했는데 왜 설정이 없지?”, “왜 터미널과 런처 결과가 다르지?”, “왜 프로젝트 폴더가 안 보이지?” 같은 시간을 꽤 줄일 수 있습니다.

    APT와 Flatpak 선택 기준 요약 인포그래픽

    서버 패키지, GUI 앱, 브라우저, 개발 도구별로 APT와 Flatpak 선택 기준을 나눈 인포그래픽이 마무리에 잘 맞습니다.

    마이그레이션은 도구 교체가 아니라 운영 모델 변경입니다. APT는 시스템의 기준선을 안정적으로 잡고, Flatpak은 사용자 앱 레이어를 더 유연하게 만듭니다. 둘을 섞어 쓰는 것이 타협처럼 보일 수 있지만, Linux 데스크톱을 오래 굴려보면 그게 가장 덜 피곤한 전략인 경우가 많습니다.

  • [Linux] Arch Linux 마이그레이션: Debian에서 Arch로 전환한 이유와 과정

    [Linux] Arch Linux 마이그레이션: Debian에서 Arch로 전환한 이유와 과정

    Arch Linux 마이그레이션: Debian에서 Arch로 전환한 이유와 과정

    홈랩을 굴리다 보면 한 번쯤은 운영체제 선택을 다시 보게 됩니다. 저도 꽤 오래 Debian을 메인 서버와 작업용 장비에 섞어 써왔는데요, 어느 순간부턴 패키지 흐름과 시스템 구성을 좀 더 제가 주도적으로 가져가고 싶어졌습니다. 결국 Arch Linux 마이그레이션을 직접 진행해봤고, 단순히 ‘최신 패키지가 좋아 보여서’가 아니라 실제로 왜 옮겼는지, 어떤 부분에서 만족했고 어디서 삽질했는지까지 정리해봤습니다. 혹시 지금 Debian을 쓰고 있는데 Linux 전환을 고민 중이라면, 이 글이 판단 기준을 잡는 데 도움이 될 겁니다.

    저는 13년 정도 인프라 일을 하면서 느낀 게 하나 있습니다. 운영체제는 정답보다 운영 방식이 더 중요하다는 점이죠. 안정성만 볼 건지, 패키지 최신성을 볼 건지, 아니면 시스템을 내가 어느 정도까지 이해하고 통제하고 싶은지에 따라 선택이 달라지거든요. 이번 글은 Arch가 무조건 낫다는 이야기가 아니라, Debian에서 Arch로 넘어갈 때 실제로 어떤 생각과 과정을 거치게 되는지를 경험 기준으로 풀어보는 글입니다.

    Debian에서 Arch로 전환하는 전체 흐름을 보여주는 개요 다이어그램

    Debian 환경 분석부터 Arch 설치, 데이터 이전, 검증까지의 전체 마이그레이션 흐름입니다.

    왜 Debian에서 Arch로 옮겼을까

    쉽게 말해 Debian은 예측 가능하고 안정적인 쪽에 강하고, Arch Linux는 가볍고 직접 구성하는 재미와 통제감이 큰 쪽입니다. 저도 한동안은 Debian 특유의 차분함이 정말 좋았거든요. 서버에 올려두면 조용히 자기 할 일 하면서 크게 신경 쓸 게 없으니까요. 근데 홈랩에서 이것저것 실험하다 보니, 새 도구를 붙일 때 패키지 흐름이 조금 답답하게 느껴지더라고요.

    특히 제가 중요하게 본 건 아래 세 가지였습니다.

    • 패키지 관리 흐름: 필요한 구성만 올리고 군더더기 없이 유지하고 싶었습니다.
    • 학습 효과: 시스템 부팅, 네트워크, initramfs(초기 RAM 파일시스템), bootloader(부트로더) 같은 기본기를 다시 손으로 만져보고 싶었습니다.
    • 변경 통제: 자동으로 많은 것이 깔리는 방식보다, 내가 설치한 것만 정확히 알고 운영하는 쪽이 편했습니다.

    물론 반대급부도 있습니다. Arch는 편하게 굴리려면 결국 문서를 자주 읽고, 변경 사항을 챙기고, 내 시스템을 내가 책임져야 하거든요. 이게 누군가에겐 귀찮음인데, 저한테는 오히려 장점이더라고요. 그래서 이번 Arch Linux 마이그레이션은 단순 교체가 아니라 운영 철학을 바꾸는 작업에 가까웠습니다.

    마이그레이션 전에 이해해야 할 개념

    저도 처음엔 ‘설치만 하면 비슷하지 않나?’ 싶었는데, 실제로는 접근 방식이 꽤 다릅니다. 여기서 중요한 개념 몇 가지를 먼저 짚고 가겠습니다.

    패키지 정책 차이

    Debian은 안정성 중심으로 검증된 패키지를 오래 유지하는 편입니다. 반면 Arch Linux는 rolling release(롤링 릴리스, 큰 버전 업그레이드 없이 지속적으로 최신 패키지를 반영하는 방식) 성격이 강합니다. 이 차이는 단순히 최신/구버전 문제가 아니라, 운영 리듬 자체를 바꿉니다.

    설치 철학 차이

    Debian은 설치 과정에서 비교적 많은 걸 잡아줍니다. Arch는 기본 뼈대만 주고, 나머지는 사용자가 조립하는 느낌이죠. 쉽게 말해 Debian이 ‘잘 정리된 공구함’이라면, Arch는 ‘공구는 줄 테니 네가 필요한 구조를 직접 만들라’에 가깝습니다.

    시스템 이해도 요구치

    Arch를 쓰면 파일시스템, 마운트, 네트워크, locale(로캘, 언어/지역 설정), user management(사용자 관리) 같은 기본 개념을 더 자주 보게 됩니다. 귀찮기도 한데요, 신기하게도 몇 번 삽질하고 나면 시스템이 훨씬 덜 무섭습니다. 이건 꽤 큰 장점이더라고요.

    항목 Debian Arch Linux
    운영 성향 안정성 중심 직접 구성, 최신 흐름 지향
    설치 난이도 비교적 친절함 수동 설정 비중이 큼
    패키지 흐름 보수적 빠른 반영
    학습 효과 운영 편의 중심 시스템 이해도 상승
    추천 대상 장기 안정 운영 구성 제어와 학습을 원하는 사용자

    마이그레이션 전에 제가 먼저 체크한 것들

    여기서 중요한 포인트! 운영체제 갈아타기 전에 제일 먼저 할 일은 설치 USB를 만드는 게 아닙니다. 현재 시스템 의존성 파악이 먼저거든요. 저도 초반에 이걸 대충 봤다가 서비스 하나가 안 떠서 한참 찾았습니다 ㅎㅎ

    1. 서비스 목록 정리: 웹서버, SSH, 컨테이너, cron(주기 작업), 모니터링 에이전트를 먼저 적어둡니다.
    2. 데이터 위치 확인: /etc, /var/lib, /srv, 사용자 홈 디렉터리처럼 실제 필요한 데이터가 어디 있는지 확인합니다.
    3. 패키지 의존성 확인: Debian에서 쓰던 패키지 이름이 Arch에서 그대로 통하지 않는 경우가 많습니다.
    4. 부팅 방식 확인: UEFI(통합 확장 펌웨어 인터페이스)인지 legacy BIOS인지 확인해야 합니다.
    5. 백업 검증: 백업이 있다는 것과 복구가 된다는 건 다릅니다. 작은 파일이라도 실제 복원 테스트를 해보세요.

    제가 실제로 메모했던 항목은 대략 이런 식이었습니다.

    # Debian 쪽에서 현재 상태 점검
    lsblk -f
    ip addr
    systemctl list-unit-files --type=service
    crontab -l
    sudo ss -tulpn
    sudo find /etc -maxdepth 2 -type f | sort

    이 단계가 지루해 보여도 정말 중요합니다. Arch Linux 마이그레이션은 설치보다 이전 대상 파악이 절반입니다.

    실전 설치 과정: Debian에서 Arch로의 전환 순서

    이제 본격적으로 설치 과정입니다. 저는 테스트 장비에서 먼저 한 번 해보고, 그 다음 실제로 쓰는 시스템에 적용했습니다. 그게 마음이 제일 편하더라고요.

    1. 설치 미디어로 부팅하고 네트워크 확인

    ip link
    ping -c 3 archlinux.org
    timedatectl

    유선이면 대부분 바로 잡히지만, 무선은 장비 따라 추가 설정이 필요할 수 있습니다. 시간 동기화가 꼬이면 나중에 패키지 검증이나 TLS(전송 계층 보안) 관련 문제가 생길 수 있어서 꼭 확인했습니다.

    2. 디스크 파티션과 파일시스템 준비

    lsblk
    fdisk /dev/sdX
    mkfs.fat -F32 /dev/sdX1
    mkfs.ext4 /dev/sdX2
    mount /dev/sdX2 /mnt
    mkdir -p /mnt/boot
    mount /dev/sdX1 /mnt/boot

    여기서 <code>/dev/sdX는 실제 디스크로 바꿔야 합니다. 이 부분은 정말 조심하셔야 합니다. 저도 예전에 습관적으로 명령 넣다가 다른 디스크를 건드릴 뻔한 적이 있거든요. ⚠️ 장비가 여러 개 달린 홈랩이면 특히 lsblk 결과를 두 번 보세요.

    Arch 설치 중 디스크 파티션과 마운트 구성을 보여주는 터미널 화면 또는 다이어그램

    UEFI 부팅용 파티션과 루트 파티션을 나누고, /mnt 아래에 마운트하는 흐름을 시각화한 이미지입니다.

    3. 기본 시스템 설치

    pacstrap /mnt base linux linux-firmware vim networkmanager sudo
    genfstab -U /mnt >> /mnt/etc/fstab
    arch-chroot /mnt

    처음엔 이게 뭔가 싶었는데, 생각보다 구조는 단순합니다. pacstrap으로 기본 시스템을 넣고, genfstab으로 마운트 정보를 만들고, arch-chroot로 새 시스템 안에 들어가는 방식이거든요.

    4. 시간대, 로캘, 호스트명 설정

    ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
    hwclock --systohc
    vim /etc/locale.gen
    locale-gen
    echo "LANG=ko_KR.UTF-8" > /etc/locale.conf
    echo "arch-host" > /etc/hostname

    /etc/hosts도 함께 맞춰두는 편이 좋습니다.

    cat > /etc/hosts <<'EOF'
    127.0.0.1 localhost
    ::1       localhost
    127.0.1.1 arch-host.localdomain arch-host
    EOF

    5. 네트워크와 사용자 설정

    systemctl enable NetworkManager
    passwd
    useradd -m -G wheel -s /bin/bash myuser
    passwd myuser
    EDITOR=vim visudo

    visudo에서 wheel 그룹 sudo 권한을 활성화합니다. 저는 최소 권한 원칙을 좋아해서, 처음엔 꼭 필요한 계정만 만들고 나중에 확장하는 편입니다.

    6. 부트로더 설정

    pacman -S grub efibootmgr
    grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
    grub-mkconfig -o /boot/grub/grub.cfg

    부팅 환경은 장비마다 차이가 큽니다. 그래서 저는 이 단계에서 절대 서두르지 않습니다. 설치가 다 된 것 같아도, 사실 가장 긴장되는 순간은 첫 재부팅 직전이거든요.

    7. 재부팅 후 기본 패키지 정리

    exit
    umount -R /mnt
    reboot

    부팅이 올라오면 SSH, 에디터, 모니터링 도구, 컨테이너 런타임 같은 필수 패키지를 하나씩 올립니다. Debian에서 쓰던 환경을 그대로 복제하려 하기보다, 정말 필요한 구성만 다시 쌓는다는 느낌으로 접근하니 훨씬 깔끔했습니다.

    설정과 데이터 이전은 이렇게 했습니다

    운영체제를 바꾸는 것보다 더 중요한 건 서비스 복구입니다. 특히 홈랩이나 개인 서버는 ‘부팅 성공’보다 ‘기존 워크로드가 제대로 도는가’가 핵심이죠.

    1. /etc 설정 비교: 서비스 설정 파일을 그대로 덮어쓰기보다, 새 기본 설정과 비교하며 필요한 값만 반영했습니다.
    2. 데이터 디렉터리 이전: 애플리케이션 데이터는 rsync(증분 복사 도구)로 옮겼습니다.
    3. 비밀 정보 분리: 키 파일, 인증서, 토큰은 따로 점검했습니다.
    4. 서비스 단위 재기동: 한 번에 다 올리지 말고 서비스별로 검증했습니다.
    sudo rsync -avh /old-root/etc/nginx/ /etc/nginx/
    sudo rsync -avh /old-root/var/lib/docker/ /var/lib/docker/
    sudo systemctl daemon-reload
    sudo systemctl restart nginx
    sudo systemctl status nginx

    근데 여기서 함정이 하나 있습니다. Debian에서 잘 돌던 설정이 Arch에서도 그대로 맞는다고 생각하면 안 된다는 거죠. 경로, 기본 서비스명, 패키지 분리가 조금씩 다를 수 있거든요. 저도 여기서 몇 번 멈췄습니다.

    기존 Debian 설정을 Arch로 이전하면서 rsync와 서비스 점검을 수행하는 장면

    설정 파일 비교, 데이터 복사, systemd 서비스 재시작과 상태 확인 과정을 보여주는 이미지입니다.

    ⚠️ 실제로 겪었던 문제와 해결 방법

    이 섹션은 좀 현실적으로 가보겠습니다. 설치 과정 문서만 보면 다 매끈하게 끝날 것 같지만, 실제 Linux 전환은 꼭 한두 군데서 걸립니다.

    문제 1. 네트워크는 잡혔는데 이름 해석이 이상함

    부팅은 됐는데 외부 패키지 저장소 접근이 들쑥날쑥했던 적이 있었습니다. 확인해보니 DNS(도메인 네임 시스템) 설정이 기대와 다르게 잡혀 있더라고요.

    resolvectl status
    systemctl status NetworkManager

    해결은 단순했습니다. NetworkManager가 관리하도록 두고, 중복 네트워크 설정 파일을 정리했습니다. 여러 네트워크 관리 도구를 섞어 쓰면 꼭 꼬이더라고요.

    문제 2. 부팅은 되는데 원하는 커널 옵션이 반영되지 않음

    이건 주로 GRUB 설정 재생성을 빼먹었을 때 생겼습니다. 설정 파일만 수정하고 끝낸 줄 알았는데 실제 부팅 메뉴에는 반영이 안 된 거죠.

    grub-mkconfig -o /boot/grub/grub.cfg

    별거 아닌데, 처음엔 왜 안 되지 싶어서 한참 봤습니다 ㅎㅎ

    문제 3. 서비스는 설치됐는데 자동 시작이 안 됨

    Debian에서 당연히 올라오던 서비스가 Arch에선 비활성 상태인 경우가 있었습니다. 특히 설치와 활성화가 분리돼 있다는 걸 잠깐 잊고 있었거든요.

    systemctl enable --now sshd
    systemctl enable --now docker

    이건 systemd(시스템 및 서비스 관리자) 운영할 때 자주 보는 패턴이라, 설치 후 enable --now 습관을 들이면 편합니다.

    문제 4. 예전 설정을 통째로 덮어써서 오히려 꼬임

    제가 가장 크게 삽질한 부분입니다. 예전 /etc 설정을 거의 그대로 가져왔더니 새 환경 기본값과 충돌하더라고요. 여기서 배운 건 하나입니다. 설정은 이관이 아니라 재해석이 필요하다는 거죠. 특히 네트워크, 로깅, 인증 관련 설정은 꼭 새 기본 파일과 비교하세요.

    검증과 결과: 마이그레이션이 끝났는지 어떻게 확인할까

    운영체제 설치가 끝났다고 마이그레이션이 끝난 건 아닙니다. 실제 검증 항목이 통과해야 비로소 끝난 거죠. 저는 아래 순서로 확인했습니다.

    1. 부팅 확인: 재부팅 후 정상 로그인 가능 여부
    2. 네트워크 확인: 내부 통신, 외부 통신, DNS 확인
    3. 서비스 확인: 웹, SSH, 컨테이너, 스케줄러 점검
    4. 로그 확인: journalctl로 에러 여부 점검
    5. 리소스 확인: 디스크 마운트, 메모리, 프로세스 상태 확인
    systemctl --failed
    journalctl -p 3 -xb
    df -h
    free -h
    ss -tulpn

    제가 직접 해보니, Arch로 옮기고 나서 가장 만족스러웠던 부분은 시스템이 가볍고 구조가 머릿속에 잘 들어온다는 점이었습니다. 내가 뭘 설치했고, 왜 돌아가고 있는지 추적이 쉽더라고요. 반면 운영 자동화가 덜 되어 있어서, 손이 더 가는 순간도 분명히 있습니다. 그래서 개인적으로는 ‘무조건 전환’보다 ‘내가 원하는 운영 방식에 맞는가’를 기준으로 보시는 걸 추천드립니다.

    마이그레이션 완료 후 서비스 상태, 디스크 사용량, 로그 점검 결과를 보여주는 운영 대시보드 스타일 이미지

    서비스 정상 상태, 디스크 마운트, 시스템 로그 점검 등 마이그레이션 검증 결과를 시각화한 이미지입니다.

    Debian과 Arch, 누구에게 더 맞을까

    사실 이 질문이 제일 중요합니다. 둘 다 좋은 운영체제인데, 쓰는 사람의 목적이 다를 뿐이죠.

    • Debian이 더 맞는 경우: 장기 안정 운영, 표준화된 서버 환경, 예측 가능한 업데이트를 선호할 때
    • Arch가 더 맞는 경우: 직접 구성, 최신 패키지 흐름, 시스템 학습 효과, 가벼운 환경을 원할 때

    저는 홈랩과 개인 작업 환경에서는 Arch가 꽤 잘 맞았습니다. 하지만 모든 프로덕션 서버에 바로 동일하게 들이밀 생각은 없습니다. 역할이 다르니까요. 이 균형감이 중요합니다.

    자주 묻는 질문

    Q. Debian에서 Arch로 바로 넘어가도 될까요?

    가능은 합니다. 다만 메인 장비 하나만 있는 상태라면 먼저 테스트 장비나 가상머신에서 설치 과정을 한 번 돌려보는 걸 추천드립니다. 저도 그게 훨씬 안전했습니다.

    Q. Arch Linux 마이그레이션이 초보자에게도 괜찮을까요?

    초보자도 할 수는 있지만, 부팅 구조와 파일시스템, 네트워크 기본 개념을 조금 알고 시작하면 훨씬 덜 힘듭니다. 아무것도 모른 채 시작하면 중간에 왜 안 되는지 판단이 어렵거든요.

    Q. 기존 Debian 설정 파일은 그대로 복사하면 되나요?

    일부는 가능하지만, 통째로 덮어쓰는 건 추천하지 않습니다. 새 환경 기본 설정과 비교해서 필요한 값만 옮기는 방식이 안전합니다.

    마무리: 운영체제를 바꾸는 게 아니라 운영 방식을 바꾸는 일

    이번 Arch Linux 마이그레이션을 하면서 다시 느낀 건, 운영체제 전환은 설치 이벤트가 아니라 운영 습관의 재설계라는 점입니다. Debian에서는 안정성과 편의성을 많이 얻었고, Arch에서는 통제감과 학습 효과를 얻었습니다. 둘 중 뭐가 더 낫다기보다, 내가 어떤 엔지니어링 경험을 원하는지가 더 중요하더라고요.

    혹시 지금 Debian에서 다른 배포판으로 Linux 전환을 고민하고 계신다면, 먼저 서비스 의존성부터 정리해보세요. 그 다음 테스트 환경에서 설치를 한 번 끝까지 밀어보면 감이 확 옵니다. 드디어 됐다! 하는 순간도 분명히 오고요. 반대로 ‘아, 이건 내 운영 스타일이 아니구나’를 빨리 깨닫는 것도 큰 수확입니다.

    다음 글에서는 이번 환경을 바탕으로 systemd 서비스 정리와 백업 자동화를 어떻게 붙였는지 이어서 다뤄볼 예정입니다. 이전 글에서 홈랩 스토리지 구성 이야기를 보셨다면, 이번 마이그레이션과 함께 보면 더 흐름이 잘 보이실 겁니다.

    Debian과 Arch의 선택 기준을 요약한 비교 인포그래픽

    안정성, 최신성, 학습 효과, 운영 편의성 관점에서 Debian과 Arch 선택 기준을 요약한 인포그래픽입니다.