시스템 · 서버기초 · 20분 읽기

배포판·패키지와 실행 환경

배포판과 저장소, 패키지 관리 도구, 실제 실행 파일의 위치를 함께 확인해야 환경 차이를 이해할 수 있습니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 저장소 메타데이터·패키지 파일·설치 상태의 관계를 설명한다.
  2. 패키지 설치와 현재 프로세스·실행 경로의 차이를 추적한다.
  3. 업데이트 전후 의존성과 서비스 영향을 확인한다.
먼저 알면 좋은 개념Linux 파일과 경로 읽기

01배포판의 사용자 공간과 실행 중인 커널을 구별하기

  • 라는 커널을 공통으로 사용해도 패키지 형식, 기본 경로, 서비스 이름, , 보안 정책은 배포판마다 다르다.
  • /etc/의 ID는 식별자, ID_LIKE는 호환 계열, VERSION_ID는 릴리스를 뜻한다.
  • uname -r은 현재 실행 중인 커널 버전이다.
  • 컨테이너에서는 이 여도 커널은 호스트의 것을 공유하므로 두 출력이 서로 다른 계열을 가리킬 수 있다.
  • 을 사용하는 RHEL··Fedora가 모두 같은 와 수명주기를 갖는 것은 아니다.
    • ·는 와 계열을 사용한다.
  • CPU 도 패키지 선택의 일부이며 x86_64용 바이너리를 aarch64 시스템에 복사했다고 바로 실행할 수 있는 것은 아니다.
  • ·릴리스·는 설치 절차를 선택하는 좌표다.
bash
cat /etc/os-release
uname -r
uname -m
command -v rpm
command -v dpkg

교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.

02패키지 파일, 설치 데이터베이스, 저장소 관리자의 관계

  • 패키지에는 프로그램 파일과 함께 이름·버전··의존성·설치 스크립트·설정 파일 정보 같은 메타데이터가 들어간다.
  • 이나 는 로컬 패키지를 설치하고 설치 데이터베이스를 관리하는 기반 도구다.
  • 와 는 를 조회하고 의존 관계를 해결하여 여러 패키지를 하나의 설치 계획으로 묶는다.
  • 패키지 파일 하나를 수동으로 설치하는 작업과 에서 필요한 구성 요소를 함께 선택하는 작업의 층이 다르다.
    • 예를 들어 웹 서버 패키지가 특정 를 필요로 하면 관리자는 현재 설치 상태와 의 후보 버전을 비교해 충족 가능한 조합을 찾는다.
  • 내려받기 전에 설치·업그레이드·제거 예정 목록을 보여 주는 이유가 여기에 있다.
  • 과 패키지 검증은 신뢰한 배포자가 제공한 자료인지 검사하는 부분이며, 단순히 파일이 다운로드되었다는 사실과 구별된다.
  • 서로 다른 릴리스의 를 섞으면 의존성을 형식상 충족해도 ABI와 지원 관계가 깨질 수 있다.
LEARN THROUGH PRACTICE

저장소의 모듈 목록과 실제 설치 버전 구별하기

사용 가능한 패키지 선택지, 설치 데이터베이스, 실행 파일 버전을 구분하여 버전 확인 결과를 해석한다.

