🐧
서버 운영체제

Linux 완전 가이드

👥 방문자 수

서버와 클라우드 환경의 핵심, Linux를 기초 명령어부터 시스템 관리, 셸 스크립트까지 체계적으로 학습합니다. 실무에서 즉시 활용 가능한 핵심 지식을 완벽하게 정리했습니다.

Ubuntu 24.04 bash · 셸 스크립트 파일 시스템 · 권한 서버 운영 · DevOps

1. Linux란?

Linux는 전 세계 서버와 클라우드 인프라를 지탱하는 가장 강력한 오픈소스 운영체제 커널입니다. AWS, GCP, Azure의 대부분 인스턴스, Docker 컨테이너, Android 모두 Linux 기반입니다.

배포판패키지 매니저주요 용도
Ubuntu / Debianapt서버, 개발환경, 클라우드
RHEL / CentOS Streamdnf / yum엔터프라이즈 서버
AlpineapkDocker 컨테이너 (초경량)
Arch Linuxpacman개발자 데스크톱

2. 파일 시스템 구조

경로설명
/루트 — 모든 파일 시스템의 최상위
/etc시스템·서비스 설정 파일
/var/log로그 파일
/home사용자 홈 디렉토리
/usr/bin일반 사용자 실행 파일
/proc프로세스 정보 (가상 파일 시스템)
/tmp임시 파일 (재부팅 시 삭제)

3. 기본 명령어

# ── 탐색 ──────────────────────────────────────────
pwd              # 현재 경로
ls -lah          # 상세 목록 (숨김 파일 포함, 사람 읽기 좋은 크기)
cd /var/log      # 디렉토리 이동
cd -             # 이전 디렉토리로
cd ~             # 홈 디렉토리로

# ── 파일/디렉토리 ──────────────────────────────────
mkdir -p app/src # 중간 디렉토리 포함 생성
touch file.txt   # 빈 파일 생성 / 타임스탬프 갱신
cp -r src/ dst/  # 재귀 복사
mv old.txt new.txt
rm -rf dir/      # 디렉토리 강제 삭제 (주의!)
ln -s /etc/nginx/nginx.conf ./nginx.conf  # 심볼릭 링크

# ── 텍스트 보기 ────────────────────────────────────
cat file.txt
less file.txt    # 페이지 단위로 보기 (q로 종료)
head -20 file    # 앞 20줄
tail -50 file    # 뒤 50줄
tail -f /var/log/syslog  # 실시간 스트리밍

# ── 도움말 ────────────────────────────────────────
man ls           # 매뉴얼 페이지
ls --help
tldr ls          # 간단한 예제 중심 도움말 (tldr 설치 필요)bash

4. 파일 조작

# ── 텍스트 처리 ───────────────────────────────────
echo "Hello" > file.txt    # 덮어쓰기
echo "World" >> file.txt   # 추가

# sed: 스트림 편집기
sed 's/old/new/g' file.txt          # old를 new로 전체 치환 (출력만)
sed -i 's/localhost/0.0.0.0/g' app.conf  # 원본 파일 직접 수정

# awk: 열 기반 처리
awk '{print $1, $3}' log.txt        # 1번째, 3번째 열 추출
awk -F':' '{print $1}' /etc/passwd  # ':' 구분자로 첫 열(사용자명)
awk '{sum+=$NF} END{print sum}' nums.txt  # 마지막 열 합계

# sort / uniq
sort -k2 -nr data.txt      # 2번 열 기준 숫자 역순 정렬
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# → 접속 IP 순위

# tr: 문자 변환
echo "hello world" | tr 'a-z' 'A-Z'   # 대문자 변환
echo "a:b:c" | tr ':' '\n'             # 구분자를 줄바꿈으로

# wc: 단어/줄 수 세기
wc -l file.txt             # 줄 수
wc -w file.txt             # 단어 수bash
# ── grep ──────────────────────────────────────────
grep "ERROR"          /var/log/app.log         # 패턴 검색
grep -r "TODO"        ./src/ --include="*.py"  # 재귀 + 파일 필터
grep -n "Exception"   app.log                  # 줄 번호 표시
grep -v "DEBUG"       app.log                  # 패턴 제외
grep -E "^[0-9]{4}"  file.txt                  # 확장 정규식
grep -c "WARN"        app.log                  # 일치 줄 수 세기

