공공부하자개발 · 영어 학습 노트
리눅스
리눅스 운영RHEL 에서 배포·운영하기0/13 완료
  • 01셸 기본과 파일 시스템
  • 02텍스트 처리 (grep·sed·awk)
  • 03프로세스·서비스 관리 (systemd)
  • 04자바 애플리케이션 배포
  • 05Tomcat·nginx 배포·재기동
  • 06로그·디스크 운영 (logrotate·cron)
  • 07네트워크 진단 (ss·curl·firewalld)
  • 08셸 스크립트 (운영 자동화)
  • 09장애 대응 (jstack·jmap·OOM killer·FD)
  • 10보안 기초 (ssh 강화·SELinux·감사 로그)
  • 11컨테이너 기초 (podman)
  • 12백업·복구 (설정·릴리스·DB 덤프)
  • 13Docker 실무
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 리눅스 운영 › 01 / 13

셸 기본과 파일 시스템

섹션 7진행 0 / 13
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

2. 핵심 원리

2.1 접속과 셸

서버 접속은 대부분 ssh 사용자명@서버주소 한 줄로 시작합니다. Windows 에서는 PuTTY 나 Windows Terminal 의 ssh 명령을 씁니다. 처음 접속하면 호스트 키 확인 문구가 뜨는데, yes 를 입력해야 다음부터 자동으로 신뢰합니다.

접속에 성공하면 프롬프트가 보입니다. 일반 사용자는 $, root 사용자는 # 으로 끝납니다. 이 한 글자만 봐도 지금 어떤 권한으로 명령을 실행하는지 알 수 있습니다.

RHEL 계열의 기본 셸은 대부분 bash 입니다. 이 레슨의 모든 예제는 bash 문법을 기준으로 합니다.

비밀번호 로그인 대신 키 기반 인증(ssh -i키파일 사용자@서버)을 쓰는 곳도 많습니다. 개인키 파일 권한이 너무 넓으면(644 등) ssh 가 접속을 거부하니, chmod 600 키파일 로 소유자만 읽게 맞춰야 합니다. 사내 보안 규정상 키 발급·폐기 절차가 따로 있는 경우가 대부분이라 담당자에게 먼저 확인합니다.

2.2 FHS 디렉터리 구조

리눅스는 FHS(Filesystem Hierarchy Standard) 라는 표준 디렉터리 배치를 따릅니다. 배포판이 달라도 아래 경로는 같은 용도로 씁니다.

경로 용도
/etc 시스템·서비스 설정 파일
/var/log 로그 파일
/opt 서드파티·사내 애플리케이션
/home 사용자 홈 디렉터리
/tmp 임시 파일, 재부팅 시 삭제 가능
/proc 실행 중 프로세스·커널 정보(가상)
/usr 배포판이 제공하는 프로그램·라이브러리

/etc 는 설정 전용이라 애플리케이션 데이터를 두면 안 됩니다. /var/log 는 로그가 계속 쌓이므로 디스크 용량을 주기적으로 확인해야 합니다. /opt 는 사내 자바 애플리케이션을 두는 관례적인 위치입니다.

/proc 은 디스크가 아니라 커널이 실시간으로 만들어 주는 가상 파일 시스템입니다. /proc/[pid]/status 로 특정 프로세스 정보를 볼 수 있습니다. /tmp 는 재부팅하면 비워질 수 있으니 중요한 파일을 두면 안 됩니다.

2.3 경로와 이동

pwd 는 현재 위치, cd 는 이동, ls -la 는 숨김 파일까지 포함한 상세 목록입니다. -l 은 자세히, -a 는 숨김 파일 포함, -h 는 용량을 사람이 읽기 쉽게 바꿉니다.

경로 축약 기호도 알아둬야 합니다. ~ 는 홈 디렉터리, . 은 현재 위치, .. 은 한 단계 위, - 은 직전에 있던 디렉터리입니다.

bash
cd /opt/myapp    # 이동
cd -             # 방금 있던 곳으로 되돌아감

이름이 . 로 시작하는 파일은 숨김 파일입니다. .bashrc, .ssh 처럼 설정 파일이 많고, ls 만으로는 안 보이고 ls -a 로만 보입니다.

2.4 파일 조작

mkdir -p a/b/c 는 중간 디렉터리가 없어도 한 번에 만듭니다. cp, mv 는 각각 복사와 이동(이름 변경 포함)입니다.