실습 구성과 전제

  • 의 모듈 목록과 의 는 서로 다른 시스템 사례다. 같은 서버에서 이어 실행한 결과가 아니다.
  • 화면의 버전은 촬영 시점의 상태다. 현재 권장 버전이나 최신 버전 목록으로 읽지 않는다.
  1. module list를 설치 목록으로 오해하지 않는다

    • 의 모듈 목록에는 이름·스트림·프로필과 표시 기호가 나온다. 스트림은 이 제공하는 패키지 계열의 선택지이며, 여러 줄이 모두 설치되어 있다는 뜻은 아니다.
    • 기본값 표시 [d]와 ·설치 표시는 서로 다르다. 출력 하단의 기호 설명과 구성을 함께 읽어야 한다.
    bash
    dnf module list php
    rpm -q php
    php --version

    모듈을 제공하는 계열 환경의 조회 예시다.

    5/26 - php, mariaDB · 실습·개념 참고 화면 4원본 크기로 보기 ↗
    • MariaDB·nginx·PHP 등 이름 아래에 여러 버전 스트림이 나열된다.
    • 각 스트림에는 프로필과 [d] 같은 표시가 붙어 있어 단순 버전 문자열 이상의 상태를 담는다.
    확인 기준

    사용 중인 버전을 확인하려면 설치 데이터베이스와 실행 파일을 추가 조회한다. 모듈을 제공하지 않는 버전에서는 같은 출력이 나오지 않을 수 있다.

  2. 설치 데이터베이스의 이름·버전을 읽는다

    • -W는 계열 설치 데이터베이스에서 지정 패키지를 조회한다. 화면의 두 제품 버전은 이 시스템에 등록된 패키지 정보다.
    • 패키지가 설치되었다고 서비스가 정상 실행 중인 것은 아니다. 설정 오류나 중지 상태는 서비스 조회로 별도 확인한다.
    bash
    dpkg-query -W -f='${Package}\t${Version}\t${db:Status-Status}\n' nginx

    계열에서 버전과 설치 상태 필드를 함께 읽는 재구성 예시다.

    9/1 - beat, nessus · 명령·상태 출력 1원본 크기로 보기 ↗
    • dpkg-query -W 뒤에 elasticsearch와 kibana 두 패키지명이 지정되어 있다.
    • 결과는 제품별 한 줄로 버전을 출력하며, 두 줄 모두 9.5.2가 보인다.
    확인 기준

    조회 오류와 비어 있는 결과를 성공적인 미설치 확인과 혼동하지 않는다. 패키지명 및 명령 종료 상태도 함께 읽는다.

  3. 실행되는 파일의 출처까지 연결한다

    • 에서 먼저 찾은 프로그램이 방금 조회한 패키지의 실행 파일인지 확인한다. 별도 설치한 버전이나 가상 환경이 앞에 있을 수 있다.
    • 명령 경로를 찾은 뒤 -qf 또는 -S로 소유 패키지를 연결한다. 패키지 버전과 프로그램의 자체 버전 표기는 수정 번호 등으로 형태가 다를 수 있다.
    bash
    command -v php
    readlink -f "$(command -v php)"
    # RPM 계열: rpm -qf /실제/실행파일
    # Debian 계열: dpkg-query -S /실제/실행파일

    경로를 먼저 확인한 다음 해당 의 파일 소유 조회를 적용한다.

    확인 기준

    설치 버전과 실행 버전이 다르면 를 바로 바꾸기보다 실제 경로·심볼릭 링크·가상 환경부터 확인한다.

실습에서 확인한 동작 원리

  • 의 선택지, 설치 기록, 실행 중인 프로그램은 서로 다른 관찰 지점이다.
  • 목록의 버전 숫자만 비교하지 말고 스트림 표시·설치 상태·실행 경로를 함께 연결한다.

설정·출력 추가로 확인하기 3장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 1장
5/26 - php, mariaDB · 실습·개념 참고 화면 3원본 크기로 보기 ↗
  • 에 삽입된 원본 학습 화면이다. inxi의 CPU·메모리·저장장치·네트워크·배포판·저장소 등 분야별 조회 옵션을 정리한 화면이다.
실습 화면 묶음 02 2장
팀 · 실습·개념 참고 화면 3원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. 배포판·패키지와 실행 환경 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
팀 · 실습·개념 참고 화면 6원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. 배포판·패키지와 실행 환경 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
동작·명령 참고 문서

03패키지 갱신, 제거와 설정 파일의 수명

  • 갱신은 이용 가능한 버전 목록을 새로 받는 작업이다.
  • 계열의 는 이 단계이며 실제 설치된 패키지 업그레이드와 다르다.
  • 설치된 바이너리가 바뀌어도 실행 중인 는 이전 나 이미 매핑된 라이브러리를 사용할 수 있다.
  • 그래서 패키지 갱신과 서비스 재시작, 커널 갱신과 새 커널로 재부팅하는 단계를 구별해야 한다.
  • 제거할 패키지가 다른 패키지의 의존성으로 사용되면 함께 영향을 받는 범위를 계산한다.
  • 자동으로 설치된 의존성을 정리하는 autoremove는 의존성 기록에 기초하므로 사람이 실제로 사용하는 프로그램까지 자동 설치 상태로 남겨 두지 않았는지 의미를 이해해야 한다.
    • 설정 파일 보존 방식도 도구마다 다르다.
  • 의 기본 파일과 관리자가 수정한 파일이 충돌하면 별도 새 파일을 남기거나 선택을 요구할 수 있으므로 업그레이드를 모든 설정의 무조건 덮어쓰기로 생각하지 않는다.
bash
# RHEL 계열의 조회 예시
dnf repolist
dnf info bash
rpm -q bash
rpm -ql bash
# Debian 계열의 조회 예시
apt-cache policy bash
dpkg-query -L bash

교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.

