밤을 새웠습니다. 커서가 깜빡였습니다. 아무 일도 일어나지 않는 것처럼 보였고, 그래도 뭔가가 진행 중이라는 걸 직감했습니다. 리눅스와의 첫 만남은 늘 비슷합니다. 약간의 두려움, 약간의 설렘, 그리고 이상하게 조용한 확신. 오늘은 그 조용한 확신을 키우는 방법을 적습니다. 설치부터 운영, 실패와 복구, 그리고 스스로를 조금씩 고쳐가는 이야기까지.
왜 지금 리눅스인가: 일과 삶을 다시 정렬하는 OS
나는 통제를 좋아합니다. 동시에 자유도 원합니다. 상반된 두 욕망은 종종 싸웁니다. 리눅스는 그 사이를 연결합니다. 소스는 열려 있고, 규칙은 단단합니다. 바꿀 수 있고, 지켜야 합니다. 이 균형이 이상하게 마음을 편하게 만들었습니다.
리눅스는 서버의 언어입니다. 그러나 데스크톱, 임베디드, 클라우드, 컨테이너까지 모두 연결됩니다. 한 번 배워두면 어디에서든 통합니다. 이 글은 그 ‘한 번’을 위한 지도를 만듭니다.
준비물: 가장 안전한 시작점 고르기
- 가상머신: 위험 부담이 낮습니다. 스냅샷으로 시간 여행이 됩니다.
- 클라우드: 원격 접속과 과금에 익숙하다면 괜찮습니다.
- WSL: 윈도우에서 가볍게 시작하기 좋습니다.
처음엔 가상머신을 추천합니다. 망치면 지우고 다시. 그게 초보의 가장 큰 힘입니다.
설치: 배포판 선택, 그리고 첫 호흡
처음이라면 안정성 높은 배포판을 권합니다. Ubuntu LTS, Debian Stable, Rocky Linux 중 하나면 충분합니다. 설치 마법사는 친절합니다. 그래도 긴장을 풀지 마세요. 파티션을 건드리면 모든 게 사라질 수 있습니다.
설치 후 해야 할 일은 단순합니다. 업데이트, 사용자, 키, 시간 동기화. 아래 순서로 가면 덜 흔들립니다.
첫 업데이트
# Debian/Ubuntu
sudo apt update && sudo apt -y upgrade
# RHEL/Rocky
sudo dnf -y update
새 사용자 만들기와 sudo
# 새 사용자와 홈 디렉터리
sudo adduser devuser
# sudo 그룹 추가
sudo usermod -aG sudo devuser # Debian/Ubuntu
sudo usermod -aG wheel devuser # RHEL/Rocky
시간 동기화 확인
timedatectl
sudo timedatectl set-timezone Asia/Seoul
첫 만남: 쉘, 파일, 그리고 낯선 질서
터미널은 솔직합니다. 명령은 짧고, 결과는 분명합니다. 길을 잃어도 괜찮습니다. pwd
가 현재 위치를 말해줍니다. ls
는 주변을 보여줍니다. cd
는 다음 한 걸음입니다.
# 길 찾기
pwd
ls -al
cd /etc
파일 시스템의 뼈대는 간단합니다. /
가 우주입니다. /home
은 삶의 공간, /etc
는 규칙의 서랍, /var
는 흔적의 메모장. 알면 안심이 됩니다.
만들고 지우고, 그래서 배우는 과정
# 파일과 디렉터리
touch memo.txt
mkdir projects
mv memo.txt projects/
# 위험한 명령은 천천히
rm -rf /tmp/safedir # 엔터 전, 다시 읽기
나는 여기서 큰 실수를 한 번 했습니다. 공백 하나 때문에 잘못 지웠습니다. 손이 떨렸고, 배웠습니다. 백업은 겁쟁이가 하는 게 아닙니다. 프로가 하는 겁니다.
권한과 소유: 문을 만들고, 열쇠를 나누는 법
권한은 세 겹입니다. 사용자, 그룹, 모든 사람. 읽기, 쓰기, 실행. 단순하지만, 강력합니다.
# 권한 보기
ls -l
# 권한 바꾸기
chmod 640 secret.txt
chmod +x deploy.sh
# 소유주 바꾸기
sudo chown devuser:devuser app.log
GNU coreutils 문서는 사전처럼 든든합니다.
패키지 관리자: 세계와 연결되는 방법
설치, 삭제, 업데이트. 패키지 관리자는 생활입니다.
# Debian/Ubuntu
sudo apt install curl git
# RHEL/Rocky
sudo dnf install curl git
# Arch/Manjaro 예시
sudo pacman -Syu curl git
어떤 배포판이든 원리는 같습니다. 저장소와 신뢰. 공식 저장소를 우선합니다. 필요하면 외부를 씁니다. 하지만 서명과 출처는 항상 확인합니다. 그 습관이 시스템을 지킵니다.
프로세스와 서비스: 살아있는 것을 돌보는 일
# 현재 상황 보기
ps aux | head
top # 또는 htop
# systemd 서비스
sudo systemctl status ssh
sudo systemctl enable --now nginx
sudo systemctl restart postgresql
sudo systemctl list-unit-files --type=service
서비스가 멈추면 사람이 멈춥니다. 로그를 봅니다. 조급하면 보이지 않습니다. 천천히 읽습니다.
네트워킹: 연결이 전부일 때
# IP와 인터페이스
ip a
# 포트 확인
ss -tulpen | head
# 방화벽(택1)
sudo ufw allow 22/tcp && sudo ufw enable
sudo firewall-cmd --add-service=ssh --permanent && sudo firewall-cmd --reload
포트가 열려 있어도, 라우팅이 막힐 수 있습니다. DNS가 말썽일 때도 많습니다. dig
과 ping
이 의외로 큰 도움을 줍니다.
참고: ArchWiki 네트워크 가이드는 깊고 넓습니다.
SSH와 열쇠: 비밀번호를 내려놓는 순간
# 키 생성과 배포
ssh-keygen -t ed25519 -C "me@linux"
ssh-copy-id devuser@server.example.com
# 설정 강화 (/etc/ssh/sshd_config 일부)
# 아래는 예시, 서버 상황에 맞게 조정
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
수정 후엔 재시작이 필요합니다.
sudo systemctl restart sshd # RHEL/Rocky
sudo systemctl restart ssh # Debian/Ubuntu
sshd_config 해설을 옆에 두면 마음이 놓입니다.
자동화: 사람이 반복하는 일을 컴퓨터에게
# 간단한 백업 스크립트 예시
#!/usr/bin/env bash
set -euo pipefail
SRC_DIR="$HOME/projects"
DST_DIR="/backup/$(date +%F)"
mkdir -p "$DST_DIR"
rsync -av --delete "$SRC_DIR/" "$DST_DIR/"
echo "backup done: $DST_DIR"
# 크론 등록
crontab -e
# 매일 새벽 3시
0 3 * * * /home/devuser/bin/backup.sh > /var/log/backup.log 2>&1
자동화는 믿음입니다. 그래서 로그가 보험입니다. 실패해도 알게 됩니다.
컨테이너 첫걸음: 가볍게, 격리해서
# Docker 설치 가이드
# 배포판별 공식 문서 참고
# 예: https://docs.docker.com/engine/install/ (링크는 아래 참고 섹션)
# 간단한 compose 예시 (docker-compose.yml)
version: "3.9"
services:
web:
image: nginx:stable
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
컨테이너는 실험을 안전하게 만듭니다. 깨끗이 지우고, 다시 시작할 수 있습니다. 그래서 덜 두렵습니다.
로그와 관찰: 고치는 사람의 시선
# systemd 저널
journalctl -u nginx --since "1 hour ago"
# 로그 순환
sudo logrotate -d /etc/logrotate.conf
로그는 과거의 감정에 가깝습니다. 무슨 일이 있었는지, 그때 나는 무엇을 했는지. 기록은 우리를 덜 방황하게 만듭니다.
백업과 스냅샷: 잃어본 사람만이 진심이 됩니다
# tar 압축 백업
tar -czf home-$(date +%F).tar.gz /home/devuser
# rsync 동기화
rsync -av --delete /etc/ /backup/etc-$(date +%F)/
가능하면 이중화합니다. 로컬과 원격. 그리고 복구 연습을 합니다. 복구는 읽기만 해서는 늘 실패합니다.
보안 기본: 문단속과 습관
- 키 기반 SSH. 루트 직접 로그인 금지.
- 필요 포트만 오픈. 기본 거부.
- 정기 업데이트. 중요.
- 권한 최소화.
sudo
사용 이력 점검. - 비정상 징후 알림. 알림이 늦으면 복구도 늦습니다.
기본이 전부입니다. 화려한 도구보다 습관이 시스템을 지킵니다.
네 개의 작은 실패, 그리고 배움
1) 부팅 실패
업데이트 후 재부팅이 멈췄습니다. 공포가 올라왔습니다. 라이브 ISO로 진입했습니다. 마운트하고, 로그를 읽었습니다. 원인은 파일시스템 오류. fsck
로 복구했습니다. 다시 숨을 쉬었습니다.
2) 디스크 만료
로그가 폭주했습니다. 서비스가 멈췄습니다. du -sh *
로 범인을 찾았습니다. logrotate
정책을 조정했습니다. 임계치 알림을 넣었습니다. 같은 실수를 반복하지 않겠다고 다짐했습니다.
3) SSH 차단
방화벽에서 스스로를 막았습니다. 콘솔 접속으로 복구했습니다. 규칙은 하나씩, 주석을 달고, 테스트하고, 저장합니다.
4) 도커 네트워크 충돌
사소한 서브넷 충돌이었습니다. 단순했지만, 하루를 태웠습니다. 메모를 남겼습니다. 다음번에는 5분이면 끝나도록.
학습 로드맵: 오늘 한 걸음, 내일 한 걸음
- 기초: 파일, 권한, 프로세스, 서비스.
- 네트워크: IP, 포트, 방화벽, DNS.
- 자동화: 쉘, 크론, 파이프라인.
- 컨테이너: Docker, Compose, 이미지 최적화.
- 보안: 키, 최소 권한, 업데이트, 감사.
- 관측: 로그, 모니터링, 알림, SLO.
- 복구: 백업 전략, 연습, 문서화.
참고할 만한 자원도 남깁니다. Linux Journey(실습), Rocky Linux Admin Guide, Red Hat Fundamentals, ArchWiki, kernel.org.
커뮤니티와 도움 청하는 법
- Unix & Linux Stack Exchange: 빠른 진단.
- Server Fault: 운영 이슈에 강함.
- Rocky Linux 포럼, Ask Ubuntu: 배포판별 노하우.
질문은 구체적으로. 무엇을 시도했고, 어떤 메시지가 나왔는지를 함께 적습니다. 로그의 한 줄은 선물입니다.
체크리스트: 새 서버를 맡았을 때
- 사용자/키 배포 완료
- 패키지 업데이트 적용
- 불필요 포트 닫힘 확인
- 백업 경로와 주기 설정
- 모니터링/알림 연결
- 운영 문서 저장 위치 기록
작은 회고: 터미널 앞에서 내가 달라졌다
처음엔 무서웠습니다. 명령 하나가 세상을 무너뜨릴 것 같았습니다. 그러나 이제는 압니다. 조심하면 됩니다. 기록하면 됩니다. 두려움은 공부하면 작아집니다. 그리고 나는 조금씩 변합니다. 더 단단해지고, 더 온화해집니다. 문제를 만나도 서두르지 않습니다. 한 줄씩 읽고, 한 단계씩 고칩니다.
오늘도 커서는 깜빡입니다. 나는 숨을 고릅니다. 그리고 다음 줄로 나아갑니다.