시나리오
입사 3일 차. 운영팀에서 급하게 메시지가 왔습니다. "서버에서 Nginx가 502를 뱉고 있어요. 로그 확인해주세요." SSH 접속은 됐습니다. 문제는 — 로그가 어디에 있는지 모른다는 겁니다. /log? /nginx? /var? 이것저것 ls를 쳐보지만 어지러운 파일 목록만 나옵니다. 결국 선임에게 전화했습니다. "거기 /var/log/nginx/ 보세요." 5초 만에 해결됐습니다.
Linux는 어디에 무엇을 두는지 규칙이 있습니다. 이 구조를 알면 낯선 서버에서도 5분 안에 원하는 파일을 찾을 수 있습니다.
파일시스템 탐색
이번 챕터에서 배울 것
1Linux 디렉토리 계층 구조(FHS)를 이해하고 /etc, /var/log, /tmp 같은 실무 경로를 설명할 수 있다
2pwd, cd, ls로 파일시스템을 자유롭게 탐색할 수 있다
3절대 경로와 상대 경로의 차이를 이해하고 상황에 맞게 사용할 수 있다
4mkdir, touch로 파일과 디렉토리를 생성하고 cp, mv로 복사·이동할 수 있다
5rm 명령어를 안전하게 사용하고 실수를 예방하는 패턴을 적용할 수 있다
실습 환경 준비
실습 디렉토리 생성
mkdir -p ~/lab/filesystem && cd ~/lab/filesystem
모든 실습은 이 디렉토리 안에서 진행합니다
실습 파일 준비
touch file1.txt file2.log file3.conf && mkdir -p project/src project/docs
실습에 사용할 기본 파일과 디렉토리 구조를 만듭니다
현재 위치 확인
pwd
/home/<사용자명>/lab/filesystem 이 출력되면 준비 완료
개념
Linux 파일시스템 계층 구조 (FHS)
장애가 나면 가장 먼저 로그를 봐야 합니다. 그런데 서버에 처음 들어간 신입이 로그 파일을 찾으려면 어디를 봐야 할까요? Nginx 설정은 어디 있고, 애플리케이션 데이터는 어느 디렉토리에 쌓이는지 — 이걸 모르면 서버 안에서 길을 잃습니다. Linux는 어디에 무엇을 두는지 FHS(Filesystem Hierarchy Standard)라는 규칙으로 정해두었고, 모든 배포판이 이 규칙을 따릅니다. /etc에는 설정, /var/log에는 로그, /home에는 사용자 데이터 — 이 구조를 알면 낯선 서버에 들어가도 5분 안에 원하는 파일을 찾을 수 있습니다.
Linux의 모든 파일은 / (루트)에서 시작하는 하나의 트리 구조에 위치합니다. Windows의 C:, D:\ 같은 드라이브 구분 없이 단일 계층입니다. Filesystem Hierarchy Standard(FHS)가 어디에 무엇을 두는지 규칙을 정합니다.
bash# 루트 디렉토리 구조 한눈에 보기
ls /
outputbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
실무에서 자주 가는 경로들입니다.
| 경로 |
용도 |
실무 예시 |
/etc |
설정 파일 모음 |
/etc/nginx/nginx.conf, /etc/ssh/sshd_config |
/var/log |
로그 파일 |
/var/log/nginx/access.log, /var/log/syslog |
/var/www |
웹 서버 문서 루트 |
Nginx, Apache 기본 경로 |
/home/username |
사용자 홈 디렉토리 |
~ 로 단축 표기 |
/tmp |
임시 파일 |
재부팅 시 자동 삭제, 실습에 활용 |
/opt |
외부 소프트웨어 |
/opt/splunk, /opt/datadog-agent |
/usr/bin |
일반 실행 파일 |
ls, grep, git 등의 실제 위치 |
/proc |
프로세스/커널 가상 파일시스템 |
/proc/cpuinfo, /proc/meminfo |
bash# Nginx 설정 파일 빠르게 찾기
ls /etc/nginx/
outputconf.d nginx.conf sites-available sites-enabled
쉘 스크립트를 처음 작성할 때 흔히 저지르는 실수 중 하나가 상대 경로를 그대로 쓰는 겁니다. 터미널에서 직접 실행할 때는 잘 되다가, cron으로 자동 실행하거나 다른 디렉토리에서 스크립트를 호출하면 갑자기 "파일을 찾을 수 없다"는 오류가 납니다. 실행 위치가 달라지면 상대 경로의 기준점도 달라지기 때문입니다. 언제 절대 경로를 써야 하고 언제 상대 경로가 편한지 — 이 구분을 머릿속에 새겨두면 이런 실수를 예방할 수 있습니다.
절대 경로 (Absolute Path): 루트(/)부터 시작. 현재 위치와 무관하게 항상 같은 파일을 가리킵니다.
bashcd /etc/nginx # 어디서 실행해도 /etc/nginx 로 이동
cat /etc/hosts # 호스트 파일 읽기
상대 경로 (Relative Path): 현재 위치(pwd)를 기준으로 합니다.
bash# 현재 위치가 /home/ubuntu 라고 가정
cd lab/filesystem # /home/ubuntu/lab/filesystem 으로 이동
cd .. # 한 단계 위 → /home/ubuntu/lab
cd ../../etc # 두 단계 위 후 etc → /etc
cd ~ # 홈 디렉토리로 이동 (어디서든)
cd - # 이전 디렉토리로 토글
스크립트나 cron 작업에서는 상대 경로 대신 절대 경로를 사용하세요. 실행 위치가 달라도 항상 같은 파일을 가리킵니다.
ls -la를 처음 보면 drwxr-xr-x 2 root root 4096 같은 문자열이 나열되고 무슨 뜻인지 알기 어렵습니다. 하지만 이 한 줄에는 파일 타입, 읽기/쓰기/실행 권한, 소유자, 크기, 수정 시각이 모두 들어 있습니다. Permission denied 오류가 나거나 "왜 이 파일이 실행이 안 되지?" 싶을 때 — 해답이 이 출력 안에 있습니다.
bashls -la /etc/nginx/
outputtotal 24
drwxr-xr-x 6 root root 4096 Sep 15 10:23 .
drwxr-xr-x 97 root root 4096 Sep 15 10:23 ..
drwxr-xr-x 2 root root 4096 Sep 15 10:23 conf.d
-rw-r--r-- 1 root root 1490 Sep 15 10:23 nginx.conf
lrwxrwxrwx 1 root root 34 Sep 15 10:23 sites-enabled -> /etc/nginx/sites-available
첫 글자가 파일 타입입니다: d=디렉토리, -=일반 파일, l=심볼릭 링크. 그 뒤 9자리(rwxr-xr-x)는 소유자/그룹/그 외 순서로 읽기(r=4)·쓰기(w=2)·실행(x=1) 권한입니다.
실무에서 자주 쓰는 ls 조합입니다.
bashls -lath /var/log/nginx/ # 최신 파일이 맨 위, 사람이 읽기 좋은 용량
ls -lS /var/log/ | head -10 # 가장 큰 파일 순서로 정렬
ls /etc/*.conf # 특정 확장자만 보기
du -sh /var/log/nginx/ # 디렉토리 전체 용량 요약
— — —
Step 1. 파일시스템 탐색 (pwd, cd, ls)
pwd로 현재 위치를 확인하고 cd로 이동하면서 실무에서 자주 가는 경로를 직접 탐색합니다.
bash# 현재 위치 확인
pwd
output/home/ubuntu/lab/filesystem
bash# /etc 주요 파일 목록 확인
ls -la /etc/ | head -20
# /var/log 로그 디렉토리 확인
ls /var/log/
# 홈 디렉토리로 이동 후 다시 돌아오기
cd ~
pwd
cd -
pwd
bash# 상대 경로 이동 연습
cd /var/log
ls
cd ../../etc # 두 단계 올라간 뒤 etc 로 이동
pwd
cd ~/lab/filesystem # 실습 디렉토리로 복귀
output/etc
bashls -la /etc/ | head -20
Step 2. 파일과 디렉토리 생성 (mkdir, touch)
mkdir -p로 중첩 디렉토리를 한 번에 만들고, touch로 빈 파일을 생성합니다.
bashcd ~/lab/filesystem
# 중첩 디렉토리 한 번에 생성 (-p 옵션 없으면 상위 디렉토리가 없어 실패)
mkdir -p app/src/utils
mkdir -p app/logs app/configs
# 구조 확인
ls -R app/
outputapp/:
configs logs src
app/configs:
app/logs:
app/src:
utils
bash# 빈 파일 생성
touch app/configs/app.conf
touch app/logs/app.log app/logs/error.log
# 파일 목록 확인 (타임스탬프 포함)
ls -la app/configs/
ls -la app/logs/
bashmkdir -p app/src/utils && touch app/configs/app.conf
Step 3. 파일 복사와 이동 (cp, mv)
cp는 원본을 남기고 복사하고, mv는 원본을 이동하거나 이름을 바꿉니다. 디렉토리를 복사할 때는 -r 옵션이 필수입니다.
bashcd ~/lab/filesystem
# 파일 복사 (백업 관행: .bak 또는 날짜 suffix)
cp app/configs/app.conf app/configs/app.conf.bak
ls app/configs/
outputapp.conf app.conf.bak
bash# 디렉토리 전체 복사 (-r 없으면 오류)
cp -r app/ app-backup/
ls
outputapp app-backup
bash# 파일 이름 변경 (같은 디렉토리 내 mv)
mv app/configs/app.conf.bak app/configs/app.conf.20240915
# 파일 이동 (잘라내기+붙여넣기)
mkdir archive
mv app/logs/app.log app/logs/error.log archive/
ls archive/
ls app/logs/
outputaccess.log error.log
(비어 있음)
bashcp -r app/ app-backup/
Step 4. 파일 삭제 (rm) — 신중하게
rm은 휴지통 없이 즉시 삭제합니다. -i 옵션으로 삭제 전 확인을 요청하는 습관을 들이세요.
bashcd ~/lab/filesystem
# 파일 하나 삭제
rm app/configs/app.conf.20240915
# 삭제 전 확인 (-i 옵션) — y 입력 시 삭제
rm -i app-backup/configs/app.conf
outputrm: remove regular file 'app-backup/configs/app.conf'? y
bash# 디렉토리 전체 삭제 (-r 옵션)
rm -r app-backup/
# 삭제됐는지 확인
ls
outputapp archive
bash# 안전한 습관: 삭제 전 echo 로 대상 목록 확인
echo rm -r archive/ # 실제 삭제하지 않고 명령어만 출력
ls archive/ # 무엇이 삭제될지 확인
rm -r archive/ # 확인 후 실행
bashrm -i app-backup/configs/app.conf
⚠ 위험 명령
rm -rf $DIR/*
DIR 변수가 빈 문자열이면 rm -rf /* 와 동일하게 동작해 시스템 전체가 삭제될 수 있습니다. 프로덕션 서버에서 실제로 발생한 장애 유형입니다.
트러블슈팅
cp: cannot stat 'source.txt': No such file or directory
상황: 파일을 백업 디렉토리로 복사하려는데 No such file or directory 오류가 납니다. 분명히 파일을 만들었는데 왜 안 될까요?
원인: 두 가지 원인이 많습니다. 첫째, 현재 디렉토리가 파일이 있는 위치가 아닌 경우. 둘째, 파일명 오타 — Linux 파일시스템은 대소문자를 구분하므로 Config.conf와 config.conf는 다른 파일입니다.
진단:
bash# 1. 현재 위치 확인
pwd
# 2. 파일이 정말 있는지 확인 (대소문자 무시 검색)
ls | grep -i "source"
# 3. 대상 디렉토리 존재 확인
ls -la /backup/ 2>&1
outputls: cannot access '/backup/': No such file or directory
해결:
bash# 대상 디렉토리가 없으면 먼저 생성
mkdir -p /backup
# 정확한 파일명으로 재실행
cp source.txt /backup/dest.txt
# 디렉토리 복사 시 -r 옵션 누락 오류도 흔합니다
# cp: -r not specified; omitting directory 'mydir'
cp -r mydir/ /backup/
다음 모듈에서는 파일 내용을 읽고 검색하는 방법 — cat, less, grep으로 로그 파일을 분석하는 실무 기술을 다룹니다.