04명령 이름에서 실제 실행 파일까지 추적하기

  • 셸에 입력한 이름이 곧 디스크 파일이라고 단정할 수 없다.
  • alias, 함수, builtin, 해시된 경로, 검색이 명령 해석에 관여한다.
  • Bash에서 type -a는 여러 후보를 보여 주고 command -v는 현재 해석 결과를 알려 준다.
  • which는 별도 프로그램이라 셸의 함수나 별칭 상태를 완전히 반영하지 못할 수 있다.
  • 경로가 확인되어도 심볼릭 링크를 따라간 실제 파일과 alternatives가 선택한 구현을 다시 구분한다.
  • 프로그램 파일의 소유 패키지는 -qf 또는 -S로 찾는다.
  • /usr/local/bin에 수동 설치한 파일은 데이터베이스에 없을 수 있다.
  • 인터랙티브 셸과 서비스는 와 환경 변수가 다를 수 있으므로 서비스의 ExecStart와 /proc/PID/exe가 실제 실행 대상을 보여 준다.
  • 파일이 교체된 뒤 이전 가 남아 있는 경우에는 버전 명령만 새 셸에서 실행해서는 현재 서비스의 버전을 설명할 수 없다.
bash
type -a python3
command -v python3
readlink -f /usr/bin/python3
systemctl show demo.service -p ExecStart -p MainPID

교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.

05공유 라이브러리와 Python 패키지를 혼동하지 않기

  • 동적 실행 파일은 가 필요한 를 찾은 뒤 실행을 이어 간다.
  • 실행 파일 자체의 위치가 맞아도 필요한 라이브러리나 호환 심볼이 없으면 적재가 실패할 수 있다.
  • readelf -d의 NEEDED 항목은 필요한 라이브러리를 정적으로 살펴보는 방법이고, ldconfig 캐시는 시스템 라이브러리 검색에 관여한다.
    • 신뢰하지 않는 실행 파일에 분석 도구를 적용할 때는 그 도구가 파일을 실제로 실행할 수 있는지도 구분한다.
  • 모듈은 인터프리터의 sys.에서 찾는다.
  • 가상 환경, 사용자 설치, 설치가 섞이면 같은 import 이름으로 다른 버전이 선택될 수 있다.
  • python3 -m 는 그 python3에 연결된 를 사용한다는 의미다.
  • 운영체제 패키지 관리자는 시스템 구성 요소의 의존성을 관리하고 가상 환경은 프로젝트의 모듈 집합을 분리하므로 두 범위를 한 디렉터리에서 무분별하게 덮어쓰지 않는다.
bash
readelf -d /usr/bin/ls
python3 -m pip show requests
python3 -c "import sys; print(sys.executable); print(*sys.path, sep=chr(10))"

교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.

06Anaconda·conda와 실제 Python 실행 환경

  • 은 ··분석 패키지 등을 묶은 이다. 는 그 안에서도 사용되는 패키지·환경 관리자이며 언어나 자체가 아니다.
  • 환경은 서로 다른 실행기·패키지 조합을 별도 경로로 관리한다. 한 환경에 설치한 모듈이 다른 환경의 에서도 자동으로 보이는 것은 아니다.
  • activate는 현재 셸의 와 환경 변수 등을 조정한다. 기존 서비스나 다른 터미널, 이미 떠 있는 Notebook 커널의 실행기를 자동 교체하지 않는다.
  • 프롬프트의 (base)는 기본 환경이 활성화됐다는 표시일 수 있다. 이 표시는 독립 운영체제나 보안 샌드박스 안에 있다는 뜻이 아니다.
  • 터미널과 편집기·Notebook에서 sys.executable을 비교하면 실제로 어느 이 코드를 실행하는지 알 수 있다. 패키지를 재설치하기 전에 이 경계를 확인한다.
  • 환경 이름만 남기기보다 ·패키지 버전과 ·플랫폼 조건을 기록한다. 정확한 빌드 조합을 보존하는 파일과 다른 OS로 옮길 요구 목록은 목적이 다르다.
bash
conda env list
python -c "import sys; print(sys.executable)"
python -m pip --version

조회용 교육 예시. 이 페이지를 작성하면서 실행하지 않았으며 와 해당 환경의 이 설치되어 있다고 가정한다.

원리 심화

