| 구분 | 심볼릭 링크 | 하드 링크 |
|---|---|---|
| 명령 | ln -s 대상 링크 |
ln 대상 링크 |
| 정체 | 경로를 가리키는 별도 파일 | 같은 inode 를 공유 |
| 대상 삭제 시 | 링크가 끊어짐 | 원본이 남아 있으면 정상 |
| 디렉터리 대상 | 가능 | 불가능 |
심볼릭 링크는 원본이 없어도 만들어지고, 원본을 지우면 끊어진 링크가 됩니다. 하드 링크는 같은 inode 번호를 공유하는 또 다른 이름이라 원본을 지워도 데이터가 남습니다.
ln -s 의 대상은 상대 경로로도, 절대 경로로도 쓸 수 있습니다. 상대 경로 링크는 링크 자신을 옮기면 대상을 못 찾을 위험이 있고, 절대 경로 링크는 위치를 옮겨도 안전하지만 마운트 경로가 바뀌면 깨집니다.
배포 스크립트처럼 같은 부모 폴더 안에서만 움직이는 링크는 상대 경로가 편합니다. 시스템 설정 파일처럼 고정 위치를 가리키는 링크는 절대 경로를 씁니다.
| 명령 | 결과 |
|---|---|
ls -l 링크 |
링크 -> 대상 형태로 대상 표시 |
readlink 링크 |
링크가 담은 대상 문자열 그대로 |
readlink -f 링크 |
대상을 끝까지 따라간 절대 경로 |
readlink 는 링크에 적힌 문자열만 보여주고, readlink -f 는 링크가 링크를 가리키는 경우까지 전부 따라가 최종 실제 경로를 줍니다. realpath 는 readlink -f 와 결과가 거의 같습니다.
대상이 없는 심볼릭 링크는 끊어진 링크입니다. find 경로 -xtype l 로 폴더 전체에서 찾을 수 있습니다.
find /opt/app -xtype l배포 폴더 정리 스크립트에 넣어 두면 옛 버전을 지우면서 남은 끊어진 링크를 함께 찾아 지울 수 있습니다.
배포마다 release-20260915 같은 새 폴더를 만들고 검증한 뒤 current 링크만 그 폴더로 옮깁니다. 서비스는 항상 current 경로만 바라봅니다.
| 단계 | 명령 |
|---|---|
| 새 버전 준비 | release-N/ 폴더에 배포 |
| 전환 | ln -sfn release-N current |
| 확인 | readlink current |
| 롤백 | ln -sfn release-N1 current |
전환과 롤백이 링크 하나만 바꾸는 원자적 작업이라 서비스 중단 시간이 사실상 없습니다.
기존 링크를 다른 대상으로 바꾸려면 ln -sfn 을 씁니다. -f 없이 같은 이름으로 다시 만들면 오류가 나고, -n 없이 대상이 폴더면 그 폴더 "안"에 링크가 생기는 함정이 있습니다.
ln -sfn release-2 current # -n 없으면 current 가 폴더일 때 안에 생김current 가 이미 실제 디렉터리라면 -n 을 빼먹은 명령은 current/release-2 를 만들어 버립니다. 배포 스크립트에는 항상 -sfn 세 옵션을 함께 씁니다.
| 명령 | 용도 |
|---|---|
lsblk |
디스크·파티션 트리 목록 |
blkid |
파티션별 UUID·파일시스템 종류 |
새 디스크가 서버에 인식됐는지, 어떤 파티션이 어디 붙어 있는지는 lsblk 로 가장 먼저 확인합니다. blkid 는 /etc/fstab 에 쓸 UUID 를 얻을 때 씁니다.
| 명령 | 용도 |
|---|---|
df -hT |
마운트별 용량·파일시스템 종류 |
mount |
현재 마운트 목록 |
umount 경로 |
마운트 해제 |
findmnt 경로 |
특정 경로의 마운트 정보 |
du 는 기본적으로 하위 마운트까지 파고듭니다. -x 를 주면 같은 파일시스템 안에서만 합산해 다른 디스크 용량이 섞이지 않습니다.
/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 을 다시 읽어 모든 항목을 마운트하며, 문법이 틀리면 여기서 바로 오류가 나 재부팅 전에 잡을 수 있습니다.
용량이 남아도 작은 파일이 너무 많으면 inode 가 먼저 바닥납니다. df -i 로 사용률을 따로 확인합니다.
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1310720 1310720 0 100% /새 디스크를 붙이는 순서는 lsblk 로 확인, mkfs.xfs 로 포맷, 마운트 지점 생성, mount, /etc/fstab 등록, mount -a 검증 순입니다. 이 절차는 문법 검토만 했고 실제 디스크에는 실행하지 않았습니다.
LVM 을 쓰면 서비스를 멈추지 않고 파티션 용량을 늘릴 수 있습니다. lvs 로 논리 볼륨 목록을 보고 lvextend -r -L +10G 볼륨 으로 늘리면서 파일시스템까지 함께 넓힙니다. -r 옵션이 resize2fs·xfs_growfs 를 자동으로 호출합니다.
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 으로 중복 실행을 막습니다.