리눅스 명령어 ln: 심볼릭 링크와 하드 링크(옵션 4가지)

리눅스 명령어 ln은 파일 시스템의 중요한 기능 중 하나인 링크(link)를 만드는 데 사용됩니다. 링크는 파일 시스템 내에서 한 파일을 가리키는 또 다른 이름을 제공하며, 두 가지 종류가 있습니다: 하드 링크(hard link)와 심볼릭 링크(symbolic link). 이 글에서는 ln 명령어의 기본 사용법과 다양한 옵션을 살펴보고, 링크를 효율적으로 활용하는 방법을 알아보겠습니다.

링크란 무엇인가?

하드 링크는 하나의 파일을 여러 이름으로 접근할 수 있게 해주는 방식입니다. 모든 하드 링크는 동일한 inode 번호를 공유하며, 파일의 데이터 블록을 직접 가리킵니다. 파일의 내용은 하나지만, 여러 위치에서 동일한 파일처럼 보입니다.

하드 링크는 다음과 같은 특징을 가지고 있습니다.

  • 같은 파일 시스템 내에서만 생성할 수 있습니다.
  • 원본 파일을 삭제해도 다른 하드 링크를 통해 파일에 접근할 수 있습니다.
  • 디렉터리에는 하드 링크를 사용할 수 없습니다.

심볼릭 링크는 파일의 위치를 가리키는 특수한 파일로, 바로 가기(shortcut)와 유사합니다. 심볼릭 링크는 원본 파일의 경로를 저장하며, 원본 파일이 변경되거나 삭제되면 심볼릭 링크도 영향을 받습니다.

심볼릭 링크는 다음과 같은 특징을 가지고 있습니다.

  • 다른 파일 시스템에도 생성할 수 있습니다.
  • 원본 파일이 삭제되면 링크는 깨진 링크(broken link)가 됩니다.
  • 디렉터리에도 심볼릭 링크를 사용할 수 있습니다.

리눅스 명령어 ln 사용법

리눅스 명령어 ln은 링크를 생성하는 데 사용됩니다. 기본 형식은 다음과 같습니다:

ln [options] original_file link_name
ShellScript

하드 링크 생성

하드 링크를 생성하려면 단순히 ln 명령어를 사용합니다. 이 명령어는 original_file의 하드 링크를 hard_link라는 이름으로 생성합니다.

ln original_file hard_link
ShellScript

하드 링크를 생성한 후 ls -l 명령어를 사용해서 해당 링크를 확인해 보면, 아래와 같이 그냥 단순히 파일처럼 보입니다.

그림 1. 리눅스 명령어 ln: 하드 링크 생성
그림 1. 리눅스 명령어 ln: 하드 링크 생성

이제 hard_link와 original_file을 stat 명령어를 통해서 확인해 보겠습니다. 두 파일의 Inode 값이 모두 1311921로 모두 동일하며, Links 값이 2이므로 같은 inode 값을 갖는 파일이 2개인 것을 알 수 있습니다. 즉, 같은 inode를 가리키는 파일이 하나 더 생기는 셈입니다.

그림 2. 리눅스 명령어 stat을 이용해서 하드 링크 확인
그림 2. 리눅스 명령어 stat을 이용해서 하드 링크 확인

이번엔 hard_link를 수정하고, original_file의 내용을 확인해 보도록 하겠습니다. 당연히 두 파일은 모두 같은 inode값을 가지고 있으므로 동일한 내용으로 변경된 것을 확인할 수 있습니다.

그림 3. 하드 링크 파일 업데이트 시 원본 파일도 동일하게 변경
그림 3. 하드 링크 파일 업데이트 시 원본 파일도 동일하게 변경

original_file을 삭제하게 되면 hard_link 파일은 이제 더 이상 하드 링크의 개념을 가진 객체가 아닌 온전한 하나의 파일로 존재하게 됩니다. 아래 그림을 보면 inode는 위에서 살펴본 것과 동일하지만 Links 값은 1로 하드 링크가 없는 것을 알 수 있습니다.

그림 4. 리눅스 명령어 stat을 이용해서 남겨진 파일 확인
그림 4. 리눅스 명령어 stat을 이용해서 남겨진 파일 확인

심볼릭 링크 생성

심볼릭 링크를 생성하려면 -s 옵션을 사용합니다. 이 명령어는 original_file의 심볼릭 링크를 symbolic_link라는 이름으로 생성합니다.

ln -s original_file symbolic_link
ShellScript