07패키지 후보와 설치 가능한 조합은 다르다

  • 설치 DB는 현재 설치한 이름·버전·파일의 정보이며 는 이용 가능한 후보와 의존성을 제공한다. 목록 갱신만으로 설치 상태가 바뀌지는 않는다.
  • 계열의 는 이름·epoch·version·release·architecture를 구별한다. 같은 upstream 버전 문자열이라도 release와 가 다른 패키지일 수 있다.
  • 해결기는 요청한 패키지뿐 아니라 요구·충돌·제공 관계를 만족하는 조합을 찾는다. 최신 후보가 보인다는 사실과 그 후보를 현재 조합에 설치할 수 있다는 사실은 별개다.
  • 의 --best는 직접 요청한 패키지의 최신 후보를 우선하여 해결하고 불가능하면 이유를 보고할 수 있다. 모든 의존 패키지를 무조건 가장 큰 버전으로 고른다는 뜻은 아니다.
  • --downloadonly는 필요한 패키지를 내려받되 를 실행하지 않는 기능이다. 파일 보유· 검증·실제 설치 DB 갱신·서비스 반영은 각각 다른 완료 기준이다.
예제로 추적

08check-update의 100은 실패 코드가 아닐 수 있다

  • 여기서는 문서화된 동작을 예로 든다. 다른 프로그램이나 구현·명령의 종료값을 이 표에 그대로 대입하지 않는다.
  • 사용 가능한 업데이트가 없으면 0을 반환한다. 모든 보안 문제가 없다는 판정이 아니라 현재 설정된 와 검사 범위의 결과다.
  • 업데이트가 있으면 후보 목록과 함께 100을 반환한다. 자동화가 0 외의 모든 값을 실행 오류로 기록하면 정상적인 업데이트 발견을 장애로 잘못 분류한다.
  • 검사 중 오류는 1로 보고할 수 있다. 이 경우 업데이트 없음으로 저장하지 말고 stderr· 접근· 또는 메타데이터 오류를 분리해 기록한다.
  • 후보가 보고돼도 실제 는 의존성 등의 제약을 다시 적용한다. 발견 목록을 곧바로 설치 완료 목록으로 사용하는 집계는 틀린다.
가상 종료값의미자동화 분류
0업데이트 없음조회 성공 / 변화 없음
100업데이트 후보 존재조회 성공 / 후보 있음
1조회 오류결과 미확정
검증·예외

09업데이트 후 버전 불일치를 네 지점에서 해석하기

  • 먼저 type -a·command -v의 선택 결과로 별칭·가상환경· 앞쪽 수동 설치를 구별한다. 패키지 관리자가 갱신한 파일과 실제 실행 파일이 다를 수 있다.
  • -qf나 -S가 가리키는 소유 패키지와 파일 경로를 연결한다. 패키지 DB 밖에 있는 파일은 관리자가 새 버전을 설치해도 그대로 남을 수 있다.
  • 디스크 파일이 교체돼도 장기 실행 가 이전 실행 파일·라이브러리 매핑을 보유할 수 있다. 새 셸에서 --version을 한 번 실행한 결과로 기존 서비스를 대표하지 않는다.
  • 패키지 업데이트의 설정 보존 정책에 따라 기존 수정본과 새 기본 설정이 따로 남을 수 있다. 실제 가 읽은 경로와 최종 적용값을 확인해야 한다.
  • 은 수정 사항을 이전 upstream 버전에 backport할 수 있다. 버전 숫자만 비교하기보다 패키지 release·보안 공지와 적용 거래를 대조한다.

10변경 전후 확인

  • 업데이트에는 파일 교체뿐 아니라 설정 형식 변화, 의존성 변경, 서비스 재시작이 따를 수 있다.
  • 변경 대상과 영향 범위를 확인하고 필요한 경우 이전 상태로 돌아갈 절차를 준비한다.
    • 설치 성공 메시지는 서비스 정상 동작 검증을 대신하지 않는다.
bash
cat /etc/os-release
uname -m
command -v python3
python3 --version

··현재 선택된 실행 환경을 조회한다.

11패키지가 설치되기까지의 단계

  • 패키지 관리자는 의 이름·버전·의존성 같은 메타데이터와 현재 설치 상태를 비교한다.
  • 설치나 업그레이드 요청에서는 필요한 의존성을 계산하고 거래 단위의 변경 목록을 만든다.
  • 패키지 파일을 받아 출처·무결성 검증을 거친 뒤 파일과 패키지 데이터베이스를 갱신한다.
  • 패키지에 포함된 설치 후 처리도 실행될 수 있으므로 이는 파일 압축을 푸는 것보다 넓은 변경이다.
    • 구체적인 순서와 보증은 도구와 패키지 형식에 따라 다르다.
  • 목록을 갱신하는 단계는 설치 후보에 대한 정보를 새로 읽는 것이다.
    • 설치된 프로그램의 실행 파일을 교체하는 단계와 구분해야 한다.
  • 또한 디스크의 실행 파일이 교체돼도 이미 떠 있는 가 같은 코드나 라이브러리를 계속 사용하고 있을 수 있다.
  • 업데이트 완료 이후 서비스 재시작 또는 시스템 재부팅 필요 여부를 안내와 도구의 진단으로 확인한다.
    • 단순히 버전 출력 한 번으로 모든 실행 중 구성 요소의 상태를 설명할 수는 없다.
  1. 현재 정보로 제공 버전을 확인한다.
  2. 요청 패키지뿐 아니라 함께 바뀔 항목을 검토한다.
  3. 정책에 맞는 패키지를 설치 상태에 반영한다.
  4. 새 파일과 현재 실행 중인 프로그램이 같은 상태인지 확인한다.

