본문 바로가기
프로그래밍/리눅스

리눅스(Linux) 소프트 링크와 하드 링크

by bantomak 2025. 1. 26.
반응형

소프트 링크(Soft Link)와 하드 링크(Hard Link)에 대해서

소프트 링크와 하드 링크는 파일의 일종이다. 링크(link)는 '연결'을 의미한다. 소프트 링크는 유연한 연결, 하드 링크는 견고한 연결 정도로 볼 수 있다. 둘의 다른 점은 파일을 연결하는 방법이다. 우선 소프트 링크와 하드 링크를 이해하는데 필요한 아이노드와 덴트리 개념부터 알아보자.

아이노드(inode)와 덴트리(dentry)

파일 시스템은 각 파일에 대한 정보를 아이노드(inode, index node)라는 자료구조로 저장한다. 아이노드는 파일의 내용이 아니라 파일의 접근 권한, 마지막 접근 시간, 파일 소유자, 그룹, 크기, 데이터 블록의 위치 같은 정보를 저장한다. 파일에 대한 메타데이터(metadata)를 저장한다고 보면 된다. 그리고 파일의 실제 내용을 저장하고 있는 데이터 블록(data block)을 아이노드에 연결한다. 아이노드에는 식별자(identifier)인 아이노드 번호(inode number)가 있어서 아이노드를 구분할 수 있다.

 

아이노드에는 파일의 경로 정보(위치 + 이름)가 포함되지 않는다. 파일의 경로 정보는 덴트리(dentry, directory entry)라는 자료구조로 표현한다. 덴트리는 파일의 계층 구조를 유지하는데 사용한다. 각 덴트리는 파일 경로를 나타내며, 파일의 메타데이터를 저장하는 하나의 아이노드와 연결된다. 즉, 덴트리는 파일의 경로와 파일의 실체(아이노드로 표현되는 파일의 메타데이터)를 연결하는 매개체로 볼 수 있다.

ls -li 명령어를 입력하면 아이노드 번호를 확인할 수 있다.

파일 하나를 보면 비교적 간단하지만, 계층화 구조를 고려하면 그렇게 간단하지 않다. 

  • 루트 디렉터리도 하나의 덴트리와 아이노드로 구성된다. 루트 디렉터리의 하위 디렉터리 목록(sub-dirs)은 루트 디렉터리 덴트리로 관리된다.
  • 루트 디렉터리의 하위 디렉터리인 home 디렉터리도 덴트리와 아이노드로 구성되어 있다. 루트 디렉터리와 마찬가지로 home 디렉터리도 하위 디렉터리 목록을 덴트리로 유지하고 있다.

/ (루트 디렉터리)
├── home (아이노드 번호: 1234)
│   ├── user1 (아이노드 번호: 5678)
│   │   ├── file1.txt (아이노드 번호: 9101)
├── etc (아이노드 번호: 2453)

소프트 링크(Soft Link)

사용자가 바로 가기를 실행하면 실제로는 아이콘에 연결된 파일, 즉 프로그램이 실행되는 것이다. 리눅스에서 소프트 링크는 윈도우의 바로 가기와 같은 개념이다. 소프트 링크(soft link)는 연결할 대상 파일의 경로를 저장한다. 소프트 링크를 조회하거나 실행하면 실제로는 연결된 대상 파일을 조회하거나 실행한다. 소프트 링크는 심볼릭 링크(symblic link) 또는 심링크(symlink)라고도 한다.

 

소프트 링크는 그 자체로 하나의 파일이다. 파일이므로 파일에 대한 아이노드와 덴트리가 있다. 그리고 연결할 대상에 대한 정보는 데이터 블록 안에 저장한다.

소프트 링크와 하드 링크 모두 ln 명령어로 생성한다. 소프트 링크를 생성할 때는 반드시 -s 옵션을 설정해야 한다. -s 옵션을 설정하지 않으면 하드 링크가 생성된다 옵션에 따라 링크 종류가 달라질 수 있으니 유의해야 한다.

소프트 링크 사용하기

실습을 진행하기 위해서 홈 디렉터리(~)에 linktest 디렉터리를 생성하자.

$ cd ~
$ mkdir linktest
$ cd linktest/

$ echo "this is target file" > target
$ cat target

ln -s 명령으로 target 파일의 소프트 링크인 s-link 파일을 만들어보자.

$ ln -s target s-link
$ ls -li
$ cat s-link

s-link가 target 파일에 연결되어 있음이 표시된다.
생성된 target, s-link 파일의 변경 일자가 다른 상태인걸 확인할 수 있다.

