들어가며: 소프트웨어 관리의 중요성

서버 운영에서 소프트웨어의 설치, 업데이트, 삭제는 일상적인 작업입니다. Linux는 패키지 관리 시스템을 통해 의존성 해결, 버전 관리, 보안 업데이트를 효율적으로 처리합니다. 또한 systemd를 통해 서비스의 시작, 중지, 자동 시작을 관리합니다.

1. 패키지 관리 시스템 이해

1.1 패키지란?

패키지는 소프트웨어, 설정 파일, 의존성 정보를 하나로 묶은 압축 파일입니다. 패키지 관리자가 설치, 업데이트, 삭제를 자동으로 처리합니다.

1.2 주요 패키지 관리 시스템

배포판 계열패키지 형식저수준 도구고수준 도구
Debian/Ubuntu.debdpkgapt, apt-get
RHEL/CentOS/Fedora.rpmrpmyum, dnf
Arch Linux.pkg.tar.zstpacmanpacman

2. APT (Debian/Ubuntu 계열)

2.1 패키지 목록 업데이트

# 패키지 목록 업데이트 (설치 전 필수)
sudo apt update

# 설치된 패키지 업그레이드
sudo apt upgrade

# 시스템 전체 업그레이드 (의존성 변경 포함)
sudo apt full-upgrade

# 불필요한 패키지 제거
sudo apt autoremove

2.2 패키지 검색 및 정보 확인

# 패키지 검색
apt search nginx

# 패키지 정보 확인
apt show nginx

# 설치된 패키지 목록
apt list --installed

# 특정 패키지 설치 여부 확인
apt list --installed | grep nginx

2.3 패키지 설치/삭제

# 패키지 설치
sudo apt install nginx

# 여러 패키지 동시 설치
sudo apt install nginx mysql-server php-fpm

# 특정 버전 설치
sudo apt install nginx=1.18.0-0ubuntu1

# 패키지 삭제 (설정 파일 유지)
sudo apt remove nginx

# 패키지 완전 삭제 (설정 파일 포함)
sudo apt purge nginx

# .deb 파일 직접 설치
sudo dpkg -i package.deb
sudo apt install -f    # 의존성 해결

2.4 저장소 관리

# 저장소 목록 위치
/etc/apt/sources.list
/etc/apt/sources.list.d/

# PPA 추가 (Ubuntu)
sudo add-apt-repository ppa:ondrej/php
sudo apt update

# PPA 제거
sudo add-apt-repository --remove ppa:ondrej/php

3. YUM/DNF (RHEL/CentOS/Fedora 계열)

3.1 기본 명령어

# 패키지 목록 업데이트 및 업그레이드
sudo yum update          # CentOS 7
sudo dnf update          # CentOS 8+, Fedora

# 패키지 검색
yum search nginx
dnf search nginx

# 패키지 정보
yum info nginx
dnf info nginx

# 패키지 설치
sudo yum install nginx
sudo dnf install nginx

# 패키지 삭제
sudo yum remove nginx
sudo dnf remove nginx

3.2 그룹 패키지

# 그룹 목록 확인
dnf group list

# 개발 도구 그룹 설치
sudo dnf groupinstall "Development Tools"

# 그룹 삭제
sudo dnf groupremove "Development Tools"

3.3 저장소 관리

# 저장소 목록 위치
/etc/yum.repos.d/

# EPEL 저장소 추가
sudo dnf install epel-release

# 저장소 목록 확인
dnf repolist

# 특정 저장소에서 설치
sudo dnf install --enablerepo=epel package-name

4. 패키지 관리 실전 팁

4.1 보안 업데이트만 적용

# Ubuntu/Debian
sudo apt upgrade --only-upgrade

# RHEL/CentOS
sudo yum update --security
sudo dnf update --security

4.2 패키지 버전 고정

# Ubuntu/Debian - 버전 고정
sudo apt-mark hold nginx
sudo apt-mark unhold nginx
apt-mark showhold

# RHEL/CentOS - 버전 제외
# /etc/yum.conf 또는 /etc/dnf/dnf.conf
exclude=nginx*

4.3 캐시 관리

# APT 캐시 정리
sudo apt clean           # 다운로드된 패키지 파일 삭제
sudo apt autoclean       # 오래된 버전만 삭제

# YUM/DNF 캐시 정리
sudo yum clean all
sudo dnf clean all

5. systemd와 서비스 관리

5.1 systemd란?

systemd는 Linux의 init 시스템이자 시스템 관리 데몬입니다. 서비스 시작/중지, 부팅 시 자동 시작, 로깅, 의존성 관리 등을 담당합니다.

5.2 서비스 제어 기본

# 서비스 상태 확인
sudo systemctl status nginx

# 서비스 시작/중지/재시작
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

# 설정 리로드 (무중단)
sudo systemctl reload nginx

# 재시작 또는 리로드 (지원하면 리로드)
sudo systemctl reload-or-restart nginx

5.3 부팅 시 자동 시작

