LFCS 운영·배포 단계별 실전
커널 파라미터, process, job, package, 복구, VM, container와 SELinux를 단계적으로 연습
실제 시험문항이 아니다. kernel parameter 기본 동작은 Rocky Linux 10.2에서 확인했다. 복구·VM·container 문제는 snapshot이 있는 폐기 가능한 환경에서 수행한다.
작성·검증 상태: AI가 영문 task·힌트·풀이의 구조화를 보조했다. 실제 검증 범위는 위 문장과 문제별 prerequisite를 따른다.
공통 풀이 원칙
- 요구를
현재 적용,재부팅 후 유지,검증으로 나눈다. - 진단 문제는 먼저 증거를 수집하고 한 원인만 최소 수정한다.
- service, package, filesystem, SELinux를 동시에 바꾸지 않는다.
- 명령을 모르면
apropos KEYWORD,man COMMAND,COMMAND --help로 목적에 맞는 도구 이름부터 찾는다.
| 요구 | 대표 도구·설정 |
|---|---|
| kernel runtime/persistent | sysctl -w, /etc/sysctl.d/*.conf |
| process/service | ps, /proc, systemctl, journalctl |
| 예약 작업 | crontab 또는 systemd timer |
| package/repository | dnf·rpm 또는 apt·dpkg |
| boot/mount 복구 | console, findmnt --verify, systemctl --failed |
| VM | virsh |
| container | podman 또는 제공된 engine |
| SELinux | ls -Z, ausearch, semanage, restorecon |
문제 1 — runtime과 persistent sysctl
English
Set vm.swappiness to 15 now and persistently using /etc/sysctl.d/90-lfcs-memory.conf. Do not change unrelated kernel parameters.
한국어
vm.swappiness=15를 현재 kernel과 지정 설정 파일에 적용하며 다른 값을 변경하지 않는다.
연결표
| 목적 | 명령 |
|---|---|
| 현재 값 조회 | sysctl vm.swappiness |
| runtime 즉시 변경 | sysctl -w vm.swappiness=15 |
| 지정 파일만 읽기 | sysctl -p /etc/sysctl.d/90-lfcs-memory.conf |
| 표준 설정 전체 다시 읽기 | sysctl --system |
풀이 예시
/etc/sysctl.d/90-lfcs-memory.conf:
vm.swappiness = 15
sysctl -p /etc/sysctl.d/90-lfcs-memory.conf
sysctl vm.swappiness
sysctl --system
sysctl vm.swappiness
인자 없는 sysctl -p는 일반적으로 /etc/sysctl.conf를 읽는다. /etc/sysctl.d/*.conf 하나를 편집한 뒤에는 파일 경로를 지정하거나 sysctl --system을 사용한다. 부팅 시 systemd가 표준 sysctl 경로를 읽으므로 .conf의 값은 재부팅 후 적용 대상이다.
문제 2 — process와 service 진단
English
Identify the process consuming the most CPU, determine its service or cgroup, lower its scheduling priority without killing it, and provide before/after evidence.
한국어
CPU를 가장 많이 사용하는 process를 찾고 어느 service/cgroup 소속인지 확인한다. 종료하지 않고 nice 값을 높여 우선순위를 낮춘 뒤 전후 상태를 증명한다.
가이드
ps -eo pid,ppid,user,ni,pcpu,pmem,cmd --sort=-pcpu
systemctl status <PID>
cat /proc/<PID>/cgroup
renice <VALUE> -p <PID>
ps -o pid,ni,pcpu,cmd -p <PID>
문제에서 종료를 요구하지 않았다면 kill -9부터 사용하지 않는다. service로 관리되는 process의 지속적인 resource 제약은 unit property 또는 drop-in이 필요한지 구분한다.
풀이 예시
ps -eo pid,ppid,user,ni,pcpu,pmem,cmd --sort=-pcpu | head
PID=<확인한_PID>
ps -o pid,ppid,user,ni,pcpu,pmem,cmd -p "$PID"
systemctl status "$PID" --no-pager
cat "/proc/$PID/cgroup"
renice 10 -p "$PID"
ps -o pid,ni,pcpu,cmd -p "$PID"
nice 값은 -20이 높은 우선순위, 19가 낮은 우선순위다. CPU 사용률은 workload에 따라 바로 떨어지지 않을 수 있으므로 NI 값 변경을 직접 확인한다.
문제 3 — 예약 작업
English
Run /usr/local/bin/report.sh as user operator every day at 02:15 and append output and errors to /var/log/report.log. Ensure the schedule is persistent.
한국어
operator 사용자 권한으로 매일 02:15에 script를 실행하고 stdout·stderr를 같은 log에 append한다. 등록 결과와 scheduler service를 확인한다.
연결표
| 요구 | 선택 |
|---|---|
| 간단한 사용자 반복 일정 | user crontab |
| system service처럼 관리·추적 | systemd timer |
| stdout와 stderr 모두 append | >> FILE 2>&1 |
cron 풀이 형태
15 2 * * * /usr/local/bin/report.sh >> /var/log/report.log 2>&1
crontab -u operator -e
crontab -u operator -l
systemctl is-active crond
문제가 timer unit을 명시하면 .service와 .timer를 함께 만들고 systemctl list-timers로 확인한다.
crontab -u operator -e에 넣으면 user column을 적지 않는다. /etc/crontab이나 /etc/cron.d/*에 넣을 때는 시간 필드 뒤에 실행 사용자 operator가 추가된다.
문제 4 — package와 repository
English
Find which package provides the requested command, install it from an enabled repository, validate the installed package, and do not perform a full system upgrade.
한국어
요청된 command를 제공하는 package를 enabled repository에서 찾아 그 package만 설치하고 소유·무결성을 검증한다. 전체 upgrade는 하지 않는다.
Rocky/RHEL 흐름
dnf provides '*/COMMAND'
dnf repolist
dnf install PACKAGE
rpm -q PACKAGE
rpm -V PACKAGE
Debian/Ubuntu 흐름
apt-cache search KEYWORD
apt-file search /COMMAND
apt install PACKAGE
dpkg -s PACKAGE
시험 환경의 package manager를 먼저 확인한다. 요구가 없는 dnf upgrade나 apt full-upgrade는 하지 않는다.
Rocky/RHEL 검증 예시
dnf provides '*/<COMMAND>'
dnf repolist --enabled
dnf install <PACKAGE>
command -v <COMMAND>
rpm -q <PACKAGE>
rpm -qf "$(command -v <COMMAND>)"
rpm -V <PACKAGE>
rpm -V가 아무 출력도 하지 않으면 package가 기록한 속성과 일치한다. 출력이 있으면 각 문자의 의미를 man rpm에서 확인한다.
문제 5 — 부팅·filesystem 복구
English
The system does not reach its normal target after an incorrect persistent mount entry. Recover access, identify the faulty entry, correct it, and verify normal boot dependencies.
한국어
잘못된 영구 mount 항목 때문에 정상 target에 도달하지 못하는 host를 console/recovery shell에서 복구한다. 잘못된 항목만 수정하고 mount 및 failed unit을 검증한다.
가이드
console/recovery shell → mount 상태 확인 → fstab 백업·문법 검증
→ 잘못된 대상만 수정 → mount -a → failed units 확인
findmnt --verify
mount -a
systemctl --failed
systemctl get-default
filesystem repair가 필요하면 mount 여부와 filesystem 종류를 먼저 확인한다. XFS와 ext4에 같은 repair 명령을 사용하지 않는다.
복구 답안 순서
# emergency shell이 read-only root라면 환경에 맞게 rw remount
mount -o remount,rw /
cp -a /etc/fstab /etc/fstab.before-lfcs
findmnt --verify
blkid
lsblk -f
# 오류가 난 한 줄의 UUID, mount point, filesystem type만 수정
systemctl daemon-reload
findmnt --verify
mount -a
systemctl --failed
systemctl get-default
nofail을 붙여 문제를 숨기는 것은 요구가 있을 때만 사용한다. 잘못된 UUID를 올바른 filesystem UUID로 고치는 것이 우선이다.
문제 6 — libvirt VM
English
Using the provided image and network, define and start a persistent virtual machine named labvm9. Configure it to autostart and verify its state without opening a graphical console.
한국어
제공된 image·network·resource 값으로 persistent VM labvm9를 정의·시작하고 host 부팅 시 자동 시작하게 한다. GUI 없이 상태를 확인한다.
확인 흐름
virsh list --all
virsh dominfo labvm9
virsh autostart labvm9
virsh start labvm9
virsh list --all
VM image, memory, vCPU, network 정보가 제공되지 않았다면 임의로 만들지 않는다. 기존 VM 이름·disk를 덮어쓰지 않는다.
제공된 XML을 사용하는 풀이 형태
virsh list --all
virsh net-list --all
virsh define /provided/labvm9.xml
virsh autostart labvm9
virsh start labvm9
virsh dominfo labvm9
virsh domiflist labvm9
virsh domblklist labvm9
virsh list --all
virsh create XML은 transient VM이고 virsh define XML은 persistent 정의다. 문제의 persistent와 autostart는 서로 다른 요구다.
문제 7 — container
English
Run a container named site9 that maps host TCP 8080 to container port 80 and serves persistent content from /srv/site9. Ensure SELinux remains enforcing.
한국어
host 8080을 container 80에 publish하고 /srv/site9 content를 bind mount하는 site9 container를 실행한다. SELinux enforcing을 유지한다.
Podman 풀이 형태
install -d -m 755 /srv/site9
printf 'LFCS container lab\n' > /srv/site9/index.html
podman run -d --name site9 -p 8080:80 \
-v /srv/site9:/usr/share/nginx/html:Z \
docker.io/library/nginx:stable-alpine
podman ps --filter name=site9
podman port site9
ls -ldZ /srv/site9
curl http://127.0.0.1:8080/
이미지가 제공되지 않고 외부 registry 접근도 불가능하면 문제 환경에서 사용할 수 있는 image를 podman images로 먼저 확인한다.
container 자체가 삭제돼도 /srv/site9의 내용은 남지만, 단순 podman run은 host 재부팅 자동 시작까지 뜻하지 않는다. 문제가 boot persistence를 요구하면 제공된 Podman 버전에 맞는 Quadlet 또는 systemd 연동을 추가하고 재부팅 동작을 검증한다.
문제 8 — SELinux 최소 수정
English
An HTTP service must read files from /srv/web9 while SELinux remains enforcing. Correct the persistent file context and verify that relabeling preserves it.
한국어
SELinux enforcing을 유지한 채 HTTP service가 /srv/web9를 읽을 수 있도록 persistent file-context 규칙을 만들고 relabel 후에도 유지됨을 확인한다.
가이드
getenforce
ls -ldZ /srv/web9
ausearch -m AVC -ts recent
semanage fcontext -a -t httpd_sys_content_t '/srv/web9(/.*)?'
restorecon -Rv /srv/web9
ls -ldZ /srv/web9
chcon만 사용하면 relabel 때 사라질 수 있다. setenforce 0은 요구사항을 위반한다.
전체 검증
getenforce
namei -l /srv/web9
ls -ldZ /srv/web9
ausearch -m AVC -ts recent
semanage fcontext -a -t httpd_sys_content_t '/srv/web9(/.*)?'
restorecon -Rv /srv/web9
ls -ldZ /srv/web9 /srv/web9/*
matchpathcon /srv/web9
restorecon -Rv /srv/web9
curl http://127.0.0.1/<제공된_경로>
이미 같은 경로 규칙이 있으면 semanage fcontext -m을 사용한다. 애플리케이션이 쓰기까지 해야 한다면 read-only type이 아닌 쓰기 가능한 적절한 type과 Unix permission을 함께 확인한다.
조건 변형 대비
| 문제 표현 | 구분 |
|---|---|
| apply now only | runtime 변경 |
| persist after reboot | 설정 파일·enable·autostart 등 별도 구성 |
| one-time job | at 또는 transient timer 검토 |
| repeated schedule | cron 또는 persistent systemd timer |
| define a VM | virsh define |
| run XML once | virsh create |
| persistent container data | host volume/bind mount |
| start container after reboot | Quadlet/systemd 연동 추가 |
| SELinux file label now only | chcon이 가능하지만 영속 요구에는 부족 |
| persistent SELinux context | semanage fcontext + restorecon |
자가 채점
-
sysctl -p FILE과sysctl --system을 구분한다. - process를 죽이기 전에 PID·service·cgroup을 식별했다.
- job의 실행 사용자, 시간, 출력 경로를 검증했다.
- 전체 upgrade 없이 요구 package만 다뤘다.
- 복구 작업 전에 filesystem·mount 상태를 확인했다.
- container volume의 SELinux label을 고려했다.
- SELinux enforcing을 유지하고 persistent context를 설정했다.