이제 한번 target 파일을 변경하고 stat target으로 파일의 상태를 살펴보자.

$ echo "this file is modified" > target
$ stat target
$ stat s-link

target 파일의 정보만 변경되었다.

$ cat target
$ cat s-link

target과 s-link가 연결되어 있기때문에 한쪽만 바꿔도 다른 한쪽도 똑같이 적용된다.

$ echo "this file is modified from s-link" > s-link
$ cat target
$ cat s-link

$ mv target newtarget
$ ls -al
$ cat newtarget
$ cat s-link

파일의 이름이 바뀌면 심볼릭 링크가 깨지는 것을 확인할 수 있다.

하드 링크(Hard Link)

하드 링크는 소프트 링크와 전혀 다른 방식으로 대상을 연결한다. 파일을 연결한다기보다는 대상 파일의 복제본(clone)을 만든다고 보면 된다. 소프트웨어 관점에서 복사본을 만드는 것과 복제본을 만드는 것은 조금 다르다. 파일을 복사하면 파일 이름은 다르지만, 파일 내용은 같은 새로운 파일을 만든다. 그래서 복사본은 복사본 자체의 새로운 덴트리, 아이노드. 데이터블록을 갖게 된다.

반면에 하드 링크는 대상 파일의 아이노드와 데이터 블록을 공유한다. 대상 파일과 파드 링크는 상/하 개념이나 원본/복제본 개념이 없다. 사실상 어떤 파일이 원본이고 어떤 파일이 복제본인지 구분할 수 없다. 그래서 하드 링크를 대상 파일에 대한 별칭(alias)을 부여하는 것으로 볼 수 있다. 이런 구조라서 대상 파일을 수정하고 하드 링크를 조회하면 대상 파일에 수정한 내용이 하드 링크에 반영돼 있다. 파일 내용은 데이터 블록에 저장돼 있고, 대상 파일과 하드링크는 같은 데이터 블록과 연결되어 있기 때문이다.

 

만약 대상 파일을 삭제하면 어떻게 될까? 대상 파일에 연결된 덴트리가 삭제될 것이다. 하지만 아이노드와 데이터 블록은 삭제되지 않는다. 연결된 하드 링크 파일이 남아 있기 때문이다. 파드 링크 파일까지 삭제하면 그때 아이노드와 데이터 블록도 삭제된다. 따라서 아이노드는 자신에게 연결된 덴트리 수를 알고 있어야 한다. 이 정보는 ls 명령어로 확인할 수 있다.

하드 링크 사용하기

하드 링크는 소프트 링크와 마찬가지로 ln 명령어로 생성한다. 하드 링크를 만들 때는 ln 명령어 뒤에 -s 옵션이 없어야 한다.

$ echo "this is a new target file" > new-target
$ cat new-target
$ ls -li

ls -li 명령을 실행해 아이노드 번호를 확인하자.

$ ln new-target h-link
$ ls -li

동일한 아이노드와 세 번째 컬럼값이 2로 올라간 것을 확인할 수 있다. 이 값은 아이노드에 연결된 하드 링크의 수를 나타낸다.

$ echo "modified version of new target file" > new-target
$ cat new-target
$ cat h-link

new-target을 변경하면 아이노드를 공유하는 h-link도 동일한 내용이 표시된다.

$ mv new-target new-target2
$ cat new-target2
$ cat h-link

파일의 이름을 바꿔도 하드 링크는 링크가 깨지지 않는다.

정리하자면

소프트 링크는 파일 목록을 조회했을 때 파일 타입이 l로 표시되고, 파일 이름 옆에 대상 파일의 경로(s-link -> target)가 표시된다. 그래서 포프트 링크와 대상 파일을 쉽게 확인할 수 있다. 반면에 하드 링크는 한 아이노드를 공유하는 파일 수는 쉽게 확인할 수 있지만, 어떤 파일과 아이노드를 공유하는지 알기 어렵다.

  • 소프트 링크와 하드 링크는 ls 명령어로 확인해보면 바로 차이를 알 수 있다.
  • 소프트 링크는 일반 파일뿐만 아니라 디렉터리, 다른 파일 시스템이나 다른 파티션의 파일도 연결 가능
  • 하드 링크는 디렉터리, 다른 파일 시스템이나 다른 파티션의 파일을 연결할 수 없다.
  • 소프트 링크는 대상 파일이 삭제되거나 다른 경로로 이동하면 깨진(broken) 상태가 된다.
  • 하드 링크는 대상 파일이 삭제돼도 대상 파일의 내용은 그래도 남아있어 하드 링크로 내용에 접근할 수 있다.

댓글