rm -rf 는 디렉터리를 강제로, 확인 없이, 재귀적으로 지웁니다. 되돌릴 방법이 없고, 휴지통도 없습니다. 변수가 비어 있는 상태로 rm -rf "$DIR"/* 를 실행하면 루트 아래 전체를 지울 수 있어 각별히 주의해야 합니다.

bash
mkdir -p releases/v3/{bin,conf,lib,logs}   # 배포 폴더 뼈대
cp -r conf/* releases/v3/conf/             # 설정만 복사
mv releases/v3/lib/old.jar /tmp/           # 잘못 올라간 파일 이동
rm -rf releases/v0                         # 아주 오래된 배포판 정리

새 폴더를 만들 때는 mkdir -p 로 중간 경로까지 한 번에 만드는 습관을 들이면, 상위 폴더가 없어서 실패하는 일이 없습니다. cp -r 은 폴더를 재귀적으로 복사하므로 설정 폴더 전체를 옮길 때 유용합니다.

2.5 찾기

파일을 이름·크기·수정 시각으로 찾을 때는 find 를 씁니다.

bash
find /opt/myapp -name '*.log'             # 이름으로
find . -type f -size +100M                # 100MB 초과 파일
find . -mtime -1                          # 최근 1일 안에 수정
find /var/log -mtime +30 -exec rm {} \;   # 30일 지난 파일 삭제

-exec 는 찾은 파일마다 뒤의 명령을 실행하고, {} 자리에 파일 경로가 들어갑니다. 명령어가 어디 있는지 찾을 때는 which java(경로만) 또는 type java(셸 내장인지 실행 파일인지까지) 를 씁니다.

2.6 보기

cat 은 파일 전체를 한 번에 출력합니다. 수 GB 짜리 로그에 cat 을 쓰면 터미널이 그대로 멈춘 것처럼 보이니, less 로 페이지 단위로 넘겨 보는 게 안전합니다.

bash
less app.log          # q 로 종료, / 로 검색
head -n 50 app.log    # 앞 50줄
tail -n 50 app.log    # 뒤 50줄
tail -f app.log        # 새로 추가되는 로그를 실시간으로

tail -f 는 배포 직후 애플리케이션이 정상 기동했는지 확인할 때 가장 많이 쓰는 명령입니다. Ctrl+C 로 빠져나옵니다.

2.7 권한 모델

리눅스 파일은 소유자(owner)·그룹(group)·기타(other) 세 대상에 각각 읽기(r)·쓰기(w)·실행(x) 권한을 가집니다. ls -l 출력의 앞 10글자가 이를 보여줍니다.

text
-rwxr-x---   # 소유자 rwx, 그룹 r-x, 기타 없음
숫자 권한 의미
7 rwx 읽기+쓰기+실행
6 rw- 읽기+쓰기
5 r-x 읽기+실행
4 r-- 읽기만
0 --- 권한 없음

디렉터리의 실행(x) 권한은 "그 안에 들어갈 수 있는지" 를 뜻합니다. 읽기(r) 만 있으면 목록은 보여도 안으로 들어갈 수 없습니다.

chmod 750 file 로 숫자 표기를, chmod u+x file 로 기호 표기를 씁니다. chown app:app file 은 소유자와 그룹을 바꿉니다. umask 는 새로 만드는 파일의 기본 권한에서 얼마를 깎을지 정하는 값입니다.

운영에 필요한 명령만 sudo 로 실행하고, 애플리케이션 자체는 root 가 아니라 전용 서비스 계정(예: app)으로 돌리는 것이 관례입니다. root 로 자바 프로세스를 띄우면 취약점 하나가 서버 전체 장악으로 이어질 수 있습니다.

2.8 리다이렉션·파이프·종료 코드

> 는 덮어쓰기, >> 는 이어쓰기, 2> 는 표준 에러만 파일로 보냅니다. 2>&1 은 표준 에러를 표준 출력과 합치는데, 순서가 중요해 > file 2>&1 처럼 뒤에 와야 합니다.

bash
cmd > out.log 2>&1        # 출력·에러 모두 out.log
cmd > /dev/null 2>&1       # 모두 버림

| 는 앞 명령의 출력을 뒤 명령의 입력으로 연결합니다. tee 는 파이프 중간에서 파일로도 저장하면서 화면에도 그대로 보여줍니다.

모든 명령은 끝나면 종료 코드를 남기고, $? 로 바로 직전 명령의 값을 읽습니다. 0 은 성공, 그 외는 실패입니다. && 는 앞이 성공해야, || 는 앞이 실패해야 뒤를 실행합니다.

2.9 환경 변수

APP_ENV=dev 처럼 만든 값은 셸 변수라서 그 셸 안에서만 보이고 자식 프로세스는 못 봅니다. export APP_ENV 로 승격해야 bash 로 띄운 자식 프로세스, 즉 java 프로세스까지 값을 물려받습니다.

~/.bashrc 는 로그인할 때마다 실행되는 개인 설정이고, /etc/profile.d/*.sh 는 서버의 모든 사용자에게 적용되는 공통 설정입니다. JAVA_HOME, PATH 같은 값은 보통 /etc/profile.d 에 스크립트로 넣어 관리합니다.

PATH 는 명령을 찾는 디렉터리 목록을 : 로 구분해 담은 변수입니다. 새 경로는 반드시 기존 값 뒤에 덧붙여야 하고(export PATH=$PATH:/opt/jdk/bin), 통째로 덮어쓰면 ls 같은 기본 명령마저 사라집니다.

파일 적용 대상 적용 시점
~/.bashrc 현재 사용자 한 명 새 셸을 열 때마다
/etc/profile.d/*.sh 서버의 모든 사용자 로그인할 때

JAVA_HOME, 사내 공통 PATH 처럼 모든 배포 계정이 함께 써야 하는 값은 /etc/profile.d 에 넣습니다. 특정 계정만의 편의 설정(별칭 등)은 그 계정의 ~/.bashrc 에 넣습니다.

2.10 링크와 압축

심볼릭 링크는 ln -s 대상 링크이름 으로 만듭니다. 배포에서는 releases/v1, releases/v2 처럼 버전 폴더를 두고 current 라는 링크가 최신 버전을 가리키게 하는 패턴을 많이 씁니다. 배포 시 링크만 바꿔치면 되고, 롤백도 링크를 이전 버전으로 되돌리면 끝납니다.

Git Bash 에서는 권한 문제로 ln -s 가 실제 심볼릭 링크 대신 파일 복사로 동작하는 경우가 많습니다. RHEL 서버에서만 진짜 링크로 확인하면 됩니다.

묶고 풀 때는 tar 를 씁니다. tar czf app.tgz app 은 gzip 압축으로 묶고, tar xzf app.tgz -C 대상 은 지정한 폴더에 풉니다. 이미 압축된 파일 하나만 다룰 때는 gzip/gunzip 을 씁니다.

2.11 디스크

du -sh 디렉터리 는 그 디렉터리가 차지한 용량 합계를 사람이 읽기 쉬운 단위로 보여줍니다. df -h 는 파티션 전체의 사용률을 보여줍니다.

로그가 디스크를 다 채우면 애플리케이션이 파일을 못 써서 장애로 이어집니다. 배포 후에는 df -h 로 여유 공간을 습관적으로 확인해야 합니다.

text
$ du -sh /opt/myapp/*
128M    /opt/myapp/lib
2.3G    /opt/myapp/logs
4.0K    /opt/myapp/conf
$ df -h /opt
파일시스템  크기  사용  가용  사용%  마운트위치
/dev/sda3    50G   47G  2.1G   96%   /opt

사용률 96% 처럼 여유가 거의 없으면 오래된 로그부터 정리하거나 담당자에게 증설을 요청해야 합니다. logs 폴더 혼자 2.3G 를 차지하는 위 예시가 전형적인 경고 신호입니다.

2.12 도움말

명령의 옵션이 기억나지 않으면 man 명령어 로 매뉴얼을 보거나, 명령어 --help 로 요약을 봅니다. 폐쇄망 서버는 인터넷 검색이 안 되므로 man 페이지가 사실상 유일한 문서입니다.

많이 쓰는 명령은 man 내용을 미리 캡처하거나 메모해 두는 것도 방법입니다. man 이 설치 안 된 최소 이미지도 있으니, 없으면 --help 로 대체합니다.

핵심 원리
  • 2.1 접속과 셸
  • 2.2 FHS 디렉터리 구조
  • 2.3 경로와 이동
  • 2.4 파일 조작
  • 2.5 찾기
  • 2.6 보기
  • 2.7 권한 모델
  • 2.8 리다이렉션·파이프·종료 코드
  • 2.9 환경 변수
  • 2.10 링크와 압축
  • 2.11 디스크
  • 2.12 도움말
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제