공공부하자개발 · 영어 학습 노트
리눅스
리눅스 명령어리눅스 자체를 익히는 명령 중심 학습0/10 완료
  • 01파일·디렉터리 명령
  • 02텍스트 보기·편집 (less·vi)
  • 03사용자·그룹·권한·sudo
  • 04패키지·시스템 정보 (dnf·rpm)
  • 05프로세스·자원 (ps·top·free·df)
  • 06네트워크 명령 (ip·ss·ping·scp)
  • 07압축·아카이브·검색 (tar·gzip·find)
  • 08셸 활용 (히스토리·별칭·단축키)
  • 09sed · awk 한 줄 처리 (치환·필드·집계)
  • 10링크 · 디스크 · 예약 작업 (ln·mount·crontab)
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 리눅스 명령어 › 10 / 10

링크 · 디스크 · 예약 작업 (ln·mount·crontab)

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

2. 핵심 원리

2.1 심볼릭 링크와 하드 링크 차이

구분 심볼릭 링크 하드 링크
명령 ln -s 대상 링크 ln 대상 링크
정체 경로를 가리키는 별도 파일 같은 inode 를 공유
대상 삭제 시 링크가 끊어짐 원본이 남아 있으면 정상
디렉터리 대상 가능 불가능

심볼릭 링크는 원본이 없어도 만들어지고, 원본을 지우면 끊어진 링크가 됩니다. 하드 링크는 같은 inode 번호를 공유하는 또 다른 이름이라 원본을 지워도 데이터가 남습니다.

2.2 상대 경로 대 절대 경로 대상

ln -s 의 대상은 상대 경로로도, 절대 경로로도 쓸 수 있습니다. 상대 경로 링크는 링크 자신을 옮기면 대상을 못 찾을 위험이 있고, 절대 경로 링크는 위치를 옮겨도 안전하지만 마운트 경로가 바뀌면 깨집니다.

배포 스크립트처럼 같은 부모 폴더 안에서만 움직이는 링크는 상대 경로가 편합니다. 시스템 설정 파일처럼 고정 위치를 가리키는 링크는 절대 경로를 씁니다.

2.3 링크 확인: ls -l, readlink, realpath

명령 결과
ls -l 링크 링크 -> 대상 형태로 대상 표시
readlink 링크 링크가 담은 대상 문자열 그대로
readlink -f 링크 대상을 끝까지 따라간 절대 경로

readlink 는 링크에 적힌 문자열만 보여주고, readlink -f 는 링크가 링크를 가리키는 경우까지 전부 따라가 최종 실제 경로를 줍니다. realpath 는 readlink -f 와 결과가 거의 같습니다.

2.4 끊어진 링크 찾기: find -xtype l

대상이 없는 심볼릭 링크는 끊어진 링크입니다. find 경로 -xtype l 로 폴더 전체에서 찾을 수 있습니다.

bash
find /opt/app -xtype l

배포 폴더 정리 스크립트에 넣어 두면 옛 버전을 지우면서 남은 끊어진 링크를 함께 찾아 지울 수 있습니다.

2.5 배포 버전 전환 패턴: current -> release-N

배포마다 release-20260915 같은 새 폴더를 만들고 검증한 뒤 current 링크만 그 폴더로 옮깁니다. 서비스는 항상 current 경로만 바라봅니다.

단계 명령
새 버전 준비 release-N/ 폴더에 배포
전환 ln -sfn release-N current
확인 readlink current
롤백 ln -sfn release-N1 current

전환과 롤백이 링크 하나만 바꾸는 원자적 작업이라 서비스 중단 시간이 사실상 없습니다.

2.6 링크 덮어쓰기와 디렉터리 링크 함정

기존 링크를 다른 대상으로 바꾸려면 ln -sfn 을 씁니다. -f 없이 같은 이름으로 다시 만들면 오류가 나고, -n 없이 대상이 폴더면 그 폴더 "안"에 링크가 생기는 함정이 있습니다.

bash
ln -sfn release-2 current   # -n 없으면 current 가 폴더일 때 안에 생김

current 가 이미 실제 디렉터리라면 -n 을 빼먹은 명령은 current/release-2 를 만들어 버립니다. 배포 스크립트에는 항상 -sfn 세 옵션을 함께 씁니다.

2.7 블록 장치 확인: lsblk, blkid

