" - "## cloud-init" answer: 1 explanation: "#cloud-config 헤더로 시작하면 cloud-init이 해당 내용을 YAML cloud-config 형식으로 파싱합니다. 이 형식에서 packages, runcmd, write_files 등의 디렉티브를 사용할 수 있습니다."
- q: "cloud-config에서 첫 부팅 시 임의 명령을 실행하려면 어떤 디렉티브를 사용합니까?"
options:
- "commands:"
- "scripts:"
- "runcmd:"
- "exec:" answer: 2 explanation: "runcmd 디렉티브는 cloud-init이 완료된 후 실행할 쉘 명령 목록을 지정합니다. 각 항목은 문자열이나 리스트로 작성할 수 있으며, 순서대로 한 번 실행됩니다."
- q: "새 EC2 인스턴스에 user-data로 배포한 스크립트가 실행됐는지, 왜 실패했는지 확인하려 합니다. 가장 적절한 확인 방법은?"
options:
- "
cat /etc/cloud/cloud.cfg에서 실행 기록을 확인한다" - "
cat /var/log/cloud-init-output.log에서 스크립트 출력을 확인한다" - "
journalctl -u user-data로 systemd 로그를 확인한다" - "EC2 콘솔 인스턴스 스크린샷에서 부팅 로그를 확인한다"
answer: 1
explanation: "
/var/log/cloud-init-output.log에는 user-data 스크립트의 표준 출력과 오류가 그대로 기록됩니다. 스크립트가 실행됐는지, 어느 줄에서 실패했는지 파악할 수 있는 가장 직접적인 로그입니다.cloud-init.log는 cloud-init 자체 동작 로그입니다."
- "
- q: "cloud-init의 write_files로 서버 부팅 시
/etc/myapp/config.yaml을 생성하려 합니다. 설정이 전혀 반영되지 않는다면, 어떤 필드가 누락됐을 가능성이 높습니까?" options:- "name과 data — write_files에 없는 필드"
- "path(파일 경로)와 content(파일 내용) — 두 필드가 모두 필수"
- "destination과 text — write_files에 없는 필드"
- "file과 body — write_files에 없는 필드"
answer: 1
explanation: "
write_files디렉티브에서path(파일 경로)와content(파일 내용)는 필수 필드입니다. 이 둘 중 하나라도 없으면 파일이 생성되지 않습니다. 선택적으로permissions(권한),owner(소유자),encoding등을 지정할 수 있습니다."
- q: "신규 EC2 인스턴스에 cloud-init으로 nginx와 git을 자동 설치하려 합니다. 다음 cloud-config 중 올바르게 작동하는 것은?"
options:
- "install:\n - nginx\n - git (install 디렉티브는 존재하지 않음)"
- "apt:\n packages:\n - nginx (Ubuntu 전용, 다른 OS에서 동작 안 함)"
- "packages:\n - nginx\n - git (배포판 무관하게 자동 감지)"
- "pkg_install:\n - nginx\n - git (존재하지 않는 디렉티브)"
answer: 2
explanation: "
packages디렉티브를 사용하면 cloud-init이 시스템의 패키지 관리자(apt/yum/dnf 등)를 자동으로 감지해 설치합니다. 배포판 독립적으로 동작하는 표준 방법입니다."
— — —
새 EC2 인스턴스에 접속했는데 'Permission denied (publickey)'가 납니다. 키 파일은 분명히 지정했는데 왜 안 되는지, 혹은 서버가 갑자기 emergency mode로 빠져 GRUB에서 복구해야 하는 상황입니다. 부팅 프로세스 전 단계(BIOS/UEFI → GRUB → systemd)와 cloud-init 프로비저닝을 이해하면 이런 장애가 터졌을 때 어느 단계에서 무엇을 봐야 하는지 바로 짚을 수 있습니다.
Linux 서버 프로비저닝 & 부팅 프로세스
journalctl -b --no-pager | head -50
ssh-keygen -t ed25519 -C 'your@email.com'
— — —
2. 부팅 프로세스 전체 흐름
— — —
3. 런레벨 vs systemd Target
전통적인 SysVinit 시스템은 **런레벨(Runlevel)**을 사용했습니다. systemd는 이를 Target으로 대체했으며, 하위 호환성을 위해 런레벨 번호도 여전히 인식합니다.
런레벨과 systemd Target 대응표:
| 런레벨 | systemd Target | 설명 |
|---|---|---|
| 0 | poweroff.target |
시스템 종료 |
| 1 | rescue.target |
단일 사용자 모드 (복구) |
| 2 | multi-user.target |
네트워크 없는 다중 사용자 |
| 3 | multi-user.target |
네트워크 있는 다중 사용자 (서버 표준) |
| 4 | multi-user.target |
사용자 정의 (거의 미사용) |
| 5 | graphical.target |
GUI 포함 다중 사용자 |
| 6 | reboot.target |
재부팅 |
bash# 현재 기본 target 확인 systemctl get-default # 출력: multi-user.target # 기본 target 변경 (영구 적용) systemctl set-default graphical.target # 즉시 target 전환 (재부팅 없이) systemctl isolate rescue.target # 현재 활성화된 target 목록 systemctl list-units --type=target --state=active # 출력: # UNIT LOAD ACTIVE SUB DESCRIPTION # basic.target loaded active active Basic System # cloud-config.target loaded active active Cloud-config availability # multi-user.target loaded active active Multi-User System # network-online.target loaded active active Network is Online # network.target loaded active active Network # paths.target loaded active active Path Units # remote-fs.target loaded active active Remote File Systems # slices.target loaded active active Slice Units # sockets.target loaded active active Socket Units # sshd-keygen.target loaded active active OpenSSH Server Key Generation # sysinit.target loaded active active System Initialization # timers.target loaded active active Timer Units
Target 의존성 확인:
bash# multi-user.target이 필요로 하는 서비스 확인 systemctl list-dependencies multi-user.target # 출력: # multi-user.target # ● ├─auditd.service # ● ├─crond.service # ● ├─dbus.service # ● ├─firewalld.service # ● ├─NetworkManager.service # ● ├─rsyslog.service # ● ├─sshd.service # ● ├─tuned.service # ● └─basic.target # ├─ ...
— — —
4. VM/EC2 인스턴스 생성 기초
실습 전 디렉토리와 예제 파일을 먼저 준비합니다.
bash# 실습 디렉토리 준비 mkdir -p /tmp/linux/part5/exam_21 && cd /tmp/linux/part5/exam_21
이제 실습을 진행합니다.
— — —
5. SSH Key 생성과 sshd_config 설정
— — —
6. 부팅 실패 시 Rescue Mode 진입
— — —
7. 장애 진단: SSH 접속 거부 (Permission denied) 원인 파악
— — —
cloud-init 사용자 스크립트 실행 오류 디버깅
AWS EC2 등 클라우드 인스턴스 기동 시 주입한 user-data 스크립트가 실행되지 않거나 조용히 실패하는 경우가 허다합니다. 이때 SRE는 반드시 아래의 부팅 프로비저닝 물리 로그 경로를 추적해야 합니다.
- /var/log/cloud-init-output.log:
사용자 데이터 스크립트의 실행 과정에서 발생하는 모든 표준 출력(
stdout)과 표준 에러(stderr)가 날것으로 기록되는 핵심 파일입니다. 스크립트 문법 오류나 설치 에러는 모두 이 파일 안에 범죄 증거로 수록되어 있습니다.
— — —
8. 실무 관점: 프로비저닝 자동화와 보안
— — —
다음 모듈에서는 Cron & 작업 스케줄링 — crontab -e로 주기적 명령 실행을 자동화하고 systemd timer로 더 강력한 작업 스케줄링을 구성하는 방법을 다룹니다.
'Linux' 카테고리의 다른 글
| [Linux] cron으로 리눅스 주기적 반복 작업(배치) 예약 및 백업 자동화 (0) | 2026.06.14 |
|---|---|
| [Linux] firewalld & iptables로 특정 IP/포트 차단 및 허용 규칙 설정 (0) | 2026.06.14 |
| [Linux] 서버 장애 초동 대응 — 5분 트리아지 (1) | 2026.05.23 |
| [Linux] SSH 고급 & 보안 하드닝 (0) | 2026.05.22 |
| [Linux] 포트 & 네트워크 진단 (0) | 2026.05.22 |