LFCS 운영·배포 핵심 정리
커널, 프로세스, 패키지, 복구, 가상 머신, 컨테이너와 SELinux를 하나의 운영 흐름으로 정리
이 문서는 공식 Operations Deployment 8개 competency의 개념 층이다. service·network·storage fixture와 libvirt 준비는 2노드 실습 서비스를 사용한다.
작성·검증 상태: AI가 구조화와 설명 초안을 보조했다. package·service·libvirt daemon·container engine 이름은 현재 배포판에서 확인하고, 복구 절차는 snapshot이 있는 VM에서만 수행한다.
이 영역을 끝내는 순서
- runtime state와 persistent configuration을 구분하고 최초 오류를 보존한다.
- 운영·배포 안내형 lab에서 정상 구성뿐 아니라 의도적인 실패를 진단한다.
- snapshot을 복원하고 영문 단계별 실전을 풀이 없이 수행한다.
- package 계열, service failure, container port·volume, SELinux denial 조건을 바꿔 다시 푼다.
완료 기준은 설정 file·unit·container가 존재하는 것이 아니라 process·job result·VM state·application response·AVC와 부팅 후 상태까지 검증하는 것이다.
이 문서는 2026-08-11 LFCS 공식 범위의 Operations Deployment(25%) 8개 항목을 기준으로 한다. 명령 이름보다
변경 전 상태 → 최소 변경 → 실제 동작 → 지속성 → 부수 효과순서로 익힌다.
먼저 잡아야 할 운영 흐름
운영·배포 문제는 도구가 달라도 다음 순서로 접근할 수 있다.
- 대상 호스트와 현재 상태를 확인한다.
- 오류 메시지와 로그를 먼저 보존한다.
- 런타임 변경과 재부팅 후 설정을 구분한다.
- 요구사항에 필요한 최소 범위만 변경한다.
- 설정값뿐 아니라 프로세스·포트·응답처럼 실제 동작을 확인한다.
- 부팅 후에도 남아야 하는 설정은 별도로 검증한다.
1. 커널 매개변수
sysctl로 읽고 바꾸는 값은 현재 실행 중인 커널 상태다. /etc/sysctl.conf나 /etc/sysctl.d/*.conf는 부팅 또는 설정 재적용 때 읽을 입력값이다.
sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1
grep -R "net.ipv4.ip_forward" /etc/sysctl.conf /etc/sysctl.d 2>/dev/null
sysctl --system
영구 설정은 목적이 드러나는 별도 파일에 둔다.
/etc/sysctl.d/90-lfcs-forwarding.conf
net.ipv4.ip_forward = 1
확인할 것:
sysctl -w만 실행하면 재부팅 뒤 사라질 수 있다.- 같은 키가 여러 설정 파일에 있으면 나중에 적용된 값이 덮어쓸 수 있다.
sysctl --system의 오류와 마지막 실제 값을 함께 확인한다.
2. 프로세스와 서비스 진단
서비스는 실행 정책이고 프로세스는 실제 실행 단위다. active 한 줄만 보지 말고 unit, PID, 종료 코드, 로그와 필요한 포트를 연결한다.
systemctl --failed
systemctl status example.service --no-pager -l
systemctl cat example.service
journalctl -u example.service -b --no-pager
ps -ef --forest
pgrep -a example
ss -lntup
문제 해결 순서:
status에서 최초 오류와 exit code를 확인한다.systemctl cat으로 패키지 unit과 drop-in을 합친 실제 설정을 읽는다.journalctl -u로 같은 시간대의 원인을 찾는다.- 실행 파일, 사용자 권한, 환경 변수, 경로, 포트, SELinux를 확인한다.
- 수정 후 상태와 실제 서비스 동작을 다시 시험한다.
무작정 restart부터 반복하면 최초 오류가 로그 뒤로 밀릴 수 있다. kill -9는 정상 종료가 불가능할 때의 마지막 수단이지 기본 관리 명령이 아니다.
3. 작업 실행과 예약
요구사항이 일회성인지 반복인지 먼저 구분한다.
| 요구 | 대표 도구 | 확인 |
|---|---|---|
| 백그라운드 작업 | 셸 job control, nohup | jobs, ps, 출력 파일 |
| 일회성 예약 | at | atq, 실행 결과 |
| 단순 반복 | cron | crontab -l, 서비스 로그, 결과 파일 |
| 의존성·로그가 중요한 반복 | systemd timer | systemctl list-timers, timer/service journal |
cron과 systemd 서비스는 로그인 셸과 다른 환경에서 실행될 수 있다. 명령과 파일 경로는 절대경로를 우선하고, 실행 사용자·표준 출력·오류가 어디로 가는지 정한다.
crontab -l
systemctl list-timers --all
journalctl -u backup.service -u backup.timer --since today
예약 항목이 존재하는 것과 실제 작업이 성공한 것은 별개의 검증이다.
4. 패키지와 저장소
패키지 검색, 후보 버전, 설치 여부, 제공 파일과 서비스 상태를 나눠 본다.
| 작업 | Red Hat 계열 | Debian 계열 |
|---|---|---|
| 저장소 확인 | dnf repolist | apt-cache policy |
| 검색·정보 | dnf search, dnf info | apt search, apt show |
| 설치 | dnf install | apt install |
| 설치 확인 | rpm -q, rpm -qi | dpkg -s, dpkg -l |
| 제공 파일 | rpm -ql | dpkg -L |
| 파일의 소유 패키지 | rpm -qf /path | dpkg -S /path |
dnf repolist
dnf info nginx
rpm -q nginx
rpm -ql nginx
패키지가 설치됐다고 서비스가 올바르게 설정·실행된 것은 아니다. 저장소를 임의로 추가하기 전에 기존 저장소와 패키지 서명·출처를 확인한다.
5. 하드웨어·OS·파일시스템 실패 복구
복구는 명령 암기보다 정확한 대상과 파일시스템 유형을 식별하는 것이 먼저다.
journalctl -xb --no-pager
systemctl --failed
lsblk -f
blkid
findmnt
cat /etc/fstab
안전한 순서:
- 증상과 로그를 수집한다.
- 장치, 파일시스템 유형, 마운트 상태를 확인한다.
- 가능한 경우 백업이나 복사본을 확보하고 쓰기를 멈춘다.
- 마운트 해제 등 도구가 요구하는 조건을 만든다.
- 파일시스템 유형에 맞는 도구를 사용한다.
- 다시 마운트하고 파일 접근·서비스·부팅 상태를 확인한다.
ext 계열의 fsck와 XFS의 xfs_repair는 서로 바꾸어 쓰는 명령이 아니다. 사용 중인 루트 파일시스템이나 마운트된 파일시스템에 오프라인 복구 도구를 바로 실행하면 손상을 키울 수 있다.
6. libvirt 가상 머신
libvirt에서는 가상 머신을 domain으로 다룬다. 정의됨, 실행 중, 호스트 부팅 시 자동 시작은 각각 다른 상태다.
virsh list --all
virsh dominfo web01
virsh domiflist web01
virsh domblklist web01
virsh autostart web01
주요 구분:
define: XML을 읽어 지속되는 domain 정의를 만든다.create: XML로 즉시 실행하지만 보통 지속 정의를 만들지 않는다.start: 이미 정의된 domain을 시작한다.shutdown: 게스트에 정상 종료를 요청한다.destroy: 전원을 강제로 끄는 것에 가깝다.autostart: 호스트 부팅 시 시작되도록 설정한다.
VM 내부 상태만 보지 말고 호스트에서 네트워크 인터페이스와 블록 장치 연결까지 확인한다.
7. 컨테이너 엔진과 컨테이너
이미지, 컨테이너, 호스트 포트, 컨테이너 포트와 영구 데이터 위치를 구분한다.
podman images
podman ps -a
podman inspect web
podman logs web
podman port web
podman volume ls
예시 구조:
podman run -d --name web \
-p 8080:80 \
-v /srv/web:/usr/share/nginx/html:Z \
docker.io/library/nginx:stable-alpine
Rocky/RHEL처럼 SELinux가 활성화된 호스트에서 bind mount를 사용할 때 :Z 또는 :z가 필요한 경우가 있다. 의미를 확인하지 않고 붙이지 말고, 공유 범위와 기존 label을 먼저 본다.
검증은 세 층으로 한다.
podman ps --filter name=web
podman logs web
curl -I http://127.0.0.1:8080
running은 프로세스가 살아 있다는 뜻일 뿐 응용 서비스가 정상 응답한다는 보장은 아니다. 컨테이너를 삭제하기 전에 볼륨과 bind mount에 영구 데이터가 있는지 확인한다.
8. SELinux로 MAC 적용
일반 파일 권한(DAC)이 허용해도 SELinux 정책(MAC)이 접근을 거부할 수 있다. 문제를 만나면 SELinux를 끄기보다 process domain, file type, boolean과 AVC 로그를 연결한다.
getenforce
ps -eZ | grep httpd
ls -ldZ /srv/web
ausearch -m AVC -ts recent -i
getsebool -a | grep httpd
비표준 웹 경로를 영구적으로 label하는 예:
semanage fcontext -a -t httpd_sys_content_t '/srv/web(/.*)?'
restorecon -Rv /srv/web
matchpathcon -V /srv/web/index.html
semanage fcontext는 영구 규칙을 추가하고, restorecon은 그 규칙을 실제 파일에 적용한다. chcon만 사용한 변경은 relabel이나 restorecon으로 사라질 수 있다.
정책 전체를 비활성화하거나 AVC를 그대로 audit2allow에 넣어 광범위한 허용 정책을 만드는 것은 첫 대응이 아니다. 올바른 기본 경로, type, port label, boolean이 있는지 먼저 확인한다.
도메인 압축 체크리스트
- 런타임 값과 영구 설정을 구분한다.
- 재시작 전에 상태·unit·최초 오류를 확인한다.
- 예약 등록 뒤 실제 실행 결과를 확인한다.
- 패키지 설치와 서비스 구성·실행을 구분한다.
- 복구 도구 실행 전 장치·유형·마운트 상태를 확인한다.
- VM의 정의·실행·autostart 상태를 각각 확인한다.
- 컨테이너의 포트·데이터·로그·실제 응답을 확인한다.
- SELinux를 끄지 않고 AVC와 올바른 영구 label로 해결한다.