--- title: ln — 링크 만들기 date: 2026-10-18 time: 12:00 model: admin category: programs author_type: human summary: 하드 링크와 심볼릭 링크를 만드는 명령어. 배포 디렉터리 교체와 파일 공유에서 자주 씁니다. tags: 프로그램, 파일 및 디스크 관리, ln --- **💬 "ln 명령어"** ln은 파일에 **별명(링크)**을 붙입니다. `-s`가 없으면 하드 링크, 있으면 심볼릭 링크입니다. 실무에서는 **현재 버전을 가리키는 심볼릭 링크**(예: current → release-20261018)를 만들어 무중단 배포에 씁니다. - **개념**: 링크는 파일을 복사하지 않고 같은 내용을 다른 이름으로 가리킵니다. - **왼쪽 열**: `ls -l`에서 심볼릭 링크는 `l`로 시작하고 `이름 -> 대상`이 표시됩니다. - **하드 링크**: 같은 inode를 공유합니다. 삭제해도 다른 이름이 남아 있으면 데이터가 유지됩니다. - **심볼릭 링크**: 경로를 담은 특수 파일입니다. 대상이 사라지면 깨진 링크가 됩니다. ## 자주 쓰는 옵션 | 옵션 | 설명 | | --- | --- | | -s | 심볼릭(소프트) 링크를 만듭니다 — 실무 기본 | | -f | 기존 링크가 있으면 덮어씁니다 | | -n | 대상이 디렉터리 링크일 때 링크 안이 아니라 링크 자체를 교체 | | -v | 무엇을 만들었는지 출력합니다 | ## 필수 명령어 조합 3가지 - `ln -sfn /opt/app/releases/20261018 /opt/app/current` — 현재 버전 포인터를 원자적으로 교체 - `ln -s /var/www/html/index.php /etc/nginx/html/index.php` — 설정 경로에서 실제 파일을 심볼릭으로 연결 - `ls -l /opt/app/current` — 링크가 어디를 가리키는지 확인 **💬 "실제 고객 문의를 받았을 때 확인 순서 알려줘"** 실제 운영 중인 서버에서 자주 만나는 상황을 순서대로 정리했습니다. ### 1단계 · 새 버전 디렉터리 준비 새 릴리스를 별도 디렉터리에 풀어 둡니다. ``` tar -xzf /tmp/release.tgz -C /opt/app/releases/20261018 ``` ### 2단계 · 포인터 교체 -sfn으로 current 링크를 새 버전으로 바꿉니다. 교체는 원자적이라 순간적으로 끊기지 않습니다. ``` ln -sfn /opt/app/releases/20261018 /opt/app/current ``` ### 3단계 · 확인 링크 대상과 서비스 응답을 확인합니다. ``` ls -l /opt/app/current && curl -sI https://example.com | head -1 ``` ## 실무에서는 이렇게 씁니다 ### 1. 무중단 배포 포인터 교체 **상황** — 웹 서버가 /opt/app/current 를 바라보고 있을 때 새 버전으로 전환해야 합니다. ``` ln -sfn /opt/app/releases/20261018 /opt/app/current ``` **결과** — current 링크가 새 릴리스를 가리키고, 새 요청부터 새 코드가 서비스됩니다. **포인트** — 디렉터리를 통째로 복사하는 방식보다 순단이 짧고 롤백이 링크 교체 한 번으로 끝납니다. ### 2. 설정 파일 공유 **상황** — 여러 앱이 같은 설정 파일을 참조해야 합니다. ``` ln -s /etc/app/common.env /srv/app1/.env ``` **결과** — 한 곳만 수정해도 모든 앱에 반영됩니다. **포인트** — 앱이 설정을 쓸 때는 예상치 못한 동기화가 생길 수 있으니 읽기 전용 공유에 주로 씁니다. ## 주의할 점 - -f 없이 기존 링크를 덮으려 하면 실패합니다. -sfn 조합이 가장 안전합니다. - 디렉터리 링크에 -n을 빠뜨리면 링크 안에 링크가 만들어질 수 있습니다. - 상대 경로 심볼릭 링크는 작업 디렉터리에 따라 깨질 수 있어 절대 경로를 권장합니다. - 삭제할 때는 링크만 지우는지, 원본까지 지우는지 확인합니다. ## 실제 실행 화면 current 링크가 새 릴리스를 가리키는지 확인한 결과입니다. ![ln 명령어 실행 결과: 심볼릭 링크 대상 확인](https://games.cursorai.co.kr/assets/ln-demo.png) 실제 운영 중인 서버 --- 원문(HTML): https://games.cursorai.co.kr/programs/linux/filesystem/ln.html