설명과 함께 보는 보조 도식

처리 과정

설치 정보와 실행 중 상태

메타데이터 갱신, 패키지 설치, 실행 반영을 서로 다른 단계로 보여 준다.

전체 단계를 한 번에 읽기
  1. 01

    후보 조회

    현재 저장소 정보로 제공 버전을 확인한다.

    설치 변경
    아직 없음
  2. 02

    의존성 계산

    요청 패키지뿐 아니라 함께 바뀔 항목을 검토한다.

    범위
    의존 패키지 포함
  3. 03

    검증 후 설치

    정책에 맞는 패키지를 설치 상태에 반영한다.

    관찰
    설치 버전
  4. 04

    실행 반영 확인

    새 파일과 현재 실행 중인 프로그램이 같은 상태인지 확인한다.

    추가 확인
    서비스 재시작 필요 여부
학습 모식도. 표시한 조건에서의 객체와 상태 변화를 설명하며 운영 환경의 모든 분기와 내부 구현은 생략한다.

12설치됐는데 명령 결과가 다른 이유

  • command -v 같은 조회로 현재 셸이 선택한 경로를 먼저 확인한다.
  • 앞쪽의 가상환경이나 사용자 설치 경로가 패키지보다 먼저 선택될 수 있고, 같은 이름의 별칭·함수도 영향을 준다.
  • 패키지 관리자가 보고한 파일의 소유 패키지와 현재 실행 경로를 연결하면 설치 상태와 사용 상태를 구별할 수 있다.
  • 다른 셸·서비스·예약 작업은 환경 변수가 다르므로 터미널에서의 성공만으로 자동 실행 환경을 검증하지 않는다.
  • 문제 재현에는 , , 패키지 출처, 버전, 가상환경과 실행 경로를 함께 기록한다.
  • 의존성 충돌에서는 특정 라이브러리만 임의 덮어쓰거나 시스템 을 교체하기보다 어떤 프로그램이 어떤 버전을 요구하는지 먼저 확인한다.
  • 보안 수정은 이 기존 버전에 역이식할 수 있으므로 상위 프로젝트의 버전 숫자만으로 취약 여부를 단정하지 않는다.
  • 변경 목록과 서비스 응답을 비교해야 업데이트로 해결된 문제와 새로 생긴 문제를 분리할 수 있다.
구성·관찰 대상확인하는 정보구분할 문제
후보제공 버전·출처오래된 목록과 설치 실패
설치 데이터베이스설치 버전·소유 파일다른 경로의 수동 설치
현재 셸·별칭·가상환경예상과 다른 프로그램 선택
실행 사용 중 코드·라이브러리설치 후 미반영
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

공식 가이드

Anaconda Distribution과 Miniconda의 구성 비교

과 절에서 처음 설치되는 도구와 패키지를 비교한다. , 관리자, 의 관계를 나눈 뒤 프로젝트별 환경을 만드는 이유로 연결한다.

읽으면서 확인할 것
  • 두 설치 묶음이 공통으로 제공하는 와
  • Navigator와 미리 포함된 패키지의 차이
  • 을 설치한 상태와 특정 프로젝트 환경을 선택한 상태의 구별
실습 가이드

conda 활성화·내보내기로 실행 환경 추적

Activating an environment에서 · 스크립트의 역할을 읽고 Managing environments의 내보내기 예제로 이동한다. 활성 환경 표시와 실제 실행기·패키지·플랫폼을 함께 기록하는 학습 경로다.

읽으면서 확인할 것
  • 가 현재 터미널 세션에 적용되는 범위
  • 대화형 셸과 비대화형 스크립트의 초기화 차이
  • 이식용 요구 목록과 특정 플랫폼의 정확한 패키지 명세의 차이
학습 확인

이해했는지 확인하기

  • 배포판·아키텍처·패키지 버전을 따로 확인한다.
  • 저장소 갱신과 패키지 업그레이드를 구분한다.
  • 실행 파일과 라이브러리의 출처를 추적한다.

함께 확인할 공식 자료