12. 패키지와 업데이트
apt update는 목록만 갱신한다 — 실제로 설치하는 것은upgrade다. 이 둘을 헷갈린 채로 “업데이트했다”고 말하는 일이 놀랄 만큼 많다
이 장에서 처음 나오는 말5개
apt / dpkgdpkg는 .deb 파일 하나를 설치·제거하는 저수준 도구,apt는 저장소에서 받아 오고 의존성을 풀어 주는 상위 도구다. 문제가 나면 apt로 고치고, "이 파일 어느 패키지 거지"는 dpkg로 묻는다.저장소repository- 패키지를 배포하는 서버. Ubuntu는
main(공식 지원) ·universe(커뮤니티) ·restricted·multiverse로 나뉘고, 보안 패치는-security저장소로 온다. deb822- 24.04부터 표준이 된 새 저장소 설정 형식. 한 줄짜리
sources.list대신 여러 줄 키–값 형태의.sources파일을 쓴다 — 서명 키를 명시적으로 적을 수 있어 안전하다. unattended-upgrades- 보안 업데이트를 자동으로 설치해 주는 패키지. Ubuntu 서버에 기본 설치·활성화돼 있다 — "아무도 안 건드렸는데 패키지가 바뀌었다"의 정체가 대개 이것이다.
ESMExpanded Security Maintenance- Ubuntu Pro로 제공되는 연장 보안 지원. LTS의 표준 5년이 끝난 뒤, 그리고
universe패키지까지 보안 패치를 준다 — 개인·소규모는 무료 등록이 가능하다.
매일 쓰는 것
섹션 제목: “매일 쓰는 것”sudo apt update # 저장소 목록 갱신 (설치는 안 한다)apt list --upgradable # 무엇이 올라갈 수 있나 ← 적용 전에 확인sudo apt upgrade # 설치. 패키지 제거는 하지 않는다sudo apt full-upgrade # 필요하면 제거까지 하며 업그레이드sudo apt install nginxsudo apt remove nginx # 설정 파일은 남긴다sudo apt purge nginx # 설정 파일까지 삭제sudo apt autoremove --purge # 딸려 왔다가 이제 안 쓰이는 것 정리sudo apt -s upgrade # 시뮬레이션 (-s = --dry-run)정보 조회
섹션 제목: “정보 조회”apt search nginx # 이름·설명 검색apt show nginx # 버전 · 의존성 · 설명apt policy nginx # 설치된 버전과 후보 버전, 어느 저장소에서 오는지apt depends nginx / apt rdepends nginxapt-cache madison nginx # 사용 가능한 모든 버전apt policy가 진단의 핵심이다 — “왜 옛 버전이 깔리지”의 답이 여기 있다.
dpkg — 파일과 패키지의 대응
섹션 제목: “dpkg — 파일과 패키지의 대응”dpkg -l | grep nginx # 설치 목록dpkg -L nginx # 이 패키지가 설치한 파일 전부dpkg -S /usr/sbin/nginx # 이 파일은 어느 패키지 것인가 ← 자주 쓴다dpkg -s nginx # 상태 상세sudo dpkg -i ./something.deb # 로컬 .deb 설치 (의존성은 안 풀어 준다)sudo apt install -f # 위에서 깨진 의존성 복구sudo dpkg --configure -a # 설치가 중간에 끊겼을 때 이어서dpkg -l의 앞 두 글자 — ii가 정상 설치, rc는 제거됐지만 설정 파일이 남은 상태,
iU/iF는 설정 미완료다.
저장소와 서명 키
섹션 제목: “저장소와 서명 키”/etc/apt/sources.list.d/ubuntu.sources — 24.04부터 공식 저장소가 이 형식이다.
Types: debURIs: http://kr.archive.ubuntu.com/ubuntu/Suites: noble noble-updates noble-backportsComponents: main restricted universe multiverseSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg/etc/apt/sources.list는 비어 있거나 안내 주석만 있다 — 놀라지 않아도 된다.
apt-key는 제거됐다. 키를 별도 파일로 두고 Signed-By로 연결한다.
sudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://example.com/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpgsudo chmod a+r /etc/apt/keyrings/example.gpg
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/example.sourcesTypes: debURIs: https://example.com/aptSuites: nobleComponents: mainSigned-By: /etc/apt/keyrings/example.gpgEOF
sudo apt updateNO_PUBKEY 또는 is not signed 오류는 대개 이 연결이 빠진 것이다.
프록시 환경이라면 apt의 프록시 설정도 따로 필요하다(9장).
sudo add-apt-repository ppa:이름/저장소sudo add-apt-repository --remove ppa:이름/저장소ls /etc/apt/sources.list.d/PPA는 개인이 올리는 저장소다 — 서버에서는 신중하게 쓴다. LTS 업그레이드 때 깨지는 주요 원인이기도 하다.
버전 고정
섹션 제목: “버전 고정”sudo apt install nginx=1.24.0-2ubuntu7 # 특정 버전 설치sudo apt-mark hold nginx # 업그레이드 금지apt-mark showhold # 고정 목록 ← 정기 점검 항목sudo apt-mark unhold nginx자동 보안 업데이트
섹션 제목: “자동 보안 업데이트”Ubuntu 서버는 unattended-upgrades가 기본으로 켜져 있다.
systemctl status unattended-upgradescat /etc/apt/apt.conf.d/20auto-upgrades # 켜짐/주기grep -v "^\s*//" /etc/apt/apt.conf.d/50unattended-upgrades | grep -v "^$"sudo unattended-upgrade --dry-run -d # 지금 뭘 할지 보기ls -l /var/log/unattended-upgrades/ # 결과 로그기본은 -security 저장소만 자동 적용한다. 자주 켜는 옵션 둘 —
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; // /boot 만석 예방Unattended-Upgrade::Automatic-Reboot "false"; // 서버는 대개 false재부팅이 필요한가
섹션 제목: “재부팅이 필요한가”ls -l /var/run/reboot-required # 있으면 재부팅 필요cat /var/run/reboot-required.pkgs # 어떤 패키지 때문인지커널·glibc·systemd 업데이트가 여기에 해당한다. 재부팅 없이 커널을 갈아 끼우는 Livepatch는 Ubuntu Pro 기능이다.
snap
섹션 제목: “snap”Ubuntu 24.04는 일부 도구를 snap으로 배포한다 (lxd, certbot 등).
snap list # 설치된 snap과 버전snap list --all # 옛 리비전까지 (디스크를 먹는 주범)snap refresh --list # 갱신 가능한 것sudo snap refreshsudo snap revert 이름 # 직전 리비전으로 되돌리기 ← apt에는 없는 기능snap changes # 최근 작업 이력sudo snap set system refresh.hold="2026-09-01T00:00:00+09:00" # 자동 갱신 잠시 보류snap은 자동으로 갱신된다 — apt와 달리 막을 수 없고 미룰 수만 있다.
df에 /dev/loop* (squashfs)가 잔뜩 보이는 것은 snap 때문이고 정상이다.
Ubuntu Pro 선택
섹션 제목: “Ubuntu Pro ”pro status # 어떤 서비스가 켜져 있나pro security-status # 패키지별 지원 상태 요약 ← 유용하다sudo pro attach <토큰>sudo pro enable esm-appspro security-status는 몇 개 패키지가 어떤 지원을 받고 있는지 알려준다 —
universe 패키지를 많이 쓰는 서버라면 확인해 볼 값이 있다.
LTS 업그레이드
섹션 제목: “LTS 업그레이드”lsb_release -asudo do-release-upgrade -c # 새 LTS가 나와 있는지 확인만sudo do-release-upgrade # 실행 (반드시 콘솔 접근이 가능한 상태에서)원격에서 하면 SSH가 끊길 때 복구할 수 없다 — tmux 안에서, 백업/스냅숏을 뜬 뒤에 한다.
서드파티 저장소와 PPA는 미리 비활성화하는 편이 안전하다.
문제 해결
섹션 제목: “문제 해결”| 증상 | 대처 |
|---|---|
Could not get lock /var/lib/dpkg/lock | 다른 apt가 실행 중 — sudo lsof /var/lib/dpkg/lock-frontend, 자동 업데이트면 기다린다 |
NO_PUBKEY · not signed | 서명 키 누락 — Signed-By 설정 확인 |
Unable to locate package | apt update 안 함, 또는 그 저장소(universe)가 비활성 |
| 설치 중단 후 apt가 안 됨 | sudo dpkg --configure -a → sudo apt install -f |
/boot 만석 | sudo apt autoremove --purge로 옛 커널 정리 |
프록시 뒤에서 apt update 실패 | apt는 환경변수를 안 본다 — 9장 |
12장 요약
섹션 제목: “12장 요약”update(목록) ≠upgrade(설치). 보류가 쌓이면full-upgrade로 내용을 확인하고 처리apt policy가 “왜 이 버전인가”의 답,dpkg -S가 “이 파일 누구 것인가”의 답apt-key는 없다 —/etc/apt/keyrings/+Signed-By, 24.04는 deb822.sourcesunattended-upgrades가 기본으로 켜져 있다 — 바뀐 내역은 그 로그에 있다apt-mark hold는 보안 패치도 막는다 —showhold를 정기 점검에- 자동화 스크립트는
NEEDRESTART_MODE=a로 프롬프트를 막는다 - 재부팅 필요 여부는
/var/run/reboot-required파일 존재로 판단