# ── find ──────────────────────────────────────────
find /var/log -name "*.log" -mtime +7          # 7일 넘은 .log
find /app     -name "*.py"  -size +1M          # 1MB 초과 .py
find /tmp     -type f       -delete            # 파일만 삭제
find .        -name "*.sh"  -exec chmod +x {} \; # 권한 일괄 변경

# ── du / df ───────────────────────────────────────
df -h                              # 파일 시스템 사용량
du -sh /var/log/* | sort -hr       # 디렉토리 크기 내림차순

# ── ripgrep (rg) — grep보다 10배 빠름 ─────────────
rg "TODO" ./src --type py          # Python 파일에서 TODO 검색bash

6. 파일 권한

# ── 권한 구조: [유형][소유자][그룹][기타] ─────────
# -rwxr-xr--
#  │  │   │   └── 기타(other): r-- = 읽기만
#  │  │   └────── 그룹(group): r-x = 읽기+실행
#  │  └────────── 소유자(user): rwx = 읽기+쓰기+실행
#  └───────────── 파일 유형: -=파일 d=디렉토리 l=링크

# chmod: 권한 변경
chmod 755 script.sh         # rwxr-xr-x (8진수)
chmod +x  script.sh         # 실행 권한 추가 (기호)
chmod -w  file.txt          # 쓰기 권한 제거
chmod o-r secret.txt        # 기타 사용자 읽기 제거
chmod -R 755 /var/www/      # 재귀 적용

# chown: 소유자 변경
sudo chown user:group file.txt
sudo chown -R www-data:www-data /var/www/

# setuid / setgid / sticky bit
chmod u+s /usr/bin/passwd   # setuid: 소유자 권한으로 실행
chmod +t  /tmp              # sticky: 자신의 파일만 삭제 가능

# 권한 확인
stat -c "%a %n" file.txt   # 8진수 권한 표시
ls -l file.txtbash

7. 프로세스 관리

# ── 모니터링 ──────────────────────────────────────
top                       # 실시간 모니터링 (q 종료)
htop                      # 컬러 대화형 모니터링
ps aux                    # 전체 프로세스 스냅샷
ps aux | grep nginx       # 특정 프로세스 찾기
pstree                    # 프로세스 트리

# ── 포트 & 소켓 ────────────────────────────────────
ss -tlnp                  # TCP 리스닝 포트 + PID
lsof -i :8080             # 8080 포트 사용 프로세스
lsof -p 1234              # PID 1234가 열고 있는 파일

# ── 시그널 ────────────────────────────────────────
kill     1234             # SIGTERM (정상 종료 요청)
kill -9  1234             # SIGKILL (강제 종료 — 최후 수단)
kill -HUP $(pidof nginx)  # 설정 재로드 (Nginx)
killall nginx             # 이름으로 종료

# ── 백그라운드 / 세션 ────────────────────────────
./long-task &             # 백그라운드 실행
nohup ./server > out.log 2>&1 &  # 터미널 종료 후에도 실행
jobs                      # 현재 셸의 백그라운드 작업
fg %1                     # 1번 작업 포그라운드로

# tmux (세션 유지)
tmux new -s work          # 새 세션 생성
tmux attach -t work       # 세션 재접속
# Ctrl+b d → 세션 분리 (백그라운드 유지)

# ── systemd ────────────────────────────────────────
systemctl status nginx
systemctl start|stop|restart|reload nginx
systemctl enable nginx    # 부팅 시 자동 시작
systemctl disable nginx
journalctl -u nginx -f --since "1 hour ago"  # 로그 스트리밍bash

8. 패키지 관리

# ── Ubuntu / Debian (apt) ────────────────────────
sudo apt update                    # 패키지 목록 갱신
sudo apt upgrade -y                # 전체 업그레이드
sudo apt install -y nginx          # 설치
sudo apt remove nginx              # 제거 (설정 파일 유지)
sudo apt purge nginx               # 완전 제거 (설정까지)
sudo apt autoremove                # 미사용 의존성 정리
apt search "keyword"               # 패키지 검색
apt show nginx                     # 패키지 정보

# ── RHEL / Rocky / CentOS (dnf) ──────────────────
sudo dnf update -y
sudo dnf install -y httpd
sudo dnf remove httpd
sudo dnf search keyword

# ── Snap / Flatpak (앱 계층) ──────────────────────
sudo snap install code --classic   # VS Codebash

9. 네트워크

# ── 연결 확인 ─────────────────────────────────────
ping -c 4 google.com
traceroute google.com
curl -v https://httpbin.org/get    # HTTP 요청
curl -o /dev/null -s -w "%{http_code}\n" https://example.com
wget -q -O output.html https://example.com

# ── 네트워크 정보 ──────────────────────────────────
ip addr                            # IP 주소 목록 (ifconfig 대체)
ip route                           # 라우팅 테이블
ss -tlnp                           # TCP 포트 목록
nmap -sV 192.168.1.1               # 포트 스캔 (설치 필요)

# ── SSH ───────────────────────────────────────────
ssh user@192.168.1.10              # 원격 접속
ssh -i ~/.ssh/key.pem ubuntu@host  # 키 파일 지정
scp file.txt user@host:/tmp/       # 파일 전송
rsync -avz ./src/ user@host:/app/  # 효율적 동기화

# ── 방화벽 (UFW — Ubuntu) ──────────────────────────
sudo ufw enable
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw deny 3306
sudo ufw status verbose

# ── tcpdump / 트래픽 분석 ──────────────────────────
sudo tcpdump -i eth0 port 80 -w capture.pcap
sudo tcpdump -r capture.pcap -n    # 파일 분석bash

10. 셸 스크립트

#!/bin/bash
# 안전한 스크립트 설정
set -euo pipefail  # 에러 즉시 종료, 미정의 변수 오류, 파이프 에러 전파

# ── 변수와 기본값 ──────────────────────────────────
NAME="${1:-world}"           # 첫 번째 인자, 없으면 "world"
ENV="${ENV:-production}"     # 환경변수, 없으면 기본값
readonly LOG_DIR="/var/log/myapp"

# ── 함수 ──────────────────────────────────────────
log()  { echo "[$(date '+%F %T')] INFO  $*"; }
error(){ echo "[$(date '+%F %T')] ERROR $*" >&2; }

check_root() {
    [[ $EUID -eq 0 ]] || { error "root 권한 필요"; exit 1; }
}

# ── 조건문 ────────────────────────────────────────
if [[ -f "/etc/nginx/nginx.conf" ]]; then
    log "Nginx 설정 존재"
elif [[ -d "/etc/apache2" ]]; then
    log "Apache 설정 존재"
else
    error "웹서버 설정 없음"
    exit 1
fi

# ── 반복문 ────────────────────────────────────────
for file in /etc/*.conf; do
    [[ -f "$file" ]] || continue
    log "처리 중: $file"
done

servers=("web1" "web2" "web3")
for srv in "${servers[@]}"; do
    ssh "$srv" 'sudo systemctl reload nginx' && log "$srv reload 성공"
done

# ── 배열 & 문자열 ──────────────────────────────────
files=(*.log)
log "로그 파일 수: ${#files[@]}"

url="https://api.example.com/v1/users"
domain="${url#*://}"          # 프로토콜 제거
path="${domain#*/}"           # 도메인 제거 → v1/users

# ── 배포 스크립트 실전 예시 ────────────────────────
deploy() {
    local app_dir="/var/www/app"
    local backup_dir="/var/backups/app"

    log "배포 시작..."
    cp -r "$app_dir" "$backup_dir/$(date +%Y%m%d_%H%M%S)"

    git -C "$app_dir" pull origin main || { error "git pull 실패"; exit 1; }

    pushd "$app_dir" > /dev/null
    npm ci --production
    npm run build
    popd > /dev/null

    systemctl reload nginx
    log "배포 완료"
}

deploy "$@"bash
💡
~/.bashrc 생산성 설정
alias ll='ls -lah'
alias gs='git status'
alias dc='docker compose'
alias k='kubectl'

추천 도구: fzf(퍼지 검색), bat(cat 대체), exa(ls 대체), ripgrep(grep 대체)