심볼릭 링크를 생성하면 아래와 같이 ls 명령어를 사용했을 때 심볼릭 링크의 제일 앞에 있는 파일 속성은 링크(link)를 의미하는 l로 표시됩니다. 그리고 터미널의 종류에 따라 심볼릭 링크에 색상을 다르게 표시해 주기도 합니다. 또한 “심볼릭 링크 -> 원본 파일”의 형식으로 어떤 심볼릭 링크가 어떤 파일을 가리키고 있는지 명확하게 알려줍니다.

그림 5. 리눅스 명령어 ln: 심볼릭 링크 생성
그림 5. 리눅스 명령어 ln: 심볼릭 링크 생성

stat 명령어를 통해서 확인해 보면 첫 줄에서 해당 심볼릭 링크가 어떤 파일을 가리키고 있는지 보여주며, 오른쪽 상단에는 symbolic link임을 명확히 알 수 있습니다.

그림 6. 리눅스 명령어 stat으로 심볼릭 링크 확인
그림 6. 리눅스 명령어 stat으로 심볼릭 링크 확인

주요 옵션

-f (force)

-f 옵션을 이용하면 기존의 파일이나 링크를 강제로 덮어씁니다.

ln -f original_file link_name
ShellScript

이미 기존에 파일이 있는 경우에 링크를 걸려고 하면 “ln: failed to create hard/symbolic link ‘filename’: File exists” 메시지를 통해서 이미 기존에 존재하는 파일과 동일한 이름으로 하드 링크 또는 심볼릭 링크를 만들 수 없다는 것을 알 수 있습니다.

그림 7. 리눅스 명령어 ln -f 옵션으로 강제 덮어씌우기
그림 7. 리눅스 명령어 ln -f 옵션으로 강제 덮어씌우기

-i (interactive)

-i 옵션을 사용하면 파일을 덮어쓸 때 사용자에게 확인을 요청합니다.

ln -i original_file link_name
ShellScript

기존에 파일이 존재하면 -i 옵션을 이용한 경우 “ln: replace ‘link_name’?”이라는 메시지를 통해서 덮어씌워서 링크를 생성할 것인지 물어봅니다.

그림 8. 리눅스 명령어 ln -i 옵션으로 덮어씌우기 전에 물어보기
그림 8. 리눅스 명령어 ln -i 옵션으로 덮어씌우기 전에 물어보기

-v (verbose)

-v 옵션은 명령어 실행 결과를 자세히 출력합니다.

ln -sv original_file link_name
ShellScript

하드 링크를 생성할 때에는 => 부호를 이용해서 하드 링크를 생성했음을 알려주며, 심볼릭 링크를 생성할 때에는 -> 부호를 이용해서 심볼릭 링크를 생성했음을 확인할 수 있습니다.

그림 9. 리눅스 명령어 ln -v 옵션으로 심볼릭 링크 종류 확인 가능
그림 9. 리눅스 명령어 ln -v 옵션으로 심볼릭 링크 종류 확인 가능

유용한 활용 방법

디렉터리 링크

심볼릭 링크는 디렉터리에도 사용할 수 있습니다. 예를 들어, 자주 사용하는 설정 파일이나 디렉터리를 링크로 연결해 쉽게 접근할 수 있습니다.

ln -s /path/to/original_directory /path/to/link_directory
ShellScript

버전 관리

여러 버전의 파일을 관리할 때 심볼릭 링크를 사용하면 유용합니다. 예를 들어, 소프트웨어 개발에서 특정 버전의 파일을 current라는 심볼릭 링크로 연결해 항상 최신 버전으로 접근할 수 있습니다.

ln -s version1.2 current
ShellScript

시스템 설정 파일

여러 시스템 설정 파일을 관리할 때 심볼릭 링크를 활용하면 편리합니다. 예를 들어, ~/.bashrc 파일을 여러 환경에서 동일하게 유지하고 싶을 때 심볼릭 링크를 사용할 수 있습니다.

ln -s /path/to/shared_bashrc ~/.bashrc
ShellScript

주의사항

리눅스 명령어 ln을 사용할 때 주의해야 할 것들이 몇 가지 있습니다. 꼭 숙지해 두시기 바랍니다.

하드 링크는 같은 파일 시스템에서만 작동

하드 링크는 동일한 파일 시스템 내에서만 생성할 수 있습니다. 만약 다른 파일 시스템의 파일에 하드 링크를 사용하려고 하면 아래 그림과 같이 “ln: failed to create hard link ‘link_filename’ => ‘original_filename’: Invalid cross-device link”라는 메시지를 만나게 됩니다. 따라서 다른 파일 시스템에 링크를 생성하려면 반드시 -s 옵션을 이용해서 심볼릭 링크를 사용해야 합니다.

