📚 Infra Dev Guide 시리즈 전체 로드맵
| 단계 | 가이드 | 주제 | 상태 |
|---|---|---|---|
| 1단계 | InfraDevGuide0001 | 인프라 개념 완전 정복 (서버·네트워크·스토리지) | ✅ 완료 |
| 2단계 | InfraDevGuide0002 | 👉 Linux 기초 완전 정복 ← 현재 학습 중 | 🔥 학습 중 |
| 3단계 | InfraDevGuide0003 | 네트워크 기초 완전 정복 (OSI·TCP/IP·라우팅) | ⏱ 예정 |
| 4단계 | InfraDevGuide0004 | 클라우드 AWS 완전 정복 (EC2·S3·RDS·IAM) | ⏱ 예정 |
| 5단계 | InfraDevGuide0005 | Docker & 컨테이너 완전 정복 | ⏱ 예정 |
| 6단계 | InfraDevGuide0006 | CI/CD & 자동화 완전 정복 | ⏱ 예정 |
| 7단계 | InfraDevGuide0007 | 실전 프로젝트 & 취업 전략 | ⏱ 예정 |
📝 전체 학습 목차
| 챕터 | 제목 | 핵심 내용 | 난이도 |
|---|---|---|---|
| Ch01 | Linux란? — OS와 커널 이해 | Linux 역사, 배포판, 커널, 쉘 구조 | ★☆☆ |
| Ch02 | 터미널 & 쉘 기초 | bash, 기본 명령어, man, alias, 히스토리 | ★☆☆ |
| Ch03 | 파일시스템 & 디렉토리 구조 | /etc /var /home /usr 완전 이해 | ★★☆ |
| Ch04 | 파일 & 디렉토리 조작 | ls, cp, mv, rm, find, grep, tar | ★★☆ |
| Ch05 | 파일 권한 & 소유권 | chmod, chown, umask, SUID/SGID | ★★☆ |
| Ch06 | 사용자 & 그룹 관리 | useradd, sudo, passwd, /etc/passwd | ★★☆ |
| Ch07 | 패키지 관리 & 소프트웨어 설치 | apt, yum/dnf, snap, 소스 빌드 | ★★☆ |
| Ch08 | 프로세스 & 시스템 관리 | ps, kill, top, systemctl, cron | ★★★ |
| Ch09 | 네트워크 설정 & SSH | ip, ss, curl, SSH 키 인증, 포트포워딩 | ★★★ |
| Ch10 | 쉘 스크립트 & 자동화 | 변수, 조건문, 반복문, 함수, cron 자동화 | ★★★ |
| Ch11 | 현업 면접 Q&A TOP 10 | Linux 현업 면접 핵심 질문 & 완벽 답변 | ★★★ |
🐧 Chapter 01
Linux란? — OS와 커널, 배포판 완전 이해
왜 인프라 엔지니어는 Linux를 써야 하는가? 기초 개념부터 현업 배포판 선택까지
💡 Linux란 무엇인가?
Linux는 1991년 Linus Torvalds가 만든 오픈소스 운영체제(OS) 커널입니다. 전 세계 서버의 약 96%가 Linux를 운영체제로 사용합니다. AWS EC2, GCP, Azure의 VM도 대부분 Linux 기반이며, Docker 컨테이너도 Linux 커널 위에서 동작합니다.
전 세계 웹서버
AWS·GCP·Azure VM
30억대+ 스마트폰
누구나 사용·수정
🪝 1-1. Linux 구조 (커널 ~ 쉘 ~ 앱)
nginx, mysql, python, node.js ...
bash, zsh, sh — 명령어를 커널에 전달하는 인터프리터
open(), read(), write(), fork() ...
프로세스 관리 | 메모리 관리 | 파일시스템 | 네트워크 | 드라이버
CPU · RAM · Disk · NIC · GPU ...
📊 1-2. Linux 배포판(Distribution) 비교
| 계열 | 배포판 | 패키지 관리자 | 주요 특징 | 현업 사용처 |
|---|---|---|---|---|
| Debian 계열 | Ubuntu | apt | 가장 대중적, LTS 5년 지원 | 🏅 서버 1순위, AWS AMI 기본 |
| Debian | apt | 안정성 최우선, 보수적 업데이트 | 웹서버, 임베디드 | |
| Kali Linux | apt | 보안·해킹 특화 도구 번들 | 보안 엔지니어 | |
| RHEL 계열 | CentOS/RHEL | yum/dnf | 엔터프라이즈 표준, 장기 지원 | 금융·대기업 서버 |
| Rocky Linux | dnf | CentOS 대안, RHEL 호환 | 엔터프라이즈 대체재 | |
| Amazon Linux | dnf | AWS EC2 최적화 | AWS 인프라 | |
| 기타 | Alpine Linux | apk | 초경량 5MB, Docker 기본 이미지 | 컨테이너 최적화 |
🌟 현업 배포판 선택 가이드
- 스타트업 / AWS 서버: Ubuntu LTS (22.04, 24.04) — 가장 보편적
- AWS EC2 기본 선택: Amazon Linux 2023 — AWS 최적화
- 금융·공공기관: RHEL 또는 Rocky Linux — 엔터프라이즈 표준
- Docker 이미지: Alpine Linux — 용량 최소화
📱 Chapter 02
터미널 & 쉘 기초 — bash 명령어 완전 정복
Linux를 다루는 첫 번째 도구! 쉘의 구조와 현업에서 매일 쓰는 핵심 명령어 마스터
💡 2-1. 쉘(Shell)이란?
쉘(Shell)은 사용자가 입력한 명령어를 Linux 커널에 전달하는 명령어 인터프리터입니다. 가장 많이 쓰는 쉘은 bash(Bourne Again SHell)입니다.
가장 보편적
Ubuntu 기본
macOS 기본
기능 풍부
자동완성
초보자 친화
POSIX 표준
스크립트용
📋 2-2. 프롬프트 읽는 법
ubuntu@web-server-01:~/projects$ ls
# 각 부분 설명:
# ubuntu → 현재 사용자 이름
# web-server-01 → 호스트명 (서버 이름)
# ~/projects → 현재 디렉토리 (~ = 홈 디렉토리)
# $ → 일반 사용자 ($) vs root (#)
⚙ 2-3. 현업 필수 명령어 완전 정리
| 카테고리 | 명령어 | 설명 | 현업 예시 |
|---|---|---|---|
| 파일 탐색 | ls -alh | 파일 목록 (상세+숨김+크기) | ls -alh /var/log/ |
| pwd | 현재 디렉토리 경로 | pwd → /home/ubuntu | |
| cd | 디렉토리 이동 | cd /etc/nginx/ | |
| tree | 트리 구조로 디렉토리 표시 | tree -L 2 /etc/ | |
| 파일 내용 | cat | 파일 전체 출력 | cat /etc/nginx/nginx.conf |
| tail -f | 실시간 로그 모니터링 | tail -f /var/log/nginx/error.log | |
| less | 페이지 단위로 파일 보기 | less /var/log/syslog | |
| grep | 패턴 검색 | grep -r "ERROR" /var/log/ | |
| 검색&텍스트 | find | 파일 검색 | find /var -name "*.log" -mtime +30 |
| awk | 텍스트 처리·추출 | awk '{print $1}' access.log | |
| sed | 텍스트 치환 | sed -i 's/old/new/g' config.conf | |
| wc -l | 줄 수 세기 | cat error.log | wc -l | |
| 시스템 정보 | uname -a | 커널 버전 정보 | uname -a |
| hostname | 호스트명 확인/설정 | hostnamectl set-hostname myserver | |
| uptime | 서버 가동시간·로드 | uptime → load: 0.15, 0.09 |
☕ 파이프(|) & 리다이렉션 — 명령어 조합의 핵심
# 파이프(|): 앞 명령의 출력을 뒤 명령의 입력으로
cat /var/log/nginx/access.log | grep "404" | wc -l
# → 오늘 404 에러 몇 건인지 카운트
# 리다이렉션 (>): 출력을 파일로 저장 (덮어쓰기)
echo "Hello Linux" > /tmp/hello.txt
# 리다이렉션 (>>): 파일에 추가 (append)
date >> /var/log/my_cron.log
# 표준에러(stderr) 리다이렉션
./script.sh 2> /tmp/error.log
# 표준출력+에러 모두 저장
./script.sh > /tmp/output.log 2>&1
# 현업 실전: 에러 로그에서 특정 시간대 500 에러 추출
grep "2026:10:" /var/log/nginx/error.log | grep " 500 " | tail -20
⚡ 유용한 단축키 & alias 설정
# 필수 단축키
Ctrl+C # 현재 실행 중인 명령 취소
Ctrl+Z # 현재 프로세스 백그라운드로 전환
Ctrl+D # 터미널 종료 (exit와 동일)
Ctrl+L # 화면 클리어 (clear와 동일)
Ctrl+A # 줄 맨 앞으로 커서 이동
Ctrl+E # 줄 맨 뒤로 커서 이동
Ctrl+R # 명령어 히스토리 검색
Tab # 자동완성 (파일명, 명령어)
!! # 직전 명령 재실행
!$ # 직전 명령의 마지막 인자 재사용
# ~/.bashrc에 alias 추가 (영구 적용)
alias ll="ls -alh"
alias la="ls -A"
alias ..="cd .."
alias ...="cd ../.."
alias grep="grep --color=auto"
alias tailn="tail -f /var/log/nginx/error.log"
alias myip="curl ifconfig.me"
# alias 적용
source ~/.bashrc
📁 Chapter 03
파일시스템 & 디렉토리 구조 완전 정복
Linux의 모든 것은 파일이다! /etc /var /home /usr 디렉토리의 역할을 완벽하게 이해하자
💡 3-1. Linux 파일시스템 핵심 구조 (FHS)
⭐ 3-2. 인프라 엔지니어가 꼭 알아야 할 중요 디렉토리
| 디렉토리 | 역할 | 주요 파일/서비스 | 현업 활용 |
|---|---|---|---|
| /etc | 시스템 설정 파일 | /etc/nginx/, /etc/ssh/, /etc/hosts, /etc/fstab | 서버 설정 변경 시 가장 먼저 참조 |
| /var/log | 로그 파일 저장 | syslog, auth.log, nginx/error.log, mysql/ | 장애 원인 분석 시 첫 번째 확인 |
| /home | 사용자 홈 디렉토리 | .bashrc, .ssh/, .profile, 개인 파일 | 사용자별 환경 설정 |
| /usr/local | 직접 설치한 프로그램 | /usr/local/bin/, /usr/local/lib/ | apt 외 소스 빌드 설치 위치 |
| /proc | 실행 중 프로세스 정보 | /proc/cpuinfo, /proc/meminfo, /proc/PID/ | CPU/메모리 정보 직접 확인 |
| /dev | 장치 파일 | /dev/sda (디스크), /dev/null (버리기), /dev/random | 디스크 파티션, 장치 관리 |
☕ 중요 설정 파일 현업 실전
# /etc/hosts — 로컬 DNS 오버라이드
cat /etc/hosts
# 127.0.0.1 localhost
# 10.0.1.10 db-primary.internal
# 10.0.1.11 db-replica.internal
# /etc/fstab — 디스크 자동 마운트 설정
cat /etc/fstab
# UUID=xxx / ext4 defaults 0 1
# /dev/sdb1 /data xfs defaults 0 0
# /proc/cpuinfo — CPU 정보 직접 확인
grep "model name" /proc/cpuinfo | head -1
cat /proc/meminfo | grep MemTotal
# /var/log 주요 로그 확인
tail -50 /var/log/syslog # 시스템 로그
tail -50 /var/log/auth.log # SSH 로그인 기록 (보안 감사)
tail -50 /var/log/nginx/error.log # Nginx 에러
journalctl -u nginx --since "1 hour ago" # systemd 로그
💾 3-3. 파일시스템 타입 비교
| 파일시스템 | 특징 | 최대 파일 크기 | 주요 용도 |
|---|---|---|---|
| ext4 | Linux 표준, 안정적 | 16TB | OS 파티션, 일반 서버 |
| xfs | 대용량·고성능 | 8EiB | DB 서버, 대용량 스토리지 |
| btrfs | 스냅샷, CoW 지원 | 16EiB | 백업, 스냅샷 필요 환경 |
| tmpfs | 메모리 기반 파일시스템 | RAM 크기 | /tmp, 고속 임시 저장 |
📄 Chapter 04
파일 & 디렉토리 조작 완전 정복
현업에서 매일 쓰는 파일 조작 명령어 완전 마스터 — ls·cp·mv·rm·find·grep·tar 실전
📋 파일 생성 & 복사 & 이동
# 파일 생성
touch myfile.txt # 빈 파일 생성 (타임스탬프도 업데이트)
echo "Hello" > test.txt # 내용으로 파일 생성
mkdir -p /data/logs/2026 # 중간 디렉토리까지 한 번에 생성
# 파일 복사
cp source.txt dest.txt # 파일 복사
cp -r /etc/nginx/ /backup/nginx/ # 디렉토리 통째로 복사 (-r: 재귀)
cp -p file.conf /backup/ # 권한·타임스탬프 유지
rsync -av /data/ /backup/data/ # 대용량 동기화 (네트워크도 가능)
# 파일 이동 & 이름 변경
mv old.txt new.txt # 이름 변경
mv /tmp/config.conf /etc/myapp/ # 이동
# 파일 삭제 (주의! 복구 어려움)
rm myfile.txt # 파일 삭제
rm -rf /tmp/old_logs/ # 디렉토리 통째로 삭제 (매우 주의!)
rm -i *.log # 삭제 전 확인 (-i: interactive)
# 현업 팁: rm 전에 항상 확인!
ls -la /경로/ && rm -rf /경로/ # 먼저 ls로 확인 후 삭제
🔎 4-1. find 명령어 — 현업 필수!
# 기본 구조: find [검색경로] [조건] [동작]
# 이름으로 검색
find /etc -name "nginx.conf" # 정확한 이름
find /var -name "*.log" # 패턴 매칭
find / -name "*.conf" -type f # 파일만 (-type f)
find / -name "logs" -type d # 디렉토리만 (-type d)
# 크기로 검색
find /var/log -size +100M # 100MB 이상 파일
find /tmp -size -1k # 1KB 미만
# 날짜로 검색
find /var/log -mtime +30 # 30일 이상 지난 파일
find /home -mtime -1 # 최근 1일 이내 수정 파일
find /var -newer /etc/nginx/nginx.conf # 특정 파일보다 새로운 파일
# 동작(action) 지정
find /var/log -name "*.log" -mtime +30 -delete # 30일 이상 로그 삭제
find /data -type f -exec chmod 644 {} \; # 찾은 파일에 명령 실행
find /var/log -name "*.gz" | xargs rm -f # xargs로 대량 삭제
# 현업 실전: 디스크 공간 잡아먹는 파일 찾기
find / -xdev -size +500M 2>/dev/null | sort -k5 -rn
🔍 4-2. grep 명령어 — 로그 분석 핵심
# 기본 검색
grep "ERROR" /var/log/app.log # 대소문자 구분
grep -i "error" /var/log/app.log # 대소문자 무시 (-i)
grep -v "DEBUG" /var/log/app.log # 반전 (DEBUG가 없는 줄)
# 줄 번호 & 주변 컨텍스트
grep -n "CRITICAL" app.log # 줄 번호 표시
grep -A 5 "Exception" app.log # 이후 5줄
grep -B 3 "Exception" app.log # 이전 3줄
grep -C 5 "Exception" app.log # 앞뒤 5줄
# 재귀 검색
grep -r "password" /etc/ # /etc/ 전체에서 검색 (보안 감사)
grep -rl "TODO" /app/src/ # 파일 이름만 출력 (-l)
# 정규표현식
grep -E "^2026" /var/log/nginx/access.log # 줄 시작이 2026
grep -E "\b404\b|\b500\b" access.log # 404 또는 500
grep -E "[0-9]{1,3}\.[0-9]{1,3}" access.log # IP 패턴
# 현업 실전: 에러 빈도 분석
grep "ERROR" /var/log/app.log | awk '{print $5}' | sort | uniq -c | sort -rn
# 현업 실전: 특정 IP의 접근 로그만 추출
grep "^192.168.1.100" /var/log/nginx/access.log | tail -50
📦 4-3. tar & 압축 — 백업 필수 도구
# tar 옵션 암기법: cvf = Create Verbose File | xvf = eXtract Verbose File
# 압축 생성
tar -cvf archive.tar /data/ # tar만 (압축 없음)
tar -czvf archive.tar.gz /data/ # gzip 압축 (.tar.gz)
tar -cjvf archive.tar.bz2 /data/ # bzip2 압축 (.tar.bz2)
tar -cJvf archive.tar.xz /data/ # xz 압축 (최고 압축률)
# 압축 해제
tar -xvf archive.tar # tar 해제
tar -xzvf archive.tar.gz # gzip 해제
tar -xvf archive.tar.gz -C /target/ # 특정 디렉토리에 해제
# 압축 파일 내용 확인 (해제 없이)
tar -tzvf archive.tar.gz
# 현업 실전: 날짜 포함 백업
DATE=$(date +%Y%m%d)
tar -czvf /backup/nginx_config_${DATE}.tar.gz /etc/nginx/
# zip/unzip
zip -r myapp.zip /app/ # zip 압축
unzip myapp.zip -d /target/ # zip 해제
🔒 Chapter 05
파일 권한 & 소유권 완전 정복
Linux 보안의 핵심! chmod·chown·umask·SUID를 제대로 이해해야 서버 보안을 지킬 수 있다
💡 5-1. 파일 권한(Permission) 읽는 법
$ ls -la /etc/passwd
-rw-r--r-- 1 root root 2847 Mar 28 10:00 /etc/passwd
# 분해해서 읽기:
- rw- r-- r-- 1 root root 2847 Mar 28 /etc/passwd
^ ^^^ ^^^ ^^^ ^ ^ ^ ^ ^ ^
| | | | 링크수 소유자 그룹 크기 날짜 파일명
| | | └── Other 권한 (r--= 읽기만)
| | └─────── Group 권한 (r--= 읽기만)
| └──────────── Owner 권한 (rw-= 읽기+쓰기)
└─────────────── 파일 타입 (- =파일, d=디렉토리, l=심볼릭링크)
Read (읽기)
파일 내용 보기 / 디렉토리 목록 보기
Write (쓰기)
파일 수정 / 디렉토리 파일 생성·삭제
Execute (실행)
파일 실행 / 디렉토리 진입(cd)
⚙ 5-2. chmod — 권한 변경
숫자 방식 (8진수)
# 권한 숫자 계산
# r(4) + w(2) + x(1) 합산
# 7 = rwx (4+2+1)
# 6 = rw- (4+2)
# 5 = r-x (4+1)
# 4 = r-- (4)
# 0 = --- (없음)
chmod 755 script.sh # rwxr-xr-x
chmod 644 config.conf # rw-r--r--
chmod 600 .ssh/id_rsa # rw------- (SSH 키)
chmod 777 /shared/ # 모두 허용 (위험!)
chmod -R 755 /app/ # 재귀 적용
문자 방식 (symbolic)
# u=user, g=group, o=other, a=all
# +=추가, -=제거, ==설정
chmod u+x script.sh # 소유자에 실행 추가
chmod g-w file.txt # 그룹 쓰기 제거
chmod o= file.txt # others 권한 모두 제거
chmod a+r public.html # 모두에게 읽기 추가
chmod u=rw,g=r,o= sensitive.conf
# → rw-r-----
| 권한값 | 표기 | 의미 | 현업 사용 예 |
|---|---|---|---|
| 777 | rwxrwxrwx | 모두 접근 가능 | 🔴 보안 위험! 사용 금지 |
| 755 | rwxr-xr-x | 소유자 전체 / 나머지 읽기+실행 | 🟢 디렉토리, 실행 파일 |
| 644 | rw-r--r-- | 소유자 읽기+쓰기 / 나머지 읽기만 | 🟢 설정 파일, HTML |
| 600 | rw------- | 소유자만 읽기+쓰기 | 🟢 SSH 키, 비밀번호 파일 |
| 400 | r-------- | 소유자만 읽기 | 🟢 읽기 전용 설정 파일 |
👤 5-3. chown — 소유권 변경
# chown [소유자]:[그룹] [파일/디렉토리]
chown ubuntu:ubuntu /home/ubuntu/app/ # 소유자와 그룹 변경
chown www-data:www-data /var/www/html/ # Nginx/Apache 웹 루트
chown -R deploy:deploy /app/ # 재귀 변경 (-R)
chown root /etc/passwd # 소유자만 변경
# 현업 실전: 배포 후 권한 설정
# 1. 앱 파일은 deploy 유저 소유
chown -R deploy:deploy /app/
chmod -R 750 /app/
# 2. 로그 디렉토리는 그룹에 쓰기 허용
chown -R deploy:www-data /app/logs/
chmod -R 775 /app/logs/
# 3. 설정 파일은 읽기 전용
chown root:deploy /app/config/prod.env
chmod 640 /app/config/prod.env
✅ 현업 권한 설정 원칙
- 최소 권한 원칙: 필요한 최소한의 권한만 부여 (777 절대 금지)
- SSH 키 권한: ~/.ssh/ → 700, ~/.ssh/authorized_keys → 600 (더 넓으면 SSH 거부!)
- 웹 루트: /var/www/html → www-data:www-data, 755
- 환경변수 파일(.env): 600 (소유자만 읽기)
- 실행 스크립트: 755 또는 750 (타 그룹 실행 불필요 시)
👤 Chapter 06
사용자 & 그룹 관리 완전 정복
멀티 유저 환경에서 인프라를 안전하게 관리하는 법 — useradd·sudo·passwd·그룹 관리 완전 정복
💡 6-1. 리눅스 사용자 구조
👑 root (UID 0)
모든 권한을 가진 슈퍼유저. 잘못된 명령 하나로 서버 전체를 파괴 가능. 직접 로그인 금지!
👤 일반 사용자 (UID 1000+)
제한된 권한. sudo 명령으로 필요 시 root 권한 일시 획득. 현업에서 배포 계정 등에 사용.
⚙ 시스템 계정 (UID 1~999)
nginx, mysql, www-data 등 서비스 실행용 계정. 로그인 불가 설정. 최소 권한으로 서비스 격리.
☕ 사용자 관리 핵심 명령어
# 사용자 생성
sudo useradd -m -s /bin/bash deploy # 홈 디렉토리(-m) + bash쉘(-s) 포함
sudo useradd -m -s /bin/bash -G sudo admin # sudo 그룹에 추가
# 비밀번호 설정
sudo passwd deploy # 비밀번호 설정
sudo passwd -e deploy # 다음 로그인 시 비밀번호 강제 변경
sudo passwd -l deploy # 계정 잠금 (Lock)
# 사용자 수정
sudo usermod -aG docker ubuntu # docker 그룹에 추가 (-a: append)
sudo usermod -aG sudo deploy # sudo 권한 부여
sudo usermod -s /bin/nologin nginx # 로그인 불가로 설정
# 사용자 삭제
sudo userdel deploy # 계정만 삭제
sudo userdel -r deploy # 계정 + 홈 디렉토리 삭제
# 사용자 정보 확인
id ubuntu # UID, GID, 그룹 확인
who # 현재 로그인한 사용자
w # 로그인 사용자 + 작업 내용
last # 로그인 기록
cat /etc/passwd | grep deploy # /etc/passwd 직접 확인
🛡 6-2. sudo — 권한 상승의 올바른 사용
sudo(Superuser Do)는 특정 명령어를 root 권한으로 실행하는 도구입니다. root 직접 로그인보다 안전하고, 감사 로그(/var/log/auth.log)에 기록됩니다.
# /etc/sudoers 파일 (visudo로만 수정!)
sudo visudo
# 형식: who where=(as_who) what
# root ALL=(ALL:ALL) ALL # root는 모든 것 가능
# %sudo ALL=(ALL:ALL) ALL # sudo 그룹은 모든 것 가능
# 특정 명령만 허용 (세밀한 권한 제어)
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/docker
# sudo 로그 확인
grep sudo /var/log/auth.log | tail -20
# 현재 sudo 권한 확인
sudo -l
| 파일 | 역할 | 중요 필드 |
|---|---|---|
| /etc/passwd | 사용자 계정 정보 |
ubuntu:x:1000:1000::/home/ubuntu:/bin/bash 이름:암호:UID:GID:설명:홈:쉘 |
| /etc/shadow | 암호화된 비밀번호 | 실제 해시 비밀번호 저장 (root만 읽기) |
| /etc/group | 그룹 정보 | docker:x:999:ubuntu,deploy |
| /etc/sudoers | sudo 권한 설정 | 어떤 사용자가 어떤 명령 실행 가능한지 |
📦 Chapter 07
패키지 관리 & 소프트웨어 설치 완전 정복
apt·yum·dnf·snap·소스 빌드까지 — Linux 소프트웨어 설치의 모든 것
📊 7-1. 패키지 매니저 비교
apt (Ubuntu/Debian 계열)
# 패키지 목록 업데이트 (항상 먼저!)
sudo apt update
# 패키지 설치
sudo apt install -y nginx
sudo apt install -y git curl wget vim
# 업그레이드
sudo apt upgrade -y
sudo apt dist-upgrade -y # 의존성 포함
# 패키지 제거
sudo apt remove nginx # 파일만
sudo apt purge nginx # 설정파일까지
sudo apt autoremove # 불필요 패키지 정리
# 검색
apt search nginx
apt show nginx
apt list --installed
dnf/yum (RHEL/CentOS/Rocky 계열)
# dnf (최신) / yum (구버전) — 사용법 동일
# 패키지 목록 업데이트
sudo dnf check-update
# 패키지 설치
sudo dnf install -y nginx
sudo dnf install -y git curl wget
# 업그레이드
sudo dnf upgrade -y
# 패키지 제거
sudo dnf remove nginx
# 검색
dnf search nginx
dnf info nginx
dnf list installed
# 그룹 설치
dnf groupinstall "Development Tools"
☕ 현업 서버 초기 설정 스크립트 (Ubuntu)
#!/bin/bash
# 서버 초기 세팅 스크립트
echo "=== 패키지 업데이트 ==="
sudo apt update && sudo apt upgrade -y
echo "=== 필수 도구 설치 ==="
sudo apt install -y \
vim curl wget git \
htop iotop iftop \
net-tools dnsutils \
build-essential \
ufw fail2ban \
unzip jq
echo "=== UFW 방화벽 설정 ==="
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
echo "=== 자동 업데이트 설정 ==="
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
echo "=== 타임존 설정 ==="
sudo timedatectl set-timezone Asia/Seoul
echo "=== 완료! ==="
echo "서버 초기 설정이 완료되었습니다."
⚙ Chapter 08
프로세스 & 시스템 관리 완전 정복
서버에서 실행 중인 프로세스를 완벽하게 제어하고, systemctl·cron으로 서비스를 자동화한다
📊 8-1. 프로세스 확인 & 제어
# 프로세스 목록 확인
ps aux # 모든 프로세스 (a=all, u=user, x=no-tty)
ps aux --sort=-%cpu | head -10 # CPU 사용률 상위 10
ps aux --sort=-%mem | head -10 # 메모리 사용률 상위 10
ps -ef | grep nginx # 특정 프로세스 검색
# 실시간 모니터링
top # 기본 모니터링
htop # 컬러풀한 모니터링 (apt install htop)
# top 단축키:
# P → CPU 정렬 M → 메모리 정렬 q → 종료
# k → 프로세스 kill 입력 1 → CPU 코어별 보기
# 프로세스 ID(PID) 검색
pgrep nginx # nginx PID 출력
pidof nginx # PID 출력
# 프로세스 종료
kill 1234 # SIGTERM (정상 종료 요청)
kill -9 1234 # SIGKILL (강제 종료)
killall nginx # 이름으로 모두 종료
pkill -f "python app" # 패턴으로 종료
🔄 8-2. 백그라운드 실행 & nohup
# 백그라운드 실행 (&)
./long_script.sh & # 백그라운드 실행
jobs # 백그라운드 작업 목록
fg %1 # 포그라운드로 복귀
bg %1 # 백그라운드 계속 실행
# nohup — SSH 종료 후에도 실행 유지
nohup ./app.sh & # SSH 끊겨도 실행 계속
nohup python3 server.py > /var/log/app.log 2>&1 &
# screen / tmux — 세션 유지
screen -S myapp # myapp 세션 생성
screen -r myapp # 세션 재접속
screen -ls # 세션 목록
# tmux (더 강력한 대안)
tmux new -s myapp # 새 세션
tmux attach -t myapp # 세션 재접속
tmux ls # 세션 목록
# Ctrl+B D → 세션에서 분리
🔄 8-3. systemctl — 서비스 관리의 핵심
systemd는 현대 Linux의 init 시스템으로, 서비스(데몬)를 관리합니다. nginx, mysql, sshd 등 모든 서비스가 systemd로 관리됩니다.
# 서비스 상태 확인
sudo systemctl status nginx
sudo systemctl status nginx --no-pager -l # 전체 출력
# 서비스 시작/중지/재시작
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx # 중지 후 시작
sudo systemctl reload nginx # 설정만 재로드 (서비스 중단 없음)
# 부팅 시 자동 시작 설정
sudo systemctl enable nginx # 자동 시작 활성화
sudo systemctl disable nginx # 자동 시작 비활성화
sudo systemctl is-enabled nginx # 활성화 여부 확인
# 모든 서비스 목록
sudo systemctl list-units --type=service
sudo systemctl list-units --type=service --state=failed # 실패한 서비스만
# 서비스 로그 (journalctl)
sudo journalctl -u nginx # nginx 로그 전체
sudo journalctl -u nginx -f # 실시간 (-f: follow)
sudo journalctl -u nginx --since "1 hour ago"
sudo journalctl -u nginx -n 50 # 마지막 50줄
⌛ 8-4. cron — 작업 자동화 스케줄러
crontab 형식
# 분 시 일 월 요일 명령
# 0-59 0-23 1-31 1-12 0-7(0,7=일요일)
# crontab 편집
crontab -e # 현재 사용자 crontab 편집
crontab -l # 현재 crontab 목록
crontab -r # crontab 삭제
# 예시:
# 매분 실행
* * * * * /usr/bin/python3 /app/monitor.py
# 매일 새벽 2시에 백업
0 2 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1
# 매주 월요일 오전 9시
0 9 * * 1 /scripts/weekly_report.sh
# 매월 1일 자정
0 0 1 * * /scripts/monthly_cleanup.sh
# 5분마다
*/5 * * * * /scripts/health_check.sh
# 현업 실전: 30일 이상 된 로그 자동 삭제
0 3 * * * find /var/log/nginx -name "*.log.gz" -mtime +30 -delete
✅ 시스템 자원 모니터링 핵심 명령어
| 명령어 | 확인 항목 | 주요 지표 |
|---|---|---|
| top / htop | CPU, 메모리, 프로세스 | load average, %cpu, %mem |
| free -h | 메모리 사용량 | total, used, free, buff/cache, available |
| df -h | 디스크 사용량 | Filesystem, Size, Used, Use%, Mounted on |
| iostat -x 1 | 디스크 I/O | %util, r/s, w/s, await |
| vmstat 1 | 시스템 통계 | procs, memory, swap, io, cpu |
| sar -u 1 10 | CPU 히스토리 | %user, %system, %idle |
🌐 Chapter 09
네트워크 설정 & SSH 완전 정복
Linux 서버 네트워크 설정과 SSH 키 인증 — 인프라 엔지니어의 핵심 실무 스킬
📊 9-1. 네트워크 상태 확인 명령어
# IP 주소 확인
ip addr show # 모든 인터페이스 IP 확인
ip addr show eth0 # 특정 인터페이스만
ip -4 addr # IPv4만
hostname -I # 서버 IP 빠르게 확인
curl ifconfig.me # 외부 공인 IP 확인
# 라우팅 테이블
ip route show # 라우팅 테이블
ip route get 8.8.8.8 # 특정 IP 경로
# 포트 & 연결 확인
ss -tulnp # 열려있는 포트 + PID (현업 필수!)
ss -s # 연결 통계 요약
netstat -an | grep LISTEN # 리스닝 포트 (구버전)
# 네트워크 연결 테스트
ping -c 4 google.com # 연결 테스트 (4번만)
traceroute google.com # 경로 추적
mtr google.com # ping + traceroute 조합
# DNS 조회
nslookup google.com # DNS 조회
dig google.com # 상세 DNS 조회
dig +short google.com A # A레코드만
host -t MX google.com # MX 레코드
# 포트 연결 테스트
nc -zv db-server 3306 # MySQL 포트 오픈 확인
telnet redis-server 6379 # Redis 포트 확인
curl -v https://api.example.com/health # HTTP 연결 확인
🔑 9-2. SSH 완전 정복 — 키 인증부터 보안 설정까지
SSH(Secure Shell)는 암호화된 원격 서버 접속 프로토콜입니다. 인프라 엔지니어의 가장 기본적인 도구이며, 키 인증 방식이 비밀번호보다 훨씬 안전합니다.
# === SSH 키 생성 (클라이언트에서) ===
ssh-keygen -t ed25519 -C "admin@myserver" # ED25519 키 (권장)
# 또는
ssh-keygen -t rsa -b 4096 -C "admin@myserver" # RSA 4096비트
# 파일 저장 위치: ~/.ssh/id_ed25519 (개인키), ~/.ssh/id_ed25519.pub (공개키)
# === 공개키를 서버에 등록 ===
ssh-copy-id ubuntu@server-ip # 자동 복사 (권장)
# 또는 수동으로:
cat ~/.ssh/id_ed25519.pub | ssh ubuntu@server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# === SSH 접속 ===
ssh ubuntu@192.168.1.100 # 기본 접속
ssh -p 2222 ubuntu@server-ip # 포트 지정
ssh -i ~/.ssh/mykey ubuntu@server-ip # 특정 키 파일 사용
# === ~/.ssh/config 파일로 간편 접속 ===
cat ~/.ssh/config
# Host web-prod
# HostName 10.0.1.10
# User ubuntu
# Port 22
# IdentityFile ~/.ssh/prod_key
#
# Host db-prod
# HostName 10.0.2.20
# User deploy
# ProxyJump bastion # bastion 서버 경유
ssh web-prod # 간편 접속!
🛡 SSH 서버 보안 강화 (/etc/ssh/sshd_config)
# /etc/ssh/sshd_config 보안 설정
sudo vim /etc/ssh/sshd_config
# 비밀번호 로그인 비활성화 (키 인증만 허용)
PasswordAuthentication no
# root 직접 로그인 차단
PermitRootLogin no
# 허용 사용자 지정 (화이트리스트)
AllowUsers ubuntu deploy
# SSH 포트 변경 (기본 22 → 다른 포트)
Port 22 # 변경 시 방화벽도 함께 수정!
# 유휴 연결 자동 종료 (300초)
ClientAliveInterval 300
ClientAliveCountMax 2
# 최대 인증 시도 횟수
MaxAuthTries 3
# X11 포워딩 비활성화 (불필요)
X11Forwarding no
# 설정 적용
sudo systemctl restart sshd
# fail2ban 설치 (SSH 브루트포스 방어)
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd # 차단 현황 확인
🌐 SSH 터널링 & 포트포워딩
# 로컬 포트포워딩: 로컬 포트 → 서버 너머 서비스 접속
# 예: 서버 내 DB(3306)를 로컬 3306으로 접근
ssh -L 3306:localhost:3306 ubuntu@server-ip
# → 이제 로컬에서 localhost:3306으로 DB 접속 가능!
# 원격 포트포워딩: 서버 포트 → 로컬 서비스
ssh -R 8080:localhost:3000 ubuntu@server-ip
# → 서버의 8080으로 접속하면 로컬 3000으로 연결
# SOCKS 프록시 (동적 포트포워딩)
ssh -D 1080 ubuntu@server-ip
# → 브라우저 프록시를 localhost:1080으로 설정
# SCP — 파일 전송
scp local.txt ubuntu@server-ip:/tmp/ # 업로드
scp ubuntu@server-ip:/var/log/app.log ./ # 다운로드
scp -r ./deploy/ ubuntu@server-ip:/app/ # 디렉토리
# rsync — 효율적 파일 동기화
rsync -avz ./app/ ubuntu@server-ip:/app/ # 원격 동기화
rsync -avz --delete ./app/ ubuntu@server-ip:/app/ # 삭제도 동기화
💻 Chapter 10
쉘 스크립트 & 자동화 완전 정복
반복 작업을 자동화하는 쉘 스크립트! 변수·조건문·반복문·함수·cron 자동화까지 실전 완성
💡 10-1. 쉘 스크립트 기초
#!/bin/bash
# 첫 줄은 항상 shebang! (어떤 인터프리터로 실행할지)
# === 변수 ===
NAME="ubuntu" # 대입 시 공백 없이!
COUNT=10
TODAY=$(date +%Y%m%d) # 명령어 결과를 변수에
echo "오늘: $TODAY" # 변수 사용
echo "이름: ${NAME}이다" # 중괄호로 명확하게
# 특수 변수
echo $0 # 스크립트 이름
echo $1 # 첫 번째 인자
echo $# # 인자 개수
echo $@ # 모든 인자
echo $? # 직전 명령 종료 코드 (0=성공)
echo $$ # 현재 프로세스 PID
# === 조건문 ===
if [ $COUNT -gt 5 ]; then
echo "5보다 크다"
elif [ $COUNT -eq 5 ]; then
echo "5이다"
else
echo "5보다 작다"
fi
# 파일/디렉토리 조건
if [ -f "/etc/nginx/nginx.conf" ]; then
echo "nginx 설정 파일 존재"
fi
if [ -d "/app/logs" ]; then
echo "로그 디렉토리 존재"
else
mkdir -p /app/logs
fi
# 비교 연산자
# -eq: 같음 -ne: 다름 -gt: 크다 -lt: 작다 -ge: 이상 -le: 이하
# -f: 파일 존재 -d: 디렉토리 존재 -z: 빈 문자열 -n: 비어있지 않음
🔄 반복문 & 함수
# === for 반복문 ===
for i in 1 2 3 4 5; do
echo "아이템: $i"
done
# 파일 목록 반복
for log in /var/log/nginx/*.log; do
echo "처리 중: $log"
done
# C 스타일 for
for ((i=1; i<=10; i++)); do
echo $i
done
# === while 반복문 ===
count=0
while [ $count -lt 5 ]; do
echo "카운트: $count"
((count++))
done
# === 함수 ===
log_message() {
local level=$1 # local = 함수 내 지역 변수
local msg=$2
echo "[$(date +%H:%M:%S)] [$level] $msg"
}
check_service() {
local service=$1
if systemctl is-active --quiet $service; then
log_message "INFO" "$service 실행 중"
return 0
else
log_message "ERROR" "$service 중지됨!"
return 1
fi
}
# 함수 호출
check_service nginx
check_service mysql
☕ 현업 실전 스크립트 — 서버 헬스체크 자동화
#!/bin/bash
# health_check.sh — 서버 헬스체크 + 슬랙 알림
SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK"
THRESHOLD_CPU=80
THRESHOLD_MEM=85
THRESHOLD_DISK=90
send_alert() {
local message=$1
curl -s -X POST $SLACK_WEBHOOK \
-H "Content-type: application/json" \
-d "{"text": "$(hostname): $message"}"
}
# CPU 확인
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d"%" -f1 | cut -d"." -f1)
if [ "$CPU_USAGE" -gt "$THRESHOLD_CPU" ]; then
send_alert "CPU 경고: ${CPU_USAGE}% (임계값: ${THRESHOLD_CPU}%)"
fi
# 메모리 확인
MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
if [ "$MEM_USAGE" -gt "$THRESHOLD_MEM" ]; then
send_alert "메모리 경고: ${MEM_USAGE}% 사용 중"
fi
# 디스크 확인
DISK_USAGE=$(df / | grep / | awk '{print $5}' | sed 's/%//g')
if [ "$DISK_USAGE" -gt "$THRESHOLD_DISK" ]; then
send_alert "디스크 경고: ${DISK_USAGE}% 사용 중 — 즉시 정리 필요!"
fi
# 서비스 확인
for service in nginx mysql redis; do
if ! systemctl is-active --quiet $service; then
send_alert "$service 서비스 중지됨! 자동 재시작 시도"
sudo systemctl restart $service
fi
done
echo "헬스체크 완료: $(date)"
🏆 Chapter 11
현업 면접 Q&A TOP 10 — Linux 기초
실제 인프라 엔지니어 면접에서 자주 나오는 Linux 질문과 합격 수준의 완벽한 답변
A: 755(rwxr-xr-x)는 소유자에게 모든 권한, 그룹과 others에 읽기+실행 권한입니다. 디렉토리나 실행 파일에 적합합니다. 644(rw-r--r--)는 소유자에게 읽기+쓰기, 나머지에 읽기만입니다. 설정 파일, HTML 파일에 사용합니다. SSH 키는 600(rw-------)으로 더 좁게 설정합니다.
A: /etc는 시스템 설정 파일 저장소(nginx.conf, sshd_config 등), /var는 가변 데이터(로그, 캐시, DB 파일), /usr는 사용자 설치 프로그램과 공유 라이브러리, /tmp는 임시 파일(재부팅 시 삭제)입니다. 인프라 엔지니어는 /etc와 /var/log를 가장 자주 참조합니다.
A: 프로세스는 실행 중인 프로그램 인스턴스입니다. 데몬(Daemon)은 백그라운드에서 지속적으로 실행되며 서비스를 제공하는 특수한 프로세스입니다. nginx, sshd, mysqld 등이 데몬입니다. 보통 이름 끝에 d가 붙으며, systemd로 관리됩니다.
A: 1) df -h로 어느 파티션인지 확인, 2) du -sh /*로 큰 디렉토리 찾기, 3) find /var -name "*.log" -size +100M으로 대용량 로그 파일 찾기, 4) 오래된 로그 파일 삭제 또는 gzip 압축, 5) 근본 해결책으로 logrotate 설정 또는 디스크 확장을 진행합니다.
A: SSH 키는 공개키/개인키 쌍을 사용한 비대칭 암호화입니다. 서버에 공개키만 저장하고 개인키는 클라이언트에만 보관합니다. 무차별 대입(brute force) 공격이 사실상 불가능하며, 네트워크로 비밀번호가 전송되지 않아 중간자 공격에도 안전합니다.
A: 좀비(zombie) 프로세스는 실행은 종료됐지만 부모 프로세스가 wait() 시스템 콜로 종료 상태를 회수하지 않아 프로세스 테이블에 남아있는 상태입니다. ps로 Z 상태로 보입니다. 자원을 거의 사용하지 않지만 PID를 점유합니다. 부모 프로세스를 kill하거나 코드를 수정하여 해결합니다.
A: restart는 서비스를 완전히 중지 후 다시 시작하므로 기존 연결이 모두 끊깁니다. reload는 프로세스는 살아있으면서 설정 파일만 다시 읽어 반영합니다. nginx 설정 변경 시 reload를 사용하면 서비스 중단 없이 적용됩니다. reload를 지원하지 않는 서비스는 restart를 사용해야 합니다.
A: cron은 전통적인 스케줄러로 간단하고 널리 사용됩니다. systemd timer는 더 정밀한 시간 제어, 의존성 관리, journalctl 로그 통합이 가능합니다. 또한 부팅 후 일정 시간이 지난 뒤 실행(OnBootSec)이나 이전 실행 종료 후(OnUnitActiveSec) 실행도 지원합니다.
A: load average는 1분/5분/15분 평균 실행 대기 프로세스 수입니다. CPU 코어 수와 비교합니다. 4코어 서버에서 load 4.0은 100% 포화 상태입니다. 1분 값이 갑자기 높아지면 현재 문제, 15분 값이 높으면 지속적 과부하를 의미합니다. top, uptime 명령으로 확인합니다.
A: ss -tulnp | grep :포트번호 또는 lsof -i :포트번호 명령을 사용합니다. 예를 들어 ss -tulnp | grep :80 으로 80번 포트를 점유한 프로세스와 PID를 확인할 수 있습니다. 방화벽 설정이나 서비스 충돌 문제 해결 시 가장 먼저 사용하는 명령입니다.
✅ InfraDevGuide0002 학습 완료 체크리스트
🐧 Linux 기초 개념
- Linux 커널 구조 (커널-쉘-앱) 설명 가능
- Ubuntu/CentOS/Alpine 배포판 특징 이해
- FHS 디렉토리 구조 (/etc /var /usr 역할)
- 파일 권한 숫자(755, 644, 600) 즉답 가능
- 프로세스 vs 데몬 차이 설명 가능
💻 실습 완료
- find 명령어로 파일 검색 및 삭제 자동화
- grep으로 로그에서 에러 패턴 추출
- chmod/chown으로 파일 권한 설정
- SSH 키 생성 및 서버 등록
- crontab으로 자동화 스케줄 설정
⚙ 서비스 & 프로세스 관리
- systemctl start/stop/restart/reload 능숙하게 사용
- journalctl로 서비스 로그 실시간 확인
- ps aux / top / htop으로 프로세스 모니터링
- kill / pkill로 프로세스 종료
- nohup / screen / tmux 세션 관리
🏆 쉘 스크립트 & 자동화
- 변수, 조건문, 반복문 활용 스크립트 작성
- 함수 정의 및 재사용 가능한 스크립트 설계
- 서버 헬스체크 + 슬랙 알림 스크립트 완성
- crontab으로 정기 실행 자동화
- 면접 Q&A 10개 답변 암기
InfraDevGuide0002 완료!
Linux 기초부터 쉘 스크립트 자동화까지
현업 인프라 엔지니어가 매일 쓰는 Linux 핵심 기술을 완전 마스터했습니다!
👉 다음 단계: InfraDevGuide0003
네트워크 기초 완전 정복 — OSI 7계층·TCP/IP·라우팅·방화벽·DNS까지
📚 InfraDevGuide Series |
ToBeFullStackDev
🕐 최종 업데이트: 2026.03 | ★ 현업 인프라 엔지니어 기준 작성