명령 용도
lsblk 디스크·파티션 트리 목록
blkid 파티션별 UUID·파일시스템 종류

새 디스크가 서버에 인식됐는지, 어떤 파티션이 어디 붙어 있는지는 lsblk 로 가장 먼저 확인합니다. blkid 는 /etc/fstab 에 쓸 UUID 를 얻을 때 씁니다.

2.8 디스크 사용량과 마운트: df, mount, findmnt

명령 용도
df -hT 마운트별 용량·파일시스템 종류
mount 현재 마운트 목록
umount 경로 마운트 해제
findmnt 경로 특정 경로의 마운트 정보

du 는 기본적으로 하위 마운트까지 파고듭니다. -x 를 주면 같은 파일시스템 안에서만 합산해 다른 디스크 용량이 섞이지 않습니다.

2.9 /etc/fstab 과 UUID, mount -a

/etc/fstab 한 줄은 장치, 마운트 지점, 파일시스템, 옵션, dump, fsck 순서 여섯 칸입니다.

칸 뜻 예시
1 장치 (UUID 권장) UUID=1234-5678
2 마운트 지점 /data
3 파일시스템 xfs
4 옵션 defaults
5 dump 여부 0
6 fsck 순서 0

장치 이름(/dev/sdb1) 대신 UUID 를 쓰는 이유는 디스크 순서가 재부팅마다 바뀔 수 있기 때문입니다. mount -a 는 fstab 을 다시 읽어 모든 항목을 마운트하며, 문법이 틀리면 여기서 바로 오류가 나 재부팅 전에 잡을 수 있습니다.

2.10 inode 고갈과 새 디스크 붙이기 순서

용량이 남아도 작은 파일이 너무 많으면 inode 가 먼저 바닥납니다. df -i 로 사용률을 따로 확인합니다.

text
df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      1310720 1310720      0  100% /

새 디스크를 붙이는 순서는 lsblk 로 확인, mkfs.xfs 로 포맷, 마운트 지점 생성, mount, /etc/fstab 등록, mount -a 검증 순입니다. 이 절차는 문법 검토만 했고 실제 디스크에는 실행하지 않았습니다.

2.11 LVM 볼륨 확장 (한 소절)

LVM 을 쓰면 서비스를 멈추지 않고 파티션 용량을 늘릴 수 있습니다. lvs 로 논리 볼륨 목록을 보고 lvextend -r -L +10G 볼륨 으로 늘리면서 파일시스템까지 함께 넓힙니다. -r 옵션이 resize2fs·xfs_growfs 를 자동으로 호출합니다.

2.12 crontab 과 예약 작업 도구

crontab 은 분·시·일·월·요일 다섯 칸입니다.

표기 뜻
* 항상
*/5 5 단위마다
1-5 1부터 5까지
1,3,5 콤마로 나열
@daily 매일 자정 (0 0 * * *)

cron 이 실행하는 환경은 로그인 셸보다 변수가 적어 PATH·HOME 이 비거나 다릅니다. 스크립트 안에서는 항상 절대 경로를 쓰고 출력은 >> 로그 2>&1 로 남깁니다. /etc/cron.d 는 사용자 필드가 추가된 시스템 전역 crontab이고, /etc/cron.daily 는 run-parts 가 매일 실행하는 스크립트 폴더입니다.

일회성 작업은 at, 반복 작업 중 로그·의존성 관리가 필요하면 systemd timer 가 더 낫습니다. 여러 서버가 같은 crontab을 공유하는 클러스터에서는 flock 으로 중복 실행을 막습니다.

핵심 원리
  • 2.1 심볼릭 링크와 하드 링크 차이
  • 2.2 상대 경로 대 절대 경로 대상
  • 2.3 링크 확인: ls -l, readlink, realpath
  • 2.4 끊어진 링크 찾기: find -xtype l
  • 2.5 배포 버전 전환 패턴: current -> release-N
  • 2.6 링크 덮어쓰기와 디렉터리 링크 함정
  • 2.7 블록 장치 확인: lsblk, blkid
  • 2.8 디스크 사용량과 마운트: df, mount, findmnt
  • 2.9 /etc/fstab 과 UUID, mount -a
  • 2.10 inode 고갈과 새 디스크 붙이기 순서
  • 2.11 LVM 볼륨 확장 (한 소절)
  • 2.12 crontab 과 예약 작업 도구
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제