# 자동 시작 활성화
sudo systemctl enable nginx

# 자동 시작 비활성화
sudo systemctl disable nginx

# 즉시 시작 + 자동 시작 활성화
sudo systemctl enable --now nginx

# 자동 시작 상태 확인
systemctl is-enabled nginx

5.4 서비스 목록 및 상태

# 모든 서비스 목록
systemctl list-units --type=service

# 실행 중인 서비스만
systemctl list-units --type=service --state=running

# 실패한 서비스
systemctl list-units --type=service --state=failed

# 서비스 의존성 확인
systemctl list-dependencies nginx

6. 사용자 정의 서비스 만들기

6.1 Unit 파일 구조

# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom Application
After=network.target

[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start.sh
ExecStop=/opt/myapp/bin/stop.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

6.2 주요 섹션 설명

  • [Unit]: 서비스 설명, 의존성 정의
  • [Service]: 실행 방법, 사용자, 재시작 정책
  • [Install]: 활성화 시 연결될 타겟

6.3 서비스 등록 및 관리

# Unit 파일 생성/수정 후
sudo systemctl daemon-reload

# 서비스 활성화 및 시작
sudo systemctl enable --now myapp

# 상태 확인
sudo systemctl status myapp

# 로그 확인
sudo journalctl -u myapp -f

6.4 다양한 서비스 타입

# Type=simple (기본값)
# 메인 프로세스가 직접 시작됨

# Type=forking
# 전통적인 데몬 방식, 포크 후 부모 종료
Type=forking
PIDFile=/var/run/myapp.pid

# Type=oneshot
# 일회성 작업 (스크립트 실행)
Type=oneshot
RemainAfterExit=yes

# Type=notify
# 서비스가 시작 완료를 systemd에 알림
Type=notify

7. journalctl - 로그 관리

7.1 기본 사용법

# 전체 로그 보기
sudo journalctl

# 특정 서비스 로그
sudo journalctl -u nginx

# 실시간 로그 추적
sudo journalctl -u nginx -f

# 부팅 이후 로그만
sudo journalctl -b

# 이전 부팅 로그
sudo journalctl -b -1

7.2 시간 및 우선순위 필터

# 시간 범위 지정
sudo journalctl --since "2026-01-21 10:00" --until "2026-01-21 12:00"
sudo journalctl --since "1 hour ago"
sudo journalctl --since today

# 우선순위 필터
sudo journalctl -p err          # error 이상
sudo journalctl -p warning      # warning 이상

# 출력 형식
sudo journalctl -o json-pretty  # JSON 형식
sudo journalctl -o short-iso    # ISO 시간 형식

7.3 로그 관리

# 디스크 사용량 확인
sudo journalctl --disk-usage

# 오래된 로그 삭제
sudo journalctl --vacuum-time=7d    # 7일 이전 삭제
sudo journalctl --vacuum-size=500M  # 500MB 이하로 유지

# 설정 파일: /etc/systemd/journald.conf
SystemMaxUse=500M
MaxRetentionSec=7day

8. 실전 시나리오

8.1 LAMP 스택 설치 (Ubuntu)

# 패키지 업데이트
sudo apt update

# Apache, MySQL, PHP 설치
sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql

# 서비스 시작 및 자동 시작
sudo systemctl enable --now apache2
sudo systemctl enable --now mysql

# 상태 확인
systemctl status apache2 mysql

8.2 Node.js 앱 서비스 등록

# /etc/systemd/system/nodeapp.service
[Unit]
Description=Node.js Application
After=network.target

[Service]
Type=simple
User=nodeuser
WorkingDirectory=/opt/nodeapp
ExecStart=/usr/bin/node app.js
Restart=on-failure
Environment=NODE_ENV=production
Environment=PORT=3000

[Install]
WantedBy=multi-user.target

# 등록 및 시작
sudo systemctl daemon-reload
sudo systemctl enable --now nodeapp

8.3 정기 업데이트 자동화

# Ubuntu - unattended-upgrades 설치
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

# 설정 확인
cat /etc/apt/apt.conf.d/20auto-upgrades

# RHEL/CentOS - dnf-automatic
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

9. 트러블슈팅

9.1 패키지 문제 해결

# APT 잠금 문제
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock

# 깨진 패키지 복구
sudo apt --fix-broken install
sudo dpkg --configure -a

# RPM 데이터베이스 재구축
sudo rpm --rebuilddb

9.2 서비스 문제 해결

# 서비스 시작 실패 원인 확인
sudo systemctl status myservice
sudo journalctl -xe -u myservice

# 설정 파일 문법 검사
sudo nginx -t
sudo apache2ctl configtest

# systemd 재분석
sudo systemctl daemon-reexec

마무리

패키지 관리와 서비스 운영은 서버 관리의 핵심입니다. apt/yum/dnf로 소프트웨어를 효율적으로 관리하고, systemd로 서비스를 안정적으로 운영하세요.

다음 4편에서는 네트워크 설정과 방화벽에 대해 다룹니다.