그림 10. 리눅스 명령어 ln: 다른 파일 시스템에 하드 링크 이용 불가능
그림 10. 리눅스 명령어 ln: 다른 파일 시스템에 하드 링크 이용 불가능

심볼릭 링크는 원본 파일에 의존

심볼릭 링크는 원본 파일의 경로를 저장하므로, 원본 파일이 이동되거나 삭제되면 링크가 깨지는 경우가 생깁니다. 따라서 원본 파일을 이동하거나 삭제한 경우에는 해당 심볼릭 링크를 알맞게 설정하거나 삭제할 필요가 있습니다.

원본 파일 original_file을 삭제해서 심볼릭 링크만 남은 경우에는 ls -l 명령어를 사용했을 때 아래와 같이 빨간 글씨로 강조해서 링크가 깨졌음을 알려줍니다.

그림 11. 깨진 심볼릭 링크: 원본 파일을 삭제한 경우
그림 11. 깨진 심볼릭 링크: 원본 파일을 삭제한 경우

링크 사용 시 경로 주의

심볼릭 링크를 생성할 때 상대 경로와 절대 경로를 적절히 사용해야 합니다. 상대 경로를 사용할 경우 심볼릭 링크 파일의 위치가 변경되면 링크가 깨질 수 있습니다. 왜냐하면 상대 경로를 사용하는 경우 심볼릭 링크의 위치를 기준으로 원본 파일에 접근하기 때문입니다.

따라서 심볼릭 링크를 상대 경로를 사용해서 걸어준 경우에 심볼릭 링크의 경로를 변경한다면 원본 파일의 경로도 함께 변경해 주어야 합니다. 반대로 심볼릭 링크가 걸려있는 원본 파일을 이동하는 경우에도 심볼릭 링크를 함께 변경해 줘야 합니다. 또는 기존의 심볼릭 링크를 삭제하고 새로운 심볼릭 링크를 생성하는 것도 좋은 방법이 됩니다.

아래의 경우에는 ~/linux/ln 디렉터리 기준으로 a 디렉터리에 sym_link를 통해서 상대 경로를 이용해서 b/original_file에 대한 심볼릭 링크가 존재하는 상태입니다. sym_link 파일을 ~/linux/ln으로 이동한 결과 상대 경로의 기준이 달라짐으로 심볼릭 링크가 깨진 것을 확인할 수 있습니다.

그림 12. 깨진 심볼릭 링크: 상대 경로를 사용했는데 심볼릭 링크를 이동한 경우
그림 12. 깨진 심볼릭 링크: 상대 경로를 사용했는데 심볼릭 링크를 이동한 경우

퍼미션(권한) 문제

링크를 생성할 때 파일 시스템의 퍼미션 문제로 인해 링크 생성이 실패할 수 있습니다. 아래의 경우에는 original_file의 파일 소유자가 root인 경우에 발생하는 “ln: failed to create hard link ‘link_name’ => ‘original_file’: Operation not permitted” 메시지입니다. 이 경우 sudo를 사용해 관리자 권한으로 링크를 생성할 수 있습니다. 그리고 sudo 명령어를 이용해서 하드 링크를 생성하는 경우 기존 파일과 동등한 소유권을 갖게 됩니다.

그림 13. 퍼미션 문제가 있는 경우 sudo 명령어와 함께 ln 명령어 사용
그림 13. 퍼미션 문제가 있는 경우 sudo 명령어와 함께 ln 명령어 사용

정리

리눅스 명령어 ln을 활용하면 파일과 디렉터리를 효율적으로 관리할 수 있습니다. 하드 링크와 심볼릭 링크의 차이점을 이해하고, 상황에 맞게 적절한 링크를 사용하면 시스템 관리가 훨씬 편리해집니다.

링크를 활용한 파일 관리, 버전 관리, 설정 파일 관리 등을 통해 리눅스 환경을 더욱 유연하고 효율적으로 사용할 수 있습니다. 리눅스 명령어 ln의 다양한 옵션을 숙지하고, 주의사항을 염두에 두어 실수를 방지하세요.

하드 링크와 심볼릭 링크를 사용해서 더욱 스마트한 리눅스 사용자가 되시길 바랍니다.

참고자료

관련 포스트

Leave a Comment